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

Revision 924, 3.6 kB (checked in by smidl, 14 years ago)

correction in MemDS and mgnorm

  • 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        string filename;
54        UI::get ( filename, set, "filename", UI::compulsory );
55
56        time = 0;
57}
58
59void CsvFileDS::from_setting ( const Setting & set ) {
60        FileDS::from_setting ( set );
61
62        vec data_line;
63        string line;
64
65        ifstream fs;
66        fs.open ( filename.c_str() );
67        if ( fs.is_open() ) {
68                while ( getline ( fs, line ) ) {
69                        data_line.set ( line );
70                        Data.append_row ( data_line );
71                }
72        }
73
74        string orientation;
75        if( UI::get ( orientation, set, "orientation", UI::optional ) & orientation == "BY_ROW" ) 
76                transpose ( Data, Data );
77}
78
79void ITppFileDS::from_setting ( const Setting & set ) {
80        FileDS::from_setting ( set );
81
82        string varname;
83        UI::get ( varname, set, "varname", UI::compulsory );
84
85        it_file it ( filename );
86        it << Name ( varname );
87        it >> Data;
88}
89
90void PdfDS::step() {
91        yt2rgr.store_data ( yt ); // y is now history
92        ut2rgr.filldown ( ut, rgr );
93        yt2rgr.filldown ( yt, rgr );
94        yt = ipdf->samplecond ( rgr );
95        ut2rgr.store_data ( ut ); //u is now history
96}
97
98void PdfDS::getdata ( vec & dt_out ) const {
99        bdm_assert_debug ( dt_out.length() >= dtsize, "Short output vector" );
100        dt_out.set_subvector ( 0, yt );
101        dt_out.set_subvector ( yt.length(), ut );
102}
103
104void StateDS::step() {
105        vec imc ( IM->dimensionc() );
106        imc.set_subvector ( 0, xt );
107        u2imc.filldown ( ut, imc );
108        xt = IM->samplecond ( imc );
109
110        vec omc ( OM->dimensionc() );
111        omc.set_subvector ( 0, xt );
112        u2omc.filldown ( ut, omc );
113        vec yt;
114        yt = OM->samplecond ( omc );
115        //fill all data
116        dt.set_subvector ( 0, yt );
117        dt.set_subvector ( yt.length(), xt );
118        dt.set_subvector ( yt.length()+xt.length(), ut );
119}
120
121void StateDS::from_setting ( const Setting & set ) {
122        IM = UI::build<pdf> ( set, "IM", UI::compulsory );
123        OM = UI::build<pdf> ( set, "OM", UI::compulsory );
124
125        //todo test if IM->rvc contains IM->rv
126        //todo test if OM->rvc contains IM->rv
127
128        UI::get ( xt, set, "x0", UI::optional );
129
130}
131
132void StateDS::validate() {
133        DS::validate();
134
135        RV Yrv = concat ( OM->_rv() , IM->_rv() ); // export also true state
136        int ytsize = Yrv._dsize();
137
138        RV tmp = concat ( OM->_rvc(), IM->_rvc() ); // what i not in rvc
139        Urv = tmp.subt ( Yrv ); // remove dt,xt and
140        Urv = Urv.subt ( Yrv.copy_t ( -1 ) ); // remove dt,xt and
141        utsize = Urv._dsize();
142
143        set_drv ( Yrv, Urv );
144        dtsize = utsize + ytsize;
145
146        dt.set_length ( dtsize );
147        if ( xt.length() != IM->dimension() ) {
148                xt = zeros ( IM->dimension() );
149        }
150        ut.set_length ( Urv._dsize() );
151
152        //create data links
153        u2imc.set_connection ( IM->_rvc(), Urv );
154        u2omc.set_connection ( OM->_rvc(), Urv );
155}
Note: See TracBrowser for help on using the browser.