00001 
00013 #ifndef MEF_H
00014 #define MEF_H
00015 
00016 #include <itpp/itbase.h>
00017 #include "../stat/libFN.h"
00018 #include "../stat/libEF.h"
00019 #include "../stat/emix.h"
00020 
00021 using namespace itpp;
00022 
00039 class MixEF: public BM {
00040 protected:
00042         int n;
00044         Array<BMEF*> Coms;
00046         multiBM weights;
00048         eprod* est;
00050         
00052         void build_est() {
00053                 Array<const epdf*> epdfs ( n+1 );
00054                 for ( int i=0;i<Coms.length();i++ ) {
00055 
00056                         epdfs ( i ) =& ( Coms ( i )->_epdf() );
00057                 }
00058                 
00059                 epdfs ( n ) =& ( weights._epdf() );
00060                 est = new eprod ( epdfs );
00061         }
00062 
00063 public:
00065         MixEF ( const Array<BMEF*> &Coms0, const vec &alpha0 ) :
00066                         BM ( RV() ), n ( Coms0.length() ), Coms ( n ),
00067                         weights ( RV ( "{w }", vec_1 ( n ) ),alpha0 ) {
00068         
00069 
00070                 for ( int i=0;i<n;i++ ) {Coms ( i ) = ( BMEF* ) Coms0 ( i )->_copy_();}
00071                 build_est();
00072         };
00073         MixEF () :
00074                         BM ( RV() ), n ( 0 ), Coms ( 0 ),
00075                         weights ( RV ( "{w }", vec_1 ( 0 ) ),vec ( 0 ) ) {build_est();}
00080         void init ( BMEF* Com0, const mat &Data, int c=5 );
00081         
00082         ~MixEF() {
00083                 delete est;
00084                 for ( int i=0;i<n;i++ ) {delete Coms ( i );}
00085         }
00087         void bayes ( const vec &dt );
00089         void bayes ( const mat &dt );
00090         void bayesB ( const mat &dt );
00091         double logpred ( const vec &dt ) const;
00092         const epdf& _epdf() const {return *est;}
00093         emix* predictor(const RV &rv);
00095         void flatten(double sumw=1.0);
00096 };
00097 
00098 
00099 #endif // MEF_H
00100 
00101