root/bdm/stat/libBM.cpp @ 262

Revision 262, 6.0 kB (checked in by smidl, 15 years ago)

cleanup of include files

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