[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
|
---|