diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index a8cc6e649e..f18e6495f4 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -42,7 +42,7 @@ jobs: - name: Building Cyclus run: | mkdir -p `python -m site --user-site` - python install.py -j 2 --build-type=Release --core-version 999999.999999 + python install.py -j 2 --build-type=Release --core-version 999999.999999 --allow-milps echo "PATH=${HOME}/.local/bin:$PATH" >> "$GITHUB_ENV" echo "LD_LIBRARY_PATH=${HOME}/.local/lib:${HOME}/.local/lib/cyclus:$LD_LIBRARY_PATH" >> "$GITHUB_ENV" diff --git a/CHANGELOG.rst b/CHANGELOG.rst index d428a5c734..d73a6fb8ad 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -36,7 +36,8 @@ Since last release * Issue #1312. (#1560) * fix sell_policy that was offering bids when capacity was inbetween 0 and the quantize, bids that one was not able to fullfill and caused cyclus to crash. (#1552) -* Deprecation warnings involving (#1611) +* Resolve deprecation warnings involving (#1611) +* Resolve segmentation faults when calling Cbc (#1614) diff --git a/CMakeLists.txt b/CMakeLists.txt index 646aa72154..f75cd66717 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -232,12 +232,10 @@ IF(NOT CYCLUS_DOC_ONLY) MESSAGE("-- Boost Serialization location: ${Boost_SERIALIZATION_LIBRARY}") # find coin and link to it - FIND_PACKAGE(COIN) - MESSAGE("-- COIN Version: ${COIN_VERSION}") - set(LIBS ${LIBS} ${COIN_LIBRARIES}) - if(NOT COIN_FOUND) - # no COIN, so no MILPs - set(DEFAULT_ALLOW_MILPS false) + if(DEFAULT_ALLOW_MILPS) + FIND_PACKAGE(COIN REQUIRED) + MESSAGE("-- COIN Version: ${COIN_VERSION}") + set(LIBS ${LIBS} ${COIN_LIBRARIES}) endif() # diff --git a/docker/Dockerfile b/docker/Dockerfile index 0bedf9d6a9..94b5746b15 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -122,7 +122,7 @@ WORKDIR /cyclus # You may add the option "--cmake-debug" to the following command # for further CMake debugging. -RUN python install.py -j ${make_cores} --build-type=Release --core-version 999999.999999 +RUN python install.py -j ${make_cores} --build-type=Release --core-version 999999.999999 --allow-milps ENV PATH /root/.local/bin:$PATH ENV LD_LIBRARY_PATH /root/.local/lib:/root/.local/lib/cyclus diff --git a/src/OsiCbcSolverInterface.cpp b/src/OsiCbcSolverInterface.cpp index fb7266d5a4..14bcae5a25 100644 --- a/src/OsiCbcSolverInterface.cpp +++ b/src/OsiCbcSolverInterface.cpp @@ -1,17 +1,7 @@ #include "CbcConfig.h" #include "OsiCbcSolverInterface.hpp" -// CBC_VERSION_MAJOR defined for Cbc > 2.5 -#ifndef CBC_VERSION_MAJOR -#include "OsiCbcSolverInterface_2_5.cpp" -#elif CBC_VERSION_MAJOR == 2 && CBC_VERSION_MINOR <= 8 -#include "OsiCbcSolverInterface_2_8.cpp" -#elif CBC_VERSION_MAJOR == 2 && CBC_VERSION_MINOR <= 10 #include "OsiCbcSolverInterface_2_10.cpp" -#else -#error "Cyclus cannot yet handle your version of CoinCBC. Please open an issue with your CoinCBC version." -#endif - // for some reason these symbol doesn't exist in the mac binaries // Those were also not present in condaforge/linux-anvil-comp7 docker container diff --git a/src/OsiCbcSolverInterface.hpp b/src/OsiCbcSolverInterface.hpp index 10d2a67ec5..a66c345f44 100644 --- a/src/OsiCbcSolverInterface.hpp +++ b/src/OsiCbcSolverInterface.hpp @@ -5,16 +5,6 @@ // headers in this file below this pragma have all warnings shushed #pragma GCC system_header - -// CBC_VERSION_MAJOR defined for Cbc > 2.5 -#ifndef CBC_VERSION_MAJOR -#include "OsiCbcSolverInterface_2_5.hpp" -#elif CBC_VERSION_MAJOR == 2 && CBC_VERSION_MINOR <= 8 -#include "OsiCbcSolverInterface_2_8.hpp" -#elif CBC_VERSION_MAJOR == 2 && CBC_VERSION_MINOR <= 10 #include "OsiCbcSolverInterface_2_10.hpp" -#else -#error "Cyclus cannot yet handle your version of CoinCBC. Please open an issue with your CoinCBC version." -#endif #endif diff --git a/src/OsiCbcSolverInterface_2_5.cpp b/src/OsiCbcSolverInterface_2_5.cpp deleted file mode 100644 index 6b8236288f..0000000000 --- a/src/OsiCbcSolverInterface_2_5.cpp +++ /dev/null @@ -1,895 +0,0 @@ -// $Id: OsiCbcSolverInterface.cpp 1902 2013-04-10 16:58:16Z stefan $ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#include - -#include "OsiConfig.h" -#include "CoinTime.hpp" - -#include "CoinHelperFunctions.hpp" -#include "CoinIndexedVector.hpp" - -/* - Default solver configuration: In any environment, clp is the default if you - do nothing. - - The necessary definitions will be handled by the configure script (based on - the value specified for --with-osicbc-default-solver) in any environment - where configure is available. The results can be found in inc/config_osi.h, - which is created during configuration from config_osi.h.in and placed - in the build directory. - - In an environment which does not use configure (MS Visual Studio, for example) - the preferred method is to edit the definitions in inc/OsiConfig.h. The - symbols are left undefined by default because some older environments (e.g., - MS Visual Studio v7 or earlier) will not accept an #include directive which - uses a macro to specify the file. In such an environment, if you want to use - a solver other than OsiClp, you'll need to make the changes here. -*/ - -#ifndef OSICBC_DFLT_SOLVER -#define OSICBC_DFLT_SOLVER OsiClpSolverInterface -#define OSICBC_CLP_DFLT_SOLVER -#include "OsiClpSolverInterface.hpp" -#else -#include OSICBC_DFLT_SOLVER_HPP -#endif - -#include "OsiCbcSolverInterface.hpp" -#include "OsiCuts.hpp" -#include "OsiRowCut.hpp" -#include "OsiColCut.hpp" -#ifdef OSICBC_CLP_DFLT_SOLVER -#include "ClpPresolve.hpp" -#endif -//############################################################################# -// Solve methods -//############################################################################# -void OsiCbcSolverInterface::initialSolve() -{ - agentPtr_->solver()->initialSolve(); -} - -//----------------------------------------------------------------------------- -void OsiCbcSolverInterface::resolve() -{ - agentPtr_->solver()->resolve(); -} -//############################################################################# -// Parameter related methods -//############################################################################# - -bool -OsiCbcSolverInterface::setIntParam(OsiIntParam key, int value) -{ - return agentPtr_->solver()->setIntParam(key,value);; -} - -//----------------------------------------------------------------------------- - -bool -OsiCbcSolverInterface::setDblParam(OsiDblParam key, double value) -{ - return agentPtr_->solver()->setDblParam(key,value); -} - -//----------------------------------------------------------------------------- - -bool -OsiCbcSolverInterface::setStrParam(OsiStrParam key, const std::string & value) -{ - return agentPtr_->solver()->setStrParam(key,value); -} - - -//----------------------------------------------------------------------------- - -bool -OsiCbcSolverInterface::getIntParam(OsiIntParam key, int& value) const -{ - return agentPtr_->solver()->getIntParam(key,value); -} - -//----------------------------------------------------------------------------- - -bool -OsiCbcSolverInterface::getDblParam(OsiDblParam key, double& value) const -{ - return agentPtr_->solver()->getDblParam(key,value); -} - -//----------------------------------------------------------------------------- - -bool -OsiCbcSolverInterface::getStrParam(OsiStrParam key, std::string & value) const -{ - if ( key==OsiSolverName ) { - std::string value2; - agentPtr_->solver()->getStrParam(key,value2); - value = "cbc"+value2; - return true; - } - return agentPtr_->solver()->getStrParam(key,value); -} - - -//############################################################################# -// Methods returning info on how the solution process terminated -//############################################################################# - -bool OsiCbcSolverInterface::isAbandoned() const -{ - return agentPtr_->solver()->isAbandoned(); -} - -bool OsiCbcSolverInterface::isProvenOptimal() const -{ - return agentPtr_->solver()->isProvenOptimal(); -} - -bool OsiCbcSolverInterface::isProvenPrimalInfeasible() const -{ - return agentPtr_->solver()->isProvenPrimalInfeasible(); -} - -bool OsiCbcSolverInterface::isProvenDualInfeasible() const -{ - return agentPtr_->solver()->isProvenDualInfeasible(); -} -bool OsiCbcSolverInterface::isPrimalObjectiveLimitReached() const -{ - return agentPtr_->solver()->isPrimalObjectiveLimitReached(); -} - -bool OsiCbcSolverInterface::isDualObjectiveLimitReached() const -{ - return agentPtr_->solver()->isDualObjectiveLimitReached(); -} - -bool OsiCbcSolverInterface::isIterationLimitReached() const -{ - return agentPtr_->solver()->isIterationLimitReached(); -} - -//############################################################################# -// WarmStart related methods -//############################################################################# -CoinWarmStart *OsiCbcSolverInterface::getEmptyWarmStart () const -{ - return agentPtr_->solver()->getEmptyWarmStart(); -} - -CoinWarmStart* OsiCbcSolverInterface::getWarmStart() const -{ - return agentPtr_->solver()->getWarmStart(); -} - -//----------------------------------------------------------------------------- - -bool OsiCbcSolverInterface::setWarmStart(const CoinWarmStart* warmstart) -{ - return agentPtr_->solver()->setWarmStart(warmstart); -} - -//############################################################################# -// Hotstart related methods (primarily used in strong branching) -//############################################################################# - -void OsiCbcSolverInterface::markHotStart() -{ - agentPtr_->solver()->markHotStart(); -} - -void OsiCbcSolverInterface::solveFromHotStart() -{ - agentPtr_->solver()->solveFromHotStart(); -} - -void OsiCbcSolverInterface::unmarkHotStart() -{ - agentPtr_->solver()->unmarkHotStart(); -} - -//############################################################################# -// Problem information methods (original data) -//############################################################################# - -//------------------------------------------------------------------ -const char * OsiCbcSolverInterface::getRowSense() const -{ - return agentPtr_->solver()->getRowSense(); -} -//------------------------------------------------------------------ -const double * OsiCbcSolverInterface::getRightHandSide() const -{ - return agentPtr_->solver()->getRightHandSide(); -} -//------------------------------------------------------------------ -const double * OsiCbcSolverInterface::getRowRange() const -{ - return agentPtr_->solver()->getRowRange(); -} -//------------------------------------------------------------------ -// Return information on integrality -//------------------------------------------------------------------ -bool OsiCbcSolverInterface::isContinuous(int colNumber) const -{ - return agentPtr_->solver()->isContinuous(colNumber); -} -//------------------------------------------------------------------ - -//------------------------------------------------------------------ -// Row and column copies of the matrix ... -//------------------------------------------------------------------ -const CoinPackedMatrix * OsiCbcSolverInterface::getMatrixByRow() const -{ - return agentPtr_->solver()->getMatrixByRow(); -} - -const CoinPackedMatrix * OsiCbcSolverInterface::getMatrixByCol() const -{ - return agentPtr_->solver()->getMatrixByCol(); -} - -//------------------------------------------------------------------ -std::vector OsiCbcSolverInterface::getDualRays(int maxNumRays) const -{ - return agentPtr_->solver()->getDualRays(maxNumRays); -} -//------------------------------------------------------------------ -std::vector OsiCbcSolverInterface::getPrimalRays(int maxNumRays) const -{ - return agentPtr_->solver()->getPrimalRays(maxNumRays); -} -//############################################################################# -void -OsiCbcSolverInterface::setContinuous(int index) -{ - agentPtr_->solver()->setContinuous(index); -} -//----------------------------------------------------------------------------- -void -OsiCbcSolverInterface::setInteger(int index) -{ - agentPtr_->solver()->setInteger(index); -} -//----------------------------------------------------------------------------- -void -OsiCbcSolverInterface::setContinuous(const int* indices, int len) -{ - agentPtr_->solver()->setContinuous(indices,len); -} -//----------------------------------------------------------------------------- -void -OsiCbcSolverInterface::setInteger(const int* indices, int len) -{ - agentPtr_->solver()->setInteger(indices,len); -} -//----------------------------------------------------------------------------- -void OsiCbcSolverInterface::setColSolution(const double * cs) -{ - agentPtr_->solver()->setColSolution(cs); -} -//----------------------------------------------------------------------------- -void OsiCbcSolverInterface::setRowPrice(const double * rs) -{ - agentPtr_->solver()->setRowPrice(rs); -} - -//############################################################################# -// Problem modifying methods (matrix) -//############################################################################# -void -OsiCbcSolverInterface::addCol(const CoinPackedVectorBase& vec, - const double collb, const double colub, - const double obj) -{ - agentPtr_->solver()->addCol(vec,collb,colub,obj); -} -/* Add a column (primal variable) to the problem. */ -void -OsiCbcSolverInterface::addCol(int numberElements, const int * rows, const double * elements, - const double collb, const double colub, - const double obj) -{ - agentPtr_->solver()->addCol(numberElements, rows, elements, - collb,colub,obj); -} -//----------------------------------------------------------------------------- -void -OsiCbcSolverInterface::addCols(const int numcols, - const CoinPackedVectorBase * const * cols, - const double* collb, const double* colub, - const double* obj) -{ - agentPtr_->solver()->addCols(numcols,cols,collb,colub,obj); -} -//----------------------------------------------------------------------------- -void -OsiCbcSolverInterface::deleteCols(const int num, const int * columnIndices) -{ - agentPtr_->solver()->deleteCols(num,columnIndices); -} -//----------------------------------------------------------------------------- -void -OsiCbcSolverInterface::addRow(const CoinPackedVectorBase& vec, - const double rowlb, const double rowub) -{ - agentPtr_->solver()->addRow(vec,rowlb,rowub); -} -//----------------------------------------------------------------------------- -void -OsiCbcSolverInterface::addRow(const CoinPackedVectorBase& vec, - const char rowsen, const double rowrhs, - const double rowrng) -{ - agentPtr_->solver()->addRow(vec,rowsen,rowrhs,rowrng); -} -//----------------------------------------------------------------------------- -void -OsiCbcSolverInterface::addRows(const int numrows, - const CoinPackedVectorBase * const * rows, - const double* rowlb, const double* rowub) -{ - agentPtr_->solver()->addRows(numrows,rows,rowlb,rowub); -} -//----------------------------------------------------------------------------- -void -OsiCbcSolverInterface::addRows(const int numrows, - const CoinPackedVectorBase * const * rows, - const char* rowsen, const double* rowrhs, - const double* rowrng) -{ - agentPtr_->solver()->addRows(numrows,rows,rowsen,rowrhs,rowrng); -} -//----------------------------------------------------------------------------- -void -OsiCbcSolverInterface::deleteRows(const int num, const int * rowIndices) -{ - agentPtr_->solver()->deleteRows(num,rowIndices); -} - -//############################################################################# -// Methods to input a problem -//############################################################################# - -void -OsiCbcSolverInterface::loadProblem(const CoinPackedMatrix& matrix, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub) -{ - agentPtr_->solver()->loadProblem(matrix,collb,colub,obj,rowlb,rowub); -} - -//----------------------------------------------------------------------------- - -void -OsiCbcSolverInterface::assignProblem(CoinPackedMatrix*& matrix, - double*& collb, double*& colub, - double*& obj, - double*& rowlb, double*& rowub) -{ - agentPtr_->solver()->assignProblem(matrix,collb,colub,obj,rowlb,rowub); -} - -//----------------------------------------------------------------------------- - -void -OsiCbcSolverInterface::loadProblem(const CoinPackedMatrix& matrix, - const double* collb, const double* colub, - const double* obj, - const char* rowsen, const double* rowrhs, - const double* rowrng) -{ - agentPtr_->solver()->loadProblem(matrix,collb,colub,obj,rowsen,rowrhs,rowrng); -} - -//----------------------------------------------------------------------------- - -void -OsiCbcSolverInterface::assignProblem(CoinPackedMatrix*& matrix, - double*& collb, double*& colub, - double*& obj, - char*& rowsen, double*& rowrhs, - double*& rowrng) -{ - agentPtr_->solver()->assignProblem(matrix,collb,colub,obj,rowsen,rowrhs,rowrng); -} - -//----------------------------------------------------------------------------- - -void -OsiCbcSolverInterface::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) -{ - agentPtr_->solver()->loadProblem(numcols,numrows,start,index,value, - collb,colub,obj,rowlb,rowub); -} -//----------------------------------------------------------------------------- - -void -OsiCbcSolverInterface::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) -{ - agentPtr_->solver()->loadProblem(numcols,numrows,start,index,value, - collb,colub,obj,rowsen,rowrhs,rowrng); -} - -//----------------------------------------------------------------------------- -// Write mps files -//----------------------------------------------------------------------------- - -void OsiCbcSolverInterface::writeMps(const char * filename, - const char * extension, - double objSense) const -{ - agentPtr_->solver()->writeMps(filename,extension,objSense); -} - -int -OsiCbcSolverInterface::writeMpsNative(const char *filename, - const char ** rowNames, const char ** columnNames, - int formatType,int numberAcross,double objSense) const -{ - return agentPtr_->solver()->writeMpsNative(filename, rowNames, columnNames, - formatType, numberAcross,objSense); -} - -//############################################################################# -// Constructors, destructors clone and assignment -//############################################################################# -//------------------------------------------------------------------- -// Default Constructor -//------------------------------------------------------------------- -OsiCbcSolverInterface::OsiCbcSolverInterface (OsiSolverInterface * solver, - CbcStrategy * strategy) -: -OsiSolverInterface() -{ - if (solver) { - agentPtr_=new CbcModel(*solver); - } else { - OSICBC_DFLT_SOLVER solverDflt; - agentPtr_=new CbcModel(solverDflt); - } - if (strategy) { - agentPtr_->setStrategy(*strategy); - } else { - CbcStrategyDefault defaultStrategy; - agentPtr_->setStrategy(defaultStrategy); - } -} - -//------------------------------------------------------------------- -// Clone -//------------------------------------------------------------------- -OsiSolverInterface * OsiCbcSolverInterface::clone(bool CopyData) const -{ - if (CopyData) { - return new OsiCbcSolverInterface(*this); - } else { - return new OsiCbcSolverInterface(); - } -} - - -//------------------------------------------------------------------- -// Copy constructor -//------------------------------------------------------------------- -OsiCbcSolverInterface::OsiCbcSolverInterface ( - const OsiCbcSolverInterface & rhs) -: -OsiSolverInterface(rhs) -{ - assert (rhs.agentPtr_); - agentPtr_ = new CbcModel(*rhs.agentPtr_); -} - - -//------------------------------------------------------------------- -// Destructor -//------------------------------------------------------------------- -OsiCbcSolverInterface::~OsiCbcSolverInterface () -{ - delete agentPtr_; -} - -//------------------------------------------------------------------- -// Assignment operator -//------------------------------------------------------------------- -OsiCbcSolverInterface & -OsiCbcSolverInterface::operator=(const OsiCbcSolverInterface& rhs) -{ - if (this != &rhs) { - OsiSolverInterface::operator=(rhs); - delete agentPtr_; - agentPtr_=new CbcModel(*rhs.agentPtr_); - } - return *this; -} - -//############################################################################# -// Applying cuts -//############################################################################# - -void OsiCbcSolverInterface::applyRowCut( const OsiRowCut & rowCut ) -{ - agentPtr_->solver()->applyRowCuts(1,&rowCut); -} -/* Apply a collection of row cuts which are all effective. - applyCuts seems to do one at a time which seems inefficient. -*/ -void -OsiCbcSolverInterface::applyRowCuts(int numberCuts, const OsiRowCut * cuts) -{ - agentPtr_->solver()->applyRowCuts(numberCuts,cuts); -} -/* Apply a collection of row cuts which are all effective. - applyCuts seems to do one at a time which seems inefficient. -*/ -void -OsiCbcSolverInterface::applyRowCuts(int numberCuts, const OsiRowCut ** cuts) -{ - agentPtr_->solver()->applyRowCuts(numberCuts, cuts); -} -//----------------------------------------------------------------------------- - -void OsiCbcSolverInterface::applyColCut( const OsiColCut & cc ) -{ - const double * lower = agentPtr_->solver()->getColLower(); - const double * upper = agentPtr_->solver()->getColUpper(); - const CoinPackedVector & lbs = cc.lbs(); - const CoinPackedVector & ubs = cc.ubs(); - int i; - - for ( i=0; i lower[iCol] ) - agentPtr_->solver()->setColLower(iCol, value); - } - for ( i=0; isolver()->setColUpper(iCol, value); - } -} -/* Read an mps file from the given filename (defaults to Osi reader) - returns - number of errors (see OsiMpsReader class) */ -int -OsiCbcSolverInterface::readMps(const char *filename, - const char *extension ) -{ - return agentPtr_->solver()->readMps(filename,extension); -} -// Get pointer to array[getNumCols()] of primal solution vector -const double * -OsiCbcSolverInterface::getColSolution() const -{ - return agentPtr_->solver()->getColSolution(); -} - -// Get pointer to array[getNumRows()] of dual prices -const double * -OsiCbcSolverInterface::getRowPrice() const -{ - return agentPtr_->solver()->getRowPrice(); -} - -// Get a pointer to array[getNumCols()] of reduced costs -const double * -OsiCbcSolverInterface::getReducedCost() const -{ - return agentPtr_->solver()->getReducedCost(); -} - -/* Get pointer to array[getNumRows()] of row activity levels (constraint - matrix times the solution vector */ -const double * -OsiCbcSolverInterface::getRowActivity() const -{ - return agentPtr_->solver()->getRowActivity(); -} -double -OsiCbcSolverInterface::getObjValue() const -{ - return agentPtr_->solver()->getObjValue(); -} - -/* Set an objective function coefficient */ -void -OsiCbcSolverInterface::setObjCoeff( int elementIndex, double elementValue ) -{ - agentPtr_->solver()->setObjCoeff(elementIndex,elementValue); -} - -/* Set a single column lower bound
- Use -DBL_MAX for -infinity. */ -void -OsiCbcSolverInterface::setColLower( int elementIndex, double elementValue ) -{ - agentPtr_->solver()->setColLower(elementIndex,elementValue); -} - -/* Set a single column upper bound
- Use DBL_MAX for infinity. */ -void -OsiCbcSolverInterface::setColUpper( int elementIndex, double elementValue ) -{ - agentPtr_->solver()->setColUpper(elementIndex,elementValue); -} - -/* Set a single column lower and upper bound */ -void -OsiCbcSolverInterface::setColBounds( int elementIndex, - double lower, double upper ) -{ - agentPtr_->solver()->setColBounds(elementIndex,lower,upper); -} -void OsiCbcSolverInterface::setColSetBounds(const int* indexFirst, - const int* indexLast, - const double* boundList) -{ - agentPtr_->solver()->setColSetBounds(indexFirst,indexLast,boundList); -} -//------------------------------------------------------------------ -/* Set a single row lower bound
- Use -DBL_MAX for -infinity. */ -void -OsiCbcSolverInterface::setRowLower( int elementIndex, double elementValue ) { - agentPtr_->solver()->setRowLower(elementIndex,elementValue); -} - -/* Set a single row upper bound
- Use DBL_MAX for infinity. */ -void -OsiCbcSolverInterface::setRowUpper( int elementIndex, double elementValue ) { - agentPtr_->solver()->setRowUpper(elementIndex,elementValue); -} - -/* Set a single row lower and upper bound */ -void -OsiCbcSolverInterface::setRowBounds( int elementIndex, - double lower, double upper ) { - agentPtr_->solver()->setRowBounds(elementIndex,lower,upper); -} -//----------------------------------------------------------------------------- -void -OsiCbcSolverInterface::setRowType(int i, char sense, double rightHandSide, - double range) -{ - agentPtr_->solver()->setRowType(i,sense,rightHandSide,range); -} -//----------------------------------------------------------------------------- -void OsiCbcSolverInterface::setRowSetBounds(const int* indexFirst, - const int* indexLast, - const double* boundList) -{ - agentPtr_->solver()->setRowSetBounds(indexFirst,indexLast,boundList); -} -//----------------------------------------------------------------------------- -void -OsiCbcSolverInterface::setRowSetTypes(const int* indexFirst, - const int* indexLast, - const char* senseList, - const double* rhsList, - const double* rangeList) -{ - agentPtr_->solver()->setRowSetTypes(indexFirst,indexLast,senseList,rhsList,rangeList); -} -// Set a hint parameter -bool -OsiCbcSolverInterface::setHintParam(OsiHintParam key, bool yesNo, - OsiHintStrength strength, - void * otherInformation) -{ - return agentPtr_->solver()->setHintParam(key,yesNo, strength, otherInformation); -} - -// Get a hint parameter -bool -OsiCbcSolverInterface::getHintParam(OsiHintParam key, bool & yesNo, - OsiHintStrength & strength, - void *& otherInformation) const -{ - return agentPtr_->solver()->getHintParam(key,yesNo, strength, otherInformation); -} - -// Get a hint parameter -bool -OsiCbcSolverInterface::getHintParam(OsiHintParam key, bool & yesNo, - OsiHintStrength & strength) const -{ - return agentPtr_->solver()->getHintParam(key,yesNo, strength); -} - - -int -OsiCbcSolverInterface::getNumCols() const -{ - return agentPtr_->solver()->getNumCols(); -} -int -OsiCbcSolverInterface::getNumRows() const -{ - return agentPtr_->solver()->getNumRows(); -} -int -OsiCbcSolverInterface::getNumElements() const -{ - return agentPtr_->solver()->getNumElements(); -} -const double * -OsiCbcSolverInterface::getColLower() const -{ - return agentPtr_->solver()->getColLower(); -} -const double * -OsiCbcSolverInterface::getColUpper() const -{ - return agentPtr_->solver()->getColUpper(); -} -const double * -OsiCbcSolverInterface::getRowLower() const -{ - return agentPtr_->solver()->getRowLower(); -} -const double * -OsiCbcSolverInterface::getRowUpper() const -{ - return agentPtr_->solver()->getRowUpper(); -} -const double * -OsiCbcSolverInterface::getObjCoefficients() const -{ - return agentPtr_->solver()->getObjCoefficients(); -} -double -OsiCbcSolverInterface::getObjSense() const -{ - return agentPtr_->solver()->getObjSense(); -} -double -OsiCbcSolverInterface::getInfinity() const -{ - return agentPtr_->solver()->getInfinity(); -} -int -OsiCbcSolverInterface::getIterationCount() const -{ - return agentPtr_->solver()->getIterationCount(); -} -void -OsiCbcSolverInterface::setObjSense(double s ) -{ - agentPtr_->setObjSense(s); -} -// Invoke solver's built-in enumeration algorithm -void -OsiCbcSolverInterface::branchAndBound() -{ - *messageHandler() << "Warning: Use of OsiCbc is deprecated." << CoinMessageEol; - *messageHandler() << "To enjoy the full performance of Cbc, use the CbcSolver interface." << CoinMessageEol; - agentPtr_->branchAndBound(); -} - -/* - Name discipline support -- lh, 070328 -- - - For safety, there's really nothing to it but to pass each call of an impure - virtual method on to the underlying solver. Otherwise we just can't know if - it's been overridden or not. -*/ - -std::string -OsiCbcSolverInterface::dfltRowColName (char rc, int ndx, unsigned digits) const -{ - return (agentPtr_->solver()->dfltRowColName(rc,ndx,digits)) ; -} - -std::string OsiCbcSolverInterface::getObjName (unsigned maxLen) const -{ - return (agentPtr_->solver()->getObjName(maxLen)) ; -} - -std::string OsiCbcSolverInterface::getRowName (int ndx, unsigned maxLen) const -{ - return (agentPtr_->solver()->getRowName(ndx,maxLen)) ; -} - -const OsiSolverInterface::OsiNameVec &OsiCbcSolverInterface::getRowNames () -{ - return (agentPtr_->solver()->getRowNames()) ; -} - -std::string OsiCbcSolverInterface::getColName (int ndx, unsigned maxLen) const -{ - return (agentPtr_->solver()->getColName(ndx,maxLen)) ; -} - -const OsiSolverInterface::OsiNameVec &OsiCbcSolverInterface::getColNames () -{ - return (agentPtr_->solver()->getColNames()) ; -} - -void OsiCbcSolverInterface::setRowNames (OsiNameVec &srcNames, - int srcStart, int len, int tgtStart) -{ - agentPtr_->solver()->setRowNames(srcNames,srcStart,len,tgtStart) ; -} - -void OsiCbcSolverInterface::deleteRowNames (int tgtStart, int len) -{ - agentPtr_->solver()->deleteRowNames(tgtStart,len) ; -} - -void OsiCbcSolverInterface::setColNames (OsiNameVec &srcNames, - int srcStart, int len, int tgtStart) -{ - agentPtr_->solver()->setColNames(srcNames,srcStart,len,tgtStart) ; -} - -void OsiCbcSolverInterface::deleteColNames (int tgtStart, int len) -{ - agentPtr_->solver()->deleteColNames(tgtStart,len) ; -} - -/* - These last three are the only functions that would normally be overridden. -*/ - -/* - Set objective function name. -*/ -void OsiCbcSolverInterface::setObjName (std::string name) -{ - agentPtr_->solver()->setObjName(name) ; -} - -/* - Set a row name, to make sure both the solver and OSI see the same name. -*/ -void OsiCbcSolverInterface::setRowName (int ndx, std::string name) - -{ - agentPtr_->solver()->setRowName(ndx,name) ; -} - -/* - Set a column name, to make sure both the solver and OSI see the same name. -*/ -void OsiCbcSolverInterface::setColName (int ndx, std::string name) - -{ - agentPtr_->solver()->setColName(ndx,name) ; -} -// Pass in Message handler (not deleted at end) -void -OsiCbcSolverInterface::passInMessageHandler(CoinMessageHandler * handler) -{ - OsiSolverInterface::passInMessageHandler(handler); - if (agentPtr_) - agentPtr_->passInMessageHandler(handler); -} -// So unit test can find out if NDEBUG set -bool OsiCbcHasNDEBUG() -{ -#ifdef NDEBUG - return true; -#else - return false; -#endif -} diff --git a/src/OsiCbcSolverInterface_2_5.hpp b/src/OsiCbcSolverInterface_2_5.hpp deleted file mode 100644 index a6cf2755a8..0000000000 --- a/src/OsiCbcSolverInterface_2_5.hpp +++ /dev/null @@ -1,767 +0,0 @@ -// $Id: OsiCbcSolverInterface.hpp 1902 2013-04-10 16:58:16Z stefan $ -// 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 OsiCbcSolverInterface_2_5_HPP -#define OsiCbcSolverInterface_2_5_HPP - -#include -#include -#include -#include "CbcModel.hpp" -#include "CoinPackedMatrix.hpp" -#include "OsiSolverInterface.hpp" -#include "CbcStrategy.hpp" -#include "CoinWarmStartBasis.hpp" - -class OsiRowCut; -class OsiClpSolverInterface; -static const double OsiCbcInfinity = COIN_DBL_MAX; - -//############################################################################# - -/** Cbc Solver Interface - -Instantiation of OsiCbcSolverInterface for the Agent Algorithm. - -*/ - -class OsiCbcSolverInterface : - virtual public OsiSolverInterface { - friend void OsiCbcSolverInterfaceUnitTest(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(); - - /// Invoke solver's built-in enumeration algorithm - virtual void branchAndBound(); - //@} - - //--------------------------------------------------------------------------- - /**@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 cbc 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); - /// Get a hint parameter - virtual bool getHintParam(OsiHintParam key, bool& yesNo, - OsiHintStrength& strength, - void *& otherInformation) const; - - using OsiSolverInterface::getHintParam ; - /// Get a hint parameter - virtual bool getHintParam(OsiHintParam key, bool& yesNo, - OsiHintStrength& strength) const; - //@} - - //--------------------------------------------------------------------------- - ///@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; - /** Set warmstarting information. Return true/false depending on whether - the warmstart information was accepted or not. */ - virtual bool setWarmStart(const CoinWarmStart* warmstart); - //@} - - //--------------------------------------------------------------------------- - /**@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.
- NOTE: 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(); - //@} - - //--------------------------------------------------------------------------- - /**@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; - - /// Get number of rows - virtual int getNumRows() const; - - /// Get number of nonzero elements - virtual int getNumElements() const ; - - /// Get pointer to array[getNumCols()] of column lower bounds - virtual const double * getColLower() const; - - /// Get pointer to array[getNumCols()] of column upper bounds - virtual const double * getColUpper() const; - - /** Get pointer to array[getNumRows()] of row constraint senses. -
    -
  • 'L' <= constraint -
  • 'E' = constraint -
  • 'G' >= constraint -
  • 'R' ranged constraint -
  • 'N' free constraint -
