source: Sophya/trunk/SophyaLib/NTools/simplex.h@ 3638

Last change on this file since 3638 was 2808, checked in by ansari, 20 years ago

MAJ documentation - Reza 14/6/2005

File size: 6.0 KB
Line 
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
26using namespace std;
27
28namespace SOPHYA {
29
30//! Interface definition for multivariable function (used by SimplexMinmizer)
31class MinZFunction {
32public:
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;}
40protected:
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
45class MinZFuncXi2 : public MinZFunction {
46public:
47 MinZFuncXi2(GeneralXi2* gxi2, GeneralFitData* gd);
48 virtual ~MinZFuncXi2();
49 virtual double Value(double const xp[]);
50protected:
51 GeneralXi2 *mGXi2;
52 GeneralFitData *mGData;
53};
54
55//! Class implementing the Simplex minimisation method
56class MinZSimplex {
57public:
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
131protected:
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
Note: See TracBrowser for help on using the repository browser.