#include "merger.h" #include "../estim/arx.h" namespace bdm { vec merger_base::merge_points ( mat &lW ) { int nu=lW.rows(); vec result; ivec indW; bool infexist; switch ( METHOD ) { case ARITHMETIC: result= log ( sum ( exp ( lW ) ) ); //ugly! break; case GEOMETRIC: result= sum ( lW ) /nu; break; case LOGNORMAL: vec sumlW=sum ( lW ) ; indW=find((sumlW-inf)); infexist=(indW.size() &Smp = eSmp._samples(); //aux vec &w = eSmp._w(); //aux mat Smp_ex =ones ( dim +1,Npoints ); // Extended samples for the ARX model - the last row is ones for ( int i=0;i must be deleted at the end!! Mpred->set_rv ( rv ); //the predictor predicts rv of this merger // This will be active only later in iterations!!! if ( 1./sum_sqr ( w ) evallog ( Smp ( i ) ); } if ( DBG ) { cout<<"Resampling =" << 1./sum_sqr ( w ) << endl; cout << Mix._e()->mean() <mean(); sprintf ( dbg_str,"Mpred_var%d",niter ); *dbg_file << Name ( dbg_str ) << Mpred->variance(); sprintf ( dbg_str,"Mpdf%d",niter ); for ( int i=0;idimension() ==dim ) { // no need for conditioning or marginalization lw_src = mpdfs ( i )->_epdf().evallog_m ( Smp ); } else { // compute likelihood of marginal on the conditional variable if ( mpdfs ( i )->dimensionc() >0 ) { // Make marginal on rvc_i epdf* tmp_marg = Mpred->marginal ( mpdfs ( i )->_rvc() ); //compute vector of lw_src for ( int k=0;k calling dls->get_cond lw_src ( k ) += tmp_marg->evallog ( dls ( i )->get_cond ( Smp ( k ) ) ); } delete tmp_marg; // sprintf ( str,"marg%d",niter ); // *dbg << Name ( str ) << lw_src; } // Compute likelihood of the missing variable if ( dim > ( mpdfs ( i )->dimension() + mpdfs ( i )->dimensionc() ) ) { /////////////// // There are variales unknown to mpdfs(i) : rvzs mpdf* tmp_cond = Mpred->condition ( rvzs ( i ) ); // Compute likelihood vec lw_dbg=lw_src; for ( int k= 0; kevallogcond ( zdls ( i )->pushdown ( Smp ( k ) ), zdls ( i )->get_cond ( Smp ( k ) ) ) ); if ( !std::isfinite ( lw_src ( k ) ) ) { lw_src ( k ) = -1e16; cout << "!"; } } delete tmp_cond; } // Compute likelihood of the partial source for ( int k= 0; kcondition ( dls ( i )->get_cond ( Smp ( k ) ) ); lw_src ( k ) += mpdfs ( i )->_epdf().evallog ( dls ( i )->pushdown ( Smp ( k ) ) ); } } // it_assert_debug(std::isfinite(sum(lw_src)),"bad"); lW.set_row ( i, lw_src ); // do not divide by mix } lw = merger_base::merge_points ( lW ); //merge //Importance weighting lw -= lw_mix; // hoping that it is not numerically sensitive... w = exp ( lw-max ( lw ) ); //renormalize double sumw =sum ( w ); if ( std::isfinite ( sumw ) ) { w = w/sumw; } else { it_file itf ( "merg_err.it" ); itf << Name ( "w" ) << w; } if ( DBG ) { sprintf ( dbg_str,"lW%d",niter ); *dbg_file << Name ( dbg_str ) << lW; sprintf ( dbg_str,"w%d",niter ); *dbg_file << Name ( dbg_str ) << w; sprintf ( dbg_str,"lw_m%d",niter ); *dbg_file << Name ( dbg_str ) << lw_mix; } // ==== stopping rule === niter++; converged = ( niter>stop_niter ); } delete Mpred; // cout << endl; } // DEFAULTS FOR MERGER_BASE const MERGER_METHOD merger_base::DFLT_METHOD=LOGNORMAL; const double merger_base::DFLT_beta=1.2; // DEFAULTS FOR MERGER_MIX const int merger_mix::DFLT_Ncoms=10; const double merger_mix::DFLT_effss_coef=0.5; }