- */ - virtual const char * getRowSense() const; - - /** Get pointer to array[getNumRows()] of rows right-hand sides -
    -
  • if rowsense()[i] == 'L' then rhs()[i] == rowupper()[i] -
  • if rowsense()[i] == 'G' then rhs()[i] == rowlower()[i] -
  • if rowsense()[i] == 'R' then rhs()[i] == rowupper()[i] -
  • if rowsense()[i] == 'N' then rhs()[i] == 0.0 -
- */ - virtual const double * getRightHandSide() const ; - - /** Get pointer to array[getNumRows()] of row ranges. -
    -
  • if rowsense()[i] == 'R' then - rowrange()[i] == rowupper()[i] - rowlower()[i] -
  • if rowsense()[i] != 'R' then - rowrange()[i] is undefined -
- */ - virtual const double * getRowRange() const ; - - /// Get pointer to array[getNumRows()] of row lower bounds - virtual const double * getRowLower() const ; - - /// Get pointer to array[getNumRows()] of row upper bounds - virtual const double * getRowUpper() const ; - - /// Get pointer to array[getNumCols()] of objective function coefficients - virtual const double * getObjCoefficients() const; - - /// Get objective function sense (1 for min (default), -1 for max) - virtual double getObjSense() const ; - - /// Return true if column is continuous - virtual bool isContinuous(int colNumber) const; - - - /// 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 solver's value for infinity - virtual double getInfinity() const; - //@} - - /**@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 ; - - /** 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. - - NOTE for implementers of solver interfaces:
- The double pointers in the vector should point to arrays of length - getNumRows() and they should be allocated via new[].
- - NOTE for users of solver interfaces:
- It is the user's responsibility to free the double pointers in the - vector using delete[]. - */ - // virtual std::vector getDualRays(int maxNumRays, - // bool fullRay = false) const; - // signature change to be compatible with current apt-get version - virtual std::vector getDualRays(int maxNumRays) const; - - /** Get as many primal rays as the solver can provide. (In case of proven - dual infeasibility there should be at least one.) - - NOTE for implementers of solver interfaces:
- The double pointers in the vector should point to arrays of length - getNumCols() and they should be allocated via new[].
- - NOTE for users of solver interfaces:
- It is the user's responsibility to free the double pointers in the - vector using delete[]. - */ - virtual std::vector getPrimalRays(int maxNumRays) const; - - //@} - - /*! \name Methods for row and column names. - - Because OsiCbc is a pass-through class, it's necessary to override any - virtual method in order to be sure we catch an override by the underlying - solver. See the OsiSolverInterface class documentation for detailed - descriptions. - */ - //@{ - - /*! \brief Generate a standard name of the form Rnnnnnnn or Cnnnnnnn */ - - virtual std::string dfltRowColName(char rc, - int ndx, unsigned digits = 7) const ; - - /*! \brief Return the name of the objective function */ - - virtual std::string getObjName (unsigned maxLen = std::string::npos) const ; - - /*! \brief Set the name of the objective function */ - - virtual void setObjName (std::string name) ; - - /*! \brief Return the name of the row. */ - - virtual std::string getRowName(int rowIndex, - unsigned maxLen = std::string::npos) const ; - - /*! \brief Return a pointer to a vector of row names */ - - virtual const OsiNameVec &getRowNames() ; - - /*! \brief Set a row name */ - - virtual void setRowName(int ndx, std::string name) ; - - /*! \brief Set multiple row names */ - - virtual void setRowNames(OsiNameVec &srcNames, - int srcStart, int len, int tgtStart) ; - - /*! \brief Delete len row names starting at index tgtStart */ - - virtual void deleteRowNames(int tgtStart, int len) ; - - /*! \brief Return the name of the column */ - - virtual std::string getColName(int colIndex, - unsigned maxLen = std::string::npos) const ; - - /*! \brief Return a pointer to a vector of column names */ - - virtual const OsiNameVec &getColNames() ; - - /*! \brief Set a column name */ - - virtual void setColName(int ndx, std::string name) ; - - /*! \brief Set multiple column names */ - - virtual void setColNames(OsiNameVec &srcNames, - int srcStart, int len, int tgtStart) ; - - /*! \brief Delete len column names starting at index tgtStart */ - virtual void deleteColNames(int tgtStart, int len) ; - - //@} - - //@} - - //--------------------------------------------------------------------------- - - /**@name Problem modifying methods */ - //@{ - //------------------------------------------------------------------------- - /**@name Changing bounds on variables and constraints */ - //@{ - /** Set an objective function coefficient */ - virtual void setObjCoeff( int elementIndex, double elementValue ); - - using OsiSolverInterface::setColLower ; - /** Set a single column lower bound
- Use -DBL_MAX for -infinity. */ - virtual void setColLower( int elementIndex, double elementValue ); - - using OsiSolverInterface::setColUpper ; - /** Set a single column upper bound
- 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
- 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 - either 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
- Use -DBL_MAX for -infinity. */ - virtual void setRowLower( int elementIndex, double elementValue ); - - /** Set a single row upper bound
- 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
*/ - virtual void setRowType(int index, char sense, double rightHandSide, - double range); - - /** Set the bounds on a number of rows simultaneously
- 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 - either 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
- 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 - any 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); - //@} - - //------------------------------------------------------------------------- - /**@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); - //@} - - //------------------------------------------------------------------------- - /// Set objective function sense (1 for min (default), -1 for max,) - virtual void setObjSense(double s ); - - /** 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.
- 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); - /** 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) ; - - using OsiSolverInterface::addCols ; - /** */ - virtual void addCols(const int numcols, - const CoinPackedVectorBase * const * cols, - const double* collb, const double* colub, - const double* obj); - /** */ - virtual void deleteCols(const int num, const int * colIndices); - - using OsiSolverInterface::addRow ; - /** */ - virtual void addRow(const CoinPackedVectorBase& vec, - const double rowlb, const double rowub); - /** */ - virtual void addRow(const CoinPackedVectorBase& vec, - const char rowsen, const double rowrhs, - const double rowrng); - - using OsiSolverInterface::addRows ; - /** */ - 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 deleteRows(const int num, const int * rowIndices); - - //----------------------------------------------------------------------- - /** 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); - //@} - //@} - - //--------------------------------------------------------------------------- - -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 0 then the - following values are the default: -
    -
  • colub: all columns have upper bound infinity -
  • collb: all columns have lower bound 0 -
  • rowub: all rows have upper bound infinity -
  • rowlb: all rows have lower bound -infinity -
  • obj: all variables have 0 objective coefficient -
