diff options
Diffstat (limited to 'build/Bonmin/include/coin/ClpModel.hpp')
-rw-r--r-- | build/Bonmin/include/coin/ClpModel.hpp | 1307 |
1 files changed, 0 insertions, 1307 deletions
diff --git a/build/Bonmin/include/coin/ClpModel.hpp b/build/Bonmin/include/coin/ClpModel.hpp deleted file mode 100644 index 4a22539..0000000 --- a/build/Bonmin/include/coin/ClpModel.hpp +++ /dev/null @@ -1,1307 +0,0 @@ -/* $Id: ClpModel.hpp 2074 2014-12-10 09:43:54Z forrest $ */ -// 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). - -#ifndef ClpModel_H -#define ClpModel_H - -#include "ClpConfig.h" - -#include <iostream> -#include <cassert> -#include <cmath> -#include <vector> -#include <string> -//#ifndef COIN_USE_CLP -//#define COIN_USE_CLP -//#endif -#include "ClpPackedMatrix.hpp" -#include "CoinMessageHandler.hpp" -#include "CoinHelperFunctions.hpp" -#include "CoinTypes.hpp" -#include "CoinFinite.hpp" -#include "ClpParameters.hpp" -#include "ClpObjective.hpp" -class ClpEventHandler; -/** This is the base class for Linear and quadratic Models - This knows nothing about the algorithm, but it seems to - have a reasonable amount of information - - I would welcome suggestions for what should be in this and - how it relates to OsiSolverInterface. Some methods look - very similar. - -*/ -class CoinBuild; -class CoinModel; -class ClpModel { - -public: - - /**@name Constructors and destructor - Note - copy methods copy ALL data so can chew up memory - until other copy is freed - */ - //@{ - /// Default constructor - ClpModel (bool emptyMessages = false ); - - /** Copy constructor. May scale depending on mode - -1 leave mode as is - 0 -off, 1 equilibrium, 2 geometric, 3, auto, 4 auto-but-as-initialSolve-in-bab - */ - ClpModel(const ClpModel & rhs, int scalingMode = -1); - /// Assignment operator. This copies the data - ClpModel & operator=(const ClpModel & rhs); - /** Subproblem constructor. A subset of whole model is created from the - row and column lists given. The new order is given by list order and - duplicates are allowed. Name and integer information can be dropped - */ - ClpModel (const ClpModel * wholeModel, - int numberRows, const int * whichRows, - int numberColumns, const int * whichColumns, - bool dropNames = true, bool dropIntegers = true); - /// Destructor - ~ClpModel ( ); - //@} - - /**@name Load model - loads some stuff and initializes others */ - //@{ - /** Loads a problem (the constraints on the - rows are given by lower and upper bounds). If a pointer is 0 then the - following values are the default: - <ul> - <li> <code>colub</code>: all columns have upper bound infinity - <li> <code>collb</code>: all columns have lower bound 0 - <li> <code>rowub</code>: all rows have upper bound infinity - <li> <code>rowlb</code>: all rows have lower bound -infinity - <li> <code>obj</code>: all variables have 0 objective coefficient - </ul> - */ - void loadProblem ( const ClpMatrixBase& matrix, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub, - const double * rowObjective = NULL); - void loadProblem ( const CoinPackedMatrix& matrix, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub, - const double * rowObjective = NULL); - - /** Just like the other loadProblem() method except that the matrix is - given in a standard column major ordered format (without gaps). */ - 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, - const double * rowObjective = NULL); - /** This loads a model from a coinModel object - returns number of errors. - - modelObject not const as may be changed as part of process - If tryPlusMinusOne then will try adding as +-1 matrix - */ - int loadProblem ( CoinModel & modelObject, bool tryPlusMinusOne = false); - /// This one is for after presolve to save memory - void loadProblem ( const int numcols, const int numrows, - const CoinBigIndex* start, const int* index, - const double* value, const int * length, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub, - const double * rowObjective = NULL); - /** Load up quadratic objective. This is stored as a CoinPackedMatrix */ - void loadQuadraticObjective(const int numberColumns, - const CoinBigIndex * start, - const int * column, const double * element); - void loadQuadraticObjective ( const CoinPackedMatrix& matrix); - /// Get rid of quadratic objective - void deleteQuadraticObjective(); - /// This just loads up a row objective - void setRowObjective(const double * rowObjective); - /// Read an mps file from the given filename - int readMps(const char *filename, - bool keepNames = false, - bool ignoreErrors = false); - /// Read GMPL files from the given filenames - int readGMPL(const char *filename, const char * dataName, - bool keepNames = false); - /// Copy in integer informations - void copyInIntegerInformation(const char * information); - /// Drop integer informations - void deleteIntegerInformation(); - /** Set the index-th variable to be a continuous variable */ - void setContinuous(int index); - /** Set the index-th variable to be an integer variable */ - void setInteger(int index); - /** Return true if the index-th variable is an integer variable */ - bool isInteger(int index) const; - /// Resizes rim part of model - void resize (int newNumberRows, int newNumberColumns); - /// Deletes rows - void deleteRows(int number, const int * which); - /// Add one row - void addRow(int numberInRow, const int * columns, - const double * elements, double rowLower = -COIN_DBL_MAX, - double rowUpper = COIN_DBL_MAX); - /// Add rows - void addRows(int number, const double * rowLower, - const double * rowUpper, - const CoinBigIndex * rowStarts, const int * columns, - const double * elements); - /// Add rows - void addRows(int number, const double * rowLower, - const double * rowUpper, - const CoinBigIndex * rowStarts, const int * rowLengths, - const int * columns, - const double * elements); -#ifndef CLP_NO_VECTOR - void addRows(int number, const double * rowLower, - const double * rowUpper, - const CoinPackedVectorBase * const * rows); -#endif - /** Add rows from a build object. - If tryPlusMinusOne then will try adding as +-1 matrix - if no matrix exists. - Returns number of errors e.g. duplicates - */ - int addRows(const CoinBuild & buildObject, bool tryPlusMinusOne = false, - bool checkDuplicates = true); - /** Add rows from a model object. returns - -1 if object in bad state (i.e. has column information) - otherwise number of errors. - - modelObject non const as can be regularized as part of build - If tryPlusMinusOne then will try adding as +-1 matrix - if no matrix exists. - */ - int addRows(CoinModel & modelObject, bool tryPlusMinusOne = false, - bool checkDuplicates = true); - - /// Deletes columns - void deleteColumns(int number, const int * which); - /// Deletes rows AND columns (keeps old sizes) - void deleteRowsAndColumns(int numberRows, const int * whichRows, - int numberColumns, const int * whichColumns); - /// Add one column - void addColumn(int numberInColumn, - const int * rows, - const double * elements, - double columnLower = 0.0, - double columnUpper = COIN_DBL_MAX, - double objective = 0.0); - /// Add columns - void addColumns(int number, const double * columnLower, - const double * columnUpper, - const double * objective, - const CoinBigIndex * columnStarts, const int * rows, - const double * elements); - void addColumns(int number, const double * columnLower, - const double * columnUpper, - const double * objective, - const CoinBigIndex * columnStarts, const int * columnLengths, - const int * rows, - const double * elements); -#ifndef CLP_NO_VECTOR - void addColumns(int number, const double * columnLower, - const double * columnUpper, - const double * objective, - const CoinPackedVectorBase * const * columns); -#endif - /** Add columns from a build object - If tryPlusMinusOne then will try adding as +-1 matrix - if no matrix exists. - Returns number of errors e.g. duplicates - */ - int addColumns(const CoinBuild & buildObject, bool tryPlusMinusOne = false, - bool checkDuplicates = true); - /** Add columns from a model object. returns - -1 if object in bad state (i.e. has row information) - otherwise number of errors - modelObject non const as can be regularized as part of build - If tryPlusMinusOne then will try adding as +-1 matrix - if no matrix exists. - */ - int addColumns(CoinModel & modelObject, bool tryPlusMinusOne = false, - bool checkDuplicates = true); - /// Modify one element of a matrix - inline void modifyCoefficient(int row, int column, double newElement, - bool keepZero = false) { - matrix_->modifyCoefficient(row, column, newElement, keepZero); - } - /** Change row lower bounds */ - void chgRowLower(const double * rowLower); - /** Change row upper bounds */ - void chgRowUpper(const double * rowUpper); - /** Change column lower bounds */ - void chgColumnLower(const double * columnLower); - /** Change column upper bounds */ - void chgColumnUpper(const double * columnUpper); - /** Change objective coefficients */ - void chgObjCoefficients(const double * objIn); - /** Borrow model. This is so we don't have to copy large amounts - of data around. It assumes a derived class wants to overwrite - an empty model with a real one - while it does an algorithm */ - void borrowModel(ClpModel & otherModel); - /** Return model - nulls all arrays so can be deleted safely - also updates any scalars */ - void returnModel(ClpModel & otherModel); - - /// Create empty ClpPackedMatrix - void createEmptyMatrix(); - /** Really clean up matrix (if ClpPackedMatrix). - a) eliminate all duplicate AND small elements in matrix - b) remove all gaps and set extraGap_ and extraMajor_ to 0.0 - c) reallocate arrays and make max lengths equal to lengths - d) orders elements - returns number of elements eliminated or -1 if not ClpPackedMatrix - */ - int cleanMatrix(double threshold = 1.0e-20); - /// Copy contents - resizing if necessary - otherwise re-use memory - void copy(const ClpMatrixBase * from, ClpMatrixBase * & to); -#ifndef CLP_NO_STD - /// Drops names - makes lengthnames 0 and names empty - void dropNames(); - /// Copies in names - void copyNames(const std::vector<std::string> & rowNames, - const std::vector<std::string> & columnNames); - /// Copies in Row names - modifies names first .. last-1 - void copyRowNames(const std::vector<std::string> & rowNames, int first, int last); - /// Copies in Column names - modifies names first .. last-1 - void copyColumnNames(const std::vector<std::string> & columnNames, int first, int last); - /// Copies in Row names - modifies names first .. last-1 - void copyRowNames(const char * const * rowNames, int first, int last); - /// Copies in Column names - modifies names first .. last-1 - void copyColumnNames(const char * const * columnNames, int first, int last); - /// Set name of row - void setRowName(int rowIndex, std::string & name) ; - /// Set name of col - void setColumnName(int colIndex, std::string & name) ; -#endif - /** Find a network subset. - rotate array should be numberRows. On output - -1 not in network - 0 in network as is - 1 in network with signs swapped - Returns number of network rows - */ - int findNetwork(char * rotate, double fractionNeeded = 0.75); - /** This creates a coinModel object - */ - CoinModel * createCoinModel() const; - - /** Write the problem in MPS format to the specified file. - - Row and column names may be null. - formatType is - <ul> - <li> 0 - normal - <li> 1 - extra accuracy - <li> 2 - IEEE hex - </ul> - - Returns non-zero on I/O error - */ - int writeMps(const char *filename, - int formatType = 0, int numberAcross = 2, - double objSense = 0.0) const ; - //@} - /**@name gets and sets */ - //@{ - /// Number of rows - inline int numberRows() const { - return numberRows_; - } - inline int getNumRows() const { - return numberRows_; - } - /// Number of columns - inline int getNumCols() const { - return numberColumns_; - } - inline int numberColumns() const { - return numberColumns_; - } - /// Primal tolerance to use - inline double primalTolerance() const { - return dblParam_[ClpPrimalTolerance]; - } - void setPrimalTolerance( double value) ; - /// Dual tolerance to use - inline double dualTolerance() const { - return dblParam_[ClpDualTolerance]; - } - void setDualTolerance( double value) ; - /// Primal objective limit - inline double primalObjectiveLimit() const { - return dblParam_[ClpPrimalObjectiveLimit]; - } - void setPrimalObjectiveLimit(double value); - /// Dual objective limit - inline double dualObjectiveLimit() const { - return dblParam_[ClpDualObjectiveLimit]; - } - void setDualObjectiveLimit(double value); - /// Objective offset - inline double objectiveOffset() const { - return dblParam_[ClpObjOffset]; - } - void setObjectiveOffset(double value); - /// Presolve tolerance to use - inline double presolveTolerance() const { - return dblParam_[ClpPresolveTolerance]; - } -#ifndef CLP_NO_STD - inline const std::string & problemName() const { - return strParam_[ClpProbName]; - } -#endif - /// Number of iterations - inline int numberIterations() const { - return numberIterations_; - } - inline int getIterationCount() const { - return numberIterations_; - } - inline void setNumberIterations(int numberIterationsNew) { - numberIterations_ = numberIterationsNew; - } - /** Solve type - 1 simplex, 2 simplex interface, 3 Interior.*/ - inline int solveType() const { - return solveType_; - } - inline void setSolveType(int type) { - solveType_ = type; - } - /// Maximum number of iterations - inline int maximumIterations() const { - return intParam_[ClpMaxNumIteration]; - } - void setMaximumIterations(int value); - /// Maximum time in seconds (from when set called) - inline double maximumSeconds() const { - return dblParam_[ClpMaxSeconds]; - } - void setMaximumSeconds(double value); - void setMaximumWallSeconds(double value); - /// Returns true if hit maximum iterations (or time) - bool hitMaximumIterations() const; - /** Status of problem: - -1 - unknown e.g. before solve or if postSolve says not optimal - 0 - optimal - 1 - primal infeasible - 2 - dual infeasible - 3 - stopped on iterations or time - 4 - stopped due to errors - 5 - stopped by event handler (virtual int ClpEventHandler::event()) - */ - inline int status() const { - return problemStatus_; - } - inline int problemStatus() const { - return problemStatus_; - } - /// Set problem status - inline void setProblemStatus(int problemStatusNew) { - problemStatus_ = problemStatusNew; - } - /** Secondary status of problem - may get extended - 0 - none - 1 - primal infeasible because dual limit reached OR (probably primal - infeasible but can't prove it - main status was 4) - 2 - scaled problem optimal - unscaled problem has primal infeasibilities - 3 - scaled problem optimal - unscaled problem has dual infeasibilities - 4 - scaled problem optimal - unscaled problem has primal and dual infeasibilities - 5 - giving up in primal with flagged variables - 6 - failed due to empty problem check - 7 - postSolve says not optimal - 8 - failed due to bad element check - 9 - status was 3 and stopped on time - 10 - status was 3 but stopped as primal feasible - 100 up - translation of enum from ClpEventHandler - */ - inline int secondaryStatus() const { - return secondaryStatus_; - } - inline void setSecondaryStatus(int newstatus) { - secondaryStatus_ = newstatus; - } - /// Are there a numerical difficulties? - inline bool isAbandoned() const { - return problemStatus_ == 4; - } - /// Is optimality proven? - inline bool isProvenOptimal() const { - return problemStatus_ == 0; - } - /// Is primal infeasiblity proven? - inline bool isProvenPrimalInfeasible() const { - return problemStatus_ == 1; - } - /// Is dual infeasiblity proven? - inline bool isProvenDualInfeasible() const { - return problemStatus_ == 2; - } - /// Is the given primal objective limit reached? - bool isPrimalObjectiveLimitReached() const ; - /// Is the given dual objective limit reached? - bool isDualObjectiveLimitReached() const ; - /// Iteration limit reached? - inline bool isIterationLimitReached() const { - return problemStatus_ == 3; - } - /// Direction of optimization (1 - minimize, -1 - maximize, 0 - ignore - inline double optimizationDirection() const { - return optimizationDirection_; - } - inline double getObjSense() const { - return optimizationDirection_; - } - void setOptimizationDirection(double value); - /// Primal row solution - inline double * primalRowSolution() const { - return rowActivity_; - } - inline const double * getRowActivity() const { - return rowActivity_; - } - /// Primal column solution - inline double * primalColumnSolution() const { - return columnActivity_; - } - inline const double * getColSolution() const { - return columnActivity_; - } - inline void setColSolution(const double * input) { - memcpy(columnActivity_, input, numberColumns_ * sizeof(double)); - } - /// Dual row solution - inline double * dualRowSolution() const { - return dual_; - } - inline const double * getRowPrice() const { - return dual_; - } - /// Reduced costs - inline double * dualColumnSolution() const { - return reducedCost_; - } - inline const double * getReducedCost() const { - return reducedCost_; - } - /// Row lower - inline double* rowLower() const { - return rowLower_; - } - inline const double* getRowLower() const { - return rowLower_; - } - /// Row upper - inline double* rowUpper() const { - return rowUpper_; - } - inline const double* getRowUpper() const { - return rowUpper_; - } - //------------------------------------------------------------------------- - /**@name Changing bounds on variables and constraints */ - //@{ - /** Set an objective function coefficient */ - void setObjectiveCoefficient( int elementIndex, double elementValue ); - /** Set an objective function coefficient */ - inline void setObjCoeff( int elementIndex, double elementValue ) { - setObjectiveCoefficient( elementIndex, elementValue); - } - - /** Set a single column lower bound<br> - Use -DBL_MAX for -infinity. */ - void setColumnLower( int elementIndex, double elementValue ); - - /** Set a single column upper bound<br> - Use DBL_MAX for infinity. */ - void setColumnUpper( int elementIndex, double elementValue ); - - /** Set a single column lower and upper bound */ - void setColumnBounds( int elementIndex, - double lower, double upper ); - - /** Set the bounds on a number of columns simultaneously<br> - The default implementation just invokes setColLower() and - setColUpper() over and over again. - @param indexFirst,indexLast pointers to the beginning and after the - end of the array of the indices of the variables whose - <em>either</em> bound changes - @param boundList the new lower/upper bound pairs for the variables - */ - void setColumnSetBounds(const int* indexFirst, - const int* indexLast, - const double* boundList); - - /** Set a single column lower bound<br> - Use -DBL_MAX for -infinity. */ - inline void setColLower( int elementIndex, double elementValue ) { - setColumnLower(elementIndex, elementValue); - } - /** Set a single column upper bound<br> - Use DBL_MAX for infinity. */ - inline void setColUpper( int elementIndex, double elementValue ) { - setColumnUpper(elementIndex, elementValue); - } - - /** Set a single column lower and upper bound */ - inline void setColBounds( int elementIndex, - double lower, double upper ) { - setColumnBounds(elementIndex, lower, upper); - } - - /** Set the bounds on a number of columns simultaneously<br> - @param indexFirst,indexLast pointers to the beginning and after the - end of the array of the indices of the variables whose - <em>either</em> bound changes - @param boundList the new lower/upper bound pairs for the variables - */ - inline void setColSetBounds(const int* indexFirst, - const int* indexLast, - const double* boundList) { - setColumnSetBounds(indexFirst, indexLast, boundList); - } - - /** Set a single row lower bound<br> - Use -DBL_MAX for -infinity. */ - void setRowLower( int elementIndex, double elementValue ); - - /** Set a single row upper bound<br> - Use DBL_MAX for infinity. */ - void setRowUpper( int elementIndex, double elementValue ) ; - - /** Set a single row lower and upper bound */ - void setRowBounds( int elementIndex, - double lower, double upper ) ; - - /** Set the bounds on a number of rows simultaneously<br> - @param indexFirst,indexLast pointers to the beginning and after the - end of the array of the indices of the constraints whose - <em>either</em> bound changes - @param boundList the new lower/upper bound pairs for the constraints - */ - void setRowSetBounds(const int* indexFirst, - const int* indexLast, - const double* boundList); - - //@} - /// Scaling - inline const double * rowScale() const { - return rowScale_; - } - inline const double * columnScale() const { - return columnScale_; - } - inline const double * inverseRowScale() const { - return inverseRowScale_; - } - inline const double * inverseColumnScale() const { - return inverseColumnScale_; - } - inline double * mutableRowScale() const { - return rowScale_; - } - inline double * mutableColumnScale() const { - return columnScale_; - } - inline double * mutableInverseRowScale() const { - return inverseRowScale_; - } - inline double * mutableInverseColumnScale() const { - return inverseColumnScale_; - } - inline double * swapRowScale(double * newScale) { - double * oldScale = rowScale_; - rowScale_ = newScale; - return oldScale; - } - void setRowScale(double * scale) ; - void setColumnScale(double * scale); - /// Scaling of objective - inline double objectiveScale() const { - return objectiveScale_; - } - inline void setObjectiveScale(double value) { - objectiveScale_ = value; - } - /// Scaling of rhs and bounds - inline double rhsScale() const { - return rhsScale_; - } - inline void setRhsScale(double value) { - rhsScale_ = value; - } - /// Sets or unsets scaling, 0 -off, 1 equilibrium, 2 geometric, 3 auto, 4 auto-but-as-initialSolve-in-bab - void scaling(int mode = 1); - /** If we constructed a "really" scaled model then this reverses the operation. - Quantities may not be exactly as they were before due to rounding errors */ - void unscale(); - /// Gets scalingFlag - inline int scalingFlag() const { - return scalingFlag_; - } - /// Objective - inline double * objective() const { - if (objective_) { - double offset; - return objective_->gradient(NULL, NULL, offset, false); - } else { - return NULL; - } - } - inline double * objective(const double * solution, double & offset, bool refresh = true) const { - offset = 0.0; - if (objective_) { - return objective_->gradient(NULL, solution, offset, refresh); - } else { - return NULL; - } - } - inline const double * getObjCoefficients() const { - if (objective_) { - double offset; - return objective_->gradient(NULL, NULL, offset, false); - } else { - return NULL; - } - } - /// Row Objective - inline double * rowObjective() const { - return rowObjective_; - } - inline const double * getRowObjCoefficients() const { - return rowObjective_; - } - /// Column Lower - inline double * columnLower() const { - return columnLower_; - } - inline const double * getColLower() const { - return columnLower_; - } - /// Column Upper - inline double * columnUpper() const { - return columnUpper_; - } - inline const double * getColUpper() const { - return columnUpper_; - } - /// Matrix (if not ClpPackedmatrix be careful about memory leak - inline CoinPackedMatrix * matrix() const { - if ( matrix_ == NULL ) return NULL; - else return matrix_->getPackedMatrix(); - } - /// Number of elements in matrix - inline int getNumElements() const { - return matrix_->getNumElements(); - } - /** Small element value - elements less than this set to zero, - default is 1.0e-20 */ - inline double getSmallElementValue() const { - return smallElement_; - } - inline void setSmallElementValue(double value) { - smallElement_ = value; - } - /// Row Matrix - inline ClpMatrixBase * rowCopy() const { - return rowCopy_; - } - /// Set new row matrix - void setNewRowCopy(ClpMatrixBase * newCopy); - /// Clp Matrix - inline ClpMatrixBase * clpMatrix() const { - return matrix_; - } - /// Scaled ClpPackedMatrix - inline ClpPackedMatrix * clpScaledMatrix() const { - return scaledMatrix_; - } - /// Sets pointer to scaled ClpPackedMatrix - inline void setClpScaledMatrix(ClpPackedMatrix * scaledMatrix) { - delete scaledMatrix_; - scaledMatrix_ = scaledMatrix; - } - /// Swaps pointer to scaled ClpPackedMatrix - inline ClpPackedMatrix * swapScaledMatrix(ClpPackedMatrix * scaledMatrix) { - ClpPackedMatrix * oldMatrix = scaledMatrix_; - scaledMatrix_ = scaledMatrix; - return oldMatrix; - } - /** Replace Clp Matrix (current is not deleted unless told to - and new is used) - So up to user to delete current. This was used where - matrices were being rotated. ClpModel takes ownership. - */ - void replaceMatrix(ClpMatrixBase * matrix, bool deleteCurrent = false); - /** Replace Clp Matrix (current is not deleted unless told to - and new is used) So up to user to delete current. This was used where - matrices were being rotated. This version changes CoinPackedMatrix - to ClpPackedMatrix. ClpModel takes ownership. - */ - inline void replaceMatrix(CoinPackedMatrix * newmatrix, - bool deleteCurrent = false) { - replaceMatrix(new ClpPackedMatrix(newmatrix), deleteCurrent); - } - /// Objective value - inline double objectiveValue() const { - return objectiveValue_ * optimizationDirection_ - dblParam_[ClpObjOffset]; - } - inline void setObjectiveValue(double value) { - objectiveValue_ = (value + dblParam_[ClpObjOffset]) / optimizationDirection_; - } - inline double getObjValue() const { - return objectiveValue_ * optimizationDirection_ - dblParam_[ClpObjOffset]; - } - /// Integer information - inline char * integerInformation() const { - return integerType_; - } - /** Infeasibility/unbounded ray (NULL returned if none/wrong) - Up to user to use delete [] on these arrays. */ - double * infeasibilityRay(bool fullRay=false) const; - double * unboundedRay() const; - /// For advanced users - no need to delete - sign not changed - inline double * ray() const - { return ray_;} - /// just test if infeasibility or unbounded Ray exists - inline bool rayExists() const { - return (ray_!=NULL); - } - /// just delete ray if exists - inline void deleteRay() { - delete [] ray_; - ray_=NULL; - } - /// Access internal ray storage. Users should call infeasibilityRay() or unboundedRay() instead. - inline const double * internalRay() const { - return ray_; - } - /// See if status (i.e. basis) array exists (partly for OsiClp) - inline bool statusExists() const { - return (status_ != NULL); - } - /// Return address of status (i.e. basis) array (char[numberRows+numberColumns]) - inline unsigned char * statusArray() const { - return status_; - } - /** Return copy of status (i.e. basis) array (char[numberRows+numberColumns]), - use delete [] */ - unsigned char * statusCopy() const; - /// Copy in status (basis) vector - void copyinStatus(const unsigned char * statusArray); - - /// User pointer for whatever reason - inline void setUserPointer (void * pointer) { - userPointer_ = pointer; - } - inline void * getUserPointer () const { - return userPointer_; - } - /// Trusted user pointer - inline void setTrustedUserPointer (ClpTrustedData * pointer) { - trustedUserPointer_ = pointer; - } - inline ClpTrustedData * getTrustedUserPointer () const { - return trustedUserPointer_; - } - /// What has changed in model (only for masochistic users) - inline int whatsChanged() const { - return whatsChanged_; - } - inline void setWhatsChanged(int value) { - whatsChanged_ = value; - } - /// Number of threads (not really being used) - inline int numberThreads() const { - return numberThreads_; - } - inline void setNumberThreads(int value) { - numberThreads_ = value; - } - //@} - /**@name Message handling */ - //@{ - /// Pass in Message handler (not deleted at end) - void passInMessageHandler(CoinMessageHandler * handler); - /// Pass in Message handler (not deleted at end) and return current - CoinMessageHandler * pushMessageHandler(CoinMessageHandler * handler, - bool & oldDefault); - /// back to previous message handler - void popMessageHandler(CoinMessageHandler * oldHandler, bool oldDefault); - /// Set language - void newLanguage(CoinMessages::Language language); - inline void setLanguage(CoinMessages::Language language) { - newLanguage(language); - } - /// Overrides message handler with a default one - void setDefaultMessageHandler(); - /// Return handler - inline CoinMessageHandler * messageHandler() const { - return handler_; - } - /// Return messages - inline CoinMessages messages() const { - return messages_; - } - /// Return pointer to messages - inline CoinMessages * messagesPointer() { - return & messages_; - } - /// Return Coin messages - inline CoinMessages coinMessages() const { - return coinMessages_; - } - /// Return pointer to Coin messages - inline CoinMessages * coinMessagesPointer() { - return & coinMessages_; - } - /** Amount of print out: - 0 - none - 1 - just final - 2 - just factorizations - 3 - as 2 plus a bit more - 4 - verbose - above that 8,16,32 etc just for selective debug - */ - inline void setLogLevel(int value) { - handler_->setLogLevel(value); - } - inline int logLevel() const { - return handler_->logLevel(); - } - /// Return true if default handler - inline bool defaultHandler() const { - return defaultHandler_; - } - /// Pass in Event handler (cloned and deleted at end) - void passInEventHandler(const ClpEventHandler * eventHandler); - /// Event handler - inline ClpEventHandler * eventHandler() const { - return eventHandler_; - } - /// Thread specific random number generator - inline CoinThreadRandom * randomNumberGenerator() { - return &randomNumberGenerator_; - } - /// Thread specific random number generator - inline CoinThreadRandom & mutableRandomNumberGenerator() { - return randomNumberGenerator_; - } - /// Set seed for thread specific random number generator - inline void setRandomSeed(int value) { - randomNumberGenerator_.setSeed(value); - } - /// length of names (0 means no names0 - inline int lengthNames() const { - return lengthNames_; - } -#ifndef CLP_NO_STD - /// length of names (0 means no names0 - inline void setLengthNames(int value) { - lengthNames_ = value; - } - /// Row names - inline const std::vector<std::string> * rowNames() const { - return &rowNames_; - } - inline const std::string& rowName(int iRow) const { - return rowNames_[iRow]; - } - /// Return name or Rnnnnnnn - std::string getRowName(int iRow) const; - /// Column names - inline const std::vector<std::string> * columnNames() const { - return &columnNames_; - } - inline const std::string& columnName(int iColumn) const { - return columnNames_[iColumn]; - } - /// Return name or Cnnnnnnn - std::string getColumnName(int iColumn) const; -#endif - /// Objective methods - inline ClpObjective * objectiveAsObject() const { - return objective_; - } - void setObjective(ClpObjective * objective); - inline void setObjectivePointer(ClpObjective * newobjective) { - objective_ = newobjective; - } - /** Solve a problem with no elements - return status and - dual and primal infeasibilites */ - int emptyProblem(int * infeasNumber = NULL, double * infeasSum = NULL, bool printMessage = true); - - //@} - - /**@name Matrix times vector methods - They can be faster if scalar is +- 1 - These are covers so user need not worry about scaling - Also for simplex I am not using basic/non-basic split */ - //@{ - /** Return <code>y + A * x * scalar</code> in <code>y</code>. - @pre <code>x</code> must be of size <code>numColumns()</code> - @pre <code>y</code> must be of size <code>numRows()</code> */ - void times(double scalar, - const double * x, double * y) const; - /** Return <code>y + x * scalar * A</code> in <code>y</code>. - @pre <code>x</code> must be of size <code>numRows()</code> - @pre <code>y</code> must be of size <code>numColumns()</code> */ - void transposeTimes(double scalar, - const double * x, double * y) const ; - //@} - - - //--------------------------------------------------------------------------- - /**@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 volume 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. - - ** once it has been decided where solver sits this may be redone - */ - //@{ - /// Set an integer parameter - bool setIntParam(ClpIntParam key, int value) ; - /// Set an double parameter - bool setDblParam(ClpDblParam key, double value) ; -#ifndef CLP_NO_STD - /// Set an string parameter - bool setStrParam(ClpStrParam key, const std::string & value); -#endif - // Get an integer parameter - inline bool getIntParam(ClpIntParam key, int& value) const { - if (key < ClpLastIntParam) { - value = intParam_[key]; - return true; - } else { - return false; - } - } - // Get an double parameter - inline bool getDblParam(ClpDblParam key, double& value) const { - if (key < ClpLastDblParam) { - value = dblParam_[key]; - return true; - } else { - return false; - } - } -#ifndef CLP_NO_STD - // Get a string parameter - inline bool getStrParam(ClpStrParam key, std::string& value) const { - if (key < ClpLastStrParam) { - value = strParam_[key]; - return true; - } else { - return false; - } - } -#endif - /// Create C++ lines to get to current state - void generateCpp( FILE * fp); - /** For advanced options - 1 - Don't keep changing infeasibility weight - 2 - Keep nonLinearCost round solves - 4 - Force outgoing variables to exact bound (primal) - 8 - Safe to use dense initial factorization - 16 -Just use basic variables for operation if column generation - 32 -Create ray even in BAB - 64 -Treat problem as feasible until last minute (i.e. minimize infeasibilities) - 128 - Switch off all matrix sanity checks - 256 - No row copy - 512 - If not in values pass, solution guaranteed, skip as much as possible - 1024 - In branch and bound - 2048 - Don't bother to re-factorize if < 20 iterations - 4096 - Skip some optimality checks - 8192 - Do Primal when cleaning up primal - 16384 - In fast dual (so we can switch off things) - 32768 - called from Osi - 65536 - keep arrays around as much as possible (also use maximumR/C) - 131072 - transposeTimes is -1.0 and can skip basic and fixed - 262144 - extra copy of scaled matrix - 524288 - Clp fast dual - 1048576 - don't need to finish dual (can return 3) - 2097152 - zero costs! - 4194304 - don't scale integer variables - 8388608 - Idiot when not really sure about it - NOTE - many applications can call Clp but there may be some short cuts - which are taken which are not guaranteed safe from all applications. - Vetted applications will have a bit set and the code may test this - At present I expect a few such applications - if too many I will - have to re-think. It is up to application owner to change the code - if she/he needs these short cuts. I will not debug unless in Coin - repository. See COIN_CLP_VETTED comments. - 0x01000000 is Cbc (and in branch and bound) - 0x02000000 is in a different branch and bound - */ - inline unsigned int specialOptions() const { - return specialOptions_; - } - void setSpecialOptions(unsigned int value); -#define COIN_CBC_USING_CLP 0x01000000 - inline bool inCbcBranchAndBound() const { - return (specialOptions_ & COIN_CBC_USING_CLP) != 0; - } - //@} - - /**@name private or protected methods */ - //@{ -protected: - /// Does most of deletion (0 = all, 1 = most) - void gutsOfDelete(int type); - /** Does most of copying - If trueCopy 0 then just points to arrays - If -1 leaves as much as possible */ - void gutsOfCopy(const ClpModel & rhs, int trueCopy = 1); - /// gets lower and upper bounds on rows - void getRowBound(int iRow, double& lower, double& upper) const; - /// puts in format I like - 4 array matrix - may make row copy - void gutsOfLoadModel ( int numberRows, int numberColumns, - const double* collb, const double* colub, - const double* obj, - const double* rowlb, const double* rowub, - const double * rowObjective = NULL); - /// Does much of scaling - void gutsOfScaling(); - /// Objective value - always minimize - inline double rawObjectiveValue() const { - return objectiveValue_; - } - /// If we are using maximumRows_ and Columns_ - inline bool permanentArrays() const { - return (specialOptions_ & 65536) != 0; - } - /// Start using maximumRows_ and Columns_ - void startPermanentArrays(); - /// Stop using maximumRows_ and Columns_ - void stopPermanentArrays(); - /// Create row names as char ** - const char * const * rowNamesAsChar() const; - /// Create column names as char ** - const char * const * columnNamesAsChar() const; - /// Delete char * version of names - void deleteNamesAsChar(const char * const * names, int number) const; - /// On stopped - sets secondary status - void onStopped(); - //@} - - -////////////////// data ////////////////// -protected: - - /**@name data */ - //@{ - /// Direction of optimization (1 - minimize, -1 - maximize, 0 - ignore - double optimizationDirection_; - /// Array of double parameters - double dblParam_[ClpLastDblParam]; - /// Objective value - double objectiveValue_; - /// Small element value - double smallElement_; - /// Scaling of objective - double objectiveScale_; - /// Scaling of rhs and bounds - double rhsScale_; - /// Number of rows - int numberRows_; - /// Number of columns - int numberColumns_; - /// Row activities - double * rowActivity_; - /// Column activities - double * columnActivity_; - /// Duals - double * dual_; - /// Reduced costs - double * reducedCost_; - /// Row lower - double* rowLower_; - /// Row upper - double* rowUpper_; - /// Objective - ClpObjective * objective_; - /// Row Objective (? sign) - may be NULL - double * rowObjective_; - /// Column Lower - double * columnLower_; - /// Column Upper - double * columnUpper_; - /// Packed matrix - ClpMatrixBase * matrix_; - /// Row copy if wanted - ClpMatrixBase * rowCopy_; - /// Scaled packed matrix - ClpPackedMatrix * scaledMatrix_; - /// Infeasible/unbounded ray - double * ray_; - /// Row scale factors for matrix - double * rowScale_; - /// Column scale factors - double * columnScale_; - /// Inverse row scale factors for matrix (end of rowScale_) - double * inverseRowScale_; - /// Inverse column scale factors for matrix (end of columnScale_) - double * inverseColumnScale_; - /** Scale flag, 0 none, 1 equilibrium, 2 geometric, 3, auto, 4 dynamic, - 5 geometric on rows */ - int scalingFlag_; - /** Status (i.e. basis) Region. I know that not all algorithms need a status - array, but it made sense for things like crossover and put - all permanent stuff in one place. No assumption is made - about what is in status array (although it might be good to reserve - bottom 3 bits (i.e. 0-7 numeric) for classic status). This - is number of columns + number of rows long (in that order). - */ - unsigned char * status_; - /// Integer information - char * integerType_; - /// User pointer for whatever reason - void * userPointer_; - /// Trusted user pointer e.g. for heuristics - ClpTrustedData * trustedUserPointer_; - /// Array of integer parameters - int intParam_[ClpLastIntParam]; - /// Number of iterations - int numberIterations_; - /** Solve type - 1 simplex, 2 simplex interface, 3 Interior.*/ - int solveType_; - /** Whats changed since last solve. This is a work in progress - It is designed so careful people can make go faster. - It is only used when startFinishOptions used in dual or primal. - Bit 1 - number of rows/columns has not changed (so work arrays valid) - 2 - matrix has not changed - 4 - if matrix has changed only by adding rows - 8 - if matrix has changed only by adding columns - 16 - row lbs not changed - 32 - row ubs not changed - 64 - column objective not changed - 128 - column lbs not changed - 256 - column ubs not changed - 512 - basis not changed (up to user to set this to 0) - top bits may be used internally - shift by 65336 is 3 all same, 1 all except col bounds - */ -#define ROW_COLUMN_COUNTS_SAME 1 -#define MATRIX_SAME 2 -#define MATRIX_JUST_ROWS_ADDED 4 -#define MATRIX_JUST_COLUMNS_ADDED 8 -#define ROW_LOWER_SAME 16 -#define ROW_UPPER_SAME 32 -#define OBJECTIVE_SAME 64 -#define COLUMN_LOWER_SAME 128 -#define COLUMN_UPPER_SAME 256 -#define BASIS_SAME 512 -#define ALL_SAME 65339 -#define ALL_SAME_EXCEPT_COLUMN_BOUNDS 65337 - unsigned int whatsChanged_; - /// Status of problem - int problemStatus_; - /// Secondary status of problem - int secondaryStatus_; - /// length of names (0 means no names) - int lengthNames_; - /// Number of threads (not very operational) - int numberThreads_; - /** For advanced options - See get and set for meaning - */ - unsigned int specialOptions_; - /// Message handler - CoinMessageHandler * handler_; - /// Flag to say if default handler (so delete) - bool defaultHandler_; - /// Thread specific random number generator - CoinThreadRandom randomNumberGenerator_; - /// Event handler - ClpEventHandler * eventHandler_; -#ifndef CLP_NO_STD - /// Row names - std::vector<std::string> rowNames_; - /// Column names - std::vector<std::string> columnNames_; -#endif - /// Messages - CoinMessages messages_; - /// Coin messages - CoinMessages coinMessages_; - /// Maximum number of columns in model - int maximumColumns_; - /// Maximum number of rows in model - int maximumRows_; - /// Maximum number of columns (internal arrays) in model - int maximumInternalColumns_; - /// Maximum number of rows (internal arrays) in model - int maximumInternalRows_; - /// Base packed matrix - CoinPackedMatrix baseMatrix_; - /// Base row copy - CoinPackedMatrix baseRowCopy_; - /// Saved row scale factors for matrix - double * savedRowScale_; - /// Saved column scale factors - double * savedColumnScale_; -#ifndef CLP_NO_STD - /// Array of string parameters - std::string strParam_[ClpLastStrParam]; -#endif - //@} -}; -/** This is a tiny class where data can be saved round calls. - */ -class ClpDataSave { - -public: - /**@name Constructors and destructor - */ - //@{ - /// Default constructor - ClpDataSave ( ); - - /// Copy constructor. - ClpDataSave(const ClpDataSave &); - /// Assignment operator. This copies the data - ClpDataSave & operator=(const ClpDataSave & rhs); - /// Destructor - ~ClpDataSave ( ); - - //@} - -////////////////// data ////////////////// -public: - - /**@name data - with same names as in other classes*/ - //@{ - double dualBound_; - double infeasibilityCost_; - double pivotTolerance_; - double zeroFactorizationTolerance_; - double zeroSimplexTolerance_; - double acceptablePivot_; - double objectiveScale_; - int sparseThreshold_; - int perturbation_; - int forceFactorization_; - int scalingFlag_; - unsigned int specialOptions_; - //@} -}; - -#endif |