| 1 |   | #include <estim/arx.h>  | 
                      
                        | 2 |   | #include <itpp/itmex.h>  | 
                      
                        | 3 |   | #include "mex_parser.h"  | 
                      
                        | 4 |   |   | 
                      
                        | 5 |   | namespace bdm {  | 
                      
                        | 6 |   | /*!  | 
                      
                        | 7 |   | * \brief Wrapper of BM mapping BM's methods to matlab functions  | 
                      
                        | 8 |   |   | 
                      
                        | 9 |   | The data are stored in an internal matrix \c Data . Each column of Data corresponds to one discrete time observation \f$t\f$. Access to this matrix is via indices \c rowid and \c delays.  | 
                      
                        | 10 |   |   | 
                      
                        | 11 |   | The data can be loaded from a file.  | 
                      
                        | 12 |   | */  | 
                      
                        | 13 |   |   | 
                      
                        | 14 |   | using namespace bdm;  | 
                      
                        | 15 |   |   | 
                      
                        | 16 |   | //! epdf with functions implemented in matlab  | 
                      
                        | 17 |   | class mexEpdf: public epdf {  | 
                      
                        | 18 |   | protected:  | 
                      
                        | 19 |   |         //! prefix of matlab functions  | 
                      
                        | 20 |   |         string name;  | 
                      
                        | 21 |   |         //! pointer to storage structure  | 
                      
                        | 22 |   |         mxArray *data;  | 
                      
                        | 23 |   | public:  | 
                      
                        | 24 |   |         mexEpdf() {};  | 
                      
                        | 25 |   |         void from_setting ( const Setting &S )  {  | 
                      
                        | 26 |   |                 UIFile conf( ( const char * ) S["name"] );  | 
                      
                        | 27 |   |                 data = UImxArray::create_mxArray( conf );  | 
                      
                        | 28 |   |                 //mexCallMATLAB(1, &data, 0, 0, (name+"_new").c_str());  | 
                      
                        | 29 |   |                 //TODO (future...):  | 
                      
                        | 30 |   |                 //mxArray * init_data = setting2mxarray S["init_data"];  | 
                      
                        | 31 |   |                 //mexCallMATLAB(1, &data, 1, &init_data, name+"_from_setting");  | 
                      
                        | 32 |   |                 //delete init_data;  | 
                      
                        | 33 |   |         }  | 
                      
                        | 34 |   |         vec mean() const {  | 
                      
                        | 35 |   |                 mxArray *tmp;  | 
                      
                        | 36 |   |                 string fname = name + "_mean";  | 
                      
                        | 37 |   |                 mexCallMATLAB ( 1, &tmp, 1, ( mxArray ** ) &data, fname.c_str() );  | 
                      
                        | 38 |   |                 return mxArray2vec ( tmp );  | 
                      
                        | 39 |   |         }  | 
                      
                        | 40 |   |   | 
                      
                        | 41 |   |         virtual vec sample() const NOT_IMPLEMENTED(0);  | 
                      
                        | 42 |   |   | 
                      
                        | 43 |   |         virtual double evallog ( const vec &val ) const NOT_IMPLEMENTED(0);  | 
                      
                        | 44 |   |           | 
                      
                        | 45 |   |         virtual vec variance() const NOT_IMPLEMENTED(0);  | 
                      
                      
                        |   | 1 | #include <mex/mex_parser.h>  | 
                      
                        |   | 2 | #include <mex/mex_pdf.h>  | 
                      
                        |   | 3 | class mexBM: public BM{  | 
                      
                        |   | 4 |         protected:  | 
                      
                        |   | 5 |                 mxArray *data;  | 
                      
                        |   | 6 |                 mexEpdf est;  | 
                      
                        |   | 7 |         public:  | 
                      
                        |   | 8 |                 mexBM() {};  | 
                      
                        |   | 9 |                 void from_setting(const Setting &S)  {  | 
                      
                        |   | 10 |                         Setting &So=S["object"];  | 
                      
                        |   | 11 |                         data = (mxArray*)long(So);  | 
                      
                        |   | 12 |                 }   | 
                      
                        |   | 13 |                 void validate() {  | 
                      
                        |   | 14 |                         mexCallMATLAB(0, 0, 1, &data,  "validate");  | 
                      
                        |   | 15 |                         mxArray *tmp;  | 
                      
                        |   | 16 |                         mexCallMATLAB(1, &tmp, 1, &data, "dimensions");  | 
                      
                        |   | 17 |                         vec v=mxArray2vec(tmp);  | 
                      
                        |   | 18 |                         if (v.length()<3) {bdm_error("Three dimensions are expected in mexBM.dimensions");}  | 
                      
                        |   | 19 |                         set_dim(v(0));  | 
                      
                        |   | 20 |                         dimy = v(1);  | 
                      
                        |   | 21 |                         dimc = v(2);  | 
                      
                        |   | 22 |                 }  | 
                      
                        |   | 23 |                 void bayes(const vec &dt, const vec &cond) {  | 
                      
                        |   | 24 |                         mxArray *tmp;  | 
                      
                        |   | 25 |                         mxArray *in[3];  | 
                      
                        |   | 26 |                         in[0]=data;  | 
                      
                        |   | 27 |                         in[1]=mxCreateDoubleMatrix(dt.length(),1,mxREAL);  | 
                      
                        |   | 28 |                         vec2mxArray(dt,in[1]);  | 
                      
                        |   | 29 |                         in[2]=mxCreateDoubleMatrix(cond.length(),1,mxREAL);  | 
                      
                        |   | 30 |                         vec2mxArray(cond,in[2]);  | 
                      
                        |   | 31 |                           | 
                      
                        |   | 32 |                         mexCallMATLAB(1, &tmp, 3, in, "bayes");  | 
                      
                        |   | 33 |                         if (data!=tmp){  | 
                      
                        |   | 34 |                                 mxDestroyArray ( data );  | 
                      
                        |   | 35 |                                 data = mxDuplicateArray ( tmp );  | 
                      
                        |   | 36 |                         }                       //  | 
                      
                        |   | 37 |                 }  | 
                      
                        |   | 38 |                 epdf* predictor(const vec &cond) const {  | 
                      
                        |   | 39 |                         mxArray *tmp;  | 
                      
                        |   | 40 |                         mxArray *in[3];  | 
                      
                        |   | 41 |                         in[0]=data;  | 
                      
                        |   | 42 |                         in[1]=mxCreateDoubleMatrix(cond.length(),1,mxREAL);  | 
                      
                        |   | 43 |                         vec2mxArray(cond,in[1]);  | 
                      
                        |   | 44 |                           | 
                      
                        |   | 45 |                         mexCallMATLAB(1, &tmp, 3, in, "predictor");  | 
                      
                        |   | 46 |                           | 
                      
                        |   | 47 |                         UImxArray uitmp(tmp);  | 
                      
                        |   | 48 |                         shared_ptr<epdf> pred = UI::build<epdf>(uitmp);  | 
                      
                        |   | 49 |                         return pred.get();  | 
                      
                        |   | 50 |                         //  | 
                      
                        |   | 51 |                 }  | 
                      
                        |   | 52 |                 const epdf& posterior() const {  | 
                      
                        |   | 53 |                         return est;  | 
                      
                        |   | 54 |                 }  | 
                      
            
                      
                        | 47 |   | UIREGISTER ( mexEpdf );  | 
                      
                        | 48 |   |   | 
                      
                        | 49 |   | //! BM with functions implemented in matlab  | 
                      
                        | 50 |   | class mexBM: public BM {  | 
                      
                        | 51 |   | protected :  | 
                      
                        | 52 |   |         //! prefix of matlab functions  | 
                      
                        | 53 |   |         string name;  | 
                      
                        | 54 |   |         //! internal estimator  | 
                      
                        | 55 |   |         mexEpdf est;  | 
                      
                        | 56 |   |         //! mxArray with attributes of this object  | 
                      
                        | 57 |   |         mxArray *data;  | 
                      
                        | 58 |   | public:  | 
                      
                        | 59 |   |         mexBM() {}  | 
                      
                        | 60 |   |   | 
                      
                        | 61 |   |         //! duplicate internal data pointer?  | 
                      
                        | 62 |   |         mxArray *get_data() {  | 
                      
                        | 63 |   |                 //mexCallMATLAB(0, NULL, 1, &data, "dump");  | 
                      
                        | 64 |   |                 return mxDuplicateArray ( data );  | 
                      
                        | 65 |   |         }  | 
                      
                        | 66 |   |   | 
                      
                        | 67 |   |         void from_setting ( const Setting &S )  {  | 
                      
                        | 68 |   |                 BM::from_setting ( S );  | 
                      
                        | 69 |   |   | 
                      
                        | 70 |   |                 UIFile conf( ( const char * ) S["name"] );  | 
                      
                        | 71 |   |                 data = UImxArray::create_mxArray( conf );  | 
                      
                        | 72 |   |   | 
                      
                        | 73 |   |                 //string fname = name+"_new";  | 
                      
                        | 74 |   |                 //mexCallMATLAB(1, &data, 0, 0, (name+"_new").c_str());  | 
                      
                        | 75 |   |                 //the following works as long as the posterior is the  | 
                      
                        | 76 |   |                 //only member object there could be a structure of  | 
                      
                        | 77 |   |                 //member objects in the setting and a for cycle over  | 
                      
                        | 78 |   |                 //all of them right here in the code  | 
                      
                        | 79 |   |                 Setting &posterior = S["posterior"];  | 
                      
                        | 80 |   |                 est.from_setting ( posterior );  | 
                      
                        | 81 |   |         }  | 
                      
                        | 82 |   |         void bayes ( const vec &yt, const vec &cond )  {  | 
                      
                        | 83 |   |                 //void bayes()  {  | 
                      
                        | 84 |   |                 mxArray *tmp, *old;  | 
                      
                        | 85 |   |                 mxArray *in[2];  | 
                      
                        | 86 |   |                 in[0] = data;  | 
                      
                        | 87 |   |                 in[1] = mxCreateDoubleMatrix ( yt.size(), 1, mxREAL );  | 
                      
                        | 88 |   |                 vec2mxArray ( yt, in[1] );  | 
                      
                        | 89 |   |                 mexCallMATLAB ( 1, &tmp, 2, in, ( name + "_bayes" ).c_str() );  | 
                      
                        | 90 |   |                 old = data;  | 
                      
                        | 91 |   |                 data = mxDuplicateArray ( tmp );  | 
                      
                        | 92 |   |                 if ( old ) mxDestroyArray ( old );  | 
                      
                        | 93 |   |                 if ( tmp ) mxDestroyArray ( tmp );  | 
                      
                        | 94 |   |                 //mexCallMATLAB(0, NULL, 1, &data, "dump");  | 
                      
                        | 95 |   |         }  | 
                      
                        | 96 |   |         //! return correctly typed posterior (covariant return)  | 
                      
                        | 97 |   |         const mexEpdf& posterior() const  {  | 
                      
                        | 98 |   |                 return est;  | 
                      
                        | 99 |   |         } //tohle by melo zustat!!  | 
                      
                        | 100 |   |   | 
                      
                        | 101 |   | };  | 
                      
                        | 102 |   | UIREGISTER ( mexBM );  | 
                      
                        | 103 |   |   | 
                      
                        | 104 |   | }  | 
                      
                      
                        |   | 56 | UIREGISTER(mexBM);  |