/** \file kmm_component.hpp \brief rpresents a distribution composed of more than one kmm_components \author Junhua Gu */ #ifndef KMM_COMPONENT_MODEL_H_ #define KMM_COMPONENT_MODEL_H_ #define OPT_HEADER #include #include #include #include #include namespace opt_utilities { template class kmm_component :public model,optvec,optvec,std::string> { private: std::vector,optvec,optvec,std::string>*> components; std::vector weight_num; private: kmm_component* do_clone()const { return new kmm_component(*this); } const char* do_get_type_name()const { return "Multi-distribution"; } public: kmm_component() { //this->push_param_info(param_info >("x0",0)); //this->push_param_info(param_info >("sigma",1)); } kmm_component(const kmm_component& rhs) { for(int i=0;i=1) { add_component(*rhs.components[i],rhs.get_param_info(rhs.weight_num[i-1]).get_value()); } else { add_component(*rhs.components[i]); } } for(int i=0;idestroy(); } components.clear(); for(int i=0;idestroy(); } } public: void add_component(const model,optvec,optvec,std::string>& m,const T& w=0) { int morder=components.size(); components.push_back(m.clone()); std::ostringstream oss; oss<1) { param_info,std::string> p1(std::string("_w")+smorder,w); this->push_param_info(p1); weight_num.push_back(this->get_num_params()-1); } int np=m.get_num_params(); for(int i=0;i,std::string> p(m.get_param_info(i)); param_info,std::string> p1(p.get_name()+smorder,p.get_value()); this->push_param_info(p1); } } optvec convert_unit_sph(const optvec& p) { int ndim=p.size()+1; optvec result(ndim); result[0]=1; for(int i=0;i do_eval(const optvec& x,const optvec& param) { T result(0); optvec weight_angle; for(int i=0;i weight(convert_unit_sph(weight_angle)); int pnum=0; for(int i=0;i p(components[i]->get_num_params()); for(int j=0;jeval(x,p)[0]*weight[i]); ++pnum; } optvec result1(1); result1[0]=result;; return result1; } optvec eval_unsumed(const optvec& x,const optvec& param) { optvec weight_angle; for(int i=0;i weight(convert_unit_sph(weight_angle)); optvec result(components.size()); int pnum=0; for(int i=0;i p(components[i]->get_num_params()); for(int j=0;jeval(x,p)[0]*weight[i]); ++pnum; } return result; } private: std::string do_get_information()const { return ""; } }; } #endif //EOF