| 1 | /* $Id: CoinModel.hpp 1448 2011-06-19 15:34:41Z stefan $ */ |
| 2 | // Copyright (C) 2005, International Business Machines |
| 3 | // Corporation and others. All Rights Reserved. |
| 4 | // This code is licensed under the terms of the Eclipse Public License (EPL). |
| 5 | |
| 6 | #ifndef CoinModel_H |
| 7 | #define CoinModel_H |
| 8 | |
| 9 | #include "CoinModelUseful.hpp" |
| 10 | #include "CoinPackedMatrix.hpp" |
| 11 | #include "CoinFinite.hpp" |
| 12 | class CoinBaseModel { |
| 13 | |
| 14 | public: |
| 15 | |
| 16 | |
| 17 | /**@name Constructors, destructor */ |
| 18 | //@{ |
| 19 | /// Default Constructor |
| 20 | CoinBaseModel (); |
| 21 | |
| 22 | /// Copy constructor |
| 23 | CoinBaseModel ( const CoinBaseModel &rhs); |
| 24 | |
| 25 | /// Assignment operator |
| 26 | CoinBaseModel & operator=( const CoinBaseModel& rhs); |
| 27 | |
| 28 | /// Clone |
| 29 | virtual CoinBaseModel * clone() const=0; |
| 30 | |
| 31 | /// Destructor |
| 32 | virtual ~CoinBaseModel () ; |
| 33 | //@} |
| 34 | |
| 35 | /**@name For getting information */ |
| 36 | //@{ |
| 37 | /// Return number of rows |
| 38 | inline int numberRows() const |
| 39 | { return numberRows_;} |
| 40 | /// Return number of columns |
| 41 | inline int numberColumns() const |
| 42 | { return numberColumns_;} |
| 43 | /// Return number of elements |
| 44 | virtual CoinBigIndex numberElements() const = 0; |
| 45 | /** Returns the (constant) objective offset |
| 46 | This is the RHS entry for the objective row |
| 47 | */ |
| 48 | inline double objectiveOffset() const |
| 49 | { return objectiveOffset_;} |
| 50 | /// Set objective offset |
| 51 | inline void setObjectiveOffset(double value) |
| 52 | { objectiveOffset_=value;} |
| 53 | /// Direction of optimization (1 - minimize, -1 - maximize, 0 - ignore |
| 54 | inline double optimizationDirection() const { |
| 55 | return optimizationDirection_; |
| 56 | } |
| 57 | /// Set direction of optimization (1 - minimize, -1 - maximize, 0 - ignore |
| 58 | inline void setOptimizationDirection(double value) |
| 59 | { optimizationDirection_=value;} |
| 60 | /// Get print level 0 - off, 1 - errors, 2 - more |
| 61 | inline int logLevel() const |
| 62 | { return logLevel_;} |
| 63 | /// Set print level 0 - off, 1 - errors, 2 - more |
| 64 | void setLogLevel(int value); |
| 65 | /// Return the problem name |
| 66 | inline const char * getProblemName() const |
| 67 | { return problemName_.c_str();} |
| 68 | /// Set problem name |
| 69 | void setProblemName(const char *name) ; |
| 70 | /// Set problem name |
| 71 | void setProblemName(const std::string &name) ; |
| 72 | /// Return the row block name |
| 73 | inline const std::string & getRowBlock() const |
| 74 | { return rowBlockName_;} |
| 75 | /// Set row block name |
| 76 | inline void setRowBlock(const std::string &name) |
| 77 | { rowBlockName_ = name;} |
| 78 | /// Return the column block name |
| 79 | inline const std::string & getColumnBlock() const |
| 80 | { return columnBlockName_;} |
| 81 | /// Set column block name |
| 82 | inline void setColumnBlock(const std::string &name) |
| 83 | { columnBlockName_ = name;} |
| 84 | //@} |
| 85 | |
| 86 | protected: |
| 87 | /**@name Data members */ |
| 88 | //@{ |
| 89 | /// Current number of rows |
| 90 | int numberRows_; |
| 91 | /// Current number of columns |
| 92 | int numberColumns_; |
| 93 | /// Direction of optimization (1 - minimize, -1 - maximize, 0 - ignore |
| 94 | double optimizationDirection_; |
| 95 | /// Objective offset to be passed on |
| 96 | double objectiveOffset_; |
| 97 | /// Problem name |
| 98 | std::string problemName_; |
| 99 | /// Rowblock name |
| 100 | std::string rowBlockName_; |
| 101 | /// Columnblock name |
| 102 | std::string columnBlockName_; |
| 103 | /** Print level. |
| 104 | I could have gone for full message handling but this should normally |
| 105 | be silent and lightweight. I can always change. |
| 106 | 0 - no output |
| 107 | 1 - on errors |
| 108 | 2 - more detailed |
| 109 | */ |
| 110 | int logLevel_; |
| 111 | //@} |
| 112 | /// data |
| 113 | |
| 114 | }; |
| 115 | |
| 116 | /** |
| 117 | This is a simple minded model which is stored in a format which makes |
| 118 | it easier to construct and modify but not efficient for algorithms. It has |
| 119 | to be passed across to ClpModel or OsiSolverInterface by addRows, addCol(umn)s |
| 120 | or loadProblem. |
| 121 | |
| 122 | It may have up to four parts - |
| 123 | 1) A matrix of doubles (or strings - see note A) |
| 124 | 2) Column information including integer information and names |
| 125 | 3) Row information including names |
| 126 | 4) Quadratic objective (not implemented - but see A) |
| 127 | |
| 128 | This class is meant to make it more efficient to build a model. It is at |
| 129 | its most efficient when all additions are done as addRow or as addCol but |
| 130 | not mixed. If only 1 and 2 exist then solver.addColumns may be used to pass to solver, |
| 131 | if only 1 and 3 exist then solver.addRows may be used. Otherwise solver.loadProblem |
| 132 | must be used. |
| 133 | |
| 134 | If addRows and addColumns are mixed or if individual elements are set then the |
| 135 | speed will drop to some extent and more memory will be used. |
| 136 | |
| 137 | It is also possible to iterate over existing elements and to access columns and rows |
| 138 | by name. Again each of these use memory and cpu time. However memory is unlikely |
| 139 | to be critical as most algorithms will use much more. |
| 140 | |
| 141 | Notes: |
| 142 | A) Although this could be used to pass nonlinear information around the |
| 143 | only use at present is to have named values e.g. value1 which can then be |
| 144 | set to a value after model is created. I have no idea whether that could |
| 145 | be useful but I thought it might be fun. |
| 146 | Quadratic terms are allowed in strings! A solver could try and use this |
| 147 | if so - the convention is that 0.5* quadratic is stored |
| 148 | |
| 149 | B) This class could be useful for modeling. |
| 150 | */ |
| 151 | |
| 152 | class CoinModel : public CoinBaseModel { |
| 153 | |
| 154 | public: |
| 155 | /**@name Useful methods for building model */ |
| 156 | //@{ |
| 157 | /** add a row - numberInRow may be zero */ |
| 158 | void addRow(int numberInRow, const int * columns, |
| 159 | const double * elements, double rowLower=-COIN_DBL_MAX, |
| 160 | double rowUpper=COIN_DBL_MAX, const char * name=nullptr); |
| 161 | /// add a column - numberInColumn may be zero */ |
| 162 | void addColumn(int numberInColumn, const int * rows, |
| 163 | const double * elements, |
| 164 | double columnLower=0.0, |
| 165 | double columnUpper=COIN_DBL_MAX, double objectiveValue=0.0, |
| 166 | const char * name=nullptr, bool isInteger=false); |
| 167 | /// add a column - numberInColumn may be zero */ |
| 168 | inline void addCol(int numberInColumn, const int * rows, |
| 169 | const double * elements, |
| 170 | double columnLower=0.0, |
| 171 | double columnUpper=COIN_DBL_MAX, double objectiveValue=0.0, |
| 172 | const char * name=nullptr, bool isInteger=false) |
| 173 | { addColumn(numberInColumn, rows, elements, columnLower, columnUpper, objectiveValue, |
| 174 | name,isInteger);} |
| 175 | /// Sets value for row i and column j |
| 176 | inline void operator() (int i,int j,double value) |
| 177 | { setElement(i,j,value);} |
| 178 | /// Sets value for row i and column j |
| 179 | void setElement(int i,int j,double value) ; |
| 180 | /** Gets sorted row - user must provide enough space |
| 181 | (easiest is allocate number of columns). |
| 182 | If column or element NULL then just returns number |
| 183 | Returns number of elements |
| 184 | */ |
| 185 | int getRow(int whichRow, int * column, double * element); |
| 186 | /** Gets sorted column - user must provide enough space |
| 187 | (easiest is allocate number of rows). |
| 188 | If row or element NULL then just returns number |
| 189 | Returns number of elements |
| 190 | */ |
| 191 | int getColumn(int whichColumn, int * column, double * element); |
| 192 | /// Sets quadratic value for column i and j |
| 193 | void setQuadraticElement(int i,int j,double value) ; |
| 194 | /// Sets value for row i and column j as string |
| 195 | inline void operator() (int i,int j,const char * value) |
| 196 | { setElement(i,j,value);} |
| 197 | /// Sets value for row i and column j as string |
| 198 | void setElement(int i,int j,const char * value) ; |
| 199 | /// Associates a string with a value. Returns string id (or -1 if does not exist) |
| 200 | int associateElement(const char * stringValue, double value); |
| 201 | /** Sets rowLower (if row does not exist then |
| 202 | all rows up to this are defined with default values and no elements) |
| 203 | */ |
| 204 | void setRowLower(int whichRow,double rowLower); |
| 205 | /** Sets rowUpper (if row does not exist then |
| 206 | all rows up to this are defined with default values and no elements) |
| 207 | */ |
| 208 | void setRowUpper(int whichRow,double rowUpper); |
| 209 | /** Sets rowLower and rowUpper (if row does not exist then |
| 210 | all rows up to this are defined with default values and no elements) |
| 211 | */ |
| 212 | void setRowBounds(int whichRow,double rowLower,double rowUpper); |
| 213 | /** Sets name (if row does not exist then |
| 214 | all rows up to this are defined with default values and no elements) |
| 215 | */ |
| 216 | void setRowName(int whichRow,const char * rowName); |
| 217 | /** Sets columnLower (if column does not exist then |
| 218 | all columns up to this are defined with default values and no elements) |
| 219 | */ |
| 220 | void setColumnLower(int whichColumn,double columnLower); |
| 221 | /** Sets columnUpper (if column does not exist then |
| 222 | all columns up to this are defined with default values and no elements) |
| 223 | */ |
| 224 | void setColumnUpper(int whichColumn,double columnUpper); |
| 225 | /** Sets columnLower and columnUpper (if column does not exist then |
| 226 | all columns up to this are defined with default values and no elements) |
| 227 | */ |
| 228 | void setColumnBounds(int whichColumn,double columnLower,double columnUpper); |
| 229 | /** Sets columnObjective (if column does not exist then |
| 230 | all columns up to this are defined with default values and no elements) |
| 231 | */ |
| 232 | void setColumnObjective(int whichColumn,double columnObjective); |
| 233 | /** Sets name (if column does not exist then |
| 234 | all columns up to this are defined with default values and no elements) |
| 235 | */ |
| 236 | void setColumnName(int whichColumn,const char * columnName); |
| 237 | /** Sets integer state (if column does not exist then |
| 238 | all columns up to this are defined with default values and no elements) |
| 239 | */ |
| 240 | void setColumnIsInteger(int whichColumn,bool columnIsInteger); |
| 241 | /** Sets columnObjective (if column does not exist then |
| 242 | all columns up to this are defined with default values and no elements) |
| 243 | */ |
| 244 | inline void setObjective(int whichColumn,double columnObjective) |
| 245 | { setColumnObjective( whichColumn, columnObjective);} |
| 246 | /** Sets integer state (if column does not exist then |
| 247 | all columns up to this are defined with default values and no elements) |
| 248 | */ |
| 249 | inline void setIsInteger(int whichColumn,bool columnIsInteger) |
| 250 | { setColumnIsInteger( whichColumn, columnIsInteger);} |
| 251 | /** Sets integer (if column does not exist then |
| 252 | all columns up to this are defined with default values and no elements) |
| 253 | */ |
| 254 | inline void setInteger(int whichColumn) |
| 255 | { setColumnIsInteger( whichColumn, true);} |
| 256 | /** Sets continuous (if column does not exist then |
| 257 | all columns up to this are defined with default values and no elements) |
| 258 | */ |
| 259 | inline void setContinuous(int whichColumn) |
| 260 | { setColumnIsInteger( whichColumn, false);} |
| 261 | /** Sets columnLower (if column does not exist then |
| 262 | all columns up to this are defined with default values and no elements) |
| 263 | */ |
| 264 | inline void setColLower(int whichColumn,double columnLower) |
| 265 | { setColumnLower( whichColumn, columnLower);} |
| 266 | /** Sets columnUpper (if column does not exist then |
| 267 | all columns up to this are defined with default values and no elements) |
| 268 | */ |
| 269 | inline void setColUpper(int whichColumn,double columnUpper) |
| 270 | { setColumnUpper( whichColumn, columnUpper);} |
| 271 | /** Sets columnLower and columnUpper (if column does not exist then |
| 272 | all columns up to this are defined with default values and no elements) |
| 273 | */ |
| 274 | inline void setColBounds(int whichColumn,double columnLower,double columnUpper) |
| 275 | { setColumnBounds( whichColumn, columnLower, columnUpper);} |
| 276 | /** Sets columnObjective (if column does not exist then |
| 277 | all columns up to this are defined with default values and no elements) |
| 278 | */ |
| 279 | inline void setColObjective(int whichColumn,double columnObjective) |
| 280 | { setColumnObjective( whichColumn, columnObjective);} |
| 281 | /** Sets name (if column does not exist then |
| 282 | all columns up to this are defined with default values and no elements) |
| 283 | */ |
| 284 | inline void setColName(int whichColumn,const char * columnName) |
| 285 | { setColumnName( whichColumn, columnName);} |
| 286 | /** Sets integer (if column does not exist then |
| 287 | all columns up to this are defined with default values and no elements) |
| 288 | */ |
| 289 | inline void setColIsInteger(int whichColumn,bool columnIsInteger) |
| 290 | { setColumnIsInteger( whichColumn, columnIsInteger);} |
| 291 | /** Sets rowLower (if row does not exist then |
| 292 | all rows up to this are defined with default values and no elements) |
| 293 | */ |
| 294 | void setRowLower(int whichRow,const char * rowLower); |
| 295 | /** Sets rowUpper (if row does not exist then |
| 296 | all rows up to this are defined with default values and no elements) |
| 297 | */ |
| 298 | void setRowUpper(int whichRow,const char * rowUpper); |
| 299 | /** Sets columnLower (if column does not exist then |
| 300 | all columns up to this are defined with default values and no elements) |
| 301 | */ |
| 302 | void setColumnLower(int whichColumn,const char * columnLower); |
| 303 | /** Sets columnUpper (if column does not exist then |
| 304 | all columns up to this are defined with default values and no elements) |
| 305 | */ |
| 306 | void setColumnUpper(int whichColumn,const char * columnUpper); |
| 307 | /** Sets columnObjective (if column does not exist then |
| 308 | all columns up to this are defined with default values and no elements) |
| 309 | */ |
| 310 | void setColumnObjective(int whichColumn,const char * columnObjective); |
| 311 | /** Sets integer (if column does not exist then |
| 312 | all columns up to this are defined with default values and no elements) |
| 313 | */ |
| 314 | void setColumnIsInteger(int whichColumn,const char * columnIsInteger); |
| 315 | /** Sets columnObjective (if column does not exist then |
| 316 | all columns up to this are defined with default values and no elements) |
| 317 | */ |
| 318 | inline void setObjective(int whichColumn,const char * columnObjective) |
| 319 | { setColumnObjective( whichColumn, columnObjective);} |
| 320 | /** Sets integer (if column does not exist then |
| 321 | all columns up to this are defined with default values and no elements) |
| 322 | */ |
| 323 | inline void setIsInteger(int whichColumn,const char * columnIsInteger) |
| 324 | { setColumnIsInteger( whichColumn, columnIsInteger);} |
| 325 | /** Deletes all entries in row and bounds. Will be ignored by |
| 326 | writeMps etc and will be packed down if asked for. */ |
| 327 | void deleteRow(int whichRow); |
| 328 | /** Deletes all entries in column and bounds and objective. Will be ignored by |
| 329 | writeMps etc and will be packed down if asked for. */ |
| 330 | void deleteColumn(int whichColumn); |
| 331 | /** Deletes all entries in column and bounds. If last column the number of columns |
| 332 | will be decremented and true returned. */ |
| 333 | inline void deleteCol(int whichColumn) |
| 334 | { deleteColumn(whichColumn);} |
| 335 | /// Takes element out of matrix - returning position (<0 if not there); |
| 336 | int deleteElement(int row, int column); |
| 337 | /// Takes element out of matrix when position known |
| 338 | void deleteThisElement(int row, int column,int position); |
| 339 | /** Packs down all rows i.e. removes empty rows permanently. Empty rows |
| 340 | have no elements and feasible bounds. returns number of rows deleted. */ |
| 341 | int packRows(); |
| 342 | /** Packs down all columns i.e. removes empty columns permanently. Empty columns |
| 343 | have no elements and no objective. returns number of columns deleted. */ |
| 344 | int packColumns(); |
| 345 | /** Packs down all columns i.e. removes empty columns permanently. Empty columns |
| 346 | have no elements and no objective. returns number of columns deleted. */ |
| 347 | inline int packCols() |
| 348 | { return packColumns();} |
| 349 | /** Packs down all rows and columns. i.e. removes empty rows and columns permanently. |
| 350 | Empty rows have no elements and feasible bounds. |
| 351 | Empty columns have no elements and no objective. |
| 352 | returns number of rows+columns deleted. */ |
| 353 | int pack(); |
| 354 | |
| 355 | /** Sets columnObjective array |
| 356 | */ |
| 357 | void setObjective(int numberColumns,const double * objective) ; |
| 358 | /** Sets columnLower array |
| 359 | */ |
| 360 | void setColumnLower(int numberColumns,const double * columnLower); |
| 361 | /** Sets columnLower array |
| 362 | */ |
| 363 | inline void setColLower(int numberColumns,const double * columnLower) |
| 364 | { setColumnLower( numberColumns, columnLower);} |
| 365 | /** Sets columnUpper array |
| 366 | */ |
| 367 | void setColumnUpper(int numberColumns,const double * columnUpper); |
| 368 | /** Sets columnUpper array |
| 369 | */ |
| 370 | inline void setColUpper(int numberColumns,const double * columnUpper) |
| 371 | { setColumnUpper( numberColumns, columnUpper);} |
| 372 | /** Sets rowLower array |
| 373 | */ |
| 374 | void setRowLower(int numberRows,const double * rowLower); |
| 375 | /** Sets rowUpper array |
| 376 | */ |
| 377 | void setRowUpper(int numberRows,const double * rowUpper); |
| 378 | |
| 379 | /** Write the problem in MPS format to a file with the given filename. |
| 380 | |
| 381 | \param compression can be set to three values to indicate what kind |
| 382 | of file should be written |
| 383 | <ul> |
| 384 | <li> 0: plain text (default) |
| 385 | <li> 1: gzip compressed (.gz is appended to \c filename) |
| 386 | <li> 2: bzip2 compressed (.bz2 is appended to \c filename) (TODO) |
| 387 | </ul> |
| 388 | If the library was not compiled with the requested compression then |
| 389 | writeMps falls back to writing a plain text file. |
| 390 | |
| 391 | \param formatType specifies the precision to used for values in the |
| 392 | MPS file |
| 393 | <ul> |
| 394 | <li> 0: normal precision (default) |
| 395 | <li> 1: extra accuracy |
| 396 | <li> 2: IEEE hex |
| 397 | </ul> |
| 398 | |
| 399 | \param numberAcross specifies whether 1 or 2 (default) values should be |
| 400 | specified on every data line in the MPS file. |
| 401 | |
| 402 | not const as may change model e.g. fill in default bounds |
| 403 | */ |
| 404 | int writeMps(const char *filename, int compression = 0, |
| 405 | int formatType = 0, int numberAcross = 2, bool keepStrings=false) ; |
| 406 | |
| 407 | /** Check two models against each other. Return nonzero if different. |
| 408 | Ignore names if that set. |
| 409 | May modify both models by cleaning up |
| 410 | */ |
| 411 | int differentModel(CoinModel & other, bool ignoreNames); |
| 412 | //@} |
| 413 | |
| 414 | |
| 415 | /**@name For structured models */ |
| 416 | //@{ |
| 417 | /// Pass in CoinPackedMatrix (and switch off element updates) |
| 418 | void passInMatrix(const CoinPackedMatrix & matrix); |
| 419 | /** Convert elements to CoinPackedMatrix (and switch off element updates). |
| 420 | Returns number of errors */ |
| 421 | int convertMatrix(); |
| 422 | /// Return a pointer to CoinPackedMatrix (or NULL) |
| 423 | inline const CoinPackedMatrix * packedMatrix() const |
| 424 | { return packedMatrix_;} |
| 425 | /// Return pointers to original rows (for decomposition) |
| 426 | inline const int * originalRows() const |
| 427 | { return rowType_;} |
| 428 | /// Return pointers to original columns (for decomposition) |
| 429 | inline const int * originalColumns() const |
| 430 | { return columnType_;} |
| 431 | //@} |
| 432 | |
| 433 | |
| 434 | /**@name For getting information */ |
| 435 | //@{ |
| 436 | /// Return number of elements |
| 437 | inline CoinBigIndex numberElements() const override |
| 438 | { return numberElements_;} |
| 439 | /// Return elements as triples |
| 440 | inline const CoinModelTriple * elements() const |
| 441 | { return elements_;} |
| 442 | /// Returns value for row i and column j |
| 443 | inline double operator() (int i,int j) const |
| 444 | { return getElement(i,j);} |
| 445 | /// Returns value for row i and column j |
| 446 | double getElement(int i,int j) const; |
| 447 | /// Returns value for row rowName and column columnName |
| 448 | inline double operator() (const char * rowName,const char * columnName) const |
| 449 | { return getElement(rowName,columnName);} |
| 450 | /// Returns value for row rowName and column columnName |
| 451 | double getElement(const char * rowName,const char * columnName) const; |
| 452 | /// Returns quadratic value for columns i and j |
| 453 | double getQuadraticElement(int i,int j) const; |
| 454 | /** Returns value for row i and column j as string. |
| 455 | Returns NULL if does not exist. |
| 456 | Returns "Numeric" if not a string |
| 457 | */ |
| 458 | const char * getElementAsString(int i,int j) const; |
| 459 | /** Returns pointer to element for row i column j. |
| 460 | Only valid until next modification. |
| 461 | NULL if element does not exist */ |
| 462 | double * pointer (int i,int j) const; |
| 463 | /** Returns position in elements for row i column j. |
| 464 | Only valid until next modification. |
| 465 | -1 if element does not exist */ |
| 466 | int position (int i,int j) const; |
| 467 | |
| 468 | |
| 469 | /** Returns first element in given row - index is -1 if none. |
| 470 | Index is given by .index and value by .value |
| 471 | */ |
| 472 | CoinModelLink firstInRow(int whichRow) const ; |
| 473 | /** Returns last element in given row - index is -1 if none. |
| 474 | Index is given by .index and value by .value |
| 475 | */ |
| 476 | CoinModelLink lastInRow(int whichRow) const ; |
| 477 | /** Returns first element in given column - index is -1 if none. |
| 478 | Index is given by .index and value by .value |
| 479 | */ |
| 480 | CoinModelLink firstInColumn(int whichColumn) const ; |
| 481 | /** Returns last element in given column - index is -1 if none. |
| 482 | Index is given by .index and value by .value |
| 483 | */ |
| 484 | CoinModelLink lastInColumn(int whichColumn) const ; |
| 485 | /** Returns next element in current row or column - index is -1 if none. |
| 486 | Index is given by .index and value by .value. |
| 487 | User could also tell because input.next would be NULL |
| 488 | */ |
| 489 | CoinModelLink next(CoinModelLink & current) const ; |
| 490 | /** Returns previous element in current row or column - index is -1 if none. |
| 491 | Index is given by .index and value by .value. |
| 492 | User could also tell because input.previous would be NULL |
| 493 | May not be correct if matrix updated. |
| 494 | */ |
| 495 | CoinModelLink previous(CoinModelLink & current) const ; |
| 496 | /** Returns first element in given quadratic column - index is -1 if none. |
| 497 | Index is given by .index and value by .value |
| 498 | May not be correct if matrix updated. |
| 499 | */ |
| 500 | CoinModelLink firstInQuadraticColumn(int whichColumn) const ; |
| 501 | /** Returns last element in given quadratic column - index is -1 if none. |
| 502 | Index is given by .index and value by .value |
| 503 | */ |
| 504 | CoinModelLink lastInQuadraticColumn(int whichColumn) const ; |
| 505 | /** Gets rowLower (if row does not exist then -COIN_DBL_MAX) |
| 506 | */ |
| 507 | double getRowLower(int whichRow) const ; |
| 508 | /** Gets rowUpper (if row does not exist then +COIN_DBL_MAX) |
| 509 | */ |
| 510 | double getRowUpper(int whichRow) const ; |
| 511 | /** Gets name (if row does not exist then NULL) |
| 512 | */ |
| 513 | const char * getRowName(int whichRow) const ; |
| 514 | inline double rowLower(int whichRow) const |
| 515 | { return getRowLower(whichRow);} |
| 516 | /** Gets rowUpper (if row does not exist then COIN_DBL_MAX) |
| 517 | */ |
| 518 | inline double rowUpper(int whichRow) const |
| 519 | { return getRowUpper(whichRow) ;} |
| 520 | /** Gets name (if row does not exist then NULL) |
| 521 | */ |
| 522 | inline const char * rowName(int whichRow) const |
| 523 | { return getRowName(whichRow);} |
| 524 | /** Gets columnLower (if column does not exist then 0.0) |
| 525 | */ |
| 526 | double getColumnLower(int whichColumn) const ; |
| 527 | /** Gets columnUpper (if column does not exist then COIN_DBL_MAX) |
| 528 | */ |
| 529 | double getColumnUpper(int whichColumn) const ; |
| 530 | /** Gets columnObjective (if column does not exist then 0.0) |
| 531 | */ |
| 532 | double getColumnObjective(int whichColumn) const ; |
| 533 | /** Gets name (if column does not exist then NULL) |
| 534 | */ |
| 535 | const char * getColumnName(int whichColumn) const ; |
| 536 | /** Gets if integer (if column does not exist then false) |
| 537 | */ |
| 538 | bool getColumnIsInteger(int whichColumn) const ; |
| 539 | /** Gets columnLower (if column does not exist then 0.0) |
| 540 | */ |
| 541 | inline double columnLower(int whichColumn) const |
| 542 | { return getColumnLower(whichColumn);} |
| 543 | /** Gets columnUpper (if column does not exist then COIN_DBL_MAX) |
| 544 | */ |
| 545 | inline double columnUpper(int whichColumn) const |
| 546 | { return getColumnUpper(whichColumn) ;} |
| 547 | /** Gets columnObjective (if column does not exist then 0.0) |
| 548 | */ |
| 549 | inline double columnObjective(int whichColumn) const |
| 550 | { return getColumnObjective(whichColumn);} |
| 551 | /** Gets columnObjective (if column does not exist then 0.0) |
| 552 | */ |
| 553 | inline double objective(int whichColumn) const |
| 554 | { return getColumnObjective(whichColumn);} |
| 555 | /** Gets name (if column does not exist then NULL) |
| 556 | */ |
| 557 | inline const char * columnName(int whichColumn) const |
| 558 | { return getColumnName(whichColumn);} |
| 559 | /** Gets if integer (if column does not exist then false) |
| 560 | */ |
| 561 | inline bool columnIsInteger(int whichColumn) const |
| 562 | { return getColumnIsInteger(whichColumn);} |
| 563 | /** Gets if integer (if column does not exist then false) |
| 564 | */ |
| 565 | inline bool isInteger(int whichColumn) const |
| 566 | { return getColumnIsInteger(whichColumn);} |
| 567 | /** Gets columnLower (if column does not exist then 0.0) |
| 568 | */ |
| 569 | inline double getColLower(int whichColumn) const |
| 570 | { return getColumnLower(whichColumn);} |
| 571 | /** Gets columnUpper (if column does not exist then COIN_DBL_MAX) |
| 572 | */ |
| 573 | inline double getColUpper(int whichColumn) const |
| 574 | { return getColumnUpper(whichColumn) ;} |
| 575 | /** Gets columnObjective (if column does not exist then 0.0) |
| 576 | */ |
| 577 | inline double getColObjective(int whichColumn) const |
| 578 | { return getColumnObjective(whichColumn);} |
| 579 | /** Gets name (if column does not exist then NULL) |
| 580 | */ |
| 581 | inline const char * getColName(int whichColumn) const |
| 582 | { return getColumnName(whichColumn);} |
| 583 | /** Gets if integer (if column does not exist then false) |
| 584 | */ |
| 585 | inline bool getColIsInteger(int whichColumn) const |
| 586 | { return getColumnIsInteger(whichColumn);} |
| 587 | /** Gets rowLower (if row does not exist then -COIN_DBL_MAX) |
| 588 | */ |
| 589 | const char * getRowLowerAsString(int whichRow) const ; |
| 590 | /** Gets rowUpper (if row does not exist then +COIN_DBL_MAX) |
| 591 | */ |
| 592 | const char * getRowUpperAsString(int whichRow) const ; |
| 593 | inline const char * rowLowerAsString(int whichRow) const |
| 594 | { return getRowLowerAsString(whichRow);} |
| 595 | /** Gets rowUpper (if row does not exist then COIN_DBL_MAX) |
| 596 | */ |
| 597 | inline const char * rowUpperAsString(int whichRow) const |
| 598 | { return getRowUpperAsString(whichRow) ;} |
| 599 | /** Gets columnLower (if column does not exist then 0.0) |
| 600 | */ |
| 601 | const char * getColumnLowerAsString(int whichColumn) const ; |
| 602 | /** Gets columnUpper (if column does not exist then COIN_DBL_MAX) |
| 603 | */ |
| 604 | const char * getColumnUpperAsString(int whichColumn) const ; |
| 605 | /** Gets columnObjective (if column does not exist then 0.0) |
| 606 | */ |
| 607 | const char * getColumnObjectiveAsString(int whichColumn) const ; |
| 608 | /** Gets if integer (if column does not exist then false) |
| 609 | */ |
| 610 | const char * getColumnIsIntegerAsString(int whichColumn) const ; |
| 611 | /** Gets columnLower (if column does not exist then 0.0) |
| 612 | */ |
| 613 | inline const char * columnLowerAsString(int whichColumn) const |
| 614 | { return getColumnLowerAsString(whichColumn);} |
| 615 | /** Gets columnUpper (if column does not exist then COIN_DBL_MAX) |
| 616 | */ |
| 617 | inline const char * columnUpperAsString(int whichColumn) const |
| 618 | { return getColumnUpperAsString(whichColumn) ;} |
| 619 | /** Gets columnObjective (if column does not exist then 0.0) |
| 620 | */ |
| 621 | inline const char * columnObjectiveAsString(int whichColumn) const |
| 622 | { return getColumnObjectiveAsString(whichColumn);} |
| 623 | /** Gets columnObjective (if column does not exist then 0.0) |
| 624 | */ |
| 625 | inline const char * objectiveAsString(int whichColumn) const |
| 626 | { return getColumnObjectiveAsString(whichColumn);} |
| 627 | /** Gets if integer (if column does not exist then false) |
| 628 | */ |
| 629 | inline const char * columnIsIntegerAsString(int whichColumn) const |
| 630 | { return getColumnIsIntegerAsString(whichColumn);} |
| 631 | /** Gets if integer (if column does not exist then false) |
| 632 | */ |
| 633 | inline const char * isIntegerAsString(int whichColumn) const |
| 634 | { return getColumnIsIntegerAsString(whichColumn);} |
| 635 | /// Row index from row name (-1 if no names or no match) |
| 636 | int row(const char * rowName) const; |
| 637 | /// Column index from column name (-1 if no names or no match) |
| 638 | int column(const char * columnName) const; |
| 639 | /// Returns type |
| 640 | inline int type() const |
| 641 | { return type_;} |
| 642 | /// returns unset value |
| 643 | inline double unsetValue() const |
| 644 | { return -1.23456787654321e-97;} |
| 645 | /// Creates a packed matrix - return number of errors |
| 646 | int createPackedMatrix(CoinPackedMatrix & matrix, |
| 647 | const double * associated); |
| 648 | /** Fills in startPositive and startNegative with counts for +-1 matrix. |
| 649 | If not +-1 then startPositive[0]==-1 otherwise counts and |
| 650 | startPositive[numberColumns]== size |
| 651 | - return number of errors |
| 652 | */ |
| 653 | int countPlusMinusOne(CoinBigIndex * startPositive, CoinBigIndex * startNegative, |
| 654 | const double * associated); |
| 655 | /** Creates +-1 matrix given startPositive and startNegative counts for +-1 matrix. |
| 656 | */ |
| 657 | void createPlusMinusOne(CoinBigIndex * startPositive, CoinBigIndex * startNegative, |
| 658 | int * indices, |
| 659 | const double * associated); |
| 660 | /// Creates copies of various arrays - return number of errors |
| 661 | int createArrays(double * & rowLower, double * & rowUpper, |
| 662 | double * & columnLower, double * & columnUpper, |
| 663 | double * & objective, int * & integerType, |
| 664 | double * & associated); |
| 665 | /// Says if strings exist |
| 666 | inline bool stringsExist() const |
| 667 | { return string_.numberItems()!=0;} |
| 668 | /// Return string array |
| 669 | inline const CoinModelHash * stringArray() const |
| 670 | { return &string_;} |
| 671 | /// Returns associated array |
| 672 | inline double * associatedArray() const |
| 673 | { return associated_;} |
| 674 | /// Return rowLower array |
| 675 | inline double * rowLowerArray() const |
| 676 | { return rowLower_;} |
| 677 | /// Return rowUpper array |
| 678 | inline double * rowUpperArray() const |
| 679 | { return rowUpper_;} |
| 680 | /// Return columnLower array |
| 681 | inline double * columnLowerArray() const |
| 682 | { return columnLower_;} |
| 683 | /// Return columnUpper array |
| 684 | inline double * columnUpperArray() const |
| 685 | { return columnUpper_;} |
| 686 | /// Return objective array |
| 687 | inline double * objectiveArray() const |
| 688 | { return objective_;} |
| 689 | /// Return integerType array |
| 690 | inline int * integerTypeArray() const |
| 691 | { return integerType_;} |
| 692 | /// Return row names array |
| 693 | inline const CoinModelHash * rowNames() const |
| 694 | { return &rowName_;} |
| 695 | /// Return column names array |
| 696 | inline const CoinModelHash * columnNames() const |
| 697 | { return &columnName_;} |
| 698 | /// Returns array of 0 or nonzero if can be a cut (or returns NULL) |
| 699 | inline const int * cutMarker() const |
| 700 | { return cut_;} |
| 701 | /// Direction of optimization (1 - minimize, -1 - maximize, 0 - ignore |
| 702 | inline double optimizationDirection() const { |
| 703 | return optimizationDirection_; |
| 704 | } |
| 705 | /// Set direction of optimization (1 - minimize, -1 - maximize, 0 - ignore |
| 706 | inline void setOptimizationDirection(double value) |
| 707 | { optimizationDirection_=value;} |
| 708 | /// Return pointer to more information |
| 709 | inline void * moreInfo() const |
| 710 | { return moreInfo_;} |
| 711 | /// Set pointer to more information |
| 712 | inline void setMoreInfo(void * info) |
| 713 | { moreInfo_ = info;} |
| 714 | /** Returns which parts of model are set |
| 715 | 1 - matrix |
| 716 | 2 - rhs |
| 717 | 4 - row names |
| 718 | 8 - column bounds and/or objective |
| 719 | 16 - column names |
| 720 | 32 - integer types |
| 721 | */ |
| 722 | int whatIsSet() const; |
| 723 | //@} |
| 724 | |
| 725 | /**@name for block models - matrix will be CoinPackedMatrix */ |
| 726 | //@{ |
| 727 | /*! \brief Load in a problem by copying the arguments. The constraints on |
| 728 | the rows are given by lower and upper bounds. |
| 729 | |
| 730 | If a pointer is 0 then the following values are the default: |
| 731 | <ul> |
| 732 | <li> <code>colub</code>: all columns have upper bound infinity |
| 733 | <li> <code>collb</code>: all columns have lower bound 0 |
| 734 | <li> <code>rowub</code>: all rows have upper bound infinity |
| 735 | <li> <code>rowlb</code>: all rows have lower bound -infinity |
| 736 | <li> <code>obj</code>: all variables have 0 objective coefficient |
| 737 | </ul> |
| 738 | |
| 739 | Note that the default values for rowub and rowlb produce the |
| 740 | constraint -infty <= ax <= infty. This is probably not what you want. |
| 741 | */ |
| 742 | void loadBlock (const CoinPackedMatrix& matrix, |
| 743 | const double* collb, const double* colub, |
| 744 | const double* obj, |
| 745 | const double* rowlb, const double* rowub) ; |
| 746 | /*! \brief Load in a problem by copying the arguments. |
| 747 | The constraints on the rows are given by sense/rhs/range triplets. |
| 748 | |
| 749 | If a pointer is 0 then the following values are the default: |
| 750 | <ul> |
| 751 | <li> <code>colub</code>: all columns have upper bound infinity |
| 752 | <li> <code>collb</code>: all columns have lower bound 0 |
| 753 | <li> <code>obj</code>: all variables have 0 objective coefficient |
| 754 | <li> <code>rowsen</code>: all rows are >= |
| 755 | <li> <code>rowrhs</code>: all right hand sides are 0 |
| 756 | <li> <code>rowrng</code>: 0 for the ranged rows |
| 757 | </ul> |
| 758 | |
| 759 | Note that the default values for rowsen, rowrhs, and rowrng produce the |
| 760 | constraint ax >= 0. |
| 761 | */ |
| 762 | void loadBlock (const CoinPackedMatrix& matrix, |
| 763 | const double* collb, const double* colub, |
| 764 | const double* obj, |
| 765 | const char* rowsen, const double* rowrhs, |
| 766 | const double* rowrng) ; |
| 767 | |
| 768 | /*! \brief Load in a problem by copying the arguments. The constraint |
| 769 | matrix is is specified with standard column-major |
| 770 | column starts / row indices / coefficients vectors. |
| 771 | The constraints on the rows are given by lower and upper bounds. |
| 772 | |
| 773 | The matrix vectors must be gap-free. Note that <code>start</code> must |
| 774 | have <code>numcols+1</code> entries so that the length of the last column |
| 775 | can be calculated as <code>start[numcols]-start[numcols-1]</code>. |
| 776 | |
| 777 | See the previous loadBlock method using rowlb and rowub for default |
| 778 | argument values. |
| 779 | */ |
| 780 | void loadBlock (const int numcols, const int numrows, |
| 781 | const CoinBigIndex * start, const int* index, |
| 782 | const double* value, |
| 783 | const double* collb, const double* colub, |
| 784 | const double* obj, |
| 785 | const double* rowlb, const double* rowub) ; |
| 786 | |
| 787 | /*! \brief Load in a problem by copying the arguments. The constraint |
| 788 | matrix is is specified with standard column-major |
| 789 | column starts / row indices / coefficients vectors. |
| 790 | The constraints on the rows are given by sense/rhs/range triplets. |
| 791 | |
| 792 | The matrix vectors must be gap-free. Note that <code>start</code> must |
| 793 | have <code>numcols+1</code> entries so that the length of the last column |
| 794 | can be calculated as <code>start[numcols]-start[numcols-1]</code>. |
| 795 | |
| 796 | See the previous loadBlock method using sense/rhs/range for default |
| 797 | argument values. |
| 798 | */ |
| 799 | void loadBlock (const int numcols, const int numrows, |
| 800 | const CoinBigIndex * start, const int* index, |
| 801 | const double* value, |
| 802 | const double* collb, const double* colub, |
| 803 | const double* obj, |
| 804 | const char* rowsen, const double* rowrhs, |
| 805 | const double* rowrng) ; |
| 806 | |
| 807 | //@} |
| 808 | |
| 809 | /**@name Constructors, destructor */ |
| 810 | //@{ |
| 811 | /** Default constructor. */ |
| 812 | CoinModel(); |
| 813 | /** Read a problem in MPS or GAMS format from the given filename. |
| 814 | */ |
| 815 | CoinModel(const char *fileName, int allowStrings=0); |
| 816 | /** Read a problem from AMPL nl file |
| 817 | NOTE - as I can't work out configure etc the source code is in Cbc_ampl.cpp! |
| 818 | */ |
| 819 | CoinModel( int nonLinear, const char * fileName,const void * info); |
| 820 | /// From arrays |
| 821 | CoinModel(int numberRows, int numberColumns, |
| 822 | const CoinPackedMatrix * matrix, |
| 823 | const double * rowLower, const double * rowUpper, |
| 824 | const double * columnLower, const double * columnUpper, |
| 825 | const double * objective); |
| 826 | /// Clone |
| 827 | virtual CoinBaseModel * clone() const override; |
| 828 | |
| 829 | /** Destructor */ |
| 830 | virtual ~CoinModel(); |
| 831 | //@} |
| 832 | |
| 833 | /**@name Copy method */ |
| 834 | //@{ |
| 835 | /** The copy constructor. */ |
| 836 | CoinModel(const CoinModel&); |
| 837 | /// = |
| 838 | CoinModel& operator=(const CoinModel&); |
| 839 | //@} |
| 840 | |
| 841 | /**@name For debug */ |
| 842 | //@{ |
| 843 | /// Checks that links are consistent |
| 844 | void validateLinks() const; |
| 845 | //@} |
| 846 | private: |
| 847 | /// Resize |
| 848 | void resize(int maximumRows, int maximumColumns, int maximumElements); |
| 849 | /// Fill in default row information |
| 850 | void fillRows(int which,bool forceCreation,bool fromAddRow=false); |
| 851 | /// Fill in default column information |
| 852 | void fillColumns(int which,bool forceCreation,bool fromAddColumn=false); |
| 853 | /** Fill in default linked list information (1= row, 2 = column) |
| 854 | Marked as const as list is mutable */ |
| 855 | void fillList(int which, CoinModelLinkedList & list,int type) const ; |
| 856 | /** Create a linked list and synchronize free |
| 857 | type 1 for row 2 for column |
| 858 | Marked as const as list is mutable */ |
| 859 | void createList(int type) const; |
| 860 | /// Adds one string, returns index |
| 861 | int addString(const char * string); |
| 862 | /** Gets a double from a string possibly containing named strings, |
| 863 | returns unset if not found |
| 864 | */ |
| 865 | double getDoubleFromString(CoinYacc & info, const char * string); |
| 866 | /// Frees value memory |
| 867 | void freeStringMemory(CoinYacc & info); |
| 868 | public: |
| 869 | /// Fills in all associated - returning number of errors |
| 870 | int computeAssociated(double * associated); |
| 871 | /** Gets correct form for a quadratic row - user to delete |
| 872 | If row is not quadratic then returns which other variables are involved |
| 873 | with tiny (1.0e-100) elements and count of total number of variables which could not |
| 874 | be put in quadratic form |
| 875 | */ |
| 876 | CoinPackedMatrix * quadraticRow(int rowNumber,double * linear, |
| 877 | int & numberBad) const; |
| 878 | /// Replaces a quadratic row |
| 879 | void replaceQuadraticRow(int rowNumber,const double * linear, const CoinPackedMatrix * quadraticPart); |
| 880 | /** If possible return a model where if all variables marked nonzero are fixed |
| 881 | the problem will be linear. At present may only work if quadratic. |
| 882 | Returns NULL if not possible |
| 883 | */ |
| 884 | CoinModel * reorder(const char * mark) const; |
| 885 | /** Expands out all possible combinations for a knapsack |
| 886 | If buildObj NULL then just computes space needed - returns number elements |
| 887 | On entry numberOutput is maximum allowed, on exit it is number needed or |
| 888 | -1 (as will be number elements) if maximum exceeded. numberOutput will have at |
| 889 | least space to return values which reconstruct input. |
| 890 | Rows returned will be original rows but no entries will be returned for |
| 891 | any rows all of whose entries are in knapsack. So up to user to allow for this. |
| 892 | If reConstruct >=0 then returns number of entrie which make up item "reConstruct" |
| 893 | in expanded knapsack. Values in buildRow and buildElement; |
| 894 | */ |
| 895 | int expandKnapsack(int knapsackRow, int & numberOutput,double * buildObj, CoinBigIndex * buildStart, |
| 896 | int * buildRow, double * buildElement,int reConstruct=-1) const; |
| 897 | /// Sets cut marker array |
| 898 | void setCutMarker(int size,const int * marker); |
| 899 | /// Sets priority array |
| 900 | void setPriorities(int size,const int * priorities); |
| 901 | /// priorities (given for all columns (-1 if not integer) |
| 902 | inline const int * priorities() const |
| 903 | { return priority_;} |
| 904 | /// For decomposition set original row and column indices |
| 905 | void setOriginalIndices(const int * row, const int * column); |
| 906 | |
| 907 | private: |
| 908 | /** Read a problem from AMPL nl file |
| 909 | so not constructor so gdb will work |
| 910 | */ |
| 911 | void gdb( int nonLinear, const char * fileName, const void * info); |
| 912 | /// returns jColumn (-2 if linear term, -1 if unknown) and coefficient |
| 913 | int decodeBit(char * phrase, char * & nextPhrase, double & coefficient, bool ifFirst) const; |
| 914 | /// Aborts with message about packedMatrix |
| 915 | void badType() const; |
| 916 | /**@name Data members */ |
| 917 | //@{ |
| 918 | /// Maximum number of rows |
| 919 | int maximumRows_; |
| 920 | /// Maximum number of columns |
| 921 | int maximumColumns_; |
| 922 | /// Current number of elements |
| 923 | int numberElements_; |
| 924 | /// Maximum number of elements |
| 925 | int maximumElements_; |
| 926 | /// Current number of quadratic elements |
| 927 | int numberQuadraticElements_; |
| 928 | /// Maximum number of quadratic elements |
| 929 | int maximumQuadraticElements_; |
| 930 | /// Row lower |
| 931 | double * rowLower_; |
| 932 | /// Row upper |
| 933 | double * rowUpper_; |
| 934 | /// Row names |
| 935 | CoinModelHash rowName_; |
| 936 | /** Row types. |
| 937 | Has information - at present |
| 938 | bit 0 - rowLower is a string |
| 939 | bit 1 - rowUpper is a string |
| 940 | NOTE - if converted to CoinPackedMatrix - may be indices of |
| 941 | original rows (i.e. when decomposed) |
| 942 | */ |
| 943 | int * rowType_; |
| 944 | /// Objective |
| 945 | double * objective_; |
| 946 | /// Column Lower |
| 947 | double * columnLower_; |
| 948 | /// Column Upper |
| 949 | double * columnUpper_; |
| 950 | /// Column names |
| 951 | CoinModelHash columnName_; |
| 952 | /// Integer information |
| 953 | int * integerType_; |
| 954 | /// Strings |
| 955 | CoinModelHash string_; |
| 956 | /** Column types. |
| 957 | Has information - at present |
| 958 | bit 0 - columnLower is a string |
| 959 | bit 1 - columnUpper is a string |
| 960 | bit 2 - objective is a string |
| 961 | bit 3 - integer setting is a string |
| 962 | NOTE - if converted to CoinPackedMatrix - may be indices of |
| 963 | original columns (i.e. when decomposed) |
| 964 | */ |
| 965 | int * columnType_; |
| 966 | /// If simple then start of each row/column |
| 967 | int * start_; |
| 968 | /// Actual elements |
| 969 | CoinModelTriple * elements_; |
| 970 | /// Actual elements as CoinPackedMatrix |
| 971 | CoinPackedMatrix * packedMatrix_; |
| 972 | /// Hash for elements |
| 973 | mutable CoinModelHash2 hashElements_; |
| 974 | /// Linked list for rows |
| 975 | mutable CoinModelLinkedList rowList_; |
| 976 | /// Linked list for columns |
| 977 | mutable CoinModelLinkedList columnList_; |
| 978 | /// Actual quadratic elements (always linked lists) |
| 979 | CoinModelTriple * quadraticElements_; |
| 980 | /// Hash for quadratic elements |
| 981 | mutable CoinModelHash2 hashQuadraticElements_; |
| 982 | /// Array for sorting indices |
| 983 | int * sortIndices_; |
| 984 | /// Array for sorting elements |
| 985 | double * sortElements_; |
| 986 | /// Size of sort arrays |
| 987 | int sortSize_; |
| 988 | /// Linked list for quadratic rows |
| 989 | mutable CoinModelLinkedList quadraticRowList_; |
| 990 | /// Linked list for quadratic columns |
| 991 | mutable CoinModelLinkedList quadraticColumnList_; |
| 992 | /// Size of associated values |
| 993 | int sizeAssociated_; |
| 994 | /// Associated values |
| 995 | double * associated_; |
| 996 | /// Number of SOS - all these are done in one go e.g. from ampl |
| 997 | int numberSOS_; |
| 998 | /// SOS starts |
| 999 | int * startSOS_; |
| 1000 | /// SOS members |
| 1001 | int * memberSOS_; |
| 1002 | /// SOS type |
| 1003 | int * typeSOS_; |
| 1004 | /// SOS priority |
| 1005 | int * prioritySOS_; |
| 1006 | /// SOS reference |
| 1007 | double * referenceSOS_; |
| 1008 | /// priorities (given for all columns (-1 if not integer) |
| 1009 | int * priority_; |
| 1010 | /// Nonzero if row is cut - done in one go e.g. from ampl |
| 1011 | int * cut_; |
| 1012 | /// Pointer to more information |
| 1013 | void * moreInfo_; |
| 1014 | /** Type of build - |
| 1015 | -1 unset, |
| 1016 | 0 for row, |
| 1017 | 1 for column, |
| 1018 | 2 linked. |
| 1019 | 3 matrix is CoinPackedMatrix (and at present can't be modified); |
| 1020 | */ |
| 1021 | mutable int type_; |
| 1022 | /** Links present (could be tested by sizes of objects) |
| 1023 | 0 - none, |
| 1024 | 1 - row links, |
| 1025 | 2 - column links, |
| 1026 | 3 - both |
| 1027 | */ |
| 1028 | mutable int links_; |
| 1029 | //@} |
| 1030 | }; |
| 1031 | /// Just function of single variable x |
| 1032 | double getFunctionValueFromString(const char * string, const char * x, double xValue); |
| 1033 | /// faster version |
| 1034 | double getDoubleFromString(CoinYacc & info, const char * string, const char * x, double xValue); |
| 1035 | #endif |
| 1036 | |