| 1 | #ifndef SIMPLEX_SEEN | 
|---|
| 2 | #define SIMPLEX_SEEN | 
|---|
| 3 |  | 
|---|
| 4 | #include "machdefs.h" | 
|---|
| 5 | #include "tvector.h" | 
|---|
| 6 | #include "generalfit.h" | 
|---|
| 7 | #include <string> | 
|---|
| 8 | #include <vector> | 
|---|
| 9 |  | 
|---|
| 10 | // --------------------------------------------------------------- | 
|---|
| 11 | //             (C) UPS-LAL  R. Ansari , Aout 2004 | 
|---|
| 12 | // --------------------------------------------------------------- | 
|---|
| 13 | // Classe de minimisation (optimisation) non lineaire dans | 
|---|
| 14 | // un espace multidimensionnel suivant la methode des simplex. | 
|---|
| 15 | // Simplex : Figure geometrique formee de N+1 sommets (points) | 
|---|
| 16 | //  (points) dans un espace a N dimension | 
|---|
| 17 | // La methode d'optimisation codee ici dans la classe MinZSimplex | 
|---|
| 18 | // est basee sur celle decrite dans Numerical Recipes , | 
|---|
| 19 | // Chapitre X, Minimization or Maximization of Functions | 
|---|
| 20 | // L'algorithme est ameliore sur deux aspects : | 
|---|
| 21 | //  - Test d'arret plus complexe | 
|---|
| 22 | //  - Ajout d'une transformation du simplex  (ExpandHigh) | 
|---|
| 23 | //    Reflection,ReflecExpand,ContractHigh,ContractLow+ExpandHigh | 
|---|
| 24 | // ---------------------------------------------------------------- | 
|---|
| 25 |  | 
|---|
| 26 | using namespace std; | 
|---|
| 27 |  | 
|---|
| 28 | namespace SOPHYA { | 
|---|
| 29 |  | 
|---|
| 30 | //! Interface definition for multivariable function (used by SimplexMinmizer) | 
|---|
| 31 | class MinZFunction { | 
|---|
| 32 | public: | 
|---|
| 33 | //! Constructor with nVar defining the number of variables | 
|---|
| 34 | MinZFunction(unsigned int nVar); | 
|---|
| 35 | virtual ~MinZFunction(); | 
|---|
| 36 | //! Returns the value of the function for the point defined by xp[] | 
|---|
| 37 | virtual double Value(double const xp[])=0; | 
|---|
| 38 | //! Returns the number of variables (dimension of xp[]) in method Value() | 
|---|
| 39 | inline int     NVar() const {return mNVar;} | 
|---|
| 40 | protected: | 
|---|
| 41 | const int mNVar;  //!< nombre de variables f(x,y,z,...) | 
|---|
| 42 | }; | 
|---|
| 43 |  | 
|---|
| 44 | //!  Wrapper class implementing MinZFunction for a GeneralXi2 associated with a GeneralFitData | 
|---|
| 45 | class MinZFuncXi2 : public MinZFunction { | 
|---|
| 46 | public: | 
|---|
| 47 | MinZFuncXi2(GeneralXi2* gxi2, GeneralFitData* gd); | 
|---|
| 48 | virtual ~MinZFuncXi2(); | 
|---|
| 49 | virtual double Value(double const xp[]); | 
|---|
| 50 | protected: | 
|---|
| 51 | GeneralXi2 *mGXi2; | 
|---|
| 52 | GeneralFitData *mGData; | 
|---|
| 53 | }; | 
|---|
| 54 |  | 
|---|
| 55 | //! Class implementing the Simplex minimisation method | 
|---|
| 56 | class MinZSimplex { | 
|---|
| 57 | public: | 
|---|
| 58 | static int     AutoTest(int tsel=-1, int prtlev=0); | 
|---|
| 59 |  | 
|---|
| 60 | MinZSimplex(MinZFunction *mzf); | 
|---|
| 61 | virtual        ~MinZSimplex(); | 
|---|
| 62 |  | 
|---|
| 63 | //! Return the parameter space dimension | 
|---|
| 64 | inline int     NDim() { return mZF->NVar(); } | 
|---|
| 65 | // Simplex initial | 
|---|
| 66 | //! Defines the initial point (center of simplex figure) | 
|---|
| 67 | inline void    SetInitialPoint(Vector& point) { mPoint0 = point; } | 
|---|
| 68 | //! Defines the step along each dimension to construct the simplex from initial point | 
|---|
| 69 | inline void    SetInitialStep(Vector& step) { mStep0 = step; } | 
|---|
| 70 |  | 
|---|
| 71 | //! Set the info/debug print level | 
|---|
| 72 | inline void    SetPrtLevel(int lev=0) { mPrt = lev; } | 
|---|
| 73 | //! Return the current print level | 
|---|
| 74 | inline int     PrtLevel() { return mPrt; } | 
|---|
| 75 |  | 
|---|
| 76 | //! Set the maximum number of iteration | 
|---|
| 77 | inline void    SetMaxIter(int max = 100000) { mMaxIter = max; } | 
|---|
| 78 | //! Return the current  max iter | 
|---|
| 79 | inline int     MaxIter() { return mMaxIter; } | 
|---|
| 80 | //! Return the number of iterations performed | 
|---|
| 81 | inline int     NbIter() { return mIter; } | 
|---|
| 82 | //! Return the stop reason | 
|---|
| 83 | inline int     StopReason() { return mStop; } | 
|---|
| 84 | //! Return the stop reason and a description string (\b s) | 
|---|
| 85 | int     StopReason(string& s); | 
|---|
| 86 |  | 
|---|
| 87 | // On minimise f(x) f=mZF->Value() , | 
|---|
| 88 | //             f_max = max(f) sur simplex , f_min = min(f) sur simplex | 
|---|
| 89 | //             fm = (abs(f_max)+abs(f_min)) | 
|---|
| 90 | //             [Delta f] = abs(f_max-f_min) | 
|---|
| 91 | //             [Delta f/f]simplex = 2.*Delta f / fm | 
|---|
| 92 | //             fm2 = (abs(f_max)+abs(f_max(iter-1))) | 
|---|
| 93 | //             [Delta f_max/f_max]iter = [f_max(iter-1)-f_max]/fm2 | 
|---|
| 94 | // Test d'arret : | 
|---|
| 95 | //  fm < mTol0                                                       OU | 
|---|
| 96 | //  [Delta f/f]simplex              < mTol1   mRep1 fois de suite    OU | 
|---|
| 97 | //  [Delta f_max/f_max]iter         < mTol2   mRep2 fois de suite | 
|---|
| 98 |  | 
|---|
| 99 | //! Define the tolerances for the various convergence tests | 
|---|
| 100 | inline void    SetStopTolerance(double tol0=1.e-39, double tol1 = 1.e-3, int rep1=5, | 
|---|
| 101 | double tol2=1.e-4, int rep2=5) | 
|---|
| 102 | { mTol0 = tol0; mTol1 = tol1; mRep1 = rep1; mTol2 = tol2, mRep2 = rep2; } | 
|---|
| 103 |  | 
|---|
| 104 | // Controle des facteurs de deformation du simplex: | 
|---|
| 105 | // Alpha  = Facteur d'homothetie pour la reflexion simple (Reflection) | 
|---|
| 106 | // Gamma  = Facteur d'homothetie pour la reflexion+expansion (ReflecExpand) | 
|---|
| 107 | // Beta   = Facteur d'homothetie pour la contraction pour le sommet haut f_max (ContractHigh) | 
|---|
| 108 | // Beta2  = Facteur d'homothetie pour la contraction vers le sommet bas f_min (ContractLow) | 
|---|
| 109 | // Gamma2 = Facteur d'homothetie pour la l'extension pour le sommet haut ExpandHigh | 
|---|
| 110 |  | 
|---|
| 111 | //! Define the similarity (homothetic) factors for the different simplex transformations | 
|---|
| 112 | inline void    SetControls(double alpha=1., double beta=0.5, double beta2=0.5, | 
|---|
| 113 | double gamma=2.0, double gamma2=2.0) | 
|---|
| 114 | { mAlpha = alpha; mBeta = beta; mBeta2 = beta2;  mGamma = gamma; mGamma2 = gamma2;} | 
|---|
| 115 |  | 
|---|
| 116 | //! Return the the homothetic factor for Reflection | 
|---|
| 117 | inline double  Alpha() { return mAlpha; } | 
|---|
| 118 | //! Return the the homothetic factor for ContractHigh (contraction away from high point) | 
|---|
| 119 | inline double  Beta() { return mBeta; } | 
|---|
| 120 | //! Return the the homothetic factor for ContractLow (contraction toward the low point) | 
|---|
| 121 | inline double  Beta2() { return mBeta2; } | 
|---|
| 122 | //! Return the the homothetic factor for ReflecExpand (reflection+expansion) | 
|---|
| 123 | inline double  Gamma() { return mGamma; } | 
|---|
| 124 | //! Return the the homothetic factor for ExpandHigh (expansion along high point) | 
|---|
| 125 | inline double  Gamma2() { return mGamma2; } | 
|---|
| 126 |  | 
|---|
| 127 | // Fonction de minimisation - Rc=0, OK, convergence , Rc>0, Non convergence | 
|---|
| 128 | // Voir StopReason(string& s) | 
|---|
| 129 | virtual int    Minimize(Vector& fpoint); | 
|---|
| 130 |  | 
|---|
| 131 | protected: | 
|---|
| 132 | int            FindMinMax12(Vector& fval, int& ilo, int& ihi, int& inhi); | 
|---|
| 133 | inline double  Value(Vector& point) { return mZF->Value(point.Data()); } | 
|---|
| 134 |  | 
|---|
| 135 | MinZFunction* mZF; | 
|---|
| 136 | int mMaxIter, mIter; | 
|---|
| 137 | int mStop; | 
|---|
| 138 | int mPrt; | 
|---|
| 139 |  | 
|---|
| 140 | Vector mPoint0; | 
|---|
| 141 | Vector mStep0; | 
|---|
| 142 | //  vector< Vector > simplex0; | 
|---|
| 143 | //  vector< Vector > simplex_cur; | 
|---|
| 144 | double mAlpha, mBeta, mBeta2, mGamma, mGamma2; | 
|---|
| 145 | double mTol0, mTol1, mTol2; | 
|---|
| 146 | int mRep1,mRep2; | 
|---|
| 147 | }; | 
|---|
| 148 |  | 
|---|
| 149 | } // namespace SOPHYA | 
|---|
| 150 |  | 
|---|
| 151 | #endif | 
|---|