00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef ClpInterior_H
00012 #define ClpInterior_H
00013
00014 #include <iostream>
00015 #include <cfloat>
00016 #include "ClpModel.hpp"
00017 #include "ClpMatrixBase.hpp"
00018 #include "ClpSolve.hpp"
00019 class ClpLsqr;
00020 class ClpPdcoBase;
00021
00022 typedef struct{
00023 double atolmin;
00024 double r3norm;
00025 double LSdamp;
00026 double* deltay;
00027 } Info;
00028
00029 typedef struct{
00030 double atolold;
00031 double atolnew;
00032 double r3ratio;
00033 int istop;
00034 int itncg;
00035 } Outfo;
00036
00037 typedef struct{
00038 double gamma;
00039 double delta;
00040 int MaxIter;
00041 double FeaTol;
00042 double OptTol;
00043 double StepTol;
00044 double x0min;
00045 double z0min;
00046 double mu0;
00047 int LSmethod;
00048 int LSproblem;
00049 int LSQRMaxIter;
00050 double LSQRatol1;
00051 double LSQRatol2;
00052 double LSQRconlim;
00053 int wait;
00054 } Options;
00055 class Lsqr;
00056 class ClpCholeskyBase;
00057
00065 class ClpInterior : public ClpModel {
00066 friend void ClpInteriorUnitTest(const std::string & mpsDir,
00067 const std::string & netlibDir);
00068
00069 public:
00070
00073
00074 ClpInterior ( );
00075
00077 ClpInterior(const ClpInterior &);
00079 ClpInterior(const ClpModel &);
00084 ClpInterior (const ClpModel * wholeModel,
00085 int numberRows, const int * whichRows,
00086 int numberColumns, const int * whichColumns,
00087 bool dropNames=true, bool dropIntegers=true);
00089 ClpInterior & operator=(const ClpInterior & rhs);
00091 ~ClpInterior ( );
00092
00104 void loadProblem ( const ClpMatrixBase& matrix,
00105 const double* collb, const double* colub,
00106 const double* obj,
00107 const double* rowlb, const double* rowub,
00108 const double * rowObjective=NULL);
00109 void loadProblem ( const CoinPackedMatrix& matrix,
00110 const double* collb, const double* colub,
00111 const double* obj,
00112 const double* rowlb, const double* rowub,
00113 const double * rowObjective=NULL);
00114
00117 void loadProblem ( const int numcols, const int numrows,
00118 const CoinBigIndex* start, const int* index,
00119 const double* value,
00120 const double* collb, const double* colub,
00121 const double* obj,
00122 const double* rowlb, const double* rowub,
00123 const double * rowObjective=NULL);
00125 void loadProblem ( const int numcols, const int numrows,
00126 const CoinBigIndex* start, const int* index,
00127 const double* value,const int * length,
00128 const double* collb, const double* colub,
00129 const double* obj,
00130 const double* rowlb, const double* rowub,
00131 const double * rowObjective=NULL);
00133 int readMps(const char *filename,
00134 bool keepNames=false,
00135 bool ignoreErrors = false);
00137
00141 int pdco();
00142
00143 int pdco( ClpPdcoBase * stuff, Options &options, Info &info, Outfo &outfo);
00145 int primalDual();
00147
00150
00151 inline bool primalFeasible() const
00152 { return (sumPrimalInfeasibilities_<=1.0e-5);};
00154 inline bool dualFeasible() const
00155 { return (sumDualInfeasibilities_<=1.0e-5);};
00157 inline int algorithm() const
00158 {return algorithm_; } ;
00160 inline void setAlgorithm(int value)
00161 {algorithm_=value; } ;
00163 inline double sumDualInfeasibilities() const
00164 { return sumDualInfeasibilities_;} ;
00166 inline double sumPrimalInfeasibilities() const
00167 { return sumPrimalInfeasibilities_;} ;
00169
00172
00173 inline double largestPrimalError() const
00174 { return largestPrimalError_;} ;
00176 inline double largestDualError() const
00177 { return largestDualError_;} ;
00179 inline int maximumBarrierIterations() const
00180 { return maximumBarrierIterations_;};
00181 inline void setMaximumBarrierIterations(int value)
00182 { maximumBarrierIterations_=value;};
00184
00185 protected:
00188
00189 void gutsOfDelete();
00191 void gutsOfCopy(const ClpInterior & rhs);
00193 bool createWorkingData();
00194 void deleteWorkingData();
00196 bool sanityCheck();
00198 int housekeeping();
00200 public:
00203
00204 inline double rawObjectiveValue() const
00205 { return objectiveValue_;};
00207 inline int isColumn(int sequence) const
00208 { return sequence<numberColumns_ ? 1 : 0;};
00210 inline int sequenceWithin(int sequence) const
00211 { return sequence<numberColumns_ ? sequence : sequence-numberColumns_;};
00213 void checkSolution();
00214
00216 inline void setFixed( int sequence)
00217 {
00218 status_[sequence] |= 1;
00219 };
00220 inline void clearFixed( int sequence)
00221 {
00222 status_[sequence] &= ~1;
00223 };
00224 inline bool fixed(int sequence) const
00225 {return ((status_[sequence]&1)!=0);};
00226
00228 inline void setFlagged( int sequence)
00229 {
00230 status_[sequence] |= 2;
00231 };
00232 inline void clearFlagged( int sequence)
00233 {
00234 status_[sequence] &= ~2;
00235 };
00236 inline bool flagged(int sequence) const
00237 {return ((status_[sequence]&2)!=0);};
00238
00240 inline void setFixedOrFree( int sequence)
00241 {
00242 status_[sequence] |= 4;
00243 };
00244 inline void clearFixedOrFree( int sequence)
00245 {
00246 status_[sequence] &= ~4;
00247 };
00248 inline bool fixedOrFree(int sequence) const
00249 {return ((status_[sequence]&4)!=0);};
00250
00252 inline void setLowerBound( int sequence)
00253 {
00254 status_[sequence] |= 8;
00255 };
00256 inline void clearLowerBound( int sequence)
00257 {
00258 status_[sequence] &= ~8;
00259 };
00260 inline bool lowerBound(int sequence) const
00261 {return ((status_[sequence]&8)!=0);};
00262
00264 inline void setUpperBound( int sequence)
00265 {
00266 status_[sequence] |= 16;
00267 };
00268 inline void clearUpperBound( int sequence)
00269 {
00270 status_[sequence] &= ~16;
00271 };
00272 inline bool upperBound(int sequence) const
00273 {return ((status_[sequence]&16)!=0);};
00274
00276 inline void setFakeLower( int sequence)
00277 {
00278 status_[sequence] |= 32;
00279 };
00280 inline void clearFakeLower( int sequence)
00281 {
00282 status_[sequence] &= ~32;
00283 };
00284 inline bool fakeLower(int sequence) const
00285 {return ((status_[sequence]&32)!=0);};
00286
00288 inline void setFakeUpper( int sequence)
00289 {
00290 status_[sequence] |= 64;
00291 };
00292 inline void clearFakeUpper( int sequence)
00293 {
00294 status_[sequence] &= ~64;
00295 };
00296 inline bool fakeUpper(int sequence) const
00297 {return ((status_[sequence]&64)!=0);};
00299
00301 protected:
00302
00309
00310 double largestPrimalError_;
00312 double largestDualError_;
00314 double sumDualInfeasibilities_;
00316 double sumPrimalInfeasibilities_;
00318 double worstComplementarity_;
00320 public:
00321 double xsize_;
00322 double zsize_;
00323 protected:
00325 double * lower_;
00327 double * rowLowerWork_;
00329 double * columnLowerWork_;
00331 double * upper_;
00333 double * rowUpperWork_;
00335 double * columnUpperWork_;
00337 double * cost_;
00338 public:
00340 double * rhs_;
00341 double * x_;
00342 double * y_;
00343 double * dj_;
00344 protected:
00346 ClpLsqr * lsqrObject_;
00348 ClpPdcoBase * pdcoStuff_;
00351 double mu_;
00353 double objectiveNorm_;
00355 double rhsNorm_;
00357 double solutionNorm_;
00359 double dualObjective_;
00361 double primalObjective_;
00363 double diagonalNorm_;
00365 double stepLength_;
00367 double linearPerturbation_;
00369 double diagonalPerturbation_;
00371 double targetGap_;
00373 double projectionTolerance_;
00375 double maximumRHSError_;
00377 double maximumBoundInfeasibility_;
00379 double maximumDualError_;
00381 double diagonalScaleFactor_;
00383 double scaleFactor_;
00385 double actualPrimalStep_;
00387 double actualDualStep_;
00389 double smallestInfeasibility_;
00391 #define LENGTH_HISTORY 5
00392 double historyInfeasibility_[LENGTH_HISTORY];
00394 double complementarityGap_;
00396 double baseObjectiveNorm_;
00398 double worstDirectionAccuracy_;
00400 double maximumRHSChange_;
00402 double * errorRegion_;
00404 double * rhsFixRegion_;
00406 double * updateRegion_;
00408 double * upperSlack_;
00410 double * lowerSlack_;
00412 double * diagonal_;
00414 double * weights_;
00416 double * solution_;
00418 double * deltaZ_;
00420 double * deltaW_;
00422 double * deltaS_;
00424 double * deltaT_;
00426 double * zVec_;
00428 double * wVec_;
00430 ClpCholeskyBase * cholesky_;
00432 int numberComplementarityPairs_;
00434 int maximumBarrierIterations_;
00436 bool gonePrimalFeasible_;
00438 bool goneDualFeasible_;
00440 int algorithm_;
00442 };
00443
00452 void
00453 ClpInteriorUnitTest(const std::string & mpsDir,
00454 const std::string & netlibDir);
00455
00456
00457 #endif