00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef CbcGenCtlBlk_H
00014 #define CbcGenCtlBlk_H
00015
00016
00017
00018
00019
00020 #include "CoinParam.hpp"
00021 #include "CoinMessageHandler.hpp"
00022
00023 #include "CglCutGenerator.hpp"
00024 #include "CglProbing.hpp"
00025 #include "CglClique.hpp"
00026 #include "CglFlowCover.hpp"
00027 #include "CglGomory.hpp"
00028 #include "CglKnapsackCover.hpp"
00029 #include "CglMixedIntegerRounding2.hpp"
00030 #include "CglOddHole.hpp"
00031 #include "CglRedSplit.hpp"
00032 #include "CglTwomir.hpp"
00033
00034 #include "CbcModel.hpp"
00035
00036 #include "CbcHeuristic.hpp"
00037 #include "CbcHeuristicFPump.hpp"
00038 #include "CbcHeuristicGreedy.hpp"
00039 #include "CbcHeuristicLocal.hpp"
00040 #include "CbcTreeLocal.hpp"
00041
00042 #include "CbcGenMessages.hpp"
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 #define CBC_GENERIC_VERSION "00.01.00"
00054
00055 class CbcGenCtlBlk ;
00056 namespace CbcGenParamUtils {
00057 void addCbcGenParams(int &numParams, CoinParamVec ¶mVec,
00058 CbcGenCtlBlk *ctlBlk) ;
00059 }
00060
00061
00062
00063
00064
00065
00066
00067 class CbcGenCtlBlk {
00068
00069 friend void CbcGenParamUtils::addCbcGenParams(int &numParams,
00070 CoinParamVec ¶mVec, CbcGenCtlBlk *ctlBlk) ;
00071
00072 public:
00073
00076
00077
00078
00079
00080
00081
00099 typedef enum { IPPOff = 0, IPPOn, IPPSave, IPPEqual,
00100 IPPSOS, IPPTrySOS, IPPEqualAll, IPPStrategy
00101 } IPPControl ;
00102
00103
00104
00105
00106
00107
00108
00129 typedef enum { CGOff, CGOn, CGRoot, CGIfMove,
00130 CGForceOn, CGForceBut, CGMarker
00131 } CGControl ;
00132
00141 typedef enum { BPOff, BPCost, BPOrder, BPExt } BPControl ;
00142
00158 typedef enum { BACInvalid = -1, BACFinish = 0,
00159 BACStop = 1, BACAbandon = 2, BACNotRun, BACUser = 5
00160 } BACMajor ;
00161
00181 typedef enum { BACmInvalid = -1, BACmFinish = 0, BACmInfeas, BACmUbnd,
00182 BACmGap, BACmNodeLimit, BACmTimeLimit, BACmSolnLimit,
00183 BACmUser, BACmOther
00184 } BACMinor ;
00185
00195 typedef enum { BACwInvalid = -1, BACwNotStarted = 0, BACwBareRoot,
00196 BACwIPP, BACwIPPRelax, BACwBAC
00197 } BACWhere ;
00198
00200
00203
00206 CbcGenCtlBlk() ;
00207
00210 ~CbcGenCtlBlk() ;
00212
00228
00236 inline int getCutDepth() {
00237 return cutDepth_ ;
00238 }
00239
00245 inline void setCutDepth(int cutDepth) {
00246 cutDepth_ = cutDepth ;
00247 }
00248
00249
00250
00251 inline IPPControl getIPPAction() {
00252 return (preProcess_) ;
00253 }
00254
00257 inline void setIPPAction(IPPControl action) {
00258 preProcess_ = action ;
00259 }
00260
00263 CGControl getProbing(CglCutGenerator *&gen) ;
00264
00267 inline void setProbingAction(CGControl action) {
00268 probing_.action_ = action ;
00269 }
00270
00273 CGControl getClique(CglCutGenerator *&gen) ;
00274
00277 inline void setCliqueAction(CGControl action) {
00278 clique_.action_ = action ;
00279 }
00280
00283 CGControl getFlow(CglCutGenerator *&gen) ;
00284
00287 inline void setFlowAction(CGControl action) {
00288 flow_.action_ = action ;
00289 }
00290
00293 CGControl getGomory(CglCutGenerator *&gen) ;
00294
00297 inline void setGomoryAction(CGControl action) {
00298 gomory_.action_ = action ;
00299 }
00300
00303 CGControl getKnapsack(CglCutGenerator *&gen) ;
00304
00307 inline void setKnapsackAction(CGControl action) {
00308 knapsack_.action_ = action ;
00309 }
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00325 CGControl getMir(CglCutGenerator *&gen) ;
00326
00329 inline void setMirAction(CGControl action) {
00330 mir_.action_ = action ;
00331 }
00332
00335 CGControl getRedSplit(CglCutGenerator *&gen) ;
00336
00339 inline void setRedSplitAction(CGControl action) {
00340 redSplit_.action_ = action ;
00341 }
00342
00345 CGControl getTwomir(CglCutGenerator *&gen) ;
00346
00349 inline void setTwomirAction(CGControl action) {
00350 twomir_.action_ = action ;
00351 }
00352
00353
00361 CGControl getFPump(CbcHeuristic *&gen, CbcModel *model,
00362 bool alwaysCreate = true) ;
00363
00366 inline void setFPumpAction(CGControl action) {
00367 fpump_.action_ = action ;
00368 }
00369
00377 CGControl getCombine(CbcHeuristic *&gen, CbcModel *model,
00378 bool alwaysCreate = true) ;
00379
00382 inline void setCombineAction(CGControl action) {
00383 combine_.action_ = action ;
00384 }
00385
00393 CGControl getGreedyCover(CbcHeuristic *&gen, CbcModel *model,
00394 bool alwaysCreate = true) ;
00395
00398 inline void setGreedyCoverAction(CGControl action) {
00399 greedyCover_.action_ = action ;
00400 }
00401
00409 CGControl getGreedyEquality(CbcHeuristic *&gen, CbcModel *model,
00410 bool alwaysCreate = true) ;
00411
00414 inline void setGreedyEqualityAction(CGControl action) {
00415 greedyEquality_.action_ = action ;
00416 }
00417
00425 CGControl getRounding(CbcHeuristic *&gen, CbcModel *model,
00426 bool alwaysCreate = true) ;
00427
00430 inline void setRoundingAction(CGControl action) {
00431 rounding_.action_ = action ;
00432 }
00433
00441 CGControl getTreeLocal(CbcTreeLocal *&localTree, CbcModel *model,
00442 bool alwaysCreate = true) ;
00443
00446 inline void setTreeLocalAction(CGControl action) {
00447 localTree_.action_ = action ;
00448 }
00449
00451
00456
00459 inline void setBaBStatus(BACMajor majorStatus, BACMinor minorStatus,
00460 BACWhere where, bool haveAnswer,
00461 OsiSolverInterface *answerSolver) {
00462 bab_.majorStatus_ = majorStatus ;
00463 bab_.minorStatus_ = minorStatus ;
00464 bab_.where_ = where ;
00465 bab_.haveAnswer_ = haveAnswer ;
00466 bab_.answerSolver_ = answerSolver ;
00467 }
00468
00474 void setBaBStatus(const CbcModel *model, BACWhere where,
00475 bool haveAnswer = false,
00476 OsiSolverInterface *answerSolver = 0) ;
00477
00482 BACMajor translateMajor(int status) ;
00483
00488 BACMinor translateMinor(int status) ;
00489
00495 BACMinor translateMinor(const OsiSolverInterface *osi) ;
00496
00499 void printBaBStatus() ;
00500
00502
00505
00510 CoinMessageHandler &message(CbcGenMsgCode inID) ;
00511
00517 void passInMessageHandler(CoinMessageHandler *handler) ;
00518
00520 inline CoinMessageHandler *messageHandler() const {
00521 return msgHandler_ ;
00522 }
00523
00536 void setMessages(CoinMessages::Language lang = CoinMessages::us_en) ;
00537
00539 inline void setLogLevel(int lvl) {
00540 logLvl_ = lvl ;
00541 if (msgHandler_) msgHandler_->setLogLevel(lvl) ;
00542 }
00543
00545 inline int logLevel() const {
00546 return (logLvl_) ;
00547 }
00548
00552 int printOpt_ ;
00553
00555
00560 std::string version_ ;
00561
00564 std::string dfltDirectory_ ;
00565
00568 std::string lastMpsIn_ ;
00569
00571 bool allowImportErrors_ ;
00572
00575 std::string lastSolnOut_ ;
00576
00583 int printMode_ ;
00584
00590 std::string printMask_ ;
00591
00594 CoinParamVec *paramVec_ ;
00595
00598 struct genParamsInfo_struct {
00599 int first_ ;
00600 int last_ ;
00601 } genParams_ ;
00602
00605 struct cbcParamsInfo_struct {
00606 int first_ ;
00607 int last_ ;
00608 } cbcParams_ ;
00609
00614 struct osiParamsInfo_struct {
00615 int first_ ;
00616 int last_ ;
00617 } osiParams_ ;
00618
00628 int verbose_ ;
00629
00632 int paramsProcessed_ ;
00633
00636 std::vector<bool> setByUser_ ;
00637
00644 bool defaultSettings_ ;
00645
00654 std::string debugCreate_ ;
00655
00662 std::string debugFile_ ;
00663
00669 struct debugSolInfo_struct {
00670 int numCols_ ;
00671 double *values_ ;
00672 } debugSol_ ;
00674
00675
00677
00680 double totalTime_ ;
00681
00683
00686
00697 CbcModel *model_ ;
00698
00705 OsiSolverInterface *dfltSolver_ ;
00706
00709 bool goodModel_ ;
00710
00718 struct babState_struct {
00719 BACMajor majorStatus_ ;
00720 BACMinor minorStatus_ ;
00721 BACWhere where_ ;
00722 bool haveAnswer_ ;
00723 OsiSolverInterface *answerSolver_ ;
00724 } bab_ ;
00725
00727
00730
00739 struct djFixCtl_struct {
00740 bool action_ ;
00741 double threshold_ ;
00742 } djFix_ ;
00743
00747 BPControl priorityAction_ ;
00748
00750
00757
00765 struct chooseStrongCtl_struct {
00766 int numBeforeTrust_ ;
00767 int numStrong_ ;
00768 int shadowPriceMode_ ;
00769 } chooseStrong_ ;
00771
00772 private:
00773
00778
00781 IPPControl preProcess_ ;
00782
00789 int cutDepth_ ;
00790
00792 struct probingCtl_struct {
00793 CGControl action_ ;
00794 CglProbing *proto_ ;
00795 bool usingObjective_ ;
00796 int maxPass_ ;
00797 int maxPassRoot_ ;
00798 int maxProbe_ ;
00799 int maxProbeRoot_ ;
00800 int maxLook_ ;
00801 int maxLookRoot_ ;
00802 int maxElements_ ;
00803 int rowCuts_ ;
00804 } probing_ ;
00805
00807 struct cliqueCtl_struct {
00808 CGControl action_ ;
00809 CglClique *proto_ ;
00810 bool starCliqueReport_ ;
00811 bool rowCliqueReport_ ;
00812 double minViolation_ ;
00813 } clique_ ;
00814
00816 struct flowCtl_struct {
00817 CGControl action_ ;
00818 CglFlowCover *proto_ ;
00819 } flow_ ;
00820
00822 struct gomoryCtl_struct {
00823 CGControl action_ ;
00824 CglGomory *proto_ ;
00825 int limit_ ;
00826 int limitAtRoot_ ;
00827 } gomory_ ;
00828
00829
00830
00831
00832
00833
00834
00835
00837 struct knapsackCtl_struct {
00838 CGControl action_ ;
00839 CglKnapsackCover *proto_ ;
00840 } knapsack_ ;
00841
00843 struct mirCtl_struct {
00844 CGControl action_ ;
00845 CglMixedIntegerRounding2 *proto_ ;
00846 } mir_ ;
00847
00849 struct oddHoleCtl_struct {
00850 CGControl action_ ;
00851 CglOddHole *proto_ ;
00852 } oddHole_ ;
00853
00857 struct redSplitCtl_struct {
00858 CGControl action_ ;
00859 CglRedSplit *proto_ ;
00860 } redSplit_ ;
00861
00863 struct twomirCtl_struct {
00864 CGControl action_ ;
00865 CglTwomir *proto_ ;
00866 int maxElements_ ;
00867 } twomir_ ;
00868
00870 struct fpumpCtl_struct {
00871 CGControl action_ ;
00872 CbcHeuristicFPump *proto_ ;
00873 int iters_ ;
00874 } fpump_ ;
00875
00877 struct combineCtl_struct {
00878 CGControl action_ ;
00879 CbcHeuristicLocal *proto_ ;
00880 int trySwap_ ;
00881 } combine_ ;
00882
00884 struct greedyCoverCtl_struct {
00885 CGControl action_ ;
00886 CbcHeuristicGreedyCover *proto_ ;
00887 } greedyCover_ ;
00888
00890 struct greedyEqualityCtl_struct {
00891 CGControl action_ ;
00892 CbcHeuristicGreedyEquality *proto_ ;
00893 } greedyEquality_ ;
00894
00896 struct roundingCtl_struct {
00897 CGControl action_ ;
00898 CbcRounding *proto_ ;
00899 } rounding_ ;
00900
00901
00908 struct localTreeCtl_struct {
00909 CGControl action_ ;
00910 CbcTreeLocal *proto_ ;
00911 double *soln_ ;
00912 int range_ ;
00913 int typeCuts_ ;
00914 int maxDiverge_ ;
00915 int timeLimit_ ;
00916 int nodeLimit_ ;
00917 bool refine_ ;
00918 } localTree_ ;
00919
00921
00927
00929 CoinMessageHandler *msgHandler_ ;
00930
00937 bool ourMsgHandler_ ;
00938
00940 CoinMessages::Language cur_lang_ ;
00941
00943 CoinMessages *msgs_ ;
00944
00946 int logLvl_ ;
00947
00949
00950 } ;
00951
00952
00953 #endif
00954