Changeset 886 for library/bdm/estim
- Timestamp:
- 03/29/10 23:01:49 (14 years ago)
- Location:
- library/bdm/estim
- Files:
-
- 2 modified
Legend:
- Unmodified
- Added
- Removed
-
library/bdm/estim/mixtures.cpp
r780 r886 35 35 } 36 36 37 //est already exists - must be deleted before build_est() can be used38 delete est;39 build_est();40 37 } 41 38 -
library/bdm/estim/mixtures.h
r766 r886 48 48 //! Statistics for weights 49 49 multiBM weights; 50 //aux 51 friend class eprod_mix; 50 52 //!Posterior on component parameters 51 eprod* est; 53 class eprod_mix: public eprod_base { 54 protected: 55 const MixEF &mix; // pointer to parent.n 56 public: 57 eprod_mix(const MixEF &m):mix(m){} 58 const epdf* factor(int i) const {return (i==(mix.n-1)) ? &mix.weights.posterior() : &mix.Coms(i)->posterior();} 59 const int no_factors()const {return mix.n+1;} 60 } est; 52 61 ////!Indeces of component rvc in common rvc 53 62 … … 55 64 MixEF_METHOD method; 56 65 57 //! Auxiliary function for use in constructors58 void build_est() {59 est = new eprod;60 if ( n > 0 ) {61 Array<const epdf*> epdfs ( n + 1 );62 for ( int i = 0; i < Coms.length(); i++ ) {63 epdfs ( i ) = & ( Coms ( i )->posterior() );64 }65 // last in the product is the weight66 epdfs ( n ) = & ( weights.posterior() );67 est->set_parameters ( epdfs, false );68 }69 }70 71 66 public: 72 67 //! Full constructor 73 68 MixEF ( const Array<BMEF*> &Coms0, const vec &alpha0 ) : 74 69 BMEF ( ), n ( Coms0.length() ), Coms ( n ), 75 weights (), method ( QB ) {70 weights (), est(*this), method ( QB ) { 76 71 for ( int i = 0; i < n; i++ ) { 77 72 Coms ( i ) = ( BMEF* ) Coms0 ( i )->_copy(); … … 79 74 weights.set_parameters(alpha0); 80 75 weights.validate(); 81 build_est();82 76 } 83 77 … … 85 79 MixEF () : 86 80 BMEF ( ), n ( 0 ), Coms ( 0 ), 87 weights (), method ( QB ) { 88 build_est(); 81 weights (), est(*this), method ( QB ) { 89 82 } 90 83 //! Copy constructor 91 84 MixEF ( const MixEF &M2 ) : BMEF ( ), n ( M2.n ), Coms ( n ), 92 weights ( M2.weights ), method ( M2.method ) {85 weights ( M2.weights ), est(*this), method ( M2.method ) { 93 86 for ( int i = 0; i < n; i++ ) { 94 87 Coms ( i ) = (BMEF*) M2.Coms ( i )->_copy(); 95 88 } 96 build_est();97 89 } 98 90 … … 103 95 void init ( BMEF* Com0, const mat &Data, const int c = 5 ); 104 96 //Destructor 105 ~MixEF() {106 delete est;107 for ( int i = 0; i < n; i++ ) {108 delete Coms ( i );109 }110 }111 97 //! Recursive EM-like algorithm (QB-variant), see Karny et. al, 2006 112 98 void bayes ( const vec &yt, const vec &cond ); … … 117 103 double logpred ( const vec &yt ) const; 118 104 //! return correctly typed posterior (covariant return) 119 const eprod & posterior() const {120 return *est;105 const eprod_mix& posterior() const { 106 return est; 121 107 } 122 108