41 | | // TODO - correct approach - convert to product of norm * Wishart |
42 | | mat M; |
43 | | ldmat Vz; |
44 | | ldmat Lam; |
45 | | factorize ( M, Vz, Lam ); |
46 | | |
47 | | chmat ChLam ( Lam.to_mat() ); |
48 | | chmat iChLam; |
49 | | ChLam.inv ( iChLam ); |
50 | | |
51 | | eWishartCh Omega; //inverse Wishart, result is R, |
52 | | Omega.set_parameters ( iChLam, nu - 2*nPsi - dimx ); // 2*nPsi is there to match numercial simulations - check if analytically correct |
53 | | Omega.validate(); |
54 | | |
55 | | mat OmChi; |
56 | | mat Z ( M.rows(), M.cols() ); |
57 | | |
58 | | mat Mi; |
59 | | mat RChiT; |
60 | | mat tmp ( dimension(), n ); |
61 | | M=M.T();// ugly hack == decide what to do with M. |
62 | | for ( int i = 0; i < n; i++ ) { |
63 | | OmChi = Omega.sample_mat(); |
64 | | RChiT = inv ( OmChi ); |
65 | | Z = randn ( M.rows(), M.cols() ); |
66 | | Mi = M + RChiT * Z * inv ( Vz._L().T() * diag ( sqrt ( Vz._D() ) ) ); |
67 | | |
68 | | tmp.set_col ( i, concat ( cvectorize ( Mi ), cvectorize ( RChiT*RChiT.T() ) ) ); |
69 | | } |
70 | | return tmp; |
| 41 | // TODO - correct approach - convert to product of norm * Wishart |
| 42 | mat M; |
| 43 | ldmat Vz; |
| 44 | ldmat Lam; |
| 45 | factorize ( M, Vz, Lam ); |
| 46 | |
| 47 | chmat ChLam ( Lam.to_mat() ); |
| 48 | chmat iChLam; |
| 49 | ChLam.inv ( iChLam ); |
| 50 | |
| 51 | eWishartCh Omega; //inverse Wishart, result is R, |
| 52 | Omega.set_parameters ( iChLam, nu - 2*nPsi - dimx ); // 2*nPsi is there to match numercial simulations - check if analytically correct |
| 53 | Omega.validate(); |
| 54 | |
| 55 | mat OmChi; |
| 56 | mat Z ( M.rows(), M.cols() ); |
| 57 | |
| 58 | mat Mi; |
| 59 | mat RChiT; |
| 60 | mat tmp ( dimension(), n ); |
| 61 | M=M.T();// ugly hack == decide what to do with M. |
| 62 | for ( int i = 0; i < n; i++ ) { |
| 63 | OmChi = Omega.sample_mat(); |
| 64 | RChiT = inv ( OmChi ); |
| 65 | Z = randn ( M.rows(), M.cols() ); |
| 66 | Mi = M + RChiT * Z * inv ( Vz._L().T() * diag ( sqrt ( Vz._D() ) ) ); |
| 67 | |
| 68 | tmp.set_col ( i, concat ( cvectorize ( Mi ), cvectorize ( RChiT*RChiT.T() ) ) ); |
| 69 | } |
| 70 | return tmp; |
75 | | // TODO - correct approach - convert to product of norm * Wishart |
76 | | mat M; |
77 | | ldmat Vz; |
78 | | ldmat Lam; |
79 | | factorize ( M, Vz, Lam ); |
80 | | |
81 | | chmat Ch; |
82 | | Ch.setCh ( Lam._L() *diag ( sqrt ( Lam._D() ) ) ); |
83 | | chmat iCh; |
84 | | Ch.inv ( iCh ); |
85 | | |
86 | | eWishartCh Omega; //inverse Wishart, result is R, |
87 | | Omega.set_parameters ( iCh, nu - 2*nPsi - dimx ); // 2*nPsi is there to match numercial simulations - check if analytically correct |
88 | | Omega.validate(); |
89 | | |
90 | | chmat Omi; |
91 | | Omi.setCh ( Omega.sample_mat() ); |
92 | | |
93 | | if (M._datasize()>0){ |
94 | | mat Z = randn ( M.rows(), M.cols() ); |
95 | | Mi = M + Omi._Ch() * Z * inv ( Vz._L() * diag ( sqrt ( Vz._D() ) ) ); |
96 | | } |
97 | | Omi.inv ( Ri ); |
| 75 | // TODO - correct approach - convert to product of norm * Wishart |
| 76 | mat M; |
| 77 | ldmat Vz; |
| 78 | ldmat Lam; |
| 79 | factorize ( M, Vz, Lam ); |
| 80 | |
| 81 | chmat Ch; |
| 82 | Ch.setCh ( Lam._L() *diag ( sqrt ( Lam._D() ) ) ); |
| 83 | chmat iCh; |
| 84 | Ch.inv ( iCh ); |
| 85 | |
| 86 | eWishartCh Omega; //inverse Wishart, result is R, |
| 87 | Omega.set_parameters ( iCh, nu - 2*nPsi - dimx ); // 2*nPsi is there to match numercial simulations - check if analytically correct |
| 88 | Omega.validate(); |
| 89 | |
| 90 | chmat Omi; |
| 91 | Omi.setCh ( Omega.sample_mat() ); |
| 92 | |
| 93 | if (M._datasize()>0) { |
| 94 | mat Z = randn ( M.rows(), M.cols() ); |
| 95 | Mi = M + Omi._Ch() * Z * inv ( Vz._L() * diag ( sqrt ( Vz._D() ) ) ); |
| 96 | } |
| 97 | Omi.inv ( Ri ); |
101 | | bdm_assert_debug(val.length()==dimx*(nPsi+dimx),"Incorrect cond in egiw::evallog_nn" ); |
102 | | |
103 | | int vend = val.length() - 1; |
104 | | |
105 | | if ( dimx == 1 ) { //same as the following, just quicker. |
106 | | double r = val ( vend ); //last entry! |
107 | | if ( r < 0 ) return -inf; |
108 | | vec Psi ( nPsi + dimx ); |
109 | | Psi ( 0 ) = -1.0; |
110 | | Psi.set_subvector ( 1, val ( 0, vend - 1 ) ); // fill the rest |
111 | | |
112 | | double Vq = V.qform ( Psi ); |
113 | | return -0.5* ( nu*log ( r ) + Vq / r ); |
114 | | } else { |
115 | | mat Tmp; |
116 | | if (nPsi>0){ |
117 | | mat Th = reshape ( val ( 0, nPsi * dimx - 1 ), nPsi, dimx ); |
118 | | Tmp = concat_vertical ( -eye ( dimx ), Th ); |
119 | | } else { |
120 | | Tmp = -eye(dimx); |
121 | | } |
122 | | fsqmat R ( reshape ( val ( nPsi*dimx, vend ), dimx, dimx ) ); |
123 | | double ldetR = R.logdet(); |
124 | | if ( !std::isfinite(ldetR) ) return -inf; |
125 | | fsqmat iR ( dimx ); |
126 | | R.inv ( iR ); |
127 | | |
128 | | return -0.5* ( nu*ldetR + trace ( iR.to_mat() *Tmp.T() *V.to_mat() *Tmp ) ); |
129 | | } |
| 101 | bdm_assert_debug(val.length()==dimx*(nPsi+dimx),"Incorrect cond in egiw::evallog_nn" ); |
| 102 | |
| 103 | int vend = val.length() - 1; |
| 104 | |
| 105 | if ( dimx == 1 ) { //same as the following, just quicker. |
| 106 | double r = val ( vend ); //last entry! |
| 107 | if ( r < 0 ) return -inf; |
| 108 | vec Psi ( nPsi + dimx ); |
| 109 | Psi ( 0 ) = -1.0; |
| 110 | Psi.set_subvector ( 1, val ( 0, vend - 1 ) ); // fill the rest |
| 111 | |
| 112 | double Vq = V.qform ( Psi ); |
| 113 | return -0.5* ( nu*log ( r ) + Vq / r ); |
| 114 | } else { |
| 115 | mat Tmp; |
| 116 | if (nPsi>0) { |
| 117 | mat Th = reshape ( val ( 0, nPsi * dimx - 1 ), nPsi, dimx ); |
| 118 | Tmp = concat_vertical ( -eye ( dimx ), Th ); |
| 119 | } else { |
| 120 | Tmp = -eye(dimx); |
| 121 | } |
| 122 | fsqmat R ( reshape ( val ( nPsi*dimx, vend ), dimx, dimx ) ); |
| 123 | double ldetR = R.logdet(); |
| 124 | if ( !std::isfinite(ldetR) ) return -inf; |
| 125 | fsqmat iR ( dimx ); |
| 126 | R.inv ( iR ); |
| 127 | |
| 128 | return -0.5* ( nu*ldetR + trace ( iR.to_mat() *Tmp.T() *V.to_mat() *Tmp ) ); |
| 129 | } |
141 | | double nkG = 0.5 * dimx * ( -nPsi * log2pi + sum ( log ( D.mid ( dimx, nPsi ) ) ) ); |
142 | | // temporary for lgamma in Wishart |
143 | | double lg = 0; |
144 | | for ( int i = 0; i < dimx; i++ ) { |
145 | | lg += lgamma ( 0.5 * ( m - i ) ); |
146 | | } |
147 | | |
148 | | double nkW = 0.5 * ( m * sum ( log ( D ( 0, dimx - 1 ) ) ) ) \ |
149 | | - 0.5 * dimx * ( m * log2 + 0.5 * ( dimx - 1 ) * log2pi ) - lg; |
| 141 | double nkG = 0.5 * dimx * ( -nPsi * log2pi + sum ( log ( D.mid ( dimx, nPsi ) ) ) ); |
| 142 | // temporary for lgamma in Wishart |
| 143 | double lg = 0; |
| 144 | for ( int i = 0; i < dimx; i++ ) { |
| 145 | lg += lgamma ( 0.5 * ( m - i ) ); |
| 146 | } |
| 147 | |
| 148 | double nkW = 0.5 * ( m * sum ( log ( D ( 0, dimx - 1 ) ) ) ) \ |
| 149 | - 0.5 * dimx * ( m * log2 + 0.5 * ( dimx - 1 ) * log2pi ) - lg; |
175 | | const mat &L = V._L(); |
176 | | const vec &D = V._D(); |
177 | | int end = L.rows() - 1; |
178 | | |
179 | | Lam = ldmat ( L ( 0, dimx - 1, 0, dimx - 1 ), D ( 0, dimx - 1 ) ); //exp val of R |
180 | | |
181 | | if (dimx<=end){ |
182 | | Vz = ldmat ( L ( dimx, end, dimx, end ), D ( dimx, end ) ); |
183 | | mat iLsub = ltuinv ( Vz._L() ); |
184 | | // set mean value |
185 | | mat Lpsi = L ( dimx, end, 0, dimx - 1 ); |
186 | | M = iLsub * Lpsi; |
187 | | } |
188 | | /* if ( 0 ) { // test with Peterka |
189 | | mat VF = V.to_mat(); |
190 | | mat Vf = VF ( 0, dimx - 1, 0, dimx - 1 ); |
191 | | mat Vzf = VF ( dimx, end, 0, dimx - 1 ); |
192 | | mat VZ = VF ( dimx, end, dimx, end ); |
193 | | |
194 | | mat Lam2 = Vf - Vzf.T() * inv ( VZ ) * Vzf; |
195 | | }*/ |
| 175 | const mat &L = V._L(); |
| 176 | const vec &D = V._D(); |
| 177 | int end = L.rows() - 1; |
| 178 | |
| 179 | Lam = ldmat ( L ( 0, dimx - 1, 0, dimx - 1 ), D ( 0, dimx - 1 ) ); //exp val of R |
| 180 | |
| 181 | if (dimx<=end) { |
| 182 | Vz = ldmat ( L ( dimx, end, dimx, end ), D ( dimx, end ) ); |
| 183 | mat iLsub = ltuinv ( Vz._L() ); |
| 184 | // set mean value |
| 185 | mat Lpsi = L ( dimx, end, 0, dimx - 1 ); |
| 186 | M = iLsub * Lpsi; |
| 187 | } |
| 188 | /* if ( 0 ) { // test with Peterka |
| 189 | mat VF = V.to_mat(); |
| 190 | mat Vf = VF ( 0, dimx - 1, 0, dimx - 1 ); |
| 191 | mat Vzf = VF ( dimx, end, 0, dimx - 1 ); |
| 192 | mat VZ = VF ( dimx, end, dimx, end ); |
| 193 | |
| 194 | mat Lam2 = Vf - Vzf.T() * inv ( VZ ) * Vzf; |
| 195 | }*/ |
237 | | int l = V.rows(); |
238 | | // cut out rest of lower-right part of V |
239 | | // invert it |
240 | | ldmat itmp; |
241 | | if (dimx<l){ |
242 | | const ldmat tmp ( V, linspace ( dimx, l - 1 ) ); |
243 | | tmp.inv ( itmp ); |
244 | | } |
245 | | // following Wikipedia notation |
246 | | // m=nu-nPsi-dimx-1, p=dimx |
247 | | double mp1p = nu - nPsi - 2 * dimx; // m-p+1 |
248 | | double mp1m = mp1p - 2; // m-p-1 |
249 | | |
250 | | if ( dimx == 1 ) { |
251 | | double cove = V._D() ( 0 ) / mp1m ; |
252 | | |
253 | | vec var ( l ); |
254 | | var.set_subvector ( 0, diag ( itmp.to_mat() ) *cove ); |
255 | | var ( l - 1 ) = cove * cove / ( mp1m - 2 ); |
256 | | return var; |
257 | | } else { |
258 | | ldmat Vll ( V, linspace ( 0, dimx - 1 ) ); // top-left part of V |
259 | | mat Y = Vll.to_mat(); |
260 | | mat varY ( Y.rows(), Y.cols() ); |
261 | | |
262 | | double denom = ( mp1p - 1 ) * mp1m * mp1m * ( mp1m - 2 ); // (m-p)(m-p-1)^2(m-p-3) |
263 | | |
264 | | int i, j; |
265 | | for ( i = 0; i < Y.rows(); i++ ) { |
266 | | for ( j = 0; j < Y.cols(); j++ ) { |
267 | | varY ( i, j ) = ( mp1p * Y ( i, j ) * Y ( i, j ) + mp1m * Y ( i, i ) * Y ( j, j ) ) / denom; |
268 | | } |
269 | | } |
270 | | vec mean_dR = diag ( Y ) / mp1m; // corresponds to cove |
271 | | vec var_th = diag ( itmp.to_mat() ); |
272 | | vec var_Th ( mean_dR.length() *var_th.length() ); |
273 | | // diagonal of diag(mean_dR) \kron diag(var_th) |
274 | | for ( int i = 0; i < mean_dR.length(); i++ ) { |
275 | | var_Th.set_subvector ( i*var_th.length(), var_th*mean_dR ( i ) ); |
276 | | } |
277 | | |
278 | | return concat ( var_Th, cvectorize ( varY ) ); |
279 | | } |
| 237 | int l = V.rows(); |
| 238 | // cut out rest of lower-right part of V |
| 239 | // invert it |
| 240 | ldmat itmp; |
| 241 | if (dimx<l) { |
| 242 | const ldmat tmp ( V, linspace ( dimx, l - 1 ) ); |
| 243 | tmp.inv ( itmp ); |
| 244 | } |
| 245 | // following Wikipedia notation |
| 246 | // m=nu-nPsi-dimx-1, p=dimx |
| 247 | double mp1p = nu - nPsi - 2 * dimx; // m-p+1 |
| 248 | double mp1m = mp1p - 2; // m-p-1 |
| 249 | |
| 250 | if ( dimx == 1 ) { |
| 251 | double cove = V._D() ( 0 ) / mp1m ; |
| 252 | |
| 253 | vec var ( l ); |
| 254 | var.set_subvector ( 0, diag ( itmp.to_mat() ) *cove ); |
| 255 | var ( l - 1 ) = cove * cove / ( mp1m - 2 ); |
| 256 | return var; |
| 257 | } else { |
| 258 | ldmat Vll ( V, linspace ( 0, dimx - 1 ) ); // top-left part of V |
| 259 | mat Y = Vll.to_mat(); |
| 260 | mat varY ( Y.rows(), Y.cols() ); |
| 261 | |
| 262 | double denom = ( mp1p - 1 ) * mp1m * mp1m * ( mp1m - 2 ); // (m-p)(m-p-1)^2(m-p-3) |
| 263 | |
| 264 | int i, j; |
| 265 | for ( i = 0; i < Y.rows(); i++ ) { |
| 266 | for ( j = 0; j < Y.cols(); j++ ) { |
| 267 | varY ( i, j ) = ( mp1p * Y ( i, j ) * Y ( i, j ) + mp1m * Y ( i, i ) * Y ( j, j ) ) / denom; |
| 268 | } |
| 269 | } |
| 270 | vec mean_dR = diag ( Y ) / mp1m; // corresponds to cove |
| 271 | vec var_th = diag ( itmp.to_mat() ); |
| 272 | vec var_Th ( mean_dR.length() *var_th.length() ); |
| 273 | // diagonal of diag(mean_dR) \kron diag(var_th) |
| 274 | for ( int i = 0; i < mean_dR.length(); i++ ) { |
| 275 | var_Th.set_subvector ( i*var_th.length(), var_th*mean_dR ( i ) ); |
| 276 | } |
| 277 | |
| 278 | return concat ( var_Th, cvectorize ( varY ) ); |
| 279 | } |
283 | | const mat &L = V._L(); |
284 | | const vec &D = V._D(); |
285 | | int end = L.rows() - 1; |
286 | | |
287 | | ldmat ldR ( L ( 0, dimx - 1, 0, dimx - 1 ), D ( 0, dimx - 1 ) / ( nu - nPsi - 2*dimx - 2 ) ); //exp val of R |
288 | | |
289 | | // set mean value |
290 | | if (dimx<=end){ |
291 | | mat iLsub = ltuinv ( L ( dimx, end, dimx, end ) ); |
292 | | mat Lpsi = L ( dimx, end, 0, dimx - 1 ); |
293 | | M = iLsub * Lpsi; |
294 | | } |
295 | | R = ldR.to_mat() ; |
| 283 | const mat &L = V._L(); |
| 284 | const vec &D = V._D(); |
| 285 | int end = L.rows() - 1; |
| 286 | |
| 287 | ldmat ldR ( L ( 0, dimx - 1, 0, dimx - 1 ), D ( 0, dimx - 1 ) / ( nu - nPsi - 2*dimx - 2 ) ); //exp val of R |
| 288 | |
| 289 | // set mean value |
| 290 | if (dimx<=end) { |
| 291 | mat iLsub = ltuinv ( L ( dimx, end, dimx, end ) ); |
| 292 | mat Lpsi = L ( dimx, end, 0, dimx - 1 ); |
| 293 | M = iLsub * Lpsi; |
| 294 | } |
| 295 | R = ldR.to_mat() ; |
299 | | epdf::log_register ( L, prefix ); |
300 | | if ( log_level[logvartheta] ) { |
301 | | int th_dim = dim - dimx*dimx; // dimension - dimension of cov |
302 | | L.add_vector( log_level, logvartheta, RV ( th_dim ), prefix ); |
303 | | } |
| 299 | epdf::log_register ( L, prefix ); |
| 300 | if ( log_level[logvartheta] ) { |
| 301 | int th_dim = dim - dimx*dimx; // dimension - dimension of cov |
| 302 | L.add_vector( log_level, logvartheta, RV ( th_dim ), prefix ); |
| 303 | } |
319 | | epdf::from_setting ( set ); |
320 | | UI::get ( dimx, set, "dimx", UI::compulsory ); |
321 | | if ( !UI::get ( nu, set, "nu", UI::optional ) ) { |
322 | | nu = -1; |
323 | | } |
324 | | mat Vful; |
325 | | if (!UI::get(V, set, "V", UI::optional)){ |
326 | | if ( !UI::get ( Vful, set, "V", UI::optional ) ) { |
327 | | vec dV; |
328 | | UI::get ( dV, set, "dV", UI::compulsory ); |
329 | | set_parameters ( dimx, ldmat ( dV ), nu ); |
330 | | |
331 | | } else { |
332 | | set_parameters ( dimx, Vful, nu ); |
333 | | } |
334 | | } |
335 | | } |
| 319 | epdf::from_setting ( set ); |
| 320 | UI::get ( dimx, set, "dimx", UI::compulsory ); |
| 321 | if ( !UI::get ( nu, set, "nu", UI::optional ) ) { |
| 322 | nu = -1; |
| 323 | } |
| 324 | mat Vful; |
| 325 | if (!UI::get(V, set, "V", UI::optional)) { |
| 326 | if ( !UI::get ( Vful, set, "V", UI::optional ) ) { |
| 327 | vec dV; |
| 328 | UI::get ( dV, set, "dV", UI::compulsory ); |
| 329 | set_parameters ( dimx, ldmat ( dV ), nu ); |
| 330 | |
| 331 | } else { |
| 332 | set_parameters ( dimx, Vful, nu ); |
| 333 | } |
| 334 | } |
| 335 | } |
338 | | epdf::to_setting ( set ); |
339 | | UI::save ( dimx, set, "dimx" ); |
340 | | UI::save ( V, set, "V" ); |
341 | | UI::save ( nu, set, "nu" ); |
342 | | }; |
| 338 | epdf::to_setting ( set ); |
| 339 | UI::save ( dimx, set, "dimx" ); |
| 340 | UI::save ( V, set, "V" ); |
| 341 | UI::save ( nu, set, "nu" ); |
| 342 | }; |
415 | | double res = 0.0; //the rest will be added |
416 | | int i; |
417 | | |
418 | | if ( any ( val <= 0. ) ) return -inf; |
419 | | if ( any ( beta <= 0. ) ) return -inf; |
420 | | for ( i = 0; i < dim; i++ ) { |
421 | | res += ( alpha ( i ) - 1 ) * std::log ( val ( i ) ) - beta ( i ) * val ( i ); |
422 | | } |
423 | | double tmp = res - lognc();; |
424 | | bdm_assert_debug ( std::isfinite ( tmp ), "Infinite value" ); |
425 | | return tmp; |
| 415 | double res = 0.0; //the rest will be added |
| 416 | int i; |
| 417 | |
| 418 | if ( any ( val <= 0. ) ) return -inf; |
| 419 | if ( any ( beta <= 0. ) ) return -inf; |
| 420 | for ( i = 0; i < dim; i++ ) { |
| 421 | res += ( alpha ( i ) - 1 ) * std::log ( val ( i ) ) - beta ( i ) * val ( i ); |
| 422 | } |
| 423 | double tmp = res - lognc();; |
| 424 | bdm_assert_debug ( std::isfinite ( tmp ), "Infinite value" ); |
| 425 | return tmp; |
466 | | pdf::from_setting ( set ); // reads rv and rvc |
467 | | vec betatmp; // ugly but necessary |
468 | | UI::get ( betatmp, set, "beta", UI::compulsory ); |
469 | | UI::get ( k, set, "k", UI::compulsory ); |
470 | | set_parameters ( k, betatmp ); |
471 | | } |
| 466 | pdf::from_setting ( set ); // reads rv and rvc |
| 467 | vec betatmp; // ugly but necessary |
| 468 | UI::get ( betatmp, set, "beta", UI::compulsory ); |
| 469 | UI::get ( k, set, "k", UI::compulsory ); |
| 470 | set_parameters ( k, betatmp ); |
| 471 | } |
500 | | int n = w.length(); |
501 | | ind = zeros_i ( n ); |
502 | | ivec N_babies = zeros_i ( n ); |
503 | | vec cumDist = cumsum ( w ); |
504 | | vec u ( n ); |
505 | | int i, j, parent; |
506 | | double u0; |
507 | | |
508 | | switch ( method ) { |
509 | | case MULTINOMIAL: |
510 | | u ( n - 1 ) = pow ( UniRNG.sample(), 1.0 / n ); |
511 | | |
512 | | for ( i = n - 2; i >= 0; i-- ) { |
513 | | u ( i ) = u ( i + 1 ) * pow ( UniRNG.sample(), 1.0 / ( i + 1 ) ); |
514 | | } |
515 | | |
516 | | break; |
517 | | |
518 | | case STRATIFIED: |
519 | | |
520 | | for ( i = 0; i < n; i++ ) { |
521 | | u ( i ) = ( i + UniRNG.sample() ) / n; |
522 | | } |
523 | | |
524 | | break; |
525 | | |
526 | | case SYSTEMATIC: |
527 | | u0 = UniRNG.sample(); |
528 | | |
529 | | for ( i = 0; i < n; i++ ) { |
530 | | u ( i ) = ( i + u0 ) / n; |
531 | | } |
532 | | |
533 | | break; |
534 | | |
535 | | default: |
536 | | bdm_error ( "PF::resample(): Unknown resampling method" ); |
537 | | } |
538 | | |
539 | | // U is now full |
540 | | j = 0; |
541 | | |
542 | | for ( i = 0; i < n; i++ ) { |
543 | | while ( u ( i ) > cumDist ( j ) ) j++; |
544 | | |
545 | | N_babies ( j ) ++; |
546 | | } |
547 | | // We have assigned new babies for each Particle |
548 | | // Now, we fill the resulting index such that: |
549 | | // * particles with at least one baby should not move * |
550 | | // This assures that reassignment can be done inplace; |
551 | | |
552 | | // find the first parent; |
553 | | parent = 0; |
554 | | while ( N_babies ( parent ) == 0 ) parent++; |
555 | | |
556 | | // Build index |
557 | | for ( i = 0; i < n; i++ ) { |
558 | | if ( N_babies ( i ) > 0 ) { |
559 | | ind ( i ) = i; |
560 | | N_babies ( i ) --; //this index was now replicated; |
561 | | } else { |
562 | | // test if the parent has been fully replicated |
563 | | // if yes, find the next one |
564 | | while ( ( N_babies ( parent ) == 0 ) || ( N_babies ( parent ) == 1 && parent > i ) ) parent++; |
565 | | |
566 | | // Replicate parent |
567 | | ind ( i ) = parent; |
568 | | |
569 | | N_babies ( parent ) --; //this index was now replicated; |
570 | | } |
571 | | |
572 | | } |
| 500 | int n = w.length(); |
| 501 | ind = zeros_i ( n ); |
| 502 | ivec N_babies = zeros_i ( n ); |
| 503 | vec cumDist = cumsum ( w ); |
| 504 | vec u ( n ); |
| 505 | int i, j, parent; |
| 506 | double u0; |
| 507 | |
| 508 | switch ( method ) { |
| 509 | case MULTINOMIAL: |
| 510 | u ( n - 1 ) = pow ( UniRNG.sample(), 1.0 / n ); |
| 511 | |
| 512 | for ( i = n - 2; i >= 0; i-- ) { |
| 513 | u ( i ) = u ( i + 1 ) * pow ( UniRNG.sample(), 1.0 / ( i + 1 ) ); |
| 514 | } |
| 515 | |
| 516 | break; |
| 517 | |
| 518 | case STRATIFIED: |
| 519 | |
| 520 | for ( i = 0; i < n; i++ ) { |
| 521 | u ( i ) = ( i + UniRNG.sample() ) / n; |
| 522 | } |
| 523 | |
| 524 | break; |
| 525 | |
| 526 | case SYSTEMATIC: |
| 527 | u0 = UniRNG.sample(); |
| 528 | |
| 529 | for ( i = 0; i < n; i++ ) { |
| 530 | u ( i ) = ( i + u0 ) / n; |
| 531 | } |
| 532 | |
| 533 | break; |
| 534 | |
| 535 | default: |
| 536 | bdm_error ( "PF::resample(): Unknown resampling method" ); |
| 537 | } |
| 538 | |
| 539 | // U is now full |
| 540 | j = 0; |
| 541 | |
| 542 | for ( i = 0; i < n; i++ ) { |
| 543 | while ( u ( i ) > cumDist ( j ) ) j++; |
| 544 | |
| 545 | N_babies ( j ) ++; |
| 546 | } |
| 547 | // We have assigned new babies for each Particle |
| 548 | // Now, we fill the resulting index such that: |
| 549 | // * particles with at least one baby should not move * |
| 550 | // This assures that reassignment can be done inplace; |
| 551 | |
| 552 | // find the first parent; |
| 553 | parent = 0; |
| 554 | while ( N_babies ( parent ) == 0 ) parent++; |
| 555 | |
| 556 | // Build index |
| 557 | for ( i = 0; i < n; i++ ) { |
| 558 | if ( N_babies ( i ) > 0 ) { |
| 559 | ind ( i ) = i; |
| 560 | N_babies ( i ) --; //this index was now replicated; |
| 561 | } else { |
| 562 | // test if the parent has been fully replicated |
| 563 | // if yes, find the next one |
| 564 | while ( ( N_babies ( parent ) == 0 ) || ( N_babies ( parent ) == 1 && parent > i ) ) parent++; |
| 565 | |
| 566 | // Replicate parent |
| 567 | ind ( i ) = parent; |
| 568 | |
| 569 | N_babies ( parent ) --; //this index was now replicated; |
| 570 | } |
| 571 | |
| 572 | } |
597 | | migamma::from_setting(set); |
598 | | vec ref; |
599 | | double k,l; |
600 | | |
601 | | UI::get ( ref, set, "ref" , UI::compulsory ); |
602 | | UI::get( k, set, "k", UI::compulsory ); |
603 | | UI::get( l, set, "l", UI::compulsory ); |
604 | | set_parameters ( k, ref, l ); |
| 597 | migamma::from_setting(set); |
| 598 | vec ref; |
| 599 | double k,l; |
| 600 | |
| 601 | UI::get ( ref, set, "ref" , UI::compulsory ); |
| 602 | UI::get( k, set, "k", UI::compulsory ); |
| 603 | UI::get( l, set, "l", UI::compulsory ); |
| 604 | set_parameters ( k, ref, l ); |
615 | | pdf_internal<elognorm>::from_setting(set); |
616 | | vec mu0; |
617 | | double k; |
618 | | UI::get ( mu0, set, "mu0", UI::compulsory ); |
619 | | UI::get( k, set, "k", UI::compulsory ); |
620 | | set_parameters ( mu0.length(), k ); |
621 | | condition ( mu0 ); |
| 615 | pdf_internal<elognorm>::from_setting(set); |
| 616 | vec mu0; |
| 617 | double k; |
| 618 | UI::get ( mu0, set, "mu0", UI::compulsory ); |
| 619 | UI::get( k, set, "k", UI::compulsory ); |
| 620 | set_parameters ( mu0.length(), k ); |
| 621 | condition ( mu0 ); |
635 | | if ( cond.length() > 0 ) { |
636 | | iepdf._mu() = A * cond + mu_const; |
637 | | } else { |
638 | | iepdf._mu() = mu_const; |
639 | | } |
640 | | double zeta; |
641 | | //ugly hack! |
642 | | if ( ( cond.length() + 1 ) == Lambda.rows() ) { |
643 | | zeta = Lambda.invqform ( concat ( cond, vec_1 ( 1.0 ) ) ); |
644 | | } else { |
645 | | zeta = Lambda.invqform ( cond ); |
646 | | } |
647 | | _R = Re; |
648 | | _R *= ( 1 + zeta );// / ( nu ); << nu is in Re!!!!!! |
| 635 | if ( cond.length() > 0 ) { |
| 636 | iepdf._mu() = A * cond + mu_const; |
| 637 | } else { |
| 638 | iepdf._mu() = mu_const; |
| 639 | } |
| 640 | double zeta; |
| 641 | //ugly hack! |
| 642 | if ( ( cond.length() + 1 ) == Lambda.rows() ) { |
| 643 | zeta = Lambda.invqform ( concat ( cond, vec_1 ( 1.0 ) ) ); |
| 644 | } else { |
| 645 | zeta = Lambda.invqform ( cond ); |
| 646 | } |
| 647 | _R = Re; |
| 648 | _R *= ( 1 + zeta );// / ( nu ); << nu is in Re!!!!!! |
652 | | // lb in inf so than it will be pushed below; |
653 | | lb.set_size ( dim ); |
654 | | ub.set_size ( dim ); |
655 | | lb = std::numeric_limits<double>::infinity(); |
656 | | ub = -std::numeric_limits<double>::infinity(); |
657 | | int j; |
658 | | for ( int i = 0; i < n; i++ ) { |
659 | | for ( j = 0; j < dim; j++ ) { |
660 | | if ( samples ( i ) ( j ) < lb ( j ) ) { |
661 | | lb ( j ) = samples ( i ) ( j ); |
662 | | } |
663 | | if ( samples ( i ) ( j ) > ub ( j ) ) { |
664 | | ub ( j ) = samples ( i ) ( j ); |
665 | | } |
666 | | } |
667 | | } |
| 652 | // lb in inf so than it will be pushed below; |
| 653 | lb.set_size ( dim ); |
| 654 | ub.set_size ( dim ); |
| 655 | lb = std::numeric_limits<double>::infinity(); |
| 656 | ub = -std::numeric_limits<double>::infinity(); |
| 657 | int j; |
| 658 | for ( int i = 0; i < n; i++ ) { |
| 659 | for ( j = 0; j < dim; j++ ) { |
| 660 | if ( samples ( i ) ( j ) < lb ( j ) ) { |
| 661 | lb ( j ) = samples ( i ) ( j ); |
| 662 | } |
| 663 | if ( samples ( i ) ( j ) > ub ( j ) ) { |
| 664 | ub ( j ) = samples ( i ) ( j ); |
| 665 | } |
| 666 | } |
| 667 | } |
677 | | epdf::from_setting( set ); |
678 | | |
679 | | UI::get( samples, set, "samples", UI::compulsory ); |
680 | | UI::get ( w, set, "w", UI::compulsory ); |
681 | | } |
682 | | |
683 | | void eEmp::validate (){ |
684 | | epdf::validate(); |
685 | | bdm_assert (samples.length()==w.length(),"samples and weigths are of different lengths"); |
686 | | n = w.length(); |
687 | | if (n>0) |
688 | | pdf::dim = samples ( 0 ).length(); |
689 | | } |
690 | | |
| 677 | epdf::from_setting( set ); |
| 678 | |
| 679 | UI::get( samples, set, "samples", UI::compulsory ); |
| 680 | UI::get ( w, set, "w", UI::compulsory ); |
| 681 | } |
| 682 | |
| 683 | void eEmp::validate () { |
| 684 | epdf::validate(); |
| 685 | bdm_assert (samples.length()==w.length(),"samples and weigths are of different lengths"); |
| 686 | n = w.length(); |
| 687 | if (n>0) |
| 688 | pdf::dim = samples ( 0 ).length(); |
| 689 | } |
| 690 | |
709 | | epdf::from_setting ( set ); // reads rv and rvc |
710 | | |
711 | | UI::get ( high, set, "high", UI::compulsory ); |
712 | | UI::get ( low, set, "low", UI::compulsory ); |
713 | | set_parameters ( low, high ); |
714 | | |
715 | | } |
716 | | |
| 709 | epdf::from_setting ( set ); // reads rv and rvc |
| 710 | |
| 711 | UI::get ( high, set, "high", UI::compulsory ); |
| 712 | UI::get ( low, set, "low", UI::compulsory ); |
| 713 | set_parameters ( low, high ); |
| 714 | |
| 715 | } |
| 716 | |
724 | | epdf::validate(); |
725 | | bdm_assert ( high.length() == low.length(), "Incompatible high and low vectors" ); |
726 | | dim = high.length(); |
727 | | bdm_assert ( min ( distance ) > 0.0, "bad support" ); |
728 | | } |
729 | | |
730 | | void mgdirac::from_setting(const Setting& set){ |
731 | | pdf::from_setting(set); |
732 | | g=UI::build<fnc>(set,"g",UI::compulsory); |
733 | | validate(); |
734 | | } |
735 | | void mgdirac::to_setting(Setting &set) const{ |
736 | | pdf::to_setting(set); |
737 | | UI::save(g.get(), set, "g"); |
738 | | } |
| 724 | epdf::validate(); |
| 725 | bdm_assert ( high.length() == low.length(), "Incompatible high and low vectors" ); |
| 726 | dim = high.length(); |
| 727 | bdm_assert ( min ( distance ) > 0.0, "bad support" ); |
| 728 | } |
| 729 | |
| 730 | void mgdirac::from_setting(const Setting& set) { |
| 731 | pdf::from_setting(set); |
| 732 | g=UI::build<fnc>(set,"g",UI::compulsory); |
| 733 | validate(); |
| 734 | } |
| 735 | void mgdirac::to_setting(Setting &set) const { |
| 736 | pdf::to_setting(set); |
| 737 | UI::save(g.get(), set, "g"); |
| 738 | } |
746 | | pdf::from_setting ( set ); // reads rv and rvc |
747 | | if ( _rv()._dsize() > 0 ) { |
748 | | rvc = _rv().copy_t ( -1 ); |
749 | | } |
750 | | vec beta0; |
751 | | if ( !UI::get ( beta0, set, "beta0", UI::optional ) ) { |
752 | | beta0 = ones ( _rv()._dsize() ); |
753 | | } |
754 | | if ( !UI::get ( betac, set, "betac", UI::optional ) ) { |
755 | | betac = 0.1 * ones ( _rv()._dsize() ); |
756 | | } |
757 | | _beta = beta0; |
758 | | |
759 | | UI::get ( k, set, "k", UI::compulsory ); |
760 | | } |
| 746 | pdf::from_setting ( set ); // reads rv and rvc |
| 747 | if ( _rv()._dsize() > 0 ) { |
| 748 | rvc = _rv().copy_t ( -1 ); |
| 749 | } |
| 750 | vec beta0; |
| 751 | if ( !UI::get ( beta0, set, "beta0", UI::optional ) ) { |
| 752 | beta0 = ones ( _rv()._dsize() ); |
| 753 | } |
| 754 | if ( !UI::get ( betac, set, "betac", UI::optional ) ) { |
| 755 | betac = 0.1 * ones ( _rv()._dsize() ); |
| 756 | } |
| 757 | _beta = beta0; |
| 758 | |
| 759 | UI::get ( k, set, "k", UI::compulsory ); |
| 760 | } |
781 | | pdf::from_setting ( set ); // reads rv and rvc |
782 | | if ( _rv()._dsize() > 0 ) { |
783 | | rvc = _rv().copy_t ( -1 ); |
784 | | } |
785 | | if ( !UI::get ( iepdf.beta, set, "beta", UI::optional ) ) { |
786 | | iepdf.beta = ones ( _rv()._dsize() ); |
787 | | } |
788 | | if ( !UI::get ( iepdf.alpha, set, "alpha", UI::optional ) ) { |
789 | | iepdf.alpha = ones ( _rv()._dsize() ); |
790 | | } |
791 | | if ( !UI::get ( betac, set, "betac", UI::optional ) ) { |
792 | | betac = 0.1 * ones ( _rv()._dsize() ); |
793 | | } |
794 | | |
795 | | UI::get ( k, set, "k", UI::compulsory ); |
| 781 | pdf::from_setting ( set ); // reads rv and rvc |
| 782 | if ( _rv()._dsize() > 0 ) { |
| 783 | rvc = _rv().copy_t ( -1 ); |
| 784 | } |
| 785 | if ( !UI::get ( iepdf.beta, set, "beta", UI::optional ) ) { |
| 786 | iepdf.beta = ones ( _rv()._dsize() ); |
| 787 | } |
| 788 | if ( !UI::get ( iepdf.alpha, set, "alpha", UI::optional ) ) { |
| 789 | iepdf.alpha = ones ( _rv()._dsize() ); |
| 790 | } |
| 791 | if ( !UI::get ( betac, set, "betac", UI::optional ) ) { |
| 792 | betac = 0.1 * ones ( _rv()._dsize() ); |
| 793 | } |
| 794 | |
| 795 | UI::get ( k, set, "k", UI::compulsory ); |