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