SHOGUN
v1.1.0
|
00001 /* 00002 * This program is free software; you can redistribute it and/or modify 00003 * it under the terms of the GNU General Public License as published by 00004 * the Free Software Foundation; either version 3 of the License, or 00005 * (at your option) any later version. 00006 * 00007 * Written (W) 2006-2009 Soeren Sonnenburg 00008 * Copyright (C) 2006-2009 Fraunhofer Institute FIRST and Max-Planck-Society 00009 */ 00010 00011 #ifndef CCPLEX_H__ 00012 #define CCPLEX_H__ 00013 00014 #include <shogun/lib/config.h> 00015 00016 #ifdef USE_CPLEX 00017 extern "C" { 00018 #include <ilcplex/cplex.h> 00019 } 00020 00021 #include <shogun/lib/common.h> 00022 #include <shogun/base/SGObject.h> 00023 00024 #include <shogun/features/SparseFeatures.h> 00025 #include <shogun/features/Labels.h> 00026 00027 namespace shogun 00028 { 00029 enum E_PROB_TYPE 00030 { 00031 E_LINEAR, 00032 E_QP 00033 }; 00034 00042 class CCplex : public CSGObject 00043 { 00044 public: 00045 00046 CCplex(); 00047 virtual ~CCplex(); 00048 00050 bool init(E_PROB_TYPE t, int32_t timeout=60); 00051 bool cleanup(); 00052 00053 // A = [ E Z_w Z_x ] dim(A)=(num_dim+1, num_dim+1 + num_zero + num_bound) 00054 // (+1 for bias!) 00055 bool setup_subgradientlpm_QP( 00056 float64_t C, CLabels* labels, CSparseFeatures<float64_t>* features, 00057 int32_t* idx_bound, int32_t num_bound, int32_t* w_zero, 00058 int32_t num_zero, float64_t* vee, int32_t num_dim, bool use_bias); 00059 00060 bool setup_lpboost(float64_t C, int32_t num_cols); 00061 bool add_lpboost_constraint( 00062 float64_t factor, SGSparseVectorEntry<float64_t>* h, int32_t len, 00063 int32_t ulen, CLabels* label); 00064 00065 // given N sparse inputs x_i, and corresponding labels y_i i=0...N-1 00066 // create the following 1-norm SVM problem & transfer to cplex 00067 // 00069 // min_w sum_{i=0}^N ( w^+_i + w^-_i) + C \sum_{i=0}^N \xi_i 00070 // w=[w^+ w^-] 00071 // b, xi 00072 // 00073 // -y_i((w^+-w^-)^T x_i + b)-xi_i <= -1 00074 // xi_i >= 0 00075 // w_i >= 0 forall i=1...N 00077 // min f^x 00078 // Ax <= b 00079 // -x <= 0 00080 // 00081 // lb= [ -inf, //b 00082 // 2*dims [0], //w 00083 // num_train [0] //xi 00084 // ] 00085 // 00086 // ub= [ inf, //b 00087 // 2*dims [inf], //w 00088 // num_train [inf] //xi 00089 // ] 00090 // 00091 // f= [0,2*dim[1], num_train*C] 00092 // A= [-y', // b 00093 // -y_ix_i // w_+ 00094 // +y_ix_i // w_- 00095 // -1 //xi 00096 // ] 00097 // 00098 // dim(A)=(n,1+2*dim+n) 00099 // 00100 // b = -1 -1 -1 -1 ... 00101 bool setup_lpm( 00102 float64_t C, CSparseFeatures<float64_t>* x, CLabels* y, bool use_bias); 00103 00104 // call this to setup linear part 00105 // 00106 // setup lp, to minimize 00107 // objective[0]*x_0 ... objective[cols-1]*x_{cols-1} 00108 // w.r.t. x 00109 // s.t. constraint_mat*x <= rhs 00110 // lb[i] <= x[i] <= ub[i] for all i 00111 bool setup_lp( 00112 float64_t* objective, float64_t* constraints_mat, int32_t rows, 00113 int32_t cols, float64_t* rhs, float64_t* lb, float64_t* ub); 00114 00115 00116 // call this to setup quadratic part H 00117 // x'*H*x 00118 // call setup_lp before (to setup the linear part / linear constraints) 00119 bool setup_qp(float64_t* H, int32_t dim); 00120 bool optimize(float64_t* sol, float64_t* lambda=NULL); 00121 00122 bool dense_to_cplex_sparse( 00123 float64_t* H, int32_t rows, int32_t cols, int* &qmatbeg, int* &qmatcnt, 00124 int* &qmatind, double* &qmatval); 00125 00126 inline bool set_time_limit(float64_t seconds) 00127 { 00128 return CPXsetdblparam (env, CPX_PARAM_TILIM, seconds) == 0; 00129 } 00130 inline bool write_problem(char* filename) 00131 { 00132 return CPXwriteprob (env, lp, filename, NULL) == 0; 00133 } 00134 00135 inline bool write_Q(char* filename) 00136 { 00137 #if CPX_VERSION >= 1000 //CPXqpwrite has been deprecated in CPLEX 10 00138 return CPXwriteprob (env, lp, filename, NULL) == 0; 00139 #else 00140 return CPXqpwrite (env, lp, filename) == 0; 00141 #endif 00142 } 00143 00145 inline virtual const char* get_name() const { return "Cplex"; } 00146 00147 protected: 00148 CPXENVptr env; 00149 CPXLPptr lp; 00150 bool lp_initialized; 00151 00152 E_PROB_TYPE problem_type; 00153 }; 00154 } 00155 #endif 00156 #endif