| 1 | /* $Id: ClpInterior.hpp 1665 2011-01-04 17:55:54Z lou $ */ |
| 2 | // Copyright (C) 2003, 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 | Authors |
| 7 | |
| 8 | John Tomlin (pdco) |
| 9 | John Forrest (standard predictor-corrector) |
| 10 | |
| 11 | Note JJF has added arrays - this takes more memory but makes |
| 12 | flow easier to understand and hopefully easier to extend |
| 13 | |
| 14 | */ |
| 15 | #ifndef ClpInterior_H |
| 16 | #define ClpInterior_H |
| 17 | |
| 18 | #include <iostream> |
| 19 | #include <cfloat> |
| 20 | #include "ClpModel.hpp" |
| 21 | #include "ClpMatrixBase.hpp" |
| 22 | #include "ClpSolve.hpp" |
| 23 | #include "CoinDenseVector.hpp" |
| 24 | class ClpLsqr; |
| 25 | class ClpPdcoBase; |
| 26 | /// ******** DATA to be moved into protected section of ClpInterior |
| 27 | typedef struct { |
| 28 | double atolmin; |
| 29 | double r3norm; |
| 30 | double LSdamp; |
| 31 | double* deltay; |
| 32 | } Info; |
| 33 | /// ******** DATA to be moved into protected section of ClpInterior |
| 34 | |
| 35 | typedef struct { |
| 36 | double atolold; |
| 37 | double atolnew; |
| 38 | double r3ratio; |
| 39 | int istop; |
| 40 | int itncg; |
| 41 | } Outfo; |
| 42 | /// ******** DATA to be moved into protected section of ClpInterior |
| 43 | |
| 44 | typedef struct { |
| 45 | double gamma; |
| 46 | double delta; |
| 47 | int MaxIter; |
| 48 | double FeaTol; |
| 49 | double OptTol; |
| 50 | double StepTol; |
| 51 | double x0min; |
| 52 | double z0min; |
| 53 | double mu0; |
| 54 | int LSmethod; // 1=Cholesky 2=QR 3=LSQR |
| 55 | int LSproblem; // See below |
| 56 | int LSQRMaxIter; |
| 57 | double LSQRatol1; // Initial atol |
| 58 | double LSQRatol2; // Smallest atol (unless atol1 is smaller) |
| 59 | double LSQRconlim; |
| 60 | int wait; |
| 61 | } Options; |
| 62 | class Lsqr; |
| 63 | class ClpCholeskyBase; |
| 64 | // ***** END |
| 65 | /** This solves LPs using interior point methods |
| 66 | |
| 67 | It inherits from ClpModel and all its arrays are created at |
| 68 | algorithm time. |
| 69 | |
| 70 | */ |
| 71 | |
| 72 | class ClpInterior : public ClpModel { |
| 73 | friend void ClpInteriorUnitTest(const std::string & mpsDir, |
| 74 | const std::string & netlibDir); |
| 75 | |
| 76 | public: |
| 77 | |
| 78 | /**@name Constructors and destructor and copy */ |
| 79 | //@{ |
| 80 | /// Default constructor |
| 81 | ClpInterior ( ); |
| 82 | |
| 83 | /// Copy constructor. |
| 84 | ClpInterior(const ClpInterior &); |
| 85 | /// Copy constructor from model. |
| 86 | ClpInterior(const ClpModel &); |
| 87 | /** Subproblem constructor. A subset of whole model is created from the |
| 88 | row and column lists given. The new order is given by list order and |
| 89 | duplicates are allowed. Name and integer information can be dropped |
| 90 | */ |
| 91 | ClpInterior (const ClpModel * wholeModel, |
| 92 | int numberRows, const int * whichRows, |
| 93 | int numberColumns, const int * whichColumns, |
| 94 | bool dropNames = true, bool dropIntegers = true); |
| 95 | /// Assignment operator. This copies the data |
| 96 | ClpInterior & operator=(const ClpInterior & rhs); |
| 97 | /// Destructor |
| 98 | ~ClpInterior ( ); |
| 99 | // Ones below are just ClpModel with some changes |
| 100 | /** Loads a problem (the constraints on the |
| 101 | rows are given by lower and upper bounds). If a pointer is 0 then the |
| 102 | following values are the default: |
| 103 | <ul> |
| 104 | <li> <code>colub</code>: all columns have upper bound infinity |
| 105 | <li> <code>collb</code>: all columns have lower bound 0 |
| 106 | <li> <code>rowub</code>: all rows have upper bound infinity |
| 107 | <li> <code>rowlb</code>: all rows have lower bound -infinity |
| 108 | <li> <code>obj</code>: all variables have 0 objective coefficient |
| 109 | </ul> |
| 110 | */ |
| 111 | void loadProblem ( const ClpMatrixBase& matrix, |
| 112 | const double* collb, const double* colub, |
| 113 | const double* obj, |
| 114 | const double* rowlb, const double* rowub, |
| 115 | const double * rowObjective = nullptr); |
| 116 | void loadProblem ( const CoinPackedMatrix& matrix, |
| 117 | const double* collb, const double* colub, |
| 118 | const double* obj, |
| 119 | const double* rowlb, const double* rowub, |
| 120 | const double * rowObjective = nullptr); |
| 121 | |
| 122 | /** Just like the other loadProblem() method except that the matrix is |
| 123 | given in a standard column major ordered format (without gaps). */ |
| 124 | void loadProblem ( const int numcols, const int numrows, |
| 125 | const CoinBigIndex* start, const int* index, |
| 126 | const double* value, |
| 127 | const double* collb, const double* colub, |
| 128 | const double* obj, |
| 129 | const double* rowlb, const double* rowub, |
| 130 | const double * rowObjective = nullptr); |
| 131 | /// This one is for after presolve to save memory |
| 132 | void loadProblem ( const int numcols, const int numrows, |
| 133 | const CoinBigIndex* start, const int* index, |
| 134 | const double* value, const int * length, |
| 135 | const double* collb, const double* colub, |
| 136 | const double* obj, |
| 137 | const double* rowlb, const double* rowub, |
| 138 | const double * rowObjective = nullptr); |
| 139 | /// Read an mps file from the given filename |
| 140 | int readMps(const char *filename, |
| 141 | bool keepNames = false, |
| 142 | bool ignoreErrors = false); |
| 143 | /** Borrow model. This is so we dont have to copy large amounts |
| 144 | of data around. It assumes a derived class wants to overwrite |
| 145 | an empty model with a real one - while it does an algorithm. |
| 146 | This is same as ClpModel one. */ |
| 147 | void borrowModel(ClpModel & otherModel); |
| 148 | /** Return model - updates any scalars */ |
| 149 | void returnModel(ClpModel & otherModel); |
| 150 | //@} |
| 151 | |
| 152 | /**@name Functions most useful to user */ |
| 153 | //@{ |
| 154 | /** Pdco algorithm - see ClpPdco.hpp for method */ |
| 155 | int pdco(); |
| 156 | // ** Temporary version |
| 157 | int pdco( ClpPdcoBase * stuff, Options &options, Info &info, Outfo &outfo); |
| 158 | /// Primal-Dual Predictor-Corrector barrier |
| 159 | int primalDual(); |
| 160 | //@} |
| 161 | |
| 162 | /**@name most useful gets and sets */ |
| 163 | //@{ |
| 164 | /// If problem is primal feasible |
| 165 | inline bool primalFeasible() const { |
| 166 | return (sumPrimalInfeasibilities_ <= 1.0e-5); |
| 167 | } |
| 168 | /// If problem is dual feasible |
| 169 | inline bool dualFeasible() const { |
| 170 | return (sumDualInfeasibilities_ <= 1.0e-5); |
| 171 | } |
| 172 | /// Current (or last) algorithm |
| 173 | inline int algorithm() const { |
| 174 | return algorithm_; |
| 175 | } |
| 176 | /// Set algorithm |
| 177 | inline void setAlgorithm(int value) { |
| 178 | algorithm_ = value; |
| 179 | } |
| 180 | /// Sum of dual infeasibilities |
| 181 | inline CoinWorkDouble sumDualInfeasibilities() const { |
| 182 | return sumDualInfeasibilities_; |
| 183 | } |
| 184 | /// Sum of primal infeasibilities |
| 185 | inline CoinWorkDouble sumPrimalInfeasibilities() const { |
| 186 | return sumPrimalInfeasibilities_; |
| 187 | } |
| 188 | /// dualObjective. |
| 189 | inline CoinWorkDouble dualObjective() const { |
| 190 | return dualObjective_; |
| 191 | } |
| 192 | /// primalObjective. |
| 193 | inline CoinWorkDouble primalObjective() const { |
| 194 | return primalObjective_; |
| 195 | } |
| 196 | /// diagonalNorm |
| 197 | inline CoinWorkDouble diagonalNorm() const { |
| 198 | return diagonalNorm_; |
| 199 | } |
| 200 | /// linearPerturbation |
| 201 | inline CoinWorkDouble linearPerturbation() const { |
| 202 | return linearPerturbation_; |
| 203 | } |
| 204 | inline void setLinearPerturbation(CoinWorkDouble value) { |
| 205 | linearPerturbation_ = value; |
| 206 | } |
| 207 | /// projectionTolerance |
| 208 | inline CoinWorkDouble projectionTolerance() const { |
| 209 | return projectionTolerance_; |
| 210 | } |
| 211 | inline void setProjectionTolerance(CoinWorkDouble value) { |
| 212 | projectionTolerance_ = value; |
| 213 | } |
| 214 | /// diagonalPerturbation |
| 215 | inline CoinWorkDouble diagonalPerturbation() const { |
| 216 | return diagonalPerturbation_; |
| 217 | } |
| 218 | inline void setDiagonalPerturbation(CoinWorkDouble value) { |
| 219 | diagonalPerturbation_ = value; |
| 220 | } |
| 221 | /// gamma |
| 222 | inline CoinWorkDouble gamma() const { |
| 223 | return gamma_; |
| 224 | } |
| 225 | inline void setGamma(CoinWorkDouble value) { |
| 226 | gamma_ = value; |
| 227 | } |
| 228 | /// delta |
| 229 | inline CoinWorkDouble delta() const { |
| 230 | return delta_; |
| 231 | } |
| 232 | inline void setDelta(CoinWorkDouble value) { |
| 233 | delta_ = value; |
| 234 | } |
| 235 | /// ComplementarityGap |
| 236 | inline CoinWorkDouble complementarityGap() const { |
| 237 | return complementarityGap_; |
| 238 | } |
| 239 | //@} |
| 240 | |
| 241 | /**@name most useful gets and sets */ |
| 242 | //@{ |
| 243 | /// Largest error on Ax-b |
| 244 | inline CoinWorkDouble largestPrimalError() const { |
| 245 | return largestPrimalError_; |
| 246 | } |
| 247 | /// Largest error on basic duals |
| 248 | inline CoinWorkDouble largestDualError() const { |
| 249 | return largestDualError_; |
| 250 | } |
| 251 | /// Maximum iterations |
| 252 | inline int maximumBarrierIterations() const { |
| 253 | return maximumBarrierIterations_; |
| 254 | } |
| 255 | inline void setMaximumBarrierIterations(int value) { |
| 256 | maximumBarrierIterations_ = value; |
| 257 | } |
| 258 | /// Set cholesky (and delete present one) |
| 259 | void setCholesky(ClpCholeskyBase * cholesky); |
| 260 | /// Return number fixed to see if worth presolving |
| 261 | int numberFixed() const; |
| 262 | /** fix variables interior says should be. If reallyFix false then just |
| 263 | set values to exact bounds */ |
| 264 | void fixFixed(bool reallyFix = true); |
| 265 | /// Primal erturbation vector |
| 266 | inline CoinWorkDouble * primalR() const { |
| 267 | return primalR_; |
| 268 | } |
| 269 | /// Dual erturbation vector |
| 270 | inline CoinWorkDouble * dualR() const { |
| 271 | return dualR_; |
| 272 | } |
| 273 | //@} |
| 274 | |
| 275 | protected: |
| 276 | /**@name protected methods */ |
| 277 | //@{ |
| 278 | /// Does most of deletion |
| 279 | void gutsOfDelete(); |
| 280 | /// Does most of copying |
| 281 | void gutsOfCopy(const ClpInterior & rhs); |
| 282 | /// Returns true if data looks okay, false if not |
| 283 | bool createWorkingData(); |
| 284 | void deleteWorkingData(); |
| 285 | /// Sanity check on input rim data |
| 286 | bool sanityCheck(); |
| 287 | /// This does housekeeping |
| 288 | int housekeeping(); |
| 289 | //@} |
| 290 | public: |
| 291 | /**@name public methods */ |
| 292 | //@{ |
| 293 | /// Raw objective value (so always minimize) |
| 294 | inline CoinWorkDouble rawObjectiveValue() const { |
| 295 | return objectiveValue_; |
| 296 | } |
| 297 | /// Returns 1 if sequence indicates column |
| 298 | inline int isColumn(int sequence) const { |
| 299 | return sequence < numberColumns_ ? 1 : 0; |
| 300 | } |
| 301 | /// Returns sequence number within section |
| 302 | inline int sequenceWithin(int sequence) const { |
| 303 | return sequence < numberColumns_ ? sequence : sequence - numberColumns_; |
| 304 | } |
| 305 | /// Checks solution |
| 306 | void checkSolution(); |
| 307 | /** Modifies djs to allow for quadratic. |
| 308 | returns quadratic offset */ |
| 309 | CoinWorkDouble quadraticDjs(CoinWorkDouble * djRegion, const CoinWorkDouble * solution, |
| 310 | CoinWorkDouble scaleFactor); |
| 311 | |
| 312 | /// To say a variable is fixed |
| 313 | inline void setFixed( int sequence) { |
| 314 | status_[sequence] = static_cast<unsigned char>(status_[sequence] | 1) ; |
| 315 | } |
| 316 | inline void clearFixed( int sequence) { |
| 317 | status_[sequence] = static_cast<unsigned char>(status_[sequence] & ~1) ; |
| 318 | } |
| 319 | inline bool fixed(int sequence) const { |
| 320 | return ((status_[sequence] & 1) != 0); |
| 321 | } |
| 322 | |
| 323 | /// To flag a variable |
| 324 | inline void setFlagged( int sequence) { |
| 325 | status_[sequence] = static_cast<unsigned char>(status_[sequence] | 2) ; |
| 326 | } |
| 327 | inline void clearFlagged( int sequence) { |
| 328 | status_[sequence] = static_cast<unsigned char>(status_[sequence] & ~2) ; |
| 329 | } |
| 330 | inline bool flagged(int sequence) const { |
| 331 | return ((status_[sequence] & 2) != 0); |
| 332 | } |
| 333 | |
| 334 | /// To say a variable is fixed OR free |
| 335 | inline void setFixedOrFree( int sequence) { |
| 336 | status_[sequence] = static_cast<unsigned char>(status_[sequence] | 4) ; |
| 337 | } |
| 338 | inline void clearFixedOrFree( int sequence) { |
| 339 | status_[sequence] = static_cast<unsigned char>(status_[sequence] & ~4) ; |
| 340 | } |
| 341 | inline bool fixedOrFree(int sequence) const { |
| 342 | return ((status_[sequence] & 4) != 0); |
| 343 | } |
| 344 | |
| 345 | /// To say a variable has lower bound |
| 346 | inline void setLowerBound( int sequence) { |
| 347 | status_[sequence] = static_cast<unsigned char>(status_[sequence] | 8) ; |
| 348 | } |
| 349 | inline void clearLowerBound( int sequence) { |
| 350 | status_[sequence] = static_cast<unsigned char>(status_[sequence] & ~8) ; |
| 351 | } |
| 352 | inline bool lowerBound(int sequence) const { |
| 353 | return ((status_[sequence] & 8) != 0); |
| 354 | } |
| 355 | |
| 356 | /// To say a variable has upper bound |
| 357 | inline void setUpperBound( int sequence) { |
| 358 | status_[sequence] = static_cast<unsigned char>(status_[sequence] | 16) ; |
| 359 | } |
| 360 | inline void clearUpperBound( int sequence) { |
| 361 | status_[sequence] = static_cast<unsigned char>(status_[sequence] & ~16) ; |
| 362 | } |
| 363 | inline bool upperBound(int sequence) const { |
| 364 | return ((status_[sequence] & 16) != 0); |
| 365 | } |
| 366 | |
| 367 | /// To say a variable has fake lower bound |
| 368 | inline void setFakeLower( int sequence) { |
| 369 | status_[sequence] = static_cast<unsigned char>(status_[sequence] | 32) ; |
| 370 | } |
| 371 | inline void clearFakeLower( int sequence) { |
| 372 | status_[sequence] = static_cast<unsigned char>(status_[sequence] & ~32) ; |
| 373 | } |
| 374 | inline bool fakeLower(int sequence) const { |
| 375 | return ((status_[sequence] & 32) != 0); |
| 376 | } |
| 377 | |
| 378 | /// To say a variable has fake upper bound |
| 379 | inline void setFakeUpper( int sequence) { |
| 380 | status_[sequence] = static_cast<unsigned char>(status_[sequence] | 64) ; |
| 381 | } |
| 382 | inline void clearFakeUpper( int sequence) { |
| 383 | status_[sequence] = static_cast<unsigned char>(status_[sequence] & ~64) ; |
| 384 | } |
| 385 | inline bool fakeUpper(int sequence) const { |
| 386 | return ((status_[sequence] & 64) != 0); |
| 387 | } |
| 388 | //@} |
| 389 | |
| 390 | ////////////////// data ////////////////// |
| 391 | protected: |
| 392 | |
| 393 | /**@name data. Many arrays have a row part and a column part. |
| 394 | There is a single array with both - columns then rows and |
| 395 | then normally two arrays pointing to rows and columns. The |
| 396 | single array is the owner of memory |
| 397 | */ |
| 398 | //@{ |
| 399 | /// Largest error on Ax-b |
| 400 | CoinWorkDouble largestPrimalError_; |
| 401 | /// Largest error on basic duals |
| 402 | CoinWorkDouble largestDualError_; |
| 403 | /// Sum of dual infeasibilities |
| 404 | CoinWorkDouble sumDualInfeasibilities_; |
| 405 | /// Sum of primal infeasibilities |
| 406 | CoinWorkDouble sumPrimalInfeasibilities_; |
| 407 | /// Worst complementarity |
| 408 | CoinWorkDouble worstComplementarity_; |
| 409 | /// |
| 410 | public: |
| 411 | CoinWorkDouble xsize_; |
| 412 | CoinWorkDouble zsize_; |
| 413 | protected: |
| 414 | /// Working copy of lower bounds (Owner of arrays below) |
| 415 | CoinWorkDouble * lower_; |
| 416 | /// Row lower bounds - working copy |
| 417 | CoinWorkDouble * rowLowerWork_; |
| 418 | /// Column lower bounds - working copy |
| 419 | CoinWorkDouble * columnLowerWork_; |
| 420 | /// Working copy of upper bounds (Owner of arrays below) |
| 421 | CoinWorkDouble * upper_; |
| 422 | /// Row upper bounds - working copy |
| 423 | CoinWorkDouble * rowUpperWork_; |
| 424 | /// Column upper bounds - working copy |
| 425 | CoinWorkDouble * columnUpperWork_; |
| 426 | /// Working copy of objective |
| 427 | CoinWorkDouble * cost_; |
| 428 | public: |
| 429 | /// Rhs |
| 430 | CoinWorkDouble * rhs_; |
| 431 | CoinWorkDouble * x_; |
| 432 | CoinWorkDouble * y_; |
| 433 | CoinWorkDouble * dj_; |
| 434 | protected: |
| 435 | /// Pointer to Lsqr object |
| 436 | ClpLsqr * lsqrObject_; |
| 437 | /// Pointer to stuff |
| 438 | ClpPdcoBase * pdcoStuff_; |
| 439 | /// Below here is standard barrier stuff |
| 440 | /// mu. |
| 441 | CoinWorkDouble mu_; |
| 442 | /// objectiveNorm. |
| 443 | CoinWorkDouble objectiveNorm_; |
| 444 | /// rhsNorm. |
| 445 | CoinWorkDouble rhsNorm_; |
| 446 | /// solutionNorm. |
| 447 | CoinWorkDouble solutionNorm_; |
| 448 | /// dualObjective. |
| 449 | CoinWorkDouble dualObjective_; |
| 450 | /// primalObjective. |
| 451 | CoinWorkDouble primalObjective_; |
| 452 | /// diagonalNorm. |
| 453 | CoinWorkDouble diagonalNorm_; |
| 454 | /// stepLength |
| 455 | CoinWorkDouble stepLength_; |
| 456 | /// linearPerturbation |
| 457 | CoinWorkDouble linearPerturbation_; |
| 458 | /// diagonalPerturbation |
| 459 | CoinWorkDouble diagonalPerturbation_; |
| 460 | // gamma from Saunders and Tomlin regularized |
| 461 | CoinWorkDouble gamma_; |
| 462 | // delta from Saunders and Tomlin regularized |
| 463 | CoinWorkDouble delta_; |
| 464 | /// targetGap |
| 465 | CoinWorkDouble targetGap_; |
| 466 | /// projectionTolerance |
| 467 | CoinWorkDouble projectionTolerance_; |
| 468 | /// maximumRHSError. maximum Ax |
| 469 | CoinWorkDouble maximumRHSError_; |
| 470 | /// maximumBoundInfeasibility. |
| 471 | CoinWorkDouble maximumBoundInfeasibility_; |
| 472 | /// maximumDualError. |
| 473 | CoinWorkDouble maximumDualError_; |
| 474 | /// diagonalScaleFactor. |
| 475 | CoinWorkDouble diagonalScaleFactor_; |
| 476 | /// scaleFactor. For scaling objective |
| 477 | CoinWorkDouble scaleFactor_; |
| 478 | /// actualPrimalStep |
| 479 | CoinWorkDouble actualPrimalStep_; |
| 480 | /// actualDualStep |
| 481 | CoinWorkDouble actualDualStep_; |
| 482 | /// smallestInfeasibility |
| 483 | CoinWorkDouble smallestInfeasibility_; |
| 484 | /// historyInfeasibility. |
| 485 | #define LENGTH_HISTORY 5 |
| 486 | CoinWorkDouble historyInfeasibility_[LENGTH_HISTORY]; |
| 487 | /// complementarityGap. |
| 488 | CoinWorkDouble complementarityGap_; |
| 489 | /// baseObjectiveNorm |
| 490 | CoinWorkDouble baseObjectiveNorm_; |
| 491 | /// worstDirectionAccuracy |
| 492 | CoinWorkDouble worstDirectionAccuracy_; |
| 493 | /// maximumRHSChange |
| 494 | CoinWorkDouble maximumRHSChange_; |
| 495 | /// errorRegion. i.e. Ax |
| 496 | CoinWorkDouble * errorRegion_; |
| 497 | /// rhsFixRegion. |
| 498 | CoinWorkDouble * rhsFixRegion_; |
| 499 | /// upperSlack |
| 500 | CoinWorkDouble * upperSlack_; |
| 501 | /// lowerSlack |
| 502 | CoinWorkDouble * lowerSlack_; |
| 503 | /// diagonal |
| 504 | CoinWorkDouble * diagonal_; |
| 505 | /// solution |
| 506 | CoinWorkDouble * solution_; |
| 507 | /// work array |
| 508 | CoinWorkDouble * workArray_; |
| 509 | /// delta X |
| 510 | CoinWorkDouble * deltaX_; |
| 511 | /// delta Y |
| 512 | CoinWorkDouble * deltaY_; |
| 513 | /// deltaZ. |
| 514 | CoinWorkDouble * deltaZ_; |
| 515 | /// deltaW. |
| 516 | CoinWorkDouble * deltaW_; |
| 517 | /// deltaS. |
| 518 | CoinWorkDouble * deltaSU_; |
| 519 | CoinWorkDouble * deltaSL_; |
| 520 | /// Primal regularization array |
| 521 | CoinWorkDouble * primalR_; |
| 522 | /// Dual regularization array |
| 523 | CoinWorkDouble * dualR_; |
| 524 | /// rhs B |
| 525 | CoinWorkDouble * rhsB_; |
| 526 | /// rhsU. |
| 527 | CoinWorkDouble * rhsU_; |
| 528 | /// rhsL. |
| 529 | CoinWorkDouble * rhsL_; |
| 530 | /// rhsZ. |
| 531 | CoinWorkDouble * rhsZ_; |
| 532 | /// rhsW. |
| 533 | CoinWorkDouble * rhsW_; |
| 534 | /// rhs C |
| 535 | CoinWorkDouble * rhsC_; |
| 536 | /// zVec |
| 537 | CoinWorkDouble * zVec_; |
| 538 | /// wVec |
| 539 | CoinWorkDouble * wVec_; |
| 540 | /// cholesky. |
| 541 | ClpCholeskyBase * cholesky_; |
| 542 | /// numberComplementarityPairs i.e. ones with lower and/or upper bounds (not fixed) |
| 543 | int numberComplementarityPairs_; |
| 544 | /// numberComplementarityItems_ i.e. number of active bounds |
| 545 | int numberComplementarityItems_; |
| 546 | /// Maximum iterations |
| 547 | int maximumBarrierIterations_; |
| 548 | /// gonePrimalFeasible. |
| 549 | bool gonePrimalFeasible_; |
| 550 | /// goneDualFeasible. |
| 551 | bool goneDualFeasible_; |
| 552 | /// Which algorithm being used |
| 553 | int algorithm_; |
| 554 | //@} |
| 555 | }; |
| 556 | //############################################################################# |
| 557 | /** A function that tests the methods in the ClpInterior class. The |
| 558 | only reason for it not to be a member method is that this way it doesn't |
| 559 | have to be compiled into the library. And that's a gain, because the |
| 560 | library should be compiled with optimization on, but this method should be |
| 561 | compiled with debugging. |
| 562 | |
| 563 | It also does some testing of ClpFactorization class |
| 564 | */ |
| 565 | void |
| 566 | ClpInteriorUnitTest(const std::string & mpsDir, |
| 567 | const std::string & netlibDir); |
| 568 | |
| 569 | |
| 570 | #endif |
| 571 | |