Changeset 1079 for library/bdm/stat/merger.cpp
- Timestamp:
- 06/10/10 21:54:57 (14 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
library/bdm/stat/merger.cpp
r1068 r1079 5 5 namespace bdm { 6 6 7 merger_base::merger_base ( const Array<shared_ptr<pdf> > &S ) :7 MergerDiscrete::MergerDiscrete ( const Array<shared_ptr<pdf> > &S ) : 8 8 Npoints ( 0 ), DBG ( false ), dbg_file ( 0 ) { 9 9 set_sources ( S ); … … 11 11 12 12 13 void merger_base::set_sources ( const Array<shared_ptr<pdf> > &Sources ) {14 p dfs =Sources;15 Nsources = p dfs.length();13 void MergerDiscrete::set_sources ( const Array<shared_ptr<pdf> > &PartSources ) { 14 part_sources = PartSources; 15 Nsources = part_sources.length(); 16 16 //set sizes 17 dls.set_size ( Sources.length() ); 18 rvzs.set_size ( Sources.length() ); 19 zdls.set_size ( Sources.length() ); 20 21 rv = get_composite_rv ( pdfs, /* checkoverlap = */ false ); 17 sources.set_size ( Nsources); 18 dls.set_size ( Nsources ); 19 rvzs.set_size ( Nsources ); 20 zdls.set_size ( Nsources ); 21 22 RV rv = get_composite_rv ( part_sources, /* checkoverlap = */ false ); 22 23 23 24 RV rvc; 24 25 // Extend rv by rvc! 25 for ( int i = 0; i < pdfs.length(); i++ ) {26 RV rvx = p dfs ( i )->_rvc().subt ( rv );26 for ( int i = 0; i < sources.length(); i++ ) { 27 RV rvx = part_sources ( i )->_rvc().subt ( rv ); 27 28 rvc.add ( rvx ); // add rv to common rvc 28 29 } … … 30 31 // join rv and rvc - see descriprion 31 32 rv.add ( rvc ); 32 // get dimension 33 dim = rv._dsize(); 34 33 35 34 // create links between sources and common rv 36 35 RV xytmp; 37 for ( int i = 0; i < p dfs.length(); i++ ) {36 for ( int i = 0; i < part_sources.length(); i++ ) { 38 37 //Establich connection between pdfs and merger 39 38 dls ( i ) = new datalink_m2e; 40 dls ( i )->set_connection ( pdfs ( i )->_rv(), pdfs( i )->_rvc(), rv );39 dls ( i )->set_connection ( part_sources ( i )->_rv(), part_sources( i )->_rvc(), rv ); 41 40 42 41 // find out what is missing in each pdf 43 xytmp = p dfs ( i )->_rv();44 xytmp.add ( pdfs ( i )->_rvc() );42 xytmp = part_sources ( i )->_rv(); 43 xytmp.add ( part_sources ( i )->_rvc() ); 45 44 // z_i = common_rv-xy 46 45 rvzs ( i ) = rv.subt ( xytmp ); … … 49 48 zdls ( i )->set_connection ( rvzs ( i ), xytmp, rv ) ; 50 49 }; 51 } 52 53 void merger_base::set_support ( rectangular_support &Sup ) { 50 51 // 52 merger().set_rv(rv); 53 } 54 55 void MergerDiscrete::set_support ( rectangular_support &Sup ) { 54 56 Npoints = Sup.points(); 55 57 eSmp.set_parameters ( Npoints, false ); … … 61 63 samples ( j ) = Sup.next_vec(); 62 64 } 63 } 64 65 void merger_base::merge () { 65 eSmp.validate(); 66 } 67 68 void MergerDiscrete::merge () { 66 69 validate(); 67 70 68 71 //check if sources overlap: 69 72 bool OK = true; 70 for ( int i = 0; i < p dfs.length(); i++ ) {73 for ( int i = 0; i < part_sources.length(); i++ ) { 71 74 OK &= ( rvzs ( i )._dsize() == 0 ); // z_i is empty 72 OK &= ( p dfs ( i )->_rvc()._dsize() == 0 ); // y_i is empty75 OK &= ( part_sources ( i )->_rvc()._dsize() == 0 ); // y_i is empty 73 76 } 74 77 75 78 if ( OK ) { 76 mat lW = zeros ( p dfs.length(), eSmp._w().length() );79 mat lW = zeros ( part_sources.length(), eSmp._w().length() ); 77 80 78 81 vec emptyvec ( 0 ); 79 for ( int i = 0; i < p dfs.length(); i++ ) {82 for ( int i = 0; i < part_sources.length(); i++ ) { 80 83 for ( int j = 0; j < eSmp._w().length(); j++ ) { 81 lW ( i, j ) = p dfs ( i )->evallogcond ( eSmp._samples() ( j ), emptyvec );84 lW ( i, j ) = part_sources ( i )->evallogcond ( eSmp._samples() ( j ), emptyvec ); 82 85 } 83 86 } … … 92 95 } 93 96 94 vec merger_base::merge_points ( mat &lW ) {97 vec MergerDiscrete::merge_points ( mat &lW ) { 95 98 int nu = lW.rows(); 96 99 vec result; … … 144 147 } 145 148 146 vec merger_base::mean() const { 147 const Vec<double> &w = eSmp._w(); 148 const Array<vec> &S = eSmp._samples(); 149 vec tmp = zeros ( dim ); 150 for ( int i = 0; i < Npoints; i++ ) { 151 tmp += w ( i ) * S ( i ); 152 } 153 return tmp; 154 } 155 156 mat merger_base::covariance() const { 157 const vec &w = eSmp._w(); 158 const Array<vec> &S = eSmp._samples(); 159 160 vec mea = mean(); 161 162 // cout << sum (w) << "," << w*w << endl; 163 164 mat Tmp = zeros ( dim, dim ); 165 for ( int i = 0; i < Npoints; i++ ) { 166 vec tmp=S ( i )-mea; //inefficient but numerically stable 167 Tmp += w ( i ) * outer_product (tmp , tmp ); 168 } 169 return Tmp; 170 } 171 172 vec merger_base::variance() const { 173 return eSmp.variance(); 174 } 175 176 177 void merger_base::from_setting ( const Setting& set ) { 149 void MergerDiscrete::from_setting ( const Setting& set ) { 178 150 // get support 179 151 // find which method to use 180 epdf::from_setting (set);181 152 string meth_str; 182 153 UI::get( meth_str, set, "method", UI::compulsory ); … … 197 168 } 198 169 199 void merger_base::to_setting (Setting &set) const { 200 epdf::to_setting(set); 201 170 void MergerDiscrete::to_setting (Setting &set) const { 202 171 UI::save( METHOD, set, "method"); 203 172 … … 209 178 } 210 179 211 void merger_base::validate() {180 void MergerDiscrete::validate() { 212 181 // bdm_assert ( eSmp._w().length() > 0, "Empty support, use set_support()." ); 213 182 // bdm_assert ( dim == eSmp._samples() ( 0 ).length(), "Support points and rv are not compatible!" ); 214 epdf::validate(); 215 bdm_assert ( isnamed(), "mergers must be named" ); 216 } 217 218 // DEFAULTS FOR MERGER_BASE 219 const MERGER_METHOD merger_base::DFLT_METHOD = LOGNORMAL; 220 const double merger_base::DFLT_beta = 1.2; 183 MergerBase::validate(); 184 //bdm_assert ( merger().isnamed(), "mergers must be named" ); 185 } 221 186 222 187 void merger_mix::merge ( ) { 188 int dim = eSmp.dimension(); 223 189 if(Npoints<1) { 224 190 set_support(enorm<fsqmat>(zeros(dim), eye(dim)), 1000); … … 231 197 vec &w = eSmp._w(); //aux 232 198 233 mat Smp_ex = ones ( dim + 1, Npoints ); // Extended samples for the ARX model - the last row is ones199 mat Smp_ex = ones ( dim, Npoints ); // Extended samples for the ARX model 234 200 for ( int i = 0; i < Npoints; i++ ) { 235 201 set_col_part ( Smp_ex, i, Smp ( i ) ); … … 242 208 vec lw_mix ( Npoints ); // weights of the approximating mixture 243 209 vec lw ( Npoints ); // tmp 244 mat lW = zeros ( Nsources, Npoints ); // array of weights of all sources210 mat lW = zeros ( Nsources, Npoints ); // array of weights of all part_sources 245 211 vec vec0 ( 0 ); 246 212 … … 263 229 char dbg_str[100]; 264 230 265 emix*Mpred = Mix.epredictor ( );231 emix *Mpred = Mix.epredictor ( ); 266 232 vec Mix_pdf ( Npoints ); 267 233 while ( !converged ) { … … 272 238 delete Mpred; 273 239 Mpred = Mix.epredictor ( ); // Allocation => must be deleted at the end!! 274 Mpred->set_rv ( rv); //the predictor predicts rv of this merger240 Mpred->set_rv ( merger()._rv() ); //the predictor predicts rv of this merger 275 241 276 242 // This will be active only later in iterations!!! … … 299 265 *dbg_file << Name ( dbg_str ) << Mpred->variance(); 300 266 sprintf ( dbg_str, "Mpred_cov%d", niter ); 301 *dbg_file << Name ( dbg_str ) << covariance();267 *dbg_file << Name ( dbg_str ) << Mpred->covariance(); 302 268 303 269 … … 313 279 } 314 280 //Importace weighting 315 for ( int i = 0; i < p dfs.length(); i++ ) {281 for ( int i = 0; i < part_sources.length(); i++ ) { 316 282 lw_src = 0.0; 317 283 //======== Same RVs =========== 318 284 //Split according to dependency in rvs 319 if ( p dfs ( i )->dimension() == dim ) {285 if ( part_sources ( i )->dimension() == dim ) { 320 286 // no need for conditioning or marginalization 321 lw_src = p dfs ( i )->evallogcond_mat ( Smp , vec ( 0 ) );287 lw_src = part_sources ( i )->evallogcond_mat ( Smp , vec ( 0 ) ); 322 288 } else { 323 289 // compute likelihood of marginal on the conditional variable 324 if ( p dfs ( i )->dimensionc() > 0 ) {290 if ( part_sources ( i )->dimensionc() > 0 ) { 325 291 // Make marginal on rvc_i 326 shared_ptr<epdf> tmp_marg = Mpred->marginal ( p dfs ( i )->_rvc() );292 shared_ptr<epdf> tmp_marg = Mpred->marginal ( part_sources ( i )->_rvc() ); 327 293 //compute vector of lw_src 328 294 for ( int k = 0; k < Npoints; k++ ) { … … 336 302 } 337 303 // Compute likelihood of the missing variable 338 if ( dim > ( p dfs ( i )->dimension() + pdfs ( i )->dimensionc() ) ) {304 if ( dim > ( part_sources ( i )->dimension() + part_sources ( i )->dimensionc() ) ) { 339 305 /////////////// 340 306 // There are variales unknown to pdfs(i) : rvzs … … 355 321 // Compute likelihood of the partial source 356 322 for ( int k = 0; k < Npoints; k++ ) { 357 lw_src ( k ) += p dfs ( i )->evallogcond ( dls ( i )->pushdown ( Smp ( k ) ),323 lw_src ( k ) += part_sources ( i )->evallogcond ( dls ( i )->pushdown ( Smp ( k ) ), 358 324 dls ( i )->get_cond ( Smp ( k ) ) ); 359 325 } … … 363 329 lW.set_row ( i, lw_src ); // do not divide by mix 364 330 } 365 lw = merger_base::merge_points ( lW ); //merge331 lw = MergerDiscrete::merge_points ( lW ); //merge 366 332 367 333 //Importance weighting … … 391 357 } 392 358 delete Mpred; 393 // cout << endl;394 395 359 } 396 360 397 361 void merger_mix::from_setting ( const Setting& set ) { 398 merger_base::from_setting ( set );362 MergerDiscrete::from_setting ( set ); 399 363 Ncoms=DFLT_Ncoms; 400 364 UI::get( Ncoms, set, "ncoms", UI::optional ); … … 406 370 407 371 void merger_mix::to_setting (Setting &set) const { 408 merger_base::to_setting(set);372 MergerDiscrete::to_setting(set); 409 373 UI::save( Ncoms, set, "ncoms"); 410 374 UI::save (effss_coef , set, "effss_coef"); … … 413 377 414 378 void merger_mix::validate() { 415 merger_base::validate();379 MergerDiscrete::validate(); 416 380 bdm_assert(Ncoms>0,"Ncoms too small"); 417 381 }