# CoinAbcDenseFactorization.hpp

Go to the documentation of this file.

    00001 /* $Id: CoinAbcDenseFactorization.hpp 1910 2013-01-27 02:00:13Z stefan $ */
    00002 // Copyright (C) 2008, International Business Machines
    00003 // Corporation and others, Copyright (C) 2012, FasterCoin.  All Rights Reserved.
    00004 // This code is licensed under the terms of the Eclipse Public License (EPL).
    00005
    00006
    00007 /*
    00008    Authors
    00009
    00010    John Forrest
    00011
    00012  */
    00013 #ifndef CoinAbcDenseFactorization_H
    00014 #define CoinAbcDenseFactorization_H
    00015
    00016 #include <iostream>
    00017 #include <string>
    00018 #include <cassert>
    00019 #include "CoinTypes.hpp"
    00020 #include "CoinAbcCommon.hpp"
    00021 #include "CoinIndexedVector.hpp"
    00022 class CoinPackedMatrix;
    00024 class CoinAbcAnyFactorization {
    00025
    00026 public:
    00027
    00030
    00031   CoinAbcAnyFactorization (  );
    00033   CoinAbcAnyFactorization ( const CoinAbcAnyFactorization &other);
    00034
    00036   virtual ~CoinAbcAnyFactorization (  );
    00038   CoinAbcAnyFactorization & operator = ( const CoinAbcAnyFactorization & other );
    00039
    00041   virtual CoinAbcAnyFactorization * clone() const = 0;
    00043
    00046
    00047   inline int status (  ) const {
    00048     return status_;
    00049   }
    00051   inline void setStatus (  int value)
    00052   {  status_=value;  }
    00054   inline int pivots (  ) const {
    00055     return numberPivots_;
    00056   }
    00057 #if ABC_PARALLEL==2
    00059   inline void setParallelMode(int value)
    00060   {parallelMode_=value;};
    00061 #endif
    00063   inline void setPivots (  int value )
    00064   { numberPivots_=value; }
    00066   inline int numberSlacks (  ) const {
    00067     return numberSlacks_;
    00068   }
    00070   inline void setNumberSlacks (  int value )
    00071   { numberSlacks_=value; }
    00073   inline void setNumberRows(int value)
    00074   { numberRows_ = value; }
    00076   inline int numberRows (  ) const {
    00077     return numberRows_;
    00078   }
    00080   inline CoinSimplexInt numberDense (  ) const {
    00081     return numberDense_;
    00082   }
    00084   inline int numberGoodColumns (  ) const {
    00085     return numberGoodU_;
    00086   }
    00088   inline void relaxAccuracyCheck(double value)
    00089   { relaxCheck_ = value;}
    00090   inline double getAccuracyCheck() const
    00091   { return relaxCheck_;}
    00093   inline int maximumPivots (  ) const {
    00094     return maximumPivots_ ;
    00095   }
    00097   virtual void maximumPivots (  int value );
    00098
    00100   inline double pivotTolerance (  ) const {
    00101     return pivotTolerance_ ;
    00102   }
    00103   void pivotTolerance (  double value );
    00105   inline double minimumPivotTolerance (  ) const {
    00106     return minimumPivotTolerance_ ;
    00107   }
    00108   void minimumPivotTolerance (  double value );
    00109   virtual CoinFactorizationDouble * pivotRegion() const
    00110   { return NULL;}
    00112   inline double areaFactor (  ) const {
    00113     return areaFactor_ ;
    00114   }
    00115   inline void areaFactor ( CoinSimplexDouble value ) {
    00116     areaFactor_=value;
    00117   }
    00119   inline double zeroTolerance (  ) const {
    00120     return zeroTolerance_ ;
    00121   }
    00122   void zeroTolerance (  double value );
    00124   virtual CoinFactorizationDouble * elements() const;
    00126   virtual int * pivotRow() const;
    00128   virtual CoinFactorizationDouble * workArea() const;
    00130   virtual int * intWorkArea() const;
    00132   virtual int * numberInRow() const;
    00134   virtual int * numberInColumn() const;
    00136   virtual CoinBigIndex * starts() const;
    00138   virtual int * permuteBack() const;
    00140   virtual void goSparse() {}
    00141 #ifndef NDEBUG
    00142   virtual inline void checkMarkArrays() const {}
    00143 #endif
    00144
    00148   inline int solveMode() const
    00149   { return solveMode_ ;}
    00154   inline void setSolveMode(int value)
    00155   { solveMode_ = value;}
    00157   virtual bool wantsTableauColumn() const;
    00162   virtual void setUsefulInformation(const int * info,int whereFrom);
    00164   virtual void clearArrays() {}
    00166
    00168
    00169   virtual int * indices() const  = 0;
    00171   virtual int * permute() const = 0;
    00173   virtual int * pivotColumn() const;
    00175   virtual int numberElements (  ) const = 0;
    00177
    00179
    00180   virtual void getAreas ( int numberRows,
    00181                   int numberColumns,
    00182                   CoinBigIndex maximumL,
    00183                   CoinBigIndex maximumU ) = 0;
    00184
    00186   virtual void preProcess ( ) = 0;
    00192   virtual int factor (AbcSimplex * model) = 0;
    00193 #ifdef EARLY_FACTORIZE
    00195   virtual int factorize (AbcSimplex * /*model*/, CoinIndexedVector & /*stuff*/)
    00196   { return -2;}
    00197 #endif
    00199   virtual void postProcess(const int * sequence, int * pivotVariable) = 0;
    00201   virtual void makeNonSingular(int * sequence) = 0;
    00202
    00203
    00206 #if 0
    00207
    00211   virtual int checkReplace ( CoinIndexedVector * /*regionSparse*/,
    00212                              int /*pivotRow*/,
    00213                              double & /*pivotCheck*/,
    00214                              double /*acceptablePivot = 1.0e-8*/)
    00215   {return 0;}
    00220   virtual int replaceColumn ( CoinIndexedVector * regionSparse,
    00221                       int pivotRow,
    00222                       double pivotCheck ,
    00223                               bool skipBtranU=false,
    00224                               double acceptablePivot=1.0e-8)=0;
    00225 #endif
    00226 #ifdef EARLY_FACTORIZE
    00228   virtual int replaceColumns ( const AbcSimplex * /*model*/,
    00229                                CoinIndexedVector & /*stuff*/,
    00230                                int /*firstPivot*/,int /*lastPivot*/,bool /*cleanUp*/)
    00231   { return -1;}
    00232 #endif
    00233 #ifdef ABC_LONG_FACTORIZATION
    00235   virtual void clearHiddenArrays() {}
    00236 #endif
    00237
    00241   virtual
    00242 #ifdef ABC_LONG_FACTORIZATION
    00243   long
    00244 #endif
    00245   double checkReplacePart1 ( CoinIndexedVector * /*regionSparse*/,
    00246                                      int /*pivotRow*/)
    00247   {return 0.0;}
    00248   virtual
    00249 #ifdef ABC_LONG_FACTORIZATION
    00250   long
    00251 #endif
    00252   double checkReplacePart1 ( CoinIndexedVector * /*regionSparse*/,
    00253                                      CoinIndexedVector * /*partialUpdate*/,
    00254                                      int /*pivotRow*/)
    00255   {return 0.0;}
    00256   virtual void checkReplacePart1a ( CoinIndexedVector * /* regionSparse */,
    00257                                     int /*pivotRow*/)
    00258   {}
    00259   virtual double checkReplacePart1b (CoinIndexedVector * /*regionSparse*/,
    00260                                      int /*pivotRow*/)
    00261   {return 0.0;}
    00264   virtual int checkReplacePart2 ( int pivotRow,
    00265                                   double btranAlpha,
    00266                                   double ftranAlpha,
    00267 #ifdef ABC_LONG_FACTORIZATION
    00268                                   long
    00269 #endif
    00270                                   double ftAlpha,
    00271                                   double acceptablePivot = 1.0e-8) = 0;
    00274   virtual void replaceColumnPart3 ( const AbcSimplex * model,
    00275                       CoinIndexedVector * regionSparse,
    00276                       CoinIndexedVector * tableauColumn,
    00277                       int pivotRow,
    00278 #ifdef ABC_LONG_FACTORIZATION
    00279                                     long
    00280 #endif
    00281                        double alpha ) = 0;
    00284   virtual void replaceColumnPart3 ( const AbcSimplex * model,
    00285                                     CoinIndexedVector * regionSparse,
    00286                                     CoinIndexedVector * tableauColumn,
    00287                                     CoinIndexedVector * partialUpdate,
    00288                                     int pivotRow,
    00289 #ifdef ABC_LONG_FACTORIZATION
    00290                                   long
    00291 #endif
    00292                                     double alpha )=0;
    00294
    00302   virtual int updateColumnFT ( CoinIndexedVector & regionSparse) = 0;
    00303   virtual int updateColumnFTPart1 ( CoinIndexedVector & regionSparse) = 0;
    00304   virtual void updateColumnFTPart2 ( CoinIndexedVector & regionSparse) = 0;
    00305   virtual void updateColumnFT ( CoinIndexedVector & regionSparseFT,
    00306                                 CoinIndexedVector & partialUpdate,
    00307                                 int which)=0;
    00310   virtual int updateColumn ( CoinIndexedVector & regionSparse) const = 0;
    00312   virtual int updateTwoColumnsFT(CoinIndexedVector & regionFT,
    00313                                     CoinIndexedVector & regionOther) = 0;
    00316   virtual int updateColumnTranspose ( CoinIndexedVector & regionSparse) const = 0;
    00318   virtual void updateFullColumn ( CoinIndexedVector & regionSparse) const = 0;
    00321   virtual void updateFullColumnTranspose ( CoinIndexedVector & regionSparse) const = 0;
    00323   virtual void updateWeights ( CoinIndexedVector & regionSparse) const=0;
    00325   virtual void updateColumnCpu ( CoinIndexedVector & regionSparse,int whichCpu) const;
    00327   virtual void updateColumnTransposeCpu ( CoinIndexedVector & regionSparse,int whichCpu) const;
    00329
    00331 protected:
    00332
    00335
    00336   double pivotTolerance_;
    00338   double minimumPivotTolerance_;
    00340   double areaFactor_;
    00342   double zeroTolerance_;
    00343   //#ifndef slackValue_
    00344 #define slackValue2_ 1.0
    00345   //#endif
    00347   double relaxCheck_;
    00349   CoinBigIndex factorElements_;
    00351   int numberRows_;
    00353   int numberDense_;
    00355   int numberGoodU_;
    00357   int maximumPivots_;
    00359   int numberPivots_;
    00361   int numberSlacks_;
    00363   int status_;
    00365   int maximumRows_;
    00366 #if ABC_PARALLEL==2
    00367   int parallelMode_;
    00368 #endif
    00370   int * pivotRow_;
    00371
    00375   CoinFactorizationDouble * elements_;
    00377   CoinFactorizationDouble * workArea_;
    00382   int solveMode_;
    00384 };
    00394 class CoinAbcDenseFactorization : public CoinAbcAnyFactorization {
    00395    friend void CoinAbcDenseFactorizationUnitTest( const std::string & mpsDir );
    00396
    00397 public:
    00398
    00401
    00402   CoinAbcDenseFactorization (  );
    00404   CoinAbcDenseFactorization ( const CoinAbcDenseFactorization &other);
    00405
    00407   virtual ~CoinAbcDenseFactorization (  );
    00409   CoinAbcDenseFactorization & operator = ( const CoinAbcDenseFactorization & other );
    00411   virtual CoinAbcAnyFactorization * clone() const ;
    00413
    00416
    00417   virtual void getAreas ( int numberRows,
    00418                   int numberColumns,
    00419                   CoinBigIndex maximumL,
    00420                   CoinBigIndex maximumU );
    00421
    00423   virtual void preProcess ( );
    00429   virtual int factor (AbcSimplex * model);
    00431   virtual void postProcess(const int * sequence, int * pivotVariable);
    00433   virtual void makeNonSingular(int * sequence);
    00435
    00438
    00439   virtual inline int numberElements (  ) const {
    00440     return numberRows_*(numberRows_+numberPivots_);
    00441   }
    00443   double maximumCoefficient() const;
    00445
    00448
    00453   virtual int replaceColumn ( CoinIndexedVector * regionSparse,
    00454                       int pivotRow,
    00455                       double pivotCheck ,
    00456                               bool skipBtranU=false,
    00457                               double acceptablePivot=1.0e-8);
    00460   virtual int checkReplacePart2 ( int pivotRow,
    00461                                   double btranAlpha,
    00462                                   double ftranAlpha,
    00463 #ifdef ABC_LONG_FACTORIZATION
    00464                                   long
    00465 #endif
    00466                                   double ftAlpha,
    00467                                   double acceptablePivot = 1.0e-8) ;
    00470   virtual void replaceColumnPart3 ( const AbcSimplex * model,
    00471                       CoinIndexedVector * regionSparse,
    00472                       CoinIndexedVector * tableauColumn,
    00473                       int pivotRow,
    00474 #ifdef ABC_LONG_FACTORIZATION
    00475                                     long
    00476 #endif
    00477                        double alpha );
    00480   virtual void replaceColumnPart3 ( const AbcSimplex * model,
    00481                                     CoinIndexedVector * regionSparse,
    00482                                     CoinIndexedVector * tableauColumn,
    00483                                     CoinIndexedVector * /*partialUpdate*/,
    00484                                     int pivotRow,
    00485 #ifdef ABC_LONG_FACTORIZATION
    00486                                     long
    00487 #endif
    00488                                     double alpha )
    00489   { replaceColumnPart3(model,regionSparse,tableauColumn,pivotRow,alpha);}
    00491
    00499   virtual int updateColumnFT ( CoinIndexedVector & regionSparse)
    00500   {return updateColumn(regionSparse);}
    00501   virtual int updateColumnFTPart1 ( CoinIndexedVector & regionSparse)
    00502   {return updateColumn(regionSparse);}
    00503   virtual void updateColumnFTPart2 ( CoinIndexedVector & /*regionSparse*/)
    00504   {}
    00505   virtual void updateColumnFT ( CoinIndexedVector & regionSparseFT,CoinIndexedVector & /*partialUpdate*/,int /*which*/)
    00506   { updateColumnFT(regionSparseFT);}
    00509   virtual int updateColumn ( CoinIndexedVector & regionSparse) const;
    00511   virtual int updateTwoColumnsFT(CoinIndexedVector & regionFT,
    00512                                     CoinIndexedVector & regionOther);
    00515   virtual int updateColumnTranspose ( CoinIndexedVector & regionSparse) const;
    00517   virtual void updateFullColumn ( CoinIndexedVector & regionSparse) const
    00518   {updateColumn(regionSparse);}
    00521   virtual void updateFullColumnTranspose ( CoinIndexedVector & regionSparse) const
    00522   {updateColumnTranspose(regionSparse);}
    00524   virtual void updateWeights ( CoinIndexedVector & regionSparse) const;
    00526
    00527
    00531
    00532   inline void clearArrays()
    00533   { gutsOfDestructor();}
    00535   virtual inline int * indices() const
    00536   { return reinterpret_cast<int *> (elements_+numberRows_*numberRows_);}
    00538   virtual inline int * permute() const
    00539   { return NULL;/*pivotRow_*/;}
    00541
    00543   void gutsOfDestructor();
    00545   void gutsOfInitialize();
    00547   void gutsOfCopy(const CoinAbcDenseFactorization &other);
    00548
    00550 protected:
    00553   int checkPivot(double saveFromU, double oldPivot) const;
    00555 protected:
    00557   CoinBigIndex maximumSpace_;
    00559   CoinSimplexInt maximumRowsAdjusted_;
    00560
    00563
    00564 };
    00565 #endif

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines