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 "lib/config.h"
00015 
00016 #ifdef USE_CPLEX
00017 extern "C" {
00018 #include <ilcplex/cplex.h>
00019 }
00020 
00021 #include "lib/common.h"
00022 #include "base/SGObject.h"
00023 
00024 #include "features/SparseFeatures.h"
00025 #include "features/Labels.h"
00026 
00027 namespace shogun
00028 {
00029 enum E_PROB_TYPE
00030 {
00031     E_LINEAR,
00032     E_QP
00033 };
00034 
00042 #define IGNORE_IN_CLASSLIST
00043 IGNORE_IN_CLASSLIST class CCplex : public CSGObject
00044 {
00045 public:
00046 
00047     CCplex();
00048     virtual ~CCplex();
00049 
00051     bool init(E_PROB_TYPE t, int32_t timeout=60);
00052     bool cleanup();
00053 
00054     // A = [ E Z_w Z_x ] dim(A)=(num_dim+1, num_dim+1 + num_zero + num_bound)
00055     // (+1 for bias!)
00056     bool setup_subgradientlpm_QP(
00057         float64_t C, CLabels* labels, CSparseFeatures<float64_t>* features,
00058         int32_t* idx_bound, int32_t num_bound, int32_t* w_zero,
00059         int32_t num_zero, float64_t* vee, int32_t num_dim, bool use_bias);
00060 
00061     bool setup_lpboost(float64_t C, int32_t num_cols);
00062     bool add_lpboost_constraint(
00063         float64_t factor, TSparseEntry<float64_t>* h, int32_t len,
00064         int32_t ulen, CLabels* label);
00065 
00066     // given N sparse inputs x_i, and corresponding labels y_i i=0...N-1
00067     // create the following 1-norm SVM problem & transfer to cplex
00068     // 
00070     // min_w        sum_{i=0}^N ( w^+_i + w^-_i) + C \sum_{i=0}^N \xi_i
00071     // w=[w^+ w^-]
00072     // b, xi
00073     // 
00074     // -y_i((w^+-w^-)^T x_i + b)-xi_i <= -1
00075     // xi_i >= 0 
00076     // w_i >= 0    forall i=1...N
00078     // min f^x
00079     // Ax <= b
00080     // -x <= 0
00081     // 
00082     // lb= [ -inf, //b
00083     //    2*dims [0], //w
00084     //    num_train [0] //xi 
00085     //  ]
00086     // 
00087     // ub= [ inf, //b
00088     //    2*dims [inf], //w
00089     //    num_train [inf] //xi 
00090     //  ]
00091     // 
00092     // f= [0,2*dim[1], num_train*C]
00093     // A= [-y', // b
00094     //  -y_ix_i // w_+
00095     //  +y_ix_i // w_-
00096     //  -1 //xi
00097     //  ]
00098     // 
00099     //  dim(A)=(n,1+2*dim+n)
00100     // 
00101     // b =  -1 -1 -1 -1 ... 
00102     bool setup_lpm(
00103         float64_t C, CSparseFeatures<float64_t>* x, CLabels* y, bool use_bias);
00104 
00105     // call this to setup linear part
00106     //
00107     // setup lp, to minimize
00108     // objective[0]*x_0 ... objective[cols-1]*x_{cols-1}
00109     // w.r.t. x
00110     // s.t. constraint_mat*x <= rhs
00111     // lb[i] <= x[i] <= ub[i] for all i
00112     bool setup_lp(
00113         float64_t* objective, float64_t* constraints_mat, int32_t rows,
00114         int32_t cols, float64_t* rhs, float64_t* lb, float64_t* ub);
00115 
00116 
00117     // call this to setup quadratic part H
00118     // x'*H*x
00119     // call setup_lp before (to setup the linear part / linear constraints)
00120     bool setup_qp(float64_t* H, int32_t dim);
00121     bool optimize(float64_t* sol, float64_t* lambda=NULL);
00122 
00123     bool dense_to_cplex_sparse(
00124         float64_t* H, int32_t rows, int32_t cols, int* &qmatbeg, int* &qmatcnt,
00125         int* &qmatind, double* &qmatval);
00126 
00127     inline bool set_time_limit(float64_t seconds)
00128     {
00129         return CPXsetdblparam (env, CPX_PARAM_TILIM, seconds) == 0;
00130     }
00131     inline bool write_problem(char* filename)
00132     {
00133         return CPXwriteprob (env, lp, filename, NULL) == 0;
00134     }
00135 
00136     inline bool write_Q(char* filename)
00137     {
00138 #if CPX_VERSION >= 1000 //CPXqpwrite has been deprecated in CPLEX 10
00139         return CPXwriteprob (env, lp, filename, NULL) == 0;
00140 #else
00141         return CPXqpwrite (env, lp, filename) == 0;
00142 #endif
00143     }
00144 
00146     inline virtual const char* get_name() const { return "Cplex"; }
00147 
00148 protected:
00149   CPXENVptr     env;
00150   CPXLPptr      lp;
00151   bool          lp_initialized;
00152 
00153   E_PROB_TYPE problem_type;
00154 };
00155 }
00156 #endif
00157 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

SHOGUN Machine Learning Toolbox - Documentation