00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef O2SCL_FIT_FIX_H
00024 #define O2SCL_FIT_FIX_H
00025
00026 #include <o2scl/fit_base.h>
00027 #include <o2scl/gsl_fit.h>
00028
00029 #ifndef DOXYGENP
00030 namespace o2scl {
00031 #endif
00032
00033
00034
00035
00036 template<class param_t, class bool_vec_t>
00037 class fit_fix_pars : public fit_base<param_t,fit_funct<param_t> > {
00038
00039 public:
00040
00041
00042
00043 fit_fix_pars() {
00044 fitp=&def_fit;
00045 }
00046
00047 virtual ~fit_fix_pars() {}
00048
00049
00050
00051
00052
00053
00054
00055
00056 virtual int fit(size_t ndat, ovector_view &xdat, ovector_view &ydat,
00057 ovector_view &yerr, size_t npar, ovector_view &par,
00058 omatrix_view &covar, double &chi2, param_t &pa,
00059 fit_funct<param_t> &fitfun) {
00060
00061 xp=∥
00062 funcp=&fitfun;
00063 unv=npar;
00064 nv_new=npar;
00065 ovector xnew(nv_new);
00066 for(size_t i=0;i<npar;i++) {
00067 xnew[i]=par[i];
00068 }
00069 fit_funct_mfptr<fit_fix_pars,param_t>
00070 mfm(this,&fit_fix_pars::fit_func);
00071 fitp->fit(ndat,xdat,ydat,yerr,nv_new,xnew,covar,chi2,pa,mfm);
00072 for(size_t i=0;i<npar;i++) {
00073 par[i]=xnew[i];
00074 }
00075 return 0;
00076 }
00077
00078
00079
00080
00081 virtual int fit_fix(size_t ndat, ovector_view &xdat, ovector_view &ydat,
00082 ovector_view &yerr, size_t npar, ovector_view &par,
00083 bool_vec_t &fix, omatrix_view &covar, double &chi2,
00084 param_t &pa, fit_funct<param_t> &fitfun) {
00085 xp=∥
00086 funcp=&fitfun;
00087 unv=npar;
00088 fixp=&fix;
00089 nv_new=0;
00090 for(size_t i=0;i<npar;i++) {
00091 if (fix[i]==false) nv_new++;
00092 }
00093 if (nv_new==0) return 0;
00094 size_t j=0;
00095 ovector xnew(nv_new);
00096 for(size_t i=0;i<npar;i++) {
00097 if (fix[i]==false) {
00098 xnew[j]=par[i];
00099 j++;
00100 }
00101 }
00102 fit_funct_mfptr<fit_fix_pars,param_t>
00103 mfm(this,&fit_fix_pars::fit_func);
00104 fitp->fit(ndat,xdat,ydat,yerr,nv_new,xnew,covar,chi2,pa,mfm);
00105 j=0;
00106 for(size_t i=0;i<npar;i++) {
00107 if (fix[i]==false) {
00108 par[i]=xnew[j];
00109 j++;
00110 }
00111 }
00112 return 0;
00113 }
00114
00115
00116 int set_fit(fit_base<param_t,fit_funct_mfptr
00117 <fit_fix_pars,param_t> > &fitter) {
00118 fitp=&fitter;
00119 return 0;
00120 }
00121
00122
00123 gsl_fit<param_t,fit_funct_mfptr<fit_fix_pars,param_t> > def_fit;
00124
00125 #ifndef DOXYGEN_INTERNAL
00126
00127 protected:
00128
00129
00130
00131 virtual int fit_func(size_t nv, ovector_view &x, double xx,
00132 double &y, param_t &pa) {
00133 ovector tmp(unv);
00134 size_t j=0;
00135 for(size_t i=0;i<unv;i++) {
00136 if (nv_new<unv && (*fixp)[i]==true) {
00137 tmp[i]=(*xp)[i];
00138 } else {
00139 tmp[i]=x[j];
00140 j++;
00141 }
00142 }
00143 int ret=(*funcp)(unv,tmp,xx,y,pa);
00144 return ret;
00145 }
00146
00147
00148 fit_base<param_t,fit_funct_mfptr<fit_fix_pars,param_t> > *fitp;
00149
00150
00151 fit_funct<param_t> *funcp;
00152
00153
00154 size_t unv;
00155
00156
00157 size_t nv_new;
00158
00159
00160 bool_vec_t *fixp;
00161
00162
00163 ovector_view *xp;
00164
00165 #ifndef DOXYGENP
00166 #endif
00167
00168 private:
00169
00170 fit_fix_pars(const fit_fix_pars &);
00171 fit_fix_pars& operator=(const fit_fix_pars&);
00172
00173 #endif
00174
00175 };
00176
00177
00178 #ifndef DOXYGENP
00179 }
00180 #endif
00181
00182 #endif