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;
00027 extern Normal_RNG NorRNG;
00028 extern Gamma_RNG GamRNG;
00029
00030
00037 class eEF : public epdf {
00038
00039 public:
00041 eEF() :epdf() {};
00042
00043 eEF ( const RV &rv ) :epdf ( rv ) {};
00044
00045 virtual void tupdate ( double phi, mat &vbar, double nubar ) {};
00046
00047 virtual void dupdate ( mat &v,double nu=1.0 ) {};
00048 };
00049
00050 class mEF : public mpdf {
00051
00052 public:
00053 mEF ( const RV &rv0, const RV &rvc0 ) :mpdf ( rv0,rvc0 ) {};
00054 };
00055
00061 template<class sq_T>
00062
00063 class enorm : public eEF {
00064 protected:
00066 vec mu;
00068 sq_T R;
00070 sq_T _iR;
00072 bool cached;
00074 int dim;
00075 public:
00076 enorm() :eEF() {};
00077
00078 enorm ( RV &rv );
00079 void set_parameters ( const vec &mu,const sq_T &R );
00081 void tupdate ( double phi, mat &vbar, double nubar );
00082 void dupdate ( mat &v,double nu=1.0 );
00083
00084 vec sample();
00085 mat sample ( int N );
00086 double eval ( const vec &val );
00087 double evalpdflog ( const vec &val );
00088 vec mean(){return mu;}
00089
00090
00092 vec* _mu() {return μ}
00093
00095 void _R ( sq_T* &pR, sq_T* &piR ) {
00096 pR=&R;
00097 piR=&_iR;
00098 }
00099
00101 void _cached ( bool what ) {cached=what;}
00102 };
00103
00113 class egamma : public eEF {
00114 protected:
00115 vec alpha;
00116 vec beta;
00117 public :
00119 egamma ( const RV &rv ) :eEF ( rv ) {};
00121 void set_parameters ( const vec &a, const vec &b ) {alpha=a,beta=b;};
00122 vec sample();
00123 mat sample ( int N );
00124 double evalpdflog ( const vec val );
00126 void _param ( vec* &a, vec* &b ) {a=αb=β};
00127 vec mean(){vec pom(alpha); pom/=beta; return pom;}
00128 };
00129
00131 class emix : public epdf {
00132 protected:
00133 int n;
00134 vec &w;
00135 Array<epdf*> Coms;
00136 public:
00138 emix ( const RV &rv, vec &w0): epdf(rv), n(w0.length()), w(w0), Coms(n) {};
00139 void set_parameters( int &i, epdf* ep){Coms(i)=ep;}
00140 vec mean(){vec pom; for(int i=0;i<n;i++){pom+=Coms(i)->mean()*w(i);} return pom;};
00141 vec sample() {it_error ( "Not implemented" );return 0;}
00142 };
00143
00145
00146 class euni: public epdf {
00147 protected:
00149 vec low;
00151 vec high;
00153 vec distance;
00155 double nk,lnk;
00156 public:
00157 euni ( const RV rv ) :epdf ( rv ) {}
00158 double eval ( const vec &val ) {return nk;}
00159 double evalpdflog ( const vec &val ) {return lnk;}
00160 vec sample() {
00161 vec smp ( rv.count() ); UniRNG.sample_vector ( rv.count(),smp );
00162 return low+distance*smp;
00163 }
00164 void set_parameters ( const vec &low0, const vec &high0 ) {
00165 distance = high0-low0;
00166 it_assert_debug ( min ( distance ) >0.0,"bad support" );
00167 low = low0;
00168 high = high0;
00169 nk = prod ( 1.0/distance );
00170 lnk = log ( nk );
00171 }
00172 vec mean(){vec pom=high; pom-=low; pom/=2.0; return pom;}
00173 };
00174
00175
00181 template<class sq_T>
00182 class mlnorm : public mEF {
00183 enorm<sq_T> epdf;
00184 vec* _mu;
00185 mat A;
00186 public:
00188 mlnorm ( RV &rv,RV &rvc );
00189 void set_parameters ( const mat &A, const sq_T &R );
00191 vec samplecond ( vec &cond, double &lik );
00193 mat samplecond ( vec &cond, vec &lik, int n );
00194 void condition ( vec &cond );
00195 };
00196
00206 class mgamma : public mEF {
00207 egamma epdf;
00208 double k;
00209 vec* _beta;
00210
00211 public:
00213 mgamma ( const RV &rv,const RV &rvc );
00214 void set_parameters ( double k );
00216 vec samplecond ( vec &cond, double &lik );
00218 mat samplecond ( vec &cond, vec &lik, int n );
00219 void condition ( const vec &val ) {*_beta=k/val;};
00220 };
00221
00223 enum RESAMPLING_METHOD { MULTINOMIAL = 0, STRATIFIED = 1, SYSTEMATIC = 3 };
00229 class eEmp: public epdf {
00230 protected :
00232 int n;
00233 vec w;
00234 Array<vec> samples;
00235 public:
00236 eEmp ( const RV &rv0 ) :epdf ( rv0 ) {};
00237 void set_parameters ( const vec &w0, epdf* pdf0 );
00239 vec& _w() {return w;};
00240 Array<vec>& _samples() {return samples;};
00242 ivec resample ( RESAMPLING_METHOD method = SYSTEMATIC );
00243 vec sample() {it_error ( "Not implemented" );return 0;}
00244 vec mean(){vec pom;
00245 for (int i=0;i<n;i++){pom+=samples(i)*w(i);}
00246 return pom;
00247 }
00248 };
00249
00250
00252
00253 template<class sq_T>
00254 enorm<sq_T>::enorm ( RV &rv ) :eEF(), mu ( rv.count() ),R ( rv.count() ),_iR ( rv.count() ),cached ( false ),dim ( rv.count() ) {};
00255
00256 template<class sq_T>
00257 void enorm<sq_T>::set_parameters ( const vec &mu0, const sq_T &R0 ) {
00258
00259 mu = mu0;
00260 R = R0;
00261 if ( _iR.rows() !=R.rows() ) _iR=R;
00262 R.inv ( _iR );
00263 cached=true;
00264 };
00265
00266 template<class sq_T>
00267 void enorm<sq_T>::dupdate ( mat &v, double nu ) {
00268
00269 };
00270
00271 template<class sq_T>
00272 void enorm<sq_T>::tupdate ( double phi, mat &vbar, double nubar ) {
00273
00274 };
00275
00276 template<class sq_T>
00277 vec enorm<sq_T>::sample() {
00278 vec x ( dim );
00279 NorRNG.sample_vector ( dim,x );
00280 vec smp = R.sqrt_mult ( x );
00281
00282 smp += mu;
00283 return smp;
00284 };
00285
00286 template<class sq_T>
00287 mat enorm<sq_T>::sample ( int N ) {
00288 mat X ( dim,N );
00289 vec x ( dim );
00290 vec pom;
00291 int i;
00292
00293 for ( i=0;i<N;i++ ) {
00294 NorRNG.sample_vector ( dim,x );
00295 pom = R.sqrt_mult ( x );
00296 pom +=mu;
00297 X.set_col ( i, pom );
00298 }
00299
00300 return X;
00301 };
00302
00303 template<class sq_T>
00304 double enorm<sq_T>::eval ( const vec &val ) {
00305 double pdfl,e;
00306 pdfl = evalpdflog ( val );
00307 e = exp ( pdfl );
00308 return e;
00309 };
00310
00311 template<class sq_T>
00312 double enorm<sq_T>::evalpdflog ( const vec &val ) {
00313 if ( !cached ) {R.inv ( _iR );cached=true;}
00314
00315 return -0.5* ( R.cols() *0.79817986835811504957 +R.logdet() +_iR.qform ( mu-val ) );
00316 };
00317
00318
00319 template<class sq_T>
00320 mlnorm<sq_T>::mlnorm ( RV &rv0,RV &rvc0 ) :mEF ( rv0,rvc0 ),epdf ( rv ),A ( rv0.count(),rv0.count() ) {
00321 _mu = epdf._mu();
00322 }
00323
00324 template<class sq_T>
00325 void mlnorm<sq_T>::set_parameters ( const mat &A0, const sq_T &R0 ) {
00326 epdf.set_parameters ( zeros ( rv.count() ),R0 );
00327 A = A0;
00328 }
00329
00330 template<class sq_T>
00331 vec mlnorm<sq_T>::samplecond ( vec &cond, double &lik ) {
00332 this->condition ( cond );
00333 vec smp = epdf.sample();
00334 lik = epdf.eval ( smp );
00335 return smp;
00336 }
00337
00338 template<class sq_T>
00339 mat mlnorm<sq_T>::samplecond ( vec &cond, vec &lik, int n ) {
00340 int i;
00341 int dim = rv.count();
00342 mat Smp ( dim,n );
00343 vec smp ( dim );
00344 this->condition ( cond );
00345
00346 for ( i=0; i<n; i++ ) {
00347 smp = epdf.sample();
00348 lik ( i ) = epdf.eval ( smp );
00349 Smp.set_col ( i ,smp );
00350 }
00351
00352 return Smp;
00353 }
00354
00355 template<class sq_T>
00356 void mlnorm<sq_T>::condition ( vec &cond ) {
00357 *_mu = A*cond;
00358
00359 }
00360
00362
00363
00364 #endif //EF_H