root/bdm/estim/merger.h @ 254

Revision 254, 3.7 kB (checked in by smidl, 15 years ago)

create namespace bdm

Line 
1/*!
2  \file
3  \brief Mergers for combination of pdfs
4  \author Vaclav Smidl.
5
6  -----------------------------------
7  BDM++ - C++ library for Bayesian Decision Making under Uncertainty
8
9  Using IT++ for numerical operations
10  -----------------------------------
11*/
12
13#ifndef MER_H
14#define MER_H
15
16#include <itpp/itbase.h>
17#include "mixef.h"
18
19namespace bdm{
20using std::string;
21
22/*!
23@brief Function for general combination of pdfs
24
25Mixtures of Gaussian densities are used internally. Switching to other densities should be trivial.
26*/
27
28class merger : public compositepdf, public epdf {
29protected:
30        //!Internal mixture of EF models
31        MixEF Mix;
32        //! Data link for each mpdf in mpdfs
33        Array<datalink_m2e*> dls;
34        //! Array of rvs that are not modelled by mpdfs at all (aux)
35        Array<RV> rvzs;
36        //! Data Links of rv0 mpdfs - these will be conditioned the (rv,rvc) of mpdfs
37        Array<datalink_m2e*> zdls;
38
39        //!Number of samples used in approximation
40        int Ns;
41        //!Number of components in a mixture
42        int Nc;
43        //!Prior on the log-normal merging model
44        double beta;
45        //! Projection to empirical density
46        eEmp eSmp;
47
48public:
49//!Default constructor
50        merger ( const Array<mpdf*> &S ) :
51                        compositepdf ( S ), epdf ( getrv ( false ) ),
52                        Mix ( Array<BMEF*> ( 0 ),vec ( 0 ) ), dls ( n ), rvzs ( n ), zdls ( n ), eSmp(rv,0) {
53                RV ztmp;
54                // Extend rv by rvc!
55                RV rvc; setrvc ( rv,rvc );
56                rv.add ( rvc );
57                for ( int i=0;i<n;i++ ) {
58                        //Establich connection between mpdfs and merger
59                        dls ( i ) = new datalink_m2e ( mpdfs ( i )->_rv(), mpdfs ( i )->_rvc(), rv );
60                        // find out what is missing in each mpdf
61                        ztmp= mpdfs ( i )->_rv();
62                        ztmp.add ( mpdfs ( i )->_rvc() );
63                        rvzs ( i ) =rv.subt ( ztmp );
64                        zdls ( i ) = new datalink_m2e ( rvzs ( i ), ztmp, rv ) ;
65                };
66                //Set Default values of parameters
67                beta=2.0;
68                Ns=100;
69                Nc=10;
70                Mix.set_method ( EM );
71        }
72//! Set internal parameters used in approximation
73        void set_parameters ( double beta0, int Ns0, int Nc0 ) {beta=beta0;Ns=Ns0;Nc=Nc0;eSmp.set_n(Ns0,false);}
74//!Initialize the proposal density. This function must be called before merge()!
75        void init() { ////////////// NOT FINISHED
76                Array<vec> Smps ( n );
77                //Gibbs sampling
78                for ( int i=0;i<n;i++ ) {Smps ( i ) =zeros ( 0 );}
79        }
80//!Create a mixture density using known proposal
81        void merge ( const epdf* g0 );
82//!Create a mixture density, make sure to call init() before the first call
83        void merge () {merge ( & ( Mix._epdf() ) );};
84
85//! Merge log-likelihood values
86        vec lognorm_merge ( mat &lW );
87//! sample from merged density
88//! weight w is a
89        vec sample ( ) const { return Mix._epdf().sample();}
90        double evallog ( const vec &dt ) const {
91                vec dtf=ones ( dt.length() +1 );
92                dtf.set_subvector ( 0,dt );
93                return Mix.logpred ( dtf );
94        }
95        vec mean() const {
96                const Vec<double> &w = eSmp._w();
97                const Array<vec> &S = eSmp._samples();
98                vec tmp=zeros ( rv.count() ); 
99                for ( int i=0; i<Ns; i++ ) {
100                        tmp+=w ( i ) *S ( i );
101                }
102                return tmp;
103        }
104        mat covariance() const {
105                const vec &w = eSmp._w();
106                const Array<vec> &S = eSmp._samples();
107               
108                vec mea = mean(); 
109               
110                cout << sum(w) << "," << w*w <<endl;
111               
112                mat Tmp=zeros(rv.count(), rv.count());
113                for ( int i=0; i<Ns; i++ ) {
114                        Tmp+=w ( i ) *outer_product(S ( i ), S(i));
115                }
116                return Tmp-outer_product(mea,mea);
117        }
118        vec variance() const {
119                const vec &w = eSmp._w();
120                const Array<vec> &S = eSmp._samples();
121               
122                vec tmp=zeros(rv.count());
123                for ( int i=0; i<Ns; i++ ) {
124                        tmp+=w ( i ) *pow(S ( i ),2);
125                }
126                return tmp-pow(mean(),2);
127        }
128//! for future use
129        virtual ~merger() {
130                for ( int i=0; i<n; i++ ) {
131                        delete dls ( i );
132                        delete zdls ( i );
133                }
134        };
135
136//! Access function
137        MixEF& _Mix() {return Mix;}
138//! Access function
139        eEmp& _Smp() {return eSmp;}
140};
141
142}
143
144#endif // MER_H
Note: See TracBrowser for help on using the browser.