00001
00013 #ifndef MER_H
00014 #define MER_H
00015
00016
00017 #include "mixef.h"
00018
00019 namespace bdm{
00020 using std::string;
00021
00028 class merger : public compositepdf, public epdf {
00029 protected:
00031 MixEF Mix;
00033 Array<datalink_m2e*> dls;
00035 Array<RV> rvzs;
00037 Array<datalink_m2e*> zdls;
00038
00040 int Ns;
00042 int Nc;
00044 double beta;
00046 eEmp eSmp;
00047
00048 public:
00050 merger ( const Array<mpdf*> &S ) :
00051 compositepdf ( S ), epdf ( getrv ( false ) ),
00052 Mix ( Array<BMEF*> ( 0 ),vec ( 0 ) ), dls ( n ), rvzs ( n ), zdls ( n ), eSmp(rv,0) {
00053 RV ztmp;
00054
00055 RV rvc; setrvc ( rv,rvc );
00056 rv.add ( rvc );
00057 for ( int i=0;i<n;i++ ) {
00058
00059 dls ( i ) = new datalink_m2e ( mpdfs ( i )->_rv(), mpdfs ( i )->_rvc(), rv );
00060
00061 ztmp= mpdfs ( i )->_rv();
00062 ztmp.add ( mpdfs ( i )->_rvc() );
00063 rvzs ( i ) =rv.subt ( ztmp );
00064 zdls ( i ) = new datalink_m2e ( rvzs ( i ), ztmp, rv ) ;
00065 };
00066
00067 beta=2.0;
00068 Ns=100;
00069 Nc=10;
00070 Mix.set_method ( EM );
00071 }
00073 void set_parameters ( double beta0, int Ns0, int Nc0 ) {beta=beta0;Ns=Ns0;Nc=Nc0;eSmp.set_n(Ns0,false);}
00075 void init() {
00076 Array<vec> Smps ( n );
00077
00078 for ( int i=0;i<n;i++ ) {Smps ( i ) =zeros ( 0 );}
00079 }
00081 void merge ( const epdf* g0 );
00083 void merge () {merge ( & ( Mix._epdf() ) );};
00084
00086 vec lognorm_merge ( mat &lW );
00089 vec sample ( ) const { return Mix._epdf().sample();}
00090 double evallog ( const vec &dt ) const {
00091 vec dtf=ones ( dt.length() +1 );
00092 dtf.set_subvector ( 0,dt );
00093 return Mix.logpred ( dtf );
00094 }
00095 vec mean() const {
00096 const Vec<double> &w = eSmp._w();
00097 const Array<vec> &S = eSmp._samples();
00098 vec tmp=zeros ( rv.count() );
00099 for ( int i=0; i<Ns; i++ ) {
00100 tmp+=w ( i ) *S ( i );
00101 }
00102 return tmp;
00103 }
00104 mat covariance() const {
00105 const vec &w = eSmp._w();
00106 const Array<vec> &S = eSmp._samples();
00107
00108 vec mea = mean();
00109
00110 cout << sum(w) << "," << w*w <<endl;
00111
00112 mat Tmp=zeros(rv.count(), rv.count());
00113 for ( int i=0; i<Ns; i++ ) {
00114 Tmp+=w ( i ) *outer_product(S ( i ), S(i));
00115 }
00116 return Tmp-outer_product(mea,mea);
00117 }
00118 vec variance() const {
00119 const vec &w = eSmp._w();
00120 const Array<vec> &S = eSmp._samples();
00121
00122 vec tmp=zeros(rv.count());
00123 for ( int i=0; i<Ns; i++ ) {
00124 tmp+=w ( i ) *pow(S ( i ),2);
00125 }
00126 return tmp-pow(mean(),2);
00127 }
00129 virtual ~merger() {
00130 for ( int i=0; i<n; i++ ) {
00131 delete dls ( i );
00132 delete zdls ( i );
00133 }
00134 };
00135
00137 MixEF& _Mix() {return Mix;}
00139 eEmp& _Smp() {return eSmp;}
00140 };
00141
00142 }
00143
00144 #endif // MER_H