Cplex.h

Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

SHOGUN Machine Learning Toolbox - Documentation