| 452 |   |   | 
                      
                        | 453 |   | // class MPF : public BM  {  | 
                      
                        | 454 |   | //      //! Introduces new option   | 
                      
                        | 455 |   | //      //! \li means - meaning TODO  | 
                      
                        | 456 |   | //      LOG_LEVEL(MPF,means);  | 
                      
                        | 457 |   | // protected:  | 
                      
                        | 458 |   | //      //! particle filter on non-linear variable  | 
                      
                        | 459 |   | //      shared_ptr<PF> pf;  | 
                      
                        | 460 |   | //      //! Array of Bayesian models  | 
                      
                        | 461 |   | //      Array<BM*> BMs;  | 
                      
                        | 462 |   | //   | 
                      
                        | 463 |   | //      //! internal class for pdf providing composition of eEmp with external components  | 
                      
                        | 464 |   | //   | 
                      
                        | 465 |   | //      class mpfepdf : public epdf  {  | 
                      
                        | 466 |   | //              //! pointer to particle filter  | 
                      
                        | 467 |   | //              shared_ptr<PF> &pf;  | 
                      
                        | 468 |   | //              //! pointer to Array of BMs  | 
                      
                        | 469 |   | //              Array<BM*> &BMs;  | 
                      
                        | 470 |   | //      public:  | 
                      
                        | 471 |   | //              //! constructor  | 
                      
                        | 472 |   | //              mpfepdf ( shared_ptr<PF> &pf0, Array<BM*> &BMs0 ) : epdf(), pf ( pf0 ), BMs ( BMs0 ) { };  | 
                      
                        | 473 |   | //              //! a variant of set parameters - this time, parameters are read from BMs and pf  | 
                      
                        | 474 |   | //              void read_parameters() {  | 
                      
                        | 475 |   | //                      rv = concat ( pf->posterior()._rv(), BMs ( 0 )->posterior()._rv() );  | 
                      
                        | 476 |   | //                      dim = pf->posterior().dimension() + BMs ( 0 )->posterior().dimension();  | 
                      
                        | 477 |   | //                      bdm_assert_debug ( dim == rv._dsize(), "Wrong name " );  | 
                      
                        | 478 |   | //              }  | 
                      
                        | 479 |   | //              vec mean() const;  | 
                      
                        | 480 |   | //   | 
                      
                        | 481 |   | //              vec variance() const;  | 
                      
                        | 482 |   | //   | 
                      
                        | 483 |   | //              void qbounds ( vec &lb, vec &ub, double perc = 0.95 ) const;  | 
                      
                        | 484 |   | //   | 
                      
                        | 485 |   | //              vec sample() const NOT_IMPLEMENTED(0);  | 
                      
                        | 486 |   | //   | 
                      
                        | 487 |   | //              double evallog ( const vec &val ) const NOT_IMPLEMENTED(0);               | 
                      
                        | 488 |   | //      };  | 
                      
                        | 489 |   | //   | 
                      
                        | 490 |   | //      //! Density joining PF.est with conditional parts  | 
                      
                        | 491 |   | //      mpfepdf jest;  | 
                      
                        | 492 |   | //   | 
                      
                        | 493 |   | //      //! datalink from global yt and cond (Up) to BMs yt and cond (Down)  | 
                      
                        | 494 |   | //      datalink_m2m this2bm;  | 
                      
                        | 495 |   | //      //! datalink from global yt and cond (Up) to PFs yt and cond (Down)  | 
                      
                        | 496 |   | //      datalink_m2m this2pf;  | 
                      
                        | 497 |   | //      //!datalink from PF part to BM  | 
                      
                        | 498 |   | //      datalink_part pf2bm;  | 
                      
                        | 499 |   | //   | 
                      
                        | 500 |   | // public:  | 
                      
                        | 501 |   | //      //! Default constructor.  | 
                      
                        | 502 |   | //      MPF () :  jest ( pf, BMs ) {};  | 
                      
                        | 503 |   | //      //! set all parameters at once  | 
                      
                        | 504 |   | //      void set_pf ( shared_ptr<pdf> par0, int n0, RESAMPLING_METHOD rm = SYSTEMATIC ) {  | 
                      
                        | 505 |   | //              if (!pf) pf=new PF;  | 
                      
                        | 506 |   | //              pf->set_model ( par0, par0 ); // <=== nasty!!!  | 
                      
                        | 507 |   | //              pf->set_parameters ( n0, rm );  | 
                      
                        | 508 |   | //              pf->set_rv(par0->_rv());  | 
                      
                        | 509 |   | //              BMs.set_length ( n0 );  | 
                      
                        | 510 |   | //      }  | 
                      
                        | 511 |   | //      //! set a prototype of BM, copy it to as many times as there is particles in pf  | 
                      
                        | 512 |   | //      void set_BM ( const BM &BMcond0 ) {  | 
                      
                        | 513 |   | //   | 
                      
                        | 514 |   | //              int n = pf->__w().length();  | 
                      
                        | 515 |   | //              BMs.set_length ( n );  | 
                      
                        | 516 |   | //              // copy  | 
                      
                        | 517 |   | //              //BMcond0 .condition ( pf->posterior()._sample ( 0 ) );  | 
                      
                        | 518 |   | //              for ( int i = 0; i < n; i++ ) {  | 
                      
                        | 519 |   | //                      BMs ( i ) = (BM*) BMcond0._copy();  | 
                      
                        | 520 |   | //              }  | 
                      
                        | 521 |   | //      };  | 
                      
                        | 522 |   | //   | 
                      
                        | 523 |   | //      void bayes ( const vec &yt, const vec &cond );  | 
                      
                        | 524 |   | //   | 
                      
                        | 525 |   | //      const epdf& posterior() const {  | 
                      
                        | 526 |   | //              return jest;  | 
                      
                        | 527 |   | //      }  | 
                      
                        | 528 |   | //   | 
                      
                        | 529 |   | //      //!Access function  | 
                      
                        | 530 |   | //      const BM* _BM ( int i ) {  | 
                      
                        | 531 |   | //              return BMs ( i );  | 
                      
                        | 532 |   | //      }  | 
                      
                        | 533 |   | //      PF& _pf() {return *pf;}  | 
                      
                        | 534 |   | //   | 
                      
                        | 535 |   | //   | 
                      
                        | 536 |   | //      virtual double logpred ( const vec &yt ) const NOT_IMPLEMENTED(0);   | 
                      
                        | 537 |   | //                | 
                      
                        | 538 |   | //      virtual epdf* epredictor() const NOT_IMPLEMENTED(NULL);   | 
                      
                        | 539 |   | //        | 
                      
                        | 540 |   | //      virtual pdf* predictor() const NOT_IMPLEMENTED(NULL);   | 
                      
                        | 541 |   | //   | 
                      
                        | 542 |   | //   | 
                      
                        | 543 |   | //      /*! configuration structure for basic PF  | 
                      
                        | 544 |   | //      \code  | 
                      
                        | 545 |   | //      BM              = BM_class;           // Bayesian filtr for analytical part of the model  | 
                      
                        | 546 |   | //      parameter_pdf   = pdf_class;         // transitional pdf for non-parametric part of the model  | 
                      
                        | 547 |   | //      prior           = epdf_class;         // prior probability density  | 
                      
                        | 548 |   | //      --- optional ---  | 
                      
                        | 549 |   | //      n               = 10;                 // number of particles  | 
                      
                        | 550 |   | //      resmethod       = 'systematic', or 'multinomial', or 'stratified'  | 
                      
                        | 551 |   | //                                                                                // resampling method  | 
                      
                        | 552 |   | //      \endcode  | 
                      
                        | 553 |   | //      */  | 
                      
                        | 554 |   | //      void from_setting ( const Setting &set ) {  | 
                      
                        | 555 |   | //              BM::from_setting( set );  | 
                      
                        | 556 |   | //   | 
                      
                        | 557 |   | //              shared_ptr<pdf> par = UI::build<pdf> ( set, "parameter_pdf", UI::compulsory );  | 
                      
                        | 558 |   | //   | 
                      
                        | 559 |   | //              pf = new PF;  | 
                      
                        | 560 |   | //              // prior must be set before BM  | 
                      
                        | 561 |   | //              pf->prior_from_set ( set );  | 
                      
                        | 562 |   | //              pf->resmethod_from_set ( set );  | 
                      
                        | 563 |   | //              pf->set_model ( par, par ); // too hackish!  | 
                      
                        | 564 |   | //   | 
                      
                        | 565 |   | //              shared_ptr<BM> BM0 = UI::build<BM> ( set, "BM", UI::compulsory );  | 
                      
                        | 566 |   | //              set_BM ( *BM0 );  | 
                      
                        | 567 |   | //   | 
                      
                        | 568 |   | //              //set drv  | 
                      
                        | 569 |   | //              //??set_yrv(concat(BM0->_yrv(),u) );  | 
                      
                        | 570 |   | //              set_yrv ( BM0->_yrv() );  | 
                      
                        | 571 |   | //              rvc = BM0->_rvc().subt ( par->_rv() );  | 
                      
                        | 572 |   | //              //find potential input - what remains in rvc when we subtract rv  | 
                      
                        | 573 |   | //              RV u = par->_rvc().subt ( par->_rv().copy_t ( -1 ) );  | 
                      
                        | 574 |   | //              rvc.add ( u );  | 
                      
                        | 575 |   | //              dimc = rvc._dsize();  | 
                      
                        | 576 |   | //              validate();  | 
                      
                        | 577 |   | //      }  | 
                      
                        | 578 |   | //   | 
                      
                        | 579 |   | //      void validate() {  | 
                      
                        | 580 |   | //              BM::validate();  | 
                      
                        | 581 |   | //              try {  | 
                      
                        | 582 |   | //                      pf->validate();  | 
                      
                        | 583 |   | //              } catch ( std::exception ) {  | 
                      
                        | 584 |   | //                      throw UIException ( "Error in PF part of MPF:" );  | 
                      
                        | 585 |   | //              }  | 
                      
                        | 586 |   | //              jest.read_parameters();  | 
                      
                        | 587 |   | //              this2bm.set_connection ( BMs ( 0 )->_yrv(), BMs ( 0 )->_rvc(), yrv, rvc );  | 
                      
                        | 588 |   | //              this2pf.set_connection ( pf->_yrv(), pf->_rvc(), yrv, rvc );  | 
                      
                        | 589 |   | //              pf2bm.set_connection ( BMs ( 0 )->_rvc(), pf->posterior()._rv() );  | 
                      
                        | 590 |   | //      }  | 
                      
                        | 591 |   | // };  | 
                      
                        | 592 |   | // UIREGISTER ( MPF );  | 
                      
                        | 593 |   |   | 
                      
                        | 594 |   | /*! ARXg for estimation of state-space variances  | 
                      
                        | 595 |   | */  | 
                      
                        | 596 |   | // class MPF_ARXg :public BM{  | 
                      
                        | 597 |   | //      protected:  | 
                      
                        | 598 |   | //      shared_ptr<PF> pf;  | 
                      
                        | 599 |   | //      //! pointer to Array of BMs  | 
                      
                        | 600 |   | //      Array<ARX*> BMso;  | 
                      
                        | 601 |   | //      //! pointer to Array of BMs  | 
                      
                        | 602 |   | //      Array<ARX*> BMsp;  | 
                      
                        | 603 |   | //      //!parameter evolution  | 
                      
                        | 604 |   | //      shared_ptr<fnc> g;  | 
                      
                        | 605 |   | //      //!observation function  | 
                      
                        | 606 |   | //      shared_ptr<fnc> h;  | 
                      
                        | 607 |   | //        | 
                      
                        | 608 |   | //      public:  | 
                      
                        | 609 |   | //              void bayes(const vec &yt, const vec &cond );  | 
                      
                        | 610 |   | //              void from_setting(const Setting &set) ;  | 
                      
                        | 611 |   | //              void validate() {  | 
                      
                        | 612 |   | //                      bdm_assert(g->dimensionc()==g->dimension(),"not supported yet");  | 
                      
                        | 613 |   | //                      bdm_assert(h->dimensionc()==g->dimension(),"not supported yet");                          | 
                      
                        | 614 |   | //              }  | 
                      
                        | 615 |   | //   | 
                      
                        | 616 |   | //              double logpred(const vec &cond) const NOT_IMPLEMENTED(0.0);  | 
                      
                        | 617 |   | //              epdf* epredictor() const NOT_IMPLEMENTED(NULL);  | 
                      
                        | 618 |   | //              pdf* predictor() const NOT_IMPLEMENTED(NULL);  | 
                      
                        | 619 |   | //              const epdf& posterior() const {return pf->posterior();};  | 
                      
                        | 620 |   | //                | 
                      
                        | 621 |   | //              void log_register( logger &L, const string &prefix ){  | 
                      
                        | 622 |   | //                      BM::log_register(L,prefix);  | 
                      
                        | 623 |   | //                      registered_logger->ids.set_size ( 3 );  | 
                      
                        | 624 |   | //                      registered_logger->ids(1)= L.add_vector(RV("Q",dimension()*dimension()), prefix+L.prefix_sep()+"Q");  | 
                      
                        | 625 |   | //                      registered_logger->ids(2)= L.add_vector(RV("R",dimensiony()*dimensiony()), prefix+L.prefix_sep()+"R");  | 
                      
                        | 626 |   | //                        | 
                      
                        | 627 |   | //              };  | 
                      
                        | 628 |   | //              void log_write() const {  | 
                      
                        | 629 |   | //                      BM::log_write();  | 
                      
                        | 630 |   | //                      mat mQ=zeros(dimension(),dimension());  | 
                      
                        | 631 |   | //                      mat pom=zeros(dimension(),dimension());  | 
                      
                        | 632 |   | //                      mat mR=zeros(dimensiony(),dimensiony());  | 
                      
                        | 633 |   | //                      mat pom2=zeros(dimensiony(),dimensiony());  | 
                      
                        | 634 |   | //                      mat dum;  | 
                      
                        | 635 |   | //                      const vec w=pf->posterior()._w();  | 
                      
                        | 636 |   | //                      for (int i=0; i<w.length(); i++){  | 
                      
                        | 637 |   | //                              BMsp(i)->posterior().mean_mat(dum,pom);  | 
                      
                        | 638 |   | //                              mQ += w(i) * pom;  | 
                      
                        | 639 |   | //                              BMso(i)->posterior().mean_mat(dum,pom2);  | 
                      
                        | 640 |   | //                              mR += w(i) * pom2;  | 
                      
                        | 641 |   | //                                | 
                      
                        | 642 |   | //                      }  | 
                      
                        | 643 |   | //                      registered_logger->L.log_vector ( registered_logger->ids ( 1 ), cvectorize(mQ) );  | 
                      
                        | 644 |   | //                      registered_logger->L.log_vector ( registered_logger->ids ( 2 ), cvectorize(mR) );  | 
                      
                        | 645 |   | //                        | 
                      
                        | 646 |   | //              }  | 
                      
                        | 647 |   | // };  | 
                      
                        | 648 |   | // UIREGISTER(MPF_ARXg);  | 
                      
                      
                        |   | 472 | class NoiseParticle : public MarginalizedParticleBase{  | 
                      
                        |   | 473 |         protected:  | 
                      
                        |   | 474 |                 //! function transforming xt, ut -> x_t+1  | 
                      
                        |   | 475 |                 shared_ptr<fnc> g; // pdf for non-linear part  | 
                      
                        |   | 476 |                 //! function transforming xt,ut -> yt  | 
                      
                        |   | 477 |                 shared_ptr<fnc> h; // pdf for non-linear part  | 
                      
                        |   | 478 |   | 
                      
                        |   | 479 |                 RV rvv;  | 
                      
                        |   | 480 |                   | 
                      
                        |   | 481 |                 RV rvx;  | 
                      
                        |   | 482 |                 RV rvxc;  | 
                      
                        |   | 483 |                 RV rvyc;  | 
                      
                        |   | 484 |                   | 
                      
                        |   | 485 |                 //!link from condition to f  | 
                      
                        |   | 486 |                 datalink_part cond2g;  | 
                      
                        |   | 487 |                 //!link from condition to h  | 
                      
                        |   | 488 |                 datalink_part cond2h;  | 
                      
                        |   | 489 |                 //!link from xt to f  | 
                      
                        |   | 490 |                 datalink_part x2g;  | 
                      
                        |   | 491 |                 //!link from xt to h  | 
                      
                        |   | 492 |                 datalink_part x2h;  | 
                      
                        |   | 493 |                   | 
                      
                        |   | 494 |         public:  | 
                      
                        |   | 495 |                 BM* _copy() const{return new NoiseParticle();};  | 
                      
                        |   | 496 |                 void bayes(const vec &dt, const vec &cond){  | 
                      
                        |   | 497 |                         epdf* pred_vw=bm->epredictor();  | 
                      
                        |   | 498 |                         shared_ptr<epdf> pred_v = pred_vw->marginal(rvv);  | 
                      
                        |   | 499 |                           | 
                      
                        |   | 500 |                         vec vt=pred_v->sample();  | 
                      
                        |   | 501 |                           | 
                      
                        |   | 502 |                         //new sample  | 
                      
                        |   | 503 |                         vec &xtm=est_emp.point;  | 
                      
                        |   | 504 |                         vec g_args(g->dimensionc());  | 
                      
                        |   | 505 |                         x2g.filldown(xtm,g_args);  | 
                      
                        |   | 506 |                         cond2g.filldown(cond,g_args);  | 
                      
                        |   | 507 |                         vec xt = g->eval(g_args) + vt;  | 
                      
                        |   | 508 |                           | 
                      
                        |   | 509 |                         // residue of observation  | 
                      
                        |   | 510 |                         vec h_args(h->dimensionc());  | 
                      
                        |   | 511 |                         x2h.filldown(xt,h_args);  | 
                      
                        |   | 512 |                         cond2h.filldown(cond,h_args);  | 
                      
                        |   | 513 |                         vec wt = dt-h->eval(h_args);  | 
                      
                        |   | 514 |                         // the vector [v_t,w_t] is now complete  | 
                      
                        |   | 515 |                         bm->bayes(concat(vt,wt));  | 
                      
                        |   | 516 |                         ll=bm->_ll();  | 
                      
                        |   | 517 |                 }  | 
                      
                        |   | 518 |                 void from_setting(const Setting &set){  | 
                      
                        |   | 519 |                         MarginalizedParticleBase::from_setting(set); //reads bm, yrv,rvc, bm_rv, etc...  | 
                      
                        |   | 520 |                                   | 
                      
                        |   | 521 |                         UI::get(g,set,"g",UI::compulsory);  | 
                      
                        |   | 522 |                         UI::get(h,set,"h",UI::compulsory);  | 
                      
                        |   | 523 |                         RV rvx;  | 
                      
                        |   | 524 |                         UI::get(rvx,set,"rvx",UI::compulsory);  | 
                      
                        |   | 525 |                         est_emp.set_rv(rvx);  | 
                      
                        |   | 526 |                           | 
                      
                        |   | 527 |                         RV rvxc;  | 
                      
                        |   | 528 |                         UI::get(rvxc,set,"rvxc",UI::compulsory);  | 
                      
                        |   | 529 |                         RV rvyc;  | 
                      
                        |   | 530 |                         UI::get(rvyc,set,"rvyc",UI::compulsory);  | 
                      
                        |   | 531 |                 }  | 
                      
                        |   | 532 |                 void validate(){  | 
                      
                        |   | 533 |                         MarginalizedParticleBase::validate();  | 
                      
                        |   | 534 |                         //check dimensions  | 
                      
                        |   | 535 |                         rvc = rvxc;  | 
                      
                        |   | 536 |                         rvc.add( rvyc);  | 
                      
                        |   | 537 |                         rvc.subt(rvx);  | 
                      
                        |   | 538 |                   | 
                      
                        |   | 539 |                         //establish datalinks  | 
                      
                        |   | 540 |                         x2g.set_connection(rvxc, rvx.copy_t(-1));  | 
                      
                        |   | 541 |                         cond2g.set_connection(rvxc, rvc);  | 
                      
                        |   | 542 |                           | 
                      
                        |   | 543 |                         x2h.set_connection(rvyc, rvx);  | 
                      
                        |   | 544 |                         cond2h.set_connection(rvyc, rvc);  | 
                      
                        |   | 545 |                 }  | 
                      
                        |   | 546 | };  | 
                      
                        |   | 547 | UIREGISTER(NoiseParticle);  | 
                      
                        |   | 548 |   |