diff options
author | astrojhgu <astrojhgu@ed2142bd-67ad-457f-ba7c-d818d4011675> | 2010-08-15 08:09:57 +0000 |
---|---|---|
committer | astrojhgu <astrojhgu@ed2142bd-67ad-457f-ba7c-d818d4011675> | 2010-08-15 08:09:57 +0000 |
commit | 323c80a9f87d22b33b781fa4737d6da3eb7268b7 (patch) | |
tree | 6240a6d5a389be76ea7820ed2c46ba2fd7b95ef4 | |
parent | 16b94d08ac1196823d7e3daf787b85813ba33e6e (diff) | |
download | opt-utilities-323c80a9f87d22b33b781fa4737d6da3eb7268b7.tar.bz2 |
git-svn-id: file:///home/svn/opt_utilities@132 ed2142bd-67ad-457f-ba7c-d818d4011675
-rw-r--r-- | interface/makefile | 5 | ||||
-rw-r--r-- | interface/opt.cc | 51 | ||||
-rw-r--r-- | interface/type_depository.hpp | 408 |
3 files changed, 460 insertions, 4 deletions
diff --git a/interface/makefile b/interface/makefile index 62a53a7..c93f937 100644 --- a/interface/makefile +++ b/interface/makefile @@ -1,11 +1,12 @@ +target: libopt.a INC=-I../ libopt.a:opt.o - $(AR) $@ opt.o + $(AR) rv $@ opt.o opt.o:opt.cc opt.h - $(CXX) $< -o $@ $(INC) $(CXXFLAGS) + $(CXX) $< -o $@ $(INC) $(CXXFLAGS) -c clean: diff --git a/interface/opt.cc b/interface/opt.cc index 3930568..f122e2a 100644 --- a/interface/opt.cc +++ b/interface/opt.cc @@ -1,10 +1,31 @@ #include "opt.h" #include <utilities/opt_types.hpp> #include <math/num_diff.hpp> -#include <models/models.hpp> #include <map> #include <core/freeze_param.hpp> #include <data_sets/default_data_set.hpp> +#include "type_depository.hpp" +#include <memory> + +//models: +#include <models/gauss1d.hpp> +#include <models/bl1d.hpp> +#include <models/nfw1d.hpp> +#include <models/bpl1d.hpp> +#include <models/beta1d.hpp> +#include <models/nbeta1d.hpp> +#include <models/dbeta1d.hpp> +#include <models/lin1d.hpp> +#include <models/pl1d.hpp> +#include <models/poly1d.hpp> +#include <models/bremss.hpp> +#include <models/beta2d2.hpp> +#include <models/beta2d.hpp> +#include <models/dbeta2d2.hpp> +#include <models/dbeta2d3.hpp> +#include <models/dbeta2d.hpp> +#include <models/polar_ellipse.hpp> +//end models //#include <iostream> using namespace std; @@ -27,6 +48,31 @@ struct fit_space }; +std::vector<std::string> model_names; + +void regist_model(const dopt::model& m,const char* addr) +{ + + if(find(model_names.begin(),model_names.end(),m.get_type_name())!=model_names.end()) + { + cerr<<m.get_type_name()<<" has been registed"<<endl; + return; + } + cerr<<"registing:"<<m.get_type_name()<<endl; + model_names.push_back(m.get_type_name()); + opt_utilities::register_model(m); +} + + + +class initializer +{ +public: + initializer() + { + regist_model(lin1d<double>(),"lin1d"); + } +}_initializer; extern "C" { @@ -90,7 +136,8 @@ void set_model_(const int& nfit,const char* model_name) } try { - iter->second.fit.set_model(opt_utilities::get_1dmodel_by_name(model_name)); + std::auto_ptr<dopt::model> p(opt_utilities::get_model<double,double,std::vector<double>,std::string>(model_name)); + iter->second.fit.set_model(*p); } catch(opt_exception& e) { diff --git a/interface/type_depository.hpp b/interface/type_depository.hpp new file mode 100644 index 0000000..7405bb5 --- /dev/null +++ b/interface/type_depository.hpp @@ -0,0 +1,408 @@ +#ifndef TYPE_DEPOSITORY_HPP +#define TYPE_DEPOSITORY_HPP +#include <string> +#include <utility> +#include "../core/optimizer.hpp" +#include "../core/fitter.hpp" +#include <map> +#include <iostream> +namespace opt_utilities +{ + + enum fetch_direction + { + in,out + }; + + class type_unregistered + :public opt_exception + { + const char* what()const throw() + { + return "type not registred"; + } + }; + + template <typename T> + class holder + { + private: + T* ptr; + public: + holder() + :ptr(0) + {} + + holder(T* p) + :ptr(p) + {} + + holder(const holder& rhs) + :ptr(rhs.ptr) + { + const_cast<holder&>(rhs).ptr=0; + } + + ~holder() + { + delete ptr; + } + + holder& operator=(const holder& rhs) + { + if(this==&rhs) + { + return *this; + } + delete ptr; + ptr=rhs.ptr; + const_cast<holder&>(rhs).ptr=0; + } + + public: + T* release() + { + T* p=ptr; + ptr=0; + return p; + } + + void destroy() + { + delete ptr; + } + + T* get()const + { + return ptr; + } + + void reset(T* p) + { + destroy(); + ptr=p; + } + + operator T*() + { + return ptr; + } + + operator const T*()const + { + return ptr; + } + + public: + T& operator*() + { + return *ptr; + } + + public: + T* operator->() + { + return ptr; + } + }; + + + template <typename Ty,typename Tx> + void delete_clone(const func_obj<Ty,Tx>* pfo) + { + const_cast<func_obj<Ty,Tx>* >(pfo)->destroy(); + } + + template <typename Ty,typename Tx> + void fetch_func_obj(func_obj<Ty,Tx>* &fo,std::string cname,fetch_direction dir=in) + { + static std::map<std::string,holder<func_obj<Ty,Tx> > >pm; + typename std::map<std::string, + holder<func_obj<Ty,Tx> > >::iterator it=pm.find(cname); + + if(dir==out) + { + if(it==pm.end()) + { + std::cerr<<cname<<std::endl; + throw type_unregistered();; + } + else + { + func_obj<Ty,Tx>* result=it->second; + fo=result->clone(); + } + } + else if(dir==in) + { + //pm.insert(make_pair(cname,holder<func_obj<Ty,Tx> >(fo->clone()))); + + pm[cname]=holder<func_obj<Ty,Tx> >(fo->clone()); + } + } + + template <typename Ty,typename Tx> + void register_func_obj(const func_obj<Ty,Tx>& fo) + { + func_obj<Ty,Tx>* pfo=const_cast<func_obj<Ty,Tx>*>(&fo); + fetch_func_obj(pfo,fo.get_type_name(),in); + } + + template <typename Ty,typename Tx> + func_obj<Ty,Tx>* get_func_obj(std::string cname) + { + func_obj<Ty,Tx>* pom; + fetch_func_obj(pom,cname,out); + return pom; + } + + + template <typename Ty,typename Tx> + void delete_clone(const opt_method<Ty,Tx>* pfo) + { + const_cast<opt_method<Ty,Tx>* >(pfo)->destroy(); + } + + template <typename Ty,typename Tx> + void fetch_opt_method(opt_method<Ty,Tx>* &fo,std::string cname,fetch_direction dir) + { + static std::map<std::string,holder<opt_method<Ty,Tx> > > pm; + typename std::map<std::string, + holder<opt_method<Ty,Tx> > >::iterator it=pm.find(cname); + + if(dir==out) + { + if(it==pm.end()) + { + std::cerr<<cname<<std::endl; + throw type_unregistered();; + } + else + { + opt_method<Ty,Tx>* result=it->second; + fo=result->clone(); + } + } + else if(dir==in) + { + //pm.insert(cname,fo->clone()); + pm[cname]=holder<opt_method<Ty,Tx> >(fo->clone()); + } + } + + template <typename Ty,typename Tx> + void register_opt_method(const opt_method<Ty,Tx>& fo) + { + opt_method<Ty,Tx>* pfo=const_cast<opt_method<Ty,Tx>*>(&fo); + fetch_opt_method(pfo,fo.get_type_name(),in); + } + + template <typename Ty,typename Tx> + opt_method<Ty,Tx>* get_opt_method(std::string cname) + { + opt_method<Ty,Tx>* pom; + fetch_opt_method(pom,cname,out); + return pom; + } + + template<typename Ty,typename Tx,typename Tp,typename Ts,typename Tstr> + void delete_clone(const statistic<Ty,Tx,Tp,Ts,Tstr>* pfo) + { + const_cast<statistic<Ty,Tx,Tp,Ts,Tstr>* >(pfo)->destroy(); + } + + + template<typename Ty,typename Tx,typename Tp,typename Ts,typename Tstr> + void fetch_statistic(statistic<Ty,Tx,Tp,Ts,Tstr>* &fo,std::string cname,fetch_direction dir) + { + static std::map<std::string,holder<statistic<Ty,Tx,Tp,Ts,Tstr> > > pm; + typename std::map<std::string, + holder<statistic<Ty,Tx,Tp,Ts,Tstr> > >::iterator it=pm.find(cname); + + if(dir==out) + { + if(it==pm.end()) + { + std::cerr<<cname<<std::endl; + throw type_unregistered();; + } + else + { + statistic<Ty,Tx,Tp,Ts,Tstr>* result=it->second; + fo=result->clone(); + } + } + else if(dir==in) + { + //pm.insert(cname,fo->clone()); + pm[cname]=holder<statistic<Ty,Tx,Tp,Ts,Tstr> >(fo->clone()); + } + } + + template<typename Ty,typename Tx,typename Tp,typename Ts,typename Tstr> + void register_statistic(const statistic<Ty,Tx,Tp,Ts,Tstr>& fo) + { + statistic<Ty,Tx,Tp,Ts,Tstr>* pfo=const_cast<statistic<Ty,Tx,Tp,Ts,Tstr>*>(&fo); + fetch_statistic(pfo,fo.get_type_name(),in); + } + + template<typename Ty,typename Tx,typename Tp,typename Ts,typename Tstr> + statistic<Ty,Tx,Tp,Ts,Tstr>* get_statistic(std::string cname) + { + statistic<Ty,Tx,Tp,Ts,Tstr>* pst; + fetch_statistic(pst,cname,out); + return pst; + } + + template <typename Ty,typename Tx,typename Tp,typename Tstr> + void delete_clone(const param_modifier<Ty,Tx,Tp,Tstr>* pfo) + { + const_cast<param_modifier<Ty,Tx,Tp,Tstr>* >(pfo)->destroy(); + } + + template <typename Ty,typename Tx,typename Tp,typename Tstr> + void fetch_param_modifier(param_modifier<Ty,Tx,Tp,Tstr>* &fo,std::string cname,fetch_direction dir) + { + static std::map<std::string,holder<param_modifier<Ty,Tx,Tp,Tstr> > > pm; + typename std::map<std::string, + holder<param_modifier<Ty,Tx,Tp,Tstr> > >::iterator it=pm.find(cname); + + if(dir==out) + { + if(it==pm.end()) + { + std::cerr<<cname<<std::endl; + throw type_unregistered(); + } + else + { + param_modifier<Ty,Tx,Tp,Tstr>* result=it->second; + fo=result->clone(); + } + } + else if(dir==in) + { + //pm.insert(cname,fo->clone()); + pm[cname]=holder<param_modifier<Ty,Tx,Tp,Tstr> >(fo->clone()); + } + } + + template<typename Ty,typename Tx,typename Tp,typename Tstr> + void register_param_modifier(const param_modifier<Ty,Tx,Tp,Tstr>& fo) + { + param_modifier<Ty,Tx,Tp,Tstr>* pfo=const_cast<param_modifier<Ty,Tx,Tp,Tstr>*>(&fo); + fetch_param_modifier(pfo,fo.get_type_name(),in); + } + + template<typename Ty,typename Tx,typename Tp,typename Tstr> + param_modifier<Ty,Tx,Tp,Tstr>* get_param_modifier(std::string cname) + { + param_modifier<Ty,Tx,Tp,Tstr>* ppm; + fetch_param_modifier(ppm,cname,out); + return ppm; + } + + + template <typename Ty,typename Tx> + void delete_clone(const data_set<Ty,Tx>* pfo) + { + const_cast<data_set<Ty,Tx>* >(pfo)->destroy(); + } + + template <typename Ty,typename Tx> + void fetch_data_set(data_set<Ty,Tx>* &fo,std::string cname,fetch_direction dir) + { + static std::map<std::string,holder<data_set<Ty,Tx> > > pm; + typename std::map<std::string, + holder<data_set<Ty,Tx> > >::iterator it=pm.find(cname); + + if(dir==out) + { + if(it==pm.end()) + { + std::cerr<<cname<<std::endl; + throw type_unregistered();; + } + else + { + data_set<Ty,Tx>* result=it->second; + fo=result->clone(); + } + } + else if(dir==in) + { + //pm.insert(cname,fo->clone()); + pm[cname]=holder<data_set<Ty,Tx> >(fo->clone()); + } + } + + template <typename Ty,typename Tx> + void register_data_set(const data_set<Ty,Tx>& fo) + { + data_set<Ty,Tx>* pfo=const_cast<data_set<Ty,Tx>*>(&fo); + fetch_data_set(pfo,fo.get_type_name(),in); + } + + template<typename Ty,typename Tx> + data_set<Ty,Tx>* get_data_set(std::string cname) + { + data_set<Ty,Tx>* pds; + fetch_data_set(pds,cname,out); + return pds; + } + + + + //////////////////// + template <typename Ty,typename Tx,typename Tp,typename Tstr> + void delete_clone(const model<Ty,Tx,Tp,Tstr>* pfo) + { + const_cast<model<Ty,Tx,Tp,Tstr>* >(pfo)->destroy(); + } + + + template <typename Ty,typename Tx,typename Tp,typename Tstr> + void fetch_model(model<Ty,Tx,Tp,Tstr>* &fo,std::string cname,fetch_direction dir) + { + static std::map<std::string,holder<model<Ty,Tx,Tp,Tstr> > > pm; + typename std::map<std::string, + holder<model<Ty,Tx,Tp,Tstr> > >::iterator it=pm.find(cname); + + if(dir==out) + { + if(it==pm.end()) + { + std::cerr<<cname<<std::endl; + throw type_unregistered(); + } + else + { + model<Ty,Tx,Tp,Tstr>* result=it->second; + fo=result->clone(); + } + } + else if(dir==in) + { + pm[cname]= holder<model<Ty,Tx,Tp,Tstr> >(fo->clone()); + } + } + + template <typename Ty,typename Tx,typename Tp,typename Tstr> + void register_model(const model<Ty,Tx,Tp,Tstr>& fo) + { + model<Ty,Tx,Tp,Tstr>* pfo=const_cast<model<Ty,Tx,Tp,Tstr>*>(&fo); + fetch_model(pfo,fo.get_type_name(),in); + } + + template <typename Ty,typename Tx,typename Tp,typename Tstr> + model<Ty,Tx,Tp,Tstr>* get_model(std::string cname) + { + model<Ty,Tx,Tp,Tstr>* pds; + fetch_model(pds,cname,out); + return pds; + } + +} + + +#endif |