work/mixpp/bdm/stat/libEF.h

Go to the documentation of this file.
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 //#include <std>
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 //Access methods
00092         vec* _mu() {return &mu;}
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=&alpha;b=&beta;};
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; //cached epdf.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 //Fixme test dimensions of mu0 and R0;
00259         mu = mu0;
00260         R = R0;
00261         if ( _iR.rows() !=R.rows() ) _iR=R; // memory allocation!
00262         R.inv ( _iR ); //update cache
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 //R is already assigned;
00359 }
00360 
00362 
00363 
00364 #endif //EF_H

Generated on Thu Feb 28 16:54:40 2008 for mixpp by  doxygen 1.5.3