aboutsummaryrefslogtreecommitdiffstats
path: root/distributions/kmm_component.hpp
diff options
context:
space:
mode:
authorastrojhgu <astrojhgu@ed2142bd-67ad-457f-ba7c-d818d4011675>2011-05-14 16:24:05 +0000
committerastrojhgu <astrojhgu@ed2142bd-67ad-457f-ba7c-d818d4011675>2011-05-14 16:24:05 +0000
commit20c287b91345e348cc00b8a0da53ff967be0cac9 (patch)
treebb7e94af454869e9d17dc133862bb35a564c76b3 /distributions/kmm_component.hpp
parent8478361c99b641f8a060578db49626e21aa6e1d3 (diff)
downloadopt-utilities-20c287b91345e348cc00b8a0da53ff967be0cac9.tar.bz2
git-svn-id: file:///home/svn/opt_utilities@197 ed2142bd-67ad-457f-ba7c-d818d4011675
Diffstat (limited to 'distributions/kmm_component.hpp')
-rw-r--r--distributions/kmm_component.hpp205
1 files changed, 205 insertions, 0 deletions
diff --git a/distributions/kmm_component.hpp b/distributions/kmm_component.hpp
new file mode 100644
index 0000000..0e77508
--- /dev/null
+++ b/distributions/kmm_component.hpp
@@ -0,0 +1,205 @@
+/**
+ \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 <core/fitter.hpp>
+#include <cmath>
+#include <misc/optvec.hpp>
+#include <sstream>
+#include <iostream>
+
+
+
+namespace opt_utilities
+{
+ template <typename T>
+ class kmm_component
+ :public model<optvec<T>,optvec<T>,optvec<T>,std::string>
+ {
+ private:
+ std::vector<model<optvec<T>,optvec<T>,optvec<T>,std::string>*> components;
+ std::vector<int> weight_num;
+ private:
+ kmm_component* do_clone()const
+ {
+ return new kmm_component<T>(*this);
+ }
+
+ const char* do_get_type_name()const
+ {
+ return "Multi-distribution";
+ }
+ public:
+ kmm_component()
+ {
+ //this->push_param_info(param_info<optvec<T> >("x0",0));
+ //this->push_param_info(param_info<optvec<T> >("sigma",1));
+ }
+
+ kmm_component(const kmm_component& rhs)
+ {
+ for(int i=0;i<rhs.components.size();++i)
+ {
+ if(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;i<rhs.get_num_params();++i)
+ {
+ set_param_info(rhs.get_param_info(i));
+ }
+
+ }
+
+ kmm_component& operator=(const kmm_component& rhs)
+ {
+ if(this==&rhs)
+ {
+ return rhs;
+ }
+ for(int i=0;i<components.size();++i)
+ {
+ components[i]->destroy();
+ }
+ components.clear();
+ for(int i=0;i<rhs.components.size();++i)
+ {
+ add_component(*rhs.components[i]);
+ }
+ for(int i=0;i<rhs.get_num_params();++i)
+ {
+ set_param_info(rhs.get_param_info(i));
+ }
+
+ }
+
+ ~kmm_component()
+ {
+ for(int i=0;i<components.size();++i)
+ {
+ components[i]->destroy();
+ }
+ }
+
+
+ public:
+ void add_component(const model<optvec<T>,optvec<T>,optvec<T>,std::string>& m,const T& w=0)
+ {
+ int morder=components.size();
+ components.push_back(m.clone());
+ std::ostringstream oss;
+ oss<<morder;
+ std::string smorder=oss.str();
+ if(components.size()>1)
+ {
+ param_info<optvec<T>,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<np;++i)
+ {
+ param_info<optvec<T>,std::string> p(m.get_param_info(i));
+ param_info<optvec<T>,std::string> p1(p.get_name()+smorder,p.get_value());
+ this->push_param_info(p1);
+ }
+ }
+
+ optvec<T> convert_unit_sph(const optvec<T>& p)
+ {
+ int ndim=p.size()+1;
+ optvec<double> result(ndim);
+ result[0]=1;
+ for(int i=0;i<p.size();++i)
+ {
+ for(int j=0;j<=i;++j)
+ {
+ result[j]*=cos(p[i]);
+ }
+ result[i+1]=sin(p[i]);
+ }
+ for(int i=0;i<result.size();++i)
+ {
+ result[i]=result[i]*result[i];
+ }
+ return result;
+ }
+
+
+ optvec<T> do_eval(const optvec<T>& x,const optvec<T>& param)
+ {
+ T result(0);
+ optvec<T> weight_angle;
+ for(int i=0;i<weight_num.size();++i)
+ {
+ weight_angle.push_back(param[weight_num[i]]);
+ }
+ optvec<T> weight(convert_unit_sph(weight_angle));
+
+ int pnum=0;
+ for(int i=0;i<components.size();++i)
+ {
+ T temp_result=0;
+ optvec<T> p(components[i]->get_num_params());
+ for(int j=0;j<p.size();++j)
+ {
+ p[j]=param[pnum++];
+ }
+ result+=(components[i]->eval(x,p)[0]*weight[i]);
+ ++pnum;
+ }
+ optvec<T> result1(1);
+ result1[0]=result;;
+ return result1;
+ }
+
+ optvec<T> eval_unsumed(const optvec<T>& x,const optvec<T>& param)
+ {
+ optvec<T> weight_angle;
+ for(int i=0;i<weight_num.size();++i)
+ {
+ weight_angle.push_back(param[weight_num[i]]);
+ }
+ optvec<T> weight(convert_unit_sph(weight_angle));
+ optvec<T> result(components.size());
+ int pnum=0;
+ for(int i=0;i<components.size();++i)
+ {
+ T temp_result=0;
+ optvec<T> p(components[i]->get_num_params());
+ for(int j=0;j<p.size();++j)
+ {
+ p[j]=param[pnum++];
+ }
+ result[i]=(components[i]->eval(x,p)[0]*weight[i]);
+ ++pnum;
+ }
+
+ return result;
+ }
+
+
+
+ private:
+ std::string do_get_information()const
+ {
+ return "";
+ }
+ };
+}
+
+
+
+#endif
+//EOF