00001
00013 #ifndef MER_H
00014 #define MER_H
00015
00016
00017 #include "mixef.h"
00018
00019 namespace bdm
00020 {
00021 using std::string;
00022
00029 class merger : public compositepdf, public epdf
00030 {
00031 protected:
00033 MixEF Mix;
00035 Array<datalink_m2e*> dls;
00037 Array<RV> rvzs;
00039 Array<datalink_m2e*> zdls;
00040
00042 int Ns;
00044 int Nc;
00046 double beta;
00048 eEmp eSmp;
00050 double effss_coef;
00051
00053 bool DBG;
00055 it_file* dbg;
00057 bool fix_smp;
00058 public:
00060 merger ( const Array<mpdf*> &S ) :
00061 compositepdf ( S ), epdf ( ),
00062 Mix ( Array<BMEF*> ( 0 ),vec ( 0 ) ), dls ( n ), rvzs ( n ), zdls ( n ), eSmp()
00063 {
00064 RV ztmp;
00065 rv = getrv ( false );
00066 RV rvc; setrvc ( rv,rvc );
00067 rv.add ( rvc );
00068
00069 dim = rv._dsize();
00070
00071 for ( int i=0;i<n;i++ )
00072 {
00073
00074 dls ( i ) = new datalink_m2e;dls ( i )->set_connection ( mpdfs ( i )->_rv(), mpdfs ( i )->_rvc(), rv );
00075
00076 ztmp= mpdfs ( i )->_rv();
00077 ztmp.add ( mpdfs ( i )->_rvc() );
00078 rvzs ( i ) =rv.subt ( ztmp );
00079 zdls ( i ) = new datalink_m2e; zdls ( i )->set_connection ( rvzs ( i ), ztmp, rv ) ;
00080 };
00081
00082 beta=2.0;
00083 Ns=100;
00084 Nc=10;
00085 Mix.set_method ( EM );
00086 DBG = false;
00087 fix_smp = false;
00088 }
00090 void debug_file ( const string fname ) { if ( DBG ) delete dbg; dbg = new it_file ( fname ); if ( dbg ) DBG=true;}
00092 void set_parameters ( double beta0, int Ns0, int Nc0, double effss_coef0=0.5 ) {beta=beta0;
00093 Ns=Ns0;
00094 Nc=Nc0;
00095 effss_coef=effss_coef0;
00096 eSmp.set_parameters ( Ns0,false );
00097 }
00098 void set_grid ( Array<vec> &XYZ )
00099 {
00100 int dim=XYZ.length(); ivec szs ( dim );
00101 for(int i=0; i<dim;i++){szs=XYZ(i).length();}
00102 Ns=prod(szs);
00103 eSmp.set_parameters(Ns,false);
00104 Array<vec> &samples=eSmp._samples();
00105 eSmp._w()=ones(Ns)/Ns;
00106
00107
00108 ivec is=zeros_i(dim);
00109 vec smpi(dim);
00110 for(int i=0; i<Ns; i++){
00111 for(int j=0; j<dim; j++){smpi(j)=XYZ(j)(is(j)); }
00112 samples(i)=smpi;
00113
00114 for (int j=0;j<dim;j++){
00115 if (is(j)==szs(j)-1) {
00116 is(j)=0;
00117 is(j+1)++;
00118 if (is(j+1)<szs(j+1)-1) break;
00119 } else {
00120 is(j)++; break;
00121 }
00122 }
00123 }
00124
00125 fix_smp = true;
00126 }
00128 void init()
00129 {
00130 Array<vec> Smps ( n );
00131
00132 for ( int i=0;i<n;i++ ) {Smps ( i ) =zeros ( 0 );}
00133 }
00135 void merge ( const epdf* g0 );
00137 void merge () {merge ( & ( Mix.posterior() ) );};
00138
00140 vec lognorm_merge ( mat &lW );
00143 vec sample ( ) const { return Mix.posterior().sample();}
00144 double evallog ( const vec &dt ) const
00145 {
00146 vec dtf=ones ( dt.length() +1 );
00147 dtf.set_subvector ( 0,dt );
00148 return Mix.logpred ( dtf );
00149 }
00150 vec mean() const
00151 {
00152 const Vec<double> &w = eSmp._w();
00153 const Array<vec> &S = eSmp._samples();
00154 vec tmp=zeros ( dim );
00155 for ( int i=0; i<Ns; i++ )
00156 {
00157 tmp+=w ( i ) *S ( i );
00158 }
00159 return tmp;
00160 }
00161 mat covariance() const
00162 {
00163 const vec &w = eSmp._w();
00164 const Array<vec> &S = eSmp._samples();
00165
00166 vec mea = mean();
00167
00168 cout << sum ( w ) << "," << w*w <<endl;
00169
00170 mat Tmp=zeros ( dim, dim );
00171 for ( int i=0; i<Ns; i++ )
00172 {
00173 Tmp+=w ( i ) *outer_product ( S ( i ), S ( i ) );
00174 }
00175 return Tmp-outer_product ( mea,mea );
00176 }
00177 vec variance() const
00178 {
00179 const vec &w = eSmp._w();
00180 const Array<vec> &S = eSmp._samples();
00181
00182 vec tmp=zeros ( dim );
00183 for ( int i=0; i<Ns; i++ )
00184 {
00185 tmp+=w ( i ) *pow ( S ( i ),2 );
00186 }
00187 return tmp-pow ( mean(),2 );
00188 }
00190 virtual ~merger()
00191 {
00192 for ( int i=0; i<n; i++ )
00193 {
00194 delete dls ( i );
00195 delete zdls ( i );
00196 }
00197 if ( DBG ) delete dbg;
00198 };
00199
00201 MixEF& _Mix() {return Mix;}
00203 emix* proposal() {emix* tmp=Mix.epredictor(); tmp->set_rv(rv); return tmp;}
00205 eEmp& _Smp() {return eSmp;}
00206 };
00207
00208 }
00209
00210 #endif // MER_H