romtools.workflows.sampling_methods
1# pylint: disable=invalid-name 2 3from typing import Protocol 4import numpy as np 5from scipy.stats import qmc 6 7 8class Sampler(Protocol): 9 ''' 10 Generate UIID samples 11 12 Returns np.ndarray of shape (number_of_samples, dimensionality) 13 ''' 14 15 def __call__(self, number_of_samples: int, dimensionality: int = 1, seed=None) -> np.ndarray: 16 pass 17 18 19########################################## 20# Sampling Methods 21########################################## 22 23 24def MonteCarloSampler(number_of_samples: int, dimensionality: int = 1, seed=None) -> np.ndarray: 25 ''' 26 Generate UIID Monte Carlo samples 27 28 Conforms to the Sampler protocol 29 ''' 30 if seed is not None: 31 np.random.seed(seed) 32 return np.random.uniform(size=(number_of_samples, dimensionality)) 33 34 35def LatinHypercubeSampler(number_of_samples: int, dimensionality: int = 1, seed=None) -> np.ndarray: 36 ''' 37 Generate UIID LHS samples 38 39 Conforms to the Sampler protocol 40 ''' 41 sampler = qmc.LatinHypercube(dimensionality, seed=seed) 42 return sampler.random(n=number_of_samples)
class
Sampler(typing.Protocol):
9class Sampler(Protocol): 10 ''' 11 Generate UIID samples 12 13 Returns np.ndarray of shape (number_of_samples, dimensionality) 14 ''' 15 16 def __call__(self, number_of_samples: int, dimensionality: int = 1, seed=None) -> np.ndarray: 17 pass
Generate UIID samples
Returns np.ndarray of shape (number_of_samples, dimensionality)
Sampler(*args, **kwargs)
1771def _no_init_or_replace_init(self, *args, **kwargs): 1772 cls = type(self) 1773 1774 if cls._is_protocol: 1775 raise TypeError('Protocols cannot be instantiated') 1776 1777 # Already using a custom `__init__`. No need to calculate correct 1778 # `__init__` to call. This can lead to RecursionError. See bpo-45121. 1779 if cls.__init__ is not _no_init_or_replace_init: 1780 return 1781 1782 # Initially, `__init__` of a protocol subclass is set to `_no_init_or_replace_init`. 1783 # The first instantiation of the subclass will call `_no_init_or_replace_init` which 1784 # searches for a proper new `__init__` in the MRO. The new `__init__` 1785 # replaces the subclass' old `__init__` (ie `_no_init_or_replace_init`). Subsequent 1786 # instantiation of the protocol subclass will thus use the new 1787 # `__init__` and no longer call `_no_init_or_replace_init`. 1788 for base in cls.__mro__: 1789 init = base.__dict__.get('__init__', _no_init_or_replace_init) 1790 if init is not _no_init_or_replace_init: 1791 cls.__init__ = init 1792 break 1793 else: 1794 # should not happen 1795 cls.__init__ = object.__init__ 1796 1797 cls.__init__(self, *args, **kwargs)
def
MonteCarloSampler( number_of_samples: int, dimensionality: int = 1, seed=None) -> numpy.ndarray:
25def MonteCarloSampler(number_of_samples: int, dimensionality: int = 1, seed=None) -> np.ndarray: 26 ''' 27 Generate UIID Monte Carlo samples 28 29 Conforms to the Sampler protocol 30 ''' 31 if seed is not None: 32 np.random.seed(seed) 33 return np.random.uniform(size=(number_of_samples, dimensionality))
Generate UIID Monte Carlo samples
Conforms to the Sampler protocol
def
LatinHypercubeSampler( number_of_samples: int, dimensionality: int = 1, seed=None) -> numpy.ndarray:
36def LatinHypercubeSampler(number_of_samples: int, dimensionality: int = 1, seed=None) -> np.ndarray: 37 ''' 38 Generate UIID LHS samples 39 40 Conforms to the Sampler protocol 41 ''' 42 sampler = qmc.LatinHypercube(dimensionality, seed=seed) 43 return sampler.random(n=number_of_samples)
Generate UIID LHS samples
Conforms to the Sampler protocol