root/bdm/stat/libBM.cpp @ 201

Revision 201, 6.0 kB (checked in by smidl, 16 years ago)

oprava ARX a prejmenovani sampleN na sample_m

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