| [2650] | 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 |  | 
|---|
| [2808] | 30 | //! Interface definition for multivariable function (used by SimplexMinmizer) | 
|---|
| [2650] | 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 |  | 
|---|
| [2808] | 44 | //!  Wrapper class implementing MinZFunction for a GeneralXi2 associated with a GeneralFitData | 
|---|
| [2650] | 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 |  | 
|---|
| [2808] | 63 | //! Return the parameter space dimension | 
|---|
| [2650] | 64 | inline int     NDim() { return mZF->NVar(); } | 
|---|
|  | 65 | // Simplex initial | 
|---|
| [2808] | 66 | //! Defines the initial point (center of simplex figure) | 
|---|
| [2650] | 67 | inline void    SetInitialPoint(Vector& point) { mPoint0 = point; } | 
|---|
| [2808] | 68 | //! Defines the step along each dimension to construct the simplex from initial point | 
|---|
| [2650] | 69 | inline void    SetInitialStep(Vector& step) { mStep0 = step; } | 
|---|
|  | 70 |  | 
|---|
| [2808] | 71 | //! Set the info/debug print level | 
|---|
| [2650] | 72 | inline void    SetPrtLevel(int lev=0) { mPrt = lev; } | 
|---|
| [2808] | 73 | //! Return the current print level | 
|---|
| [2650] | 74 | inline int     PrtLevel() { return mPrt; } | 
|---|
|  | 75 |  | 
|---|
| [2808] | 76 | //! Set the maximum number of iteration | 
|---|
| [2650] | 77 | inline void    SetMaxIter(int max = 100000) { mMaxIter = max; } | 
|---|
| [2808] | 78 | //! Return the current  max iter | 
|---|
| [2650] | 79 | inline int     MaxIter() { return mMaxIter; } | 
|---|
| [2808] | 80 | //! Return the number of iterations performed | 
|---|
| [2650] | 81 | inline int     NbIter() { return mIter; } | 
|---|
| [2808] | 82 | //! Return the stop reason | 
|---|
| [2650] | 83 | inline int     StopReason() { return mStop; } | 
|---|
| [2808] | 84 | //! Return the stop reason and a description string (\b s) | 
|---|
| [2650] | 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 | 
|---|
| [2808] | 98 |  | 
|---|
|  | 99 | //! Define the tolerances for the various convergence tests | 
|---|
| [2650] | 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 | 
|---|
| [2808] | 110 |  | 
|---|
|  | 111 | //! Define the similarity (homothetic) factors for the different simplex transformations | 
|---|
| [2650] | 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 |  | 
|---|
| [2808] | 116 | //! Return the the homothetic factor for Reflection | 
|---|
| [2650] | 117 | inline double  Alpha() { return mAlpha; } | 
|---|
| [2808] | 118 | //! Return the the homothetic factor for ContractHigh (contraction away from high point) | 
|---|
| [2650] | 119 | inline double  Beta() { return mBeta; } | 
|---|
| [2808] | 120 | //! Return the the homothetic factor for ContractLow (contraction toward the low point) | 
|---|
| [2650] | 121 | inline double  Beta2() { return mBeta2; } | 
|---|
| [2808] | 122 | //! Return the the homothetic factor for ReflecExpand (reflection+expansion) | 
|---|
| [2650] | 123 | inline double  Gamma() { return mGamma; } | 
|---|
| [2808] | 124 | //! Return the the homothetic factor for ExpandHigh (expansion along high point) | 
|---|
| [2650] | 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 | 
|---|