// This file is part of fityk program. Copyright (C) Marcin Wojdyr // Licence: GNU General Public License version 2 // $Id: fit.h 322 2007-07-24 00:17:11Z wojdyr $ #ifndef FITYK__FIT__H__ #define FITYK__FIT__H__ #include #include #include #include "common.h" class DataWithSum; class Ftk; /// interface of fitting method and implementation of common functions class Fit { public: std::string const name; Fit(Ftk *F_, std::string const& m); virtual ~Fit() {}; void fit(int max_iter, std::vector const& dsds); void continue_fit(int max_iter); bool is_initialized() const { return !datsums.empty(); } bool is_initialized(DataWithSum const* ds) const { return datsums.size() == 1 && ds == datsums[0]; } bool is_initialized(std::vector const& dsds) const { return dsds == datsums; } std::string get_info(std::vector const& dsds); int get_dof(std::vector const& dsds); std::string getErrorInfo(std::vector const& dsds, bool matrix=false); std::vector get_covariance_matrix(std::vector const&dsds); std::vector get_symmetric_errors(std::vector const& dsds); std::vector const& get_datsums() const { return datsums; } static fp compute_wssr_for_data (DataWithSum const* ds, bool weigthed); fp do_compute_wssr(std::vector const &A, std::vector const& dsds, bool weigthed); static fp compute_r_squared_for_data(DataWithSum const* ds) ; void Jordan (std::vector& A, std::vector& b, int n); void reverse_matrix (std::vector&A, int n); std::string print_matrix (const std::vector& vec, int m, int n, char *mname);//m x n protected: Ftk *F; std::vector datsums; int evaluations; int max_iterations; //it is set before calling autoiter() int iter_nr; fp wssr_before; std::vector a_orig; std::vector par_usage; int na; ///number of fitted parameters virtual fp init() = 0; // called before autoiter() virtual void autoiter() = 0; bool common_termination_criteria(int iter); fp compute_wssr(std::vector const &A, std::vector const& dsds, bool weigthed=true) { ++evaluations; return do_compute_wssr(A, dsds, weigthed); } fp compute_r_squared(std::vector const &A, std::vector const& dsds) ; void compute_derivatives(std::vector const &A, std::vector const& dsds, std::vector& alpha, std::vector& beta); bool post_fit (const std::vector& aa, fp chi2); fp draw_a_from_distribution (int nr, char distribution = 'u', fp mult = 1.); void iteration_plot(std::vector const &A); private: void compute_derivatives_for(DataWithSum const *ds, std::vector& alpha, std::vector& beta); void update_parameters(std::vector const& dss); }; /// handles parameter history class ParameterHistoryMgr { public: ParameterHistoryMgr(Ftk *F_) : F(F_), param_hist_ptr(0) {} bool push_param_history(std::vector const& aa); void clear_param_history() { param_history.clear(); param_hist_ptr = 0; } int get_param_history_size() const { return param_history.size(); } void load_param_history(int item_nr, bool relative=false); bool has_param_history_rel_item(int rel_nr) const { return is_index(param_hist_ptr + rel_nr, param_history); } bool can_undo() const; std::string param_history_info() const; std::vector const& get_item(int n) const { return param_history[n]; } int get_active_nr() const { return param_hist_ptr; } private: Ftk *F; std::vector > param_history; /// old parameter vectors int param_hist_ptr; /// points to the current/last parameter vector }; /// gives access to fitting methods, enables swithing between them /// also stores parameter history class FitMethodsContainer : public ParameterHistoryMgr { public: FitMethodsContainer(Ftk *F); ~FitMethodsContainer(); Fit* get_method(int n) const { assert(n >= 0 && n const& get_methods() const { return methods; } private: std::vector methods; FitMethodsContainer (FitMethodsContainer const&); //disable }; #endif