# CbcGenCtlBlk.hpp

Go to the documentation of this file.

    00001 /*
    00002   Copyright (C) 2007, Lou Hafer, International Business Machines Corporation
    00003   and others.  All Rights Reserved.
    00004
    00005   This code is licensed under the terms of the Eclipse Public License (EPL).
    00006
    00007   $Id: CbcGenCtlBlk.hpp 1902 2013-04-10 16:58:16Z stefan $
    00008 */
    00009 /*
    00010   This file is part of cbc-generic.
    00011 */
    00012
    00013 #ifndef CbcGenCtlBlk_H
    00014 #define CbcGenCtlBlk_H
    00015
    00016 /* \file CbcGenCtlBlk.hpp
    00017    \brief Declarations for parameters of the cbc-generic main program.
    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   It turns out that doxygen is not good with anonymous structures. Hence the
    00046   `struct nameCtl_struct' style used for structured fields in CbcGenCtlBlk.
    00047 */
    00048
    00049 /*
    00050   $Id: CbcGenCtlBlk.hpp 1902 2013-04-10 16:58:16Z stefan $
    00051 */
    00052
    00053 #define CBC_GENERIC_VERSION "00.01.00"
    00054
    00055 class CbcGenCtlBlk ;
    00056 namespace CbcGenParamUtils {
    00057 void addCbcGenParams(int &numParams, CoinParamVec &paramVec,
    00058                      CbcGenCtlBlk *ctlBlk) ;
    00059 }
    00060
    00061 /* \brief cbc-generic algorithm control class
    00062
    00063   This class defines values and methods used to control the operation of the
    00064   cbc-generic main program.
    00065 */
    00066
    00067 class CbcGenCtlBlk {
    00068
    00069     friend void CbcGenParamUtils::addCbcGenParams(int &numParams,
    00070             CoinParamVec &paramVec, CbcGenCtlBlk *ctlBlk) ;
    00071
    00072 public:
    00073
    00076
    00077     /*
    00078       In order for initialisation to work properly, the order of declaration of
    00079       the enum constants here must match the order of keyword declaration for
    00080       the PREPROCESS parameter in CbcGenParamUtils::addCbcGenParams
    00081     */
    00099     typedef enum { IPPOff = 0, IPPOn, IPPSave, IPPEqual,
    00100                    IPPSOS, IPPTrySOS, IPPEqualAll, IPPStrategy
    00101                  } IPPControl ;
    00102
    00103     /*
    00104       In order for initialisation to work properly, the order of declaration of
    00105       the enum constants here must match the order of keyword declaration for
    00106       the various cut and heuristic control parameters in
    00107       CbcGenParamUtils::addCbcGenParams
    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     /*1 \brief Get action state for use of integer preprocessing */
    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     /*  \brief Obtain a prototype for a lift-and-project cut generator.
    00312
    00313       CGControl getLandP(CglCutGenerator *&gen) ;
    00314
    00315        \brief Set action state for use of lift-and-project cut generator.
    00316
    00317       inline void setLandPAction(CGControl action)
    00318       { landp_.action_ = action ; }
    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     /* \name Timing */
    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     /*   \brief Control variable and prototype for lift-and-project cut
    00830              generator
    00831        struct landpCtl_struct
    00832        { CGControl action_ ;
    00833          CglLandP *proto_ ; } landp_ ;
    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

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines