5 | | void emix_base::validate (){ |
6 | | epdf::validate(); |
7 | | bdm_assert ( no_coms() > 0, "There has to be at least one component." ); |
8 | | |
9 | | bdm_assert ( no_coms() == w.length(), "It is obligatory to define weights of all the components." ); |
10 | | |
11 | | double sum_w = sum ( w ); |
12 | | bdm_assert ( sum_w != 0, "There has to be a component with non-zero weight." ); |
13 | | w = w / sum_w; |
14 | | |
15 | | dim = component ( 0 )->dimension(); |
16 | | RV rv_tmp = component ( 0 )->_rv() ; |
17 | | bool isnamed = component( 0 )->isnamed(); |
18 | | for ( int i = 1; i < no_coms(); i++ ) { |
19 | | bdm_assert ( dim == ( component ( i )->dimension() ), "Component sizes do not match!" ); |
20 | | isnamed &= component(i)->isnamed() & component(i)->_rv().equal(rv_tmp); |
21 | | } |
22 | | if (isnamed) |
23 | | epdf::set_rv ( rv_tmp); |
| 5 | void emix_base::validate () { |
| 6 | epdf::validate(); |
| 7 | bdm_assert ( no_coms() > 0, "There has to be at least one component." ); |
| 8 | |
| 9 | bdm_assert ( no_coms() == w.length(), "It is obligatory to define weights of all the components." ); |
| 10 | |
| 11 | double sum_w = sum ( w ); |
| 12 | bdm_assert ( sum_w != 0, "There has to be a component with non-zero weight." ); |
| 13 | w = w / sum_w; |
| 14 | |
| 15 | dim = component ( 0 )->dimension(); |
| 16 | RV rv_tmp = component ( 0 )->_rv() ; |
| 17 | bool isnamed = component( 0 )->isnamed(); |
| 18 | for ( int i = 1; i < no_coms(); i++ ) { |
| 19 | bdm_assert ( dim == ( component ( i )->dimension() ), "Component sizes do not match!" ); |
| 20 | isnamed &= component(i)->isnamed() & component(i)->_rv().equal(rv_tmp); |
| 21 | } |
| 22 | if (isnamed) |
| 23 | epdf::set_rv ( rv_tmp); |
53 | | //non-central moment |
54 | | vec mom2 = zeros ( dim ); |
55 | | vec mom1 = zeros ( dim ); |
56 | | |
57 | | for ( int i = 0; i < w.length(); i++ ) { |
58 | | vec vi=component( i )->variance(); |
59 | | vec mi=component ( i )->mean(); |
60 | | mom2 += w ( i ) * ( vi + pow ( mi, 2 ) ); |
61 | | mom1 += w(i) * mi; |
62 | | } |
63 | | //central moment |
64 | | return mom2 - pow ( mom1, 2 ); |
| 53 | //non-central moment |
| 54 | vec mom2 = zeros ( dim ); |
| 55 | vec mom1 = zeros ( dim ); |
| 56 | |
| 57 | for ( int i = 0; i < w.length(); i++ ) { |
| 58 | vec vi=component( i )->variance(); |
| 59 | vec mi=component ( i )->mean(); |
| 60 | mom2 += w ( i ) * ( vi + pow ( mi, 2 ) ); |
| 61 | mom1 += w(i) * mi; |
| 62 | } |
| 63 | //central moment |
| 64 | return mom2 - pow ( mom1, 2 ); |
68 | | int i; |
69 | | double sum = 0.0; |
70 | | for ( i = 0; i < w.length(); i++ ) { |
71 | | sum += w ( i ) * exp ( component ( i )->evallog ( val ) ); |
72 | | } |
73 | | if ( sum == 0.0 ) { |
74 | | sum = std::numeric_limits<double>::epsilon(); |
75 | | } |
76 | | double tmp = log ( sum ); |
77 | | bdm_assert_debug ( std::isfinite ( tmp ), "Infinite" ); |
78 | | return tmp; |
| 68 | int i; |
| 69 | double sum = 0.0; |
| 70 | for ( i = 0; i < w.length(); i++ ) { |
| 71 | sum += w ( i ) * exp ( component ( i )->evallog ( val ) ); |
| 72 | } |
| 73 | if ( sum == 0.0 ) { |
| 74 | sum = std::numeric_limits<double>::epsilon(); |
| 75 | } |
| 76 | double tmp = log ( sum ); |
| 77 | bdm_assert_debug ( std::isfinite ( tmp ), "Infinite" ); |
| 78 | return tmp; |
105 | | bdm_assert ( isnamed(), "rvs are not assigned" ); |
106 | | |
107 | | Array<shared_ptr<epdf> > Cn ( no_coms() ); |
108 | | for ( int i = 0; i < no_coms(); i++ ) { |
109 | | Cn ( i ) = component ( i )->marginal ( rv ); |
110 | | } |
111 | | |
112 | | target._w() = w; |
113 | | target._Coms() = Cn; |
114 | | target.validate(); |
| 105 | bdm_assert ( isnamed(), "rvs are not assigned" ); |
| 106 | |
| 107 | Array<shared_ptr<epdf> > Cn ( no_coms() ); |
| 108 | for ( int i = 0; i < no_coms(); i++ ) { |
| 109 | Cn ( i ) = component ( i )->marginal ( rv ); |
| 110 | } |
| 111 | |
| 112 | target._w() = w; |
| 113 | target._Coms() = Cn; |
| 114 | target.validate(); |
124 | | emix_base::from_setting(set); |
125 | | UI::get ( Coms, set, "pdfs", UI::compulsory ); |
126 | | UI::get ( w, set, "weights", UI::compulsory ); |
| 124 | emix_base::from_setting(set); |
| 125 | UI::get ( Coms, set, "pdfs", UI::compulsory ); |
| 126 | UI::get ( w, set, "weights", UI::compulsory ); |
129 | | emix_base::to_setting(set); |
130 | | UI::save(Coms, set, "pdfs"); |
131 | | UI::save( w, set, "weights"); |
132 | | } |
133 | | |
134 | | |
135 | | void emix::validate (){ |
136 | | emix_base::validate(); |
137 | | dim = Coms ( 0 )->dimension(); |
| 129 | emix_base::to_setting(set); |
| 130 | UI::save(Coms, set, "pdfs"); |
| 131 | UI::save( w, set, "weights"); |
| 132 | } |
| 133 | |
| 134 | |
| 135 | void emix::validate () { |
| 136 | emix_base::validate(); |
| 137 | dim = Coms ( 0 )->dimension(); |
142 | | int i; |
143 | | double res = 0.0; |
144 | | for ( i = pdfs.length() - 1; i >= 0; i-- ) { |
145 | | /* if ( pdfs(i)->_rvc().count() >0) { |
146 | | pdfs ( i )->condition ( dls ( i )->get_cond ( val,cond ) ); |
147 | | } |
148 | | // add logarithms |
149 | | res += epdfs ( i )->evallog ( dls ( i )->pushdown ( val ) );*/ |
150 | | res += pdfs ( i )->evallogcond ( |
151 | | dls ( i )->pushdown ( val ), |
152 | | dls ( i )->get_cond ( val, cond ) |
153 | | ); |
154 | | } |
155 | | return res; |
| 142 | int i; |
| 143 | double res = 0.0; |
| 144 | for ( i = pdfs.length() - 1; i >= 0; i-- ) { |
| 145 | /* if ( pdfs(i)->_rvc().count() >0) { |
| 146 | pdfs ( i )->condition ( dls ( i )->get_cond ( val,cond ) ); |
| 147 | } |
| 148 | // add logarithms |
| 149 | res += epdfs ( i )->evallog ( dls ( i )->pushdown ( val ) );*/ |
| 150 | res += pdfs ( i )->evallogcond ( |
| 151 | dls ( i )->pushdown ( val ), |
| 152 | dls ( i )->get_cond ( val, cond ) |
| 153 | ); |
| 154 | } |
| 155 | return res; |
175 | | pdfs = mFacs; |
176 | | dls.set_size ( mFacs.length() ); |
177 | | |
178 | | rv = get_composite_rv ( pdfs, true ); |
179 | | dim = rv._dsize(); |
180 | | |
181 | | for ( int i = 0; i < pdfs.length(); i++ ) { |
182 | | RV rvx = pdfs ( i )->_rvc().subt ( rv ); |
183 | | rvc.add ( rvx ); // add rv to common rvc |
184 | | } |
185 | | dimc = rvc._dsize(); |
186 | | |
187 | | // rv and rvc established = > we can link them with pdfs |
188 | | for ( int i = 0; i < pdfs.length(); i++ ) { |
189 | | dls ( i ) = new datalink_m2m; |
190 | | dls ( i )->set_connection ( pdfs ( i )->_rv(), pdfs ( i )->_rvc(), _rv(), _rvc() ); |
191 | | } |
| 175 | pdfs = mFacs; |
| 176 | dls.set_size ( mFacs.length() ); |
| 177 | |
| 178 | rv = get_composite_rv ( pdfs, true ); |
| 179 | dim = rv._dsize(); |
| 180 | |
| 181 | for ( int i = 0; i < pdfs.length(); i++ ) { |
| 182 | RV rvx = pdfs ( i )->_rvc().subt ( rv ); |
| 183 | rvc.add ( rvx ); // add rv to common rvc |
| 184 | } |
| 185 | dimc = rvc._dsize(); |
| 186 | |
| 187 | // rv and rvc established = > we can link them with pdfs |
| 188 | for ( int i = 0; i < pdfs.length(); i++ ) { |
| 189 | dls ( i ) = new datalink_m2m; |
| 190 | dls ( i )->set_connection ( pdfs ( i )->_rv(), pdfs ( i )->_rvc(), _rv(), _rvc() ); |
| 191 | } |
195 | | pdf::from_setting(set); |
196 | | Array<shared_ptr<pdf> > temp_array; |
197 | | UI::get ( temp_array, set, "pdfs", UI::compulsory ); |
198 | | set_elements ( temp_array ); |
199 | | } |
| 195 | pdf::from_setting(set); |
| 196 | Array<shared_ptr<pdf> > temp_array; |
| 197 | UI::get ( temp_array, set, "pdfs", UI::compulsory ); |
| 198 | set_elements ( temp_array ); |
| 199 | } |
206 | | { pdf::validate(); |
207 | | bdm_assert ( Coms.length() > 0, "There has to be at least one component." ); |
208 | | |
209 | | bdm_assert ( Coms.length() == w.length(), "It is obligatory to define weights of all the components." ); |
210 | | |
211 | | double sum_w = sum ( w ); |
212 | | bdm_assert ( sum_w != 0, "There has to be a component with non-zero weight." ); |
213 | | w = w / sum_w; |
214 | | |
215 | | |
216 | | dim = Coms ( 0 )->dimension(); |
217 | | dimc = Coms ( 0 )->dimensionc(); |
218 | | RV rv_tmp = Coms ( 0 )->_rv(); |
219 | | RV rvc_tmp = Coms ( 0 )->_rvc(); |
220 | | bool isnamed = Coms ( 0 )->isnamed(); |
221 | | for ( int i = 1; i < Coms.length(); i++ ) { |
222 | | bdm_assert ( dim == ( Coms ( i )->dimension() ), "Component sizes do not match!" ); |
223 | | bdm_assert ( dimc >= ( Coms ( i )->dimensionc() ), "Component sizes do not match!" ); |
224 | | isnamed &= Coms(i)->isnamed() & Coms(i)->_rv().equal(rv_tmp) & Coms(i)->_rvc().equal(rvc_tmp); |
225 | | } |
226 | | if (isnamed) |
227 | | { |
228 | | pdf::set_rv ( rv_tmp ); |
229 | | pdf::set_rvc ( rvc_tmp ); |
230 | | } |
| 206 | { pdf::validate(); |
| 207 | bdm_assert ( Coms.length() > 0, "There has to be at least one component." ); |
| 208 | |
| 209 | bdm_assert ( Coms.length() == w.length(), "It is obligatory to define weights of all the components." ); |
| 210 | |
| 211 | double sum_w = sum ( w ); |
| 212 | bdm_assert ( sum_w != 0, "There has to be a component with non-zero weight." ); |
| 213 | w = w / sum_w; |
| 214 | |
| 215 | |
| 216 | dim = Coms ( 0 )->dimension(); |
| 217 | dimc = Coms ( 0 )->dimensionc(); |
| 218 | RV rv_tmp = Coms ( 0 )->_rv(); |
| 219 | RV rvc_tmp = Coms ( 0 )->_rvc(); |
| 220 | bool isnamed = Coms ( 0 )->isnamed(); |
| 221 | for ( int i = 1; i < Coms.length(); i++ ) { |
| 222 | bdm_assert ( dim == ( Coms ( i )->dimension() ), "Component sizes do not match!" ); |
| 223 | bdm_assert ( dimc >= ( Coms ( i )->dimensionc() ), "Component sizes do not match!" ); |
| 224 | isnamed &= Coms(i)->isnamed() & Coms(i)->_rv().equal(rv_tmp) & Coms(i)->_rvc().equal(rvc_tmp); |
| 225 | } |
| 226 | if (isnamed) |
| 227 | { |
| 228 | pdf::set_rv ( rv_tmp ); |
| 229 | pdf::set_rvc ( rvc_tmp ); |
| 230 | } |
234 | | |
235 | | pdf::from_setting(set); |
236 | | UI::get ( Coms, set, "pdfs", UI::compulsory ); |
237 | | |
238 | | if ( !UI::get ( w, set, "weights", UI::optional ) ) { |
239 | | int len = Coms.length(); |
240 | | w.set_length ( len ); |
241 | | w = 1.0 / len; |
242 | | } |
| 234 | |
| 235 | pdf::from_setting(set); |
| 236 | UI::get ( Coms, set, "pdfs", UI::compulsory ); |
| 237 | |
| 238 | if ( !UI::get ( w, set, "weights", UI::optional ) ) { |
| 239 | int len = Coms.length(); |
| 240 | w.set_length ( len ); |
| 241 | w = 1.0 / len; |
| 242 | } |
276 | | vec tmp ( dim ); //second moment |
277 | | for ( int i = 0; i < no_factors(); i++ ) { |
278 | | vec pom = factor ( i )->variance(); |
279 | | dls ( i )->pushup ( tmp, pom ); // |
280 | | } |
281 | | return tmp; |
| 276 | vec tmp ( dim ); //second moment |
| 277 | for ( int i = 0; i < no_factors(); i++ ) { |
| 278 | vec pom = factor ( i )->variance(); |
| 279 | dls ( i )->pushup ( tmp, pom ); // |
| 280 | } |
| 281 | return tmp; |