#include "merger.h" #include "arx.h" namespace bdm{ vec merger::lognorm_merge ( mat &lW ) { int nu=lW.rows(); vec mu = sum ( lW ) /nu; //mean of logs // vec lam = sum ( pow ( lW,2 ) )-nu*pow ( mu,2 ); ======= numerically unsafe! vec lam = sum ( pow ( lW-outer_product ( ones ( lW.rows() ),mu ),2 ) ); double coef=0.0; vec sq2bl=sqrt ( 2*beta*lam ); //this term is everywhere switch ( nu ) { case 2: coef= ( 1-0.5*sqrt ( ( 4.0*beta-3.0 ) /beta ) ); return coef*sq2bl + mu ; break; case 3://Ratio of Bessel coef = sqrt ( ( 3*beta-2 ) /3*beta ); return log ( besselk ( 0,sq2bl*coef ) ) - log ( besselk ( 0,sq2bl ) ) + mu; break; case 4: break; default: // Approximate conditional density break; } return vec ( 0 ); } void merger::merge ( const epdf* g0 ) { // it_file dbg ( "merger_debug.it" ); it_assert_debug ( rv.equal ( g0->_rv() ),"Incompatible g0" ); //Empirical density - samples eSmp.set_parameters ( ones ( Ns ), g0 ); Array &Smp = eSmp._samples(); //aux vec &w = eSmp._w(); //aux mat Smp_ex =ones ( dim +1,Ns ); // Extended samples for the ARX model - the last row is ones for ( int i=0;i must be deleted at the end!! // This will be active only later in iterations!!! if ( 1./sum_sqr ( w ) <0.5*Ns ) { // Generate new samples eSmp.set_samples ( Mpred ); for ( int i=0;imean(); // sprintf ( str,"Mpdf%d",niter ); // for ( int i=0;idimension() ==dim ) { // no need for conditioning or marginalization for ( int j=0;j => for cycle lw_src ( j ) =mpdfs ( i )->_epdf().evallog ( Smp ( j ) ); } } 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 } //Importance of the mixture for ( int j=0;j20 ); } delete Mpred; cout << endl; } }