Cgl trunk
CglLandP.hpp
Go to the documentation of this file.
00001 // Copyright (C) 2005-2009, Pierre Bonami and others.  All Rights Reserved.
00002 // Author:   Pierre Bonami
00003 //           Tepper School of Business
00004 //           Carnegie Mellon University, Pittsburgh, PA 15213
00005 // Date:     07/21/05
00006 //
00007 // $Id$
00008 //
00009 // This code is licensed under the terms of the Eclipse Public License (EPL).
00010 //---------------------------------------------------------------------------
00011 #ifndef CglLandP_H
00012 #define CglLandP_H
00013 
00014 #include "CglLandPValidator.hpp"
00015 #include "CglCutGenerator.hpp"
00016 #include "CglParam.hpp"
00017 
00018 #include <iostream>
00019 class CoinWarmStartBasis;
00024 namespace LAP
00025 {
00026 enum LapMessagesTypes
00027 {
00028     BEGIN_ROUND,
00029     END_ROUND,
00030     DURING_SEP,
00031     CUT_REJECTED,
00032     CUT_FAILED,
00033     CUT_GAP,
00034     LAP_CUT_FAILED_DO_MIG,
00035     LAP_MESSAGES_DUMMY_END
00036 };
00038 class LapMessages : public CoinMessages
00039 {
00040 public:
00042     LapMessages( );
00044     virtual ~LapMessages() {}
00045 };
00046 class CglLandPSimplex;
00047 }
00048 
00049 class CglLandP : public CglCutGenerator
00050 {
00051     friend void CglLandPUnitTest(OsiSolverInterface *si, const std::string & mpsDir);
00052 
00053     friend class LAP::CglLandPSimplex;
00054     friend class CftCglp;
00055 
00056 public:
00057 
00058     enum SelectionRules
00059     {
00060         mostNegativeRc ,
00061         bestPivot ,
00062         initialReducedCosts
00063     };
00064 
00065     enum ExtraCutsMode
00066     {
00067         none,
00068         AtOptimalBasis ,
00069         WhenEnteringBasis ,
00070         AllViolatedMigs
00071     };
00072 
00074     enum SeparationSpaces
00075     {
00076         Fractional=0 ,
00077         Fractional_rc,
00078         Full 
00079     };
00080 
00082     enum Normalization
00083     {
00084         Unweighted = 0,
00085         WeightRHS,
00086         WeightLHS,
00087         WeightBoth
00088     };
00089 
00090     enum LHSnorm
00091     {
00092         L1 = 0,
00093         L2,
00094         SupportSize,
00095         Infinity,
00096         Average,
00097         Uniform
00098     };
00100     enum RhsWeightType
00101     {
00102         Fixed = 0 ,
00103         Dynamic 
00104     };
00107     class Parameters : public CglParam
00108     {
00109     public:
00111         Parameters();
00113         Parameters(const Parameters &other);
00115         Parameters & operator=(const Parameters &other);
00118 
00121         int pivotLimit;
00124         int pivotLimitInTree;
00126         int maxCutPerRound;
00128         int failedPivotLimit;
00131         int degeneratePivotLimit;
00133         int extraCutsLimit;
00137 
00138         double pivotTol;
00140         double away;
00142         mutable double timeLimit;
00144         double singleCutTimeLimit;
00146         double rhsWeight;
00148 
00151 
00152         bool useTableauRow;
00154         bool modularize;
00156         bool strengthen;
00158         bool countMistakenRc;
00160         SeparationSpaces sepSpace;
00162         bool perturb;
00164         Normalization normalization;
00166         RhsWeightType rhsWeightType;
00168         LHSnorm lhs_norm;
00170         ExtraCutsMode generateExtraCuts;
00172         SelectionRules pivotSelection;
00174     };
00175 
00176 
00178     CglLandP(const CglLandP::Parameters &params = CglLandP::Parameters(),
00179              const LAP::Validator &validator = LAP::Validator());
00181     ~CglLandP();
00183     CglLandP(const CglLandP &source);
00185     CglLandP& operator=(const CglLandP &rhs);
00187     CglCutGenerator * clone() const;
00188 
00191 
00192     virtual void generateCuts(const OsiSolverInterface & si, OsiCuts & cs,
00193                               const CglTreeInfo info = CglTreeInfo()) const;
00194 
00196 
00197     virtual bool needsOptimalBasis() const
00198     {
00199         return true;
00200     }
00201 
00202     LAP::Validator & validator()
00203     {
00204         return validator_;
00205     }
00213     void setLogLevel(int level)
00214     {
00215         handler_->setLogLevel(level);
00216     }
00217 
00218     class NoBasisError : public CoinError
00219     {
00220     public:
00221         NoBasisError(): CoinError("No basis available","LandP","") {}
00222     };
00223 
00224     class SimplexInterfaceError : public CoinError
00225     {
00226     public:
00227         SimplexInterfaceError(): CoinError("Invalid conversion to simplex interface", "CglLandP","CglLandP") {}
00228     };
00229     Parameters & parameter()
00230     {
00231         return params_;
00232     }
00233 private:
00234 
00235 
00236     void scanExtraCuts(OsiCuts& cs, const double * colsol) const;
00237 
00238     Parameters params_;
00239 
00241     struct CachedData
00242     {
00243         CachedData(int nBasics = 0 , int nNonBasics = 0);
00244         CachedData(const CachedData & source);
00245 
00246         CachedData& operator=(const CachedData &source);
00248         void getData(const OsiSolverInterface &si);
00249 
00250         void clean();
00251 
00252         ~CachedData();
00254         int * basics_;
00256         int *nonBasics_;
00258         int nBasics_;
00260         int nNonBasics_;
00262         CoinWarmStartBasis * basis_;
00264         double * colsol_;
00266         double * slacks_;
00268         bool * integers_;
00269     };
00272     int getSortedFractionals(CoinPackedVector &xFrac,
00273                              const CachedData & data,
00274                              const CglLandP::Parameters& params) const;
00277     void getSortedFractionalIndices(std::vector<int>& indices,
00278                                     const CachedData &data,
00279                                     const CglLandP::Parameters & params) const;
00281     mutable CachedData cached_;
00283     CoinMessageHandler * handler_;
00285     CoinMessages messages_;
00287     LAP::Validator validator_;
00289     mutable int numrows_;
00291     mutable int numcols_;
00293     mutable double * originalColLower_;
00295     mutable double * originalColUpper_;
00297     mutable bool canLift_;
00299     mutable OsiCuts extraCuts_;
00300 };
00301 void CglLandPUnitTest(OsiSolverInterface *si, const std::string & mpsDir);
00302 
00303 #endif
00304 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines