|
SHOGUN v0.9.3
|
00001 /*----------------------------------------------------------------------- 00002 * 00003 * This program is free software; you can redistribute it and/or modify 00004 * it under the terms of the GNU General Public License as published by 00005 * the Free Software Foundation; either version 3 of the License, or 00006 * (at your option) any later version. 00007 * 00008 * Library for solving QP task required for learning SVM without bias term. 00009 * 00010 * Written (W) 1999-2008 Vojtech Franc, xfrancv@cmp.felk.cvut.cz 00011 * Copyright (C) 1999-2008 Center for Machine Perception, CTU FEL Prague 00012 * 00013 -------------------------------------------------------------------- */ 00014 00015 #ifndef QPBSVMLIB_H__ 00016 #define QPBSVMLIB_H__ 00017 00018 #include <math.h> 00019 #include <limits.h> 00020 00021 #include "base/SGObject.h" 00022 #include "lib/io.h" 00023 #include "lib/config.h" 00024 #include "lib/common.h" 00025 #include "kernel/Kernel.h" 00026 00027 namespace shogun 00028 { 00029 00030 enum E_QPB_SOLVER 00031 { 00032 QPB_SOLVER_SCA, // sequential coordinate wise (gaussian seidel based) 00033 QPB_SOLVER_SCAS, // sequential coordinate wise selecting the variable 00034 // gaining 'best' improved 00035 QPB_SOLVER_SCAMV, // sequential coordinate wise selecting variable most violating kkt's 00036 QPB_SOLVER_PRLOQO,// via pr_loqo 00037 QPB_SOLVER_CPLEX, // via cplex 00038 QPB_SOLVER_GS, // gaussian seidel 00039 QPB_SOLVER_GRADDESC // gaussian seidel 00040 }; 00041 00043 class CQPBSVMLib: public CSGObject 00044 { 00045 public: 00054 CQPBSVMLib( 00055 float64_t* H, int32_t n, float64_t* f, int32_t m, float64_t UB=1.0); 00056 00058 int32_t solve_qp(float64_t* result, int32_t len); 00059 00064 inline void set_solver(E_QPB_SOLVER solver) 00065 { 00066 m_solver=solver; 00067 } 00068 00069 virtual ~CQPBSVMLib(); 00070 00071 protected: 00077 inline float64_t* get_col(int32_t col) 00078 { 00079 return &m_H[m_dim*col]; 00080 } 00081 00084 int32_t qpbsvm_sca( 00085 float64_t *x, float64_t *Nabla, int32_t *ptr_t, 00086 float64_t **ptr_History, int32_t verb); 00089 int32_t qpbsvm_scas( 00090 float64_t *x, float64_t *Nabla, int32_t *ptr_t, 00091 float64_t **ptr_History, int32_t verb); 00094 int32_t qpbsvm_scamv( 00095 float64_t *x, float64_t *Nabla, int32_t *ptr_t, 00096 float64_t **ptr_History, int32_t verb); 00099 int32_t qpbsvm_prloqo( 00100 float64_t *x, float64_t *Nabla, int32_t *ptr_t, 00101 float64_t **ptr_History, int32_t verb); 00104 int32_t qpbsvm_gauss_seidel( 00105 float64_t *x, float64_t *Nabla, int32_t *ptr_t, 00106 float64_t **ptr_History, int32_t verb); 00109 int32_t qpbsvm_gradient_descent( 00110 float64_t *x, float64_t *Nabla, int32_t *ptr_t, 00111 float64_t **ptr_History, int32_t verb); 00112 #ifdef USE_CPLEX 00113 00115 int32_t qpbsvm_cplex( 00116 float64_t *x, float64_t *Nabla, int32_t *ptr_t, 00117 float64_t **ptr_History, int32_t verb); 00118 #endif 00119 00121 inline virtual const char* get_name() const { return "QPBSVMLib"; } 00122 00123 protected: 00125 float64_t* m_H; 00127 float64_t* m_diag_H; 00129 int32_t m_dim; 00130 00132 float64_t* m_f; 00133 00135 float64_t m_UB; 00136 00138 int32_t m_tmax; 00140 float64_t m_tolabs; 00142 float64_t m_tolrel; 00144 float64_t m_tolKKT; 00146 E_QPB_SOLVER m_solver; 00147 }; 00148 } 00149 #endif //QPBSVMLIB_H__