- */ - 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.
- WARNING: The arguments passed to this method will be - freed using the C++ delete and delete[] - 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 0 then the - following values are the default: -
    -
  • colub: all columns have upper bound infinity -
  • collb: all columns have lower bound 0 -
  • obj: all variables have 0 objective coefficient -
  • rowsen: all rows are >= -
  • rowrhs: all right hand sides are 0 -
  • rowrng: 0 for the ranged rows -
- */ - 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.
- WARNING: The arguments passed to this method will be - freed using the C++ delete and delete[] - 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 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); - - 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") ; - - /** 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 ; - //@} - - /**@name Message handling (extra for Cbc messages). - Normally I presume you would want the same language. - If not then you could use underlying agent pointer */ - //@{ - /// Set language - void newLanguage(CoinMessages::Language language); - void setLanguage(CoinMessages::Language language) - {newLanguage(language);} - //@} - //--------------------------------------------------------------------------- - - /**@name Cbc specific public interfaces */ - //@{ - /// Get pointer to Cbc agent - inline CbcModel * getAgentPtr() const - { return agentPtr_;} - /// Get pointer to underlying solver - inline OsiSolverInterface * getRealSolverPtr() const - { return agentPtr_->solver();} - /// Set cutoff bound on the objective function. - inline void setCutoff(double value) - { agentPtr_->setCutoff(value);} - /// Get the cutoff bound on the objective function - always as minimize - inline double getCutoff() const - { return agentPtr_->getCutoff();} - /// Set the CbcModel::CbcMaxNumNode maximum node limit - inline void setMaximumNodes( int value) - { agentPtr_->setMaximumNodes(value);} - /// Get the CbcModel::CbcMaxNumNode maximum node limit - inline int getMaximumNodes() const - { return agentPtr_->getMaximumNodes();} - /// Set the CbcModel::CbcMaxNumSol maximum number of solutions - inline void setMaximumSolutions( int value) - { agentPtr_->setMaximumSolutions(value);} - /// Get the CbcModel::CbcMaxNumSol maximum number of solutions - inline int getMaximumSolutions() const - { return agentPtr_->getMaximumSolutions();} - /// Set the CbcModel::CbcMaximumSeconds maximum number of seconds - inline void setMaximumSeconds( double value) - { agentPtr_->setMaximumSeconds(value);} - /// Get the CbcModel::CbcMaximumSeconds maximum number of seconds - inline double getMaximumSeconds() const - { return agentPtr_->getMaximumSeconds();} - /// Node limit reached? - inline bool isNodeLimitReached() const - { return agentPtr_->isNodeLimitReached();} - /// Solution limit reached? - inline bool isSolutionLimitReached() const - { return agentPtr_->isSolutionLimitReached();} - /// Get how many Nodes it took to solve the problem. - inline int getNodeCount() const - { return agentPtr_->getNodeCount();} - /// Final status of problem - 0 finished, 1 stopped, 2 difficulties - inline int status() const - { return agentPtr_->status();} - /** 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); - //@} - - //--------------------------------------------------------------------------- - - /**@name Constructors and destructors */ - //@{ - /// Default Constructor - OsiCbcSolverInterface (OsiSolverInterface * solver=NULL, - CbcStrategy * strategy=NULL); - - /// Clone - virtual OsiSolverInterface * clone(bool copyData = true) const; - - /// Copy constructor - OsiCbcSolverInterface (const OsiCbcSolverInterface &); -#if 0 - /// Borrow constructor - only delete one copy - OsiCbcSolverInterface (CbcModel * rhs, bool reallyOwn=false); - - /// Releases so won't error - void releaseCbc(); -#endif - /// Assignment operator - OsiCbcSolverInterface & operator=(const OsiCbcSolverInterface& rhs); - - /// Destructor - virtual ~OsiCbcSolverInterface (); - - //@} - //--------------------------------------------------------------------------- - -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); - //@} - /**@name Protected member data */ - //@{ - /// Cbc agent represented by this class instance - mutable CbcModel * agentPtr_; - //@} -}; -// So unit test can find out if NDEBUG set -bool OsiCbcHasNDEBUG(); - -//############################################################################# -/** A function that tests the methods in the OsiCbcSolverInterface class. */ -void OsiCbcSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir); - -#endif diff --git a/src/OsiCbcSolverInterface_2_8.cpp b/src/OsiCbcSolverInterface_2_8.cpp deleted file mode 100644 index a798c01b97..0000000000 --- a/src/OsiCbcSolverInterface_2_8.cpp +++ /dev/null @@ -1,896 +0,0 @@ -// $Id: OsiCbcSolverInterface.cpp 1902 2013-04-10 16:58:16Z stefan $ -// Copyright (C) 2002, International Business Machines -// Corporation and others. All Rights Reserved. -// This code is licensed under the terms of the Eclipse Public License (EPL). - -#include - -#include "OsiConfig.h" -#include "CoinTime.hpp" - -#include "CoinHelperFunctions.hpp" -#include "CoinIndexedVector.hpp" - -/* - Default solver configuration: In any environment, clp is the default if you - do nothing. - - The necessary definitions will be handled by the configure script (based on - the value specified for --with-osicbc-default-solver) in any environment - where configure is available. The results can be found in inc/config_osi.h, - which is created during configuration from config_osi.h.in and placed - in the build directory. - - In an environment which does not use configure (MS Visual Studio, for example) - the preferred method is to edit the definitions in inc/OsiConfig.h. The - symbols are left undefined by default because some older environments (e.g., - MS Visual Studio v7 or earlier) will not accept an #include directive which - uses a macro to specify the file. In such an environment, if you want to use - a solver other than OsiClp, you'll need to make the changes here. -*/ - -#ifndef OSICBC_DFLT_SOLVER -#define OSICBC_DFLT_SOLVER OsiClpSolverInterface -#define OSICBC_CLP_DFLT_SOLVER -#include "OsiClpSolverInterface.hpp" -#else -#include OSICBC_DFLT_SOLVER_HPP -#endif - -#include "OsiCbcSolverInterface.hpp" -#include "OsiCuts.hpp" -#include "OsiRowCut.hpp" -#include "OsiColCut.hpp" -#ifdef OSICBC_CLP_DFLT_SOLVER -#include "ClpPresolve.hpp" -#endif -//############################################################################# -// Solve methods -//############################################################################# -void OsiCbcSolverInterface::initialSolve() -{ - modelPtr_->solver()->initialSolve(); -} - -//----------------------------------------------------------------------------- -void OsiCbcSolverInterface::resolve() -{ - modelPtr_->solver()->resolve(); -} -//############################################################################# -// Parameter related methods -//############################################################################# - -bool -OsiCbcSolverInterface::setIntParam(OsiIntParam key, int value) -{ - return modelPtr_->solver()->setIntParam(key,value);; -} - -//----------------------------------------------------------------------------- - -bool -OsiCbcSolverInterface::setDblParam(OsiDblParam key, double value) -{ - return modelPtr_->solver()->setDblParam(key,value); -} - -//----------------------------------------------------------------------------- - -bool -OsiCbcSolverInterface::setStrParam(OsiStrParam key, const std::string & value) -{ - return modelPtr_->solver()->setStrParam(key,value); -} - - -//----------------------------------------------------------------------------- - -bool -OsiCbcSolverInterface::getIntParam(OsiIntParam key, int& value) const -{ - return modelPtr_->solver()->getIntParam(key,value); -} - -//----------------------------------------------------------------------------- - -bool -OsiCbcSolverInterface::getDblParam(OsiDblParam key, double& value) const -{ - return modelPtr_->solver()->getDblParam(key,value); -} - -//----------------------------------------------------------------------------- - -bool -OsiCbcSolverInterface::getStrParam(OsiStrParam key, std::string & value) const -{ - if ( key==OsiSolverName ) { - std::string value2; - modelPtr_->solver()->getStrParam(key,value2); - value = "cbc"+value2; - return true; - } - return modelPtr_->solver()->getStrParam(key,value); -} - - -//############################################################################# -// Methods returning info on how the solution process terminated -//############################################################################# - -bool OsiCbcSolverInterface::isAbandoned() const -{ - return modelPtr_->solver()->isAbandoned(); -} - -bool OsiCbcSolverInterface::isProvenOptimal() const -{ - return modelPtr_->solver()->isProvenOptimal(); -} - -bool OsiCbcSolverInterface::isProvenPrimalInfeasible() const -{ - return modelPtr_->solver()->isProvenPrimalInfeasible(); -} - -bool OsiCbcSolverInterface::isProvenDualInfeasible() const -{ - return modelPtr_->solver()->isProvenDualInfeasible(); -} -bool OsiCbcSolverInterface::isPrimalObjectiveLimitReached() const -{ - return modelPtr_->solver()->isPrimalObjectiveLimitReached(); -} - -bool OsiCbcSolverInterface::isDualObjectiveLimitReached() const -{ - return modelPtr_->solver()->isDualObjectiveLimitReached(); -} - -bool OsiCbcSolverInterface::isIterationLimitReached() const -{ - return modelPtr_->solver()->isIterationLimitReached(); -} - -//############################################################################# -// WarmStart related methods -//############################################################################# -CoinWarmStart *OsiCbcSolverInterface::getEmptyWarmStart () const -{ - return modelPtr_->solver()->getEmptyWarmStart(); -} - -CoinWarmStart* OsiCbcSolverInterface::getWarmStart() const -{ - return modelPtr_->solver()->getWarmStart(); -} - -//----------------------------------------------------------------------------- - -bool OsiCbcSolverInterface::setWarmStart(const CoinWarmStart* warmstart) -{ - return modelPtr_->solver()->setWarmStart(warmstart); -} - -//############################################################################# -// Hotstart related methods (primarily used in strong branching) -//############################################################################# - -void OsiCbcSolverInterface::markHotStart() -{ - modelPtr_->solver()->markHotStart(); -} - -void OsiCbcSolverInterface::solveFromHotStart() -{ - modelPtr_->solver()->solveFromHotStart(); -} - -void OsiCbcSolverInterface::unmarkHotStart() -{ - modelPtr_->solver()->unmarkHotStart(); -} - -//############################################################################# -// Problem information methods (original data) -//############################################################################# - -//------------------------------------------------------------------ -const char * OsiCbcSolverInterface::getRowSense() const -{ - return modelPtr_->solver()->getRowSense(); -} -//------------------------------------------------------------------ -const double * OsiCbcSolverInterface::getRightHandSide() const -{ - return modelPtr_->solver()->getRightHandSide(); -} -//------------------------------------------------------------------ -const double * OsiCbcSolverInterface::getRowRange() const -{ - return modelPtr_->solver()->getRowRange(); -} -//------------------------------------------------------------------ -// Return information on integrality -//------------------------------------------------------------------ -bool OsiCbcSolverInterface::isContinuous(int colNumber) const -{ - return modelPtr_->solver()->isContinuous(colNumber); -} -//------------------------------------------------------------------ - -//------------------------------------------------------------------ -// Row and column copies of the matrix ... -//------------------------------------------------------------------ -const CoinPackedMatrix * OsiCbcSolverInterface::getMatrixByRow() const -{ - return modelPtr_->solver()->getMatrixByRow(); -} - -const CoinPackedMatrix * OsiCbcSolverInterface::getMatrixByCol() const -{ - return modelPtr_->solver()->getMatrixByCol(); -} - -//------------------------------------------------------------------ -std::vector OsiCbcSolverInterface::getDualRays(int maxNumRays, - bool fullRay) const -{ - return modelPtr_->solver()->getDualRays(maxNumRays,fullRay); -} -//------------------------------------------------------------------ -std::vector OsiCbcSolverInterface::getPrimalRays(int maxNumRays) const -{ - return modelPtr_->solver()->getPrimalRays(maxNumRays); -} -//############################################################################# -void -OsiCbcSolverInterface::setContinuous(int index) -{ - modelPtr_->solver()->setContinuous(index); -} -//----------------------------------------------------------------------------- -void -OsiCbcSolverInterface::setInteger(int index) -{ - modelPtr_->solver()->setInteger(index); -} -//----------------------------------------------------------------------------- -void -OsiCbcSolverInterface::setContinuous(const int* indices, int len) -{ - modelPtr_->solver()->setContinuous(indices,len); -} -//----------------------------------------------------------------------------- -void -OsiCbcSolverInterface::setInteger(const int* indices, int len) -{ - modelPtr_->solver()->setInteger(indices,len); -} -//----------------------------------------------------------------------------- -void OsiCbcSolverInterface::setColSolution(const double * cs) -{ - modelPtr_->solver()->setColSolution(cs); -} -//----------------------------------------------------------------------------- -void OsiCbcSolverInterface::setRowPrice(const double * rs) -{ - modelPtr_->solver()->setRowPrice(rs); -} - -//############################################################################# -// Problem modifying methods (matrix) -//############################################################################# -void -OsiCbcSolverInterface::addCol(const CoinPackedVectorBase& vec, - const double collb, const double colub, - const double obj) -{ - modelPtr_->solver()->addCol(vec,collb,colub,obj); -} -/* Add a column (primal variable) to the problem. */ -void -OsiCbcSolverInterface::addCol(int numberElements, const int * rows, const double * elements, - const double collb, const double colub, - const double obj) -{ - modelPtr_->solver()->addCol(numberElements, rows, elements, - collb,colub,obj); -} -//----------------------------------------------------------------------------- -void -OsiCbcSolverInterface::addCols(const int numcols, - const CoinPackedVectorBase * const * cols, - const double* collb, const double* colub, - const double* obj) -{ - modelPtr_->solver()->addCols(numcols,cols,collb,colub,obj); -} -//----------------------------------------------------------------------------- -void -OsiCbcSolverInterface::deleteCols(const int num, const int * columnIndices) -{ - modelPtr_->solver()->deleteCols(num,columnIndices); -} -//----------------------------------------------------------------------------- -void -OsiCbcSolverInterface::addRow(const CoinPackedVectorBase& vec, - const double rowlb, const double rowub) -{ - modelPtr_->solver()->addRow(vec,rowlb,rowub); -} -//----------------------------------------------------------------------------- -void -OsiCbcSolverInterface::addRow(const CoinPackedVectorBase& vec, - const char rowsen, const double rowrhs, - const double rowrng) -{ - modelPtr_->solver()->addRow(vec,rowsen,rowrhs,rowrng); -} -//----------------------------------------------------------------------------- -void -OsiCbcSolverInterface::addRows(const int numrows, - const CoinPackedVectorBase * const * rows, - const double* rowlb, const double* rowub) -{ - modelPtr_->solver()->addRows(numrows,rows,rowlb,rowub); -} -//----------------------------------------------------------------------------- -void -OsiCbcSolverInterface::addRows(const int numrows, - const CoinPackedVectorBase * const * rows, - const char* rowsen, const double* rowrhs, - const double* rowrng) -{ - modelPtr_->solver()->addRows(numrows,rows,rowsen,rowrhs,rowrng); -} -//----------------------------------------------------------------------------- -void -OsiCbcSolverInterface::deleteRows(const int num, const int * rowIndices) -{ - modelPtr_->solver()->deleteRows(num,rowIndices); -} - -//############################################################################# -// Methods to input a problem -//############################################################################# - -void -OsiCbcSolverInterface::loadProblem(const CoinPackedMatrix& matrix, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub) -{ - modelPtr_->solver()->loadProblem(matrix,collb,colub,obj,rowlb,rowub); -} - -//----------------------------------------------------------------------------- - -void -OsiCbcSolverInterface::assignProblem(CoinPackedMatrix*& matrix, - double*& collb, double*& colub, - double*& obj, - double*& rowlb, double*& rowub) -{ - modelPtr_->solver()->assignProblem(matrix,collb,colub,obj,rowlb,rowub); -} - -//----------------------------------------------------------------------------- - -void -OsiCbcSolverInterface::loadProblem(const CoinPackedMatrix& matrix, - const double* collb, const double* colub, - const double* obj, - const char* rowsen, const double* rowrhs, - const double* rowrng) -{ - modelPtr_->solver()->loadProblem(matrix,collb,colub,obj,rowsen,rowrhs,rowrng); -} - -//----------------------------------------------------------------------------- - -void -OsiCbcSolverInterface::assignProblem(CoinPackedMatrix*& matrix, - double*& collb, double*& colub, - double*& obj, - char*& rowsen, double*& rowrhs, - double*& rowrng) -{ - modelPtr_->solver()->assignProblem(matrix,collb,colub,obj,rowsen,rowrhs,rowrng); -} - -//----------------------------------------------------------------------------- - -void -OsiCbcSolverInterface::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) -{ - modelPtr_->solver()->loadProblem(numcols,numrows,start,index,value, - collb,colub,obj,rowlb,rowub); -} -//----------------------------------------------------------------------------- - -void -OsiCbcSolverInterface::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) -{ - modelPtr_->solver()->loadProblem(numcols,numrows,start,index,value, - collb,colub,obj,rowsen,rowrhs,rowrng); -} - -//----------------------------------------------------------------------------- -// Write mps files -//----------------------------------------------------------------------------- - -void OsiCbcSolverInterface::writeMps(const char * filename, - const char * extension, - double objSense) const -{ - modelPtr_->solver()->writeMps(filename,extension,objSense); -} - -int -OsiCbcSolverInterface::writeMpsNative(const char *filename, - const char ** rowNames, const char ** columnNames, - int formatType,int numberAcross,double objSense) const -{ - return modelPtr_->solver()->writeMpsNative(filename, rowNames, columnNames, - formatType, numberAcross,objSense); -} - -//############################################################################# -// Constructors, destructors clone and assignment -//############################################################################# -//------------------------------------------------------------------- -// Default Constructor -//------------------------------------------------------------------- -OsiCbcSolverInterface::OsiCbcSolverInterface (OsiSolverInterface * solver, - CbcStrategy * strategy) -: -OsiSolverInterface() -{ - if (solver) { - modelPtr_=new CbcModel(*solver); - } else { - OSICBC_DFLT_SOLVER solverDflt; - modelPtr_=new CbcModel(solverDflt); - } - if (strategy) { - modelPtr_->setStrategy(*strategy); - } else { - CbcStrategyDefault defaultStrategy; - modelPtr_->setStrategy(defaultStrategy); - } -} - -//------------------------------------------------------------------- -// Clone -//------------------------------------------------------------------- -OsiSolverInterface * OsiCbcSolverInterface::clone(bool CopyData) const -{ - if (CopyData) { - return new OsiCbcSolverInterface(*this); - } else { - return new OsiCbcSolverInterface(); - } -} - - -//------------------------------------------------------------------- -// Copy constructor -//------------------------------------------------------------------- -OsiCbcSolverInterface::OsiCbcSolverInterface ( - const OsiCbcSolverInterface & rhs) -: -OsiSolverInterface(rhs) -{ - assert (rhs.modelPtr_); - modelPtr_ = new CbcModel(*rhs.modelPtr_); -} - - -//------------------------------------------------------------------- -// Destructor -//------------------------------------------------------------------- -OsiCbcSolverInterface::~OsiCbcSolverInterface () -{ - delete modelPtr_; -} - -//------------------------------------------------------------------- -// Assignment operator -//------------------------------------------------------------------- -OsiCbcSolverInterface & -OsiCbcSolverInterface::operator=(const OsiCbcSolverInterface& rhs) -{ - if (this != &rhs) { - OsiSolverInterface::operator=(rhs); - delete modelPtr_; - modelPtr_=new CbcModel(*rhs.modelPtr_); - } - return *this; -} - -//############################################################################# -// Applying cuts -//############################################################################# - -void OsiCbcSolverInterface::applyRowCut( const OsiRowCut & rowCut ) -{ - modelPtr_->solver()->applyRowCuts(1,&rowCut); -} -/* Apply a collection of row cuts which are all effective. - applyCuts seems to do one at a time which seems inefficient. -*/ -void -OsiCbcSolverInterface::applyRowCuts(int numberCuts, const OsiRowCut * cuts) -{ - modelPtr_->solver()->applyRowCuts(numberCuts,cuts); -} -/* Apply a collection of row cuts which are all effective. - applyCuts seems to do one at a time which seems inefficient. -*/ -void -OsiCbcSolverInterface::applyRowCuts(int numberCuts, const OsiRowCut ** cuts) -{ - modelPtr_->solver()->applyRowCuts(numberCuts, cuts); -} -//----------------------------------------------------------------------------- - -void OsiCbcSolverInterface::applyColCut( const OsiColCut & cc ) -{ - const double * lower = modelPtr_->solver()->getColLower(); - const double * upper = modelPtr_->solver()->getColUpper(); - const CoinPackedVector & lbs = cc.lbs(); - const CoinPackedVector & ubs = cc.ubs(); - int i; - - for ( i=0; i lower[iCol] ) - modelPtr_->solver()->setColLower(iCol, value); - } - for ( i=0; isolver()->setColUpper(iCol, value); - } -} -/* Read an mps file from the given filename (defaults to Osi reader) - returns - number of errors (see OsiMpsReader class) */ -int -OsiCbcSolverInterface::readMps(const char *filename, - const char *extension ) -{ - return modelPtr_->solver()->readMps(filename,extension); -} -// Get pointer to array[getNumCols()] of primal solution vector -const double * -OsiCbcSolverInterface::getColSolution() const -{ - return modelPtr_->solver()->getColSolution(); -} - -// Get pointer to array[getNumRows()] of dual prices -const double * -OsiCbcSolverInterface::getRowPrice() const -{ - return modelPtr_->solver()->getRowPrice(); -} - -// Get a pointer to array[getNumCols()] of reduced costs -const double * -OsiCbcSolverInterface::getReducedCost() const -{ - return modelPtr_->solver()->getReducedCost(); -} - -/* Get pointer to array[getNumRows()] of row activity levels (constraint - matrix times the solution vector */ -const double * -OsiCbcSolverInterface::getRowActivity() const -{ - return modelPtr_->solver()->getRowActivity(); -} -double -OsiCbcSolverInterface::getObjValue() const -{ - return modelPtr_->solver()->getObjValue(); -} - -/* Set an objective function coefficient */ -void -OsiCbcSolverInterface::setObjCoeff( int elementIndex, double elementValue ) -{ - modelPtr_->solver()->setObjCoeff(elementIndex,elementValue); -} - -/* Set a single column lower bound
- Use -DBL_MAX for -infinity. */ -void -OsiCbcSolverInterface::setColLower( int elementIndex, double elementValue ) -{ - modelPtr_->solver()->setColLower(elementIndex,elementValue); -} - -/* Set a single column upper bound
- Use DBL_MAX for infinity. */ -void -OsiCbcSolverInterface::setColUpper( int elementIndex, double elementValue ) -{ - modelPtr_->solver()->setColUpper(elementIndex,elementValue); -} - -/* Set a single column lower and upper bound */ -void -OsiCbcSolverInterface::setColBounds( int elementIndex, - double lower, double upper ) -{ - modelPtr_->solver()->setColBounds(elementIndex,lower,upper); -} -void OsiCbcSolverInterface::setColSetBounds(const int* indexFirst, - const int* indexLast, - const double* boundList) -{ - modelPtr_->solver()->setColSetBounds(indexFirst,indexLast,boundList); -} -//------------------------------------------------------------------ -/* Set a single row lower bound
- Use -DBL_MAX for -infinity. */ -void -OsiCbcSolverInterface::setRowLower( int elementIndex, double elementValue ) { - modelPtr_->solver()->setRowLower(elementIndex,elementValue); -} - -/* Set a single row upper bound
- Use DBL_MAX for infinity. */ -void -OsiCbcSolverInterface::setRowUpper( int elementIndex, double elementValue ) { - modelPtr_->solver()->setRowUpper(elementIndex,elementValue); -} - -/* Set a single row lower and upper bound */ -void -OsiCbcSolverInterface::setRowBounds( int elementIndex, - double lower, double upper ) { - modelPtr_->solver()->setRowBounds(elementIndex,lower,upper); -} -//----------------------------------------------------------------------------- -void -OsiCbcSolverInterface::setRowType(int i, char sense, double rightHandSide, - double range) -{ - modelPtr_->solver()->setRowType(i,sense,rightHandSide,range); -} -//----------------------------------------------------------------------------- -void OsiCbcSolverInterface::setRowSetBounds(const int* indexFirst, - const int* indexLast, - const double* boundList) -{ - modelPtr_->solver()->setRowSetBounds(indexFirst,indexLast,boundList); -} -//----------------------------------------------------------------------------- -void -OsiCbcSolverInterface::setRowSetTypes(const int* indexFirst, - const int* indexLast, - const char* senseList, - const double* rhsList, - const double* rangeList) -{ - modelPtr_->solver()->setRowSetTypes(indexFirst,indexLast,senseList,rhsList,rangeList); -} -// Set a hint parameter -bool -OsiCbcSolverInterface::setHintParam(OsiHintParam key, bool yesNo, - OsiHintStrength strength, - void * otherInformation) -{ - return modelPtr_->solver()->setHintParam(key,yesNo, strength, otherInformation); -} - -// Get a hint parameter -bool -OsiCbcSolverInterface::getHintParam(OsiHintParam key, bool & yesNo, - OsiHintStrength & strength, - void *& otherInformation) const -{ - return modelPtr_->solver()->getHintParam(key,yesNo, strength, otherInformation); -} - -// Get a hint parameter -bool -OsiCbcSolverInterface::getHintParam(OsiHintParam key, bool & yesNo, - OsiHintStrength & strength) const -{ - return modelPtr_->solver()->getHintParam(key,yesNo, strength); -} - - -int -OsiCbcSolverInterface::getNumCols() const -{ - return modelPtr_->solver()->getNumCols(); -} -int -OsiCbcSolverInterface::getNumRows() const -{ - return modelPtr_->solver()->getNumRows(); -} -int -OsiCbcSolverInterface::getNumElements() const -{ - return modelPtr_->solver()->getNumElements(); -} -const double * -OsiCbcSolverInterface::getColLower() const -{ - return modelPtr_->solver()->getColLower(); -} -const double * -OsiCbcSolverInterface::getColUpper() const -{ - return modelPtr_->solver()->getColUpper(); -} -const double * -OsiCbcSolverInterface::getRowLower() const -{ - return modelPtr_->solver()->getRowLower(); -} -const double * -OsiCbcSolverInterface::getRowUpper() const -{ - return modelPtr_->solver()->getRowUpper(); -} -const double * -OsiCbcSolverInterface::getObjCoefficients() const -{ - return modelPtr_->solver()->getObjCoefficients(); -} -double -OsiCbcSolverInterface::getObjSense() const -{ - return modelPtr_->solver()->getObjSense(); -} -double -OsiCbcSolverInterface::getInfinity() const -{ - return modelPtr_->solver()->getInfinity(); -} -int -OsiCbcSolverInterface::getIterationCount() const -{ - return modelPtr_->solver()->getIterationCount(); -} -void -OsiCbcSolverInterface::setObjSense(double s ) -{ - modelPtr_->setObjSense(s); -} -// Invoke solver's built-in enumeration algorithm -void -OsiCbcSolverInterface::branchAndBound() -{ - *messageHandler() << "Warning: Use of OsiCbc is deprecated." << CoinMessageEol; - *messageHandler() << "To enjoy the full performance of Cbc, use the CbcSolver interface." << CoinMessageEol; - modelPtr_->branchAndBound(); -} - -/* - Name discipline support -- lh, 070328 -- - - For safety, there's really nothing to it but to pass each call of an impure - virtual method on to the underlying solver. Otherwise we just can't know if - it's been overridden or not. -*/ - -std::string -OsiCbcSolverInterface::dfltRowColName (char rc, int ndx, unsigned digits) const -{ - return (modelPtr_->solver()->dfltRowColName(rc,ndx,digits)) ; -} - -std::string OsiCbcSolverInterface::getObjName (unsigned maxLen) const -{ - return (modelPtr_->solver()->getObjName(maxLen)) ; -} - -std::string OsiCbcSolverInterface::getRowName (int ndx, unsigned maxLen) const -{ - return (modelPtr_->solver()->getRowName(ndx,maxLen)) ; -} - -const OsiSolverInterface::OsiNameVec &OsiCbcSolverInterface::getRowNames () -{ - return (modelPtr_->solver()->getRowNames()) ; -} - -std::string OsiCbcSolverInterface::getColName (int ndx, unsigned maxLen) const -{ - return (modelPtr_->solver()->getColName(ndx,maxLen)) ; -} - -const OsiSolverInterface::OsiNameVec &OsiCbcSolverInterface::getColNames () -{ - return (modelPtr_->solver()->getColNames()) ; -} - -void OsiCbcSolverInterface::setRowNames (OsiNameVec &srcNames, - int srcStart, int len, int tgtStart) -{ - modelPtr_->solver()->setRowNames(srcNames,srcStart,len,tgtStart) ; -} - -void OsiCbcSolverInterface::deleteRowNames (int tgtStart, int len) -{ - modelPtr_->solver()->deleteRowNames(tgtStart,len) ; -} - -void OsiCbcSolverInterface::setColNames (OsiNameVec &srcNames, - int srcStart, int len, int tgtStart) -{ - modelPtr_->solver()->setColNames(srcNames,srcStart,len,tgtStart) ; -} - -void OsiCbcSolverInterface::deleteColNames (int tgtStart, int len) -{ - modelPtr_->solver()->deleteColNames(tgtStart,len) ; -} - -/* - These last three are the only functions that would normally be overridden. -*/ - -/* - Set objective function name. -*/ -void OsiCbcSolverInterface::setObjName (std::string name) -{ - modelPtr_->solver()->setObjName(name) ; -} - -/* - Set a row name, to make sure both the solver and OSI see the same name. -*/ -void OsiCbcSolverInterface::setRowName (int ndx, std::string name) - -{ - modelPtr_->solver()->setRowName(ndx,name) ; -} - -/* - Set a column name, to make sure both the solver and OSI see the same name. -*/ -void OsiCbcSolverInterface::setColName (int ndx, std::string name) - -{ - modelPtr_->solver()->setColName(ndx,name) ; -} -// Pass in Message handler (not deleted at end) -void -OsiCbcSolverInterface::passInMessageHandler(CoinMessageHandler * handler) -{ - OsiSolverInterface::passInMessageHandler(handler); - if (modelPtr_) - modelPtr_->passInMessageHandler(handler); -} -// So unit test can find out if NDEBUG set -bool OsiCbcHasNDEBUG() -{ -#ifdef NDEBUG - return true; -#else - return false; -#endif -} diff --git a/src/OsiCbcSolverInterface_2_8.hpp b/src/OsiCbcSolverInterface_2_8.hpp deleted file mode 100644 index aec17e9ee5..0000000000 --- a/src/OsiCbcSolverInterface_2_8.hpp +++ /dev/null @@ -1,764 +0,0 @@ -// $Id: OsiCbcSolverInterface.hpp 1902 2013-04-10 16:58:16Z stefan $ -// 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 OsiCbcSolverInterface_2_8_H -#define OsiCbcSolverInterface_2_8_H - -#include -#include -#include -#include "CbcModel.hpp" -#include "CoinPackedMatrix.hpp" -#include "OsiSolverInterface.hpp" -#include "CbcStrategy.hpp" -#include "CoinWarmStartBasis.hpp" - -class OsiRowCut; -class OsiClpSolverInterface; -static const double OsiCbcInfinity = COIN_DBL_MAX; - -//############################################################################# - -/** Cbc Solver Interface - -Instantiation of OsiCbcSolverInterface for the Model Algorithm. - -*/ - -class OsiCbcSolverInterface : - virtual public OsiSolverInterface { - friend void OsiCbcSolverInterfaceUnitTest(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(); - - /// Invoke solver's built-in enumeration algorithm - virtual void branchAndBound(); - //@} - - //--------------------------------------------------------------------------- - /**@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 cbc 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); - /// Get a hint parameter - virtual bool getHintParam(OsiHintParam key, bool& yesNo, - OsiHintStrength& strength, - void *& otherInformation) const; - - using OsiSolverInterface::getHintParam ; - /// Get a hint parameter - virtual bool getHintParam(OsiHintParam key, bool& yesNo, - OsiHintStrength& strength) const; - //@} - - //--------------------------------------------------------------------------- - ///@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; - /** Set warmstarting information. Return true/false depending on whether - the warmstart information was accepted or not. */ - virtual bool setWarmStart(const CoinWarmStart* warmstart); - //@} - - //--------------------------------------------------------------------------- - /**@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.
- NOTE: 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(); - //@} - - //--------------------------------------------------------------------------- - /**@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; - - /// Get number of rows - virtual int getNumRows() const; - - /// Get number of nonzero elements - virtual int getNumElements() const ; - - /// Get pointer to array[getNumCols()] of column lower bounds - virtual const double * getColLower() const; - - /// Get pointer to array[getNumCols()] of column upper bounds - virtual const double * getColUpper() const; - - /** Get pointer to array[getNumRows()] of row constraint senses. -
    -
  • 'L' <= constraint -
  • 'E' = constraint -
  • 'G' >= constraint -
  • 'R' ranged constraint -
  • 'N' free constraint -
