00001
00013 #ifndef EF_H
00014 #define EF_H
00015
00016
00017 #include "../base/bdmbase.h"
00018 #include "../math/chmat.h"
00019
00020 namespace bdm
00021 {
00022
00023
00025 extern Uniform_RNG UniRNG;
00027 extern Normal_RNG NorRNG;
00029 extern Gamma_RNG GamRNG;
00030
00037 class eEF : public epdf
00038 {
00039 public:
00040
00042 eEF ( ) :epdf ( ) {};
00044 virtual double lognc() const =0;
00046 virtual void dupdate ( mat &v ) {it_error ( "Not implemented" );};
00048 virtual double evallog_nn ( const vec &val ) const{it_error ( "Not implemented" );return 0.0;};
00050 virtual double evallog ( const vec &val ) const {
00051 double tmp;
00052 tmp= evallog_nn ( val )-lognc();
00053 it_assert_debug ( std::isfinite ( tmp ),"Infinite value" );
00054 return tmp;}
00056 virtual vec evallog ( const mat &Val ) const
00057 {
00058 vec x ( Val.cols() );
00059 for ( int i=0;i<Val.cols();i++ ) {x ( i ) =evallog_nn ( Val.get_col ( i ) ) ;}
00060 return x-lognc();
00061 }
00063 virtual void pow ( double p ) {it_error ( "Not implemented" );};
00064 };
00065
00072 class mEF : public mpdf
00073 {
00074
00075 public:
00077 mEF ( ) :mpdf ( ) {};
00078 };
00079
00081 class BMEF : public BM
00082 {
00083 protected:
00085 double frg;
00087 double last_lognc;
00088 public:
00090 BMEF ( double frg0=1.0 ) :BM ( ), frg ( frg0 ) {}
00092 BMEF ( const BMEF &B ) :BM ( B ), frg ( B.frg ), last_lognc ( B.last_lognc ) {}
00094 virtual void set_statistics ( const BMEF* BM0 ) {it_error ( "Not implemented" );};
00096 virtual void bayes ( const vec &data, const double w ) {};
00097
00098 void bayes ( const vec &dt );
00100 virtual void flatten ( const BMEF * B ) {it_error ( "Not implemented" );}
00102
00103
00104 BMEF* _copy_ () const {it_error ( "function _copy_ not implemented for this BM" ); return NULL;};
00105 };
00106
00107 template<class sq_T>
00108 class mlnorm;
00109
00115 template<class sq_T>
00116 class enorm : public eEF
00117 {
00118 protected:
00120 vec mu;
00122 sq_T R;
00123 public:
00126
00127 enorm ( ) :eEF ( ), mu ( ),R ( ) {};
00128 enorm ( const vec &mu,const sq_T &R ) {set_parameters ( mu,R );}
00129 void set_parameters ( const vec &mu,const sq_T &R );
00130 void from_setting(const Setting &root);
00131 void validate() {
00132 it_assert(mu.length()==R.rows(),"parameters mismatch");
00133 dim = mu.length();
00134 }
00136
00139
00141 void dupdate ( mat &v,double nu=1.0 );
00142
00143 vec sample() const;
00144 mat sample ( int N ) const;
00145 double evallog_nn ( const vec &val ) const;
00146 double lognc () const;
00147 vec mean() const {return mu;}
00148 vec variance() const {return diag ( R.to_mat() );}
00149
00150 mpdf* condition ( const RV &rvn ) const ;
00151 enorm<sq_T>* marginal ( const RV &rv ) const;
00152
00154
00157
00158 vec& _mu() {return mu;}
00159 void set_mu ( const vec mu0 ) { mu=mu0;}
00160 sq_T& _R() {return R;}
00161 const sq_T& _R() const {return R;}
00163
00164 };
00165 UIREGISTER(enorm<chmat>);
00166 UIREGISTER(enorm<ldmat>);
00167 UIREGISTER(enorm<fsqmat>);
00168
00169
00176 class egiw : public eEF
00177 {
00178 protected:
00180 ldmat V;
00182 double nu;
00184 int dimx;
00186 int nPsi;
00187 public:
00190 egiw() :eEF() {};
00191 egiw ( int dimx0, ldmat V0, double nu0=-1.0 ) :eEF() {set_parameters ( dimx0,V0, nu0 );};
00192
00193 void set_parameters ( int dimx0, ldmat V0, double nu0=-1.0 )
00194 {
00195 dimx=dimx0;
00196 nPsi = V0.rows()-dimx;
00197 dim = dimx* ( dimx+nPsi );
00198
00199 V=V0;
00200 if ( nu0<0 )
00201 {
00202 nu = 0.1 +nPsi +2*dimx +2;
00203
00204 }
00205 else
00206 {
00207 nu=nu0;
00208 }
00209 }
00211
00212 vec sample() const;
00213 vec mean() const;
00214 vec variance() const;
00215
00217 vec est_theta() const;
00218
00220 ldmat est_theta_cov() const;
00221
00222 void mean_mat ( mat &M, mat&R ) const;
00224 double evallog_nn ( const vec &val ) const;
00225 double lognc () const;
00226 void pow ( double p ) {V*=p;nu*=p;};
00227
00230
00231 ldmat& _V() {return V;}
00232 const ldmat& _V() const {return V;}
00233 double& _nu() {return nu;}
00234 const double& _nu() const {return nu;}
00235 void from_setting(const Setting &set){
00236 set.lookupValue("nu",nu);
00237 set.lookupValue("dimx",dimx);
00238 mat V;
00239 UI::get(V,set,"V");
00240 set_parameters(dimx, V, nu);
00241 RV* rv=UI::build<RV>(set,"rv");
00242 set_rv(*rv);
00243 delete rv;
00244 }
00246 };
00247 UIREGISTER(egiw);
00248
00257 class eDirich: public eEF
00258 {
00259 protected:
00261 vec beta;
00262 public:
00265
00266 eDirich () : eEF ( ) {};
00267 eDirich ( const eDirich &D0 ) : eEF () {set_parameters ( D0.beta );};
00268 eDirich ( const vec &beta0 ) {set_parameters ( beta0 );};
00269 void set_parameters ( const vec &beta0 )
00270 {
00271 beta= beta0;
00272 dim = beta.length();
00273 }
00275
00276 vec sample() const {it_error ( "Not implemented" );return vec_1 ( 0.0 );};
00277 vec mean() const {return beta/sum(beta);};
00278 vec variance() const {double gamma =sum(beta); return elem_mult ( beta, ( beta+1 ) ) / ( gamma* ( gamma+1 ) );}
00280 double evallog_nn ( const vec &val ) const
00281 {
00282 double tmp; tmp= ( beta-1 ) *log ( val ); it_assert_debug ( std::isfinite ( tmp ),"Infinite value" );
00283 return tmp;
00284 };
00285 double lognc () const
00286 {
00287 double tmp;
00288 double gam=sum ( beta );
00289 double lgb=0.0;
00290 for ( int i=0;i<beta.length();i++ ) {lgb+=lgamma ( beta ( i ) );}
00291 tmp= lgb-lgamma ( gam );
00292 it_assert_debug ( std::isfinite ( tmp ),"Infinite value" );
00293 return tmp;
00294 };
00296 vec& _beta() {return beta;}
00298 };
00299
00301 class multiBM : public BMEF
00302 {
00303 protected:
00305 eDirich est;
00307 vec β
00308 public:
00310 multiBM ( ) : BMEF ( ),est ( ),beta ( est._beta() )
00311 {
00312 if ( beta.length() >0 ) {last_lognc=est.lognc();}
00313 else{last_lognc=0.0;}
00314 }
00316 multiBM ( const multiBM &B ) : BMEF ( B ),est ( B.est ),beta ( est._beta() ) {}
00318 void set_statistics ( const BM* mB0 ) {const multiBM* mB=dynamic_cast<const multiBM*> ( mB0 ); beta=mB->beta;}
00319 void bayes ( const vec &dt )
00320 {
00321 if ( frg<1.0 ) {beta*=frg;last_lognc=est.lognc();}
00322 beta+=dt;
00323 if ( evalll ) {ll=est.lognc()-last_lognc;}
00324 }
00325 double logpred ( const vec &dt ) const
00326 {
00327 eDirich pred ( est );
00328 vec &beta = pred._beta();
00329
00330 double lll;
00331 if ( frg<1.0 )
00332 {beta*=frg;lll=pred.lognc();}
00333 else
00334 if ( evalll ) {lll=last_lognc;}
00335 else{lll=pred.lognc();}
00336
00337 beta+=dt;
00338 return pred.lognc()-lll;
00339 }
00340 void flatten ( const BMEF* B )
00341 {
00342 const multiBM* E=dynamic_cast<const multiBM*> ( B );
00343
00344 const vec &Eb=E->beta;
00345 beta*= ( sum ( Eb ) /sum ( beta ) );
00346 if ( evalll ) {last_lognc=est.lognc();}
00347 }
00348 const epdf& posterior() const {return est;};
00349 const eDirich* _e() const {return &est;};
00350 void set_parameters ( const vec &beta0 )
00351 {
00352 est.set_parameters ( beta0 );
00353 if ( evalll ) {last_lognc=est.lognc();}
00354 }
00355 };
00356
00366 class egamma : public eEF
00367 {
00368 protected:
00370 vec alpha;
00372 vec beta;
00373 public :
00376 egamma ( ) :eEF ( ), alpha ( 0 ), beta ( 0 ) {};
00377 egamma ( const vec &a, const vec &b ) {set_parameters ( a, b );};
00378 void set_parameters ( const vec &a, const vec &b ) {alpha=a,beta=b;dim = alpha.length();};
00380
00381 vec sample() const;
00383
00384 double evallog ( const vec &val ) const;
00385 double lognc () const;
00387 vec& _alpha() {return alpha;}
00388 vec& _beta() {return beta;}
00389 vec mean() const {return elem_div ( alpha,beta );}
00390 vec variance() const {return elem_div ( alpha,elem_mult ( beta,beta ) ); }
00391
00400 void from_setting(const Setting &set){
00401 epdf::from_setting(set);
00402 UI::get(alpha,set,"alpha");
00403 UI::get(beta,set,"beta");
00404 validate();
00405 }
00406 void validate(){
00407 it_assert(alpha.length() ==beta.length(), "parameters do not match");
00408 dim =alpha.length();
00409 }
00410 };
00411 UIREGISTER(egamma);
00428 class eigamma : public egamma
00429 {
00430 protected:
00431 public :
00436
00437 vec sample() const {return 1.0/egamma::sample();};
00439 vec mean() const {return elem_div ( beta,alpha-1 );}
00440 vec variance() const {vec mea=mean(); return elem_div ( elem_mult ( mea,mea ),alpha-2 );}
00441 };
00442
00444
00445
00446
00447
00448
00449
00451
00452
00453
00454
00455
00456
00457
00459
00460 class euni: public epdf
00461 {
00462 protected:
00464 vec low;
00466 vec high;
00468 vec distance;
00470 double nk;
00472 double lnk;
00473 public:
00476 euni ( ) :epdf ( ) {}
00477 euni ( const vec &low0, const vec &high0 ) {set_parameters ( low0,high0 );}
00478 void set_parameters ( const vec &low0, const vec &high0 )
00479 {
00480 distance = high0-low0;
00481 it_assert_debug ( min ( distance ) >0.0,"bad support" );
00482 low = low0;
00483 high = high0;
00484 nk = prod ( 1.0/distance );
00485 lnk = log ( nk );
00486 dim = low.length();
00487 }
00489
00490 double eval ( const vec &val ) const {return nk;}
00491 double evallog ( const vec &val ) const {return lnk;}
00492 vec sample() const
00493 {
00494 vec smp ( dim );
00495 #pragma omp critical
00496 UniRNG.sample_vector ( dim ,smp );
00497 return low+elem_mult ( distance,smp );
00498 }
00500 vec mean() const {return ( high-low ) /2.0;}
00501 vec variance() const {return ( pow ( high,2 ) +pow ( low,2 ) +elem_mult ( high,low ) ) /3.0;}
00510 void from_setting(const Setting &set){
00511 epdf::from_setting(set);
00512 UI::get(high,set,"high");
00513 UI::get(low,set,"low");
00514 }
00515 };
00516
00517
00523 template<class sq_T>
00524 class mlnorm : public mEF
00525 {
00526 protected:
00528 enorm<sq_T> epdf;
00529 mat A;
00530 vec mu_const;
00531 vec& _mu;
00532 public:
00535 mlnorm ( ) :mEF (),epdf ( ),A ( ),_mu ( epdf._mu() ) {ep =&epdf; };
00536 mlnorm ( const mat &A, const vec &mu0, const sq_T &R ) :epdf ( ),_mu ( epdf._mu() )
00537 {
00538 ep =&epdf; set_parameters ( A,mu0,R );
00539 };
00541 void set_parameters ( const mat &A, const vec &mu0, const sq_T &R );
00544 void condition ( const vec &cond );
00545
00547 vec& _mu_const() {return mu_const;}
00549 mat& _A() {return A;}
00551 mat _R() {return epdf._R().to_mat();}
00552
00553 template<class sq_M>
00554 friend std::ostream &operator<< ( std::ostream &os, mlnorm<sq_M> &ml );
00555 };
00556
00558 template<class sq_T>
00559 class mgnorm : public mEF
00560 {
00561 protected:
00563 enorm<sq_T> epdf;
00564 vec μ
00565 fnc* g;
00566 public:
00568 mgnorm() :mu ( epdf._mu() ) {ep=&epdf;}
00570 void set_parameters ( fnc* g0, const sq_T &R0 ) {g=g0; epdf.set_parameters ( zeros ( g->dimension() ), R0 );}
00571 void condition ( const vec &cond ) {mu=g->eval ( cond );};
00572
00573
00601 void from_setting( const Setting &set )
00602 {
00603 fnc* g = UI::build<fnc>( set, "g" );
00604
00605 mat R;
00606 if ( set.exists( "dR" ) )
00607 {
00608 vec dR;
00609 UI::get( dR, set, "dR" );
00610 R=diag(dR);
00611 }
00612 else
00613 UI::get( R, set, "R");
00614
00615 set_parameters(g,R);
00616 }
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626
00627
00628 };
00629
00630 UIREGISTER(mgnorm<chmat>);
00631
00632
00640 class mlstudent : public mlnorm<ldmat>
00641 {
00642 protected:
00643 ldmat Lambda;
00644 ldmat &_R;
00645 ldmat Re;
00646 public:
00647 mlstudent ( ) :mlnorm<ldmat> (),
00648 Lambda (), _R ( epdf._R() ) {}
00649 void set_parameters ( const mat &A0, const vec &mu0, const ldmat &R0, const ldmat& Lambda0 )
00650 {
00651 it_assert_debug ( A0.rows() ==mu0.length(),"" );
00652 it_assert_debug ( R0.rows() ==A0.rows(),"" );
00653
00654 epdf.set_parameters ( mu0,Lambda );
00655 A = A0;
00656 mu_const = mu0;
00657 Re=R0;
00658 Lambda = Lambda0;
00659 }
00660 void condition ( const vec &cond )
00661 {
00662 _mu = A*cond + mu_const;
00663 double zeta;
00664
00665 if ( ( cond.length() +1 ) ==Lambda.rows() )
00666 {
00667 zeta = Lambda.invqform ( concat ( cond, vec_1 ( 1.0 ) ) );
00668 }
00669 else
00670 {
00671 zeta = Lambda.invqform ( cond );
00672 }
00673 _R = Re;
00674 _R*= ( 1+zeta );
00675 };
00676
00677 };
00687 class mgamma : public mEF
00688 {
00689 protected:
00691 egamma epdf;
00693 double k;
00695 vec &_beta;
00696
00697 public:
00699 mgamma ( ) : mEF ( ), epdf (), _beta ( epdf._beta() ) {ep=&epdf;};
00701 void set_parameters ( double k, const vec &beta0 );
00702 void condition ( const vec &val ) {_beta=k/val;};
00712 void from_setting(const Setting &set){
00713 mpdf::from_setting(set);
00714 vec betatmp;
00715 UI::get(betatmp,set,"beta");
00716 set.lookupValue("k",k);
00717 set_parameters(k,betatmp);
00718 }
00719 };
00720 UIREGISTER(mgamma);
00721
00731 class migamma : public mEF
00732 {
00733 protected:
00735 eigamma epdf;
00737 double k;
00739 vec &_alpha;
00741 vec &_beta;
00742
00743 public:
00746 migamma ( ) : mEF (), epdf ( ), _alpha ( epdf._alpha() ), _beta ( epdf._beta() ) {ep=&epdf;};
00747 migamma ( const migamma &m ) : mEF (), epdf ( m.epdf ), _alpha ( epdf._alpha() ), _beta ( epdf._beta() ) {ep=&epdf;};
00749
00751 void set_parameters ( int len, double k0 )
00752 {
00753 k=k0;
00754 epdf.set_parameters ( ( 1.0/ ( k*k ) +2.0 ) *ones ( len ) , ones ( len ) );
00755 dimc = dimension();
00756 };
00757 void condition ( const vec &val )
00758 {
00759 _beta=elem_mult ( val, ( _alpha-1.0 ) );
00760 };
00761 };
00762
00763
00775 class mgamma_fix : public mgamma
00776 {
00777 protected:
00779 double l;
00781 vec refl;
00782 public:
00784 mgamma_fix ( ) : mgamma ( ),refl () {};
00786 void set_parameters ( double k0 , vec ref0, double l0 )
00787 {
00788 mgamma::set_parameters ( k0, ref0 );
00789 refl=pow ( ref0,1.0-l0 );l=l0;
00790 dimc=dimension();
00791 };
00792
00793 void condition ( const vec &val ) {vec mean=elem_mult ( refl,pow ( val,l ) ); _beta=k/mean;};
00794 };
00795
00796
00809 class migamma_ref : public migamma
00810 {
00811 protected:
00813 double l;
00815 vec refl;
00816 public:
00818 migamma_ref ( ) : migamma (),refl ( ) {};
00820 void set_parameters ( double k0 , vec ref0, double l0 )
00821 {
00822 migamma::set_parameters ( ref0.length(), k0 );
00823 refl=pow ( ref0,1.0-l0 );
00824 l=l0;
00825 dimc = dimension();
00826 };
00827
00828 void condition ( const vec &val )
00829 {
00830 vec mean=elem_mult ( refl,pow ( val,l ) );
00831 migamma::condition ( mean );
00832 };
00833
00854 void from_setting( const Setting &set );
00855
00856
00857 };
00858
00859
00860 UIREGISTER(migamma_ref);
00861
00871 class elognorm: public enorm<ldmat>
00872 {
00873 public:
00874 vec sample() const {return exp ( enorm<ldmat>::sample() );};
00875 vec mean() const {vec var=enorm<ldmat>::variance();return exp ( mu - 0.5*var );};
00876
00877 };
00878
00890 class mlognorm : public mpdf
00891 {
00892 protected:
00893 elognorm eno;
00895 double sig2;
00897 vec μ
00898 public:
00900 mlognorm ( ) : eno (), mu ( eno._mu() ) {ep=&eno;};
00902 void set_parameters ( int size, double k )
00903 {
00904 sig2 = 0.5*log ( k*k+1 );
00905 eno.set_parameters ( zeros ( size ),2*sig2*eye ( size ) );
00906
00907 dimc = size;
00908 };
00909
00910 void condition ( const vec &val )
00911 {
00912 mu=log ( val )-sig2;
00913 };
00914
00933 void from_setting( const Setting &set );
00934
00935
00936
00937 };
00938
00939 UIREGISTER(mlognorm);
00940
00944 class eWishartCh : public epdf
00945 {
00946 protected:
00948 chmat Y;
00950 int p;
00952 double delta;
00953 public:
00954 void set_parameters ( const mat &Y0, const double delta0 ) {Y=chmat ( Y0 );delta=delta0; p=Y.rows(); dim = p*p; }
00955 mat sample_mat() const
00956 {
00957 mat X=zeros ( p,p );
00958
00959
00960 for ( int i=0;i<p;i++ )
00961 {
00962 GamRNG.setup ( 0.5* ( delta-i ) , 0.5 );
00963 #pragma omp critical
00964 X ( i,i ) =sqrt ( GamRNG() );
00965 }
00966
00967 for ( int i=0;i<p;i++ )
00968 {
00969 for ( int j=i+1;j<p;j++ )
00970 {
00971 #pragma omp critical
00972 X ( i,j ) =NorRNG.sample();
00973 }
00974 }
00975 return X*Y._Ch();
00976 }
00977 vec sample () const
00978 {
00979 return vec ( sample_mat()._data(),p*p );
00980 }
00982 void setY ( const mat &Ch0 ) {copy_vector ( dim,Ch0._data(), Y._Ch()._data() );}
00984 void _setY ( const vec &ch0 ) {copy_vector ( dim, ch0._data(), Y._Ch()._data() ); }
00986 const chmat& getY()const {return Y;}
00987 };
00988
00989 class eiWishartCh: public epdf
00990 {
00991 protected:
00992 eWishartCh W;
00993 int p;
00994 double delta;
00995 public:
00996 void set_parameters ( const mat &Y0, const double delta0) {
00997 delta = delta0;
00998 W.set_parameters ( inv ( Y0 ),delta0 );
00999 dim = W.dimension(); p=Y0.rows();
01000 }
01001 vec sample() const {mat iCh; iCh=inv ( W.sample_mat() ); return vec ( iCh._data(),dim );}
01002 void _setY ( const vec &y0 )
01003 {
01004 mat Ch ( p,p );
01005 mat iCh ( p,p );
01006 copy_vector ( dim, y0._data(), Ch._data() );
01007
01008 iCh=inv ( Ch );
01009 W.setY ( iCh );
01010 }
01011 virtual double evallog ( const vec &val ) const {
01012 chmat X(p);
01013 const chmat& Y=W.getY();
01014
01015 copy_vector(p*p,val._data(),X._Ch()._data());
01016 chmat iX(p);X.inv(iX);
01017
01018
01019 mat M=Y.to_mat()*iX.to_mat();
01020
01021 double log1 = 0.5*p*(2*Y.logdet())-0.5*(delta+p+1)*(2*X.logdet())-0.5*trace(M);
01022
01023
01024
01025
01026
01027
01028
01029
01030
01031 return log1;
01032 };
01033
01034 };
01035
01036 class rwiWishartCh : public mpdf
01037 {
01038 protected:
01039 eiWishartCh eiW;
01041 double sqd;
01042
01043 vec refl;
01044 double l;
01045 int p;
01046 public:
01047 void set_parameters ( int p0, double k, vec ref0, double l0 )
01048 {
01049 p=p0;
01050 double delta = 2/(k*k)+p+3;
01051 sqd=sqrt ( delta-p-1 );
01052 l=l0;
01053 refl=pow(ref0,1-l);
01054
01055 eiW.set_parameters ( eye ( p ),delta );
01056 ep=&eiW;
01057 dimc=eiW.dimension();
01058 }
01059 void condition ( const vec &c ) {
01060 vec z=c;
01061 int ri=0;
01062 for(int i=0;i<p*p;i+=(p+1)){
01063 z(i) = pow(z(i),l)*refl(ri);
01064 ri++;
01065 }
01066
01067 eiW._setY ( sqd*z );
01068 }
01069 };
01070
01072 enum RESAMPLING_METHOD { MULTINOMIAL = 0, STRATIFIED = 1, SYSTEMATIC = 3 };
01078 class eEmp: public epdf
01079 {
01080 protected :
01082 int n;
01084 vec w;
01086 Array<vec> samples;
01087 public:
01090 eEmp ( ) :epdf ( ),w ( ),samples ( ) {};
01092 eEmp ( const eEmp &e ) : epdf ( e ), w ( e.w ), samples ( e.samples ) {};
01094
01096 void set_statistics ( const vec &w0, const epdf* pdf0 );
01098 void set_statistics ( const epdf* pdf0 , int n ) {set_statistics ( ones ( n ) /n,pdf0 );};
01100 void set_samples ( const epdf* pdf0 );
01102 void set_parameters ( int n0, bool copy=true ) {n=n0; w.set_size ( n0,copy );samples.set_size ( n0,copy );};
01104 vec& _w() {return w;};
01106 const vec& _w() const {return w;};
01108 Array<vec>& _samples() {return samples;};
01110 const Array<vec>& _samples() const {return samples;};
01112 ivec resample ( RESAMPLING_METHOD method=SYSTEMATIC );
01114 vec sample() const {it_error ( "Not implemented" );return 0;}
01116 double evallog ( const vec &val ) const {it_error ( "Not implemented" );return 0.0;}
01117 vec mean() const
01118 {
01119 vec pom=zeros ( dim );
01120 for ( int i=0;i<n;i++ ) {pom+=samples ( i ) *w ( i );}
01121 return pom;
01122 }
01123 vec variance() const
01124 {
01125 vec pom=zeros ( dim );
01126 for ( int i=0;i<n;i++ ) {pom+=pow ( samples ( i ),2 ) *w ( i );}
01127 return pom-pow ( mean(),2 );
01128 }
01130 void qbounds ( vec &lb, vec &ub, double perc=0.95 ) const
01131 {
01132
01133 lb.set_size ( dim );
01134 ub.set_size ( dim );
01135 lb = std::numeric_limits<double>::infinity();
01136 ub = -std::numeric_limits<double>::infinity();
01137 int j;
01138 for ( int i=0;i<n;i++ )
01139 {
01140 for ( j=0;j<dim; j++ )
01141 {
01142 if ( samples ( i ) ( j ) <lb ( j ) ) {lb ( j ) =samples ( i ) ( j );}
01143 if ( samples ( i ) ( j ) >ub ( j ) ) {ub ( j ) =samples ( i ) ( j );}
01144 }
01145 }
01146 }
01147 };
01148
01149
01151
01152 template<class sq_T>
01153 void enorm<sq_T>::set_parameters ( const vec &mu0, const sq_T &R0 )
01154 {
01155
01156 mu = mu0;
01157 R = R0;
01158 validate();
01159 };
01160
01161 template<class sq_T>
01162 void enorm<sq_T>::from_setting(const Setting &set){
01163 epdf::from_setting(set);
01164
01165 UI::get(mu,set,"mu");
01166 mat Rtmp;
01167 UI::get(Rtmp,set,"R");
01168 R=Rtmp;
01169 validate();
01170 }
01171
01172 template<class sq_T>
01173 void enorm<sq_T>::dupdate ( mat &v, double nu )
01174 {
01175
01176 };
01177
01178
01179
01180
01181
01182
01183 template<class sq_T>
01184 vec enorm<sq_T>::sample() const
01185 {
01186 vec x ( dim );
01187 #pragma omp critical
01188 NorRNG.sample_vector ( dim,x );
01189 vec smp = R.sqrt_mult ( x );
01190
01191 smp += mu;
01192 return smp;
01193 };
01194
01195 template<class sq_T>
01196 mat enorm<sq_T>::sample ( int N ) const
01197 {
01198 mat X ( dim,N );
01199 vec x ( dim );
01200 vec pom;
01201 int i;
01202
01203 for ( i=0;i<N;i++ )
01204 {
01205 #pragma omp critical
01206 NorRNG.sample_vector ( dim,x );
01207 pom = R.sqrt_mult ( x );
01208 pom +=mu;
01209 X.set_col ( i, pom );
01210 }
01211
01212 return X;
01213 };
01214
01215
01216
01217
01218
01219
01220
01221
01222
01223 template<class sq_T>
01224 double enorm<sq_T>::evallog_nn ( const vec &val ) const
01225 {
01226
01227 double tmp=-0.5* ( R.invqform ( mu-val ) );
01228 return tmp;
01229 };
01230
01231 template<class sq_T>
01232 inline double enorm<sq_T>::lognc () const
01233 {
01234
01235 double tmp=0.5* ( R.cols() * 1.83787706640935 +R.logdet() );
01236 return tmp;
01237 };
01238
01239 template<class sq_T>
01240 void mlnorm<sq_T>::set_parameters ( const mat &A0, const vec &mu0, const sq_T &R0 )
01241 {
01242 it_assert_debug ( A0.rows() ==mu0.length(),"" );
01243 it_assert_debug ( A0.rows() ==R0.rows(),"" );
01244
01245 epdf.set_parameters ( zeros ( A0.rows() ),R0 );
01246 A = A0;
01247 mu_const = mu0;
01248 dimc=A0.cols();
01249 }
01250
01251
01252
01253
01254
01255
01256
01257
01258
01259
01260
01261
01262
01263
01264
01265
01266
01267
01268
01269
01270
01271
01272
01273
01274
01275
01276 template<class sq_T>
01277 void mlnorm<sq_T>::condition ( const vec &cond )
01278 {
01279 _mu = A*cond + mu_const;
01280
01281 }
01282
01283 template<class sq_T>
01284 enorm<sq_T>* enorm<sq_T>::marginal ( const RV &rvn ) const
01285 {
01286 it_assert_debug ( isnamed(), "rv description is not assigned" );
01287 ivec irvn = rvn.dataind ( rv );
01288
01289 sq_T Rn ( R,irvn );
01290
01291 enorm<sq_T>* tmp = new enorm<sq_T>;
01292 tmp->set_rv ( rvn );
01293 tmp->set_parameters ( mu ( irvn ), Rn );
01294 return tmp;
01295 }
01296
01297 template<class sq_T>
01298 mpdf* enorm<sq_T>::condition ( const RV &rvn ) const
01299 {
01300
01301 it_assert_debug ( isnamed(),"rvs are not assigned" );
01302
01303 RV rvc = rv.subt ( rvn );
01304 it_assert_debug ( ( rvc._dsize() +rvn._dsize() ==rv._dsize() ),"wrong rvn" );
01305
01306 ivec irvn = rvn.dataind ( rv );
01307 ivec irvc = rvc.dataind ( rv );
01308 ivec perm=concat ( irvn , irvc );
01309 sq_T Rn ( R,perm );
01310
01311
01312 mat S=Rn.to_mat();
01313
01314 int n=rvn._dsize()-1;
01315 int end=R.rows()-1;
01316 mat S11 = S.get ( 0,n, 0, n );
01317 mat S12 = S.get ( 0, n , rvn._dsize(), end );
01318 mat S22 = S.get ( rvn._dsize(), end, rvn._dsize(), end );
01319
01320 vec mu1 = mu ( irvn );
01321 vec mu2 = mu ( irvc );
01322 mat A=S12*inv ( S22 );
01323 sq_T R_n ( S11 - A *S12.T() );
01324
01325 mlnorm<sq_T>* tmp=new mlnorm<sq_T> ( );
01326 tmp->set_rv ( rvn ); tmp->set_rvc ( rvc );
01327 tmp->set_parameters ( A,mu1-A*mu2,R_n );
01328 return tmp;
01329 }
01330
01332
01333 template<class sq_T>
01334 std::ostream &operator<< ( std::ostream &os, mlnorm<sq_T> &ml )
01335 {
01336 os << "A:"<< ml.A<<endl;
01337 os << "mu:"<< ml.mu_const<<endl;
01338 os << "R:" << ml.epdf._R().to_mat() <<endl;
01339 return os;
01340 };
01341
01342 }
01343 #endif //EF_H