Bonmin  1.7
BonOsiTMINLPInterface.hpp
Go to the documentation of this file.
00001 // (C) Copyright International Business Machines Corporation, Carnegie Mellon University 2004, 2007
00002 // All Rights Reserved.
00003 // This code is published under the Common Public License.
00004 //
00005 // Authors :
00006 // Pierre Bonami, Carnegie Mellon University,
00007 // Carl D. Laird, Carnegie Mellon University,
00008 // Andreas Waechter, International Business Machines Corporation
00009 //
00010 // Date : 12/01/2004
00011 
00012 
00013 #ifndef OsiTMINLPInterface_H
00014 #define OsiTMINLPInterface_H
00015 
00016 #define INT_BIAS 0e-8
00017 
00018 #include <string>
00019 #include <iostream>
00020 
00021 #include "OsiSolverInterface.hpp"
00022 #include "CoinWarmStartBasis.hpp"
00023 
00024 #include "BonCutStrengthener.hpp"
00025 //#include "BonRegisteredOptions.hpp"
00026 
00027 namespace Bonmin {
00028   class TMINLP;
00029   class TMINLP2TNLP;
00030   class TMINLP2OsiLP;
00031   class TNLP2FPNLP;
00032   class TNLPSolver;
00033   class RegisteredOptions;
00034   class StrongBranchingSolver;
00035 
00037   enum Solver{
00038     EIpopt=0 ,
00039     EFilterSQP ,
00040     EAll
00041   };
00048 class OsiTMINLPInterface : public OsiSolverInterface
00049 {
00050   friend class BonminParam;
00051 
00052 public:
00053 
00054   //#############################################################################
00055 
00060 class SimpleError : public CoinError
00061   {
00062   private:
00063     SimpleError();
00064 
00065   public:
00067     SimpleError(std::string message,
00068         std::string methodName,
00069         std::string f = std::string(),
00070         int l = -1)
00071         :
00072         CoinError(message,methodName,std::string("OsiTMINLPInterface"), f, l)
00073     {}
00074   }
00075   ;
00076 
00077 #ifdef __LINE__
00078 #define SimpleError(x, y) SimpleError((x), (y), __FILE__, __LINE__)
00079 #endif
00080 
00081   // Error when problem is not solved
00082   TNLPSolver::UnsolvedError * newUnsolvedError(int num, Ipopt::SmartPtr<TMINLP2TNLP> problem, std::string name){
00083     return app_->newUnsolvedError(num, problem, name);
00084   }
00085   //#############################################################################
00086 
00087   enum WarmStartModes{
00088    None,
00089    FakeBasis,
00090    Optimum,
00091    InteriorPoint};
00092 
00094   enum MessagesTypes{
00095     SOLUTION_FOUND,
00096     INFEASIBLE_SOLUTION_FOUND,
00097     UNSOLVED_PROBLEM_FOUND,
00098     WARNING_RESOLVING ,
00099     WARN_SUCCESS_WS,
00100     WARN_SUCCESS_RANDOM,
00101     WARN_CONTINUING_ON_FAILURE,
00102     SUSPECT_PROBLEM,
00103     SUSPECT_PROBLEM2,
00104     IPOPT_SUMMARY ,
00105     BETTER_SOL ,
00106     LOG_HEAD,
00107     LOG_FIRST_LINE,
00108     LOG_LINE,
00109     ALTERNATE_OBJECTIVE,
00110     WARN_RESOLVE_BEFORE_INITIAL_SOLVE ,
00113     ERROR_NO_TNLPSOLVER ,
00114     WARNING_NON_CONVEX_OA ,
00115     SOLVER_DISAGREE_STATUS ,
00116     SOLVER_DISAGREE_VALUE ,
00117     OSITMINLPINTERFACE_DUMMY_END
00118   };
00119 
00120   //#############################################################################
00121 
00122 
00124 class Messages : public CoinMessages
00125   {
00126   public:
00128     Messages();
00129   };
00130 
00131 
00132   //#############################################################################
00133 
00134 
00137 
00138   OsiTMINLPInterface();
00139 
00141   void initialize(Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions,
00142                   Ipopt::SmartPtr<Ipopt::OptionsList> options,
00143                   Ipopt::SmartPtr<Ipopt::Journalist> journalist,
00144                   const std::string & prefix,
00145                   Ipopt::SmartPtr<TMINLP> tminlp);
00146 
00148   void initialize(Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions,
00149                   Ipopt::SmartPtr<Ipopt::OptionsList> options,
00150                   Ipopt::SmartPtr<Ipopt::Journalist> journalist,
00151                   Ipopt::SmartPtr<TMINLP> tminlp){
00152      initialize(roptions, options, journalist, "bonmin.", tminlp);
00153   }
00154 
00156   void setModel(Ipopt::SmartPtr<TMINLP> tminlp);
00158   void setSolver(Ipopt::SmartPtr<TNLPSolver> app);
00160   void use(Ipopt::SmartPtr<TMINLP2TNLP> tminlp2tnlp);
00163   OsiTMINLPInterface (const OsiTMINLPInterface &);
00164 
00166   OsiSolverInterface * clone(bool copyData = true) const;
00167 
00169   OsiTMINLPInterface & operator=(const OsiTMINLPInterface& rhs);
00170 
00172   virtual ~OsiTMINLPInterface ();
00173 
00174 
00176   void readOptionFile(const std::string & fileName);
00177 
00179   const Ipopt::SmartPtr<Ipopt::OptionsList> options() const;
00181   Ipopt::SmartPtr<Ipopt::OptionsList> options();
00182 
00183   const char * prefix() const{
00184   if(!IsValid(app_)) {
00185     messageHandler()->message(ERROR_NO_TNLPSOLVER, messages_)<<CoinMessageEol;
00186     return NULL;
00187   }
00188   else
00189     return app_->prefix();
00190   }
00192   //---------------------------------------------------------------------------
00195 
00196   virtual void initialSolve();
00197 
00199   virtual void initialSolve(const char * whereFrom);
00200 
00206   virtual void resolve();
00207 
00213   virtual void resolve(const char * whereFrom);
00214 
00217   virtual void resolveForCost(int numretry, bool keepWs);
00218 
00222   virtual void resolveForRobustness(int numretry);
00223 
00225   virtual void branchAndBound()
00226   {
00227     throw SimpleError("Function not implemented for OsiTMINLPInterface","branchAndBound()");
00228   }
00230 
00231 
00232 
00233   //---------------------------------------------------------------------------
00235 
00236 
00237   virtual bool isAbandoned() const;
00239   virtual bool isProvenOptimal() const;
00241   virtual bool isProvenPrimalInfeasible() const;
00243   virtual bool isProvenDualInfeasible() const;
00245   virtual bool isPrimalObjectiveLimitReached() const;
00247   virtual bool isDualObjectiveLimitReached() const;
00249   virtual bool isIterationLimitReached() const;
00250 
00252   void continuingOnAFailure()
00253   {
00254     hasContinuedAfterNlpFailure_ = true;
00255   }
00256 
00257 
00258   //Added by Claudia
00259   
00260   double getNewCutoffDecr()
00261   {
00262     return newCutoffDecr;
00263   }
00264 
00265   void setNewCutoffDecr(double d)
00266   {
00267     newCutoffDecr = d;
00268   }
00269 
00270 
00272   bool hasContinuedOnAFailure()
00273   {
00274     return hasContinuedAfterNlpFailure_;
00275   }
00277   void ignoreFailures()
00278   {
00279     pretendFailIsInfeasible_ = 2;
00280   }
00282   void forceInfeasible()
00283   {
00284     problem_->set_obj_value(1e200);
00285   }
00287   void forceBranchable()
00288   {
00289     problem_->set_obj_value(-1e200);
00290     problem_->force_fractionnal_sol();
00291   }
00293 
00294 
00295   //---------------------------------------------------------------------------
00311   // Set an integer parameter
00312   bool setIntParam(OsiIntParam key, int value);
00313   // Set an double parameter
00314   bool setDblParam(OsiDblParam key, double value);
00315   // Set a string parameter
00316   bool setStrParam(OsiStrParam key, const std::string & value);
00317   // Get an integer parameter
00318   bool getIntParam(OsiIntParam key, int& value) const;
00319   // Get an double parameter
00320   bool getDblParam(OsiDblParam key, double& value) const;
00321   // Get a string parameter
00322   bool getStrParam(OsiStrParam key, std::string& value) const;
00323 
00324   // Get the push values for starting point
00325   inline double getPushFact() const
00326   {
00327     return pushValue_;
00328   }
00329 
00331 
00332 
00333   //---------------------------------------------------------------------------
00346 
00347   virtual int getNumCols() const;
00348 
00350   virtual int getNumRows() const;
00351 
00353   const OsiSolverInterface::OsiNameVec& getVarNames() ;
00355   virtual const double * getColLower() const;
00356 
00358   virtual const double * getColUpper() const;
00359 
00369   virtual const char * getRowSense() const;
00370 
00379   virtual const double * getRightHandSide() const;
00380 
00389   virtual const double * getRowRange() const;
00390 
00392   virtual const double * getRowLower() const;
00393 
00395   virtual const double * getRowUpper() const;
00396 
00399   virtual double getObjSense() const
00400   {
00401     return 1;
00402   }
00403 
00405   virtual bool isContinuous(int colNumber) const;
00406 
00408   virtual bool isBinary(int columnNumber) const;
00409 
00414   virtual bool isInteger(int columnNumber) const;
00415 
00417   virtual bool isIntegerNonBinary(int columnNumber) const;
00418 
00420   virtual bool isFreeBinary(int columnNumber) const;
00421 
00423   virtual double getInfinity() const;
00424 
00426   const int * getPriorities() const
00427   {
00428     const TMINLP::BranchingInfo * branch = tminlp_->branchingInfo();
00429     if(branch)
00430       return branch->priorities;
00431     else return NULL;
00432   }
00434   const int * getBranchingDirections() const
00435   {
00436     const TMINLP::BranchingInfo * branch = tminlp_->branchingInfo();
00437     if(branch)
00438       return branch->branchingDirections;
00439     else return NULL;
00440   }
00441   const double * getUpPsCosts() const
00442   {
00443     const TMINLP::BranchingInfo * branch = tminlp_->branchingInfo();
00444     if(branch)
00445     return branch->upPsCosts;
00446     else return NULL;
00447   }
00448   const double * getDownPsCosts() const
00449   {
00450     const TMINLP::BranchingInfo * branch = tminlp_->branchingInfo();
00451     if(branch)
00452     return branch->downPsCosts;
00453     else return NULL;
00454   }
00455 
00456 
00458 
00461 
00462   virtual const double * getColSolution() const;
00463 
00465   virtual const double * getRowPrice() const;
00466 
00468   virtual const double * getReducedCost() const;
00469 
00472   virtual const double * getRowActivity() const;
00473 
00474 
00479   virtual int getIterationCount() const;
00480 
00482   int nCallOptimizeTNLP()
00483   {
00484     return nCallOptimizeTNLP_;
00485   }
00487   double totalNlpSolveTime()
00488   {
00489     return totalNlpSolveTime_;
00490   }
00492   int totalIterations()
00493   {
00494     return totalIterations_;
00495   }
00496 
00497 
00499   //-------------------------------------------------------------------------
00503 
00506   virtual void setColLower( int elementIndex, double elementValue );
00507 
00510   virtual void setColUpper( int elementIndex, double elementValue );
00511 
00515   virtual void setColLower(const double * array);
00516 
00520   virtual void setColUpper(const double * array);
00521 
00522 
00525   virtual void setRowLower( int elementIndex, double elementValue );
00526 
00529   virtual void setRowUpper( int elementIndex, double elementValue );
00530 
00532   virtual void setRowType(int index, char sense, double rightHandSide,
00533       double range);
00534 
00535 
00540   virtual void setObjSense(double s);
00541 
00546   virtual void setColSolution(const double *colsol);
00547 
00552   virtual void setRowPrice(const double * rowprice);
00553 
00555 
00556 
00557   //---------------------------------------------------------------------------
00560 
00567   virtual CoinWarmStart *getEmptyWarmStart () const;
00568 
00570   virtual CoinWarmStart* getWarmStart() const;
00571 
00574   virtual bool setWarmStart(const CoinWarmStart* warmstart);
00575 
00576   void setWarmStartMode(int mode) {
00577     warmStartMode_ = (WarmStartModes) mode;
00578   }
00579   WarmStartModes getWarmStartMode() {
00580     return warmStartMode_;
00581   }
00582 
00583   void randomStartingPoint();
00584 
00585   //Returns true if a basis is available
00586   virtual bool basisIsAvailable() const
00587   {
00588     // Throw an exception
00589     throw SimpleError("Needs coding for this interface", "basisIsAvailable");
00590   }
00591 
00592 
00594 
00595   //-------------------------------------------------------------------------
00599   virtual void setContinuous(int index);
00601   virtual void setInteger(int index);
00603 
00604   //Set numIterationSuspect_
00605   void setNumIterationSuspect(int value)
00606   {
00607     numIterationSuspect_ = value;
00608   }
00609 
00615 
00618   virtual int getNumElements() const
00619   {
00620     return -1;
00621   }
00622 
00623 
00628   virtual const double * getObjCoefficients() const;
00629 
00632   virtual const CoinPackedMatrix * getMatrixByRow() const
00633   {
00634       return NULL;
00635   }
00636 
00637 
00640   virtual const CoinPackedMatrix * getMatrixByCol() const
00641   {
00642       return NULL;
00643   }
00644 
00647   virtual void setObjCoeff( int elementIndex, double elementValue )
00648   {
00649     throw SimpleError("OsiTMINLPInterface does not implement this function.",
00650         "setObjCoeff");
00651   }
00652 
00655   virtual void addCol(const CoinPackedVectorBase& vec,
00656       const double collb, const double colub,
00657       const double obj)
00658   {
00659     throw SimpleError("OsiTMINLPInterface does not implement this function.",
00660         "addCol");
00661   }
00664   virtual void deleteCols(const int num, const int * colIndices)
00665   {
00666     throw SimpleError("OsiTMINLPInterface does not implement this function.",
00667         "deleteCols");
00668   }
00669 
00672   virtual void addRow(const CoinPackedVectorBase& vec,
00673       const double rowlb, const double rowub)
00674   {
00675     throw SimpleError("OsiTMINLPInterface does not implement this function.",
00676         "addRow");
00677   }
00680   virtual void addRow(const CoinPackedVectorBase& vec,
00681       const char rowsen, const double rowrhs,
00682       const double rowrng)
00683   {
00684     throw SimpleError("OsiTMINLPInterface model does not implement this function.",
00685         "addRow");
00686   }
00689   virtual void deleteRows(const int num, const int * rowIndices)
00690   {
00691     if(num)
00692       freeCachedRowRim();
00693      problem_->removeCuts(num, rowIndices);
00694   }
00695 
00696 
00699   virtual void loadProblem(const CoinPackedMatrix& matrix,
00700       const double* collb, const double* colub,
00701       const double* obj,
00702       const double* rowlb, const double* rowub)
00703   {
00704     throw SimpleError("OsiTMINLPInterface does not implement this function.",
00705         "loadProblem");
00706   }
00707 
00708 
00711   virtual void assignProblem(CoinPackedMatrix*& matrix,
00712       double*& collb, double*& colub, double*& obj,
00713       double*& rowlb, double*& rowub)
00714   {
00715     throw SimpleError("OsiTMINLPInterface does not implement this function.",
00716         "assignProblem");
00717   }
00718 
00721   virtual void loadProblem(const CoinPackedMatrix& matrix,
00722       const double* collb, const double* colub,
00723       const double* obj,
00724       const char* rowsen, const double* rowrhs,
00725       const double* rowrng)
00726   {
00727     throw SimpleError("OsiTMINLPInterface does not implement this function.",
00728         "loadProblem");
00729   }
00730 
00733   virtual void assignProblem(CoinPackedMatrix*& matrix,
00734       double*& collb, double*& colub, double*& obj,
00735       char*& rowsen, double*& rowrhs,
00736       double*& rowrng)
00737   {
00738     throw SimpleError("OsiTMINLPInterface does not implement this function.",
00739         "assignProblem");
00740   }
00741 
00742 
00745   virtual void loadProblem(const int numcols, const int numrows,
00746       const int* start, const int* index,
00747       const double* value,
00748       const double* collb, const double* colub,
00749       const double* obj,
00750       const double* rowlb, const double* rowub)
00751   {
00752     throw SimpleError("OsiTMINLPInterface does not implement this function.",
00753         "loadProblem");
00754   }
00755 
00758   virtual void loadProblem(const int numcols, const int numrows,
00759       const int* start, const int* index,
00760       const double* value,
00761       const double* collb, const double* colub,
00762       const double* obj,
00763       const char* rowsen, const double* rowrhs,
00764       const double* rowrng)
00765   {
00766     throw SimpleError("OsiTMINLPInterface model does not implement this function.",
00767         "loadProblem");
00768   }
00769 
00772   virtual int readMps(const char *filename,
00773       const char *extension = "mps")
00774   {
00775     throw SimpleError("OsiTMINLPInterface does not implement this function.",
00776         "readMps");
00777   }
00778 
00779 
00782   virtual void writeMps(const char *filename,
00783       const char *extension = "mps",
00784       double objSense=0.0) const
00785   {
00786     throw SimpleError("OsiTMINLPInterface does not implement this function.",
00787         "writeMps");
00788   }
00789 
00791   virtual std::vector<double*> getDualRays(int maxNumRays, bool fullRay = false) const
00792   {
00793     throw SimpleError("OsiTMINLPInterface does not implement this function.",
00794         "getDualRays");
00795   }
00796 
00798   virtual std::vector<double*> getPrimalRays(int maxNumRays) const
00799   {
00800     throw SimpleError("OsiTMINLPInterface does not implement this function.",
00801         "getPrimalRays");
00802   }
00803 
00805 
00806 
00807   
00808   //---------------------------------------------------------------------------
00809 
00810 
00811 
00815   void setSolverOutputToDefault(){
00816   app_->setOutputToDefault();}
00817   void forceSolverOutput(int log_level){
00818   app_->forceSolverOutput(log_level);}
00820 
00823 
00824   virtual double getObjValue() const;
00825 
00827 
00829   const TMINLP2TNLP * problem() const
00830   {
00831     return GetRawPtr(problem_);
00832   }
00833 
00834   TMINLP2TNLP * problem()
00835   {
00836     return GetRawPtr(problem_);
00837   }
00838 
00839   const TMINLP * model() const
00840   {
00841     return GetRawPtr(tminlp_);
00842   }
00843   
00844   Bonmin::TMINLP * model()
00845   {
00846     return GetRawPtr(tminlp_);
00847   }
00848   
00849   const Bonmin::TNLPSolver * solver() const
00850   {
00851     return GetRawPtr(app_);
00852   } 
00853  
00854   const std::list<Ipopt::SmartPtr<TNLPSolver> >& debug_apps() const{
00855     return debug_apps_;
00856   }
00857 
00858   TNLPSolver * solver()
00859   {
00860     return GetRawPtr(app_);
00861   } 
00870   virtual void extractLinearRelaxation(OsiSolverInterface &si, const double *x, 
00871                                        bool getObj = 1);
00872 
00874   virtual void addObjectiveFunction(OsiSolverInterface &si, const double * x);
00875 #if 1
00876 
00880   virtual void extractLinearRelaxation(OsiSolverInterface &si, bool getObj = 1,
00881                                        bool solveNlp = 1){
00882      if(solveNlp)
00883        initialSolve("build initial OA");
00884      extractLinearRelaxation(si, getColSolution(), getObj); 
00885      if(solveNlp){
00886         app_->enableWarmStart();
00887         setColSolution(problem()->x_sol());
00888         setRowPrice(problem()->duals_sol());
00889      }
00890    }
00891 #endif
00892 
00895   void getOuterApproximation(OsiCuts &cs, int getObj, const double * x2, bool global)
00896 {
00897   getOuterApproximation(cs, getColSolution(), getObj, x2, global);
00898 }
00899 
00903   void getOuterApproximation(OsiCuts &cs, const double * x, int getObj, const double * x2, bool global){
00904     getOuterApproximation(cs, x, getObj, x2, 0., global);}
00905 
00909   virtual void getOuterApproximation(OsiCuts &cs, const double * x, int getObj, const double * x2,
00910                                      double theta, bool global);
00911 
00913   virtual void getConstraintOuterApproximation(OsiCuts & cs, int constraintNumber,
00914                                                const double * x, 
00915                                                const double * x2, bool global);
00916 
00918   void getConstraintOuterApproximation(OsiCuts & cs, int constraintNumber,
00919                                        const double * x2, bool global){
00920      getConstraintOuterApproximation(cs, constraintNumber, getColSolution(),x2,global);
00921   }
00922 
00923 
00925 void getBendersCut(OsiCuts &cs, bool global);
00926 
00936   double solveFeasibilityProblem(size_t n, const double * x_bar, const int* ind, double a, double s, int L);
00937 
00946   double solveFeasibilityProblem(size_t n, const double * x_bar, const int* ind, int L, double cutoff);
00947 
00950   void switchToFeasibilityProblem(size_t n, const double * x_bar, const int* ind, double a, double s, int L);
00951 
00954   void switchToFeasibilityProblem(size_t n, const double * x_bar, const int* ind,
00955                                   double rhs_local_branching_constraint);
00956 
00958   void switchToOriginalProblem();
00959   
00961   void round_and_check(double tolerance,
00962                        OsiObject ** objects = 0, int nObjects = -1){
00963     if(!problem_->check_solution(objects, nObjects)){
00964       optimizationStatus_ = TNLPSolver::provenInfeasible;
00965     }
00966   }
00968 
00973   enum OaMessagesTypes {
00974     CUT_NOT_VIOLATED_ENOUGH = 0,
00975     VIOLATED_OA_CUT_GENERATED,
00976     OA_CUT_GENERATED,
00977     OA_MESSAGES_DUMMY_END};
00979   class OaMessages :public CoinMessages{
00980      public:
00982      OaMessages();
00983   };
00985   class OaMessageHandler : public CoinMessageHandler{
00986     public:
00988     OaMessageHandler():CoinMessageHandler(){
00989     }
00991     OaMessageHandler(FILE * fp):CoinMessageHandler(fp){
00992     }
00994     virtual ~OaMessageHandler(){
00995     }
00997     OaMessageHandler(const OaMessageHandler &other):
00998     CoinMessageHandler(other){}
01000     OaMessageHandler(const CoinMessageHandler &other):
01001     CoinMessageHandler(other){}
01003     OaMessageHandler & operator=(const OaMessageHandler &rhs){
01004        CoinMessageHandler::operator=(rhs);
01005        return *this;}
01007     virtual CoinMessageHandler* clone() const{
01008       return new OaMessageHandler(*this);}
01010     void print(OsiRowCut &row);
01011   };
01012   void setOaMessageHandler(const CoinMessageHandler &handler){
01013     delete oaHandler_;
01014     oaHandler_ = new OaMessageHandler(handler);
01015   }
01017 
01018     //-----------------------------------------------------------------------
01021     virtual ApplyCutsReturnCode applyCuts(const OsiCuts & cs,
01022                                           double effectivenessLb = 0.0){
01023        freeCachedRowRim();
01024       problem_->addCuts(cs);
01025       ApplyCutsReturnCode rc;
01026       return rc;}
01027 
01029   virtual void applyRowCuts(int numberCuts, const OsiRowCut * cuts);
01030 
01031 
01033   virtual void applyRowCuts(int numberCuts, const OsiRowCut ** cuts)
01034   {
01035     if(numberCuts)
01036       freeCachedRowRim();
01037     problem_->addCuts(numberCuts, cuts);
01038   }
01039 
01042  double getConstraintsViolation(const double * x, double & obj);
01043 
01046   double getNonLinearitiesViolation(const double *x, const double obj);
01047 
01048 //---------------------------------------------------------------------------
01049 
01050   void extractInterfaceParams();
01051 
01052 
01054   virtual void setAppDefaultOptions(Ipopt::SmartPtr<Ipopt::OptionsList> Options);
01055 
01057   static void registerOptions (Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions);
01058   
01059   Ipopt::SmartPtr<Bonmin::RegisteredOptions> regOptions(){
01060     if(IsValid(app_))
01061       return app_->roptions();
01062     else
01063       return NULL;
01064   }
01065 
01068 
01069   void SetStrongBrachingSolver(Ipopt::SmartPtr<StrongBranchingSolver> strong_branching_solver);
01072   virtual void markHotStart();
01076   virtual void solveFromHotStart();
01079   virtual void unmarkHotStart();
01081 
01083   void get_tolerances(double &tiny, double&very_tiny, double &rhsRelax, double &infty){
01084     tiny = tiny_;
01085     very_tiny = veryTiny_;
01086     rhsRelax = rhsRelax_;
01087     infty = infty_;
01088   }
01089 
01090   void set_linearizer(Ipopt::SmartPtr<TMINLP2OsiLP> linearizer);
01091 
01092   Ipopt::SmartPtr<TMINLP2OsiLP> linearizer();
01093 protected:
01094   
01096 
01097   enum RandomGenerationType{
01098     uniform =0, perturb=1, perturb_suffix=2};
01100   int initializeJacobianArrays();
01101 
01103 
01104   virtual std::string  appName()
01105   {
01106     return "bonmin";
01107   }
01109 
01110 
01111 
01113   void solveAndCheckErrors(bool doResolve, bool throwOnFailure,
01114       const char * whereFrom);
01115 
01116 
01119   virtual void applyRowCut( const OsiRowCut & rc )
01120   {
01121     const OsiRowCut * cut = &rc;
01122     problem_->addCuts(1, &cut);
01123   }
01126   virtual void applyColCut( const OsiColCut & cc )
01127   {
01128     throw SimpleError("Ipopt model does not implement this function.",
01129         "applyColCut");
01130   }
01131 
01132 //  /** Read the name of the variables in an ampl .col file. */
01133 //  void readVarNames() const;
01134 
01136 
01140   Ipopt::SmartPtr<TMINLP> tminlp_;
01142   Ipopt::SmartPtr<TMINLP2TNLP> problem_;
01144   Ipopt::SmartPtr<Ipopt::TNLP> problem_to_optimize_;
01146   bool feasibility_mode_;
01148   Ipopt::SmartPtr<TNLPSolver> app_;
01149 
01151   std::list<Ipopt::SmartPtr<TNLPSolver> > debug_apps_;
01153   bool testOthers_;
01155 
01157   CoinWarmStart* warmstart_;
01158 
01162   void freeCachedColRim();
01164   void freeCachedRowRim();
01166   void freeCachedData();
01169   void extractSenseRhsAndRange() const;
01171   mutable char    *rowsense_;
01172 
01174   mutable double  *rhs_;
01175 
01177   mutable double  *rowrange_;
01180   mutable double  *reducedCosts_;
01182   double OsiDualObjectiveLimit_;
01184   mutable bool hasVarNamesFile_;
01186 
01187   int nCallOptimizeTNLP_;
01189   double totalNlpSolveTime_;
01191   int totalIterations_;
01193   double maxRandomRadius_;
01195   int randomGenerationType_;
01197   double max_perturbation_;
01199   double pushValue_;
01201   int numRetryInitial_;
01203   int numRetryResolve_;
01205   int numRetryInfeasibles_;
01207   int numRetryUnsolved_;
01209   double infeasibility_epsilon_;
01210 
01211 
01212   //Added by Claudia
01214   int dynamicCutOff_;
01216   double coeff_var_threshold_;
01218   double first_perc_for_cutoff_decr_;
01220   double second_perc_for_cutoff_decr_;
01221  
01222 
01224   Messages messages_;
01228   int pretendFailIsInfeasible_;
01229 
01230   mutable int pretendSucceededNext_;
01231 
01233   bool hasContinuedAfterNlpFailure_;
01236   int numIterationSuspect_ ;
01240   bool hasBeenOptimized_;
01244   mutable double * obj_;
01246   static bool hasPrintedOptions;
01247 
01249   Ipopt::SmartPtr<TNLP2FPNLP> feasibilityProblem_;
01250 
01252   Ipopt::SmartPtr<TMINLP2OsiLP> linearizer_;
01253 
01257   int * jRow_;
01259   int * jCol_;
01261   double * jValues_;
01263   int nnz_jac;
01265 
01267   Ipopt::TNLP::LinearityType * constTypes_;
01270   int nNonLinear_;
01272   double tiny_;
01274   double veryTiny_;
01276   double rhsRelax_;
01278   double infty_;
01280   TNLPSolver::ReturnStatus optimizationStatus_;
01282   WarmStartModes warmStartMode_;
01284   bool firstSolve_;
01286   Ipopt::SmartPtr<CutStrengthener> cutStrengthener_;
01287 
01292   OaMessages oaMessages_;
01294   OaMessageHandler * oaHandler_;
01296 
01297   double newCutoffDecr;
01298 protected:
01300   void createApplication(Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions,
01301                          Ipopt::SmartPtr<Ipopt::OptionsList> options,
01302                          Ipopt::SmartPtr<Ipopt::Journalist> journalist,
01303                          const std::string & prefix);
01305   OsiTMINLPInterface(Ipopt::SmartPtr<TNLPSolver> app);
01306 
01308   bool internal_setWarmStart(const CoinWarmStart* ws);
01309 
01311   CoinWarmStart* internal_getWarmStart() const; 
01312 
01314   CoinWarmStart* build_fake_basis() const; 
01315 private:
01316 
01318   Ipopt::SmartPtr<StrongBranchingSolver> strong_branching_solver_;
01320   TNLPSolver::ReturnStatus optimizationStatusBeforeHotStart_;
01321 static const char * OPT_SYMB;
01322 static const char * FAILED_SYMB;
01323 static const char * INFEAS_SYMB;
01324 static const char * TIME_SYMB;
01325 static const char * UNBOUND_SYMB;
01327   const char * statusAsString(TNLPSolver::ReturnStatus r){
01328     if(r == TNLPSolver::solvedOptimal || r == TNLPSolver::solvedOptimalTol){
01329       return OPT_SYMB;} 
01330     else if(r == TNLPSolver::provenInfeasible){
01331       return INFEAS_SYMB;}
01332     else if(r == TNLPSolver::unbounded){
01333       return UNBOUND_SYMB;}
01334     else if(r == TNLPSolver::timeLimit){
01335       return TIME_SYMB;}
01336     else return FAILED_SYMB;
01337   }
01338   const char * statusAsString(){
01339     return statusAsString(optimizationStatus_);}
01340 };
01341 }
01342 #endif