[220] | 1 | // This may look like C code, but it is really -*- C++ -*-
|
---|
| 2 | #ifndef GENERALFIT_SEEN
|
---|
| 3 | #define GENERALFIT_SEEN
|
---|
| 4 |
|
---|
[244] | 5 | #include "pexceptions.h"
|
---|
[514] | 6 | #include "tvector.h"
|
---|
[220] | 7 | #include "generaldata.h"
|
---|
| 8 |
|
---|
[552] | 9 | namespace SOPHYA {
|
---|
[307] | 10 |
|
---|
[220] | 11 | //================================================================
|
---|
| 12 | // GeneralFunction
|
---|
| 13 | //================================================================
|
---|
| 14 |
|
---|
[914] | 15 |
|
---|
| 16 | /*!
|
---|
| 17 | Classe de fonctions parametrees a plusieurs variables:
|
---|
| 18 | \f$ F[x1,x2,x3,...:a1,a2,a3,...] \f$
|
---|
| 19 | */
|
---|
[307] | 20 | class GeneralFunction {
|
---|
[220] | 21 | public:
|
---|
| 22 | GeneralFunction(unsigned int nVar, unsigned int nPar);
|
---|
| 23 | virtual ~GeneralFunction();
|
---|
| 24 |
|
---|
[914] | 25 | //! Valeur de la fonction a definir par l'utilisateur (fct virtuelle pure)
|
---|
[220] | 26 | virtual double Value(double const xp[], double const* parm)=0;
|
---|
| 27 | virtual double Val_Der(double const xp[], double const* parm
|
---|
| 28 | , double* DgDpar);
|
---|
| 29 |
|
---|
| 30 | void SetDeltaParm(int numPar, double delta=0.);
|
---|
| 31 | void SetDeltaParm(double const* dparam);
|
---|
| 32 |
|
---|
[914] | 33 | //! Retourne le nombre de variables Xi
|
---|
[220] | 34 | inline int NVar() const {return mNVar;}
|
---|
[914] | 35 | //! Retourne le nombre de parametres Ai
|
---|
[220] | 36 | inline int NPar() const {return mNPar;}
|
---|
| 37 |
|
---|
| 38 | protected:
|
---|
[914] | 39 | const int mNVar; //!< nombre de variables f(x,y,z,...)
|
---|
| 40 | const int mNPar; //!< nombre de parametres
|
---|
[220] | 41 |
|
---|
| 42 | double *deltaParm;
|
---|
| 43 | double *tmpParm;
|
---|
| 44 | };
|
---|
| 45 |
|
---|
| 46 | //================================================================
|
---|
| 47 | // GeneralFunc
|
---|
| 48 | //================================================================
|
---|
| 49 |
|
---|
[914] | 50 | /*!
|
---|
| 51 | Classe de fonctions parametrees a plusieurs variables
|
---|
| 52 | derivant de ``GeneralFunction''. Permet de definir
|
---|
| 53 | une fonction a fiter sans passer par une classe derivee
|
---|
| 54 | en utilisant l'ecriture courante du C. La fonction
|
---|
| 55 | retournant les derivees par rapport aux parametres du fit
|
---|
| 56 | peut etre egalement fournie (optionnel).
|
---|
| 57 | */
|
---|
[220] | 58 | class GeneralFunc : public GeneralFunction {
|
---|
| 59 | public:
|
---|
| 60 | GeneralFunc(unsigned int nvar, unsigned int npar
|
---|
| 61 | ,double (*fun)(double const*,double const*)
|
---|
| 62 | ,double (*funder)(double const*, double const*, double*)=NULL);
|
---|
| 63 | virtual ~GeneralFunc();
|
---|
| 64 |
|
---|
| 65 | virtual double Value(double const xp[], double const* Par);
|
---|
| 66 | virtual double Val_Der(double const xp[],double const* parm
|
---|
| 67 | , double* DgDpar);
|
---|
| 68 |
|
---|
| 69 | protected:
|
---|
| 70 | double (*tmpFun) (double const*, double const*);
|
---|
| 71 | double (*tmpFunDer)(double const*, double const*, double*);
|
---|
| 72 | };
|
---|
| 73 |
|
---|
| 74 | //================================================================
|
---|
| 75 | // GeneralXi2
|
---|
| 76 | //================================================================
|
---|
| 77 |
|
---|
| 78 | class GeneralFitData;
|
---|
| 79 |
|
---|
[914] | 80 | /*!
|
---|
| 81 | Classe de Xi2 a plusieurs parametres :
|
---|
| 82 | \f$ Xi2[a1,a2,a3,...] \f$
|
---|
| 83 | */
|
---|
[307] | 84 | class GeneralXi2 {
|
---|
[220] | 85 | public:
|
---|
| 86 | GeneralXi2(unsigned int nPar);
|
---|
| 87 | virtual ~GeneralXi2();
|
---|
| 88 |
|
---|
[914] | 89 | /*!
|
---|
| 90 | Valeur du Xi2 a definir par l'utilisateur (fct virtuelle pure)
|
---|
| 91 | a partir des donnees de `data'. l'utilisateur doit egalement
|
---|
| 92 | retourner le nombre de points de mesure utilises dans le calcul
|
---|
| 93 | du Xi2 (`ndataused').
|
---|
| 94 | */
|
---|
[220] | 95 | virtual double Value(GeneralFitData& data, double* parm, int& ndataused)=0;
|
---|
| 96 | virtual double Derivee(GeneralFitData& data, int i, double* parm);
|
---|
| 97 | virtual double Derivee2(GeneralFitData& data, int i,int j, double* parm);
|
---|
| 98 |
|
---|
| 99 | void SetDeltaParm(int numPar, double delta=0.);
|
---|
| 100 | void SetDeltaParm(double const* dparam);
|
---|
| 101 |
|
---|
[914] | 102 | //! Retourne le nombre de parametres Ai.
|
---|
[220] | 103 | inline int NPar() const {return mNPar;}
|
---|
| 104 |
|
---|
| 105 | protected:
|
---|
[914] | 106 | const int mNPar; //!< nombre de parametres
|
---|
[220] | 107 |
|
---|
| 108 | double *deltaParm;
|
---|
| 109 | };
|
---|
| 110 |
|
---|
| 111 | //================================================================
|
---|
| 112 | // GENERALFIT
|
---|
| 113 | //================================================================
|
---|
| 114 |
|
---|
[914] | 115 | //! Classe de fit d'une GeneralFunction sur une GeneralFitData
|
---|
[307] | 116 | class GeneralFit {
|
---|
[220] | 117 | public:
|
---|
| 118 | GeneralFit(GeneralFunction* f);
|
---|
| 119 | GeneralFit(GeneralXi2* f);
|
---|
| 120 | ~GeneralFit();
|
---|
| 121 |
|
---|
| 122 | void WriteStep(char *filename = NULL);
|
---|
| 123 | void SetDebug(int level = 0);
|
---|
| 124 | void SetMaxStep(int n = 100);
|
---|
| 125 | void SetLambda_Fac(double fac = 10.);
|
---|
| 126 | void SetStopChi2(double s = 0.01);
|
---|
| 127 | void SetEps(double ep = 1.e-8);
|
---|
| 128 | void SetEps(int n,double ep = 1.e-8);
|
---|
| 129 | void SetStopMx(int nstopmx = 3, double stopchi2 = -1.);
|
---|
| 130 | void SetStopLent(int nstoplent = 3);
|
---|
| 131 | void SetFunction(GeneralFunction*);
|
---|
| 132 | void SetFuncXi2(GeneralXi2*);
|
---|
| 133 | void SetData(GeneralFitData*);
|
---|
| 134 | void SetParam(int n,double value, double step
|
---|
| 135 | ,double min=1., double max=-1.);
|
---|
| 136 | void SetParam(int n,string const&
|
---|
| 137 | ,double value, double step
|
---|
| 138 | ,double min=1., double max=-1.);
|
---|
| 139 | void SetParam(int n,double value);
|
---|
| 140 | void SetStep(int n,double value);
|
---|
| 141 | void SetMinStepDeriv(int i,double val = 0.);
|
---|
| 142 | void SetMinStepDeriv(double val = 0.);
|
---|
| 143 | void SetBound(int n,double min,double max);
|
---|
| 144 | void SetBound(int n);
|
---|
| 145 | void SetUnBound(int n);
|
---|
| 146 | void SetUnBound();
|
---|
| 147 | void SetFix(int n,double v);
|
---|
| 148 | void SetFix(int n);
|
---|
| 149 | void SetFree(int n);
|
---|
| 150 | void SetFree();
|
---|
| 151 |
|
---|
| 152 | double GetParm(int);
|
---|
[514] | 153 | Vector GetParm();
|
---|
[220] | 154 | double GetParmErr(int);
|
---|
| 155 | double GetCoVar(int,int);
|
---|
| 156 | double GetStep(int n);
|
---|
| 157 | double GetMax(int n);
|
---|
| 158 | double GetMin(int n);
|
---|
[914] | 159 | //! Retourne le Chi2
|
---|
[220] | 160 | inline double GetChi2() const {return Chi2;};
|
---|
[914] | 161 | //! Retourne le Chi2 reduit
|
---|
[220] | 162 | inline double GetChi2Red() const {
|
---|
| 163 | if(mNddl<=0) return (double) mNddl;
|
---|
| 164 | return Chi2/(double) mNddl;
|
---|
| 165 | };
|
---|
[914] | 166 | //! Retourne la precision de convergence pour le parametre i.
|
---|
[220] | 167 | inline double GetEps(int i) const {return Eps(i);};
|
---|
[914] | 168 | //! Retourne le nombre de degres de liberte
|
---|
[220] | 169 | inline int GetNddl() const {return mNddl;};
|
---|
[914] | 170 | //! Retourne le nombre d'iterations
|
---|
[220] | 171 | inline int GetNStep() const {return nStep;};
|
---|
[914] | 172 | //! Retourne le nombre de variables
|
---|
[220] | 173 | inline int GetNVar() const {return mNVar;};
|
---|
[914] | 174 | //! Retourne le nombre de parametres
|
---|
[220] | 175 | inline int GetNPar() const {return mNPar;};
|
---|
[914] | 176 | //! Retourne le nombre de parametres libres
|
---|
[220] | 177 | inline int GetNFree() const {return mNParFree;};
|
---|
[914] | 178 | //! Retourne le nombre de parametres bornes
|
---|
[220] | 179 | inline int GetNBound() const {return mNParBound;};
|
---|
[914] | 180 | //! Retourne le nstop de convergence
|
---|
[220] | 181 | inline int GetNStop() const {return nStop;};
|
---|
[914] | 182 | //! Retourne le nstop de convergence lente.
|
---|
[220] | 183 | inline int GetNStopLent() const {return nStopLent;};
|
---|
[914] | 184 | //! Retourne le pointeur sur la GeneralFunction utilisee.
|
---|
[220] | 185 | inline GeneralFunction* GetFunction() const {return mFunction;};
|
---|
[914] | 186 | //! Retourne le pointeur sur la GeneralFitData utilisee.
|
---|
[220] | 187 | inline GeneralFitData* GetGData() const {return mData;};
|
---|
| 188 |
|
---|
| 189 | void PrintStatus();
|
---|
| 190 | void PrintFit();
|
---|
| 191 | void PrintParm(int n);
|
---|
| 192 | void PrintParm();
|
---|
| 193 |
|
---|
| 194 | int Fit();
|
---|
| 195 | double ReCalChi2(int& nddl, double* par = NULL);
|
---|
[307] | 196 | GeneralFitData DataResidus(bool clean=true);
|
---|
| 197 | GeneralFitData DataFunction(bool clean=true);
|
---|
[220] | 198 | void PrintFitErr(int rc);
|
---|
| 199 |
|
---|
| 200 | protected:
|
---|
[914] | 201 | int mNtry; //!< numero d'appel de la routine de fit.
|
---|
| 202 | int mNVar; //!< nombre de variables f(x,y,z,...)
|
---|
| 203 | int mNPar; //!< nombre de parametres
|
---|
| 204 | int mNParFree; //!< nombre de parametres libres
|
---|
| 205 | int mNParBound; //!< nombre de parametres bornes
|
---|
[220] | 206 | GeneralFunction* mFunction;
|
---|
| 207 | GeneralXi2* mFuncXi2;
|
---|
| 208 | GeneralFitData* mData;
|
---|
| 209 |
|
---|
[514] | 210 | Vector Param;
|
---|
| 211 | Vector errParam;
|
---|
| 212 | Vector stepParam;
|
---|
| 213 | Vector minParam;
|
---|
| 214 | Vector maxParam;
|
---|
| 215 | Vector minStepDeriv;
|
---|
| 216 | Vector Eps;
|
---|
[220] | 217 | unsigned short int* fixParam;
|
---|
| 218 | unsigned short int* boundParam;
|
---|
| 219 | string* nameParam;
|
---|
| 220 |
|
---|
| 221 | double Lambda_Fac;
|
---|
| 222 | double stopChi2;
|
---|
| 223 | int maxStep;
|
---|
| 224 | int nStopMx;
|
---|
| 225 | double stopChi2SMx;
|
---|
| 226 | int nStopLent;
|
---|
| 227 | int debugLevel;
|
---|
| 228 | FILE *FileStep;
|
---|
| 229 |
|
---|
[514] | 230 | Matrix ATGA;
|
---|
| 231 | Vector BETA;
|
---|
| 232 | Matrix ATGA_Try;
|
---|
| 233 | Vector BETA_Try;
|
---|
| 234 | Vector C;
|
---|
| 235 | Vector D;
|
---|
[220] | 236 |
|
---|
| 237 | double Chi2;
|
---|
| 238 | int mNddl;
|
---|
| 239 | int nStep;
|
---|
| 240 | int nStop, nStopL;
|
---|
| 241 | double Lambda;
|
---|
| 242 |
|
---|
| 243 | // Fonctions privees
|
---|
[514] | 244 | void write_in_step(double ci2,Vector& par);
|
---|
[220] | 245 | void General_Init(void);
|
---|
[514] | 246 | void TryFunc(Vector& par,Vector& par_tr);
|
---|
| 247 | void TryXi2(Vector& par,Vector& par_tr);
|
---|
[220] | 248 | void CheckSanity();
|
---|
| 249 | void Set_Bound_C_D(int i);
|
---|
| 250 | void Set_Bound_C_D();
|
---|
| 251 | double p_vers_tr(int i,double p);
|
---|
[514] | 252 | Vector p_vers_tr(Vector const& p);
|
---|
| 253 | void p_vers_tr(Vector const& p,Vector& tr);
|
---|
[220] | 254 | double tr_vers_p(int i,double tr);
|
---|
[514] | 255 | Vector tr_vers_p(Vector const& tr);
|
---|
| 256 | void tr_vers_p(Vector const& tr,Vector& p);
|
---|
[220] | 257 | double c_dp_vers_dtr(int i,double tr);
|
---|
[514] | 258 | Vector dp_vers_dtr(Vector const& dp,Vector const& tr);
|
---|
| 259 | void dp_vers_dtr(Vector const& dp,Vector const& tr,Vector& dtr);
|
---|
[220] | 260 | double c_dtr_vers_dp(int i,double tr);
|
---|
[514] | 261 | Vector dtr_vers_dp(Vector const& dtr,Vector const& tr);
|
---|
| 262 | int put_in_limits_for_deriv(Vector const& p,Vector& dp,double dist=0.66);
|
---|
| 263 | inline void dtr_vers_dp(Vector const& dtr,Vector const& tr,Vector& dp)
|
---|
[220] | 264 | { for(int i=0;i<mNPar;i++)
|
---|
| 265 | { if( fixParam[i] ) continue;
|
---|
| 266 | if( ! boundParam[i] ) dp(i) = dtr(i);
|
---|
| 267 | else dp(i) = D(i)/(1.+tr(i)*tr(i)) * dtr(i); }
|
---|
| 268 | };
|
---|
| 269 | };
|
---|
| 270 |
|
---|
[307] | 271 | } // Fin du namespace
|
---|
| 272 |
|
---|
[220] | 273 | #endif
|
---|