Show
Ignore:
Timestamp:
08/05/09 14:40:03 (15 years ago)
Author:
mido
Message:

panove, vite, jak jsem peclivej na upravu kodu.. snad se vam bude libit:) konfigurace je v souboru /system/astylerc

Files:
1 modified

Legend:

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

    r471 r477  
    1414#define EMIX_H 
    1515 
    16 #define LOG2  0.69314718055995   
     16#define LOG2  0.69314718055995 
    1717 
    1818#include "../shared_ptr.h" 
     
    4848        //!Default constructor. By default, the given epdf is not copied! 
    4949        //! It is assumed that this function will be used only temporarily. 
    50         mratio ( const epdf* nom0, const RV &rv, bool copy=false ) :mpdf ( ), dl ( ) { 
     50        mratio ( const epdf* nom0, const RV &rv, bool copy = false ) : mpdf ( ), dl ( ) { 
    5151                // adjust rv and rvc 
    5252                rvc = nom0->_rv().subt ( rv ); 
    5353                dimc = rvc._dsize(); 
    54                 set_ep(shared_ptr<epdf>(new epdf)); 
    55                 e()->set_parameters(rv._dsize()); 
    56                 e()->set_rv(rv); 
    57                  
     54                set_ep ( shared_ptr<epdf> ( new epdf ) ); 
     55                e()->set_parameters ( rv._dsize() ); 
     56                e()->set_rv ( rv ); 
     57 
    5858                //prepare data structures 
    59                 if ( copy ) {it_error ( "todo" ); destroynom=true; } 
    60                 else { nom = nom0; destroynom = false; } 
    61                 it_assert_debug ( rvc.length() >0,"Makes no sense to use this object!" );                
    62                  
     59                if ( copy ) { 
     60                        it_error ( "todo" ); 
     61                        destroynom = true; 
     62                } else { 
     63                        nom = nom0; 
     64                        destroynom = false; 
     65                } 
     66                it_assert_debug ( rvc.length() > 0, "Makes no sense to use this object!" ); 
     67 
    6368                // build denominator 
    6469                den = nom->marginal ( rvc ); 
    65                 dl.set_connection(rv,rvc,nom0->_rv()); 
     70                dl.set_connection ( rv, rvc, nom0->_rv() ); 
    6671        }; 
    6772        double evallogcond ( const vec &val, const vec &cond ) { 
    6873                double tmp; 
    6974                vec nom_val ( e()->dimension() + dimc ); 
    70                 dl.pushup_cond ( nom_val,val,cond ); 
     75                dl.pushup_cond ( nom_val, val, cond ); 
    7176                tmp = exp ( nom->evallog ( nom_val ) - den->evallog ( cond ) ); 
    72                 it_assert_debug ( std::isfinite ( tmp ),"Infinite value" ); 
     77                it_assert_debug ( std::isfinite ( tmp ), "Infinite value" ); 
    7378                return tmp; 
    7479        } 
    7580        //! Object takes ownership of nom and will destroy it 
    76         void ownnom() {destroynom=true;} 
     81        void ownnom() { 
     82                destroynom = true; 
     83        } 
    7784        //! Default destructor 
    78         ~mratio() {delete den; if ( destroynom ) {delete nom;}} 
     85        ~mratio() { 
     86                delete den; 
     87                if ( destroynom ) { 
     88                        delete nom; 
     89                } 
     90        } 
    7991}; 
    8092 
     
    102114        //! Set weights \c w and components \c Coms 
    103115        //!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. 
    104         void set_parameters ( const vec &w, const Array<epdf*> &Coms, bool copy=false ); 
     116        void set_parameters ( const vec &w, const Array<epdf*> &Coms, bool copy = false ); 
    105117 
    106118        vec sample() const; 
    107119        vec mean() const { 
    108                 int i; vec mu = zeros ( dim ); 
    109                 for ( i = 0;i < w.length();i++ ) {mu += w ( i ) * Coms ( i )->mean(); } 
     120                int i; 
     121                vec mu = zeros ( dim ); 
     122                for ( i = 0; i < w.length(); i++ ) { 
     123                        mu += w ( i ) * Coms ( i )->mean(); 
     124                } 
    110125                return mu; 
    111126        } 
     
    113128                //non-central moment 
    114129                vec mom2 = zeros ( dim ); 
    115                 for ( int i = 0;i < w.length();i++ ) {mom2 += w ( i ) * (Coms(i)->variance() + pow ( Coms ( i )->mean(),2 )); } 
     130                for ( int i = 0; i < w.length(); i++ ) { 
     131                        mom2 += w ( i ) * ( Coms ( i )->variance() + pow ( Coms ( i )->mean(), 2 ) ); 
     132                } 
    116133                //central moment 
    117                 return mom2-pow ( mean(),2 ); 
     134                return mom2 - pow ( mean(), 2 ); 
    118135        } 
    119136        double evallog ( const vec &val ) const { 
    120137                int i; 
    121138                double sum = 0.0; 
    122                 for ( i = 0;i < w.length();i++ ) {sum += w ( i ) * exp ( Coms ( i )->evallog ( val ) );} 
    123                 if ( sum==0.0 ) {sum=std::numeric_limits<double>::epsilon();} 
    124                 double tmp=log ( sum ); 
    125                 it_assert_debug ( std::isfinite ( tmp ),"Infinite" ); 
     139                for ( i = 0; i < w.length(); i++ ) { 
     140                        sum += w ( i ) * exp ( Coms ( i )->evallog ( val ) ); 
     141                } 
     142                if ( sum == 0.0 ) { 
     143                        sum = std::numeric_limits<double>::epsilon(); 
     144                } 
     145                double tmp = log ( sum ); 
     146                it_assert_debug ( std::isfinite ( tmp ), "Infinite" ); 
    126147                return tmp; 
    127148        }; 
    128149        vec evallog_m ( const mat &Val ) const { 
    129                 vec x=zeros ( Val.cols() ); 
     150                vec x = zeros ( Val.cols() ); 
    130151                for ( int i = 0; i < w.length(); i++ ) { 
    131                         x+= w ( i ) *exp ( Coms ( i )->evallog_m ( Val ) ); 
     152                        x += w ( i ) * exp ( Coms ( i )->evallog_m ( Val ) ); 
    132153                } 
    133154                return log ( x ); 
     
    147168//Access methods 
    148169        //! returns a pointer to the internal mean value. Use with Care! 
    149         vec& _w() {return w;} 
    150         virtual ~emix() {if ( destroyComs ) {for ( int i=0;i<Coms.length();i++ ) {delete Coms ( i );}}} 
     170        vec& _w() { 
     171                return w; 
     172        } 
     173        virtual ~emix() { 
     174                if ( destroyComs ) { 
     175                        for ( int i = 0; i < Coms.length(); i++ ) { 
     176                                delete Coms ( i ); 
     177                        } 
     178                } 
     179        } 
    151180        //! Auxiliary function for taking ownership of the Coms() 
    152         void ownComs() {destroyComs=true;} 
     181        void ownComs() { 
     182                destroyComs = true; 
     183        } 
    153184 
    154185        //!access function 
    155         epdf* _Coms ( int i ) {return Coms ( i );} 
    156         void set_rv(const RV &rv){ 
    157                 epdf::set_rv(rv); 
    158                 for(int i=0;i<Coms.length();i++){Coms(i)->set_rv(rv);} 
     186        epdf* _Coms ( int i ) { 
     187                return Coms ( i ); 
     188        } 
     189        void set_rv ( const RV &rv ) { 
     190                epdf::set_rv ( rv ); 
     191                for ( int i = 0; i < Coms.length(); i++ ) { 
     192                        Coms ( i )->set_rv ( rv ); 
     193                } 
    159194        } 
    160195}; 
     
    179214        //! Set weights \c w and components \c Coms 
    180215        //!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. 
    181         void set_parameters ( const vec &w, const Array<egiw*> &Coms, bool copy=false ); 
     216        void set_parameters ( const vec &w, const Array<egiw*> &Coms, bool copy = false ); 
    182217 
    183218        //!return expected value 
     
    188223 
    189224        //!return the expected variance 
    190         vec variance() const; 
     225        vec variance() const; 
    191226 
    192227        // TODO!!! Defined to follow ANSI and/or for future development 
    193228        void mean_mat ( mat &M, mat&R ) const {}; 
    194         double evallog_nn ( const vec &val ) const {return 0;}; 
    195         double lognc () const {return 0;}; 
     229        double evallog_nn ( const vec &val ) const { 
     230                return 0; 
     231        }; 
     232        double lognc () const { 
     233                return 0; 
     234        }; 
    196235        emix* marginal ( const RV &rv ) const; 
    197236 
    198237//Access methods 
    199238        //! returns a pointer to the internal mean value. Use with Care! 
    200         vec& _w() {return w;} 
    201         virtual ~egiwmix() {if ( destroyComs ) {for ( int i=0;i<Coms.length();i++ ) {delete Coms ( i );}}} 
     239        vec& _w() { 
     240                return w; 
     241        } 
     242        virtual ~egiwmix() { 
     243                if ( destroyComs ) { 
     244                        for ( int i = 0; i < Coms.length(); i++ ) { 
     245                                delete Coms ( i ); 
     246                        } 
     247                } 
     248        } 
    202249        //! Auxiliary function for taking ownership of the Coms() 
    203         void ownComs() {destroyComs=true;} 
     250        void ownComs() { 
     251                destroyComs = true; 
     252        } 
    204253 
    205254        //!access function 
    206         egiw* _Coms ( int i ) {return Coms ( i );} 
    207  
    208         void set_rv(const RV &rv){ 
    209                 egiw::set_rv(rv); 
    210                 for(int i=0;i<Coms.length();i++){Coms(i)->set_rv(rv);} 
     255        egiw* _Coms ( int i ) { 
     256                return Coms ( i ); 
     257        } 
     258 
     259        void set_rv ( const RV &rv ) { 
     260                egiw::set_rv ( rv ); 
     261                for ( int i = 0; i < Coms.length(); i++ ) { 
     262                        Coms ( i )->set_rv ( rv ); 
     263                } 
    211264        } 
    212265 
     
    236289        /*!\brief Constructor from list of mFacs, 
    237290        */ 
    238         mprod():dummy(new epdf()) { } 
    239         mprod (Array<mpdf*> mFacs): 
    240             dummy(new epdf()) { 
    241             set_elements(mFacs); 
    242         } 
    243  
    244         void set_elements(Array<mpdf*> mFacs , bool own=false) { 
    245                  
    246                 compositepdf::set_elements(mFacs,own); 
    247                 dls.set_size(mFacs.length()); 
    248                 epdfs.set_size(mFacs.length()); 
    249                                  
    250                 set_ep(dummy); 
    251                 RV rv=getrv ( true ); 
     291        mprod() : dummy ( new epdf() ) { } 
     292        mprod ( Array<mpdf*> mFacs ) : 
     293                        dummy ( new epdf() ) { 
     294                set_elements ( mFacs ); 
     295        } 
     296 
     297        void set_elements ( Array<mpdf*> mFacs , bool own = false ) { 
     298 
     299                compositepdf::set_elements ( mFacs, own ); 
     300                dls.set_size ( mFacs.length() ); 
     301                epdfs.set_size ( mFacs.length() ); 
     302 
     303                set_ep ( dummy ); 
     304                RV rv = getrv ( true ); 
    252305                set_rv ( rv ); 
    253                 dummy->set_parameters(rv._dsize()); 
    254                 setrvc(e()->_rv(), rvc); 
     306                dummy->set_parameters ( rv._dsize() ); 
     307                setrvc ( e()->_rv(), rvc ); 
    255308                // rv and rvc established = > we can link them with mpdfs 
    256                 for ( int i = 0;i < mpdfs.length(); i++ ) { 
     309                for ( int i = 0; i < mpdfs.length(); i++ ) { 
    257310                        dls ( i ) = new datalink_m2m; 
    258                         dls(i)->set_connection( mpdfs ( i )->_rv(), mpdfs ( i )->_rvc(), _rv(), _rvc() ); 
    259                 } 
    260  
    261                 for ( int i=0; i<mpdfs.length(); i++ ) { 
    262                         epdfs(i) = mpdfs(i)->e(); 
     311                        dls ( i )->set_connection ( mpdfs ( i )->_rv(), mpdfs ( i )->_rvc(), _rv(), _rvc() ); 
     312                } 
     313 
     314                for ( int i = 0; i < mpdfs.length(); i++ ) { 
     315                        epdfs ( i ) = mpdfs ( i )->e(); 
    263316                } 
    264317        }; 
     
    267320                int i; 
    268321                double res = 0.0; 
    269                 for ( i = mpdfs.length() - 1;i >= 0;i-- ) { 
     322                for ( i = mpdfs.length() - 1; i >= 0; i-- ) { 
    270323                        /*                      if ( mpdfs(i)->_rvc().count() >0) { 
    271324                                                        mpdfs ( i )->condition ( dls ( i )->get_cond ( val,cond ) ); 
     
    280333                return res; 
    281334        } 
    282         vec evallogcond_m(const mat &Dt, const vec &cond) { 
    283                 vec tmp(Dt.cols()); 
    284                 for(int i=0;i<Dt.cols(); i++){ 
    285                         tmp(i) = evallogcond(Dt.get_col(i),cond); 
    286                 } 
    287                 return tmp; 
    288         }; 
    289         vec evallogcond_m(const Array<vec> &Dt, const vec &cond) { 
    290                 vec tmp(Dt.length()); 
    291                 for(int i=0;i<Dt.length(); i++){ 
    292                         tmp(i) = evallogcond(Dt(i),cond); 
    293                 } 
    294                 return tmp;              
     335        vec evallogcond_m ( const mat &Dt, const vec &cond ) { 
     336                vec tmp ( Dt.cols() ); 
     337                for ( int i = 0; i < Dt.cols(); i++ ) { 
     338                        tmp ( i ) = evallogcond ( Dt.get_col ( i ), cond ); 
     339                } 
     340                return tmp; 
     341        }; 
     342        vec evallogcond_m ( const Array<vec> &Dt, const vec &cond ) { 
     343                vec tmp ( Dt.length() ); 
     344                for ( int i = 0; i < Dt.length(); i++ ) { 
     345                        tmp ( i ) = evallogcond ( Dt ( i ), cond ); 
     346                } 
     347                return tmp; 
    295348        }; 
    296349 
     
    298351        //TODO smarter... 
    299352        vec samplecond ( const vec &cond ) { 
    300             //! Ugly hack to help to discover if mpfs are not in proper order. Correct solution = check that explicitely. 
    301             vec smp= std::numeric_limits<double>::infinity() * ones ( e()->dimension() ); 
     353                //! Ugly hack to help to discover if mpfs are not in proper order. Correct solution = check that explicitely. 
     354                vec smp = std::numeric_limits<double>::infinity() * ones ( e()->dimension() ); 
    302355                vec smpi; 
    303356                // Hard assumption here!!! We are going backwards, to assure that samples that are needed from smp are already generated! 
    304                 for ( int i = ( mpdfs.length() - 1 );i >= 0;i-- ) { 
     357                for ( int i = ( mpdfs.length() - 1 ); i >= 0; i-- ) { 
    305358                        if ( mpdfs ( i )->dimensionc() ) { 
    306                                 mpdfs ( i )->condition ( dls ( i )->get_cond ( smp ,cond ) ); // smp is val here!! 
     359                                mpdfs ( i )->condition ( dls ( i )->get_cond ( smp , cond ) ); // smp is val here!! 
    307360                        } 
    308361                        smpi = epdfs ( i )->sample(); 
     
    314367        } 
    315368        mat samplecond ( const vec &cond,  int N ) { 
    316                 mat Smp ( dimension(),N ); 
    317                 for ( int i=0;i<N;i++ ) {Smp.set_col ( i,samplecond ( cond ) );} 
     369                mat Smp ( dimension(), N ); 
     370                for ( int i = 0; i < N; i++ ) { 
     371                        Smp.set_col ( i, samplecond ( cond ) ); 
     372                } 
    318373                return Smp; 
    319374        } 
     
    327382        //! \endcode 
    328383        //!@} 
    329         void from_setting(const Setting &set){ 
     384        void from_setting ( const Setting &set ) { 
    330385                Array<mpdf*> Atmp; //temporary Array 
    331                 UI::get(Atmp,set, "mpdfs", UI::compulsory); 
    332                 set_elements(Atmp,true); 
    333         } 
    334          
     386                UI::get ( Atmp, set, "mpdfs", UI::compulsory ); 
     387                set_elements ( Atmp, true ); 
     388        } 
     389 
    335390}; 
    336 UIREGISTER(mprod); 
     391UIREGISTER ( mprod ); 
    337392 
    338393//! Product of independent epdfs. For dependent pdfs, use mprod. 
     
    344399        Array<datalink*> dls; 
    345400public: 
    346         eprod () : epdfs ( 0 ),dls ( 0 ) {}; 
    347         void set_parameters ( const Array<const epdf*> &epdfs0, bool named=true ) { 
    348                 epdfs=epdfs0;//.set_length ( epdfs0.length() ); 
     401        eprod () : epdfs ( 0 ), dls ( 0 ) {}; 
     402        void set_parameters ( const Array<const epdf*> &epdfs0, bool named = true ) { 
     403                epdfs = epdfs0;//.set_length ( epdfs0.length() ); 
    349404                dls.set_length ( epdfs.length() ); 
    350405 
    351                 bool independent=true; 
     406                bool independent = true; 
    352407                if ( named ) { 
    353                         for ( int i=0;i<epdfs.length();i++ ) { 
    354                                 independent=rv.add ( epdfs ( i )->_rv() ); 
    355                                 it_assert_debug ( independent==true, "eprod:: given components are not independent." ); 
     408                        for ( int i = 0; i < epdfs.length(); i++ ) { 
     409                                independent = rv.add ( epdfs ( i )->_rv() ); 
     410                                it_assert_debug ( independent == true, "eprod:: given components are not independent." ); 
    356411                        } 
    357                         dim=rv._dsize(); 
    358                 } 
    359                 else { 
    360                         dim =0; for ( int i=0;i<epdfs.length();i++ ) { 
    361                                 dim+=epdfs ( i )->dimension(); 
     412                        dim = rv._dsize(); 
     413                } else { 
     414                        dim = 0; 
     415                        for ( int i = 0; i < epdfs.length(); i++ ) { 
     416                                dim += epdfs ( i )->dimension(); 
    362417                        } 
    363418                } 
    364419                // 
    365                 int cumdim=0; 
    366                 int dimi=0; 
     420                int cumdim = 0; 
     421                int dimi = 0; 
    367422                int i; 
    368                 for ( i=0;i<epdfs.length();i++ ) { 
     423                for ( i = 0; i < epdfs.length(); i++ ) { 
    369424                        dls ( i ) = new datalink; 
    370                         if ( named ) {dls ( i )->set_connection ( epdfs ( i )->_rv() , rv );} 
    371                         else { 
     425                        if ( named ) { 
     426                                dls ( i )->set_connection ( epdfs ( i )->_rv() , rv ); 
     427                        } else { 
    372428                                dimi = epdfs ( i )->dimension(); 
    373                                 dls ( i )->set_connection ( dimi, dim, linspace ( cumdim,cumdim+dimi-1 ) ); 
    374                                 cumdim+=dimi; 
     429                                dls ( i )->set_connection ( dimi, dim, linspace ( cumdim, cumdim + dimi - 1 ) ); 
     430                                cumdim += dimi; 
    375431                        } 
    376432                } 
     
    379435        vec mean() const { 
    380436                vec tmp ( dim ); 
    381                 for ( int i=0;i<epdfs.length();i++ ) { 
     437                for ( int i = 0; i < epdfs.length(); i++ ) { 
    382438                        vec pom = epdfs ( i )->mean(); 
    383439                        dls ( i )->pushup ( tmp, pom ); 
     
    387443        vec variance() const { 
    388444                vec tmp ( dim ); //second moment 
    389                 for ( int i=0;i<epdfs.length();i++ ) { 
     445                for ( int i = 0; i < epdfs.length(); i++ ) { 
    390446                        vec pom = epdfs ( i )->mean(); 
    391                         dls ( i )->pushup ( tmp, pow ( pom,2 ) ); 
    392                 } 
    393                 return tmp-pow ( mean(),2 ); 
     447                        dls ( i )->pushup ( tmp, pow ( pom, 2 ) ); 
     448                } 
     449                return tmp - pow ( mean(), 2 ); 
    394450        } 
    395451        vec sample() const { 
    396452                vec tmp ( dim ); 
    397                 for ( int i=0;i<epdfs.length();i++ ) { 
     453                for ( int i = 0; i < epdfs.length(); i++ ) { 
    398454                        vec pom = epdfs ( i )->sample(); 
    399455                        dls ( i )->pushup ( tmp, pom ); 
     
    402458        } 
    403459        double evallog ( const vec &val ) const { 
    404                 double tmp=0; 
    405                 for ( int i=0;i<epdfs.length();i++ ) { 
    406                         tmp+=epdfs ( i )->evallog ( dls ( i )->pushdown ( val ) ); 
    407                 } 
    408                 it_assert_debug ( std::isfinite ( tmp ),"Infinite" ); 
     460                double tmp = 0; 
     461                for ( int i = 0; i < epdfs.length(); i++ ) { 
     462                        tmp += epdfs ( i )->evallog ( dls ( i )->pushdown ( val ) ); 
     463                } 
     464                it_assert_debug ( std::isfinite ( tmp ), "Infinite" ); 
    409465                return tmp; 
    410466        } 
    411467        //!access function 
    412         const epdf* operator () ( int i ) const {it_assert_debug ( i<epdfs.length(),"wrong index" );return epdfs ( i );} 
     468        const epdf* operator () ( int i ) const { 
     469                it_assert_debug ( i < epdfs.length(), "wrong index" ); 
     470                return epdfs ( i ); 
     471        } 
    413472 
    414473        //!Destructor 
    415         ~eprod() {for ( int i=0;i<epdfs.length();i++ ) {delete dls ( i );}} 
     474        ~eprod() { 
     475                for ( int i = 0; i < epdfs.length(); i++ ) { 
     476                        delete dls ( i ); 
     477                } 
     478        } 
    416479}; 
    417480 
     
    430493public: 
    431494        //!Default constructor 
    432         mmix():iepdf(new emix()) { 
    433             set_ep(iepdf); 
     495        mmix() : iepdf ( new emix() ) { 
     496                set_ep ( iepdf ); 
    434497        } 
    435498 
     
    438501                Array<epdf*> Eps ( Coms.length() ); 
    439502 
    440                 for ( int i = 0;i < Coms.length();i++ ) { 
    441                         Eps(i) = Coms(i)->e(); 
    442                 } 
    443  
    444                 iepdf->set_parameters(w, Eps); 
     503                for ( int i = 0; i < Coms.length(); i++ ) { 
     504                        Eps ( i ) = Coms ( i )->e(); 
     505                } 
     506 
     507                iepdf->set_parameters ( w, Eps ); 
    445508        } 
    446509 
    447510        void condition ( const vec &cond ) { 
    448                 for ( int i = 0;i < Coms.length();i++ ) {Coms ( i )->condition ( cond );} 
     511                for ( int i = 0; i < Coms.length(); i++ ) { 
     512                        Coms ( i )->condition ( cond ); 
     513                } 
    449514        }; 
    450515};