root/bdm/stat/libBM.cpp @ 263

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

UIArxDS test

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