Cgl trunk
|
00001 // Copyright (C) 2005, International Business Machines 00002 // Corporation and others. All Rights Reserved. 00003 // This code is licensed under the terms of the Eclipse Public License (EPL). 00004 00005 #ifndef CglPreProcess_H 00006 #define CglPreProcess_H 00007 00008 #include <string> 00009 #include <vector> 00010 00011 #include "CoinMessageHandler.hpp" 00012 #include "OsiSolverInterface.hpp" 00013 #include "CglStored.hpp" 00014 #include "OsiPresolve.hpp" 00015 #include "CglCutGenerator.hpp" 00016 00017 //############################################################################# 00018 00036 class CglPreProcess { 00037 00038 public: 00039 00041 00042 00051 OsiSolverInterface * preProcess(OsiSolverInterface & model, 00052 bool makeEquality=false, int numberPasses=5); 00064 OsiSolverInterface * preProcessNonDefault(OsiSolverInterface & model, 00065 int makeEquality=0, int numberPasses=5, 00066 int tuning=0); 00068 void postProcess(OsiSolverInterface &model); 00076 int tightenPrimalBounds(OsiSolverInterface & model,double factor=0.0); 00083 OsiSolverInterface * someFixed(OsiSolverInterface & model, 00084 double fractionToKeep=0.25, 00085 bool fixContinuousAsWell=false, 00086 char * keep=NULL) const; 00091 OsiSolverInterface * cliqueIt(OsiSolverInterface & model, 00092 double cliquesNeeded=0.0) const; 00094 int reducedCostFix(OsiSolverInterface & model); 00096 00097 //--------------------------------------------------------------------------- 00098 00113 void setCutoff(double value) ; 00114 00116 double getCutoff() const; 00118 inline OsiSolverInterface * originalModel() const 00119 { return originalModel_;} 00121 inline OsiSolverInterface * startModel() const 00122 { return startModel_;} 00124 inline OsiSolverInterface * modelAtPass(int iPass) const 00125 { if (iPass>=0&&iPass<numberSolvers_) return model_[iPass]; else return NULL;} 00127 inline OsiSolverInterface * modifiedModel(int iPass) const 00128 { if (iPass>=0&&iPass<numberSolvers_) return modifiedModel_[iPass]; else return NULL;} 00130 inline OsiPresolve * presolve(int iPass) const 00131 { if (iPass>=0&&iPass<numberSolvers_) return presolve_[iPass]; else return NULL;} 00134 const int * originalColumns() const; 00137 const int * originalRows() const; 00139 inline int numberSOS() const 00140 { return numberSOS_;} 00142 inline const int * typeSOS() const 00143 { return typeSOS_;} 00145 inline const int * startSOS() const 00146 { return startSOS_;} 00148 inline const int * whichSOS() const 00149 { return whichSOS_;} 00151 inline const double * weightSOS() const 00152 { return weightSOS_;} 00154 void passInProhibited(const char * prohibited,int numberColumns); 00156 inline const char * prohibited() 00157 { return prohibited_;} 00159 inline int numberIterationsPre() const 00160 { return numberIterationsPre_;} 00162 inline int numberIterationsPost() const 00163 { return numberIterationsPost_;} 00170 void passInRowTypes(const char * rowTypes,int numberRows); 00177 inline const char * rowTypes() 00178 { return rowType_;} 00180 inline const CglStored & cuts() const 00181 { return cuts_;} 00183 inline const CglStored * cutsPointer() const 00184 { return &cuts_;} 00186 void update(const OsiPresolve * pinfo,const OsiSolverInterface * solver); 00188 inline void setOptions(int value) 00189 { options_=value;} 00191 00193 00194 00195 inline int numberCutGenerators() const 00196 { return numberCutGenerators_;} 00198 inline CglCutGenerator ** cutGenerators() const 00199 { return generator_;} 00201 inline CglCutGenerator * cutGenerator(int i) const 00202 { return generator_[i];} 00205 void addCutGenerator(CglCutGenerator * generator); 00207 00217 void setApplicationData (void * appData); 00218 00220 void * getApplicationData() const; 00222 00223 //--------------------------------------------------------------------------- 00224 00227 00228 void passInMessageHandler(CoinMessageHandler * handler); 00230 void newLanguage(CoinMessages::Language language); 00231 inline void setLanguage(CoinMessages::Language language) 00232 {newLanguage(language);} 00234 inline CoinMessageHandler * messageHandler() const 00235 {return handler_;} 00237 inline CoinMessages messages() 00238 {return messages_;} 00240 inline CoinMessages * messagesPointer() 00241 {return &messages_;} 00243 //--------------------------------------------------------------------------- 00244 00245 00247 00248 00249 CglPreProcess(); 00250 00252 CglPreProcess(const CglPreProcess & rhs); 00253 00255 CglPreProcess & operator=(const CglPreProcess& rhs); 00256 00258 ~CglPreProcess (); 00259 00261 void gutsOfDestructor(); 00263 private: 00264 00266 00267 00271 OsiSolverInterface * modified(OsiSolverInterface * model, 00272 bool constraints, 00273 int & numberChanges, 00274 int iBigPass, 00275 int numberPasses); 00277 void createOriginalIndices() const; 00279 void makeInteger(); 00281 00282 //--------------------------------------------------------------------------- 00283 00284 private: 00286 00287 00289 OsiSolverInterface * originalModel_; 00291 OsiSolverInterface * startModel_; 00293 int numberSolvers_; 00295 OsiSolverInterface ** model_; 00297 OsiSolverInterface ** modifiedModel_; 00299 OsiPresolve ** presolve_; 00300 00302 CoinMessageHandler * handler_; 00303 00309 bool defaultHandler_; 00310 00312 CoinMessages messages_; 00313 00315 void * appData_; 00317 mutable int * originalColumn_; 00319 mutable int * originalRow_; 00321 int numberCutGenerators_; 00323 CglCutGenerator ** generator_; 00325 int numberSOS_; 00327 int * typeSOS_; 00329 int * startSOS_; 00331 int * whichSOS_; 00333 double * weightSOS_; 00335 int numberProhibited_; 00337 int numberIterationsPre_; 00339 int numberIterationsPost_; 00341 char * prohibited_; 00343 int numberRowType_; 00350 int options_; 00357 char * rowType_; 00359 CglStored cuts_; 00361 }; 00363 class CglBK { 00364 00365 public: 00366 00368 00369 00370 void bronKerbosch(); 00372 OsiSolverInterface * newSolver(const OsiSolverInterface & model); 00374 00375 //--------------------------------------------------------------------------- 00376 00386 00387 00388 //--------------------------------------------------------------------------- 00389 00390 00392 00393 00394 CglBK(); 00395 00397 CglBK(const OsiSolverInterface & model, const char * rowType, 00398 int numberElements); 00399 00401 CglBK(const CglBK & rhs); 00402 00404 CglBK & operator=(const CglBK& rhs); 00405 00407 ~CglBK (); 00408 00410 00411 //--------------------------------------------------------------------------- 00412 00413 private: 00415 00416 00417 int * candidates_; 00419 char * mark_; 00421 int * start_; 00423 int * otherColumn_; 00425 int * originalRow_; 00427 int * dominated_; 00429 CoinPackedMatrix * cliqueMatrix_; 00431 const char * rowType_; 00433 int numberColumns_; 00435 int numberRows_; 00437 int numberPossible_; 00439 int numberCandidates_; 00441 int firstNot_; 00443 int numberIn_; 00445 int left_; 00446 int lastColumn_; 00448 }; 00449 00450 #endif