- */ - virtual const char * getRowSense() const; - - /** Get pointer to array[getNumRows()] of rows right-hand sides -
    -
  • if rowsense()[i] == 'L' then rhs()[i] == rowupper()[i] -
  • if rowsense()[i] == 'G' then rhs()[i] == rowlower()[i] -
  • if rowsense()[i] == 'R' then rhs()[i] == rowupper()[i] -
  • if rowsense()[i] == 'N' then rhs()[i] == 0.0 -
- */ - virtual const double * getRightHandSide() const ; - - /** Get pointer to array[getNumRows()] of row ranges. -
    -
  • if rowsense()[i] == 'R' then - rowrange()[i] == rowupper()[i] - rowlower()[i] -
  • if rowsense()[i] != 'R' then - rowrange()[i] is undefined -
- */ - virtual const double * getRowRange() const ; - - /// Get pointer to array[getNumRows()] of row lower bounds - virtual const double * getRowLower() const ; - - /// Get pointer to array[getNumRows()] of row upper bounds - virtual const double * getRowUpper() const ; - - /// Get pointer to array[getNumCols()] of objective function coefficients - virtual const double * getObjCoefficients() const; - - /// Get objective function sense (1 for min (default), -1 for max) - virtual double getObjSense() const ; - - /// Return true if column is continuous - virtual bool isContinuous(int colNumber) const; - - - /// 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 solver's value for infinity - virtual double getInfinity() const; - //@} - - /**@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 ; - - /** 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. - - NOTE for implementers of solver interfaces:
- The double pointers in the vector should point to arrays of length - getNumRows() and they should be allocated via new[].
- - NOTE for users of solver interfaces:
- It is the user's responsibility to free the double pointers in the - vector using delete[]. - */ - virtual std::vector 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.) - - NOTE for implementers of solver interfaces:
- The double pointers in the vector should point to arrays of length - getNumCols() and they should be allocated via new[].
- - NOTE for users of solver interfaces:
- It is the user's responsibility to free the double pointers in the - vector using delete[]. - */ - virtual std::vector getPrimalRays(int maxNumRays) const; - - //@} - - /*! \name Methods for row and column names. - - Because OsiCbc is a pass-through class, it's necessary to override any - virtual method in order to be sure we catch an override by the underlying - solver. See the OsiSolverInterface class documentation for detailed - descriptions. - */ - //@{ - - /*! \brief Generate a standard name of the form Rnnnnnnn or Cnnnnnnn */ - - virtual std::string dfltRowColName(char rc, - int ndx, unsigned digits = 7) const ; - - /*! \brief Return the name of the objective function */ - - virtual std::string getObjName (unsigned maxLen = std::string::npos) const ; - - /*! \brief Set the name of the objective function */ - - virtual void setObjName (std::string name) ; - - /*! \brief Return the name of the row. */ - - virtual std::string getRowName(int rowIndex, - unsigned maxLen = std::string::npos) const ; - - /*! \brief Return a pointer to a vector of row names */ - - virtual const OsiNameVec &getRowNames() ; - - /*! \brief Set a row name */ - - virtual void setRowName(int ndx, std::string name) ; - - /*! \brief Set multiple row names */ - - virtual void setRowNames(OsiNameVec &srcNames, - int srcStart, int len, int tgtStart) ; - - /*! \brief Delete len row names starting at index tgtStart */ - - virtual void deleteRowNames(int tgtStart, int len) ; - - /*! \brief Return the name of the column */ - - virtual std::string getColName(int colIndex, - unsigned maxLen = std::string::npos) const ; - - /*! \brief Return a pointer to a vector of column names */ - - virtual const OsiNameVec &getColNames() ; - - /*! \brief Set a column name */ - - virtual void setColName(int ndx, std::string name) ; - - /*! \brief Set multiple column names */ - - virtual void setColNames(OsiNameVec &srcNames, - int srcStart, int len, int tgtStart) ; - - /*! \brief Delete len column names starting at index tgtStart */ - virtual void deleteColNames(int tgtStart, int len) ; - - //@} - - //@} - - //--------------------------------------------------------------------------- - - /**@name Problem modifying methods */ - //@{ - //------------------------------------------------------------------------- - /**@name Changing bounds on variables and constraints */ - //@{ - /** Set an objective function coefficient */ - virtual void setObjCoeff( int elementIndex, double elementValue ); - - using OsiSolverInterface::setColLower ; - /** Set a single column lower bound
- Use -DBL_MAX for -infinity. */ - virtual void setColLower( int elementIndex, double elementValue ); - - using OsiSolverInterface::setColUpper ; - /** Set a single column upper bound
- 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
- 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 - either 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
- Use -DBL_MAX for -infinity. */ - virtual void setRowLower( int elementIndex, double elementValue ); - - /** Set a single row upper bound
- 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
*/ - virtual void setRowType(int index, char sense, double rightHandSide, - double range); - - /** Set the bounds on a number of rows simultaneously
- 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 - either 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
- 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 - any 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); - //@} - - //------------------------------------------------------------------------- - /**@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); - //@} - - //------------------------------------------------------------------------- - /// Set objective function sense (1 for min (default), -1 for max,) - virtual void setObjSense(double s ); - - /** 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.
- 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); - /** 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) ; - - using OsiSolverInterface::addCols ; - /** */ - virtual void addCols(const int numcols, - const CoinPackedVectorBase * const * cols, - const double* collb, const double* colub, - const double* obj); - /** */ - virtual void deleteCols(const int num, const int * colIndices); - - using OsiSolverInterface::addRow ; - /** */ - virtual void addRow(const CoinPackedVectorBase& vec, - const double rowlb, const double rowub); - /** */ - virtual void addRow(const CoinPackedVectorBase& vec, - const char rowsen, const double rowrhs, - const double rowrng); - - using OsiSolverInterface::addRows ; - /** */ - 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 deleteRows(const int num, const int * rowIndices); - - //----------------------------------------------------------------------- - /** 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); - //@} - //@} - - //--------------------------------------------------------------------------- - -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 0 then the - following values are the default: -
    -
  • colub: all columns have upper bound infinity -
  • collb: all columns have lower bound 0 -
  • rowub: all rows have upper bound infinity -
  • rowlb: all rows have lower bound -infinity -
  • obj: all variables have 0 objective coefficient -
