| 36 | } |
| 37 | |
| 38 | vec emix::mean() const { |
| 39 | int i; |
| 40 | vec mu = zeros ( dim ); |
| 41 | for ( i = 0; i < w.length(); i++ ) { |
| 42 | mu += w ( i ) * Coms ( i )->mean(); |
| 43 | } |
| 44 | return mu; |
| 45 | } |
| 46 | |
| 47 | vec emix::variance() const { |
| 48 | //non-central moment |
| 49 | vec mom2 = zeros ( dim ); |
| 50 | for ( int i = 0; i < w.length(); i++ ) { |
| 51 | mom2 += w ( i ) * ( Coms ( i )->variance() + pow ( Coms ( i )->mean(), 2 ) ); |
| 52 | } |
| 53 | //central moment |
| 54 | return mom2 - pow ( mean(), 2 ); |
| 55 | } |
| 56 | |
| 57 | double emix::evallog ( const vec &val ) const { |
| 58 | int i; |
| 59 | double sum = 0.0; |
| 60 | for ( i = 0; i < w.length(); i++ ) { |
| 61 | sum += w ( i ) * exp ( Coms ( i )->evallog ( val ) ); |
| 62 | } |
| 63 | if ( sum == 0.0 ) { |
| 64 | sum = std::numeric_limits<double>::epsilon(); |
| 65 | } |
| 66 | double tmp = log ( sum ); |
| 67 | bdm_assert_debug ( std::isfinite ( tmp ), "Infinite" ); |
| 68 | return tmp; |
| 69 | } |
| 70 | |
| 71 | vec emix::evallog_mat ( const mat &Val ) const { |
| 72 | vec x = zeros ( Val.cols() ); |
| 73 | for ( int i = 0; i < w.length(); i++ ) { |
| 74 | x += w ( i ) * exp ( Coms ( i )->evallog_mat ( Val ) ); |
| 75 | } |
| 76 | return log ( x ); |
| 77 | }; |
| 78 | |
| 79 | mat emix::evallog_coms ( const mat &Val ) const { |
| 80 | mat X ( w.length(), Val.cols() ); |
| 81 | for ( int i = 0; i < w.length(); i++ ) { |
| 82 | X.set_row ( i, w ( i ) *exp ( Coms ( i )->evallog_mat ( Val ) ) ); |
| 83 | } |
| 84 | return X; |
| 254 | double mprod::evallogcond ( const vec &val, const vec &cond ) { |
| 255 | int i; |
| 256 | double res = 0.0; |
| 257 | for ( i = pdfs.length() - 1; i >= 0; i-- ) { |
| 258 | /* if ( pdfs(i)->_rvc().count() >0) { |
| 259 | pdfs ( i )->condition ( dls ( i )->get_cond ( val,cond ) ); |
| 260 | } |
| 261 | // add logarithms |
| 262 | res += epdfs ( i )->evallog ( dls ( i )->pushdown ( val ) );*/ |
| 263 | res += pdfs ( i )->evallogcond ( |
| 264 | dls ( i )->pushdown ( val ), |
| 265 | dls ( i )->get_cond ( val, cond ) |
| 266 | ); |
| 267 | } |
| 268 | return res; |
| 269 | } |
| 270 | |
| 271 | vec mprod::evallogcond_mat ( const mat &Dt, const vec &cond ) { |
| 272 | vec tmp ( Dt.cols() ); |
| 273 | for ( int i = 0; i < Dt.cols(); i++ ) { |
| 274 | tmp ( i ) = evallogcond ( Dt.get_col ( i ), cond ); |
| 275 | } |
| 276 | return tmp; |
| 277 | } |
| 278 | |
| 279 | vec mprod::evallogcond_mat ( const Array<vec> &Dt, const vec &cond ) { |
| 280 | vec tmp ( Dt.length() ); |
| 281 | for ( int i = 0; i < Dt.length(); i++ ) { |
| 282 | tmp ( i ) = evallogcond ( Dt ( i ), cond ); |
| 283 | } |
| 284 | return tmp; |
| 285 | } |
| 286 | |
| 320 | } |
| 321 | |
| 322 | vec eprod::mean() const { |
| 323 | vec tmp ( dim ); |
| 324 | for ( int i = 0; i < epdfs.length(); i++ ) { |
| 325 | vec pom = epdfs ( i )->mean(); |
| 326 | dls ( i )->pushup ( tmp, pom ); |
| 327 | } |
| 328 | return tmp; |
| 329 | } |
| 330 | |
| 331 | vec eprod::variance() const { |
| 332 | vec tmp ( dim ); //second moment |
| 333 | for ( int i = 0; i < epdfs.length(); i++ ) { |
| 334 | vec pom = epdfs ( i )->mean(); |
| 335 | dls ( i )->pushup ( tmp, pow ( pom, 2 ) ); |
| 336 | } |
| 337 | return tmp - pow ( mean(), 2 ); |
| 338 | } |
| 339 | vec eprod::sample() const { |
| 340 | vec tmp ( dim ); |
| 341 | for ( int i = 0; i < epdfs.length(); i++ ) { |
| 342 | vec pom = epdfs ( i )->sample(); |
| 343 | dls ( i )->pushup ( tmp, pom ); |
| 344 | } |
| 345 | return tmp; |
| 346 | } |
| 347 | double eprod::evallog ( const vec &val ) const { |
| 348 | double tmp = 0; |
| 349 | for ( int i = 0; i < epdfs.length(); i++ ) { |
| 350 | tmp += epdfs ( i )->evallog ( dls ( i )->pushdown ( val ) ); |
| 351 | } |
| 352 | bdm_assert_debug ( std::isfinite ( tmp ), "Infinite" ); |
| 353 | return tmp; |