00001 #ifndef OsiDylpSolverInterface_H
00002 #define OsiDylpSolverInterface_H
00003
00018
00019
00020
00021
00022
00023 #include "OsiConfig.h"
00024 #include <CoinPackedMatrix.hpp>
00025 #include <OsiSolverInterface.hpp>
00026 #include <CoinWarmStart.hpp>
00027 #include <CoinMessageHandler.hpp>
00028 #include <CoinMpsIO.hpp>
00029 #include <CoinPresolveMatrix.hpp>
00030
00031 #define DYLP_INTERNAL
00032 extern "C" {
00033 #include "dylp.h"
00034 }
00035
00038 typedef enum { startInvalid = 0,
00039 startCold = 1, startWarm, startHot } ODSI_start_enum ;
00040
00041
00100 class OsiDylpSolverInterface: virtual public OsiSolverInterface
00101
00102 { friend int OsiDylpSolverInterfaceUnitTest(const std::string &mpsDir,
00103 const std::string &netLibDir) ;
00104
00105
00106
00107
00108
00109
00110
00111 public:
00112
00115
00118 OsiDylpSolverInterface() ;
00119
00122 OsiDylpSolverInterface(const OsiDylpSolverInterface &src) ;
00123
00126 OsiSolverInterface* clone(bool copyData = true) const ;
00127
00130 OsiDylpSolverInterface &operator=(const OsiDylpSolverInterface &rhs) ;
00131
00134 ~OsiDylpSolverInterface() ;
00135
00140 void reset() ;
00141
00143
00146
00149 int readMps(const char *filename, const char *extension = "mps") ;
00150
00155 int readMps(const char *filename, const char *extension,
00156 int &numberSets, CoinSet **&sets) ;
00157
00165 void writeMps(const char *basename,
00166 const char *extension = "mps",
00167 double objsense = 0.0) const ;
00168
00172 void loadProblem(const CoinPackedMatrix &matrix,
00173 const double *collb, const double *colub, const double *obj,
00174 const char *rowsen, const double *rowrhs,
00175 const double *rowrng) ;
00176
00180 void loadProblem(const CoinPackedMatrix &matrix,
00181 const double *collb, const double *colub, const double *obj,
00182 const double *rowlb, const double *rowub) ;
00183
00187 void loadProblem(const int colcnt, const int rowcnt,
00188 const int *start, const int *index, const double *value,
00189 const double *collb, const double *colub, const double *obj,
00190 const char *sense, const double *rhsin, const double *range) ;
00191
00195 void loadProblem(const int colcnt, const int rowcnt,
00196 const int *start, const int *index, const double *value,
00197 const double *collb, const double *colub, const double *obj,
00198 const double *row_lower, const double *row_upper) ;
00199
00203 void assignProblem(CoinPackedMatrix *&matrix,
00204 double *&collb, double *&colub, double *&obj,
00205 char *&rowsen, double *&rowrhs, double *&rowrng) ;
00206
00210 void assignProblem(CoinPackedMatrix *&matrix,
00211 double *&collb, double *&colub, double *&obj,
00212 double *&rowlb, double *&rowub) ;
00213
00215
00219
00222 int getNumCols() const ;
00223
00226 int getNumRows() const ;
00227
00230 int getNumElements() const ;
00231
00237 int getNumIntegers() const ;
00238
00241 const double* getColLower() const ;
00242
00245 const double* getColUpper() const ;
00246
00249 bool isContinuous(int colIndex) const ;
00250
00253 bool isBinary(int colIndex) const ;
00254
00257 bool isIntegerNonBinary (int colIndex) const ;
00258
00261 bool isInteger (int colIndex) const ;
00262
00265 const char* getRowSense() const ;
00266
00269 const double* getRightHandSide() const ;
00270
00273 const double* getRowRange() const ;
00274
00277 const double* getRowLower() const ;
00278
00281 const double* getRowUpper() const ;
00282
00285 const double* getObjCoefficients() const ;
00286
00292 double getObjSense() const ;
00293
00296 const CoinPackedMatrix *getMatrixByRow() const ;
00297
00300 const CoinPackedMatrix *getMatrixByCol() const ;
00302
00305
00308 void setContinuous(int index) ;
00309
00312 void setContinuous(const int *indices, int len) ;
00313
00316 void setInteger(int index) ;
00317
00320 void setInteger(const int *indices, int len) ;
00321
00324 void setColLower(int index, double value) ;
00325 using OsiSolverInterface::setColLower ;
00326
00329 void setColUpper(int index, double value) ;
00330 using OsiSolverInterface::setColUpper ;
00331
00334 void setRowLower(int index, double value) ;
00335
00338 void setRowUpper(int index, double value) ;
00339
00342 void setRowType(int index, char rowsen, double rowrhs, double rowrng) ;
00343
00346 void setObjCoeff (int index, double value) ;
00347
00354 void setObjSense(double sense) ;
00355
00358 void setColSolution(const double *colsol) ;
00359
00362 void setRowPrice(const double*) ;
00363
00364
00365
00366 using OsiSolverInterface::addCol ;
00367
00370 void addCol(const CoinPackedVectorBase &vec,
00371 const double collb, const double colub, const double obj) ;
00372
00375 void deleteCols(const int num, const int *colIndices) ;
00376
00377
00378
00379 using OsiSolverInterface::addRow ;
00380
00383 void addRow(const CoinPackedVectorBase &row,
00384 const double rowlb, const double rowub) ;
00385
00388 void addRow(const CoinPackedVectorBase &row,
00389 const char rowsen, const double rowrhs, const double rowrng) ;
00390
00393 void deleteRows(const int num, const int *rowIndices) ;
00394
00397 void applyRowCut(const OsiRowCut &cut) ;
00398
00401 void applyColCut(const OsiColCut &cut) ;
00403
00406
00409 void initialSolve() ;
00410
00413 CoinWarmStart *getEmptyWarmStart () const ;
00414
00417 CoinWarmStart *getWarmStart() const ;
00418
00426 bool setWarmStart(const CoinWarmStart *warmStart) ;
00427
00430 void resolve() ;
00431
00434 void markHotStart() ;
00435
00438 void solveFromHotStart() ;
00439
00442 void unmarkHotStart() ;
00443
00445
00448
00451 bool isAbandoned() const ;
00452
00455 bool isProvenOptimal() const ;
00456
00459 bool isProvenPrimalInfeasible() const ;
00460
00464 bool isProvenDualInfeasible() const ;
00465
00468 bool isIterationLimitReached() const ;
00469
00472 int getIterationCount() const ;
00473
00479 bool isPrimalObjectiveLimitReached() const ;
00480
00486 bool isDualObjectiveLimitReached() const ;
00488
00489
00492
00495 double getInfinity() const ;
00496
00499 bool setIntParam(OsiIntParam key, int value) ;
00500
00503 bool setDblParam(OsiDblParam key, double value) ;
00504
00507 bool setStrParam(OsiStrParam key, const std::string& value) ;
00508
00511 bool setHintParam(OsiHintParam key, bool sense = true,
00512 OsiHintStrength strength = OsiHintTry, void *info = 0) ;
00513
00516 bool getIntParam(OsiIntParam key, int &value) const ;
00517
00520 bool getDblParam(OsiDblParam key, double &value) const ;
00521
00524 bool getStrParam(OsiStrParam key, std::string &value) const ;
00525
00526
00527
00528 using OsiSolverInterface::getHintParam ;
00529
00532 bool getHintParam(OsiHintParam key, bool &sense,
00533 OsiHintStrength &strength, void *&info) const ;
00534
00537 inline void newLanguage(CoinMessages::Language language)
00538 { setOsiDylpMessages(language) ; }
00539
00542 inline void setLanguage(CoinMessages::Language language)
00543 { setOsiDylpMessages(language) ; }
00544
00546
00549
00552 const double* getColSolution() const ;
00553
00556 const double* getRowPrice() const ;
00557
00560 const double* getReducedCost() const ;
00561
00564 const double* getRowActivity() const ;
00565
00568 double getObjValue() const ;
00569
00571
00578
00581 void setObjName (std::string name) ;
00582
00588 void setRowName(int ndx, std::string name) ;
00589
00595 void setColName(int ndx, std::string name) ;
00596
00598
00601
00608 void activateRowCutDebugger (const char * modelName) ;
00609
00617 void activateRowCutDebugger (const double *solution) ;
00618
00619 # if ODSI_PARANOIA >= 1
00620
00629 void indexCheck (int k, bool isCol, std::string rtnnme) ;
00630 # endif
00631
00633
00636
00639 void dylp_controlfile(const char* name, const bool silent,
00640 const bool mustexist = true) ;
00641
00644 void dylp_logfile(const char* name, bool echo = false) ;
00645
00648 void dylp_outfile(const char* name) ;
00649
00652 void dylp_printsoln(bool wantSoln, bool wantStats) ;
00653
00656 void setOsiDylpMessages(CoinMessages::Language local_language) ;
00657
00659
00662
00663
00666 void branchAndBound() ;
00667
00670 std::vector<double *> getDualRays(int) const ;
00671
00674 std::vector<double *> getPrimalRays(int) const ;
00676
00681
00682
00683
00684
00686
00687 lpopts_struct *initialSolveOptions,*resolveOptions ;
00688 lptols_struct* tolerances ;
00689
00691
00692 private:
00693
00694
00695
00696
00697
00698
00705
00706 consys_struct* consys ;
00707 lpprob_struct* lpprob ;
00708 lpstats_struct* statistics ;
00709
00711
00714
00715 static int reference_count ;
00716 static bool basis_ready ;
00717 static OsiDylpSolverInterface *dylp_owner ;
00718
00720
00721
00727
00734 ioid local_outchn ;
00735
00741 ioid local_logchn ;
00742
00747 bool initial_gtxecho ;
00748
00753 bool resolve_gtxecho ;
00754
00764 lpret_enum lp_retval ;
00765
00771 double obj_sense ;
00772
00775 double odsiInfinity ;
00776
00779 const std::string solvername ;
00780
00783 mutable void *info_[OsiLastHintParam] ;
00784
00787 bool mps_debug ;
00788
00796 CoinWarmStart *hotstart_fallback ;
00797
00818 enum basisCondition
00819 { basisNone = 0, basisFresh, basisModified, basisDamaged } ;
00820
00838 struct
00839 { CoinWarmStart *basis ;
00840 basisCondition condition ;
00841 int balance ; } activeBasis ;
00842
00848 bool solnIsFresh ;
00849
00851
00852
00853
00860
00861 mutable double _objval ;
00862 mutable double* _col_obj ;
00863 mutable double* _col_x ;
00864 mutable double* _col_cbar ;
00865
00866 mutable double* _row_rhs ;
00867 mutable double* _row_lower ;
00868 mutable double* _row_upper ;
00869 mutable char* _row_sense ;
00870 mutable double* _row_range ;
00871 mutable double* _row_lhs ;
00872 mutable double* _row_price ;
00873
00874 mutable CoinPackedMatrix* _matrix_by_col ;
00875 mutable CoinPackedMatrix* _matrix_by_row ;
00876
00878
00885
00891 CoinPresolveMatrix *preObj_ ;
00892
00899 const CoinPresolveAction *postActions_ ;
00900
00908 CoinPostsolveMatrix *postObj_ ;
00909
00911 int passLimit_ ;
00912
00914 bool keepIntegers_ ;
00915
00917 consys_struct *savedConsys_ ;
00918
00920 mutable double* saved_col_obj ;
00921 mutable double* saved_row_rhs ;
00922 mutable double* saved_row_lower ;
00923 mutable double* saved_row_upper ;
00924 mutable char* saved_row_sense ;
00925 mutable double* saved_row_range ;
00926 mutable CoinPackedMatrix* saved_matrix_by_col ;
00927 mutable CoinPackedMatrix* saved_matrix_by_row ;
00928
00930
00940
00941 CoinPresolveMatrix *initialisePresolve(bool keepIntegers) ;
00942
00944 void doPresolve() ;
00945
00947 bool evalPresolve() ;
00948
00950 void saveOriginalSys() ;
00951
00953 void installPresolve() ;
00954
00956 CoinPostsolveMatrix *initialisePostsolve(CoinPresolveMatrix *&preObj) ;
00957
00959 void doPostsolve() ;
00960
00962 void installPostsolve() ;
00963
00965 void destruct_presolve() ;
00966
00968
00972 void construct_lpprob() ;
00973 void construct_options() ;
00974 void construct_consys(int cols, int rows) ;
00975 void dylp_ioinit() ;
00976 void gen_rowparms(int rowcnt,
00977 double *rhs, double *rhslow, contyp_enum *ctyp,
00978 const double *rowlb, const double *rowub) ;
00979 void gen_rowparms(int rowcnt,
00980 double *rhs, double *rhslow, contyp_enum *ctyp,
00981 const char *sense, const double *rhsin, const double *range) ;
00982 void load_problem(const CoinMpsIO &mps) ;
00983 void load_problem(const CoinPackedMatrix &matrix,
00984 const double* col_lower, const double* col_upper, const double* obj,
00985 const contyp_enum *ctyp, const double* rhs, const double* rhslow) ;
00986 void load_problem (const int colcnt, const int rowcnt,
00987 const int *start, const int *lens,
00988 const int *index, const double *value,
00989 const double* col_lower, const double* col_upper, const double* obj,
00990 const contyp_enum *ctyp, const double* rhs, const double* rhslow) ;
00992
00996 lpret_enum do_lp (ODSI_start_enum start) ;
00998
01001 void destruct_col_cache(bool structure) ;
01002 void destruct_row_cache(bool structure) ;
01003 void destruct_cache(bool rowStructure, bool colStructure) ;
01004 void destruct_problem(bool preserve_interface) ;
01005 void detach_dylp() ;
01007
01008
01010
01011
01012
01013
01015
01016 void add_col(const CoinPackedVectorBase& coin_coli,
01017 vartyp_enum vtypi, double vlbi,
01018 double vubi, double obji, const std::string *nme) ;
01019 void add_row(const CoinPackedVectorBase& coin_rowi,
01020 char clazzi, contyp_enum ctypi,
01021 double rhsi, double rhslowi, const std::string *nme) ;
01022 void calc_objval() ;
01023 contyp_enum bound_to_type(double lower, double upper) ;
01024 void gen_rowiparms(contyp_enum* ctypi, double* rhsi, double* rhslowi,
01025 char sensei, double rhsini, double rangei) ;
01026 void gen_rowiparms(contyp_enum* ctypi, double* rhsi, double* rhslowi,
01027 double rowlbi, double rowubi) ;
01028 void unimp_hint(bool dylpSense, bool hintSense,
01029 OsiHintStrength hintStrength, const char *msgString) ;
01030 void pessimal_primal() ;
01031 void reduceActiveBasis() ;
01032
01034
01037 static contyp_enum sense_to_type(char type) ;
01038 static char type_to_sense(contyp_enum type) ;
01040
01047 template<class T> static void copy(const T* src, T* dst, int n) ;
01048 template<class T> static T* copy(const T* src, int n) ;
01049 template<class T> static T* copy(const T* src) ;
01050
01051
01052
01053 static basis_struct* copy_basis(const basis_struct* src, int dstsze) ;
01054 static void copy_basis(const basis_struct* src, basis_struct* dst) ;
01055 static lpprob_struct* copy_lpprob(const lpprob_struct* src) ;
01057
01058 #ifndef _MSC_VER
01059
01064 template<class T> static void assert_same(const T& t1, const T& t2,
01065 bool exact) ;
01066 template<class T> static void assert_same(const T* t1, const T* t2,
01067 int n, bool exact) ;
01068
01069 static void assert_same(double d1, double d2, bool exact) ;
01070
01071 static void assert_same(const basis_struct& b1,
01072 const basis_struct& b2, bool exact) ;
01073 static void assert_same(const consys_struct& c1, const
01074 consys_struct& c2, bool exact) ;
01075 static void assert_same(const conbnd_struct& c1, const
01076 conbnd_struct& c2, bool exact) ;
01077 static void assert_same(const lpprob_struct& l1,
01078 const lpprob_struct& l2, bool exact) ;
01079 static void assert_same(const OsiDylpSolverInterface& o1,
01080 const OsiDylpSolverInterface& o2, bool exact) ;
01082 #endif
01083
01086 template<class T> static T* idx_vec(T* data) ;
01087 static int idx(int i) ;
01088 template<class T> static T* inv_vec(T* data) ;
01089 static int inv(int i) ;
01090
01091 static pkvec_struct* packed_vector(
01092 const CoinShallowPackedVector vector, int dimension) ;
01093 static void packed_vector(
01094 const CoinShallowPackedVector vector, int dimension, pkvec_struct *dst) ;
01096
01099 static std::string make_filename(const char *filename,
01100 const char *ext1, const char *ext2) ;
01102
01103 } ;
01104
01105
01106
01107
01108
01109
01117 int OsiDylpSolverInterfaceUnitTest(const std::string & mpsDir,
01118 const std::string &netLibDir) ;
01119
01120 #endif // OsiDylpSolverInterface_H