| 1 | /* $Id: CoinSnapshot.cpp 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 |  | 
|---|
| 7 | #include "CoinUtilsConfig.h" | 
|---|
| 8 | #include "CoinHelperFunctions.hpp" | 
|---|
| 9 | #include "CoinSnapshot.hpp" | 
|---|
| 10 | #include "CoinPackedMatrix.hpp" | 
|---|
| 11 | #include "CoinFinite.hpp" | 
|---|
| 12 |  | 
|---|
| 13 | //############################################################################# | 
|---|
| 14 | // Constructors / Destructor / Assignment | 
|---|
| 15 | //############################################################################# | 
|---|
| 16 |  | 
|---|
| 17 | //------------------------------------------------------------------- | 
|---|
| 18 | // Default Constructor | 
|---|
| 19 | //------------------------------------------------------------------- | 
|---|
| 20 | CoinSnapshot::CoinSnapshot () | 
|---|
| 21 | { | 
|---|
| 22 | gutsOfDestructor(13); | 
|---|
| 23 | } | 
|---|
| 24 |  | 
|---|
| 25 | //------------------------------------------------------------------- | 
|---|
| 26 | // Copy constructor | 
|---|
| 27 | //------------------------------------------------------------------- | 
|---|
| 28 | CoinSnapshot::CoinSnapshot (const CoinSnapshot & rhs) | 
|---|
| 29 | { | 
|---|
| 30 | gutsOfDestructor(13); | 
|---|
| 31 | gutsOfCopy(rhs); | 
|---|
| 32 | } | 
|---|
| 33 |  | 
|---|
| 34 | //------------------------------------------------------------------- | 
|---|
| 35 | // Destructor | 
|---|
| 36 | //------------------------------------------------------------------- | 
|---|
| 37 | CoinSnapshot::~CoinSnapshot () | 
|---|
| 38 | { | 
|---|
| 39 | gutsOfDestructor(15); | 
|---|
| 40 | } | 
|---|
| 41 |  | 
|---|
| 42 | //---------------------------------------------------------------- | 
|---|
| 43 | // Assignment operator | 
|---|
| 44 | //------------------------------------------------------------------- | 
|---|
| 45 | CoinSnapshot & | 
|---|
| 46 | CoinSnapshot::operator=(const CoinSnapshot& rhs) | 
|---|
| 47 | { | 
|---|
| 48 | if (this != &rhs) { | 
|---|
| 49 | gutsOfDestructor(15); | 
|---|
| 50 | gutsOfCopy(rhs); | 
|---|
| 51 | } | 
|---|
| 52 | return *this; | 
|---|
| 53 | } | 
|---|
| 54 | // Does main work of destructor | 
|---|
| 55 | void | 
|---|
| 56 | CoinSnapshot::gutsOfDestructor(int type) | 
|---|
| 57 | { | 
|---|
| 58 | if ((type&2)!=0) { | 
|---|
| 59 | if (owned_.colLower) | 
|---|
| 60 | delete [] colLower_; | 
|---|
| 61 | if (owned_.colUpper) | 
|---|
| 62 | delete [] colUpper_; | 
|---|
| 63 | if (owned_.rowLower) | 
|---|
| 64 | delete [] rowLower_; | 
|---|
| 65 | if (owned_.rowUpper) | 
|---|
| 66 | delete [] rowUpper_; | 
|---|
| 67 | if (owned_.rightHandSide) | 
|---|
| 68 | delete [] rightHandSide_; | 
|---|
| 69 | if (owned_.objCoefficients) | 
|---|
| 70 | delete [] objCoefficients_; | 
|---|
| 71 | if (owned_.colType) | 
|---|
| 72 | delete [] colType_; | 
|---|
| 73 | if (owned_.matrixByRow) | 
|---|
| 74 | delete matrixByRow_; | 
|---|
| 75 | if (owned_.matrixByCol) | 
|---|
| 76 | delete matrixByCol_; | 
|---|
| 77 | if (owned_.originalMatrixByRow) | 
|---|
| 78 | delete originalMatrixByRow_; | 
|---|
| 79 | if (owned_.originalMatrixByCol) | 
|---|
| 80 | delete originalMatrixByCol_; | 
|---|
| 81 | if (owned_.colSolution) | 
|---|
| 82 | delete [] colSolution_; | 
|---|
| 83 | if (owned_.rowPrice) | 
|---|
| 84 | delete [] rowPrice_; | 
|---|
| 85 | if (owned_.reducedCost) | 
|---|
| 86 | delete [] reducedCost_; | 
|---|
| 87 | if (owned_.rowActivity) | 
|---|
| 88 | delete [] rowActivity_; | 
|---|
| 89 | if (owned_.doNotSeparateThis) | 
|---|
| 90 | delete [] doNotSeparateThis_; | 
|---|
| 91 | } | 
|---|
| 92 | if ((type&4)!=0) { | 
|---|
| 93 | objSense_ = 1.0; | 
|---|
| 94 | infinity_ = COIN_DBL_MAX; | 
|---|
| 95 | dualTolerance_ = 1.0e-7; | 
|---|
| 96 | primalTolerance_ = 1.0e-7; | 
|---|
| 97 | integerTolerance_ = 1.0e-7; | 
|---|
| 98 | } | 
|---|
| 99 | if ((type&8)!=0) { | 
|---|
| 100 | objValue_ = COIN_DBL_MAX; | 
|---|
| 101 | objOffset_ = 0.0; | 
|---|
| 102 | integerUpperBound_ = COIN_DBL_MAX; | 
|---|
| 103 | integerLowerBound_ = -COIN_DBL_MAX; | 
|---|
| 104 | } | 
|---|
| 105 | if ((type&1)!=0) { | 
|---|
| 106 | colLower_ = NULL; | 
|---|
| 107 | colUpper_ = NULL; | 
|---|
| 108 | rowLower_ = NULL; | 
|---|
| 109 | rowUpper_ = NULL; | 
|---|
| 110 | rightHandSide_ = NULL; | 
|---|
| 111 | objCoefficients_ = NULL; | 
|---|
| 112 | colType_ = NULL; | 
|---|
| 113 | matrixByRow_ = NULL; | 
|---|
| 114 | matrixByCol_ = NULL; | 
|---|
| 115 | originalMatrixByRow_ = NULL; | 
|---|
| 116 | originalMatrixByCol_ = NULL; | 
|---|
| 117 | colSolution_ = NULL; | 
|---|
| 118 | rowPrice_ = NULL; | 
|---|
| 119 | reducedCost_ = NULL; | 
|---|
| 120 | rowActivity_ = NULL; | 
|---|
| 121 | doNotSeparateThis_ = NULL; | 
|---|
| 122 | numCols_ = 0; | 
|---|
| 123 | numRows_ = 0; | 
|---|
| 124 | numElements_ = 0; | 
|---|
| 125 | numIntegers_ = 0; | 
|---|
| 126 | // say nothing owned | 
|---|
| 127 | memset(&owned_,0,sizeof(owned_)); | 
|---|
| 128 | } | 
|---|
| 129 | } | 
|---|
| 130 | // Does main work of copy | 
|---|
| 131 | void | 
|---|
| 132 | CoinSnapshot::gutsOfCopy(const CoinSnapshot & rhs) | 
|---|
| 133 | { | 
|---|
| 134 | objSense_ = rhs.objSense_; | 
|---|
| 135 | infinity_ = rhs.infinity_; | 
|---|
| 136 | objValue_ = rhs.objValue_; | 
|---|
| 137 | objOffset_ = rhs.objOffset_; | 
|---|
| 138 | dualTolerance_ = rhs.dualTolerance_; | 
|---|
| 139 | primalTolerance_ = rhs.primalTolerance_; | 
|---|
| 140 | integerTolerance_ = rhs.integerTolerance_; | 
|---|
| 141 | integerUpperBound_ = rhs.integerUpperBound_; | 
|---|
| 142 | integerLowerBound_ = rhs.integerLowerBound_; | 
|---|
| 143 | numCols_ = rhs.numCols_; | 
|---|
| 144 | numRows_ = rhs.numRows_; | 
|---|
| 145 | numElements_ = rhs.numElements_; | 
|---|
| 146 | numIntegers_ = rhs.numIntegers_; | 
|---|
| 147 | owned_ = rhs.owned_; | 
|---|
| 148 | if (owned_.colLower) | 
|---|
| 149 | colLower_ = CoinCopyOfArray(rhs.colLower_,numCols_); | 
|---|
| 150 | else | 
|---|
| 151 | colLower_ = rhs.colLower_; | 
|---|
| 152 | if (owned_.colUpper) | 
|---|
| 153 | colUpper_ = CoinCopyOfArray(rhs.colUpper_,numCols_); | 
|---|
| 154 | else | 
|---|
| 155 | colUpper_ = rhs.colUpper_; | 
|---|
| 156 | if (owned_.rowLower) | 
|---|
| 157 | rowLower_ = CoinCopyOfArray(rhs.rowLower_,numRows_); | 
|---|
| 158 | else | 
|---|
| 159 | rowLower_ = rhs.rowLower_; | 
|---|
| 160 | if (owned_.rowUpper) | 
|---|
| 161 | rowUpper_ = CoinCopyOfArray(rhs.rowUpper_,numRows_); | 
|---|
| 162 | else | 
|---|
| 163 | rowUpper_ = rhs.rowUpper_; | 
|---|
| 164 | if (owned_.rightHandSide) | 
|---|
| 165 | rightHandSide_ = CoinCopyOfArray(rhs.rightHandSide_,numRows_); | 
|---|
| 166 | else | 
|---|
| 167 | rightHandSide_ = rhs.rightHandSide_; | 
|---|
| 168 | if (owned_.objCoefficients) | 
|---|
| 169 | objCoefficients_ = CoinCopyOfArray(rhs.objCoefficients_,numCols_); | 
|---|
| 170 | else | 
|---|
| 171 | objCoefficients_ = rhs.objCoefficients_; | 
|---|
| 172 | if (owned_.colType) | 
|---|
| 173 | colType_ = CoinCopyOfArray(rhs.colType_,numCols_); | 
|---|
| 174 | else | 
|---|
| 175 | colType_ = rhs.colType_; | 
|---|
| 176 | if (owned_.colSolution) | 
|---|
| 177 | colSolution_ = CoinCopyOfArray(rhs.colSolution_,numCols_); | 
|---|
| 178 | else | 
|---|
| 179 | colSolution_ = rhs.colSolution_; | 
|---|
| 180 | if (owned_.rowPrice) | 
|---|
| 181 | rowPrice_ = CoinCopyOfArray(rhs.rowPrice_,numRows_); | 
|---|
| 182 | else | 
|---|
| 183 | rowPrice_ = rhs.rowPrice_; | 
|---|
| 184 | if (owned_.reducedCost) | 
|---|
| 185 | reducedCost_ = CoinCopyOfArray(rhs.reducedCost_,numCols_); | 
|---|
| 186 | else | 
|---|
| 187 | reducedCost_ = rhs.reducedCost_; | 
|---|
| 188 | if (owned_.rowActivity) | 
|---|
| 189 | rowActivity_ = CoinCopyOfArray(rhs.rowActivity_,numRows_); | 
|---|
| 190 | else | 
|---|
| 191 | rowActivity_ = rhs.rowActivity_; | 
|---|
| 192 | if (owned_.doNotSeparateThis) | 
|---|
| 193 | doNotSeparateThis_ = CoinCopyOfArray(rhs.doNotSeparateThis_,numCols_); | 
|---|
| 194 | else | 
|---|
| 195 | doNotSeparateThis_ = rhs.doNotSeparateThis_; | 
|---|
| 196 | if (owned_.matrixByRow) | 
|---|
| 197 | matrixByRow_ = new CoinPackedMatrix(*rhs.matrixByRow_); | 
|---|
| 198 | else | 
|---|
| 199 | matrixByRow_ = rhs.matrixByRow_; | 
|---|
| 200 | if (owned_.matrixByCol) | 
|---|
| 201 | matrixByCol_ = new CoinPackedMatrix(*rhs.matrixByCol_); | 
|---|
| 202 | else | 
|---|
| 203 | matrixByCol_ = rhs.matrixByCol_; | 
|---|
| 204 | if (owned_.originalMatrixByRow) | 
|---|
| 205 | originalMatrixByRow_ = new CoinPackedMatrix(*rhs.originalMatrixByRow_); | 
|---|
| 206 | else | 
|---|
| 207 | originalMatrixByRow_ = rhs.originalMatrixByRow_; | 
|---|
| 208 | if (owned_.originalMatrixByCol) | 
|---|
| 209 | originalMatrixByCol_ = new CoinPackedMatrix(*rhs.originalMatrixByCol_); | 
|---|
| 210 | else | 
|---|
| 211 | originalMatrixByCol_ = rhs.originalMatrixByCol_; | 
|---|
| 212 | } | 
|---|
| 213 | /* Load in an problem by copying the arguments (the constraints on the | 
|---|
| 214 | rows are given by lower and upper bounds). If a pointer is NULL then the | 
|---|
| 215 | following values are the default: | 
|---|
| 216 | <ul> | 
|---|
| 217 | <li> <code>colub</code>: all columns have upper bound infinity | 
|---|
| 218 | <li> <code>collb</code>: all columns have lower bound 0 | 
|---|
| 219 | <li> <code>rowub</code>: all rows have upper bound infinity | 
|---|
| 220 | <li> <code>rowlb</code>: all rows have lower bound -infinity | 
|---|
| 221 | <li> <code>obj</code>: all variables have 0 objective coefficient | 
|---|
| 222 | </ul> | 
|---|
| 223 | */ | 
|---|
| 224 | void | 
|---|
| 225 | CoinSnapshot::loadProblem(const CoinPackedMatrix& matrix, | 
|---|
| 226 | const double* collb, const double* colub, | 
|---|
| 227 | const double* obj, | 
|---|
| 228 | const double* rowlb, const double* rowub, | 
|---|
| 229 | bool makeRowCopy) | 
|---|
| 230 | { | 
|---|
| 231 | // Keep scalars (apart from objective value etc) | 
|---|
| 232 | gutsOfDestructor(3+8); | 
|---|
| 233 | numRows_ = matrix.getNumRows(); | 
|---|
| 234 | numCols_ = matrix.getNumCols(); | 
|---|
| 235 | numElements_ = matrix.getNumElements(); | 
|---|
| 236 | owned_.matrixByCol = 1; | 
|---|
| 237 | matrixByCol_ = new CoinPackedMatrix(matrix); | 
|---|
| 238 | if (makeRowCopy) { | 
|---|
| 239 | owned_.matrixByRow = 1; | 
|---|
| 240 | CoinPackedMatrix * matrixByRow = new CoinPackedMatrix(matrix); | 
|---|
| 241 | matrixByRow->reverseOrdering(); | 
|---|
| 242 | matrixByRow_ = matrixByRow; | 
|---|
| 243 | } | 
|---|
| 244 | colLower_ = CoinCopyOfArray(collb,numCols_,0.0); | 
|---|
| 245 | colUpper_ = CoinCopyOfArray(colub,numCols_,infinity_); | 
|---|
| 246 | objCoefficients_ = CoinCopyOfArray(obj,numCols_,0.0); | 
|---|
| 247 | rowLower_ = CoinCopyOfArray(rowlb,numRows_,-infinity_); | 
|---|
| 248 | rowUpper_ = CoinCopyOfArray(rowub,numRows_,infinity_); | 
|---|
| 249 | // do rhs as well | 
|---|
| 250 | createRightHandSide(); | 
|---|
| 251 | } | 
|---|
| 252 |  | 
|---|
| 253 | // Set pointer to array[getNumCols()] of column lower bounds | 
|---|
| 254 | void | 
|---|
| 255 | CoinSnapshot::setColLower(const double * array, bool copyIn) | 
|---|
| 256 | { | 
|---|
| 257 | if (owned_.colLower) | 
|---|
| 258 | delete [] colLower_; | 
|---|
| 259 | if (copyIn) { | 
|---|
| 260 | owned_.colLower=1; | 
|---|
| 261 | colLower_ = CoinCopyOfArray(array,numCols_); | 
|---|
| 262 | } else { | 
|---|
| 263 | owned_.colLower=0; | 
|---|
| 264 | colLower_ = array; | 
|---|
| 265 | } | 
|---|
| 266 | } | 
|---|
| 267 | // Set pointer to array[getNumCols()] of column upper bounds | 
|---|
| 268 | void | 
|---|
| 269 | CoinSnapshot::setColUpper(const double * array, bool copyIn) | 
|---|
| 270 | { | 
|---|
| 271 | if (owned_.colUpper) | 
|---|
| 272 | delete [] colUpper_; | 
|---|
| 273 | if (copyIn) { | 
|---|
| 274 | owned_.colUpper=1; | 
|---|
| 275 | colUpper_ = CoinCopyOfArray(array,numCols_); | 
|---|
| 276 | } else { | 
|---|
| 277 | owned_.colUpper=0; | 
|---|
| 278 | colUpper_ = array; | 
|---|
| 279 | } | 
|---|
| 280 | } | 
|---|
| 281 | // Set pointer to array[getNumRows()] of row lower bounds | 
|---|
| 282 | void | 
|---|
| 283 | CoinSnapshot::setRowLower(const double * array, bool copyIn) | 
|---|
| 284 | { | 
|---|
| 285 | if (owned_.rowLower) | 
|---|
| 286 | delete [] rowLower_; | 
|---|
| 287 | if (copyIn) { | 
|---|
| 288 | owned_.rowLower=1; | 
|---|
| 289 | rowLower_ = CoinCopyOfArray(array,numRows_); | 
|---|
| 290 | } else { | 
|---|
| 291 | owned_.rowLower=0; | 
|---|
| 292 | rowLower_ = array; | 
|---|
| 293 | } | 
|---|
| 294 | } | 
|---|
| 295 | // Set pointer to array[getNumRows()] of row upper bounds | 
|---|
| 296 | void | 
|---|
| 297 | CoinSnapshot::setRowUpper(const double * array, bool copyIn) | 
|---|
| 298 | { | 
|---|
| 299 | if (owned_.rowUpper) | 
|---|
| 300 | delete [] rowUpper_; | 
|---|
| 301 | if (copyIn) { | 
|---|
| 302 | owned_.rowUpper=1; | 
|---|
| 303 | rowUpper_ = CoinCopyOfArray(array,numRows_); | 
|---|
| 304 | } else { | 
|---|
| 305 | owned_.rowUpper=0; | 
|---|
| 306 | rowUpper_ = array; | 
|---|
| 307 | } | 
|---|
| 308 | } | 
|---|
| 309 | /* Set pointer to array[getNumRows()] of rhs side values | 
|---|
| 310 | This gives same results as OsiSolverInterface for useful cases | 
|---|
| 311 | If getRowUpper()[i] != infinity then | 
|---|
| 312 | getRightHandSide()[i] == getRowUpper()[i] | 
|---|
| 313 | else | 
|---|
| 314 | getRightHandSide()[i] == getRowLower()[i] | 
|---|
| 315 | */ | 
|---|
| 316 | void | 
|---|
| 317 | CoinSnapshot::setRightHandSide(const double * array, bool copyIn) | 
|---|
| 318 | { | 
|---|
| 319 | if (owned_.rightHandSide) | 
|---|
| 320 | delete [] rightHandSide_; | 
|---|
| 321 | if (copyIn) { | 
|---|
| 322 | owned_.rightHandSide=1; | 
|---|
| 323 | rightHandSide_ = CoinCopyOfArray(array,numRows_); | 
|---|
| 324 | } else { | 
|---|
| 325 | owned_.rightHandSide=0; | 
|---|
| 326 | rightHandSide_ = array; | 
|---|
| 327 | } | 
|---|
| 328 | } | 
|---|
| 329 | /* Create array[getNumRows()] of rhs side values | 
|---|
| 330 | This gives same results as OsiSolverInterface for useful cases | 
|---|
| 331 | If getRowUpper()[i] != infinity then | 
|---|
| 332 | getRightHandSide()[i] == getRowUpper()[i] | 
|---|
| 333 | else | 
|---|
| 334 | getRightHandSide()[i] == getRowLower()[i] | 
|---|
| 335 | */ | 
|---|
| 336 | void | 
|---|
| 337 | CoinSnapshot::createRightHandSide() | 
|---|
| 338 | { | 
|---|
| 339 | if (owned_.rightHandSide) | 
|---|
| 340 | delete [] rightHandSide_; | 
|---|
| 341 | owned_.rightHandSide=1; | 
|---|
| 342 | assert (rowUpper_); | 
|---|
| 343 | assert (rowLower_); | 
|---|
| 344 | double * rightHandSide = CoinCopyOfArray(rowUpper_,numRows_); | 
|---|
| 345 | for (int i=0;i<numRows_;i++) { | 
|---|
| 346 | if (rightHandSide[i]==infinity_) | 
|---|
| 347 | rightHandSide[i] = rowLower_[i]; | 
|---|
| 348 | } | 
|---|
| 349 | rightHandSide_ = rightHandSide; | 
|---|
| 350 | } | 
|---|
| 351 | // Set pointer to array[getNumCols()] of objective function coefficients | 
|---|
| 352 | void | 
|---|
| 353 | CoinSnapshot::setObjCoefficients(const double * array, bool copyIn) | 
|---|
| 354 | { | 
|---|
| 355 | if (owned_.objCoefficients) | 
|---|
| 356 | delete [] objCoefficients_; | 
|---|
| 357 | if (copyIn) { | 
|---|
| 358 | owned_.objCoefficients=1; | 
|---|
| 359 | objCoefficients_ = CoinCopyOfArray(array,numCols_); | 
|---|
| 360 | } else { | 
|---|
| 361 | owned_.objCoefficients=0; | 
|---|
| 362 | objCoefficients_ = array; | 
|---|
| 363 | } | 
|---|
| 364 | } | 
|---|
| 365 | // Set colType array ('B', 'I', or 'C' for Binary, Integer and Continuous) | 
|---|
| 366 | void | 
|---|
| 367 | CoinSnapshot::setColType(const char *array, bool copyIn) | 
|---|
| 368 | { | 
|---|
| 369 | if (owned_.colType) | 
|---|
| 370 | delete [] colType_; | 
|---|
| 371 | if (copyIn) { | 
|---|
| 372 | owned_.colType=1; | 
|---|
| 373 | colType_ = CoinCopyOfArray(array,numCols_); | 
|---|
| 374 | } else { | 
|---|
| 375 | owned_.colType=0; | 
|---|
| 376 | colType_ = array; | 
|---|
| 377 | } | 
|---|
| 378 | int i; | 
|---|
| 379 | numIntegers_=0; | 
|---|
| 380 | for (i=0;i<numCols_;i++) { | 
|---|
| 381 | if (colType_[i]=='B'||colType_[i]=='I') | 
|---|
| 382 | numIntegers_++; | 
|---|
| 383 | } | 
|---|
| 384 | } | 
|---|
| 385 | // Set pointer to row-wise copy of current matrix | 
|---|
| 386 | void | 
|---|
| 387 | CoinSnapshot::setMatrixByRow(const CoinPackedMatrix * matrix, bool copyIn) | 
|---|
| 388 | { | 
|---|
| 389 | if (owned_.matrixByRow) | 
|---|
| 390 | delete matrixByRow_; | 
|---|
| 391 | if (copyIn) { | 
|---|
| 392 | owned_.matrixByRow=1; | 
|---|
| 393 | matrixByRow_ = new CoinPackedMatrix(*matrix); | 
|---|
| 394 | } else { | 
|---|
| 395 | owned_.matrixByRow=0; | 
|---|
| 396 | matrixByRow_ = matrix; | 
|---|
| 397 | } | 
|---|
| 398 | assert (matrixByRow_->getNumCols()==numCols_); | 
|---|
| 399 | assert (matrixByRow_->getNumRows()==numRows_); | 
|---|
| 400 | } | 
|---|
| 401 | // Create row-wise copy from MatrixByCol | 
|---|
| 402 | void | 
|---|
| 403 | CoinSnapshot::createMatrixByRow() | 
|---|
| 404 | { | 
|---|
| 405 | if (owned_.matrixByRow) | 
|---|
| 406 | delete matrixByRow_; | 
|---|
| 407 | assert (matrixByCol_); | 
|---|
| 408 | owned_.matrixByRow = 1; | 
|---|
| 409 | CoinPackedMatrix * matrixByRow = new CoinPackedMatrix(*matrixByCol_); | 
|---|
| 410 | matrixByRow->reverseOrdering(); | 
|---|
| 411 | matrixByRow_ = matrixByRow; | 
|---|
| 412 | } | 
|---|
| 413 | // Set pointer to column-wise copy of current matrix | 
|---|
| 414 | void | 
|---|
| 415 | CoinSnapshot::setMatrixByCol(const CoinPackedMatrix * matrix, bool copyIn) | 
|---|
| 416 | { | 
|---|
| 417 | if (owned_.matrixByCol) | 
|---|
| 418 | delete matrixByCol_; | 
|---|
| 419 | if (copyIn) { | 
|---|
| 420 | owned_.matrixByCol=1; | 
|---|
| 421 | matrixByCol_ = new CoinPackedMatrix(*matrix); | 
|---|
| 422 | } else { | 
|---|
| 423 | owned_.matrixByCol=0; | 
|---|
| 424 | matrixByCol_ = matrix; | 
|---|
| 425 | } | 
|---|
| 426 | assert (matrixByCol_->getNumCols()==numCols_); | 
|---|
| 427 | assert (matrixByCol_->getNumRows()==numRows_); | 
|---|
| 428 | } | 
|---|
| 429 | // Set pointer to row-wise copy of "original" matrix | 
|---|
| 430 | void | 
|---|
| 431 | CoinSnapshot::setOriginalMatrixByRow(const CoinPackedMatrix * matrix, bool copyIn) | 
|---|
| 432 | { | 
|---|
| 433 | if (owned_.originalMatrixByRow) | 
|---|
| 434 | delete originalMatrixByRow_; | 
|---|
| 435 | if (copyIn) { | 
|---|
| 436 | owned_.originalMatrixByRow=1; | 
|---|
| 437 | originalMatrixByRow_ = new CoinPackedMatrix(*matrix); | 
|---|
| 438 | } else { | 
|---|
| 439 | owned_.originalMatrixByRow=0; | 
|---|
| 440 | originalMatrixByRow_ = matrix; | 
|---|
| 441 | } | 
|---|
| 442 | assert (matrixByRow_->getNumCols()==numCols_); | 
|---|
| 443 | } | 
|---|
| 444 | // Set pointer to column-wise copy of "original" matrix | 
|---|
| 445 | void | 
|---|
| 446 | CoinSnapshot::setOriginalMatrixByCol(const CoinPackedMatrix * matrix, bool copyIn) | 
|---|
| 447 | { | 
|---|
| 448 | if (owned_.originalMatrixByCol) | 
|---|
| 449 | delete originalMatrixByCol_; | 
|---|
| 450 | if (copyIn) { | 
|---|
| 451 | owned_.originalMatrixByCol=1; | 
|---|
| 452 | originalMatrixByCol_ = new CoinPackedMatrix(*matrix); | 
|---|
| 453 | } else { | 
|---|
| 454 | owned_.originalMatrixByCol=0; | 
|---|
| 455 | originalMatrixByCol_ = matrix; | 
|---|
| 456 | } | 
|---|
| 457 | assert (matrixByCol_->getNumCols()==numCols_); | 
|---|
| 458 | } | 
|---|
| 459 | // Set pointer to array[getNumCols()] of primal variable values | 
|---|
| 460 | void | 
|---|
| 461 | CoinSnapshot::setColSolution(const double * array, bool copyIn) | 
|---|
| 462 | { | 
|---|
| 463 | if (owned_.colSolution) | 
|---|
| 464 | delete [] colSolution_; | 
|---|
| 465 | if (copyIn) { | 
|---|
| 466 | owned_.colSolution=1; | 
|---|
| 467 | colSolution_ = CoinCopyOfArray(array,numCols_); | 
|---|
| 468 | } else { | 
|---|
| 469 | owned_.colSolution=0; | 
|---|
| 470 | colSolution_ = array; | 
|---|
| 471 | } | 
|---|
| 472 | } | 
|---|
| 473 | // Set pointer to array[getNumRows()] of dual variable values | 
|---|
| 474 | void | 
|---|
| 475 | CoinSnapshot::setRowPrice(const double * array, bool copyIn) | 
|---|
| 476 | { | 
|---|
| 477 | if (owned_.rowPrice) | 
|---|
| 478 | delete [] rowPrice_; | 
|---|
| 479 | if (copyIn) { | 
|---|
| 480 | owned_.rowPrice=1; | 
|---|
| 481 | rowPrice_ = CoinCopyOfArray(array,numRows_); | 
|---|
| 482 | } else { | 
|---|
| 483 | owned_.rowPrice=0; | 
|---|
| 484 | rowPrice_ = array; | 
|---|
| 485 | } | 
|---|
| 486 | } | 
|---|
| 487 | // Set a pointer to array[getNumCols()] of reduced costs | 
|---|
| 488 | void | 
|---|
| 489 | CoinSnapshot::setReducedCost(const double * array, bool copyIn) | 
|---|
| 490 | { | 
|---|
| 491 | if (owned_.reducedCost) | 
|---|
| 492 | delete [] reducedCost_; | 
|---|
| 493 | if (copyIn) { | 
|---|
| 494 | owned_.reducedCost=1; | 
|---|
| 495 | reducedCost_ = CoinCopyOfArray(array,numCols_); | 
|---|
| 496 | } else { | 
|---|
| 497 | owned_.reducedCost=0; | 
|---|
| 498 | reducedCost_ = array; | 
|---|
| 499 | } | 
|---|
| 500 | } | 
|---|
| 501 | // Set pointer to array[getNumRows()] of row activity levels (constraint matrix times the solution vector). | 
|---|
| 502 | void | 
|---|
| 503 | CoinSnapshot::setRowActivity(const double * array, bool copyIn) | 
|---|
| 504 | { | 
|---|
| 505 | if (owned_.rowActivity) | 
|---|
| 506 | delete [] rowActivity_; | 
|---|
| 507 | if (copyIn) { | 
|---|
| 508 | owned_.rowActivity=1; | 
|---|
| 509 | rowActivity_ = CoinCopyOfArray(array,numRows_); | 
|---|
| 510 | } else { | 
|---|
| 511 | owned_.rowActivity=0; | 
|---|
| 512 | rowActivity_ = array; | 
|---|
| 513 | } | 
|---|
| 514 | } | 
|---|
| 515 | // Set pointer to array[getNumCols()] of primal variable values which should not be separated (for debug) | 
|---|
| 516 | void | 
|---|
| 517 | CoinSnapshot::setDoNotSeparateThis(const double * array, bool copyIn) | 
|---|
| 518 | { | 
|---|
| 519 | if (owned_.doNotSeparateThis) | 
|---|
| 520 | delete [] doNotSeparateThis_; | 
|---|
| 521 | if (copyIn) { | 
|---|
| 522 | owned_.doNotSeparateThis=1; | 
|---|
| 523 | doNotSeparateThis_ = CoinCopyOfArray(array,numCols_); | 
|---|
| 524 | } else { | 
|---|
| 525 | owned_.doNotSeparateThis=0; | 
|---|
| 526 | doNotSeparateThis_ = array; | 
|---|
| 527 | } | 
|---|
| 528 | } | 
|---|
| 529 |  | 
|---|