00001
00002
00003
00004
00005
00006
00007 #ifndef OSI_H
00008 #define OSI_H
00009
00010 #include "standard.h"
00011 #include "problem.h"
00012 #include "opt.h"
00013
00014 class OsiSolverInterface;
00015 class CglCutGenerator;
00016
00019 class OSISolver : public MIPSolver {
00020 public:
00021 class RowItem : public MIPSolver::RowItem {
00022 friend class OSISolver;
00023 private:
00024 int index;
00025 list<RowItem>::iterator it;
00026 public:
00027 RowItem(int index_)
00028 : index(index_)
00029 { }
00030 };
00031
00032 class ColItem : public MIPSolver::ColItem {
00033 friend class OSISolver;
00034 private:
00035 int index;
00036 list<ColItem>::iterator it;
00037 public:
00038 ColItem(int index_)
00039 : index(index_)
00040 { }
00041 };
00042
00043 private:
00046 Pointer<OsiSolverInterface> osisolver;
00047
00048 Pointer<CglCutGenerator> cutgenerator;
00049
00052 double obj_const;
00053
00056 bool cold_start;
00057
00058 bool lastpoint_feasible();
00059
00060 list<RowItem> addedrows;
00061 list<ColItem> addedcols;
00062 public:
00063
00064 OSISolver(const MipProblem& mip);
00065
00066 int nr_col();
00067 int nr_row();
00068
00069 void set_tol(double tol);
00070 void set_maxiter(int maxiter);
00071
00072 void reset();
00073
00074 SolutionStatus solve();
00075 SolutionStatus solve(const UserVector<double>& x);
00076 SolutionStatus solveMIP();
00077
00078 SolutionStatus feasible();
00079
00080 void get_primal(UserVector<double>& x);
00081 double get_primal(const MIPSolver::ColItem& colitem);
00082 using MIPSolver::get_primal;
00083
00084 int get_colindex(const MIPSolver::ColItem& colitem) { return ((ColItem*)(&colitem))->index; }
00085
00086 void get_dual(UserVector<double>& mu);
00087 double get_dual(const MIPSolver::RowItem& rowitem);
00088
00089 void get_reducedcosts(UserVector<double>& rc);
00090 double get_reducedcosts(const MIPSolver::ColItem& colitem);
00091
00092 void get_rowactivity(UserVector<double>& rowact);
00093 double get_rowactivity(const MIPSolver::RowItem& rowitem);
00094
00095 double get_optval();
00096
00097 int get_iter();
00098
00099 void set_obj(const UserVector<double>& obj, double obj_const_=0.);
00100 void modify_obj(int i, double coeff);
00101
00102 const MIPSolver::RowItem* add_row(const UserVector<double>& row, double low, double up);
00103 const MIPSolver::RowItem* add_row(const UserVector<double>& row, const ivector& indices, double low, double up);
00104 void add_rows(const vector<pair<dvector, ivector> >& rows, const dvector& low, const dvector& up);
00105 void add_rows(list<const MIPSolver::RowItem*>& rowitems, const vector<pair<dvector, ivector> >& rows, const dvector& low, const dvector& up);
00106 void delete_row(const MIPSolver::RowItem& rowitem) { delete_rows(list<const MIPSolver::RowItem*>(1, (RowItem*)&rowitem)); }
00107 void delete_rows(const list<const MIPSolver::RowItem*>& rowitems);
00108 void modify_row(const MIPSolver::RowItem& rowitem, double low, double up);
00109 void modify_row(int index, double low, double up);
00110
00111 const MIPSolver::ColItem* add_col(double low, double up, MipProblem::VarType vartype=MipProblem::CONTINUOUS);
00112 const MIPSolver::ColItem* add_col(const UserVector<double>& col, double obj_coeff, double low, double up, MipProblem::VarType vartype=MipProblem::CONTINUOUS);
00113 void add_cols(list<const MIPSolver::ColItem*>& colitems, const dvector& low, const dvector& up);
00114 void add_cols(list<const MIPSolver::ColItem*>& colitems, vector<Pointer<UserVector<double> > >& cols, const vector<double>& obj_coeff, const dvector& low, const dvector& up);
00115 void delete_col(const MIPSolver::ColItem& colitem) { delete_cols(list<const MIPSolver::ColItem*>(1, (ColItem*)&colitem)); }
00116 void delete_cols(const list<const MIPSolver::ColItem*>& colitems);
00117 void modify_col(const MIPSolver::ColItem& colitem, double low, double up, MipProblem::VarType type);
00118 void modify_col(const MIPSolver::ColItem& colitem, const UserVector<double>& col, double obj_coeff, double low, double up, MipProblem::VarType vartype);
00119 void modify_col(int index, double low, double up, MipProblem::VarType type);
00120
00121 double get_collow(int index);
00122 double get_colup(int index);
00123
00124 int generate_cuts(list<Pointer<SimpleCut> >& rowcuts);
00125
00126
00127 };
00128
00129 #endif