GitHub

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