- */ - 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.
- WARNING: The arguments passed to this method will be - freed using the C++ delete and delete[] - 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 0 then the - following values are the default: -
    -
  • colub: all columns have upper bound infinity -
  • collb: all columns have lower bound 0 -
  • obj: all variables have 0 objective coefficient -
  • rowsen: all rows are >= -
  • rowrhs: all right hand sides are 0 -
  • rowrng: 0 for the ranged rows -
- */ - 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.
- WARNING: The arguments passed to this method will be - freed using the C++ delete and delete[] - 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 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); - - 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") ; - - /** 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 ; - //@} - - /**@name Message handling (extra for Cbc messages). - Normally I presume you would want the same language. - If not then you could use underlying model pointer */ - //@{ - /// Set language - void newLanguage(CoinMessages::Language language); - void setLanguage(CoinMessages::Language language) - {newLanguage(language);} - //@} - //--------------------------------------------------------------------------- - - /**@name Cbc specific public interfaces */ - //@{ - /// Get pointer to Cbc model - inline CbcModel * getModelPtr() const - { return modelPtr_;} - /// Get pointer to underlying solver - inline OsiSolverInterface * getRealSolverPtr() const - { return modelPtr_->solver();} - /// Set cutoff bound on the objective function. - inline void setCutoff(double value) - { modelPtr_->setCutoff(value);} - /// Get the cutoff bound on the objective function - always as minimize - inline double getCutoff() const - { return modelPtr_->getCutoff();} - /// Set the CbcModel::CbcMaxNumNode maximum node limit - inline void setMaximumNodes( int value) - { modelPtr_->setMaximumNodes(value);} - /// Get the CbcModel::CbcMaxNumNode maximum node limit - inline int getMaximumNodes() const - { return modelPtr_->getMaximumNodes();} - /// Set the CbcModel::CbcMaxNumSol maximum number of solutions - inline void setMaximumSolutions( int value) - { modelPtr_->setMaximumSolutions(value);} - /// Get the CbcModel::CbcMaxNumSol maximum number of solutions - inline int getMaximumSolutions() const - { return modelPtr_->getMaximumSolutions();} - /// Set the CbcModel::CbcMaximumSeconds maximum number of seconds - inline void setMaximumSeconds( double value) - { modelPtr_->setMaximumSeconds(value);} - /// Get the CbcModel::CbcMaximumSeconds maximum number of seconds - inline double getMaximumSeconds() const - { return modelPtr_->getMaximumSeconds();} - /// Node limit reached? - inline bool isNodeLimitReached() const - { return modelPtr_->isNodeLimitReached();} - /// Solution limit reached? - inline bool isSolutionLimitReached() const - { return modelPtr_->isSolutionLimitReached();} - /// Get how many Nodes it took to solve the problem. - inline int getNodeCount() const - { return modelPtr_->getNodeCount();} - /// Final status of problem - 0 finished, 1 stopped, 2 difficulties - inline int status() const - { return modelPtr_->status();} - /** 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); - //@} - - //--------------------------------------------------------------------------- - - /**@name Constructors and destructors */ - //@{ - /// Default Constructor - OsiCbcSolverInterface (OsiSolverInterface * solver=NULL, - CbcStrategy * strategy=NULL); - - /// Clone - virtual OsiSolverInterface * clone(bool copyData = true) const; - - /// Copy constructor - OsiCbcSolverInterface (const OsiCbcSolverInterface &); -#if 0 - /// Borrow constructor - only delete one copy - OsiCbcSolverInterface (CbcModel * rhs, bool reallyOwn=false); - - /// Releases so won't error - void releaseCbc(); -#endif - /// Assignment operator - OsiCbcSolverInterface & operator=(const OsiCbcSolverInterface& rhs); - - /// Destructor - virtual ~OsiCbcSolverInterface (); - - //@} - //--------------------------------------------------------------------------- - -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); - //@} - /**@name Protected member data */ - //@{ - /// Cbc model represented by this class instance - mutable CbcModel * modelPtr_; - //@} -}; -// So unit test can find out if NDEBUG set -bool OsiCbcHasNDEBUG(); - -//############################################################################# -/** A function that tests the methods in the OsiCbcSolverInterface class. */ -void OsiCbcSolverInterfaceUnitTest(const std::string & mpsDir, const std::string & netlibDir); - -#endif diff --git a/src/solver_factory.cc b/src/solver_factory.cc index 9381b44687..7db2462931 100644 --- a/src/solver_factory.cc +++ b/src/solver_factory.cc @@ -124,14 +124,13 @@ void SolveProg(OsiSolverInterface* si, double greedy_obj, bool verbose) { ReportProg(si); if (HasInt(si)) { - const char *argv[] = {"exchng", "-log", "0", "-solve", "-quit"}; - int argc = 5; CbcModel model(*si); ObjValueHandler handler(greedy_obj); - CbcMain0(model); model.passInEventHandler(&handler); - CbcMain1(argc, argv, model, CbcCallBack); - si->setColSolution(model.getColSolution()); + model.setLogLevel(0); + model.initialSolve(); + model.branchAndBound(); + si->setColSolution(model.bestSolution()); if (verbose) { std::cout << "Greedy equivalent time: " << handler.time() << " and obj " << handler.obj() diff --git a/tests/equality_helpers.h b/tests/equality_helpers.h index c1b8fd1e04..540c2dece7 100644 --- a/tests/equality_helpers.h +++ b/tests/equality_helpers.h @@ -84,6 +84,19 @@ void array_double_eq(const T* const expected, const T* const actual, } } +template +void array_double_near(const T* const expected, const T* const actual, + unsigned long length, const T margin, std::string name = "") { + for (unsigned long index = 0; index < length; index++) { + T exp = expected[index]; + T act = actual[index]; + EXPECT_NEAR(exp, act, margin) << name << " arrays differ at index " + << index << "\n" + << " exp: " << exp << "\n" + << " act: " << act << "\n"; + } +} + template void pair_double_eq(const std::pair& p1, const std::pair& p2) { diff --git a/tests/prog_translator_tests.cc b/tests/prog_translator_tests.cc index b07e3ee403..63ab0b17b8 100644 --- a/tests/prog_translator_tests.cc +++ b/tests/prog_translator_tests.cc @@ -15,6 +15,7 @@ #include "prog_translator.h" #include "solver_factory.h" #include "env.h" +#include "cyc_limits.h" namespace cyclus { @@ -243,7 +244,7 @@ TEST(ProgTranslatorTests, translation) { EXPECT_NO_THROW(SolveProg(iface)); const double* soln = iface->getColSolution(); const double* check = checkface.getColSolution(); - array_double_eq(soln, check, narcs + nfaux, "soln"); + array_double_near(soln, check, narcs + nfaux, cyclus::cy_eps, "soln"); // validate solution double x1_flow = excl_flow[1];