#ifndef CHI_SQ_HPP #define CHI_SQ_HPP #include #include #include #include using std::cerr;using std::endl; namespace opt_utilities { template class chisq :public statistic { private: bool verb; int n; statistic* do_clone()const { // return const_cast*>(this); return new chisq(*this); } public: void verbose(bool v) { verb=v; } public: chisq() :verb(false) {} Ts do_eval(const Tp& p) { Ts result(0); for(int i=(this->datas()).size()-1;i>=0;--i) { Ty chi=(this->datas().get_data(i).get_y()-eval_model(this->datas().get_data(i).get_x(),p))/this->datas().get_data(i).get_y_upper_err(); result+=chi*chi; } if(verb) { n++; if(n%10==0) { cerr< class chisq,double,std::string> :public statistic ,double,std::string> { public: typedef double Ty; typedef double Tx; typedef std::vector Tp; typedef double Ts; typedef std::string Tstr; private: bool verb; int n; statistic* do_clone()const { // return const_cast*>(this); return new chisq(*this); } public: void verbose(bool v) { verb=v; } public: chisq() :verb(false) {} Ty do_eval(const Tp& p) { Ty result(0); for(int i=(this->datas()).size()-1;i>=0;--i) { #ifdef HAVE_X_ERROR Tx x1=this->datas().get_data(i).get_x()-this->datas().get_data(i).get_x_lower_err(); Tx x2=this->datas().get_data(i).get_x()+this->datas().get_data(i).get_x_upper_err(); Tx x=this->datas().get_data(i).get_x(); Ty errx1=(eval_model(x1,p)-eval_model(x,p)); Ty errx2=(eval_model(x2,p)-eval_model(x,p)); //Ty errx=0; #else Ty errx1=0; Ty errx2=0; #endif Ty y_model=eval_model(this->datas().get_data(i).get_x(),p); Ty y_obs=this->datas().get_data(i).get_y(); Ty y_err; Ty errx=0; if(errx10?errx1:-errx1; } else { errx=errx2>0?errx2:-errx2; } } else { if(y_obs0?errx2:-errx2; } else { errx=errx1>0?errx1:-errx1; } } if(y_model>y_obs) { y_err=this->datas().get_data(i).get_y_upper_err(); } else { y_err=this->datas().get_data(i).get_y_lower_err(); } Ty chi=(y_obs-y_model)/std::sqrt(y_err*y_err+errx*errx); // Ty chi=(this->datas().get_data(i).get_y()-eval_model(this->datas().get_data(i).get_x(),p)); // cerr<datas()[i].x,p)<datas()[i].y_upper_err<datas()[i].x<<"\t"<datas()[i].y<<"\t"<datas()[i].x,p)<