00001
00002
00003
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