diff options
author | astrojhgu <astrojhgu@ed2142bd-67ad-457f-ba7c-d818d4011675> | 2011-02-16 16:57:47 +0000 |
---|---|---|
committer | astrojhgu <astrojhgu@ed2142bd-67ad-457f-ba7c-d818d4011675> | 2011-02-16 16:57:47 +0000 |
commit | 40c086725083465778bb85d8447a4fc69ee996c0 (patch) | |
tree | d5b8a5b9fb7d6320bf6d151b75c4eab165792e64 | |
parent | edc1fd182e0aca1c8e33788063f36be4e7e142fe (diff) | |
download | opt-utilities-40c086725083465778bb85d8447a4fc69ee996c0.tar.bz2 |
git-svn-id: file:///home/svn/opt_utilities@174 ed2142bd-67ad-457f-ba7c-d818d4011675
-rw-r--r-- | pre_estimater/lin1d_estimater.hpp | 18 | ||||
-rw-r--r-- | pre_estimater/pre_estimater.hpp | 78 |
2 files changed, 80 insertions, 16 deletions
diff --git a/pre_estimater/lin1d_estimater.hpp b/pre_estimater/lin1d_estimater.hpp index 1ec62cb..e36f2a7 100644 --- a/pre_estimater/lin1d_estimater.hpp +++ b/pre_estimater/lin1d_estimater.hpp @@ -2,33 +2,27 @@ #define LIN1D_ESTIMATER #include "pre_estimater.hpp" #include <misc/optvec.hpp> -#include <vmodels/lin1d.hpp> - +#include <models/lin1d.hpp> +#include <vector> namespace opt_utilities { template <typename T> class lin1d_estimater - :public pre_estimater<optvec<T>,optvec<T>,optvec<T>,T,std::string> + :public pre_estimater<T,T,std::vector<T>,std::string> { private: - const std::string model_id; - private: lin1d_estimater() - :model_id(lin1d<T>().get_type_name()) - {} + { + } lin1d_estimater<T> do_clone()const { return new lin1d_estimater<T>(*this); } - void do_estimate(fitter<optvec<T>,optvec<T>,optvec<T>,T,std::string>& fit)const + void do_estimate(const data<T,T>& d,model<T,T,std::vector<T>,std::string>& m)const { - if(model_id!=fit.get_model().get_type_name()) - { - return; - } } }; } diff --git a/pre_estimater/pre_estimater.hpp b/pre_estimater/pre_estimater.hpp index db21e94..9810683 100644 --- a/pre_estimater/pre_estimater.hpp +++ b/pre_estimater/pre_estimater.hpp @@ -6,23 +6,93 @@ namespace opt_utilities { - template <typename Ty,typename Tx,typename Tp,typename Ts=Ty,typename Tstr=std::string> + + + template <typename Ty,typename Tx,typename Tp,typename Tstr=std::string> class pre_estimater { private: - virtual void do_estimate(fitter<Ty,Tx,Tp,Ts,Tstr>& fit)const=0; + std::string model_id; + private: + virtual void do_estimate(const data_set<Ty,Tx>& d,model<Ty,Tx,Tp,Tstr>& m)const=0; virtual pre_estimater* do_clone()const=0; + virtual void do_destroy() + { + delete this; + } public: - void estimate(fitter<Ty,Tx,Tp,Ts,Tstr>& fit)const + void estimate(const data_set<Ty,Tx>& d,model<Ty,Tx,Tp,Tstr>& m)const { - do_estimate(fit); + do_estimate(d,m); } pre_estimater* clone()const { return this->do_clone(); } + + void destroy() + { + do_destroy(); + } + public: + std::string get_model_id()const + { + return model_id; + } + + void set_model_id(const std::string& s) + { + model_id=s; + } }; + + template <typename Ty,typename Tx,typename Tp,typename Tstr=std::string> + class pre_estimatable + { + private: + pre_estimater<Ty,Tx,Tp,Tstr>* ppe; + public: + pre_estimatable() + :ppe(0) + {} + + void set_pre_estimater(const pre_estimater<Ty,Tx,Tp,Tstr>& pe) + { + if(dynamic_cast<model<Ty,Tx,Tp,Tstr>&>(*this).get_type_name()!=pe.get_model_id()) + { + return; + } + if(ppe) + { + ppe->destroy(); + } + ppe=pe.clone(); + } + + virtual ~pre_estimatable() + { + if(ppe) + { + delete ppe; + } + } + + public: + void estimate(const data_set<Ty,Tx>& d) + { + if(ppe) + { + ppe->estimate(d,dynamic_cast<model<Ty,Tx,Tp,Tstr>&>(*this)); + } + } + }; + + template <typename Ty,typename Tx,typename Tp,typename Ts,typename Tstr> + void pre_estimate(fitter<Ty,Tx,Tp,Ts,Tstr>& fit) + { + dynamic_cast<pre_estimatable<Ty,Tx,Tp,Tstr>&>(fit.get_model()).estimate(fit.get_data_set()); + } } |