00001
00002
00003
00004 #ifndef FITYK__FIT__H__
00005 #define FITYK__FIT__H__
00006 #include <vector>
00007 #include <map>
00008 #include <string>
00009 #include <time.h>
00010 #include "common.h"
00011
00012
00013 class DataAndModel;
00014 class Ftk;
00015 class Variable;
00016
00017
00018 class Fit
00019 {
00020 public:
00021 const std::string name;
00022
00023 Fit(Ftk *F, const std::string& m);
00024 virtual ~Fit() {};
00025 void fit(int max_iter, const std::vector<DataAndModel*>& dms);
00026 void continue_fit(int max_iter);
00027 bool is_initialized() const { return !dmdm_.empty(); }
00028 bool is_initialized(const std::vector<DataAndModel*>& dms) const
00029 { return dms == dmdm_; }
00030 std::string get_goodness_info(const std::vector<DataAndModel*>& dms);
00031 int get_dof(const std::vector<DataAndModel*>& dms);
00032 std::string get_cov_info(const std::vector<DataAndModel*>& dms);
00033 std::vector<realt>
00034 get_covariance_matrix(const std::vector<DataAndModel*>& dms);
00035 std::vector<realt>
00036 get_standard_errors(const std::vector<DataAndModel*>& dms);
00037 std::vector<realt>
00038 get_confidence_limits(const std::vector<DataAndModel*>& dms,
00039 double level_percent);
00040
00041 static realt compute_wssr_for_data (const DataAndModel* dm, bool weigthed);
00042 realt do_compute_wssr(const std::vector<realt> &A,
00043 const std::vector<DataAndModel*>& dms,
00044 bool weigthed);
00045 static realt compute_r_squared_for_data(const DataAndModel* dm,
00046 realt* sum_err, realt* sum_tot);
00047 void Jordan(std::vector<realt>& A, std::vector<realt>& b, int n);
00048 void reverse_matrix (std::vector<realt>&A, int n);
00049
00050 std::string print_matrix(const std::vector<realt>& vec,
00051 int m, int n, const char *mname);
00052 realt compute_r_squared(const std::vector<realt> &A,
00053 const std::vector<DataAndModel*>& dms);
00054 bool is_param_used(int n) const { return par_usage_[n]; }
00055 protected:
00056 Ftk *F_;
00057 std::vector<DataAndModel*> dmdm_;
00058 int evaluations_;
00059 int max_iterations_;
00060 int iter_nr_;
00061 realt wssr_before_;
00062 std::vector<realt> a_orig_;
00063 std::vector<bool> par_usage_;
00064 int na_;
00065
00066 virtual void init() = 0;
00067 virtual void autoiter() = 0;
00068 bool common_termination_criteria(int iter);
00069 void compute_derivatives(const std::vector<realt> &A,
00070 const std::vector<DataAndModel*>& dms,
00071 std::vector<realt>& alpha, std::vector<realt>& beta);
00072 realt compute_wssr(const std::vector<realt> &A,
00073 const std::vector<DataAndModel*>& dms, bool weigthed=true)
00074 { ++evaluations_; return do_compute_wssr(A, dms, weigthed); }
00075 bool post_fit(const std::vector<realt>& aa, realt chi2);
00076 realt draw_a_from_distribution(int nr, char distribution = 'u',
00077 realt mult = 1.);
00078 void iteration_plot(const std::vector<realt> &A, realt wssr);
00079 private:
00080 time_t last_refresh_time_;
00081 clock_t start_time_;
00082
00083 void compute_derivatives_for(const DataAndModel *dm,
00084 std::vector<realt>& alpha,
00085 std::vector<realt>& beta);
00086 void update_parameters(const std::vector<DataAndModel*>& dms);
00087 };
00088
00089
00090 class ParameterHistoryMgr
00091 {
00092 public:
00093 ParameterHistoryMgr(Ftk *F) : F_(F), param_hist_ptr_(0) {}
00094 bool push_param_history(const std::vector<realt>& aa);
00095 void clear_param_history() { param_history_.clear(); param_hist_ptr_ = 0; }
00096 int get_param_history_size() const { return param_history_.size(); }
00097 void load_param_history(int item_nr, bool relative);
00098 bool has_param_history_rel_item(int rel_nr) const
00099 { return is_index(param_hist_ptr_ + rel_nr, param_history_); }
00100 bool can_undo() const;
00101 std::string param_history_info() const;
00102 const std::vector<realt>& get_item(int n) const {return param_history_[n];}
00103 int get_active_nr() const { return param_hist_ptr_; }
00104 protected:
00105 Ftk *F_;
00106 private:
00107 std::vector<std::vector<realt> > param_history_;
00108 int param_hist_ptr_;
00109 };
00110
00111
00112
00113 class FitMethodsContainer : public ParameterHistoryMgr
00114 {
00115 public:
00116 FitMethodsContainer(Ftk *F_);
00117 ~FitMethodsContainer();
00118 Fit* get_method(int n) const
00119 { assert(n >= 0 && n<size(methods_)); return methods_[n]; }
00120 const std::vector<Fit*>& methods() const { return methods_; }
00121 realt get_standard_error(const Variable* var) const;
00122 void outdated_error_cache() { dirty_error_cache_ = true; }
00123
00124 private:
00125 std::vector<Fit*> methods_;
00126 mutable std::vector<realt> errors_cache_;
00127 bool dirty_error_cache_;
00128
00129 DISALLOW_COPY_AND_ASSIGN(FitMethodsContainer);
00130 };
00131
00132 #endif
00133