00001
00013 #ifndef EF_H
00014 #define EF_H
00015
00016
00017 #include "libBM.h"
00018 #include "../math/chmat.h"
00019
00020
00021 namespace bdm
00022 {
00023
00024
00026 extern Uniform_RNG UniRNG;
00028 extern Normal_RNG NorRNG;
00030 extern Gamma_RNG GamRNG;
00031
00038 class eEF : public epdf
00039 {
00040 public:
00041
00043 eEF ( ) :epdf ( ) {};
00045 virtual double lognc() const =0;
00047 virtual void dupdate ( mat &v ) {it_error ( "Not implemented" );};
00049 virtual double evallog_nn ( const vec &val ) const{it_error ( "Not implemented" );return 0.0;};
00051 virtual double evallog ( const vec &val ) const {double tmp;tmp= evallog_nn ( val )-lognc();it_assert_debug ( std::isfinite ( tmp ),"Infinite value" ); return tmp;}
00053 virtual vec evallog ( const mat &Val ) const
00054 {
00055 vec x ( Val.cols() );
00056 for ( int i=0;i<Val.cols();i++ ) {x ( i ) =evallog_nn ( Val.get_col ( i ) ) ;}
00057 return x-lognc();
00058 }
00060 virtual void pow ( double p ) {it_error ( "Not implemented" );};
00061 };
00062
00069 class mEF : public mpdf
00070 {
00071
00072 public:
00074 mEF ( ) :mpdf ( ) {};
00075 };
00076
00078 class BMEF : public BM
00079 {
00080 protected:
00082 double frg;
00084 double last_lognc;
00085 public:
00087 BMEF ( double frg0=1.0 ) :BM ( ), frg ( frg0 ) {}
00089 BMEF ( const BMEF &B ) :BM ( B ), frg ( B.frg ), last_lognc ( B.last_lognc ) {}
00091 virtual void set_statistics ( const BMEF* BM0 ) {it_error ( "Not implemented" );};
00093 virtual void bayes ( const vec &data, const double w ) {};
00094
00095 void bayes ( const vec &dt );
00097 virtual void flatten ( const BMEF * B ) {it_error ( "Not implemented" );}
00099
00100
00101 BMEF* _copy_ () const {it_error ( "function _copy_ not implemented for this BM" ); return NULL;};
00102 };
00103
00104 template<class sq_T>
00105 class mlnorm;
00106
00112 template<class sq_T>
00113 class enorm : public eEF
00114 {
00115 protected:
00117 vec mu;
00119 sq_T R;
00120 public:
00123
00124 enorm ( ) :eEF ( ), mu ( ),R ( ) {};
00125 enorm ( const vec &mu,const sq_T &R ) {set_parameters ( mu,R );}
00126 void set_parameters ( const vec &mu,const sq_T &R );
00127 void from_setting(const Setting &root);
00129
00132
00134 void dupdate ( mat &v,double nu=1.0 );
00135
00136 vec sample() const;
00137 mat sample ( int N ) const;
00138 double evallog_nn ( const vec &val ) const;
00139 double lognc () const;
00140 vec mean() const {return mu;}
00141 vec variance() const {return diag ( R.to_mat() );}
00142
00143 mpdf* condition ( const RV &rvn ) const ;
00144 enorm<sq_T>* marginal ( const RV &rv ) const;
00145
00147
00150
00151 vec& _mu() {return mu;}
00152 void set_mu ( const vec mu0 ) { mu=mu0;}
00153 sq_T& _R() {return R;}
00154 const sq_T& _R() const {return R;}
00156
00157 };
00158
00165 class egiw : public eEF
00166 {
00167 protected:
00169 ldmat V;
00171 double nu;
00173 int dimx;
00175 int nPsi;
00176 public:
00179 egiw() :eEF() {};
00180 egiw ( int dimx0, ldmat V0, double nu0=-1.0 ) :eEF() {set_parameters ( dimx0,V0, nu0 );};
00181
00182 void set_parameters ( int dimx0, ldmat V0, double nu0=-1.0 )
00183 {
00184 dimx=dimx0;
00185 nPsi = V0.rows()-dimx;
00186 dim = dimx* ( dimx+nPsi );
00187
00188 V=V0;
00189 if ( nu0<0 )
00190 {
00191 nu = 0.1 +nPsi +2*dimx +2;
00192
00193 }
00194 else
00195 {
00196 nu=nu0;
00197 }
00198 }
00200
00201 vec sample() const;
00202 vec mean() const;
00203 vec variance() const;
00204
00206 vec est_theta() const;
00207
00209 ldmat est_theta_cov() const;
00210
00211 void mean_mat ( mat &M, mat&R ) const;
00213 double evallog_nn ( const vec &val ) const;
00214 double lognc () const;
00215 void pow ( double p ) {V*=p;nu*=p;};
00216
00219
00220 ldmat& _V() {return V;}
00221 const ldmat& _V() const {return V;}
00222 double& _nu() {return nu;}
00223 const double& _nu() const {return nu;}
00225 };
00226
00235 class eDirich: public eEF
00236 {
00237 protected:
00239 vec beta;
00240 public:
00243
00244 eDirich () : eEF ( ) {};
00245 eDirich ( const eDirich &D0 ) : eEF () {set_parameters ( D0.beta );};
00246 eDirich ( const vec &beta0 ) {set_parameters ( beta0 );};
00247 void set_parameters ( const vec &beta0 )
00248 {
00249 beta= beta0;
00250 dim = beta.length();
00251 }
00253
00254 vec sample() const {it_error ( "Not implemented" );return vec_1 ( 0.0 );};
00255 vec mean() const {return beta/sum(beta);};
00256 vec variance() const {double gamma =sum(beta); return elem_mult ( beta, ( beta+1 ) ) / ( gamma* ( gamma+1 ) );}
00258 double evallog_nn ( const vec &val ) const
00259 {
00260 double tmp; tmp= ( beta-1 ) *log ( val ); it_assert_debug ( std::isfinite ( tmp ),"Infinite value" );
00261 return tmp;
00262 };
00263 double lognc () const
00264 {
00265 double tmp;
00266 double gam=sum ( beta );
00267 double lgb=0.0;
00268 for ( int i=0;i<beta.length();i++ ) {lgb+=lgamma ( beta ( i ) );}
00269 tmp= lgb-lgamma ( gam );
00270 it_assert_debug ( std::isfinite ( tmp ),"Infinite value" );
00271 return tmp;
00272 };
00274 vec& _beta() {return beta;}
00276 };
00277
00279 class multiBM : public BMEF
00280 {
00281 protected:
00283 eDirich est;
00285 vec β
00286 public:
00288 multiBM ( ) : BMEF ( ),est ( ),beta ( est._beta() )
00289 {
00290 if ( beta.length() >0 ) {last_lognc=est.lognc();}
00291 else{last_lognc=0.0;}
00292 }
00294 multiBM ( const multiBM &B ) : BMEF ( B ),est ( B.est ),beta ( est._beta() ) {}
00296 void set_statistics ( const BM* mB0 ) {const multiBM* mB=dynamic_cast<const multiBM*> ( mB0 ); beta=mB->beta;}
00297 void bayes ( const vec &dt )
00298 {
00299 if ( frg<1.0 ) {beta*=frg;last_lognc=est.lognc();}
00300 beta+=dt;
00301 if ( evalll ) {ll=est.lognc()-last_lognc;}
00302 }
00303 double logpred ( const vec &dt ) const
00304 {
00305 eDirich pred ( est );
00306 vec &beta = pred._beta();
00307
00308 double lll;
00309 if ( frg<1.0 )
00310 {beta*=frg;lll=pred.lognc();}
00311 else
00312 if ( evalll ) {lll=last_lognc;}
00313 else{lll=pred.lognc();}
00314
00315 beta+=dt;
00316 return pred.lognc()-lll;
00317 }
00318 void flatten ( const BMEF* B )
00319 {
00320 const multiBM* E=dynamic_cast<const multiBM*> ( B );
00321
00322 const vec &Eb=E->beta;
00323 beta*= ( sum ( Eb ) /sum ( beta ) );
00324 if ( evalll ) {last_lognc=est.lognc();}
00325 }
00326 const epdf& posterior() const {return est;};
00327 const eDirich* _e() const {return &est;};
00328 void set_parameters ( const vec &beta0 )
00329 {
00330 est.set_parameters ( beta0 );
00331 if ( evalll ) {last_lognc=est.lognc();}
00332 }
00333 };
00334
00344 class egamma : public eEF
00345 {
00346 protected:
00348 vec alpha;
00350 vec beta;
00351 public :
00354 egamma ( ) :eEF ( ), alpha ( 0 ), beta ( 0 ) {};
00355 egamma ( const vec &a, const vec &b ) {set_parameters ( a, b );};
00356 void set_parameters ( const vec &a, const vec &b ) {alpha=a,beta=b;dim = alpha.length();};
00358
00359 vec sample() const;
00361
00362 double evallog ( const vec &val ) const;
00363 double lognc () const;
00365 vec& _alpha() {return alpha;}
00366 vec& _beta() {return beta;}
00367 vec mean() const {return elem_div ( alpha,beta );}
00368 vec variance() const {return elem_div ( alpha,elem_mult ( beta,beta ) ); }
00369 };
00370
00387 class eigamma : public egamma
00388 {
00389 protected:
00390 public :
00395
00396 vec sample() const {return 1.0/egamma::sample();};
00398 vec mean() const {return elem_div ( beta,alpha-1 );}
00399 vec variance() const {vec mea=mean(); return elem_div ( elem_mult ( mea,mea ),alpha-2 );}
00400 };
00401
00403
00404
00405
00406
00407
00408
00410
00411
00412
00413
00414
00415
00416
00418
00419 class euni: public epdf
00420 {
00421 protected:
00423 vec low;
00425 vec high;
00427 vec distance;
00429 double nk;
00431 double lnk;
00432 public:
00435 euni ( ) :epdf ( ) {}
00436 euni ( const vec &low0, const vec &high0 ) {set_parameters ( low0,high0 );}
00437 void set_parameters ( const vec &low0, const vec &high0 )
00438 {
00439 distance = high0-low0;
00440 it_assert_debug ( min ( distance ) >0.0,"bad support" );
00441 low = low0;
00442 high = high0;
00443 nk = prod ( 1.0/distance );
00444 lnk = log ( nk );
00445 dim = low.length();
00446 }
00448
00449 double eval ( const vec &val ) const {return nk;}
00450 double evallog ( const vec &val ) const {return lnk;}
00451 vec sample() const
00452 {
00453 vec smp ( dim );
00454 #pragma omp critical
00455 UniRNG.sample_vector ( dim ,smp );
00456 return low+elem_mult ( distance,smp );
00457 }
00459 vec mean() const {return ( high-low ) /2.0;}
00460 vec variance() const {return ( pow ( high,2 ) +pow ( low,2 ) +elem_mult ( high,low ) ) /3.0;}
00461 };
00462
00463
00469 template<class sq_T>
00470 class mlnorm : public mEF
00471 {
00472 protected:
00474 enorm<sq_T> epdf;
00475 mat A;
00476 vec mu_const;
00477 vec& _mu;
00478 public:
00481 mlnorm ( ) :mEF (),epdf ( ),A ( ),_mu ( epdf._mu() ) {ep =&epdf; };
00482 mlnorm ( const mat &A, const vec &mu0, const sq_T &R ) :epdf ( ),_mu ( epdf._mu() )
00483 {
00484 ep =&epdf; set_parameters ( A,mu0,R );
00485 };
00487 void set_parameters ( const mat &A, const vec &mu0, const sq_T &R );
00490 void condition ( const vec &cond );
00491
00493 vec& _mu_const() {return mu_const;}
00495 mat& _A() {return A;}
00497 mat _R() {return epdf._R().to_mat();}
00498
00499 template<class sq_M>
00500 friend std::ostream &operator<< ( std::ostream &os, mlnorm<sq_M> &ml );
00501 };
00502
00504 template<class sq_T>
00505 class mgnorm : public mEF
00506 {
00507 protected:
00509 enorm<sq_T> epdf;
00510 vec μ
00511 fnc* g;
00512 public:
00514 mgnorm() :mu ( epdf._mu() ) {ep=&epdf;}
00516 void set_parameters ( fnc* g0, const sq_T &R0 ) {g=g0; epdf.set_parameters ( zeros ( g->dimension() ), R0 );}
00517 void condition ( const vec &cond ) {mu=g->eval ( cond );};
00518
00519
00547 void from_setting( const Setting &root )
00548 {
00549 fnc* g = UI::build<fnc>( root, "g" );
00550
00551 mat R;
00552 if ( root.exists( "dR" ) )
00553 {
00554 vec dR;
00555 UI::get( dR, root, "dR" );
00556 R=diag(dR);
00557 }
00558 else
00559 UI::get( R, root, "R");
00560
00561 set_parameters(g,R);
00562 }
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574 };
00575
00576 UIREGISTER(mgnorm<chmat>);
00577
00578
00586 class mlstudent : public mlnorm<ldmat>
00587 {
00588 protected:
00589 ldmat Lambda;
00590 ldmat &_R;
00591 ldmat Re;
00592 public:
00593 mlstudent ( ) :mlnorm<ldmat> (),
00594 Lambda (), _R ( epdf._R() ) {}
00595 void set_parameters ( const mat &A0, const vec &mu0, const ldmat &R0, const ldmat& Lambda0 )
00596 {
00597 it_assert_debug ( A0.rows() ==mu0.length(),"" );
00598 it_assert_debug ( R0.rows() ==A0.rows(),"" );
00599
00600 epdf.set_parameters ( mu0,Lambda );
00601 A = A0;
00602 mu_const = mu0;
00603 Re=R0;
00604 Lambda = Lambda0;
00605 }
00606 void condition ( const vec &cond )
00607 {
00608 _mu = A*cond + mu_const;
00609 double zeta;
00610
00611 if ( ( cond.length() +1 ) ==Lambda.rows() )
00612 {
00613 zeta = Lambda.invqform ( concat ( cond, vec_1 ( 1.0 ) ) );
00614 }
00615 else
00616 {
00617 zeta = Lambda.invqform ( cond );
00618 }
00619 _R = Re;
00620 _R*= ( 1+zeta );
00621 };
00622
00623 };
00633 class mgamma : public mEF
00634 {
00635 protected:
00637 egamma epdf;
00639 double k;
00641 vec &_beta;
00642
00643 public:
00645 mgamma ( ) : mEF ( ), epdf (), _beta ( epdf._beta() ) {ep=&epdf;};
00647 void set_parameters ( double k, const vec &beta0 );
00648 void condition ( const vec &val ) {_beta=k/val;};
00649 };
00650
00660 class migamma : public mEF
00661 {
00662 protected:
00664 eigamma epdf;
00666 double k;
00668 vec &_alpha;
00670 vec &_beta;
00671
00672 public:
00675 migamma ( ) : mEF (), epdf ( ), _alpha ( epdf._alpha() ), _beta ( epdf._beta() ) {ep=&epdf;};
00676 migamma ( const migamma &m ) : mEF (), epdf ( m.epdf ), _alpha ( epdf._alpha() ), _beta ( epdf._beta() ) {ep=&epdf;};
00678
00680 void set_parameters ( int len, double k0 )
00681 {
00682 k=k0;
00683 epdf.set_parameters ( ( 1.0/ ( k*k ) +2.0 ) *ones ( len ) , ones ( len ) );
00684 dimc = dimension();
00685 };
00686 void condition ( const vec &val )
00687 {
00688 _beta=elem_mult ( val, ( _alpha-1.0 ) );
00689 };
00690 };
00691
00692
00704 class mgamma_fix : public mgamma
00705 {
00706 protected:
00708 double l;
00710 vec refl;
00711 public:
00713 mgamma_fix ( ) : mgamma ( ),refl () {};
00715 void set_parameters ( double k0 , vec ref0, double l0 )
00716 {
00717 mgamma::set_parameters ( k0, ref0 );
00718 refl=pow ( ref0,1.0-l0 );l=l0;
00719 dimc=dimension();
00720 };
00721
00722 void condition ( const vec &val ) {vec mean=elem_mult ( refl,pow ( val,l ) ); _beta=k/mean;};
00723 };
00724
00725
00738 class migamma_ref : public migamma
00739 {
00740 protected:
00742 double l;
00744 vec refl;
00745 public:
00747 migamma_ref ( ) : migamma (),refl ( ) {};
00749 void set_parameters ( double k0 , vec ref0, double l0 )
00750 {
00751 migamma::set_parameters ( ref0.length(), k0 );
00752 refl=pow ( ref0,1.0-l0 );
00753 l=l0;
00754 dimc = dimension();
00755 };
00756
00757 void condition ( const vec &val )
00758 {
00759 vec mean=elem_mult ( refl,pow ( val,l ) );
00760 migamma::condition ( mean );
00761 };
00762
00783 void from_setting( const Setting &root );
00784
00785
00786 };
00787
00788
00789 UIREGISTER(migamma_ref);
00790
00800 class elognorm: public enorm<ldmat>
00801 {
00802 public:
00803 vec sample() const {return exp ( enorm<ldmat>::sample() );};
00804 vec mean() const {vec var=enorm<ldmat>::variance();return exp ( mu - 0.5*var );};
00805
00806 };
00807
00819 class mlognorm : public mpdf
00820 {
00821 protected:
00822 elognorm eno;
00824 double sig2;
00826 vec μ
00827 public:
00829 mlognorm ( ) : eno (), mu ( eno._mu() ) {ep=&eno;};
00831 void set_parameters ( int size, double k )
00832 {
00833 sig2 = 0.5*log ( k*k+1 );
00834 eno.set_parameters ( zeros ( size ),2*sig2*eye ( size ) );
00835
00836 dimc = size;
00837 };
00838
00839 void condition ( const vec &val )
00840 {
00841 mu=log ( val )-sig2;
00842 };
00843
00862 void from_setting( const Setting &root );
00863
00864
00865
00866 };
00867
00868 UIREGISTER(mlognorm);
00869
00873 class eWishartCh : public epdf
00874 {
00875 protected:
00877 chmat Y;
00879 int p;
00881 double delta;
00882 public:
00883 void set_parameters ( const mat &Y0, const double delta0 ) {Y=chmat ( Y0 );delta=delta0; p=Y.rows(); dim = p*p; }
00884 mat sample_mat() const
00885 {
00886 mat X=zeros ( p,p );
00887
00888
00889 for ( int i=0;i<p;i++ )
00890 {
00891 GamRNG.setup ( 0.5* ( delta-i ) , 0.5 );
00892 #pragma omp critical
00893 X ( i,i ) =sqrt ( GamRNG() );
00894 }
00895
00896 for ( int i=0;i<p;i++ )
00897 {
00898 for ( int j=i+1;j<p;j++ )
00899 {
00900 #pragma omp critical
00901 X ( i,j ) =NorRNG.sample();
00902 }
00903 }
00904 return X*Y._Ch();
00905 }
00906 vec sample () const
00907 {
00908 return vec ( sample_mat()._data(),p*p );
00909 }
00911 void setY ( const mat &Ch0 ) {copy_vector ( dim,Ch0._data(), Y._Ch()._data() );}
00913 void _setY ( const vec &ch0 ) {copy_vector ( dim, ch0._data(), Y._Ch()._data() ); }
00915 const chmat& getY()const {return Y;}
00916 };
00917
00918 class eiWishartCh: public epdf
00919 {
00920 protected:
00921 eWishartCh W;
00922 int p;
00923 double delta;
00924 public:
00925 void set_parameters ( const mat &Y0, const double delta0) {
00926 delta = delta0;
00927 W.set_parameters ( inv ( Y0 ),delta0 );
00928 dim = W.dimension(); p=Y0.rows();
00929 }
00930 vec sample() const {mat iCh; iCh=inv ( W.sample_mat() ); return vec ( iCh._data(),dim );}
00931 void _setY ( const vec &y0 )
00932 {
00933 mat Ch ( p,p );
00934 mat iCh ( p,p );
00935 copy_vector ( dim, y0._data(), Ch._data() );
00936
00937 iCh=inv ( Ch );
00938 W.setY ( iCh );
00939 }
00940 virtual double evallog ( const vec &val ) const {
00941 chmat X(p);
00942 const chmat& Y=W.getY();
00943
00944 copy_vector(p*p,val._data(),X._Ch()._data());
00945 chmat iX(p);X.inv(iX);
00946
00947
00948 mat M=Y.to_mat()*iX.to_mat();
00949
00950 double log1 = 0.5*p*(2*Y.logdet())-0.5*(delta+p+1)*(2*X.logdet())-0.5*trace(M);
00951
00952
00953
00954
00955
00956
00957
00958
00959
00960 return log1;
00961 };
00962
00963 };
00964
00965 class rwiWishartCh : public mpdf
00966 {
00967 protected:
00968 eiWishartCh eiW;
00970 double sqd;
00971
00972 vec refl;
00973 double l;
00974 int p;
00975 public:
00976 void set_parameters ( int p0, double k, vec ref0, double l0 )
00977 {
00978 p=p0;
00979 double delta = 2/(k*k)+p+3;
00980 sqd=sqrt ( delta-p-1 );
00981 l=l0;
00982 refl=pow(ref0,1-l);
00983
00984 eiW.set_parameters ( eye ( p ),delta );
00985 ep=&eiW;
00986 dimc=eiW.dimension();
00987 }
00988 void condition ( const vec &c ) {
00989 vec z=c;
00990 int ri=0;
00991 for(int i=0;i<p*p;i+=(p+1)){
00992 z(i) = pow(z(i),l)*refl(ri);
00993 ri++;
00994 }
00995
00996 eiW._setY ( sqd*z );
00997 }
00998 };
00999
01001 enum RESAMPLING_METHOD { MULTINOMIAL = 0, STRATIFIED = 1, SYSTEMATIC = 3 };
01007 class eEmp: public epdf
01008 {
01009 protected :
01011 int n;
01013 vec w;
01015 Array<vec> samples;
01016 public:
01019 eEmp ( ) :epdf ( ),w ( ),samples ( ) {};
01021 eEmp ( const eEmp &e ) : epdf ( e ), w ( e.w ), samples ( e.samples ) {};
01023
01025 void set_statistics ( const vec &w0, const epdf* pdf0 );
01027 void set_statistics ( const epdf* pdf0 , int n ) {set_statistics ( ones ( n ) /n,pdf0 );};
01029 void set_samples ( const epdf* pdf0 );
01031 void set_parameters ( int n0, bool copy=true ) {n=n0; w.set_size ( n0,copy );samples.set_size ( n0,copy );};
01033 vec& _w() {return w;};
01035 const vec& _w() const {return w;};
01037 Array<vec>& _samples() {return samples;};
01039 const Array<vec>& _samples() const {return samples;};
01041 ivec resample ( RESAMPLING_METHOD method=SYSTEMATIC );
01043 vec sample() const {it_error ( "Not implemented" );return 0;}
01045 double evallog ( const vec &val ) const {it_error ( "Not implemented" );return 0.0;}
01046 vec mean() const
01047 {
01048 vec pom=zeros ( dim );
01049 for ( int i=0;i<n;i++ ) {pom+=samples ( i ) *w ( i );}
01050 return pom;
01051 }
01052 vec variance() const
01053 {
01054 vec pom=zeros ( dim );
01055 for ( int i=0;i<n;i++ ) {pom+=pow ( samples ( i ),2 ) *w ( i );}
01056 return pom-pow ( mean(),2 );
01057 }
01059 void qbounds ( vec &lb, vec &ub, double perc=0.95 ) const
01060 {
01061
01062 lb.set_size ( dim );
01063 ub.set_size ( dim );
01064 lb = std::numeric_limits<double>::infinity();
01065 ub = -std::numeric_limits<double>::infinity();
01066 int j;
01067 for ( int i=0;i<n;i++ )
01068 {
01069 for ( j=0;j<dim; j++ )
01070 {
01071 if ( samples ( i ) ( j ) <lb ( j ) ) {lb ( j ) =samples ( i ) ( j );}
01072 if ( samples ( i ) ( j ) >ub ( j ) ) {ub ( j ) =samples ( i ) ( j );}
01073 }
01074 }
01075 }
01076 };
01077
01078
01080
01081 template<class sq_T>
01082 void enorm<sq_T>::set_parameters ( const vec &mu0, const sq_T &R0 )
01083 {
01084
01085 mu = mu0;
01086 R = R0;
01087 dim = mu0.length();
01088 };
01089
01090 template<class sq_T>
01091 void enorm<sq_T>::from_setting(const Setting &root){
01092 vec mu;
01093 UI::get(mu,root,"mu");
01094 mat R;
01095 UI::get(R,root,"R");
01096 set_parameters(mu,R);
01097
01098 RV* r = UI::build<RV>(root,"rv");
01099 set_rv(*r);
01100 delete r;
01101 }
01102
01103 template<class sq_T>
01104 void enorm<sq_T>::dupdate ( mat &v, double nu )
01105 {
01106
01107 };
01108
01109
01110
01111
01112
01113
01114 template<class sq_T>
01115 vec enorm<sq_T>::sample() const
01116 {
01117 vec x ( dim );
01118 #pragma omp critical
01119 NorRNG.sample_vector ( dim,x );
01120 vec smp = R.sqrt_mult ( x );
01121
01122 smp += mu;
01123 return smp;
01124 };
01125
01126 template<class sq_T>
01127 mat enorm<sq_T>::sample ( int N ) const
01128 {
01129 mat X ( dim,N );
01130 vec x ( dim );
01131 vec pom;
01132 int i;
01133
01134 for ( i=0;i<N;i++ )
01135 {
01136 #pragma omp critical
01137 NorRNG.sample_vector ( dim,x );
01138 pom = R.sqrt_mult ( x );
01139 pom +=mu;
01140 X.set_col ( i, pom );
01141 }
01142
01143 return X;
01144 };
01145
01146
01147
01148
01149
01150
01151
01152
01153
01154 template<class sq_T>
01155 double enorm<sq_T>::evallog_nn ( const vec &val ) const
01156 {
01157
01158 double tmp=-0.5* ( R.invqform ( mu-val ) );
01159 return tmp;
01160 };
01161
01162 template<class sq_T>
01163 inline double enorm<sq_T>::lognc () const
01164 {
01165
01166 double tmp=0.5* ( R.cols() * 1.83787706640935 +R.logdet() );
01167 return tmp;
01168 };
01169
01170 template<class sq_T>
01171 void mlnorm<sq_T>::set_parameters ( const mat &A0, const vec &mu0, const sq_T &R0 )
01172 {
01173 it_assert_debug ( A0.rows() ==mu0.length(),"" );
01174 it_assert_debug ( A0.rows() ==R0.rows(),"" );
01175
01176 epdf.set_parameters ( zeros ( A0.rows() ),R0 );
01177 A = A0;
01178 mu_const = mu0;
01179 dimc=A0.cols();
01180 }
01181
01182
01183
01184
01185
01186
01187
01188
01189
01190
01191
01192
01193
01194
01195
01196
01197
01198
01199
01200
01201
01202
01203
01204
01205
01206
01207 template<class sq_T>
01208 void mlnorm<sq_T>::condition ( const vec &cond )
01209 {
01210 _mu = A*cond + mu_const;
01211
01212 }
01213
01214 template<class sq_T>
01215 enorm<sq_T>* enorm<sq_T>::marginal ( const RV &rvn ) const
01216 {
01217 it_assert_debug ( isnamed(), "rv description is not assigned" );
01218 ivec irvn = rvn.dataind ( rv );
01219
01220 sq_T Rn ( R,irvn );
01221
01222 enorm<sq_T>* tmp = new enorm<sq_T>;
01223 tmp->set_rv ( rvn );
01224 tmp->set_parameters ( mu ( irvn ), Rn );
01225 return tmp;
01226 }
01227
01228 template<class sq_T>
01229 mpdf* enorm<sq_T>::condition ( const RV &rvn ) const
01230 {
01231
01232 it_assert_debug ( isnamed(),"rvs are not assigned" );
01233
01234 RV rvc = rv.subt ( rvn );
01235 it_assert_debug ( ( rvc._dsize() +rvn._dsize() ==rv._dsize() ),"wrong rvn" );
01236
01237 ivec irvn = rvn.dataind ( rv );
01238 ivec irvc = rvc.dataind ( rv );
01239 ivec perm=concat ( irvn , irvc );
01240 sq_T Rn ( R,perm );
01241
01242
01243 mat S=Rn.to_mat();
01244
01245 int n=rvn._dsize()-1;
01246 int end=R.rows()-1;
01247 mat S11 = S.get ( 0,n, 0, n );
01248 mat S12 = S.get ( 0, n , rvn._dsize(), end );
01249 mat S22 = S.get ( rvn._dsize(), end, rvn._dsize(), end );
01250
01251 vec mu1 = mu ( irvn );
01252 vec mu2 = mu ( irvc );
01253 mat A=S12*inv ( S22 );
01254 sq_T R_n ( S11 - A *S12.T() );
01255
01256 mlnorm<sq_T>* tmp=new mlnorm<sq_T> ( );
01257 tmp->set_rv ( rvn ); tmp->set_rvc ( rvc );
01258 tmp->set_parameters ( A,mu1-A*mu2,R_n );
01259 return tmp;
01260 }
01261
01263
01264 template<class sq_T>
01265 std::ostream &operator<< ( std::ostream &os, mlnorm<sq_T> &ml )
01266 {
01267 os << "A:"<< ml.A<<endl;
01268 os << "mu:"<< ml.mu_const<<endl;
01269 os << "R:" << ml.epdf._R().to_mat() <<endl;
01270 return os;
01271 };
01272
01273 }
01274 #endif //EF_H