00001
00013 #ifndef EF_H
00014 #define EF_H
00015
00016 #include <itpp/itbase.h>
00017 #include "../math/libDC.h"
00018 #include "libBM.h"
00019 #include "../itpp_ext.h"
00020
00021
00022 using namespace itpp;
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 ( const RV &rv ) :epdf ( rv ) {};
00045 virtual void tupdate ( double phi, mat &vbar, double nubar ) {};
00047 virtual void dupdate ( mat &v,double nu=1.0 ) {};
00048 };
00049
00056 class mEF : public mpdf {
00057
00058 public:
00060 mEF ( const RV &rv0, const RV &rvc0 ) :mpdf ( rv0,rvc0 ) {};
00061 };
00062
00068 template<class sq_T>
00069
00070 class enorm : public eEF {
00071 protected:
00073 vec mu;
00075 sq_T R;
00077 sq_T _iR;
00079 bool cached;
00081 int dim;
00082 public:
00083
00085 enorm ( RV &rv );
00087 void set_parameters ( const vec &mu,const sq_T &R );
00089 void tupdate ( double phi, mat &vbar, double nubar );
00091 void dupdate ( mat &v,double nu=1.0 );
00092
00093 vec sample() const;
00095 mat sample ( int N ) const;
00096 double eval ( const vec &val ) const ;
00097 double evalpdflog ( const vec &val ) const;
00098 vec mean()const {return mu;}
00099
00100
00102 vec* _mu() {return μ}
00103
00105 void _R ( sq_T* &pR, sq_T* &piR ) {
00106 pR=&R;
00107 piR=&_iR;
00108 }
00109
00111 void _cached ( bool what ) {cached=what;}
00112 };
00113
00123 class egamma : public eEF {
00124 protected:
00126 vec alpha;
00128 vec beta;
00129 public :
00131 egamma ( const RV &rv ) :eEF ( rv ) {};
00133 void set_parameters ( const vec &a, const vec &b ) {alpha=a,beta=b;};
00134 vec sample() const;
00136 mat sample ( int N ) const;
00137 double evalpdflog ( const vec &val ) const;
00139 void _param ( vec* &a, vec* &b ) {a=αb=β};
00140 vec mean()const {vec pom(alpha); pom/=beta; return pom;}
00141 };
00142
00144
00145
00146
00147
00148
00149
00151
00152
00153
00154
00155
00156
00157
00159
00160 class euni: public epdf {
00161 protected:
00163 vec low;
00165 vec high;
00167 vec distance;
00169 double nk;
00171 double lnk;
00172 public:
00174 euni ( const RV rv ) :epdf ( rv ) {}
00175 double eval ( const vec &val ) const {return nk;}
00176 double evalpdflog ( const vec &val ) const {return lnk;}
00177 vec sample() const {
00178 vec smp ( rv.count() ); UniRNG.sample_vector ( rv.count(),smp );
00179 return low+distance*smp;
00180 }
00182 void set_parameters ( const vec &low0, const vec &high0 ) {
00183 distance = high0-low0;
00184 it_assert_debug ( min ( distance ) >0.0,"bad support" );
00185 low = low0;
00186 high = high0;
00187 nk = prod ( 1.0/distance );
00188 lnk = log ( nk );
00189 }
00190 vec mean() const {vec pom=high; pom-=low; pom/=2.0; return pom;}
00191 };
00192
00193
00199 template<class sq_T>
00200 class mlnorm : public mEF {
00202 enorm<sq_T> epdf;
00203 vec* _mu;
00204 mat A;
00205 public:
00207 mlnorm ( RV &rv,RV &rvc );
00209 void set_parameters ( const mat &A, const sq_T &R );
00211 vec samplecond ( vec &cond, double &lik );
00213 mat samplecond ( vec &cond, vec &lik, int n );
00215 void condition ( vec &cond );
00216 };
00217
00227 class mgamma : public mEF {
00229 egamma epdf;
00231 double k;
00233 vec* _beta;
00234
00235 public:
00237 mgamma ( const RV &rv,const RV &rvc );
00239 void set_parameters ( double k );
00241 vec samplecond ( vec &cond, double &lik );
00243 mat samplecond ( vec &cond, vec &lik, int n );
00244 void condition ( const vec &val ) {*_beta=k/val;};
00245 };
00246
00248 enum RESAMPLING_METHOD { MULTINOMIAL = 0, STRATIFIED = 1, SYSTEMATIC = 3 };
00254 class eEmp: public epdf {
00255 protected :
00257 int n;
00259 vec w;
00261 Array<vec> samples;
00262 public:
00264 eEmp ( const RV &rv0 ,int n0) :epdf ( rv0 ),n(n0),w(n),samples(n) {};
00266 void set_parameters ( const vec &w0, epdf* pdf0 );
00268 vec& _w() {return w;};
00270 Array<vec>& _samples() {return samples;};
00272 ivec resample ( RESAMPLING_METHOD method = SYSTEMATIC );
00274 vec sample() const {it_error ( "Not implemented" );return 0;}
00276 double evalpdflog(const vec &val) const {it_error ( "Not implemented" );return 0.0;}
00277 vec mean()const {vec pom=zeros(rv.count());
00278 for (int i=0;i<n;i++){pom+=samples(i)*w(i);}
00279 return pom;
00280 }
00281 };
00282
00283
00285
00286 template<class sq_T>
00287 enorm<sq_T>::enorm ( RV &rv ) :eEF(rv), mu ( rv.count() ),R ( rv.count() ),_iR ( rv.count() ),cached ( false ),dim ( rv.count() ) {};
00288
00289 template<class sq_T>
00290 void enorm<sq_T>::set_parameters ( const vec &mu0, const sq_T &R0 ) {
00291
00292 mu = mu0;
00293 R = R0;
00294 if ( _iR.rows() !=R.rows() ) _iR=R;
00295 R.inv ( _iR );
00296 cached=true;
00297 };
00298
00299 template<class sq_T>
00300 void enorm<sq_T>::dupdate ( mat &v, double nu ) {
00301
00302 };
00303
00304 template<class sq_T>
00305 void enorm<sq_T>::tupdate ( double phi, mat &vbar, double nubar ) {
00306
00307 };
00308
00309 template<class sq_T>
00310 vec enorm<sq_T>::sample() const {
00311 vec x ( dim );
00312 NorRNG.sample_vector ( dim,x );
00313 vec smp = R.sqrt_mult ( x );
00314
00315 smp += mu;
00316 return smp;
00317 };
00318
00319 template<class sq_T>
00320 mat enorm<sq_T>::sample ( int N )const {
00321 mat X ( dim,N );
00322 vec x ( dim );
00323 vec pom;
00324 int i;
00325
00326 for ( i=0;i<N;i++ ) {
00327 NorRNG.sample_vector ( dim,x );
00328 pom = R.sqrt_mult ( x );
00329 pom +=mu;
00330 X.set_col ( i, pom );
00331 }
00332
00333 return X;
00334 };
00335
00336 template<class sq_T>
00337 double enorm<sq_T>::eval ( const vec &val ) const {
00338 double pdfl,e;
00339 pdfl = evalpdflog ( val );
00340 e = exp ( pdfl );
00341 return e;
00342 };
00343
00344 template<class sq_T>
00345 double enorm<sq_T>::evalpdflog ( const vec &val ) const {
00346 if ( !cached ) {it_error("this should not happen, see cached");}
00347
00348
00349 return -0.5* ( R.cols() * 1.83787706640935 +R.logdet() +_iR.qform ( mu-val ) );
00350 };
00351
00352
00353 template<class sq_T>
00354 mlnorm<sq_T>::mlnorm ( RV &rv0,RV &rvc0 ) :mEF ( rv0,rvc0 ),epdf ( rv ),A ( rv0.count(),rv0.count() ) {
00355 _mu = epdf._mu();
00356 }
00357
00358 template<class sq_T>
00359 void mlnorm<sq_T>::set_parameters ( const mat &A0, const sq_T &R0 ) {
00360 epdf.set_parameters ( zeros ( rv.count() ),R0 );
00361 A = A0;
00362 }
00363
00364 template<class sq_T>
00365 vec mlnorm<sq_T>::samplecond ( vec &cond, double &lik ) {
00366 this->condition ( cond );
00367 vec smp = epdf.sample();
00368 lik = epdf.eval ( smp );
00369 return smp;
00370 }
00371
00372 template<class sq_T>
00373 mat mlnorm<sq_T>::samplecond ( vec &cond, vec &lik, int n ) {
00374 int i;
00375 int dim = rv.count();
00376 mat Smp ( dim,n );
00377 vec smp ( dim );
00378 this->condition ( cond );
00379
00380 for ( i=0; i<n; i++ ) {
00381 smp = epdf.sample();
00382 lik ( i ) = epdf.eval ( smp );
00383 Smp.set_col ( i ,smp );
00384 }
00385
00386 return Smp;
00387 }
00388
00389 template<class sq_T>
00390 void mlnorm<sq_T>::condition ( vec &cond ) {
00391 *_mu = A*cond;
00392
00393 }
00394
00396
00397
00398 #endif //EF_H