diff options
Diffstat (limited to 'models')
-rw-r--r-- | models/dl_model.hpp | 181 | ||||
-rw-r--r-- | models/models.cc | 3 |
2 files changed, 21 insertions, 163 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(); + } } diff --git a/models/models.cc b/models/models.cc index 8a63037..e1c6d34 100644 --- a/models/models.cc +++ b/models/models.cc @@ -108,9 +108,6 @@ model<double,vecn<double,2>,std::vector<double>,std::string>& get_2dmodel_by_nam model_map["poly1d3"]=new poly1d<double,3>; model_map["poly1d4"]=new poly1d<double,4>; model_map["poly1d5"]=new poly1d<double,5>; -#ifdef __linux__ - model_map["dlmodel"]=new dl_model<double>; -#endif //DECL_POLY(7) } |