diff options
author | astrojhgu <astrojhgu@ed2142bd-67ad-457f-ba7c-d818d4011675> | 2009-10-19 16:57:14 +0000 |
---|---|---|
committer | astrojhgu <astrojhgu@ed2142bd-67ad-457f-ba7c-d818d4011675> | 2009-10-19 16:57:14 +0000 |
commit | 056181160ce510e5409886fd7b8884480ae30a27 (patch) | |
tree | 72f40838ec5a3488988f25301e05e0ab78b669cc /models/dl_model.hpp | |
parent | a0d3b74adcc29c22d70da971621dd301727eb695 (diff) | |
download | opt-utilities-056181160ce510e5409886fd7b8884480ae30a27.tar.bz2 |
git-svn-id: file:///home/svn/opt_utilities@82 ed2142bd-67ad-457f-ba7c-d818d4011675
Diffstat (limited to 'models/dl_model.hpp')
-rw-r--r-- | models/dl_model.hpp | 181 |
1 files changed, 21 insertions, 160 deletions
diff --git a/models/dl_model.hpp b/models/dl_model.hpp index 7221fd1..9729335 100644 --- a/models/dl_model.hpp +++ b/models/dl_model.hpp @@ -12,169 +12,30 @@ namespace opt_utilities { + template <typename T> - class dl_model - :public model<T,T,std::vector<T>,std::string> + model<T,T,std::vector<T>,std::string>* load_model(const char* fname) { - private: - T (*calc_model)(T x,const T* p); - int nparams; - mutable void* handle; - private: - model<T,T,std::vector<T> >* do_clone()const - { - dl_model<T>* result=new dl_model<T>(*this); - this->handle=NULL; - return result; - } + void* handle; - const char* do_get_type_name()const - { - return "shared object wrapping model"; - } - - // public: - public: - dl_model() - :handle(NULL) - {} - - - public: - dl_model(const char* file_name) - :handle(NULL) - { - - handle=dlopen(file_name,RTLD_LAZY); - - if(!handle) - { - throw opt_exception("faild loading object"); - } - - calc_model=(T (*)(T,const T*))dlsym(handle,"calc_model"); - - if(!calc_model) - { - throw opt_exception("symble undefined"); - } - - const char* (*get_param_name)(int) - =(const char* (*)(int))dlsym(handle,"get_param_name"); - - if(!get_param_name) - { - throw opt_exception("symble undefined"); - } - - int (*get_num_params)() - =(int (*)())dlsym(handle,"get_num_params"); - - if(!get_num_params) - { - throw opt_exception("symble undefined"); - if(!get_num_params) - { - throw opt_exception("symble undefined"); - } } - - T (*get_default_value)(int) - =(T (*)(int))dlsym(handle,"get_default_value"); - - if(!get_default_value) - { - throw opt_exception("symble undefined"); - } - - nparams=get_num_params(); - - for(int i=0;i!=nparams;++i) - { - this->push_param_info(param_info<std::vector<T> >(get_param_name(i), - get_default_value(i))); - } - } - - ~dl_model() - { - if(handle) - { - dlclose(handle); - } - } - - void bind(const char* file_name) - { - if(handle) - { - dlclose(handle); - } - this->clear_param_info(); - handle=dlopen(file_name,RTLD_LAZY); - - if(!handle) - { - throw opt_exception("faild loading object"); - } - - calc_model=(T (*)(T,const T*))dlsym(handle,"calc_model"); - - if(!calc_model) - { - throw opt_exception("symble undefined"); - } - - const char* (*get_param_name)(int) - =(const char* (*)(int))dlsym(handle,"get_param_name"); - - if(!get_param_name) - { - throw opt_exception("symble undefined"); - } - - - int (*get_num_params)() - =(int (*)())dlsym(handle,"get_num_params"); - - if(!get_num_params) - { - throw opt_exception("symble undefined"); - } - - - T (*get_default_value)(int) - =(T (*)(int))dlsym(handle,"get_default_value"); - - - if(!get_default_value) - { - throw opt_exception("symble undefined"); - } - - - nparams=get_num_params(); - for(int i=0;i!=nparams;++i) - { - this->push_param_info(param_info<std::vector<T> >(get_param_name(i), - get_default_value(i))); - } - } - - T do_eval(const T& x,const std::vector<T>& param) - { - if(handle==NULL) - { - throw opt_exception("dl object unloaded"); - } - return calc_model(x,&get_element(param,0)); - } - - std::string do_to_string()const - { - return "Dynamical load model\n" - "Should be loaded from an shared object file\n"; - } - }; + handle=dlopen(fname,RTLD_LAZY); + + if(!handle) + { + throw opt_exception("faild loading object"); + } + + + model<T,T,std::vector<T>,std::string>* (*func_create)(); + + func_create=(model<T,T,std::vector<T>,std::string>* (*)())dlsym(handle,"create_model_object"); + + if(!func_create) + { + throw opt_exception("symble undefined"); + } + return func_create(); + } } |