diff options
Diffstat (limited to 'error_estimator')
| -rw-r--r-- | error_estimator/error_estimator.hpp | 17 | 
1 files changed, 13 insertions, 4 deletions
| diff --git a/error_estimator/error_estimator.hpp b/error_estimator/error_estimator.hpp index 4324cd0..a6c6163 100644 --- a/error_estimator/error_estimator.hpp +++ b/error_estimator/error_estimator.hpp @@ -1,6 +1,7 @@  #ifndef ERROR_EST  #define ERROR_EST  #include <core/fitter.hpp> +#include <core/freeze_param.hpp>  #include <iostream>  #include <vector>  #include <string> @@ -8,7 +9,7 @@  namespace opt_utilities  {    template <typename Ty,typename Tx,typename Tp,typename Ts,typename Tstr> -  void estimate_error(fitter<Ty,Tx,Tp,Ts>& fit,const Tstr& pname,typename element_type_trait<Tp>::element_type& lower,typename element_type_trait<Tp>::element_type& upper,const Ts& dchi) +  void estimate_error(fitter<Ty,Tx,Tp,Ts>& fit,const Tstr& pname,typename element_type_trait<Tp>::element_type& lower,typename element_type_trait<Tp>::element_type& upper,const Ts& dchi,const Ts& precision)    {      typedef typename element_type_trait<Tp>::element_type Tpe;      std::vector<Tstr> pnames; @@ -41,16 +42,24 @@ namespace opt_utilities      Tpe current_value=        fit.get_param_value(pname); +     +    if(lower>=current_value||upper<=current_value) +      { +	std::cerr<<"Error, initial lower and upper limits should be smaller and larger than the best fit value, respectively"<<std::endl; +	return; +      } +      Tp current_params(fit.get_model().get_all_params());      Ts current_chi=fit.get_statistic_value();      Tpe upper1=current_value;      Tpe step=upper-current_value; +          while(1)        {  	fit.set_param_value(pname,upper);  	fit.fit();  	Ts chi=fit.get_statistic_value(); -	cerr<<upper<<"\t"<<chi<<std::endl; +	std::cerr<<upper<<"\t"<<chi<<std::endl;  	if(chi>current_chi+dchi)  	  {  	    break; @@ -59,7 +68,7 @@ namespace opt_utilities        }      Ts target_chi=current_chi+dchi; -    while(upper-upper1>1E-10) +    while(upper-upper1>std::abs(precision))        {  	std::cerr<<upper<<"\t"<<upper1<<std::endl;  	fit.set_param_value(pname,upper1); @@ -114,7 +123,7 @@ namespace opt_utilities      fit.set_param_value(pname,current_value);      fit.fit(); -    while(lower1-lower>1E-10) +    while(lower1-lower>std::abs(precision))        {  	fit.set_param_value(pname,lower1);  	fit.fit(); | 
