Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members

ClpInterior.hpp

00001 // Copyright (C) 2003, International Business Machines
00002 // Corporation and others.  All Rights Reserved.
00003 
00004 /* 
00005    Authors
00006    
00007    John Tomlin (pdco)
00008    John Forrest (standard predictor-corrector)
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 // ******** DATA to be moved into protected section of ClpInterior
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;   // 1=Cholesky    2=QR    3=LSQR
00048 int   LSproblem;  // See below
00049 int LSQRMaxIter;
00050 double  LSQRatol1; // Initial  atol
00051 double  LSQRatol2; // Smallest atol (unless atol1 is smaller)
00052 double  LSQRconlim;
00053 int  wait;
00054 } Options;
00055 class Lsqr;
00056 class ClpCholeskyBase;
00057 // ***** END
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   // Ones below are just ClpModel with some changes
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   // ** Temporary version
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

Generated on Wed Dec 3 14:37:26 2003 for CLP by doxygen 1.3.5