Changeset 198 for bdm/stat/libEF.h
- Timestamp:
- 11/04/08 14:54:34 (16 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
bdm/stat/libEF.h
r197 r198 94 94 //!Flatten the posterior as if to keep nu0 data 95 95 // virtual void flatten ( double nu0 ) {it_error ( "Not implemented" );} 96 96 97 97 BMEF* _copy_ ( bool changerv=false ) {it_error ( "function _copy_ not implemented for this BM" ); return NULL;}; 98 98 }; … … 192 192 //! returns a pointer to the internal statistics. Use with Care! 193 193 double& _nu() {return nu;} 194 void pow ( double p ) {V*=p;nu*=p;};194 void pow ( double p ) {V*=p;nu*=p;}; 195 195 }; 196 196 … … 239 239 //! Conjugate prior and posterior 240 240 eDirich est; 241 //! Pointer inside est to sufficient statistics 241 //! Pointer inside est to sufficient statistics 242 242 vec β 243 243 public: … … 271 271 // sum(beta) should be equal to sum(B.beta) 272 272 const vec &Eb=E->beta;//const_cast<multiBM*> ( E )->_beta(); 273 beta*= ( sum ( Eb ) /sum ( beta ) );273 beta*= ( sum ( Eb ) /sum ( beta ) ); 274 274 if ( evalll ) {last_lognc=est.lognc();} 275 275 } … … 372 372 template<class sq_T> 373 373 class mlnorm : public mEF { 374 protected: 374 375 //! Internal epdf that arise by conditioning on \c rvc 375 376 enorm<sq_T> epdf; … … 379 380 public: 380 381 //! Constructor 381 mlnorm ( const RV &rv, const RV &rvc );382 mlnorm ( const RV &rv, const RV &rvc ); 382 383 //! Set \c A and \c R 383 384 void set_parameters ( const mat &A, const vec &mu0, const sq_T &R ); … … 387 388 // mat samplecond (const vec &cond, vec &lik, int n ); 388 389 //! Set value of \c rvc . Result of this operation is stored in \c epdf use function \c _ep to access it. 389 void condition (const vec &cond ); 390 390 void condition ( const vec &cond ); 391 392 //!access function 393 vec& _mu_const() {return mu_const;} 394 //!access function 395 mat& _A() {return A;} 396 //!access function 397 mat _R() {return epdf._R().to_mat();} 398 391 399 template<class sq_M> 392 400 friend std::ostream &operator<< ( std::ostream &os, mlnorm<sq_M> &ml ); 393 401 }; 394 402 403 /*! (Approximate) Student t density with linear function of mean value 404 */ 405 class mlstudent : public mlnorm<ldmat> { 406 protected: 407 ldmat Lambda; 408 ldmat &_R; 409 ldmat Re; 410 public: 411 mlstudent ( const RV &rv0, const RV &rvc0 ) :mlnorm<ldmat> ( rv0,rvc0 ), 412 Lambda ( rv0.count() ), 413 _R ( epdf._R() ) {} 414 void set_parameters ( const mat &A0, const vec &mu0, const ldmat &R0, const ldmat& Lambda0) { 415 epdf.set_parameters ( zeros ( rv.count() ),Lambda ); 416 A = A0; 417 mu_const = mu0; 418 Re=R0; 419 Lambda = Lambda0; 420 } 421 void condition ( const vec &cond ) { 422 _mu = A*cond + mu_const; 423 double zeta; 424 //ugly hack! 425 if ((cond.length()+1)==Lambda.rows()){ 426 zeta = Lambda.invqform ( concat(cond, vec_1(1.0)) ); 427 } else { 428 zeta = Lambda.invqform ( cond ); 429 } 430 _R = Re; 431 _R*=( 1+zeta );// / ( nu ); << nu is in Re!!!!!! 432 433 cout << _mu <<" +- " << sqrt(_R.to_mat()) << endl; 434 }; 435 436 }; 395 437 /*! 396 438 \brief Gamma random walk … … 548 590 double enorm<sq_T>::evalpdflog_nn ( const vec &val ) const { 549 591 // 1.83787706640935 = log(2pi) 550 return -0.5* ( R.invqform ( mu-val ) );// - lognc(); 592 double tmp=-0.5* ( R.invqform ( mu-val ) );// - lognc(); 593 return tmp; 551 594 }; 552 595 … … 554 597 inline double enorm<sq_T>::lognc () const { 555 598 // 1.83787706640935 = log(2pi) 556 return 0.5* ( R.cols() * 1.83787706640935 +R.logdet() ); 599 double tmp=0.5* ( R.cols() * 1.83787706640935 +R.logdet() ); 600 return tmp; 557 601 }; 558 602 … … 584 628 // vec smp ( dim ); 585 629 // this->condition ( cond ); 586 // 630 // 587 631 // for ( i=0; i<n; i++ ) { 588 632 // smp = epdf.sample(); … … 590 634 // Smp.set_col ( i ,smp ); 591 635 // } 592 // 636 // 593 637 // return Smp; 594 638 // } 595 639 596 640 template<class sq_T> 597 void mlnorm<sq_T>::condition ( const vec &cond ) {641 void mlnorm<sq_T>::condition ( const vec &cond ) { 598 642 _mu = A*cond + mu_const; 599 643 //R is already assigned; … … 605 649 606 650 sq_T Rn ( R,irvn ); 607 enorm<sq_T>* tmp = new enorm<sq_T> ( rvn );651 enorm<sq_T>* tmp = new enorm<sq_T> ( rvn ); 608 652 tmp->set_parameters ( mu ( irvn ), Rn ); 609 653 return tmp; … … 627 671 int end=R.rows()-1; 628 672 mat S11 = S.get ( 0,n, 0, n ); 629 mat S12 = S.get ( 0, n , rvn.count(), end );673 mat S12 = S.get ( 0, n , rvn.count(), end ); 630 674 mat S22 = S.get ( rvn.count(), end, rvn.count(), end ); 631 675 … … 644 688 645 689 template<class sq_T> 646 std::ostream &operator<< ( std::ostream &os, mlnorm<sq_T> &ml ) {690 std::ostream &operator<< ( std::ostream &os, mlnorm<sq_T> &ml ) { 647 691 os << "A:"<< ml.A<<endl; 648 692 os << "mu:"<< ml.mu_const<<endl;