Cgl  trunk
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
CglPreProcess.hpp
Go to the documentation of this file.
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
00069                    ,bool deleteStuff=true);
00077   int tightenPrimalBounds(OsiSolverInterface & model,double factor=0.0);
00084   OsiSolverInterface * someFixed(OsiSolverInterface & model, 
00085                                  double fractionToKeep=0.25,
00086                                  bool fixContinuousAsWell=false,
00087                                  char * keep=NULL) const;
00092   OsiSolverInterface * cliqueIt(OsiSolverInterface & model,
00093                                 double cliquesNeeded=0.0) const;
00095   int reducedCostFix(OsiSolverInterface & model);
00097 
00098   //---------------------------------------------------------------------------
00099 
00114   void setCutoff(double value) ;
00115 
00117   double getCutoff() const;
00119   inline OsiSolverInterface * originalModel() const
00120   { return originalModel_;}
00122   inline OsiSolverInterface * startModel() const
00123   { return startModel_;}
00125   inline OsiSolverInterface * modelAtPass(int iPass) const
00126   { if (iPass>=0&&iPass<numberSolvers_) return model_[iPass]; else return NULL;}
00128   inline OsiSolverInterface * modifiedModel(int iPass) const
00129   { if (iPass>=0&&iPass<numberSolvers_) return modifiedModel_[iPass]; else return NULL;}
00131   inline OsiPresolve * presolve(int iPass) const
00132   { if (iPass>=0&&iPass<numberSolvers_) return presolve_[iPass]; else return NULL;}
00135   const int * originalColumns() const;
00138   const int * originalRows() const;
00140   inline int numberSOS() const
00141   { return numberSOS_;}
00143   inline const int * typeSOS() const
00144   { return typeSOS_;}
00146   inline const int * startSOS() const
00147   { return startSOS_;}
00149   inline const int * whichSOS() const
00150   { return whichSOS_;}
00152   inline const double * weightSOS() const
00153   { return weightSOS_;}
00155   void passInProhibited(const char * prohibited,int numberColumns);
00157   inline const char * prohibited()
00158   { return prohibited_;}
00160   inline int numberIterationsPre() const
00161   { return numberIterationsPre_;}
00163   inline int numberIterationsPost() const
00164   { return numberIterationsPost_;}
00171   void passInRowTypes(const char * rowTypes,int numberRows);
00178   inline const char * rowTypes()
00179   { return rowType_;}
00181   inline const CglStored & cuts() const
00182   { return cuts_;}
00184   inline const CglStored * cutsPointer() const
00185   { return &cuts_;}
00187   void update(const OsiPresolve * pinfo,const OsiSolverInterface * solver);
00189   inline void setOptions(int value)
00190   { options_=value;}
00192 
00194 
00195 
00196   inline int numberCutGenerators() const
00197   { return numberCutGenerators_;}
00199   inline CglCutGenerator ** cutGenerators() const
00200   { return generator_;}
00202   inline CglCutGenerator * cutGenerator(int i) const
00203   { return generator_[i];}
00206   void addCutGenerator(CglCutGenerator * generator);
00208     
00218     void setApplicationData (void * appData);
00219 
00221     void * getApplicationData() const;
00223   
00224   //---------------------------------------------------------------------------
00225 
00228 
00229   void passInMessageHandler(CoinMessageHandler * handler);
00231   void newLanguage(CoinMessages::Language language);
00232   inline void setLanguage(CoinMessages::Language language)
00233   {newLanguage(language);}
00235   inline CoinMessageHandler * messageHandler() const
00236   {return handler_;}
00238   inline CoinMessages messages() 
00239   {return messages_;}
00241   inline CoinMessages * messagesPointer() 
00242   {return &messages_;}
00244   //---------------------------------------------------------------------------
00245 
00246 
00248 
00249 
00250   CglPreProcess(); 
00251   
00253   CglPreProcess(const CglPreProcess & rhs);
00254   
00256   CglPreProcess & operator=(const CglPreProcess& rhs);
00257 
00259   ~CglPreProcess ();
00260   
00262   void gutsOfDestructor();
00264 private:
00265 
00267 
00268 
00272   OsiSolverInterface * modified(OsiSolverInterface * model,
00273                                 bool constraints,
00274                                 int & numberChanges,
00275                                 int iBigPass,
00276                                 int numberPasses);
00278   void createOriginalIndices() const;
00280   void makeInteger();
00282 
00283 //---------------------------------------------------------------------------
00284 
00285 private:
00287 
00288 
00290   OsiSolverInterface * originalModel_;
00292   OsiSolverInterface * startModel_;
00294   int numberSolvers_;
00296   OsiSolverInterface ** model_;
00298   OsiSolverInterface ** modifiedModel_;
00300   OsiPresolve ** presolve_;
00301 
00303   CoinMessageHandler * handler_;
00304 
00310   bool defaultHandler_;
00311 
00313   CoinMessages messages_;
00314 
00316   void * appData_;
00318   mutable int * originalColumn_;
00320   mutable int * originalRow_;
00322   int numberCutGenerators_;
00324   CglCutGenerator ** generator_;
00326   int numberSOS_;
00328   int * typeSOS_;
00330   int * startSOS_;
00332   int * whichSOS_;
00334   double * weightSOS_;
00336   int numberProhibited_;
00338   int numberIterationsPre_;
00340   int numberIterationsPost_;
00342   char * prohibited_;
00344   int numberRowType_;
00351   int options_;
00358   char * rowType_;
00360   CglStored cuts_;
00362 };
00364 class CglBK  {
00365   
00366 public:
00367 
00369 
00370 
00371   void bronKerbosch();
00373   OsiSolverInterface * newSolver(const OsiSolverInterface & model);
00375 
00376   //---------------------------------------------------------------------------
00377 
00387 
00388 
00389   //---------------------------------------------------------------------------
00390 
00391 
00393 
00394 
00395   CglBK(); 
00396   
00398   CglBK(const OsiSolverInterface & model, const char * rowType,
00399         int numberElements);
00400   
00402   CglBK(const CglBK & rhs);
00403   
00405   CglBK & operator=(const CglBK& rhs);
00406 
00408   ~CglBK ();
00409   
00411 
00412 //---------------------------------------------------------------------------
00413 
00414 private:
00416 
00417 
00418   int * candidates_;
00420   char * mark_;
00422   int * start_;
00424   int * otherColumn_;
00426   int * originalRow_;
00428   int * dominated_;
00430   CoinPackedMatrix * cliqueMatrix_;
00432   const char * rowType_;
00434   int numberColumns_;
00436   int numberRows_;
00438   int numberPossible_;
00440   int numberCandidates_;
00442   int firstNot_;
00444   int numberIn_;
00446   int left_;
00447   int lastColumn_;
00449 };
00453 // for hashing
00454 typedef struct {
00455   int index, next;
00456 } CglHashLink;
00457 class OsiRowCut;
00458 class CglUniqueRowCuts {
00459 public:
00460 
00461   CglUniqueRowCuts(int initialMaxSize=0, int hashMultiplier=4 );
00462   ~CglUniqueRowCuts();
00463   CglUniqueRowCuts(const CglUniqueRowCuts& rhs);
00464   CglUniqueRowCuts& operator=(const CglUniqueRowCuts& rhs);
00465   inline OsiRowCut * cut(int sequence) const
00466   { return rowCut_[sequence];}
00467   inline int numberCuts() const
00468   { return numberCuts_;}
00469   inline int sizeRowCuts() const
00470   { return numberCuts_;}
00471   inline OsiRowCut * rowCutPtr(int sequence)
00472   { return rowCut_[sequence];}
00473   void eraseRowCut(int sequence);
00474   // insert cut
00475   inline void insert(const OsiRowCut & cut)
00476   { insertIfNotDuplicate(cut);}
00477   // Return 0 if added, 1 if not
00478   int insertIfNotDuplicate(const OsiRowCut & cut);
00479   // Add in cuts as normal cuts (and delete)
00480   void addCuts(OsiCuts & cs);
00481 private:
00482   OsiRowCut ** rowCut_;
00484   CglHashLink *hash_;
00485   int size_;
00486   int hashMultiplier_;
00487   int numberCuts_;
00488   int lastHash_;
00489 };
00490 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines