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

Revision 942, 3.6 kB (checked in by mido, 14 years ago)

the functionality of user info was improved, it supports an initialization of root descendant via UI::get directly, however it is save only for static attributes, for dynamically allocated attributes UI::build should be called to handle with intahrence issues

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