summaryrefslogtreecommitdiff
path: root/build/Bonmin/include/coin/OsiClpSolverInterface.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'build/Bonmin/include/coin/OsiClpSolverInterface.hpp')
-rw-r--r--build/Bonmin/include/coin/OsiClpSolverInterface.hpp1509
1 files changed, 0 insertions, 1509 deletions
diff --git a/build/Bonmin/include/coin/OsiClpSolverInterface.hpp b/build/Bonmin/include/coin/OsiClpSolverInterface.hpp
deleted file mode 100644
index ebc7e64..0000000
--- a/build/Bonmin/include/coin/OsiClpSolverInterface.hpp
+++ /dev/null
@@ -1,1509 +0,0 @@
-// $Id$
-// Copyright (C) 2000, International Business Machines
-// Corporation and others. All Rights Reserved.
-// This code is licensed under the terms of the Eclipse Public License (EPL).
-
-
-#ifndef OsiClpSolverInterface_H
-#define OsiClpSolverInterface_H
-
-#include <string>
-#include <cfloat>
-#include <map>
-
-#include "ClpSimplex.hpp"
-#include "ClpLinearObjective.hpp"
-#include "CoinPackedMatrix.hpp"
-#include "OsiSolverInterface.hpp"
-#include "CoinWarmStartBasis.hpp"
-#include "ClpEventHandler.hpp"
-#include "ClpNode.hpp"
-#include "CoinIndexedVector.hpp"
-#include "CoinFinite.hpp"
-
-class OsiRowCut;
-class OsiClpUserSolver;
-class OsiClpDisasterHandler;
-class CoinSet;
-static const double OsiClpInfinity = COIN_DBL_MAX;
-
-//#############################################################################
-
-/** Clp Solver Interface
-
-Instantiation of OsiClpSolverInterface for the Model Algorithm.
-
-*/
-
-class OsiClpSolverInterface :
- virtual public OsiSolverInterface {
- friend void OsiClpSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
-
-public:
- //---------------------------------------------------------------------------
- /**@name Solve methods */
- //@{
- /// Solve initial LP relaxation
- virtual void initialSolve();
-
- /// Resolve an LP relaxation after problem modification
- virtual void resolve();
-
- /// Resolve an LP relaxation after problem modification (try GUB)
- virtual void resolveGub(int needed);
-
- /// Invoke solver's built-in enumeration algorithm
- virtual void branchAndBound();
-
- /** Solve when primal column and dual row solutions are near-optimal
- options - 0 no presolve (use primal and dual)
- 1 presolve (just use primal)
- 2 no presolve (just use primal)
- basis - 0 use all slack basis
- 1 try and put some in basis
- */
- void crossover(int options,int basis);
- //@}
-
- /*! @name OsiSimplexInterface methods
- \brief Methods for the Osi Simplex API.
-
- The current implementation should work for both minimisation and
- maximisation in mode 1 (tableau access). In mode 2 (single pivot), only
- minimisation is supported as of 100907.
- */
- //@{
- /** \brief Simplex API capability.
-
- Returns
- - 0 if no simplex API
- - 1 if can just do getBInv etc
- - 2 if has all OsiSimplex methods
- */
- virtual int canDoSimplexInterface() const;
-
- /*! \brief Enables simplex mode 1 (tableau access)
-
- Tells solver that calls to getBInv etc are about to take place.
- Underlying code may need mutable as this may be called from
- CglCut::generateCuts which is const. If that is too horrific then
- each solver e.g. BCP or CBC will have to do something outside
- main loop.
- */
- virtual void enableFactorization() const;
-
- /*! \brief Undo any setting changes made by #enableFactorization */
- virtual void disableFactorization() const;
-
- /** Returns true if a basis is available
- AND problem is optimal. This should be used to see if
- the BInvARow type operations are possible and meaningful.
- */
- virtual bool basisIsAvailable() const;
-
- /** The following two methods may be replaced by the
- methods of OsiSolverInterface using OsiWarmStartBasis if:
- 1. OsiWarmStartBasis resize operation is implemented
- more efficiently and
- 2. It is ensured that effects on the solver are the same
-
- Returns a basis status of the structural/artificial variables
- At present as warm start i.e 0 free, 1 basic, 2 upper, 3 lower
-
- NOTE artificials are treated as +1 elements so for <= rhs
- artificial will be at lower bound if constraint is tight
-
- This means that Clpsimplex flips artificials as it works
- in terms of row activities
- */
- virtual void getBasisStatus(int* cstat, int* rstat) const;
-
- /** Set the status of structural/artificial variables and
- factorize, update solution etc
-
- NOTE artificials are treated as +1 elements so for <= rhs
- artificial will be at lower bound if constraint is tight
-
- This means that Clpsimplex flips artificials as it works
- in terms of row activities
- Returns 0 if OK, 1 if problem is bad e.g. duplicate elements, too large ...
- */
- virtual int setBasisStatus(const int* cstat, const int* rstat);
-
- ///Get the reduced gradient for the cost vector c
- virtual void getReducedGradient(double* columnReducedCosts,
- double * duals,
- const double * c) const ;
-
- ///Get a row of the tableau (slack part in slack if not NULL)
- virtual void getBInvARow(int row, double* z, double * slack=NULL) const;
-
- /** Get a row of the tableau (slack part in slack if not NULL)
- If keepScaled is true then scale factors not applied after so
- user has to use coding similar to what is in this method
- */
- virtual void getBInvARow(int row, CoinIndexedVector * z, CoinIndexedVector * slack=NULL,
- bool keepScaled=false) const;
-
- ///Get a row of the basis inverse
- virtual void getBInvRow(int row, double* z) const;
-
- ///Get a column of the tableau
- virtual void getBInvACol(int col, double* vec) const ;
-
- ///Get a column of the tableau
- virtual void getBInvACol(int col, CoinIndexedVector * vec) const ;
-
- /** Update (i.e. ftran) the vector passed in.
- Unscaling is applied after - can't be applied before
- */
-
- virtual void getBInvACol(CoinIndexedVector * vec) const ;
-
- ///Get a column of the basis inverse
- virtual void getBInvCol(int col, double* vec) const ;
-
- /** Get basic indices (order of indices corresponds to the
- order of elements in a vector retured by getBInvACol() and
- getBInvCol()).
- */
- virtual void getBasics(int* index) const;
-
- /*! \brief Enables simplex mode 2 (individual pivot control)
-
- This method is supposed to ensure that all typical things (like
- reduced costs, etc.) are updated when individual pivots are executed
- and can be queried by other methods.
- */
- virtual void enableSimplexInterface(bool doingPrimal);
- /// Copy across enabled stuff from one solver to another
- void copyEnabledSuff(OsiClpSolverInterface & rhs);
-
- /*! \brief Undo setting changes made by #enableSimplexInterface */
- virtual void disableSimplexInterface();
- /// Copy across enabled stuff from one solver to another
- void copyEnabledStuff(ClpSimplex & rhs);
-
- /** Perform a pivot by substituting a colIn for colOut in the basis.
- The status of the leaving variable is given in statOut. Where
- 1 is to upper bound, -1 to lower bound
- Return code is 0 for okay,
- 1 if inaccuracy forced re-factorization (should be okay) and
- -1 for singular factorization
- */
- virtual int pivot(int colIn, int colOut, int outStatus);
-
- /** Obtain a result of the primal pivot
- Outputs: colOut -- leaving column, outStatus -- its status,
- t -- step size, and, if dx!=NULL, *dx -- primal ray direction.
- Inputs: colIn -- entering column, sign -- direction of its change (+/-1).
- Both for colIn and colOut, artificial variables are index by
- the negative of the row index minus 1.
- Return code (for now): 0 -- leaving variable found,
- -1 -- everything else?
- Clearly, more informative set of return values is required
- Primal and dual solutions are updated
- */
- virtual int primalPivotResult(int colIn, int sign,
- int& colOut, int& outStatus,
- double& t, CoinPackedVector* dx);
-
- /** Obtain a result of the dual pivot (similar to the previous method)
- Differences: entering variable and a sign of its change are now
- the outputs, the leaving variable and its statuts -- the inputs
- If dx!=NULL, then *dx contains dual ray
- Return code: same
- */
- virtual int dualPivotResult(int& colIn, int& sign,
- int colOut, int outStatus,
- double& t, CoinPackedVector* dx);
-
-
- //@}
- //---------------------------------------------------------------------------
- /**@name Parameter set/get methods
-
- The set methods return true if the parameter was set to the given value,
- false otherwise. There can be various reasons for failure: the given
- parameter is not applicable for the solver (e.g., refactorization
- frequency for the clp algorithm), the parameter is not yet implemented
- for the solver or simply the value of the parameter is out of the range
- the solver accepts. If a parameter setting call returns false check the
- details of your solver.
-
- The get methods return true if the given parameter is applicable for the
- solver and is implemented. In this case the value of the parameter is
- returned in the second argument. Otherwise they return false.
- */
- //@{
- // Set an integer parameter
- bool setIntParam(OsiIntParam key, int value);
- // Set an double parameter
- bool setDblParam(OsiDblParam key, double value);
- // Set a string parameter
- bool setStrParam(OsiStrParam key, const std::string & value);
- // Get an integer parameter
- bool getIntParam(OsiIntParam key, int& value) const;
- // Get an double parameter
- bool getDblParam(OsiDblParam key, double& value) const;
- // Get a string parameter
- bool getStrParam(OsiStrParam key, std::string& value) const;
- // Set a hint parameter - overrides OsiSolverInterface
- virtual bool setHintParam(OsiHintParam key, bool yesNo=true,
- OsiHintStrength strength=OsiHintTry,
- void * otherInformation=NULL);
- //@}
-
- //---------------------------------------------------------------------------
- ///@name Methods returning info on how the solution process terminated
- //@{
- /// Are there a numerical difficulties?
- virtual bool isAbandoned() const;
- /// Is optimality proven?
- virtual bool isProvenOptimal() const;
- /// Is primal infeasiblity proven?
- virtual bool isProvenPrimalInfeasible() const;
- /// Is dual infeasiblity proven?
- virtual bool isProvenDualInfeasible() const;
- /// Is the given primal objective limit reached?
- virtual bool isPrimalObjectiveLimitReached() const;
- /// Is the given dual objective limit reached?
- virtual bool isDualObjectiveLimitReached() const;
- /// Iteration limit reached?
- virtual bool isIterationLimitReached() const;
- //@}
-
- //---------------------------------------------------------------------------
- /**@name WarmStart related methods */
- //@{
-
- /*! \brief Get an empty warm start object
-
- This routine returns an empty CoinWarmStartBasis object. Its purpose is
- to provide a way to give a client a warm start basis object of the
- appropriate type, which can resized and modified as desired.
- */
-
- virtual CoinWarmStart *getEmptyWarmStart () const;
-
- /// Get warmstarting information
- virtual CoinWarmStart* getWarmStart() const;
- /// Get warmstarting information
- inline CoinWarmStartBasis* getPointerToWarmStart()
- { return &basis_;}
- /// Get warmstarting information
- inline const CoinWarmStartBasis* getConstPointerToWarmStart() const
- { return &basis_;}
- /** Set warmstarting information. Return true/false depending on whether
- the warmstart information was accepted or not. */
- virtual bool setWarmStart(const CoinWarmStart* warmstart);
- /** \brief Get warm start information.
-
- Return warm start information for the current state of the solver
- interface. If there is no valid warm start information, an empty warm
- start object wil be returned. This does not necessarily create an
- object - may just point to one. must Delete set true if user
- should delete returned object.
- OsiClp version always returns pointer and false.
- */
- virtual CoinWarmStart* getPointerToWarmStart(bool & mustDelete) ;
-
- /// Set column status in ClpSimplex and warmStart
- void setColumnStatus(int iColumn, ClpSimplex::Status status);
-
- //@}
-
- //---------------------------------------------------------------------------
- /**@name Hotstart related methods (primarily used in strong branching).
- The user can create a hotstart (a snapshot) of the optimization process
- then reoptimize over and over again always starting from there.<br>
- <strong>NOTE</strong>: between hotstarted optimizations only
- bound changes are allowed. */
- //@{
- /// Create a hotstart point of the optimization process
- virtual void markHotStart();
- /// Optimize starting from the hotstart
- virtual void solveFromHotStart();
- /// Delete the snapshot
- virtual void unmarkHotStart();
- /** Start faster dual - returns negative if problems 1 if infeasible,
- Options to pass to solver
- 1 - create external reduced costs for columns
- 2 - create external reduced costs for rows
- 4 - create external row activity (columns always done)
- Above only done if feasible
- When set resolve does less work
- */
- int startFastDual(int options);
- /// Stop fast dual
- void stopFastDual();
- /// Sets integer tolerance and increment
- void setStuff(double tolerance,double increment);
- /// Return a conflict analysis cut from small model
- OsiRowCut * smallModelCut(const double * originalLower, const double * originalUpper,
- int numberRowsAtContinuous,const int * whichGenerator,
- int typeCut=0);
- /** Return a conflict analysis cut from model
- If type is 0 then genuine cut, if 1 then only partially processed
- */
- OsiRowCut * modelCut(const double * originalLower, const double * originalUpper,
- int numberRowsAtContinuous,const int * whichGenerator,
- int typeCut=0);
- //@}
-
- //---------------------------------------------------------------------------
- /**@name Problem information methods
-
- These methods call the solver's query routines to return
- information about the problem referred to by the current object.
- Querying a problem that has no data associated with it result in
- zeros for the number of rows and columns, and NULL pointers from
- the methods that return vectors.
-
- Const pointers returned from any data-query method are valid as
- long as the data is unchanged and the solver is not called.
- */
- //@{
- /**@name Methods related to querying the input data */
- //@{
- /// Get number of columns
- virtual int getNumCols() const {
- return modelPtr_->numberColumns(); }
-
- /// Get number of rows
- virtual int getNumRows() const {
- return modelPtr_->numberRows(); }
-
- /// Get number of nonzero elements
- virtual int getNumElements() const {
- int retVal = 0;
- const CoinPackedMatrix * matrix =modelPtr_->matrix();
- if ( matrix != NULL ) retVal=matrix->getNumElements();
- return retVal; }
-
- /// Return name of row if one exists or Rnnnnnnn
- /// maxLen is currently ignored and only there to match the signature from the base class!
- virtual std::string getRowName(int rowIndex,
- unsigned maxLen = static_cast<unsigned>(std::string::npos)) const;
-
- /// Return name of column if one exists or Cnnnnnnn
- /// maxLen is currently ignored and only there to match the signature from the base class!
- virtual std::string getColName(int colIndex,
- unsigned maxLen = static_cast<unsigned>(std::string::npos)) const;
-
-
- /// Get pointer to array[getNumCols()] of column lower bounds
- virtual const double * getColLower() const { return modelPtr_->columnLower(); }
-
- /// Get pointer to array[getNumCols()] of column upper bounds
- virtual const double * getColUpper() const { return modelPtr_->columnUpper(); }
-
- /** Get pointer to array[getNumRows()] of row constraint senses.
- <ul>
- <li>'L' <= constraint
- <li>'E' = constraint
- <li>'G' >= constraint
- <li>'R' ranged constraint
- <li>'N' free constraint
- </ul>
- */
- virtual const char * getRowSense() const;
-
- /** Get pointer to array[getNumRows()] of rows right-hand sides
- <ul>
- <li> if rowsense()[i] == 'L' then rhs()[i] == rowupper()[i]
- <li> if rowsense()[i] == 'G' then rhs()[i] == rowlower()[i]
- <li> if rowsense()[i] == 'R' then rhs()[i] == rowupper()[i]
- <li> if rowsense()[i] == 'N' then rhs()[i] == 0.0
- </ul>
- */
- virtual const double * getRightHandSide() const ;
-
- /** Get pointer to array[getNumRows()] of row ranges.
- <ul>
- <li> if rowsense()[i] == 'R' then
- rowrange()[i] == rowupper()[i] - rowlower()[i]
- <li> if rowsense()[i] != 'R' then
- rowrange()[i] is undefined
- </ul>
- */
- virtual const double * getRowRange() const ;
-
- /// Get pointer to array[getNumRows()] of row lower bounds
- virtual const double * getRowLower() const { return modelPtr_->rowLower(); }
-
- /// Get pointer to array[getNumRows()] of row upper bounds
- virtual const double * getRowUpper() const { return modelPtr_->rowUpper(); }
-
- /// Get pointer to array[getNumCols()] of objective function coefficients
- virtual const double * getObjCoefficients() const
- { if (fakeMinInSimplex_)
- return linearObjective_ ;
- else
- return modelPtr_->objective(); }
-
- /// Get objective function sense (1 for min (default), -1 for max)
- virtual double getObjSense() const
- { return ((fakeMinInSimplex_)?-modelPtr_->optimizationDirection():
- modelPtr_->optimizationDirection()); }
-
- /// Return true if column is continuous
- virtual bool isContinuous(int colNumber) const;
- /// Return true if variable is binary
- virtual bool isBinary(int colIndex) const;
-
- /** Return true if column is integer.
- Note: This function returns true if the the column
- is binary or a general integer.
- */
- virtual bool isInteger(int colIndex) const;
-
- /// Return true if variable is general integer
- virtual bool isIntegerNonBinary(int colIndex) const;
-
- /// Return true if variable is binary and not fixed at either bound
- virtual bool isFreeBinary(int colIndex) const;
- /** Return array of column length
- 0 - continuous
- 1 - binary (may get fixed later)
- 2 - general integer (may get fixed later)
- */
- virtual const char * getColType(bool refresh=false) const;
-
- /** Return true if column is integer but does not have to
- be declared as such.
- Note: This function returns true if the the column
- is binary or a general integer.
- */
- bool isOptionalInteger(int colIndex) const;
- /** Set the index-th variable to be an optional integer variable */
- void setOptionalInteger(int index);
-
- /// Get pointer to row-wise copy of matrix
- virtual const CoinPackedMatrix * getMatrixByRow() const;
-
- /// Get pointer to column-wise copy of matrix
- virtual const CoinPackedMatrix * getMatrixByCol() const;
-
- /// Get pointer to mutable column-wise copy of matrix
- virtual CoinPackedMatrix * getMutableMatrixByCol() const;
-
- /// Get solver's value for infinity
- virtual double getInfinity() const { return OsiClpInfinity; }
- //@}
-
- /**@name Methods related to querying the solution */
- //@{
- /// Get pointer to array[getNumCols()] of primal solution vector
- virtual const double * getColSolution() const;
-
- /// Get pointer to array[getNumRows()] of dual prices
- virtual const double * getRowPrice() const;
-
- /// Get a pointer to array[getNumCols()] of reduced costs
- virtual const double * getReducedCost() const;
-
- /** Get pointer to array[getNumRows()] of row activity levels (constraint
- matrix times the solution vector */
- virtual const double * getRowActivity() const;
-
- /// Get objective function value
- virtual double getObjValue() const;
-
- /** Get how many iterations it took to solve the problem (whatever
- "iteration" mean to the solver. */
- virtual int getIterationCount() const
- { return modelPtr_->numberIterations(); }
-
- /** Get as many dual rays as the solver can provide. (In case of proven
- primal infeasibility there should be at least one.)
-
- The first getNumRows() ray components will always be associated with
- the row duals (as returned by getRowPrice()). If \c fullRay is true,
- the final getNumCols() entries will correspond to the ray components
- associated with the nonbasic variables. If the full ray is requested
- and the method cannot provide it, it will throw an exception.
-
- <strong>NOTE for implementers of solver interfaces:</strong> <br>
- The double pointers in the vector should point to arrays of length
- getNumRows() and they should be allocated via new[]. <br>
-
- <strong>NOTE for users of solver interfaces:</strong> <br>
- It is the user's responsibility to free the double pointers in the
- vector using delete[].
- */
- virtual std::vector<double*> getDualRays(int maxNumRays,
- bool fullRay = false) const;
- /** Get as many primal rays as the solver can provide. (In case of proven
- dual infeasibility there should be at least one.)
-
- <strong>NOTE for implementers of solver interfaces:</strong> <br>
- The double pointers in the vector should point to arrays of length
- getNumCols() and they should be allocated via new[]. <br>
-
- <strong>NOTE for users of solver interfaces:</strong> <br>
- It is the user's responsibility to free the double pointers in the
- vector using delete[].
- */
- virtual std::vector<double*> getPrimalRays(int maxNumRays) const;
-
- //@}
- //@}
-
- //---------------------------------------------------------------------------
-
- /**@name Problem modifying methods */
- //@{
- //-------------------------------------------------------------------------
- /**@name Changing bounds on variables and constraints */
- //@{
- /** Set an objective function coefficient */
- virtual void setObjCoeff( int elementIndex, double elementValue );
-
- /** Set a single column lower bound<br>
- Use -DBL_MAX for -infinity. */
- virtual void setColLower( int elementIndex, double elementValue );
-
- /** Set a single column upper bound<br>
- Use DBL_MAX for infinity. */
- virtual void setColUpper( int elementIndex, double elementValue );
-
- /** Set a single column lower and upper bound */
- virtual void setColBounds( int elementIndex,
- double lower, double upper );
-
- /** Set the bounds on a number of columns simultaneously<br>
- The default implementation just invokes setColLower() and
- setColUpper() over and over again.
- @param indexFirst,indexLast pointers to the beginning and after the
- end of the array of the indices of the variables whose
- <em>either</em> bound changes
- @param boundList the new lower/upper bound pairs for the variables
- */
- virtual void setColSetBounds(const int* indexFirst,
- const int* indexLast,
- const double* boundList);
-
- /** Set a single row lower bound<br>
- Use -DBL_MAX for -infinity. */
- virtual void setRowLower( int elementIndex, double elementValue );
-
- /** Set a single row upper bound<br>
- Use DBL_MAX for infinity. */
- virtual void setRowUpper( int elementIndex, double elementValue ) ;
-
- /** Set a single row lower and upper bound */
- virtual void setRowBounds( int elementIndex,
- double lower, double upper ) ;
-
- /** Set the type of a single row<br> */
- virtual void setRowType(int index, char sense, double rightHandSide,
- double range);
-
- /** Set the bounds on a number of rows simultaneously<br>
- The default implementation just invokes setRowLower() and
- setRowUpper() over and over again.
- @param indexFirst,indexLast pointers to the beginning and after the
- end of the array of the indices of the constraints whose
- <em>either</em> bound changes
- @param boundList the new lower/upper bound pairs for the constraints
- */
- virtual void setRowSetBounds(const int* indexFirst,
- const int* indexLast,
- const double* boundList);
-
- /** Set the type of a number of rows simultaneously<br>
- The default implementation just invokes setRowType()
- over and over again.
- @param indexFirst,indexLast pointers to the beginning and after the
- end of the array of the indices of the constraints whose
- <em>any</em> characteristics changes
- @param senseList the new senses
- @param rhsList the new right hand sides
- @param rangeList the new ranges
- */
- virtual void setRowSetTypes(const int* indexFirst,
- const int* indexLast,
- const char* senseList,
- const double* rhsList,
- const double* rangeList);
- /** Set the objective coefficients for all columns
- array [getNumCols()] is an array of values for the objective.
- This defaults to a series of set operations and is here for speed.
- */
- virtual void setObjective(const double * array);
-
- /** Set the lower bounds for all columns
- array [getNumCols()] is an array of values for the objective.
- This defaults to a series of set operations and is here for speed.
- */
- virtual void setColLower(const double * array);
-
- /** Set the upper bounds for all columns
- array [getNumCols()] is an array of values for the objective.
- This defaults to a series of set operations and is here for speed.
- */
- virtual void setColUpper(const double * array);
-
-// using OsiSolverInterface::setRowName ;
- /// Set name of row
-// virtual void setRowName(int rowIndex, std::string & name) ;
- virtual void setRowName(int rowIndex, std::string name) ;
-
-// using OsiSolverInterface::setColName ;
- /// Set name of column
-// virtual void setColName(int colIndex, std::string & name) ;
- virtual void setColName(int colIndex, std::string name) ;
-
- //@}
-
- //-------------------------------------------------------------------------
- /**@name Integrality related changing methods */
- //@{
- /** Set the index-th variable to be a continuous variable */
- virtual void setContinuous(int index);
- /** Set the index-th variable to be an integer variable */
- virtual void setInteger(int index);
- /** Set the variables listed in indices (which is of length len) to be
- continuous variables */
- virtual void setContinuous(const int* indices, int len);
- /** Set the variables listed in indices (which is of length len) to be
- integer variables */
- virtual void setInteger(const int* indices, int len);
- /// Number of SOS sets
- inline int numberSOS() const
- { return numberSOS_;}
- /// SOS set info
- inline const CoinSet * setInfo() const
- { return setInfo_;}
- /** \brief Identify integer variables and SOS and create corresponding objects.
-
- Record integer variables and create an OsiSimpleInteger object for each
- one. All existing OsiSimpleInteger objects will be destroyed.
- If the solver supports SOS then do the same for SOS.
- If justCount then no objects created and we just store numberIntegers_
- Returns number of SOS
- */
-
- virtual int findIntegersAndSOS(bool justCount);
- //@}
-
- //-------------------------------------------------------------------------
- /// Set objective function sense (1 for min (default), -1 for max,)
- virtual void setObjSense(double s )
- { modelPtr_->setOptimizationDirection( s < 0 ? -1 : 1); }
-
- /** Set the primal solution column values
-
- colsol[numcols()] is an array of values of the problem column
- variables. These values are copied to memory owned by the
- solver object or the solver. They will be returned as the
- result of colsol() until changed by another call to
- setColsol() or by a call to any solver routine. Whether the
- solver makes use of the solution in any way is
- solver-dependent.
- */
- virtual void setColSolution(const double * colsol);
-
- /** Set dual solution vector
-
- rowprice[numrows()] is an array of values of the problem row
- dual variables. These values are copied to memory owned by the
- solver object or the solver. They will be returned as the
- result of rowprice() until changed by another call to
- setRowprice() or by a call to any solver routine. Whether the
- solver makes use of the solution in any way is
- solver-dependent.
- */
- virtual void setRowPrice(const double * rowprice);
-
- //-------------------------------------------------------------------------
- /**@name Methods to expand a problem.<br>
- Note that if a column is added then by default it will correspond to a
- continuous variable. */
- //@{
-
- //using OsiSolverInterface::addCol ;
- /** */
- virtual void addCol(const CoinPackedVectorBase& vec,
- const double collb, const double colub,
- const double obj);
- /*! \brief Add a named column (primal variable) to the problem.
- */
- virtual void addCol(const CoinPackedVectorBase& vec,
- const double collb, const double colub,
- const double obj, std::string name) ;
- /** Add a column (primal variable) to the problem. */
- virtual void addCol(int numberElements, const int * rows, const double * elements,
- const double collb, const double colub,
- const double obj) ;
- /*! \brief Add a named column (primal variable) to the problem.
- */
- virtual void addCol(int numberElements,
- const int* rows, const double* elements,
- const double collb, const double colub,
- const double obj, std::string name) ;
- /** */
- virtual void addCols(const int numcols,
- const CoinPackedVectorBase * const * cols,
- const double* collb, const double* colub,
- const double* obj);
- /** */
- virtual void addCols(const int numcols,
- const int * columnStarts, const int * rows, const double * elements,
- const double* collb, const double* colub,
- const double* obj);
- /** */
- virtual void deleteCols(const int num, const int * colIndices);
-
- /** */
- virtual void addRow(const CoinPackedVectorBase& vec,
- const double rowlb, const double rowub);
- /** */
- /*! \brief Add a named row (constraint) to the problem.
-
- The default implementation adds the row, then changes the name. This
- can surely be made more efficient within an OsiXXX class.
- */
- virtual void addRow(const CoinPackedVectorBase& vec,
- const double rowlb, const double rowub,
- std::string name) ;
- virtual void addRow(const CoinPackedVectorBase& vec,
- const char rowsen, const double rowrhs,
- const double rowrng);
- /** Add a row (constraint) to the problem. */
- virtual void addRow(int numberElements, const int * columns, const double * element,
- const double rowlb, const double rowub) ;
- /*! \brief Add a named row (constraint) to the problem.
- */
- virtual void addRow(const CoinPackedVectorBase& vec,
- const char rowsen, const double rowrhs,
- const double rowrng, std::string name) ;
- /** */
- virtual void addRows(const int numrows,
- const CoinPackedVectorBase * const * rows,
- const double* rowlb, const double* rowub);
- /** */
- virtual void addRows(const int numrows,
- const CoinPackedVectorBase * const * rows,
- const char* rowsen, const double* rowrhs,
- const double* rowrng);
-
- /** */
- virtual void addRows(const int numrows,
- const int * rowStarts, const int * columns, const double * element,
- const double* rowlb, const double* rowub);
- ///
- void modifyCoefficient(int row, int column, double newElement,
- bool keepZero=false)
- {modelPtr_->modifyCoefficient(row,column,newElement, keepZero);}
-
- /** */
- virtual void deleteRows(const int num, const int * rowIndices);
- /** If solver wants it can save a copy of "base" (continuous) model here
- */
- virtual void saveBaseModel() ;
- /** Strip off rows to get to this number of rows.
- If solver wants it can restore a copy of "base" (continuous) model here
- */
- virtual void restoreBaseModel(int numberRows);
-
- //-----------------------------------------------------------------------
- /** Apply a collection of row cuts which are all effective.
- applyCuts seems to do one at a time which seems inefficient.
- */
- virtual void applyRowCuts(int numberCuts, const OsiRowCut * cuts);
- /** Apply a collection of row cuts which are all effective.
- applyCuts seems to do one at a time which seems inefficient.
- This uses array of pointers
- */
- virtual void applyRowCuts(int numberCuts, const OsiRowCut ** cuts);
- /** Apply a collection of cuts.
-
- Only cuts which have an <code>effectiveness >= effectivenessLb</code>
- are applied.
- <ul>
- <li> ReturnCode.getNumineffective() -- number of cuts which were
- not applied because they had an
- <code>effectiveness < effectivenessLb</code>
- <li> ReturnCode.getNuminconsistent() -- number of invalid cuts
- <li> ReturnCode.getNuminconsistentWrtIntegerModel() -- number of
- cuts that are invalid with respect to this integer model
- <li> ReturnCode.getNuminfeasible() -- number of cuts that would
- make this integer model infeasible
- <li> ReturnCode.getNumApplied() -- number of integer cuts which
- were applied to the integer model
- <li> cs.size() == getNumineffective() +
- getNuminconsistent() +
- getNuminconsistentWrtIntegerModel() +
- getNuminfeasible() +
- getNumApplied()
- </ul>
- */
- virtual ApplyCutsReturnCode applyCuts(const OsiCuts & cs,
- double effectivenessLb = 0.0);
-
- //@}
- //@}
-
- //---------------------------------------------------------------------------
-
-public:
-
- /**@name Methods to input a problem */
- //@{
- /** Load in an problem by copying the arguments (the constraints on the
- rows are given by lower and upper bounds). If a pointer is NULL then the
- following values are the default:
- <ul>
- <li> <code>colub</code>: all columns have upper bound infinity
- <li> <code>collb</code>: all columns have lower bound 0
- <li> <code>rowub</code>: all rows have upper bound infinity
- <li> <code>rowlb</code>: all rows have lower bound -infinity
- <li> <code>obj</code>: all variables have 0 objective coefficient
- </ul>
- */
- virtual void loadProblem(const CoinPackedMatrix& matrix,
- const double* collb, const double* colub,
- const double* obj,
- const double* rowlb, const double* rowub);
-
- /** Load in an problem by assuming ownership of the arguments (the
- constraints on the rows are given by lower and upper bounds). For
- default values see the previous method. <br>
- <strong>WARNING</strong>: The arguments passed to this method will be
- freed using the C++ <code>delete</code> and <code>delete[]</code>
- functions.
- */
- virtual void assignProblem(CoinPackedMatrix*& matrix,
- double*& collb, double*& colub, double*& obj,
- double*& rowlb, double*& rowub);
-
- /** Load in an problem by copying the arguments (the constraints on the
- rows are given by sense/rhs/range triplets). If a pointer is NULL then the
- following values are the default:
- <ul>
- <li> <code>colub</code>: all columns have upper bound infinity
- <li> <code>collb</code>: all columns have lower bound 0
- <li> <code>obj</code>: all variables have 0 objective coefficient
- <li> <code>rowsen</code>: all rows are >=
- <li> <code>rowrhs</code>: all right hand sides are 0
- <li> <code>rowrng</code>: 0 for the ranged rows
- </ul>
- */
- virtual void loadProblem(const CoinPackedMatrix& matrix,
- const double* collb, const double* colub,
- const double* obj,
- const char* rowsen, const double* rowrhs,
- const double* rowrng);
-
- /** Load in an problem by assuming ownership of the arguments (the
- constraints on the rows are given by sense/rhs/range triplets). For
- default values see the previous method. <br>
- <strong>WARNING</strong>: The arguments passed to this method will be
- freed using the C++ <code>delete</code> and <code>delete[]</code>
- functions.
- */
- virtual void assignProblem(CoinPackedMatrix*& matrix,
- double*& collb, double*& colub, double*& obj,
- char*& rowsen, double*& rowrhs,
- double*& rowrng);
-
- /** Just like the other loadProblem() methods except that the matrix is
- given as a ClpMatrixBase. */
- virtual void loadProblem(const ClpMatrixBase& matrix,
- const double* collb, const double* colub,
- const double* obj,
- const double* rowlb, const double* rowub) ;
-
- /** Just like the other loadProblem() methods except that the matrix is
- given in a standard column major ordered format (without gaps). */
- virtual void loadProblem(const int numcols, const int numrows,
- const CoinBigIndex * start, const int* index,
- const double* value,
- const double* collb, const double* colub,
- const double* obj,
- const double* rowlb, const double* rowub);
-
- /** Just like the other loadProblem() methods except that the matrix is
- given in a standard column major ordered format (without gaps). */
- virtual void loadProblem(const int numcols, const int numrows,
- const CoinBigIndex * start, const int* index,
- const double* value,
- const double* collb, const double* colub,
- const double* obj,
- const char* rowsen, const double* rowrhs,
- const double* rowrng);
- /// This loads a model from a coinModel object - returns number of errors
- virtual int loadFromCoinModel ( CoinModel & modelObject, bool keepSolution=false);
-
- using OsiSolverInterface::readMps ;
- /** Read an mps file from the given filename (defaults to Osi reader) - returns
- number of errors (see OsiMpsReader class) */
- virtual int readMps(const char *filename,
- const char *extension = "mps") ;
- /** Read an mps file from the given filename returns
- number of errors (see OsiMpsReader class) */
- int readMps(const char *filename,bool keepNames,bool allowErrors);
- /// Read an mps file
- virtual int readMps (const char *filename, const char*extension,
- int & numberSets, CoinSet ** & sets);
-
- /** Write the problem into an mps file of the given filename.
- If objSense is non zero then -1.0 forces the code to write a
- maximization objective and +1.0 to write a minimization one.
- If 0.0 then solver can do what it wants */
- virtual void writeMps(const char *filename,
- const char *extension = "mps",
- double objSense=0.0) const;
- /** Write the problem into an mps file of the given filename,
- names may be null. formatType is
- 0 - normal
- 1 - extra accuracy
- 2 - IEEE hex (later)
-
- Returns non-zero on I/O error
- */
- virtual int writeMpsNative(const char *filename,
- const char ** rowNames, const char ** columnNames,
- int formatType=0,int numberAcross=2,
- double objSense=0.0) const ;
- /// Read file in LP format (with names)
- virtual int readLp(const char *filename, const double epsilon = 1e-5);
- /** Write the problem into an Lp file of the given filename.
- If objSense is non zero then -1.0 forces the code to write a
- maximization objective and +1.0 to write a minimization one.
- If 0.0 then solver can do what it wants.
- This version calls writeLpNative with names */
- virtual void writeLp(const char *filename,
- const char *extension = "lp",
- double epsilon = 1e-5,
- int numberAcross = 10,
- int decimals = 5,
- double objSense = 0.0,
- bool useRowNames = true) const;
- /** Write the problem into the file pointed to by the parameter fp.
- Other parameters are similar to
- those of writeLp() with first parameter filename.
- */
- virtual void writeLp(FILE *fp,
- double epsilon = 1e-5,
- int numberAcross = 10,
- int decimals = 5,
- double objSense = 0.0,
- bool useRowNames = true) const;
- /**
- I (JJF) am getting annoyed because I can't just replace a matrix.
- The default behavior of this is do nothing so only use where that would not matter
- e.g. strengthening a matrix for MIP
- */
- virtual void replaceMatrixOptional(const CoinPackedMatrix & matrix);
- /// And if it does matter (not used at present)
- virtual void replaceMatrix(const CoinPackedMatrix & matrix) ;
- //@}
-
- /**@name Message handling (extra for Clp messages).
- Normally I presume you would want the same language.
- If not then you could use underlying model pointer */
- //@{
- /** Pass in a message handler
-
- It is the client's responsibility to destroy a message handler installed
- by this routine; it will not be destroyed when the solver interface is
- destroyed.
- */
- virtual void passInMessageHandler(CoinMessageHandler * handler);
- /// Set language
- void newLanguage(CoinMessages::Language language);
- void setLanguage(CoinMessages::Language language)
- {newLanguage(language);}
- /// Set log level (will also set underlying solver's log level)
- void setLogLevel(int value);
- /// Create C++ lines to get to current state
- void generateCpp( FILE * fp);
- //@}
- //---------------------------------------------------------------------------
-
- /**@name Clp specific public interfaces */
- //@{
- /// Get pointer to Clp model
- ClpSimplex * getModelPtr() const ;
- /// Set pointer to Clp model and return old
- inline ClpSimplex * swapModelPtr(ClpSimplex * newModel)
- { ClpSimplex * model = modelPtr_; modelPtr_=newModel;return model;}
- /// Get special options
- inline unsigned int specialOptions() const
- { return specialOptions_;}
- void setSpecialOptions(unsigned int value);
- /// Last algorithm used , 1 = primal, 2 = dual other unknown
- inline int lastAlgorithm() const
- { return lastAlgorithm_;}
- /// Set last algorithm used , 1 = primal, 2 = dual other unknown
- inline void setLastAlgorithm(int value)
- { lastAlgorithm_ = value;}
- /// Get scaling action option
- inline int cleanupScaling() const
- { return cleanupScaling_;}
- /** Set Scaling option
- When scaling is on it is possible that the scaled problem
- is feasible but the unscaled is not. Clp returns a secondary
- status code to that effect. This option allows for a cleanup.
- If you use it I would suggest 1.
- This only affects actions when scaled optimal
- 0 - no action
- 1 - clean up using dual if primal infeasibility
- 2 - clean up using dual if dual infeasibility
- 3 - clean up using dual if primal or dual infeasibility
- 11,12,13 - as 1,2,3 but use primal
- */
- inline void setCleanupScaling(int value)
- { cleanupScaling_=value;}
- /** Get smallest allowed element in cut.
- If smaller than this then ignored */
- inline double smallestElementInCut() const
- { return smallestElementInCut_;}
- /** Set smallest allowed element in cut.
- If smaller than this then ignored */
- inline void setSmallestElementInCut(double value)
- { smallestElementInCut_=value;}
- /** Get smallest change in cut.
- If (upper-lower)*element < this then element is
- taken out and cut relaxed.
- (upper-lower) is taken to be at least 1.0 and
- this is assumed >= smallestElementInCut_
- */
- inline double smallestChangeInCut() const
- { return smallestChangeInCut_;}
- /** Set smallest change in cut.
- If (upper-lower)*element < this then element is
- taken out and cut relaxed.
- (upper-lower) is taken to be at least 1.0 and
- this is assumed >= smallestElementInCut_
- */
- inline void setSmallestChangeInCut(double value)
- { smallestChangeInCut_=value;}
- /// Pass in initial solve options
- inline void setSolveOptions(const ClpSolve & options)
- { solveOptions_ = options;}
- /** Tighten bounds - lightweight or very lightweight
- 0 - normal, 1 lightweight but just integers, 2 lightweight and all
- */
- virtual int tightenBounds(int lightweight=0);
- /// See if any integer variables make infeasible other way
- int infeasibleOtherWay(char * whichWay);
- /// Return number of entries in L part of current factorization
- virtual CoinBigIndex getSizeL() const;
- /// Return number of entries in U part of current factorization
- virtual CoinBigIndex getSizeU() const;
- /// Get disaster handler
- const OsiClpDisasterHandler * disasterHandler() const
- { return disasterHandler_;}
- /// Pass in disaster handler
- void passInDisasterHandler(OsiClpDisasterHandler * handler);
- /// Get fake objective
- ClpLinearObjective * fakeObjective() const
- { return fakeObjective_;}
- /// Set fake objective (and take ownership)
- void setFakeObjective(ClpLinearObjective * fakeObjective);
- /// Set fake objective
- void setFakeObjective(double * fakeObjective);
- /*! \brief Set up solver for repeated use by Osi interface.
-
- The normal usage does things like keeping factorization around so can be
- used. Will also do things like keep scaling and row copy of matrix if
- matrix does not change.
-
- \p senseOfAdventure:
- - 0 - safe stuff as above
- - 1 - will take more risks - if it does not work then bug which will be
- fixed
- - 2 - don't bother doing most extreme termination checks e.g. don't bother
- re-factorizing if less than 20 iterations.
- - 3 - Actually safer than 1 (mainly just keeps factorization)
-
- \p printOut
- - -1 always skip round common messages instead of doing some work
- - 0 skip if normal defaults
- - 1 leaves
- */
- void setupForRepeatedUse(int senseOfAdventure=0, int printOut=0);
- /// Synchronize model (really if no cuts in tree)
- virtual void synchronizeModel();
- /*! \brief Set special options in underlying clp solver.
-
- Safe as const because #modelPtr_ is mutable.
- */
- void setSpecialOptionsMutable(unsigned int value) const;
-
- //@}
-
- //---------------------------------------------------------------------------
-
- /**@name Constructors and destructors */
- //@{
- /// Default Constructor
- OsiClpSolverInterface ();
-
- /// Clone
- virtual OsiSolverInterface * clone(bool copyData = true) const;
-
- /// Copy constructor
- OsiClpSolverInterface (const OsiClpSolverInterface &);
-
- /// Borrow constructor - only delete one copy
- OsiClpSolverInterface (ClpSimplex * rhs, bool reallyOwn=false);
-
- /// Releases so won't error
- void releaseClp();
-
- /// Assignment operator
- OsiClpSolverInterface & operator=(const OsiClpSolverInterface& rhs);
-
- /// Destructor
- virtual ~OsiClpSolverInterface ();
-
- /// Resets as if default constructor
- virtual void reset();
- //@}
-
- //---------------------------------------------------------------------------
-
-protected:
- ///@name Protected methods
- //@{
- /** Apply a row cut (append to constraint matrix). */
- virtual void applyRowCut(const OsiRowCut& rc);
-
- /** Apply a column cut (adjust one or more bounds). */
- virtual void applyColCut(const OsiColCut& cc);
- //@}
-
- //---------------------------------------------------------------------------
-
-protected:
- /**@name Protected methods */
- //@{
- /// The real work of a copy constructor (used by copy and assignment)
- void gutsOfDestructor();
-
- /// Deletes all mutable stuff
- void freeCachedResults() const;
-
- /// Deletes all mutable stuff for row ranges etc
- void freeCachedResults0() const;
-
- /// Deletes all mutable stuff for matrix etc
- void freeCachedResults1() const;
-
- /// A method that fills up the rowsense_, rhs_ and rowrange_ arrays
- void extractSenseRhsRange() const;
-
- ///
- void fillParamMaps();
- /** Warm start
-
- NOTE artificials are treated as +1 elements so for <= rhs
- artificial will be at lower bound if constraint is tight
-
- This means that Clpsimplex flips artificials as it works
- in terms of row activities
- */
- CoinWarmStartBasis getBasis(ClpSimplex * model) const;
- /** Sets up working basis as a copy of input
-
- NOTE artificials are treated as +1 elements so for <= rhs
- artificial will be at lower bound if constraint is tight
-
- This means that Clpsimplex flips artificials as it works
- in terms of row activities
- */
- void setBasis( const CoinWarmStartBasis & basis, ClpSimplex * model);
- /// Crunch down problem a bit
- void crunch();
- /// Extend scale factors
- void redoScaleFactors(int numberRows,const CoinBigIndex * starts,
- const int * indices, const double * elements);
-public:
- /** Sets up working basis as a copy of input and puts in as basis
- */
- void setBasis( const CoinWarmStartBasis & basis);
- /// Just puts current basis_ into ClpSimplex model
- inline void setBasis( )
- { setBasis(basis_,modelPtr_);}
- /// Warm start difference from basis_ to statusArray
- CoinWarmStartDiff * getBasisDiff(const unsigned char * statusArray) const ;
- /// Warm start from statusArray
- CoinWarmStartBasis * getBasis(const unsigned char * statusArray) const ;
- /// Delete all scale factor stuff and reset option
- void deleteScaleFactors();
- /// If doing fast hot start then ranges are computed
- inline const double * upRange() const
- { return rowActivity_;}
- inline const double * downRange() const
- { return columnActivity_;}
- /// Pass in range array
- inline void passInRanges(int * array)
- { whichRange_=array;}
- /// Pass in sos stuff from AMPl
- void setSOSData(int numberSOS,const char * type,
- const int * start,const int * indices, const double * weights=NULL);
- /// Compute largest amount any at continuous away from bound
- void computeLargestAway();
- /// Get largest amount continuous away from bound
- inline double largestAway() const
- { return largestAway_;}
- /// Set largest amount continuous away from bound
- inline void setLargestAway(double value)
- { largestAway_ = value;}
- /// Sort of lexicographic resolve
- void lexSolve();
- //@}
-
-protected:
- /**@name Protected member data */
- //@{
- /// Clp model represented by this class instance
- mutable ClpSimplex * modelPtr_;
- //@}
- /**@name Cached information derived from the OSL model */
- //@{
- /// Pointer to dense vector of row sense indicators
- mutable char *rowsense_;
-
- /// Pointer to dense vector of row right-hand side values
- mutable double *rhs_;
-
- /** Pointer to dense vector of slack upper bounds for range
- constraints (undefined for non-range rows)
- */
- mutable double *rowrange_;
-
- /** A pointer to the warmstart information to be used in the hotstarts.
- This is NOT efficient and more thought should be given to it... */
- mutable CoinWarmStartBasis* ws_;
- /** also save row and column information for hot starts
- only used in hotstarts so can be casual */
- mutable double * rowActivity_;
- mutable double * columnActivity_;
- /// Stuff for fast dual
- ClpNodeStuff stuff_;
- /// Number of SOS sets
- int numberSOS_;
- /// SOS set info
- CoinSet * setInfo_;
- /// Alternate model (hot starts) - but also could be permanent and used for crunch
- ClpSimplex * smallModel_;
- /// factorization for hot starts
- ClpFactorization * factorization_;
- /** Smallest allowed element in cut.
- If smaller than this then ignored */
- double smallestElementInCut_;
- /** Smallest change in cut.
- If (upper-lower)*element < this then element is
- taken out and cut relaxed. */
- double smallestChangeInCut_;
- /// Largest amount continuous away from bound
- double largestAway_;
- /// Arrays for hot starts
- char * spareArrays_;
- /** Warmstart information to be used in resolves. */
- CoinWarmStartBasis basis_;
- /** The original iteration limit before hotstarts started. */
- int itlimOrig_;
-
- /*! \brief Last algorithm used
-
- Coded as
- - 0 invalid
- - 1 primal
- - 2 dual
- - -911 disaster in the algorithm that was attempted
- - 999 current solution no longer optimal due to change in problem or
- basis
- */
- mutable int lastAlgorithm_;
-
- /// To say if destructor should delete underlying model
- bool notOwned_;
-
- /// Pointer to row-wise copy of problem matrix coefficients.
- mutable CoinPackedMatrix *matrixByRow_;
-
- /// Pointer to row-wise copy of continuous problem matrix coefficients.
- CoinPackedMatrix *matrixByRowAtContinuous_;
-
- /// Pointer to integer information
- char * integerInformation_;
-
- /** Pointer to variables for which we want range information
- The number is in [0]
- memory is not owned by OsiClp
- */
- int * whichRange_;
-
- //std::map<OsiIntParam, ClpIntParam> intParamMap_;
- //std::map<OsiDblParam, ClpDblParam> dblParamMap_;
- //std::map<OsiStrParam, ClpStrParam> strParamMap_;
-
- /*! \brief Faking min to get proper dual solution signs in simplex API */
- mutable bool fakeMinInSimplex_ ;
- /*! \brief Linear objective
-
- Normally a pointer to the linear coefficient array in the clp objective.
- An independent copy when #fakeMinInSimplex_ is true, because we need
- something permanent to point to when #getObjCoefficients is called.
- */
- mutable double *linearObjective_;
-
- /// To save data in OsiSimplex stuff
- mutable ClpDataSave saveData_;
- /// Options for initialSolve
- ClpSolve solveOptions_;
- /** Scaling option
- When scaling is on it is possible that the scaled problem
- is feasible but the unscaled is not. Clp returns a secondary
- status code to that effect. This option allows for a cleanup.
- If you use it I would suggest 1.
- This only affects actions when scaled optimal
- 0 - no action
- 1 - clean up using dual if primal infeasibility
- 2 - clean up using dual if dual infeasibility
- 3 - clean up using dual if primal or dual infeasibility
- 11,12,13 - as 1,2,3 but use primal
- */
- int cleanupScaling_;
- /** Special options
- 0x80000000 off
- 0 simple stuff for branch and bound
- 1 try and keep work regions as much as possible
- 2 do not use any perturbation
- 4 allow exit before re-factorization
- 8 try and re-use factorization if no cuts
- 16 use standard strong branching rather than clp's
- 32 Just go to first factorization in fast dual
- 64 try and tighten bounds in crunch
- 128 Model will only change in column bounds
- 256 Clean up model before hot start
- 512 Give user direct access to Clp regions in getBInvARow etc (i.e.,
- do not unscale, and do not return result in getBInv parameters;
- you have to know where to look for the answer)
- 1024 Don't "borrow" model in initialSolve
- 2048 Don't crunch
- 4096 quick check for optimality
- Bits above 8192 give where called from in Cbc
- At present 0 is normal, 1 doing fast hotstarts, 2 is can do quick check
- 65536 Keep simple i.e. no crunch etc
- 131072 Try and keep scaling factors around
- 262144 Don't try and tighten bounds (funny global cuts)
- 524288 Fake objective and 0-1
- 1048576 Don't recompute ray after crunch
- 2097152
- */
- mutable unsigned int specialOptions_;
- /// Copy of model when option 131072 set
- ClpSimplex * baseModel_;
- /// Number of rows when last "scaled"
- int lastNumberRows_;
- /// Continuous model
- ClpSimplex * continuousModel_;
- /// Possible disaster handler
- OsiClpDisasterHandler * disasterHandler_ ;
- /// Fake objective
- ClpLinearObjective * fakeObjective_;
- /// Row scale factors (has inverse at end)
- CoinDoubleArrayWithLength rowScale_;
- /// Column scale factors (has inverse at end)
- CoinDoubleArrayWithLength columnScale_;
- //@}
-};
-
-class OsiClpDisasterHandler : public ClpDisasterHandler {
-public:
- /**@name Virtual methods that the derived classe should provide.
- */
- //@{
- /// Into simplex
- virtual void intoSimplex();
- /// Checks if disaster
- virtual bool check() const ;
- /// saves information for next attempt
- virtual void saveInfo();
- /// Type of disaster 0 can fix, 1 abort
- virtual int typeOfDisaster();
- //@}
-
-
- /**@name Constructors, destructor */
-
- //@{
- /** Default constructor. */
- OsiClpDisasterHandler(OsiClpSolverInterface * model = NULL);
- /** Destructor */
- virtual ~OsiClpDisasterHandler();
- // Copy
- OsiClpDisasterHandler(const OsiClpDisasterHandler&);
- // Assignment
- OsiClpDisasterHandler& operator=(const OsiClpDisasterHandler&);
- /// Clone
- virtual ClpDisasterHandler * clone() const;
-
- //@}
-
- /**@name Sets/gets */
-
- //@{
- /** set model. */
- void setOsiModel(OsiClpSolverInterface * model);
- /// Get model
- inline OsiClpSolverInterface * osiModel() const
- { return osiModel_;}
- /// Set where from
- inline void setWhereFrom(int value)
- { whereFrom_=value;}
- /// Get where from
- inline int whereFrom() const
- { return whereFrom_;}
- /// Set phase
- inline void setPhase(int value)
- { phase_=value;}
- /// Get phase
- inline int phase() const
- { return phase_;}
- /// are we in trouble
- bool inTrouble() const;
-
- //@}
-
-
-protected:
- /**@name Data members
- The data members are protected to allow access for derived classes. */
- //@{
- /// Pointer to model
- OsiClpSolverInterface * osiModel_;
- /** Where from
- 0 dual (resolve)
- 1 crunch
- 2 primal (resolve)
- 4 dual (initialSolve)
- 6 primal (initialSolve)
- */
- int whereFrom_;
- /** phase
- 0 initial
- 1 trying continuing with back in and maybe different perturb
- 2 trying continuing with back in and different scaling
- 3 trying dual from all slack
- 4 trying primal from previous stored basis
- */
- int phase_;
- /// Are we in trouble
- bool inTrouble_;
- //@}
-};
-// So unit test can find out if NDEBUG set
-bool OsiClpHasNDEBUG();
-//#############################################################################
-/** A function that tests the methods in the OsiClpSolverInterface class. */
-void OsiClpSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir);
-#endif