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 ( ),
00052 Mix ( Array<BMEF*> ( 0 ),vec ( 0 ) ), dls ( n ), rvzs ( n ), zdls ( n ), eSmp() {
00053 RV ztmp;
00054 rv = getrv(false);
00055 dim = rv._dsize();
00056
00057 RV rvc; setrvc ( rv,rvc );
00058 rv.add ( rvc );
00059 for ( int i=0;i<n;i++ ) {
00060
00061 dls ( i ) = new datalink_m2e;dls(i)->set_connection( mpdfs ( i )->_rv(), mpdfs ( i )->_rvc(), rv );
00062
00063 ztmp= mpdfs ( i )->_rv();
00064 ztmp.add ( mpdfs ( i )->_rvc() );
00065 rvzs ( i ) =rv.subt ( ztmp );
00066 zdls ( i ) = new datalink_m2e; zdls(i)->set_connection ( rvzs ( i ), ztmp, rv ) ;
00067 };
00068
00069 beta=2.0;
00070 Ns=100;
00071 Nc=10;
00072 Mix.set_method ( EM );
00073 }
00075 void set_parameters ( double beta0, int Ns0, int Nc0 ) {beta=beta0;Ns=Ns0;Nc=Nc0;eSmp.set_parameters(Ns0,false);}
00077 void init() {
00078 Array<vec> Smps ( n );
00079
00080 for ( int i=0;i<n;i++ ) {Smps ( i ) =zeros ( 0 );}
00081 }
00083 void merge ( const epdf* g0 );
00085 void merge () {merge ( & ( Mix.posterior() ) );};
00086
00088 vec lognorm_merge ( mat &lW );
00091 vec sample ( ) const { return Mix.posterior().sample();}
00092 double evallog ( const vec &dt ) const {
00093 vec dtf=ones ( dt.length() +1 );
00094 dtf.set_subvector ( 0,dt );
00095 return Mix.logpred ( dtf );
00096 }
00097 vec mean() const {
00098 const Vec<double> &w = eSmp._w();
00099 const Array<vec> &S = eSmp._samples();
00100 vec tmp=zeros ( dim);
00101 for ( int i=0; i<Ns; i++ ) {
00102 tmp+=w ( i ) *S ( i );
00103 }
00104 return tmp;
00105 }
00106 mat covariance() const {
00107 const vec &w = eSmp._w();
00108 const Array<vec> &S = eSmp._samples();
00109
00110 vec mea = mean();
00111
00112 cout << sum(w) << "," << w*w <<endl;
00113
00114 mat Tmp=zeros(dim, dim);
00115 for ( int i=0; i<Ns; i++ ) {
00116 Tmp+=w ( i ) *outer_product(S ( i ), S(i));
00117 }
00118 return Tmp-outer_product(mea,mea);
00119 }
00120 vec variance() const {
00121 const vec &w = eSmp._w();
00122 const Array<vec> &S = eSmp._samples();
00123
00124 vec tmp=zeros(dim);
00125 for ( int i=0; i<Ns; i++ ) {
00126 tmp+=w ( i ) *pow(S ( i ),2);
00127 }
00128 return tmp-pow(mean(),2);
00129 }
00131 virtual ~merger() {
00132 for ( int i=0; i<n; i++ ) {
00133 delete dls ( i );
00134 delete zdls ( i );
00135 }
00136 };
00137
00139 MixEF& _Mix() {return Mix;}
00141 eEmp& _Smp() {return eSmp;}
00142 };
00143
00144 }
00145
00146 #endif // MER_H