Changeset 739 for library/bdm/stat

Show
Ignore:
Timestamp:
11/25/09 18:02:21 (15 years ago)
Author:
mido
Message:

the rest of h to cpp movements, with exception of from_setting and validate to avoid conflicts with Sarka

Location:
library/bdm/stat
Files:
6 modified

Legend:

Unmodified
Added
Removed
  • library/bdm/stat/emix.cpp

    r737 r739  
    3434 
    3535        return Coms ( i )->sample(); 
     36} 
     37 
     38vec 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 
     47vec 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 
     57double 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 
     71vec 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 
     79mat 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; 
    3685} 
    3786 
     
    203252}; 
    204253 
     254double 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 
     271vec 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 
     279vec 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 
    205287void mprod::set_elements ( const Array<shared_ptr<pdf> > &mFacs ) { 
    206288        pdfs = mFacs; 
     
    236318 
    237319        return Coms ( i )->samplecond ( cond ); 
     320} 
     321 
     322vec 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 
     331vec 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} 
     339vec 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} 
     347double 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; 
    238354} 
    239355 
     
    267383//              } 
    268384//      }; 
     385 
  • library/bdm/stat/emix.h

    r737 r739  
    129129 
    130130        vec sample() const; 
    131         vec mean() const { 
    132                 int i; 
    133                 vec mu = zeros ( dim ); 
    134                 for ( i = 0; i < w.length(); i++ ) { 
    135                         mu += w ( i ) * Coms ( i )->mean(); 
    136                 } 
    137                 return mu; 
    138         } 
    139         vec variance() const { 
    140                 //non-central moment 
    141                 vec mom2 = zeros ( dim ); 
    142                 for ( int i = 0; i < w.length(); i++ ) { 
    143                         mom2 += w ( i ) * ( Coms ( i )->variance() + pow ( Coms ( i )->mean(), 2 ) ); 
    144                 } 
    145                 //central moment 
    146                 return mom2 - pow ( mean(), 2 ); 
    147         } 
    148         double evallog ( const vec &val ) const { 
    149                 int i; 
    150                 double sum = 0.0; 
    151                 for ( i = 0; i < w.length(); i++ ) { 
    152                         sum += w ( i ) * exp ( Coms ( i )->evallog ( val ) ); 
    153                 } 
    154                 if ( sum == 0.0 ) { 
    155                         sum = std::numeric_limits<double>::epsilon(); 
    156                 } 
    157                 double tmp = log ( sum ); 
    158                 bdm_assert_debug ( std::isfinite ( tmp ), "Infinite" ); 
    159                 return tmp; 
    160         }; 
    161  
    162         vec evallog_mat ( const mat &Val ) const { 
    163                 vec x = zeros ( Val.cols() ); 
    164                 for ( int i = 0; i < w.length(); i++ ) { 
    165                         x += w ( i ) * exp ( Coms ( i )->evallog_mat ( Val ) ); 
    166                 } 
    167                 return log ( x ); 
    168         }; 
     131 
     132        vec mean() const; 
     133 
     134        vec variance() const; 
     135 
     136        double evallog ( const vec &val ) const; 
     137 
     138        vec evallog_mat ( const mat &Val ) const; 
    169139 
    170140        //! Auxiliary function that returns pdflog for each component 
    171         mat evallog_coms ( const mat &Val ) const { 
    172                 mat X ( w.length(), Val.cols() ); 
    173                 for ( int i = 0; i < w.length(); i++ ) { 
    174                         X.set_row ( i, w ( i ) *exp ( Coms ( i )->evallog_mat ( Val ) ) ); 
    175                 } 
    176                 return X; 
    177         }; 
     141        mat evallog_coms ( const mat &Val ) const; 
    178142 
    179143        shared_ptr<epdf> marginal ( const RV &rv ) const; 
     
    334298        void set_elements ( const Array<shared_ptr<pdf> > &mFacs ); 
    335299 
    336         double evallogcond ( const vec &val, const vec &cond ) { 
    337                 int i; 
    338                 double res = 0.0; 
    339                 for ( i = pdfs.length() - 1; i >= 0; i-- ) { 
    340                         /*                      if ( pdfs(i)->_rvc().count() >0) { 
    341                                                         pdfs ( i )->condition ( dls ( i )->get_cond ( val,cond ) ); 
    342                                                 } 
    343                                                 // add logarithms 
    344                                                 res += epdfs ( i )->evallog ( dls ( i )->pushdown ( val ) );*/ 
    345                         res += pdfs ( i )->evallogcond ( 
    346                                    dls ( i )->pushdown ( val ), 
    347                                    dls ( i )->get_cond ( val, cond ) 
    348                                ); 
    349                 } 
    350                 return res; 
    351         } 
    352         vec evallogcond_mat ( const mat &Dt, const vec &cond ) { 
    353                 vec tmp ( Dt.cols() ); 
    354                 for ( int i = 0; i < Dt.cols(); i++ ) { 
    355                         tmp ( i ) = evallogcond ( Dt.get_col ( i ), cond ); 
    356                 } 
    357                 return tmp; 
    358         }; 
    359         vec evallogcond_mat ( const Array<vec> &Dt, const vec &cond ) { 
    360                 vec tmp ( Dt.length() ); 
    361                 for ( int i = 0; i < Dt.length(); i++ ) { 
    362                         tmp ( i ) = evallogcond ( Dt ( i ), cond ); 
    363                 } 
    364                 return tmp; 
    365         }; 
    366  
     300        double evallogcond ( const vec &val, const vec &cond ); 
     301 
     302        vec evallogcond_mat ( const mat &Dt, const vec &cond ); 
     303 
     304        vec evallogcond_mat ( const Array<vec> &Dt, const vec &cond ); 
    367305 
    368306        //TODO smarter... 
     
    441379        } 
    442380 
    443         vec mean() const { 
    444                 vec tmp ( dim ); 
    445                 for ( int i = 0; i < epdfs.length(); i++ ) { 
    446                         vec pom = epdfs ( i )->mean(); 
    447                         dls ( i )->pushup ( tmp, pom ); 
    448                 } 
    449                 return tmp; 
    450         } 
    451         vec variance() const { 
    452                 vec tmp ( dim ); //second moment 
    453                 for ( int i = 0; i < epdfs.length(); i++ ) { 
    454                         vec pom = epdfs ( i )->mean(); 
    455                         dls ( i )->pushup ( tmp, pow ( pom, 2 ) ); 
    456                 } 
    457                 return tmp - pow ( mean(), 2 ); 
    458         } 
    459         vec sample() const { 
    460                 vec tmp ( dim ); 
    461                 for ( int i = 0; i < epdfs.length(); i++ ) { 
    462                         vec pom = epdfs ( i )->sample(); 
    463                         dls ( i )->pushup ( tmp, pom ); 
    464                 } 
    465                 return tmp; 
    466         } 
    467         double evallog ( const vec &val ) const { 
    468                 double tmp = 0; 
    469                 for ( int i = 0; i < epdfs.length(); i++ ) { 
    470                         tmp += epdfs ( i )->evallog ( dls ( i )->pushdown ( val ) ); 
    471                 } 
    472                 bdm_assert_debug ( std::isfinite ( tmp ), "Infinite" ); 
    473                 return tmp; 
    474         } 
     381        vec mean() const; 
     382 
     383        vec variance() const; 
     384 
     385        vec sample() const; 
     386 
     387        double evallog ( const vec &val ) const; 
     388 
    475389        //!access function 
    476390        const epdf* operator () ( int i ) const { 
  • library/bdm/stat/exp_family.cpp

    r737 r739  
    279279        M = iLsub * Lpsi; 
    280280        R = ldR.to_mat()  ; 
     281} 
     282 
     283void egiw::log_register ( bdm::logger& L, const string& prefix ) { 
     284        if ( log_level == 3 ) { 
     285                root::log_register ( L, prefix ); 
     286                logrec->ids.set_length ( 2 ); 
     287                int th_dim = dimension() - dimx * ( dimx + 1 ) / 2; 
     288                logrec->ids ( 0 ) = L.add_vector ( RV ( "", th_dim ), prefix + logrec->L.prefix_sep() + "mean" ); 
     289                logrec->ids ( 1 ) = L.add_vector ( RV ( "", th_dim * th_dim ), prefix + logrec->L.prefix_sep() + "variance" ); 
     290        } else { 
     291                epdf::log_register ( L, prefix ); 
     292        } 
     293} 
     294 
     295void egiw::log_write() const { 
     296        if ( log_level == 3 ) { 
     297                mat M; 
     298                ldmat Lam; 
     299                ldmat Vz; 
     300                factorize ( M, Vz, Lam ); 
     301                logrec->L.log_vector ( logrec->ids ( 0 ), est_theta() ); 
     302                logrec->L.log_vector ( logrec->ids ( 1 ), cvectorize ( est_theta_cov().to_mat() ) ); 
     303        } else { 
     304                epdf::log_write(); 
     305        } 
     306 
     307} 
     308 
     309void multiBM::bayes ( const vec &yt, const vec &cond ) { 
     310        if ( frg < 1.0 ) { 
     311                beta *= frg; 
     312                last_lognc = est.lognc(); 
     313        } 
     314        beta += yt; 
     315        if ( evalll ) { 
     316                ll = est.lognc() - last_lognc; 
     317        } 
     318} 
     319 
     320double multiBM::logpred ( const vec &yt ) const { 
     321        eDirich pred ( est ); 
     322        vec &beta = pred._beta(); 
     323 
     324        double lll; 
     325        if ( frg < 1.0 ) { 
     326                beta *= frg; 
     327                lll = pred.lognc(); 
     328        } else if ( evalll ) { 
     329                lll = last_lognc; 
     330        } else { 
     331                lll = pred.lognc(); 
     332        } 
     333 
     334        beta += yt; 
     335        return pred.lognc() - lll; 
     336} 
     337void multiBM::flatten ( const BMEF* B ) { 
     338        const multiBM* E = dynamic_cast<const multiBM*> ( B ); 
     339        // sum(beta) should be equal to sum(B.beta) 
     340        const vec &Eb = E->beta;//const_cast<multiBM*> ( E )->_beta(); 
     341        beta *= ( sum ( Eb ) / sum ( beta ) ); 
     342        if ( evalll ) { 
     343                last_lognc = est.lognc(); 
     344        } 
    281345} 
    282346 
     
    462526} 
    463527 
     528void mlstudent::condition ( const vec &cond ) { 
     529        if ( cond.length() > 0 ) { 
     530                iepdf._mu() = A * cond + mu_const; 
     531        } else { 
     532                iepdf._mu() =  mu_const; 
     533        } 
     534        double zeta; 
     535        //ugly hack! 
     536        if ( ( cond.length() + 1 ) == Lambda.rows() ) { 
     537                zeta = Lambda.invqform ( concat ( cond, vec_1 ( 1.0 ) ) ); 
     538        } else { 
     539                zeta = Lambda.invqform ( cond ); 
     540        } 
     541        _R = Re; 
     542        _R *= ( 1 + zeta );// / ( nu ); << nu is in Re!!!!!! 
     543} 
     544 
     545void eEmp::qbounds ( vec &lb, vec &ub, double perc ) const { 
     546        // lb in inf so than it will be pushed below; 
     547        lb.set_size ( dim ); 
     548        ub.set_size ( dim ); 
     549        lb = std::numeric_limits<double>::infinity(); 
     550        ub = -std::numeric_limits<double>::infinity(); 
     551        int j; 
     552        for ( int i = 0; i < n; i++ ) { 
     553                for ( j = 0; j < dim; j++ ) { 
     554                        if ( samples ( i ) ( j ) < lb ( j ) ) { 
     555                                lb ( j ) = samples ( i ) ( j ); 
     556                        } 
     557                        if ( samples ( i ) ( j ) > ub ( j ) ) { 
     558                                ub ( j ) = samples ( i ) ( j ); 
     559                        } 
     560                } 
     561        } 
     562} 
     563 
     564 
    464565}; 
  • library/bdm/stat/exp_family.h

    r737 r739  
    323323                // check sizes, rvs etc. 
    324324        } 
    325         void log_register ( bdm::logger& L, const string& prefix ) { 
    326                 if ( log_level == 3 ) { 
    327                         root::log_register ( L, prefix ); 
    328                         logrec->ids.set_length ( 2 ); 
    329                         int th_dim = dimension() - dimx * ( dimx + 1 ) / 2; 
    330                         logrec->ids ( 0 ) = L.add_vector ( RV ( "", th_dim ), prefix + logrec->L.prefix_sep() + "mean" ); 
    331                         logrec->ids ( 1 ) = L.add_vector ( RV ( "", th_dim * th_dim ), prefix + logrec->L.prefix_sep() + "variance" ); 
    332                 } else { 
    333                         epdf::log_register ( L, prefix ); 
    334                 } 
    335         } 
    336         void log_write() const { 
    337                 if ( log_level == 3 ) { 
    338                         mat M; 
    339                         ldmat Lam; 
    340                         ldmat Vz; 
    341                         factorize ( M, Vz, Lam ); 
    342                         logrec->L.log_vector ( logrec->ids ( 0 ), est_theta() ); 
    343                         logrec->L.log_vector ( logrec->ids ( 1 ), cvectorize ( est_theta_cov().to_mat() ) ); 
    344                 } else { 
    345                         epdf::log_write(); 
    346                 } 
    347  
    348         } 
     325        void log_register ( bdm::logger& L, const string& prefix ); 
     326 
     327        void log_write() const; 
    349328        //!@} 
    350329}; 
     
    526505                beta = mB->beta; 
    527506        } 
    528         void bayes ( const vec &yt, const vec &cond = empty_vec ) { 
    529                 if ( frg < 1.0 ) { 
    530                         beta *= frg; 
    531                         last_lognc = est.lognc(); 
    532                 } 
    533                 beta += yt; 
    534                 if ( evalll ) { 
    535                         ll = est.lognc() - last_lognc; 
    536                 } 
    537         } 
    538         double logpred ( const vec &yt ) const { 
    539                 eDirich pred ( est ); 
    540                 vec &beta = pred._beta(); 
    541  
    542                 double lll; 
    543                 if ( frg < 1.0 ) { 
    544                         beta *= frg; 
    545                         lll = pred.lognc(); 
    546                 } else if ( evalll ) { 
    547                         lll = last_lognc; 
    548                 } else { 
    549                         lll = pred.lognc(); 
    550                 } 
    551  
    552                 beta += yt; 
    553                 return pred.lognc() - lll; 
    554         } 
    555         void flatten ( const BMEF* B ) { 
    556                 const multiBM* E = dynamic_cast<const multiBM*> ( B ); 
    557                 // sum(beta) should be equal to sum(B.beta) 
    558                 const vec &Eb = E->beta;//const_cast<multiBM*> ( E )->_beta(); 
    559                 beta *= ( sum ( Eb ) / sum ( beta ) ); 
    560                 if ( evalll ) { 
    561                         last_lognc = est.lognc(); 
    562                 } 
    563         } 
     507        void bayes ( const vec &yt, const vec &cond = empty_vec ); 
     508 
     509        double logpred ( const vec &yt ) const; 
     510 
     511        void flatten ( const BMEF* B ); 
     512 
    564513        //! return correctly typed posterior (covariant return) 
    565514        const eDirich& posterior() const { 
     
    971920                Lambda = Lambda0; 
    972921        } 
    973         void condition ( const vec &cond ) { 
    974                 if ( cond.length() > 0 ) { 
    975                         iepdf._mu() = A * cond + mu_const; 
    976                 } else { 
    977                         iepdf._mu() =  mu_const; 
    978                 } 
    979                 double zeta; 
    980                 //ugly hack! 
    981                 if ( ( cond.length() + 1 ) == Lambda.rows() ) { 
    982                         zeta = Lambda.invqform ( concat ( cond, vec_1 ( 1.0 ) ) ); 
    983                 } else { 
    984                         zeta = Lambda.invqform ( cond ); 
    985                 } 
    986                 _R = Re; 
    987                 _R *= ( 1 + zeta );// / ( nu ); << nu is in Re!!!!!! 
    988         }; 
     922 
     923        void condition ( const vec &cond );  
    989924 
    990925        void validate() { 
     
    15261461        } 
    15271462        //! For this class, qbounds are minimum and maximum value of the population! 
    1528         void qbounds ( vec &lb, vec &ub, double perc = 0.95 ) const { 
    1529                 // lb in inf so than it will be pushed below; 
    1530                 lb.set_size ( dim ); 
    1531                 ub.set_size ( dim ); 
    1532                 lb = std::numeric_limits<double>::infinity(); 
    1533                 ub = -std::numeric_limits<double>::infinity(); 
    1534                 int j; 
    1535                 for ( int i = 0; i < n; i++ ) { 
    1536                         for ( j = 0; j < dim; j++ ) { 
    1537                                 if ( samples ( i ) ( j ) < lb ( j ) ) { 
    1538                                         lb ( j ) = samples ( i ) ( j ); 
    1539                                 } 
    1540                                 if ( samples ( i ) ( j ) > ub ( j ) ) { 
    1541                                         ub ( j ) = samples ( i ) ( j ); 
    1542                                 } 
    1543                         } 
    1544                 } 
    1545         } 
     1463        void qbounds ( vec &lb, vec &ub, double perc = 0.95 ) const; 
    15461464}; 
    15471465 
  • library/bdm/stat/merger.cpp

    r737 r739  
    88                Npoints ( 0 ), DBG ( false ), dbg_file ( 0 ) { 
    99        set_sources ( S ); 
     10} 
     11 
     12void merger_base::set_sources ( const Array<shared_ptr<pdf> > &Sources ) { 
     13        pdfs = Sources; 
     14        Nsources = pdfs.length(); 
     15        //set sizes 
     16        dls.set_size ( Sources.length() ); 
     17        rvzs.set_size ( Sources.length() ); 
     18        zdls.set_size ( Sources.length() ); 
     19 
     20        rv = get_composite_rv ( pdfs, /* checkoverlap = */ false ); 
     21 
     22        RV rvc; 
     23        // Extend rv by rvc! 
     24        for ( int i = 0; i < pdfs.length(); i++ ) { 
     25                RV rvx = pdfs ( i )->_rvc().subt ( rv ); 
     26                rvc.add ( rvx ); // add rv to common rvc 
     27        } 
     28 
     29        // join rv and rvc - see descriprion 
     30        rv.add ( rvc ); 
     31        // get dimension 
     32        dim = rv._dsize(); 
     33 
     34        // create links between sources and common rv 
     35        RV xytmp; 
     36        for ( int i = 0; i < pdfs.length(); i++ ) { 
     37                //Establich connection between pdfs and merger 
     38                dls ( i ) = new datalink_m2e; 
     39                dls ( i )->set_connection ( pdfs ( i )->_rv(), pdfs ( i )->_rvc(), rv ); 
     40 
     41                // find out what is missing in each pdf 
     42                xytmp = pdfs ( i )->_rv(); 
     43                xytmp.add ( pdfs ( i )->_rvc() ); 
     44                // z_i = common_rv-xy 
     45                rvzs ( i ) = rv.subt ( xytmp ); 
     46                //establish connection between extension (z_i|x,y)s and common rv 
     47                zdls ( i ) = new datalink_m2e; 
     48                zdls ( i )->set_connection ( rvzs ( i ), xytmp, rv ) ; 
     49        }; 
     50} 
     51 
     52void merger_base::set_support ( rectangular_support &Sup ) { 
     53        Npoints = Sup.points(); 
     54        eSmp.set_parameters ( Npoints, false ); 
     55        Array<vec> &samples = eSmp._samples(); 
     56        eSmp._w() = ones ( Npoints ) / Npoints; //unifrom size of bins 
     57        //set samples 
     58        samples ( 0 ) = Sup.first_vec(); 
     59        for ( int j = 1; j < Npoints; j++ ) { 
     60                samples ( j ) = Sup.next_vec(); 
     61        } 
     62} 
     63 
     64void merger_base::merge () { 
     65        validate(); 
     66 
     67        //check if sources overlap: 
     68        bool OK = true; 
     69        for ( int i = 0; i < pdfs.length(); i++ ) { 
     70                OK &= ( rvzs ( i )._dsize() == 0 ); // z_i is empty 
     71                OK &= ( pdfs ( i )->_rvc()._dsize() == 0 ); // y_i is empty 
     72        } 
     73 
     74        if ( OK ) { 
     75                mat lW = zeros ( pdfs.length(), eSmp._w().length() ); 
     76 
     77                vec emptyvec ( 0 ); 
     78                for ( int i = 0; i < pdfs.length(); i++ ) { 
     79                        for ( int j = 0; j < eSmp._w().length(); j++ ) { 
     80                                lW ( i, j ) = pdfs ( i )->evallogcond ( eSmp._samples() ( j ), emptyvec ); 
     81                        } 
     82                } 
     83 
     84                vec w_nn = merge_points ( lW ); 
     85                vec wtmp = exp ( w_nn - max ( w_nn ) ); 
     86                //renormalize 
     87                eSmp._w() = wtmp / sum ( wtmp ); 
     88        } else { 
     89                bdm_error ( "Sources are not compatible - use merger_mix" ); 
     90        } 
    1091} 
    1192 
     
    62143} 
    63144 
     145vec merger_base::mean() const { 
     146        const Vec<double> &w = eSmp._w(); 
     147        const Array<vec> &S = eSmp._samples(); 
     148        vec tmp = zeros ( dim ); 
     149        for ( int i = 0; i < Npoints; i++ ) { 
     150                tmp += w ( i ) * S ( i ); 
     151        } 
     152        return tmp; 
     153} 
     154 
     155mat merger_base::covariance() const { 
     156        const vec &w = eSmp._w(); 
     157        const Array<vec> &S = eSmp._samples(); 
     158 
     159        vec mea = mean(); 
     160 
     161//                      cout << sum (w) << "," << w*w << endl; 
     162 
     163        mat Tmp = zeros ( dim, dim ); 
     164        for ( int i = 0; i < Npoints; i++ ) { 
     165                Tmp += w ( i ) * outer_product ( S ( i ), S ( i ) ); 
     166        } 
     167        return Tmp - outer_product ( mea, mea ); 
     168} 
     169 
     170vec merger_base::variance() const { 
     171        const vec &w = eSmp._w(); 
     172        const Array<vec> &S = eSmp._samples(); 
     173 
     174        vec tmp = zeros ( dim ); 
     175        for ( int i = 0; i < Nsources; i++ ) { 
     176                tmp += w ( i ) * pow ( S ( i ), 2 ); 
     177        } 
     178        return tmp - pow ( mean(), 2 ); 
     179} 
     180 
    64181void merger_mix::merge ( ) { 
    65182        Array<vec> &Smp = eSmp._samples(); //aux 
  • library/bdm/stat/merger.h

    r737 r739  
    9393 
    9494        //! Function setting the main internal structures 
    95         void set_sources ( const Array<shared_ptr<pdf> > &Sources ) { 
    96                 pdfs = Sources; 
    97                 Nsources = pdfs.length(); 
    98                 //set sizes 
    99                 dls.set_size ( Sources.length() ); 
    100                 rvzs.set_size ( Sources.length() ); 
    101                 zdls.set_size ( Sources.length() ); 
    102  
    103                 rv = get_composite_rv ( pdfs, /* checkoverlap = */ false ); 
    104  
    105                 RV rvc; 
    106                 // Extend rv by rvc! 
    107                 for ( int i = 0; i < pdfs.length(); i++ ) { 
    108                         RV rvx = pdfs ( i )->_rvc().subt ( rv ); 
    109                         rvc.add ( rvx ); // add rv to common rvc 
    110                 } 
    111  
    112                 // join rv and rvc - see descriprion 
    113                 rv.add ( rvc ); 
    114                 // get dimension 
    115                 dim = rv._dsize(); 
    116  
    117                 // create links between sources and common rv 
    118                 RV xytmp; 
    119                 for ( int i = 0; i < pdfs.length(); i++ ) { 
    120                         //Establich connection between pdfs and merger 
    121                         dls ( i ) = new datalink_m2e; 
    122                         dls ( i )->set_connection ( pdfs ( i )->_rv(), pdfs ( i )->_rvc(), rv ); 
    123  
    124                         // find out what is missing in each pdf 
    125                         xytmp = pdfs ( i )->_rv(); 
    126                         xytmp.add ( pdfs ( i )->_rvc() ); 
    127                         // z_i = common_rv-xy 
    128                         rvzs ( i ) = rv.subt ( xytmp ); 
    129                         //establish connection between extension (z_i|x,y)s and common rv 
    130                         zdls ( i ) = new datalink_m2e; 
    131                         zdls ( i )->set_connection ( rvzs ( i ), xytmp, rv ) ; 
    132                 }; 
    133         } 
     95        void set_sources ( const Array<shared_ptr<pdf> > &Sources ); 
     96 
    13497        //! Set support points from rectangular grid 
    135         void set_support ( rectangular_support &Sup ) { 
    136                 Npoints = Sup.points(); 
    137                 eSmp.set_parameters ( Npoints, false ); 
    138                 Array<vec> &samples = eSmp._samples(); 
    139                 eSmp._w() = ones ( Npoints ) / Npoints; //unifrom size of bins 
    140                 //set samples 
    141                 samples ( 0 ) = Sup.first_vec(); 
    142                 for ( int j = 1; j < Npoints; j++ ) { 
    143                         samples ( j ) = Sup.next_vec(); 
    144                 } 
    145         } 
     98        void set_support ( rectangular_support &Sup ); 
     99 
    146100        //! Set support points from dicrete grid 
    147101        void set_support ( discrete_support &Sup ) { 
     
    180134 
    181135        //!Merge given sources in given points 
    182         virtual void merge () { 
    183                 validate(); 
    184  
    185                 //check if sources overlap: 
    186                 bool OK = true; 
    187                 for ( int i = 0; i < pdfs.length(); i++ ) { 
    188                         OK &= ( rvzs ( i )._dsize() == 0 ); // z_i is empty 
    189                         OK &= ( pdfs ( i )->_rvc()._dsize() == 0 ); // y_i is empty 
    190                 } 
    191  
    192                 if ( OK ) { 
    193                         mat lW = zeros ( pdfs.length(), eSmp._w().length() ); 
    194  
    195                         vec emptyvec ( 0 ); 
    196                         for ( int i = 0; i < pdfs.length(); i++ ) { 
    197                                 for ( int j = 0; j < eSmp._w().length(); j++ ) { 
    198                                         lW ( i, j ) = pdfs ( i )->evallogcond ( eSmp._samples() ( j ), emptyvec ); 
    199                                 } 
    200                         } 
    201  
    202                         vec w_nn = merge_points ( lW ); 
    203                         vec wtmp = exp ( w_nn - max ( w_nn ) ); 
    204                         //renormalize 
    205                         eSmp._w() = wtmp / sum ( wtmp ); 
    206                 } else { 
    207                         bdm_error ( "Sources are not compatible - use merger_mix" ); 
    208                 } 
    209         }; 
    210  
     136        virtual void merge (); 
    211137 
    212138        //! Merge log-likelihood values in points using method specified by parameter METHOD 
     
    216142        //! sample from merged density 
    217143//! weight w is a 
    218         vec mean() const { 
    219                 const Vec<double> &w = eSmp._w(); 
    220                 const Array<vec> &S = eSmp._samples(); 
    221                 vec tmp = zeros ( dim ); 
    222                 for ( int i = 0; i < Npoints; i++ ) { 
    223                         tmp += w ( i ) * S ( i ); 
    224                 } 
    225                 return tmp; 
    226         } 
    227         mat covariance() const { 
    228                 const vec &w = eSmp._w(); 
    229                 const Array<vec> &S = eSmp._samples(); 
    230  
    231                 vec mea = mean(); 
    232  
    233 //                      cout << sum (w) << "," << w*w << endl; 
    234  
    235                 mat Tmp = zeros ( dim, dim ); 
    236                 for ( int i = 0; i < Npoints; i++ ) { 
    237                         Tmp += w ( i ) * outer_product ( S ( i ), S ( i ) ); 
    238                 } 
    239                 return Tmp - outer_product ( mea, mea ); 
    240         } 
    241         vec variance() const { 
    242                 const vec &w = eSmp._w(); 
    243                 const Array<vec> &S = eSmp._samples(); 
    244  
    245                 vec tmp = zeros ( dim ); 
    246                 for ( int i = 0; i < Nsources; i++ ) { 
    247                         tmp += w ( i ) * pow ( S ( i ), 2 ); 
    248                 } 
    249                 return tmp - pow ( mean(), 2 ); 
    250         } 
     144        vec mean() const; 
     145 
     146        mat covariance() const; 
     147 
     148        vec variance() const; 
     149 
    251150        //!@} 
    252151