1
1
import warnings
2
2
from typing import Dict , Tuple , Union
3
3
from dataclasses import field , dataclass
4
+ from multiprocessing import Pool
4
5
5
6
import numpy as np
6
7
import scipy
@@ -292,7 +293,7 @@ def __post_init__(self):
292
293
)
293
294
294
295
@classmethod
295
- def _from_dwelltime_model (cls , optimized , iterations ):
296
+ def _from_dwelltime_model (cls , optimized , iterations , num_processes = None ):
296
297
"""Construct bootstrap distributions for parameters from an optimized
297
298
:class:`~lumicks.pylake.DwelltimeModel`.
298
299
@@ -306,9 +307,27 @@ def _from_dwelltime_model(cls, optimized, iterations):
306
307
optimized model results
307
308
iterations : int
308
309
number of iterations (random samples) to use for the bootstrap
310
+ num_processes : int | None
311
+ number of processes to use for parallelization. If `None`, no parallelization is used.
309
312
"""
310
- samples = DwelltimeBootstrap ._sample (optimized , iterations )
311
- return cls (optimized , samples [: optimized .n_components ], samples [optimized .n_components :])
313
+
314
+ def from_samples (samples ):
315
+ return cls (
316
+ optimized ,
317
+ samples [: optimized .n_components ],
318
+ samples [optimized .n_components :],
319
+ )
320
+
321
+ if num_processes is None :
322
+ return from_samples (DwelltimeBootstrap ._sample (optimized , iterations ))
323
+
324
+ with Pool (num_processes ) as p :
325
+ result = p .starmap (
326
+ DwelltimeBootstrap ._sample ,
327
+ [(optimized , int (np .ceil (iterations / num_processes )))] * num_processes ,
328
+ )
329
+
330
+ return from_samples (np .hstack (result )[:, :iterations ])
312
331
313
332
def extend (self , iterations ):
314
333
"""Extend the distribution by additional sampling iterations.
@@ -721,15 +740,19 @@ def bic(self) -> float:
721
740
n = self .dwelltimes .size # number of observations
722
741
return k * np .log (n ) - 2 * self .log_likelihood
723
742
724
- def calculate_bootstrap (self , iterations = 500 ):
743
+ def calculate_bootstrap (self , iterations = 500 , * , num_processes = None ):
725
744
"""Calculate a bootstrap distribution for the model.
726
745
727
746
Parameters
728
747
----------
729
748
iterations : int
730
749
Number of iterations to sample for the distribution.
750
+ num_processes : int | None
751
+ Number of processes to use for parallelization. If `None`, no parallelization is used.
731
752
"""
732
- bootstrap = DwelltimeBootstrap ._from_dwelltime_model (self , iterations )
753
+ bootstrap = DwelltimeBootstrap ._from_dwelltime_model (
754
+ self , iterations , num_processes = num_processes
755
+ )
733
756
# TODO: remove with deprecation
734
757
self ._bootstrap = bootstrap
735
758
return bootstrap
0 commit comments