@@ -191,10 +191,14 @@ def sample_smc(
191
191
192
192
if parallel and cores > 1 :
193
193
pool = mp .Pool (processes = cores )
194
- results = pool .starmap (likelihood_logp , [(sample ,) for sample in posterior ])
194
+ priors = pool .starmap (prior_logp , [(sample ,) for sample in posterior ])
195
+ likelihoods = pool .starmap (likelihood_logp , [(sample ,) for sample in posterior ])
195
196
else :
196
- results = [likelihood_logp (sample ) for sample in posterior ]
197
- likelihoods = np .array (results ).squeeze ()
197
+ priors = [prior_logp (sample ) for sample in posterior ]
198
+ likelihoods = [likelihood_logp (sample ) for sample in posterior ]
199
+
200
+ priors = np .array (priors ).squeeze ()
201
+ likelihoods = np .array (likelihoods ).squeeze ()
198
202
199
203
while beta < 1 :
200
204
beta , old_beta , weights , sj = calc_beta (beta , likelihoods , threshold )
@@ -203,6 +207,7 @@ def sample_smc(
203
207
# resample based on plausibility weights (selection)
204
208
resampling_indexes = np .random .choice (np .arange (draws ), size = draws , p = weights )
205
209
posterior = posterior [resampling_indexes ]
210
+ priors = priors [resampling_indexes ]
206
211
likelihoods = likelihoods [resampling_indexes ]
207
212
208
213
# compute proposal distribution based on weights
@@ -219,7 +224,6 @@ def sample_smc(
219
224
pm ._log .info ("Stage: {:3d} Beta: {:.3f} Steps: {:3d}" .format (stage , beta , n_steps ))
220
225
# Apply Metropolis kernel (mutation)
221
226
proposed = draws * n_steps
222
- priors = np .array ([prior_logp (sample ) for sample in posterior ]).squeeze ()
223
227
tempered_logp = priors + likelihoods * beta
224
228
225
229
parameters = (
@@ -238,18 +242,31 @@ def sample_smc(
238
242
results = pool .starmap (
239
243
metrop_kernel ,
240
244
[
241
- (posterior [draw ], tempered_logp [draw ], likelihoods [draw ], * parameters )
245
+ (
246
+ posterior [draw ],
247
+ tempered_logp [draw ],
248
+ priors [draw ],
249
+ likelihoods [draw ],
250
+ * parameters ,
251
+ )
242
252
for draw in range (draws )
243
253
],
244
254
)
245
255
else :
246
256
results = [
247
- metrop_kernel (posterior [draw ], tempered_logp [draw ], likelihoods [draw ], * parameters )
257
+ metrop_kernel (
258
+ posterior [draw ],
259
+ tempered_logp [draw ],
260
+ priors [draw ],
261
+ likelihoods [draw ],
262
+ * parameters
263
+ )
248
264
for draw in tqdm (range (draws ), disable = not progressbar )
249
265
]
250
266
251
- posterior , acc_list , likelihoods = zip (* results )
267
+ posterior , acc_list , priors , likelihoods = zip (* results )
252
268
posterior = np .array (posterior )
269
+ priors = np .array (priors )
253
270
likelihoods = np .array (likelihoods )
254
271
acc_rate = sum (acc_list ) / proposed
255
272
stage += 1
0 commit comments