00001
00013 #ifndef EF_H
00014 #define EF_H
00015
00016 #include <itpp/itbase.h>
00017
00018
00019 using namespace itpp;
00020
00026 class eEF :public epdf {
00027
00028 public:
00029 virtual void tupdate( double phi, mat &vbar, double nubar ){};
00030 virtual void dupdate( mat &v,double nu=1.0 ){};
00031 };
00032
00033 class mEF :public mpdf {
00034
00035 public:
00036
00037 };
00038
00044 template<class sq_T>
00045 class enorm : public eEF {
00046 vec mu;
00047 sq_T R;
00048 public:
00049 enorm( RV &rv, vec &mu, sq_T &R );
00050 enorm();
00051 void tupdate( double phi, mat &vbar, double nubar );
00052 void dupdate( mat &v,double nu=1.0 );
00053 vec sample();
00054 double eval( const vec &val );
00055
00056 };
00057
00061 template<class sq_T>
00062 class mlnorm : public mEF {
00063 enorm<sq_T> epdf;
00064 mat A;
00065 public:
00067 mlnorm( RV &rv,RV &rvc, mat &A, sq_T &R );
00069 vec samplecond( vec &cond, double &lik );
00070 mat samplecond( vec &cond, vec &lik, int n );
00071 void condition( vec &cond );
00072 };
00073
00075
00076 template<class sq_T>
00077 enorm<sq_T>::enorm( RV &rv, vec &mu0, sq_T &R0 ) {
00078 mu = mu0;
00079 R = R0;
00080 };
00081
00082 template<class sq_T>
00083 void enorm<sq_T>::dupdate( mat &v, double nu ) {
00084
00085 };
00086
00087 template<class sq_T>
00088 void enorm<sq_T>::tupdate( double phi, mat &vbar, double nubar ) {
00089
00090 };
00091
00092 template<class sq_T>
00093 vec enorm<sq_T>::sample() {
00094
00095 };
00096
00097 template<class sq_T>
00098 double enorm<sq_T>::eval( const vec &val ) {
00099
00100 };
00101
00102
00103 template<class sq_T>
00104 enorm<sq_T>::enorm() {};
00105
00106 template<class sq_T>
00107 mlnorm<sq_T>::mlnorm( RV &rv,RV &rvc, mat &A, sq_T &R ) {
00108 int dim = rv.length();
00109 vec mu( dim );
00110
00111 epdf = enorm<sq_T>( rv,mu,R );
00112 }
00113
00114 template<class sq_T>
00115 vec mlnorm<sq_T>::samplecond( vec &cond, double &lik ) {
00116 this->condition( cond );
00117 vec smp = epdf.sample();
00118 lik = epdf.eval(smp);
00119 return smp;
00120 }
00121
00122 template<class sq_T>
00123 mat mlnorm<sq_T>::samplecond( vec &cond, vec &lik, int n ) {
00124 int i;
00125 int dim = rv.length();
00126 mat Smp( dim,n );
00127 vec smp( dim);
00128 this->condition( cond );
00129 for ( i=0; i<dim; i++ ) {
00130 smp = epdf.sample();
00131 lik(i) = epdf.eval(smp);
00132 Smp.set_col( i ,smp);
00133 }
00134 return Smp;
00135 }
00136
00137 template<class sq_T>
00138 void mlnorm<sq_T>::condition( vec &cond) {
00139 }
00140
00141 #endif //EF_H