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
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
00172 }
00173
00174 #endif //EF_H