root/library/bdm/base/datasources.cpp @ 896

Revision 896, 4.0 kB (checked in by mido, 14 years ago)

cleanup of MemDS and its descendants
bdmtoolbox/CMakeLists.txt slightly changed to avoid unnecessary MEX condition
"indeces" replaced by "indices"

  • Property svn:eol-style set to native
RevLine 
[384]1#include "datasources.h"
[357]2
[254]3using namespace bdm;
[18]4
[896]5MemDS::MemDS ( mat &Dat ) : Data( Dat ) {
6}
[263]7
[896]8void MemDS::step( ) {
9        if ( time < max_length() ) {
10                time++;
[18]11        }
12}
13
[896]14void MemDS::getdata ( vec &dt ) const {
15        bdm_assert_debug ( dt.length() == Data.rows(), "MemDS:getdata incompatible dt" );
16        dt = Data.get_col ( time );
[18]17}
18
[896]19void MemDS::getdata ( vec &dt, const ivec &indices ) {
20        bdm_assert_debug ( dt.length() == indices.length(), "MemDS:getdata incompatible dt" );
21        vec tmp = Data.get_col ( time );
22        dt = tmp ( indices );
[18]23}
24
[896]25void MemDS::set_drv ( const RV &drv ) {
26        bdm_assert_debug ( drv._dsize() == Data.rows(), "MemDS::set_rvs incompatible drv" );
27        DS::set_drv ( drv, RV() );
28}
[263]29
[896]30void MemDS::from_setting ( const Setting &set ) {
31        DS::from_setting ( set );
32
33        UI::get ( Data, set, "Data", UI::compulsory );
34       
35        if ( !UI::get ( time, set, "time", UI::optional ) ) {
36                time = 0;
37        }
38       
39        shared_ptr<RV> r = UI::build<RV> ( set, "drv", UI::optional );
40        if ( !r ) {
41                r = new RV();
42                for ( int i = 0; i < Data.rows(); i++ ) {
43                        r->add ( RV ( "ch" + num2str ( i ), 1, 0 ) );
44                }
45        }
46       
47        set_drv ( *r );
48        dtsize = r->_dsize();
49        utsize = 0;
[18]50}
51
[896]52void FileDS::from_setting ( const Setting & set ) {
53        // here we do not call MemDS::from_setting intentionally as we can not load any Data matrix directly
54        DS::from_setting ( set );
[263]55
[896]56        string filename;
57        UI::get ( filename, set, "filename", UI::compulsory );
58
[609]59        time = 0;
[896]60
61        shared_ptr<RV> r = UI::build<RV> ( set, "drv", UI::optional );
62        if ( !r ) {
63                r = new RV();
64                for ( int i = 0; i < Data.rows(); i++ ) {
65                        r->add ( RV ( "ch" + num2str ( i ), 1, 0 ) );
66                }
67        }
68       
69        set_drv ( *r );
70        dtsize = r->_dsize();
71        utsize = 0;
[19]72}
[263]73
[896]74void CsvFileDS::from_setting ( const Setting & set ) {
75        FileDS::from_setting ( set );
[892]76
[896]77        vec data_line;
78        string line;
79
80        ifstream fs;
81        fs.open ( filename.c_str() );
82        if ( fs.is_open() ) {
83                while ( getline ( fs, line ) ) {
84                        data_line.set ( line );
85                        Data.append_row ( data_line );
86                }
87        }
88
89        string orientation;
90        if( UI::get ( orientation, set, "orientation", UI::optional ) & orientation == "BY_ROW" ) 
91                transpose ( Data, Data );
92}
93
94void ITppFileDS::from_setting ( const Setting & set ) {
95        FileDS::from_setting ( set );
96
97        string varname;
98        UI::get ( varname, set, "varname", UI::compulsory );
99
100        it_file it ( filename );
101        it << Name ( varname );
[892]102        it >> Data;
103}
104
[738]105void PdfDS::step() {
106        yt2rgr.store_data ( yt ); // y is now history
107        ut2rgr.filldown ( ut, rgr );
108        yt2rgr.filldown ( yt, rgr );
109        yt = ipdf->samplecond ( rgr );
110        ut2rgr.store_data ( ut ); //u is now history
111}
112
[896]113void PdfDS::getdata ( vec & dt_out ) const {
[895]114        bdm_assert_debug ( dt_out.length() >= dtsize, "Short output vector" );
[738]115        dt_out.set_subvector ( 0, yt );
[895]116        dt_out.set_subvector ( yt.length(), ut );
[738]117}
118
119void StateDS::step() {
120        vec imc ( IM->dimensionc() );
121        imc.set_subvector ( 0, xt );
122        u2imc.filldown ( ut, imc );
123        xt = IM->samplecond ( imc );
124
125        vec omc ( OM->dimensionc() );
126        omc.set_subvector ( 0, xt );
127        u2omc.filldown ( ut, omc );
128        vec yt;
129        yt = OM->samplecond ( omc );
130        //fill all data
131        dt.set_subvector ( 0, yt );
132        dt.set_subvector ( yt.length(), xt );
[895]133        dt.set_subvector ( yt.length()+xt.length(), ut );
[738]134}
135
[896]136void StateDS::from_setting ( const Setting & set ) {
[693]137        IM = UI::build<pdf> ( set, "IM", UI::compulsory );
138        OM = UI::build<pdf> ( set, "OM", UI::compulsory );
[357]139
[695]140        //todo test if IM->rvc contains IM->rv
141        //todo test if OM->rvc contains IM->rv
[737]142
143        UI::get ( xt, set, "x0", UI::optional );
144
[695]145}
[477]146
[737]147void StateDS::validate() {
[795]148        DS::validate();
149
[895]150        RV Yrv = concat ( OM->_rv() , IM->_rv() ); // export also true state
151        int ytsize = Yrv._dsize();
[737]152
153        RV tmp = concat ( OM->_rvc(), IM->_rvc() ); // what i not in rvc
154        Urv = tmp.subt ( Yrv ); // remove dt,xt and
155        Urv = Urv.subt ( Yrv.copy_t ( -1 ) ); // remove dt,xt and
156        utsize = Urv._dsize();
157
158        set_drv ( Yrv, Urv );
[695]159        dtsize = utsize + ytsize;
[737]160
[695]161        dt.set_length ( dtsize );
[737]162        if ( xt.length() != IM->dimension() ) {
163                xt = zeros ( IM->dimension() );
[695]164        }
165        ut.set_length ( Urv._dsize() );
[737]166
[695]167        //create data links
[737]168        u2imc.set_connection ( IM->_rvc(), Urv );
169        u2omc.set_connection ( OM->_rvc(), Urv );
[357]170}
Note: See TracBrowser for help on using the browser.