00001
00013 #ifndef MX_H
00014 #define MX_H
00015
00016 #include "libBM.h"
00017 #include "libEF.h"
00018
00019
00020 using namespace itpp;
00021
00032 class emix : public epdf {
00033 protected:
00035 vec w;
00037 Array<epdf*> Coms;
00038 public:
00040 emix ( RV &rv ) : epdf ( rv ) {};
00042 void set_parameters ( const vec &w, const Array<epdf*> &Coms );
00043
00044 vec sample() const;
00045 vec mean() const {
00046 int i; vec mu=zeros ( rv.count() );
00047 for ( i=0;i<w.length();i++ ) {mu+=w ( i ) *Coms ( i )->mean(); }
00048 return mu;
00049 }
00050 double evalpdflog ( const vec &val ) const {
00051 int i;
00052 double sum=0.0;
00053 for ( i=0;i<w.length();i++ ) {sum+=w ( i ) *Coms ( i )->evalpdflog ( val );}
00054 return log ( sum );
00055 };
00056
00057
00059 vec& _w() {return w;}
00060 };
00061
00066 class eprod: public epdf {
00067 protected:
00068 Array<epdf*> epdfs;
00069 Array<mpdf*> mpdfs;
00070 public:
00071
00072
00073 };
00074
00078 class mmix : public mpdf {
00079 protected:
00081 Array<mpdf*> Coms;
00083 emix Epdf;
00084 public:
00086 mmix ( RV &rv, RV &rvc ) : mpdf ( rv, rvc ), Epdf ( rv ) {ep=&Epdf;};
00088 void set_parameters ( const vec &w, const Array<mpdf*> &Coms ) {
00089 Array<epdf*> Eps ( Coms.length());
00090
00091 for ( int i=0;i<Coms.length();i++ ) {mpdf* Ci=Coms(i);
00092 Eps ( i ) =& ( Coms ( i )->_epdf() );}
00093 Epdf.set_parameters ( w,Eps );
00094 };
00095
00096 void condition ( const vec &cond ) {
00097 for ( int i=0;i<Coms.length();i++ ) {Coms ( i )->condition ( cond );}
00098 };
00099 };
00100 #endif //MX_H