osi.h

Go to the documentation of this file.
00001 // Copyright (C) 2006 Ivo Nowak and Stefan Vigerske
00002 // All Rights Reserved.
00003 // This code is published under the Common Public License.
00004 //
00005 // Author: Stefan Vigerske
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 //              void print();
00127 };
00128 
00129 #endif

Generated on Wed Oct 22 03:12:39 2008 for LaGO by  doxygen 1.4.7