Changeset 487 for library/bdm/stat/emix.h
- Timestamp:
- 08/08/09 13:42:18 (15 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
library/bdm/stat/emix.h
r477 r487 45 45 //!datalink between conditional and nom 46 46 datalink_m2e dl; 47 //! dummy epdf that stores only rv and dim 48 epdf iepdf; 47 49 public: 48 50 //!Default constructor. By default, the given epdf is not copied! 49 51 //! It is assumed that this function will be used only temporarily. 50 mratio ( const epdf* nom0, const RV &rv, bool copy = false ) : mpdf ( ), dl ( ) {52 mratio ( const epdf* nom0, const RV &rv, bool copy = false ) : mpdf ( ), dl ( ),iepdf() { 51 53 // adjust rv and rvc 52 54 rvc = nom0->_rv().subt ( rv ); 53 55 dimc = rvc._dsize(); 54 set_ep ( shared_ptr<epdf> ( new epdf ));55 e()->set_parameters ( rv._dsize() );56 e()->set_rv ( rv );56 set_ep ( iepdf ); 57 iepdf.set_parameters ( rv._dsize() ); 58 iepdf.set_rv ( rv ); 57 59 58 60 //prepare data structures … … 72 74 double evallogcond ( const vec &val, const vec &cond ) { 73 75 double tmp; 74 vec nom_val ( e()->dimension() + dimc );76 vec nom_val ( dimension() + dimc ); 75 77 dl.pushup_cond ( nom_val, val, cond ); 76 78 tmp = exp ( nom->evallog ( nom_val ) - den->evallog ( cond ) ); 77 it_assert_debug ( std::isfinite ( tmp ), "Infinite value" );78 79 return tmp; 79 80 } … … 278 279 class mprod: public compositepdf, public mpdf { 279 280 protected: 280 //! pointers to epdfs - shortcut to mpdfs().posterior()281 Array<epdf*> epdfs;282 281 //! Data link for each mpdfs 283 282 Array<datalink_m2m*> dls; 284 283 285 //! dummy ep 286 shared_ptr<epdf> dummy;284 //! dummy epdf used only as storage for RV and dim 285 epdf iepdf; 287 286 288 287 public: 289 288 /*!\brief Constructor from list of mFacs, 290 289 */ 291 mprod() : dummy ( new epdf()) { }290 mprod() : iepdf( ) { } 292 291 mprod ( Array<mpdf*> mFacs ) : 293 dummy ( new epdf()) {292 iepdf ( ) { 294 293 set_elements ( mFacs ); 295 294 } … … 299 298 compositepdf::set_elements ( mFacs, own ); 300 299 dls.set_size ( mFacs.length() ); 301 epdfs.set_size ( mFacs.length() ); 302 303 set_ep ( dummy ); 300 301 set_ep ( iepdf); 304 302 RV rv = getrv ( true ); 305 303 set_rv ( rv ); 306 dummy->set_parameters ( rv._dsize() );307 setrvc ( e()->_rv(), rvc );304 iepdf.set_parameters ( rv._dsize() ); 305 setrvc (_rv(), rvc ); 308 306 // rv and rvc established = > we can link them with mpdfs 309 307 for ( int i = 0; i < mpdfs.length(); i++ ) { … … 312 310 } 313 311 314 for ( int i = 0; i < mpdfs.length(); i++ ) {315 epdfs ( i ) = mpdfs ( i )->e();316 }317 312 }; 318 313 … … 352 347 vec samplecond ( const vec &cond ) { 353 348 //! Ugly hack to help to discover if mpfs are not in proper order. Correct solution = check that explicitely. 354 vec smp = std::numeric_limits<double>::infinity() * ones ( e()->dimension() );349 vec smp = std::numeric_limits<double>::infinity() * ones ( dimension() ); 355 350 vec smpi; 356 351 // Hard assumption here!!! We are going backwards, to assure that samples that are needed from smp are already generated! 357 352 for ( int i = ( mpdfs.length() - 1 ); i >= 0; i-- ) { 358 if ( mpdfs ( i )->dimensionc() ) { 359 mpdfs ( i )->condition ( dls ( i )->get_cond ( smp , cond ) ); // smp is val here!! 360 } 361 smpi = epdfs ( i )->sample(); 353 // generate contribution of this mpdf 354 smpi = mpdfs(i)->samplecond(dls ( i )->get_cond ( smp , cond )); 362 355 // copy contribution of this pdf into smp 363 356 dls ( i )->pushup ( smp, smpi ); 364 // add ith likelihood contribution365 357 } 366 358 return smp; … … 483 475 484 476 */ 485 class mmix : public mpdf {486 protected:487 //! Component (epdfs)488 Array<mpdf*> Coms;489 490 //!Internal epdf491 shared_ptr<emix>iepdf;492 493 public:494 //!Default constructor495 mmix() : iepdf ( new emix()) {496 set_ep ( iepdf );497 }498 499 //! Set weights \c w and components \c R500 void set_parameters ( const vec &w, const Array<mpdf*> &Coms ) {501 Array<epdf*> Eps ( Coms.length() );502 503 for ( int i = 0; i < Coms.length(); i++ ) {504 Eps ( i ) = Coms ( i )->e();505 }506 507 iepdf->set_parameters ( w, Eps );508 }509 510 void condition ( const vec &cond ) {511 for ( int i = 0; i < Coms.length(); i++ ) {512 Coms ( i )->condition ( cond );513 }514 };515 };477 // class mmix : public mpdf { 478 // protected: 479 // //! Component (epdfs) 480 // Array<mpdf*> Coms; 481 // 482 // //!Internal epdf 483 // emix iepdf; 484 // 485 // public: 486 // //!Default constructor 487 // mmix() : iepdf ( ) { 488 // set_ep ( iepdf ); 489 // } 490 // 491 // //! Set weights \c w and components \c R 492 // void set_parameters ( const vec &w, const Array<mpdf*> &Coms ) { 493 // Array<epdf*> Eps ( Coms.length() ); 494 // 495 // for ( int i = 0; i < Coms.length(); i++ ) { 496 // Eps ( i ) = Coms ( i )->e(); 497 // } 498 // 499 // iepdf->set_parameters ( w, Eps ); 500 // } 501 // 502 // void condition ( const vec &cond ) { 503 // for ( int i = 0; i < Coms.length(); i++ ) { 504 // Coms ( i )->condition ( cond ); 505 // } 506 // }; 507 // }; 516 508 517 509 }