Changeset 286 for bdm/stat/emix.h
- Timestamp:
- 03/05/09 14:03:35 (15 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
bdm/stat/emix.h
r271 r286 18 18 //#include <std> 19 19 20 namespace bdm {20 namespace bdm { 21 21 22 22 //this comes first because it is used inside emix! … … 47 47 //!Default constructor. By default, the given epdf is not copied! 48 48 //! It is assumed that this function will be used only temporarily. 49 mratio ( const epdf* nom0, const RV &rv, bool copy=false ) :mpdf ( ), dl ( rv,rvc,nom0->_rv() ) { 50 ep->set_rv(_rv()); 51 set_rvc(nom0->_rv().subt ( rv ) ); 52 if ( copy ) { 53 // nom = nom0->_copy_(); 54 it_error ( "todo" ); 55 destroynom=true; 56 } 57 else { 58 nom = nom0; 59 destroynom = false; 60 } 61 it_assert_debug ( rvc.length() >0,"Makes no sense to use this object!" ); 49 mratio ( const epdf* nom0, const RV &rv, bool copy=false ) :mpdf ( ), dl ( ) { 50 // adjust rv and rvc 51 rvc = nom0->_rv().subt ( rv ); 52 dimc = rvc._dsize(); 53 ep = new epdf; 54 ep->set_parameters(rv._dsize()); 55 ep->set_rv(rv); 56 57 //prepare data structures 58 if ( copy ) {it_error ( "todo" ); destroynom=true; } 59 else { nom = nom0; destroynom = false; } 60 it_assert_debug ( rvc.length() >0,"Makes no sense to use this object!" ); 61 62 // build denominator 62 63 den = nom->marginal ( rvc ); 64 dl.set_connection(rv,rvc,nom0->_rv()); 63 65 }; 64 66 double evallogcond ( const vec &val, const vec &cond ) { … … 67 69 dl.pushup_cond ( nom_val,val,cond ); 68 70 tmp = exp ( nom->evallog ( nom_val ) - den->evallog ( cond ) ); 69 it_assert_debug (std::isfinite(tmp),"Infinite value");71 it_assert_debug ( std::isfinite ( tmp ),"Infinite value" ); 70 72 return tmp; 71 73 } … … 96 98 public: 97 99 //!Default constructor 98 emix ( 100 emix ( ) : epdf ( ) {}; 99 101 //! Set weights \c w and components \c Coms 100 102 //!By default Coms are copied inside. Parameter \c copy can be set to false if Coms live externally. Use method ownComs() if Coms should be destroyed by the destructor. … … 103 105 vec sample() const; 104 106 vec mean() const { 105 int i; vec mu = zeros ( dim );107 int i; vec mu = zeros ( dim ); 106 108 for ( i = 0;i < w.length();i++ ) {mu += w ( i ) * Coms ( i )->mean(); } 107 109 return mu; … … 109 111 vec variance() const { 110 112 //non-central moment 111 vec mom2 = zeros (dim);112 for ( int i = 0;i < w.length();i++ ) {mom2 += w ( i ) * pow (Coms ( i )->mean(),2); }113 vec mom2 = zeros ( dim ); 114 for ( int i = 0;i < w.length();i++ ) {mom2 += w ( i ) * pow ( Coms ( i )->mean(),2 ); } 113 115 //central moment 114 return mom2-pow (mean(),2);116 return mom2-pow ( mean(),2 ); 115 117 } 116 118 double evallog ( const vec &val ) const { … … 118 120 double sum = 0.0; 119 121 for ( i = 0;i < w.length();i++ ) {sum += w ( i ) * exp ( Coms ( i )->evallog ( val ) );} 120 if ( sum==0.0){sum=std::numeric_limits<double>::epsilon();}122 if ( sum==0.0 ) {sum=std::numeric_limits<double>::epsilon();} 121 123 double tmp=log ( sum ); 122 it_assert_debug (std::isfinite(tmp),"Infinite");124 it_assert_debug ( std::isfinite ( tmp ),"Infinite" ); 123 125 return tmp; 124 126 }; … … 151 153 //!access function 152 154 epdf* _Coms ( int i ) {return Coms ( i );} 155 void set_rv(const RV &rv){ 156 epdf::set_rv(rv); 157 for(int i=0;i<Coms.length();i++){Coms(i)->set_rv(rv);} 158 } 153 159 }; 154 160 … … 174 180 mprod ( Array<mpdf*> mFacs ) : compositepdf ( mFacs ), mpdf (), epdfs ( n ), dls ( n ) { 175 181 ep=&dummy; 176 RV rv=getrv (true);177 set_rv (rv);dummy.set_parameters(rv._dsize());182 RV rv=getrv ( true ); 183 set_rv ( rv );dummy.set_parameters ( rv._dsize() ); 178 184 setrvc ( ep->_rv(),rvc ); 179 185 // rv and rvc established = > we can link them with mpdfs 180 186 for ( int i = 0;i < n;i++ ) { 181 dls ( i ) = new datalink_m2m ( mpdfs ( i )->_rv(), mpdfs ( i )->_rvc(), _rv(), _rvc() ); 187 dls ( i ) = new datalink_m2m; 188 dls(i)->set_connection( mpdfs ( i )->_rv(), mpdfs ( i )->_rvc(), _rv(), _rvc() ); 182 189 } 183 190 … … 237 244 Array<datalink*> dls; 238 245 public: 239 eprod ( const Array<const epdf*> epdfs0 ) : epdf ( ),epdfs ( epdfs0 ),dls ( epdfs.length() ) { 246 eprod () : epdfs ( 0 ),dls ( 0 ) {}; 247 void set_parameters ( const Array<const epdf*> &epdfs0, bool named=true ) { 248 epdfs=epdfs0;//.set_length ( epdfs0.length() ); 249 dls.set_length ( epdfs.length() ); 250 240 251 bool independent=true; 241 for ( int i=0;i<epdfs.length();i++ ) { 242 independent=rv.add ( epdfs ( i )->_rv() ); 243 it_assert_debug ( independent==true, "eprod:: given components are not independent ." ); 244 } 245 for ( int i=0;i<epdfs.length();i++ ) { 246 dls ( i ) = new datalink ( epdfs ( i )->_rv() , rv ); 252 if ( named ) { 253 for ( int i=0;i<epdfs.length();i++ ) { 254 independent=rv.add ( epdfs ( i )->_rv() ); 255 it_assert_debug ( independent==true, "eprod:: given components are not independent." ); 256 } 257 dim=rv._dsize(); 258 } 259 else { 260 dim =0; for ( int i=0;i<epdfs.length();i++ ) { 261 dim+=epdfs ( i )->dimension(); 262 } 263 } 264 // 265 int cumdim=0; 266 int dimi=0; 267 int i; 268 for ( i=0;i<epdfs.length();i++ ) { 269 dls ( i ) = new datalink; 270 if ( named ) {dls ( i )->set_connection ( epdfs ( i )->_rv() , rv );} 271 else { 272 dimi = epdfs ( i )->dimension(); 273 dls ( i )->set_connection ( dimi, dim, linspace ( cumdim,cumdim+dimi-1 ) ); 274 cumdim+=dimi; 275 } 247 276 } 248 277 } … … 260 289 for ( int i=0;i<epdfs.length();i++ ) { 261 290 vec pom = epdfs ( i )->mean(); 262 dls ( i )->pushup ( tmp, pow (pom,2) );263 } 264 return tmp-pow (mean(),2);291 dls ( i )->pushup ( tmp, pow ( pom,2 ) ); 292 } 293 return tmp-pow ( mean(),2 ); 265 294 } 266 295 vec sample() const { … … 277 306 tmp+=epdfs ( i )->evallog ( dls ( i )->pushdown ( val ) ); 278 307 } 279 it_assert_debug (std::isfinite(tmp),"Infinite");308 it_assert_debug ( std::isfinite ( tmp ),"Infinite" ); 280 309 return tmp; 281 310 }