root/bdm/stat/libBM.cpp @ 265

Revision 265, 6.2 kB (checked in by smidl, 15 years ago)

UI in matlab

Line 
1
2#include "libBM.h"
3#include "../itpp_ext.h"
4
5//! Space of basic BDM structures
6namespace bdm {
7
8using std::cout;
9
10static int RVcounter=0;
11
12RV RV0=RV();
13
14void RV::init ( ivec in_ids, Array<std::string> in_names, ivec in_sizes, ivec in_times ) {
15        //Refer
16        int i;
17        len = in_ids.length();
18        //PRUDENT_MODE
19        // All vetors should be of same length
20        if ( ( len != in_names.length() ) || \
21                ( len != in_sizes.length() ) || \
22                ( len != in_times.length() ) ) {
23                it_error ( "RV::RV inconsistent length of input vectors." );
24        }
25
26        ids = in_ids;
27        names = in_names;
28        sizes = in_sizes;
29        times = in_times;
30        tsize = 0;
31        for ( i = 0;i < len;i++ ) {tsize += sizes ( i );}
32};
33
34RV::RV ( Array<std::string> in_names, ivec in_sizes, ivec in_times ) {
35        int len = in_names.length();
36        init ( linspace ( RVcounter+1, RVcounter+len ), in_names, in_sizes, in_times );
37        RVcounter+=len;
38}
39
40RV::RV ( Array<std::string> in_names, ivec in_sizes ) {
41        int len = in_names.length();
42        init ( linspace ( RVcounter+1, RVcounter+len ), in_names, in_sizes, zeros_i ( in_names.length() ) );
43        RVcounter+=len;
44}
45
46RV::RV ( Array<std::string> in_names ) {
47        int len = in_names.length();
48        init ( linspace ( RVcounter+1, RVcounter+len ), in_names, ones_i ( in_names.length() ), zeros_i ( in_names.length() ) );
49        RVcounter+=len;
50}
51
52RV::RV() : tsize ( 0 ), len ( 0 ), ids ( 0 ),  sizes ( 0 ), times ( 0 ),names ( 0 ) {};
53
54RV::RV(string name, int id, int sz, int tm){
55        if (id>RVcounter) {RVcounter=id;};
56        Array<string> A(1); A(0)=name;
57        init(vec_1(id),A,vec_1(sz),vec_1(tm));
58}
59
60bool RV::add ( const RV &rv2 ) {
61        // TODO
62        if ( rv2.len>0 ) { //rv2 is nonempty
63                ivec ind = rv2.findself ( *this ); //should be -1 all the time
64                ivec index = itpp::find ( ind==-1 );
65
66
67                if ( index.length() < rv2.len ) { //conflict
68                        ids = concat ( ids, rv2.ids ( index ) );
69                        sizes = concat ( sizes, rv2.sizes ( index ) );
70                        times = concat ( times, rv2.times ( index ) );
71                        names = concat ( names, rv2.names ( to_Arr ( index ) ) );
72                }
73                else {
74                        ids = concat ( ids, rv2.ids );
75                        sizes = concat ( sizes, rv2.sizes );
76                        times = concat ( times, rv2.times );
77                        names = concat ( names, rv2.names );
78                }
79                tsize = sum ( sizes );
80                len = ids.length();
81                return ( index.length() ==rv2.len );
82        }
83        else { //rv2 is empty
84                return true;
85        }
86//      return *this;
87};
88
89// RV::RV ( ivec in_ids ) {
90//
91//      len = in_ids.length();
92//      Array<std::string> A ( len );
93//      std::string rvstr = "rv";
94//
95//      for ( int i = 0; i < len;i++ ) {
96//              A ( i ) = rvstr + to_str ( i );
97//      }
98//
99//      init ( in_ids, A, ones_i ( len ), zeros_i ( len ) );
100// }
101
102RV RV::subselect (const ivec &ind ) const {
103        RV ret;
104        ret.init ( ids ( ind ), names ( to_Arr ( ind ) ), sizes ( ind ), times ( ind ) );
105        return ret;
106}
107
108void RV::t ( int delta ) { times += delta;}
109
110RV RV::operator() (const ivec &ind ) const {
111        RV ret;
112        if ( ind.length() >0 ) {
113                ret.init ( ids ( ind ), names ( to_Arr ( ind ) ), sizes ( ind ), times ( ind ) );
114        }
115        return ret;
116}
117
118bool RV::equal ( const RV &rv2 ) const {
119        return ( ids == rv2.ids ) && ( times == rv2.times ) && ( sizes == rv2.sizes );
120}
121
122mat epdf::sample_m ( int N ) const {
123        mat X = zeros ( rv.count(), N );
124        for ( int i = 0;i < N;i++ ) X.set_col ( i, this->sample() );
125        return X;
126};
127
128
129std::ostream &operator<< ( std::ostream &os, const RV &rv ) {
130
131        for ( int i = 0; i < rv.len ;i++ ) {
132                os << rv.ids ( i ) << "(" << rv.sizes ( i ) << ")" <<  // id(size)=
133                "=" << rv.names ( i )  << "_{"  << rv.times ( i ) << "}; "; //name_{time}
134        }
135        return os;
136}
137
138str RV::tostr() const {
139        ivec idlist ( tsize );
140        ivec tmlist ( tsize );
141        int i;
142        int pos = 0;
143        for ( i = 0;i < len;i++ ) {
144                idlist.set_subvector ( pos, pos + sizes ( i ) - 1, ids ( i ) );
145                tmlist.set_subvector ( pos, pos + sizes ( i ) - 1, times ( i ) );
146                pos += sizes ( i );
147        }
148        return str ( idlist, tmlist );
149}
150
151ivec RV::dataind (const RV &rv2 ) const {
152        ivec res ( 0 );
153        if ( rv2.count()>0 ) {
154                str str2 = rv2.tostr();
155                ivec part;
156                int i;
157                for ( i = 0;i < len;i++ ) {
158                        part = itpp::find ( ( str2.ids == ids ( i ) ) & ( str2.times == times ( i ) ) );
159                        res = concat ( res, part );
160                }
161        }
162        it_assert_debug(res.length()==tsize,"this rv is not fully present in crv!");
163        return res;
164
165}
166
167void RV::dataind (const RV &rv2, ivec &selfi, ivec &rv2i) const {
168        //clean results
169        selfi.set_size(0);
170        rv2i.set_size(0);
171       
172        // just in case any rv is empty
173        if ((len==0)||(rv2.length()==0)){return;} 
174       
175        //find comon rv
176        ivec cids=itpp::find(this->findself(rv2)>=0);
177       
178        // index of
179        if ( cids.length()>0 ) {
180                str str1 = tostr();
181                str str2 = rv2.tostr(); 
182               
183                ivec part1;
184                ivec part2;
185                int i,j;
186                // find common rv in strs
187                for ( j=0; j < cids.length();j++ ) {
188                        i = cids(j);
189                        part1 = itpp::find ( ( str1.ids == ids ( i ) ) & ( str1.times == times ( i ) ) );
190                        part2 = itpp::find ( ( str2.ids == ids ( i ) ) & ( str2.times == times ( i ) ) );
191                        selfi = concat ( selfi, part1 );
192                        rv2i = concat ( rv2i, part2 );
193                }
194        }
195        it_assert_debug(selfi.length() == rv2i.length(),"this should not happen!");
196}
197
198RV RV::subt ( const RV &rv2 ) const {
199        ivec res = this->findself ( rv2 ); // nonzeros
200        ivec valid;
201        if (tsize>0) {valid= itpp::find ( res == -1 );} //-1 => value not found => it remains
202        return ( *this ) ( valid ); //keep those that were not found in rv2
203}
204
205ivec RV::findself ( const RV &rv2 ) const {
206        int i, j;
207        ivec tmp = -ones_i ( len );
208        for ( i = 0;i < len;i++ ) {
209                for ( j = 0;j < rv2.length();j++ ) {
210                        if ( ( ids ( i ) == rv2.ids ( j ) ) & ( times ( i ) == rv2.times ( j ) ) ) {
211                                tmp ( i ) = j;
212                                break;
213                        }
214                }
215        }
216        return tmp;
217}
218
219RV concat ( const RV &rv1, const RV &rv2 ) {
220        RV pom = rv1;
221        pom.add ( rv2 );
222        return pom;
223}
224
225void RV::newids(){ids=linspace ( RVcounter+1, RVcounter+len ),RVcounter+=len;}
226
227RV compositepdf::getrv(bool checkoverlap){
228        RV rv; //empty rv
229        bool rvaddok;
230        for (int i = 0;i < n;i++ ) {
231                rvaddok=rv.add ( mpdfs ( i )->_rv() ); //add rv to common rvs.
232                        // If rvaddok==false, mpdfs overlap => assert error.
233                it_assert_debug(rvaddok||(!checkoverlap),"mprod::mprod() input mpdfs overlap in rv!");
234        };
235        return rv;
236}
237
238void compositepdf::setrvc(const RV &rv, RV &rvc){
239        for (int i = 0;i < n;i++ ) {
240                RV rvx = mpdfs ( i )->_rvc().subt ( rv );
241                rvc.add ( rvx ); //add rv to common rvc
242        };
243}
244
245void BM::bayesB(const mat &Data){
246        for(int t=0;t<Data.cols();t++){bayes(Data.get_col(t));}
247}
248}
Note: See TracBrowser for help on using the browser.