#include "fitopt.h"
#include <cmath>
using namespace std;
namespace blop
{
int default_fit_convergence(double old_chi2, double chi2,
const std::vector<blop::var> &oldpars,
const std::vector<blop::var> &newpars,
int nsteps)
{
if(chi2<old_chi2 && ::fabs(old_chi2-chi2)/chi2<1e-4) return 1;
if(chi2 == 0) return 1;
return 0;
}
function fitopt::default_x_ = ARG(1);
function fitopt::default_y_ = ARG(2);
function fitopt::default_sigma_x_;
function fitopt::default_sigma_y_;
int fitopt::default_verbose_ = 1;
int fitopt::default_maxsteps_ = 0;
fitopt::cfuncptr fitopt::default_convergence_ = default_fit_convergence;
void *fitopt::default_convergence_void_ = 0;
fitopt::fitopt()
{
block_ = 0;
x_ = default_x_;
y_ = default_y_;
sigma_x_ = default_sigma_x_;
sigma_y_ = default_sigma_y_;
verbose_ = default_verbose_;
maxsteps_ = default_maxsteps_;
convergence_ = default_convergence_;
convergence_void_ = default_convergence_void_;
x_condition_ = default_x_condition_;
y_condition_ = default_y_condition_;
condition_ = default_condition_;
}
void fitopt::default_x(const function &f)
{ default_x_ = f; }
void fitopt::default_x(const function &f1, const function &f2)
{ default_x_ = function(f1,f2); }
void fitopt::default_x(const function &f1, const function &f2, const function &f3)
{ default_x_ = function(f1,f2,f3); }
void fitopt::default_y(const function &f)
{ default_y_ = f; }
void fitopt::default_y(const function &f1, const function &f2)
{ default_y_ = function(f1,f2); }
void fitopt::default_y(const function &f1, const function &f2, const function &f3)
{ default_y_ = function(f1,f2,f3); }
void fitopt::default_sigma_x(const function &f)
{ default_sigma_x_ = f; }
void fitopt::default_sigma_x(const function &f1, const function &f2)
{ default_sigma_x_ = function(f1,f2); }
void fitopt::default_sigma_x(const function &f1, const function &f2, const function &f3)
{ default_sigma_x_ = function(f1,f2,f3); }
void fitopt::default_sigma_y(const function &f)
{ default_sigma_y_ = f; }
void fitopt::default_sigma_y(const function &f1, const function &f2)
{ default_sigma_y_ = function(f1,f2); }
void fitopt::default_sigma_y(const function &f1, const function &f2, const function &f3)
{ default_sigma_y_ = function(f1,f2,f3); }
fitopt &fitopt::block(int b) { block_ = b; return *this; }
fitopt &fitopt::x(const function &f) { x_ = f; return *this; }
fitopt &fitopt::x(const function &f1, const function &f2) { x_ = function(f1,f2); return *this; }
fitopt &fitopt::x(const function &f1, const function &f2, const function &f3) { x_ = function(f1,f2,f3); return *this; }
fitopt &fitopt::x(const function &f1, const function &f2, const function &f3, const function &f4) { x_ = function(f1,f2,f3,f4); return *this; }
fitopt &fitopt::x(const function &f1, const function &f2, const function &f3, const function &f4, const function &f5) { x_ = function(f1,f2,f3,f4,f5); return *this; }
fitopt &fitopt::x(const function &f1, const function &f2, const function &f3, const function &f4, const function &f5, const function &f6) { x_ = function(f1,f2,f3,f4,f5,f6); return *this; }
fitopt &fitopt::y(const function &f) { y_ = f; return *this; }
fitopt &fitopt::y(const function &f1, const function &f2) { y_ = function(f1,f2); return *this; }
fitopt &fitopt::y(const function &f1, const function &f2, const function &f3) { y_ = function(f1,f2,f3); return *this; }
fitopt &fitopt::y(const function &f1, const function &f2, const function &f3, const function &f4) { y_ = function(f1,f2,f3,f4); return *this; }
fitopt &fitopt::y(const function &f1, const function &f2, const function &f3, const function &f4, const function &f5) { y_ = function(f1,f2,f3,f4,f5); return *this; }
fitopt &fitopt::y(const function &f1, const function &f2, const function &f3, const function &f4, const function &f5, const function &f6) { y_ = function(f1,f2,f3,f4,f5,f6); return *this; }
fitopt &fitopt::sigma_x(const function &f) { sigma_x_ = f; return *this; }
fitopt &fitopt::sigma_x(const function &f1, const function &f2) { sigma_x_ = function(f1,f2); return *this; }
fitopt &fitopt::sigma_x(const function &f1, const function &f2, const function &f3) { sigma_x_ = function(f1,f2,f3); return *this; }
fitopt &fitopt::sigma_x(const function &f1, const function &f2, const function &f3, const function &f4) { sigma_x_ = function(f1,f2,f3,f4); return *this; }
fitopt &fitopt::sigma_x(const function &f1, const function &f2, const function &f3, const function &f4, const function &f5) { sigma_x_ = function(f1,f2,f3,f4,f5); return *this; }
fitopt &fitopt::sigma_x(const function &f1, const function &f2, const function &f3, const function &f4, const function &f5, const function &f6) { sigma_x_ = function(f1,f2,f3,f4,f5,f6); return *this; }
fitopt &fitopt::sigma_y(const function &f) { sigma_y_ = f; return *this; }
fitopt &fitopt::sigma_y(const function &f1, const function &f2) { sigma_y_ = function(f1,f2); return *this; }
fitopt &fitopt::sigma_y(const function &f1, const function &f2, const function &f3) { sigma_y_ = function(f1,f2,f3); return *this; }
fitopt &fitopt::sigma_y(const function &f1, const function &f2, const function &f3, const function &f4) { sigma_y_ = function(f1,f2,f3,f4); return *this; }
fitopt &fitopt::sigma_y(const function &f1, const function &f2, const function &f3, const function &f4, const function &f5) { sigma_y_ = function(f1,f2,f3,f4,f5); return *this; }
fitopt &fitopt::sigma_y(const function &f1, const function &f2, const function &f3, const function &f4, const function &f5, const function &f6) { sigma_y_ = function(f1,f2,f3,f4,f5,f6); return *this; }
fitopt &fitopt::fix(int i, bool fixit)
{
if(fixit)fixed_pars_.push_back(i);
else
{
for(int ii=0; ii<(int)fixed_pars_.size(); ++ii)
{
if(fixed_pars_[ii] == i) fixed_pars_.erase(fixed_pars_.begin()+(ii--));
}
}
return *this;
}
bool fitopt::fixed(int pi)
{
for(int i=0; i<(int)fixed_pars_.size(); ++i)
{
if(fixed_pars_[i] == pi) return true;
}
return false;
}
function fitopt::default_x_condition_ = unset;
function fitopt::default_y_condition_ = unset;
function fitopt::default_condition_ = unset;
}