Show
Ignore:
Timestamp:
05/16/10 23:13:02 (14 years ago)
Author:
smidl
Message:

syntax of epredictor

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • library/bdm/mex/mex_BM.h

    r863 r943  
    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> 
     3class 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                } 
    4655}; 
    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 } 
     56UIREGISTER(mexBM);