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 <std>
00020 
00021 using namespace itpp;
00022 
00028 class eEF : public epdf {
00029 
00030 public:
00031         virtual void tupdate( double phi, mat &vbar, double nubar ) {};
00032         virtual void dupdate( mat &v,double nu=1.0 ) {};
00033 };
00034 
00035 class mEF : public mpdf {
00036 
00037 public:
00038 
00039 };
00040 
00046 template<class sq_T>
00047 class enorm : public eEF {
00048         int dim;
00049         vec mu;
00050         sq_T R;
00051 public:
00052         enorm( RV &rv, vec &mu, sq_T &R );
00053         enorm();
00055         void tupdate( double phi, mat &vbar, double nubar );
00056         void dupdate( mat &v,double nu=1.0 );
00058         void tupdate();
00060         double dupdate();
00061          
00062         vec sample();
00063         mat sample(int N);
00064         double eval( const vec &val );
00065         Normal_RNG RNG;
00066 };
00067 
00071 template<class sq_T>
00072 class mlnorm : public mEF {
00073         enorm<sq_T> epdf;
00074         mat A;
00075 public:
00077         mlnorm( RV &rv,RV &rvc, mat &A, sq_T &R );
00079         vec samplecond( vec &cond, double &lik );
00080         mat samplecond( vec &cond, vec &lik, int n );
00081         void condition( vec &cond );
00082 };
00083 
00085 
00086 template<class sq_T>
00087 enorm<sq_T>::enorm( RV &rv, vec &mu0, sq_T &R0 ) {
00088         dim = rv.count();
00089         mu = mu0;
00090         R = R0;
00091 };
00092 
00093 template<class sq_T>
00094 void enorm<sq_T>::dupdate( mat &v, double nu ) {
00095         //
00096 };
00097 
00098 template<class sq_T>
00099 void enorm<sq_T>::tupdate( double phi, mat &vbar, double nubar ) {
00100         //
00101 };
00102 
00103 template<class sq_T>
00104 vec enorm<sq_T>::sample() {
00105         vec x( dim );
00106         RNG.sample_vector( dim,x );
00107         vec smp = R.sqrt_mult( x );
00108 
00109         smp += mu;
00110         return smp;
00111 };
00112 
00113 template<class sq_T>
00114 mat enorm<sq_T>::sample( int N ) {
00115         mat X( dim,N );
00116         vec x( dim );
00117         vec pom;
00118         int i;
00119         for ( i=0;i<N;i++ ) {
00120                 RNG.sample_vector( dim,x );
00121                 pom = R.sqrt_mult( x );
00122                 pom +=mu;
00123                 X.set_col( i, pom);
00124         }
00125         return X;
00126 };
00127 
00128 template<class sq_T>
00129 double enorm<sq_T>::eval( const vec &val ) {
00130         //
00131 };
00132 
00133 
00134 template<class sq_T>
00135 enorm<sq_T>::enorm() {};
00136 
00137 template<class sq_T>
00138 mlnorm<sq_T>::mlnorm( RV &rv,RV &rvc, mat &A, sq_T &R ) {
00139         int dim = rv.count();
00140         vec mu( dim );
00141 
00142         epdf = enorm<sq_T>( rv,mu,R );
00143 }
00144 
00145 template<class sq_T>
00146 vec mlnorm<sq_T>::samplecond( vec &cond, double &lik ) {
00147         this->condition( cond );
00148         vec smp = epdf.sample();
00149         lik = epdf.eval( smp );
00150         return smp;
00151 }
00152 
00153 template<class sq_T>
00154 mat mlnorm<sq_T>::samplecond( vec &cond, vec &lik, int n ) {
00155         int i;
00156         int dim = rv.count();
00157         mat Smp( dim,n );
00158         vec smp( dim );
00159         this->condition( cond );
00160         for ( i=0; i<dim; i++ ) {
00161                 smp = epdf.sample();
00162                 lik( i ) = epdf.eval( smp );
00163                 Smp.set_col( i ,smp );
00164         }
00165         return Smp;
00166 }
00167 
00168 template<class sq_T>
00169 void mlnorm<sq_T>::condition( vec &cond ) {
00170         epdf.mu = A*cond;
00171 //R is already assigned;
00172 }
00173 
00174 #endif //EF_H

Generated on Sun Feb 17 16:14:14 2008 for mixpp by  doxygen 1.5.3