Changeset 286

Show
Ignore:
Timestamp:
03/05/09 14:03:35 (15 years ago)
Author:
smidl
Message:

make mpdm work again

Files:
10 modified

Legend:

Unmodified
Added
Removed
  • CMakeLists.txt

    r285 r286  
    7676add_subdirectory (tests) 
    7777add_subdirectory (pmsm) 
    78 #add_subdirectory (mpdm) 
     78add_subdirectory (mpdm) 
    7979add_subdirectory (library) 
    8080add_subdirectory (doprava) 
  • bdm/estim/arx.cpp

    r283 r286  
    5757 
    5858enorm<ldmat>* ARX::epredictor ( const vec &rgr ) const { 
    59         int dim=est.dimension(); 
     59        int dim=dimx;//est.dimension(); 
    6060        mat mu ( dim, V.rows()-dim ); 
    6161        mat R ( dim,dim ); 
  • bdm/estim/arx.h

    r283 r286  
    5454        //!@{ 
    5555        ARX ( const double frg0=1.0 ) : BMEF ( frg0 ),est (), V ( est._V() ), nu ( est._nu() ) {}; 
    56         ARX ( const ARX &A0 ) : BMEF (),est ( A0.est ), V ( est._V() ), nu ( est._nu() ) {}; 
     56        ARX ( const ARX &A0 ) : BMEF (),est (), V ( est._V() ), nu ( est._nu() ) { 
     57                set_statistics ( A0.dimx,A0.V,A0.nu ); 
     58                set_parameters(A0.frg); 
     59        }; 
    5760        ARX* _copy_() const; 
    5861        void set_parameters ( double frg0 ) {frg=frg0;} 
     
    8285        enorm<ldmat>* epredictor ( const vec &rgr ) const; 
    8386        //! Predictor for empty regressor 
    84         enorm<ldmat>* epredictor() const {it_assert_debug ( est.dimension() ==V.rows()-1,"Regressor is not only 1" );return epredictor ( vec_1 ( 1.0 ) );} 
     87        enorm<ldmat>* epredictor() const { 
     88                it_assert_debug ( dimx==V.rows()-1,"Regressor is not only 1" ); 
     89                return epredictor ( vec_1 ( 1.0 ) ); 
     90        } 
    8591        //! conditional version of the predictor 
    8692        mlnorm<ldmat>* predictor() const; 
     
    103109                if ( _yrv._dsize() !=dimx ) { 
    104110                        int i=0; 
    105                         while ( _yrv._dsize() <dimx ) {_yrv.add ( drv ( vec_1(i) ) );i++;} 
     111                        while ( _yrv._dsize() <dimx ) {_yrv.add ( drv ( vec_1 ( i ) ) );i++;} 
    106112                } 
    107113                //yrv should be ready by now 
  • bdm/estim/merger.cpp

    r283 r286  
    5151        // Initial component in the mixture model 
    5252        mat V0=1e-8*eye ( dim +1 ); 
    53         ARX A0;  
    54         A0.set_statistics(dim, V0, dim*dim +5.0 ); //initial guess of Mix: zero mean, large variance 
     53        ARX A0; A0.set_statistics(dim, V0); //initial guess of Mix:  
    5554 
    5655        Mix.init ( &A0, Smp_ex, Nc ); 
     
    6362        char str[100]; 
    6463 
    65         epdf* Mpred=Mix.epredictor (  ); 
     64        emix* Mpred=Mix.epredictor (  ); 
    6665        vec Mix_pdf ( Ns ); 
    6766        while ( !converged ) { 
     
    7271                delete Mpred; 
    7372                Mpred = Mix.epredictor ( ); // Allocation => must be deleted at the end!! 
     73                Mpred->set_rv(rv); //the predictor predicts rv of this merger 
    7474 
    7575                // This will be active only later in iterations!!! 
  • bdm/estim/merger.h

    r283 r286  
    5252                        Mix ( Array<BMEF*> ( 0 ),vec ( 0 ) ), dls ( n ), rvzs ( n ), zdls ( n ), eSmp() { 
    5353                RV ztmp; 
     54                rv = getrv(false); 
     55                dim = rv._dsize(); 
    5456                // Extend rv by rvc! 
    5557                RV rvc; setrvc ( rv,rvc ); 
     
    5759                for ( int i=0;i<n;i++ ) { 
    5860                        //Establich connection between mpdfs and merger 
    59                         dls ( i ) = new datalink_m2e ( mpdfs ( i )->_rv(), mpdfs ( i )->_rvc(), rv ); 
     61                        dls ( i ) = new datalink_m2e;dls(i)->set_connection( mpdfs ( i )->_rv(), mpdfs ( i )->_rvc(), rv ); 
    6062                        // find out what is missing in each mpdf 
    6163                        ztmp= mpdfs ( i )->_rv(); 
    6264                        ztmp.add ( mpdfs ( i )->_rvc() ); 
    6365                        rvzs ( i ) =rv.subt ( ztmp ); 
    64                         zdls ( i ) = new datalink_m2e ( rvzs ( i ), ztmp, rv ) ; 
     66                        zdls ( i ) = new datalink_m2e; zdls(i)->set_connection ( rvzs ( i ), ztmp, rv ) ; 
    6567                }; 
    6668                //Set Default values of parameters 
  • bdm/estim/mixef.cpp

    r278 r286  
    1515        int ndat = Data.cols(); 
    1616        //Estimate  Com0 from all data 
    17         Coms ( 0 ) = ( BMEF* ) Com0->_copy_(); 
     17        Coms ( 0 ) = Com0->_copy_(); 
    1818//      Coms(0)->set_evalll(false); 
    1919        Coms ( 0 )->bayesB ( Data ); 
     
    2424        for ( i=1;i<n;i++ ) { 
    2525                //copy Com0 and create new rvs for them 
    26                 Coms ( i ) = ( BMEF* ) Coms ( 0 )->_copy_ ( true ); 
     26                Coms ( i ) =  Coms ( 0 )->_copy_ ( ); 
    2727        } 
    2828        //Pick some data for each component and update it 
  • bdm/estim/mixef.h

    r278 r286  
    1919#include "../stat/emix.h" 
    2020 
    21 namespace bdm{ 
     21namespace bdm { 
    2222 
    2323enum MixEF_METHOD { EM = 0, QB = 1}; 
     
    5050        eprod* est; 
    5151        ////!Indeces of component rvc in common rvc 
    52          
     52 
    5353        //! Flag for a method that is used in the inference 
    5454        MixEF_METHOD method; 
    55          
     55 
    5656        //! Auxiliary function for use in constructors 
    5757        void build_est() { 
    58                 Array<const epdf*> epdfs ( n+1 ); 
    59                 for ( int i=0;i<Coms.length();i++ ) { 
     58                est = new eprod; 
     59                if ( n>0 ) { 
     60                        Array<const epdf*> epdfs ( n+1 ); 
     61                        for ( int i=0;i<Coms.length();i++ ) { 
    6062//                      it_assert_debug(!x,"MixEF::MixEF : Incompatible components"); 
    61                         epdfs ( i ) =& ( Coms ( i )->posterior() ); 
     63                                epdfs ( i ) =& ( Coms ( i )->posterior() ); 
     64                        } 
     65                        // last in the product is the weight 
     66                        epdfs ( n ) =& ( weights.posterior() ); 
     67                        est->set_parameters ( epdfs, false ); 
    6268                } 
    63                 // last in the product is the weight 
    64                 epdfs ( n ) =& ( weights.posterior() ); 
    65                 est = new eprod ( epdfs ); 
    6669        } 
    6770 
     
    6972        //! Full constructor 
    7073        MixEF ( const Array<BMEF*> &Coms0, const vec &alpha0 ) : 
    71                         BMEF (  ), n ( Coms0.length() ), Coms ( n ), 
    72                         weights (), method(QB) { 
    73         //      it_assert_debug ( n>0,"MixEF::MixEF : Empty Component list" ); 
     74                        BMEF ( ), n ( Coms0.length() ), Coms ( n ), 
     75                        weights (), method ( QB ) { 
     76                //      it_assert_debug ( n>0,"MixEF::MixEF : Empty Component list" ); 
    7477 
    7578                for ( int i=0;i<n;i++ ) {Coms ( i ) = ( BMEF* ) Coms0 ( i )->_copy_();} 
     
    7982        MixEF () : 
    8083                        BMEF ( ), n ( 0 ), Coms ( 0 ), 
    81                         weights (),method(QB) {build_est();} 
     84                        weights (),method ( QB ) {build_est();} 
    8285        //! Copy constructor 
    83         MixEF(const MixEF &M2): BMEF ( ), n ( M2.n ), Coms ( n ), 
    84                    weights ( M2.weights ), method(M2.method) { 
    85         //      it_assert_debug ( n>0,"MixEF::MixEF : Empty Component list" ); 
     86        MixEF ( const MixEF &M2 ) : BMEF ( ), n ( M2.n ), Coms ( n ), 
     87                        weights ( M2.weights ), method ( M2.method ) { 
     88                //      it_assert_debug ( n>0,"MixEF::MixEF : Empty Component list" ); 
    8689 
    87                            for ( int i=0;i<n;i++ ) {Coms ( i ) = M2.Coms ( i )->_copy_();} 
    88                            build_est(); 
    89                    } 
     90                for ( int i=0;i<n;i++ ) {Coms ( i ) = M2.Coms ( i )->_copy_();} 
     91                build_est(); 
     92        } 
    9093        //! Initializing the mixture by a random pick of centroids from data 
    9194        //! \param Com0 Initial component - necessary to determine its type. 
     
    108111        emix* epredictor() const; 
    109112        //! Flatten the density as if it was not estimated from the data 
    110         void flatten(const BMEF* M2); 
     113        void flatten ( const BMEF* M2 ); 
    111114        //! Access function 
    112         BMEF* _Coms(int i){return Coms(i);} 
    113          
     115        BMEF* _Coms ( int i ) {return Coms ( i );} 
     116 
    114117        //!Set which method is to be used 
    115         void set_method(MixEF_METHOD M){method=M;} 
     118        void set_method ( MixEF_METHOD M ) {method=M;} 
    116119}; 
    117120 
  • bdm/stat/emix.h

    r271 r286  
    1818//#include <std> 
    1919 
    20 namespace bdm{ 
     20namespace bdm { 
    2121 
    2222//this comes first because it is used inside emix! 
     
    4747        //!Default constructor. By default, the given epdf is not copied! 
    4848        //! 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 
    6263                den = nom->marginal ( rvc ); 
     64                dl.set_connection(rv,rvc,nom0->_rv()); 
    6365        }; 
    6466        double evallogcond ( const vec &val, const vec &cond ) { 
     
    6769                dl.pushup_cond ( nom_val,val,cond ); 
    6870                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" ); 
    7072                return tmp; 
    7173        } 
     
    9698public: 
    9799        //!Default constructor 
    98         emix (  ) : epdf ( ) {}; 
     100        emix ( ) : epdf ( ) {}; 
    99101        //! Set weights \c w and components \c Coms 
    100102        //!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. 
     
    103105        vec sample() const; 
    104106        vec mean() const { 
    105                 int i; vec mu = zeros ( dim); 
     107                int i; vec mu = zeros ( dim ); 
    106108                for ( i = 0;i < w.length();i++ ) {mu += w ( i ) * Coms ( i )->mean(); } 
    107109                return mu; 
     
    109111        vec variance() const { 
    110112                //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 ); } 
    113115                //central moment 
    114                 return mom2-pow(mean(),2); 
     116                return mom2-pow ( mean(),2 ); 
    115117        } 
    116118        double evallog ( const vec &val ) const { 
     
    118120                double sum = 0.0; 
    119121                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();} 
    121123                double tmp=log ( sum ); 
    122                 it_assert_debug(std::isfinite(tmp),"Infinite"); 
     124                it_assert_debug ( std::isfinite ( tmp ),"Infinite" ); 
    123125                return tmp; 
    124126        }; 
     
    151153        //!access function 
    152154        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        } 
    153159}; 
    154160 
     
    174180        mprod ( Array<mpdf*> mFacs ) : compositepdf ( mFacs ), mpdf (), epdfs ( n ), dls ( n ) { 
    175181                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() ); 
    178184                setrvc ( ep->_rv(),rvc ); 
    179185                // rv and rvc established = > we can link them with mpdfs 
    180186                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() ); 
    182189                } 
    183190 
     
    237244        Array<datalink*> dls; 
    238245public: 
    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 
    240251                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                        } 
    247276                } 
    248277        } 
     
    260289                for ( int i=0;i<epdfs.length();i++ ) { 
    261290                        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 ); 
    265294        } 
    266295        vec sample() const { 
     
    277306                        tmp+=epdfs ( i )->evallog ( dls ( i )->pushdown ( val ) ); 
    278307                } 
    279                 it_assert_debug(std::isfinite(tmp),"Infinite"); 
     308                it_assert_debug ( std::isfinite ( tmp ),"Infinite" ); 
    280309                return tmp; 
    281310        } 
  • bdm/stat/libBM.h

    r283 r286  
    261261        //! Lower and upper bounds of \c percentage % quantile, returns mean-2*sigma as default 
    262262        virtual void qbounds ( vec &lb, vec &ub, double percentage=0.95 ) const { 
    263                 vec mea=mean(); vec std=sqrt(variance());  
     263                vec mea=mean(); vec std=sqrt ( variance() ); 
    264264                lb = mea-2*std; ub=mea+2*std; 
    265265        }; 
     
    401401                it_assert_debug ( v2v_up.length() ==downsize,"rv is not fully in rv_up" ); 
    402402        } 
     403        //! set connection using indeces 
     404        void set_connection ( int ds, int us, const ivec &upind ) { 
     405                downsize = ds; 
     406                upsize = us; 
     407                v2v_up= upind; 
     408 
     409                it_assert_debug ( v2v_up.length() ==downsize,"rv is not fully in rv_up" ); 
     410        } 
    403411        //! Get val for myself from val of "Up" 
    404412        vec pushdown ( const vec &val_up ) { 
     
    425433 
    426434public: 
     435        datalink_m2e() {}; 
    427436        //! Constructor 
    428         datalink_m2e ( const RV &rv,  const RV &rvc, const RV &rv_up ) : 
    429                         datalink ( rv,rv_up ), condsize ( rvc._dsize() ) { 
     437        void set_connection ( const RV &rv,  const RV &rvc, const RV &rv_up ) { 
     438                datalink::set_connection ( rv,rv_up ); 
     439                condsize=  rvc._dsize(); 
    430440                //establish v2c connection 
    431441                rvc.dataind ( rv_up, v2c_lo, v2c_up ); 
     
    454464public: 
    455465        //! Constructor 
    456         datalink_m2m ( const RV &rv, const RV &rvc, const RV &rv_up, const RV &rvc_up ) : 
    457                         datalink_m2e ( rv, rvc, rv_up ) { 
     466        datalink_m2m() {}; 
     467        void set_connection ( const RV &rv, const RV &rvc, const RV &rv_up, const RV &rvc_up ) { 
     468                datalink_m2e::set_connection ( rv, rvc, rv_up ); 
    458469                //establish c2c connection 
    459470                rvc.dataind ( rvc_up, c2c_lo, c2c_up ); 
     
    714725                if ( opt_L_bounds ) { 
    715726                        vec ub,lb; 
    716                         posterior().qbounds(lb,ub); 
     727                        posterior().qbounds ( lb,ub ); 
    717728                        L->logit ( LIDs ( 1 ), lb ); 
    718729                        L->logit ( LIDs ( 2 ), ub ); 
  • bdm/stat/libEF.h

    r285 r286  
    9494//      virtual void flatten ( double nu0 ) {it_error ( "Not implemented" );} 
    9595 
    96         BMEF* _copy_ ( bool changerv=false ) const {it_error ( "function _copy_ not implemented for this BM" ); return NULL;}; 
     96        BMEF* _copy_ () const {it_error ( "function _copy_ not implemented for this BM" ); return NULL;}; 
    9797}; 
    9898 
     
    707707class iW : public epdf{ 
    708708        public: 
    709                 vec sample(){} 
     709                vec sample(){return vec();} 
    710710}; 
    711711