Skip to content

Commit f7b76be

Browse files
Artem Romanyukwrdxwrdxwrdx
authored andcommitted
refactor: move simple sampling method to sampling module
1 parent 5f01953 commit f7b76be

8 files changed

Lines changed: 75 additions & 161 deletions

File tree

src/pysatl_core/distributions/__init__.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,9 @@
2121
from .distribution import Distribution
2222
from .registry import *
2323
from .registry import __all__ as _registry_all
24-
from .sampling import ArraySample, Sample
2524
from .strategies import (
2625
ComputationStrategy,
2726
DefaultComputationStrategy,
28-
DefaultSamplingUnivariateStrategy,
2927
SamplingStrategy,
3028
)
3129
from .support import *
@@ -38,14 +36,10 @@
3836
"FittedComputationMethod",
3937
# distribution
4038
"Distribution",
41-
# sampling
42-
"Sample",
43-
"ArraySample",
4439
# strategies
4540
"ComputationStrategy",
4641
"DefaultComputationStrategy",
4742
"SamplingStrategy",
48-
"DefaultSamplingUnivariateStrategy",
4943
# registry
5044
*_registry_all,
5145
# support

src/pysatl_core/distributions/distribution.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,8 @@ def __init__(
100100
computation_strategy : ComputationStrategy or None, default=None
101101
Computation strategy instance. If omitted, default strategy is used.
102102
"""
103-
from pysatl_core.distributions.strategies import (
104-
DefaultComputationStrategy,
105-
DefaultSamplingUnivariateStrategy,
106-
)
103+
from pysatl_core.distributions.strategies import DefaultComputationStrategy
104+
from pysatl_core.sampling.default import DefaultSamplingUnivariateStrategy
107105

108106
self._distribution_type = distribution_type
109107
normalized_analytical: dict[

src/pysatl_core/distributions/sampling.py

Lines changed: 0 additions & 102 deletions
This file was deleted.

src/pysatl_core/distributions/strategies.py

Lines changed: 1 addition & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,8 @@
1313

1414
from typing import TYPE_CHECKING, Any, Protocol, cast
1515

16-
import numpy as np
17-
1816
from pysatl_core.distributions.registry import characteristic_registry
19-
from pysatl_core.types import CharacteristicName, Method, NumericArray
17+
from pysatl_core.types import Method, NumericArray
2018

2119
if TYPE_CHECKING:
2220
from collections.abc import Mapping
@@ -236,47 +234,3 @@ class SamplingStrategy(Protocol):
236234
"""Protocol for strategies that generate samples from distributions."""
237235

238236
def sample(self, n: int, distr: Distribution, **options: Any) -> NumericArray: ...
239-
240-
241-
class DefaultSamplingUnivariateStrategy(SamplingStrategy):
242-
"""
243-
Default univariate sampler based on inverse transform sampling.
244-
245-
This strategy generates samples by applying the PPF (inverse CDF)
246-
to uniformly distributed random variables.
247-
248-
Notes
249-
-----
250-
- Requires the distribution to provide a PPF computation method.
251-
- Assumes that the PPF follows NumPy semantics (vectorized evaluation).
252-
- Graph-derived PPFs (scalar-only) are currently not supported.
253-
- Returns a NumPy array containing the generated samples.
254-
"""
255-
256-
def sample(self, n: int, distr: Distribution, **options: Any) -> NumericArray:
257-
"""
258-
Generate samples from the distribution.
259-
260-
Parameters
261-
----------
262-
n : int
263-
Number of samples to generate.
264-
distr : Distribution
265-
Distribution to sample from.
266-
**options : Any
267-
Additional options forwarded to the PPF computation.
268-
269-
Returns
270-
-------
271-
NumericArray
272-
NumPy array containing ``n`` generated samples.
273-
The exact array shape depends on the distribution and sampling strategy.
274-
"""
275-
ppf = distr.query_method(CharacteristicName.PPF, **options)
276-
rng = np.random.default_rng()
277-
U = rng.random(n)
278-
# TODO: Now it will be based on the fact that the characteristic
279-
# has NumPy semantics (It is much more faster), that is,
280-
# it will not work with the graph computed characteristics currently.
281-
samples = ppf(U)
282-
return cast(NumericArray, samples)

src/pysatl_core/sampling/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
__copyright__ = "Copyright (c) 2025 PySATL project"
77
__license__ = "SPDX-License-Identifier: MIT"
88

9+
from .default import DefaultSamplingUnivariateStrategy
910
from .unuran import (
1011
DefaultUnuranSampler,
1112
DefaultUnuranSamplingStrategy,
@@ -19,6 +20,7 @@
1920
DefaultSamplingStrategy = DefaultUnuranSamplingStrategy
2021

2122
__all__ = [
23+
"DefaultSamplingUnivariateStrategy",
2224
"SamplingMethod",
2325
"SamplingMethodConfig",
2426
"DefaultSampler",
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
"""
2+
Simple Inverse-Transform Sampling Strategy
3+
==========================================
4+
5+
This module provides a basic univariate sampler based on inverse transform
6+
sampling (also known as the quantile/PPF method). It is used as a fallback
7+
when advanced sampling methods (e.g. UNU.RAN) are not available.
8+
"""
9+
10+
from __future__ import annotations
11+
12+
__author__ = "Leonid Elkin, Mikhail Mikhailov"
13+
__copyright__ = "Copyright (c) 2025 PySATL project"
14+
__license__ = "SPDX-License-Identifier: MIT"
15+
16+
from typing import TYPE_CHECKING, Any, cast
17+
18+
import numpy as np
19+
20+
from pysatl_core.distributions.strategies import SamplingStrategy
21+
from pysatl_core.types import CharacteristicName, NumericArray
22+
23+
if TYPE_CHECKING:
24+
from pysatl_core.distributions.distribution import Distribution
25+
26+
27+
class DefaultSamplingUnivariateStrategy(SamplingStrategy):
28+
"""
29+
Default univariate sampler based on inverse transform sampling.
30+
31+
This strategy generates samples by applying the PPF (inverse CDF)
32+
to uniformly distributed random variables.
33+
34+
Notes
35+
-----
36+
- Requires the distribution to provide a PPF computation method.
37+
- Assumes that the PPF follows NumPy semantics (vectorized evaluation).
38+
- Graph-derived PPFs (scalar-only) are currently not supported.
39+
- Returns a NumPy array containing the generated samples.
40+
"""
41+
42+
def sample(self, n: int, distr: Distribution, **options: Any) -> NumericArray:
43+
"""
44+
Generate samples from the distribution.
45+
46+
Parameters
47+
----------
48+
n : int
49+
Number of samples to generate.
50+
distr : Distribution
51+
Distribution to sample from.
52+
**options : Any
53+
Additional options forwarded to the PPF computation.
54+
55+
Returns
56+
-------
57+
NumericArray
58+
NumPy array containing ``n`` generated samples.
59+
The exact array shape depends on the distribution and sampling strategy.
60+
"""
61+
ppf = distr.query_method(CharacteristicName.PPF, **options)
62+
rng = np.random.default_rng()
63+
U = rng.random(n)
64+
# TODO: Now it will be based on the fact that the characteristic
65+
# has NumPy semantics (It is much more faster), that is,
66+
# it will not work with the graph computed characteristics currently.
67+
samples = ppf(U)
68+
return cast(NumericArray, samples)

src/pysatl_core/sampling/unuran/core/unuran_sampler.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121
import numpy as np
2222
import numpy.typing as npt
2323

24-
from pysatl_core.distributions.strategies import DefaultSamplingUnivariateStrategy
2524
from pysatl_core.distributions.support import ExplicitTableDiscreteSupport
25+
from pysatl_core.sampling.default import DefaultSamplingUnivariateStrategy
2626
from pysatl_core.sampling.unuran.core._unuran_sampler import (
2727
UnuranSamplerInitializer,
2828
ensure_default_urng,

src/pysatl_core/sampling/unuran/core/unuran_sampling_strategy.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
from typing import TYPE_CHECKING, Any, Final
1818

19-
from pysatl_core.distributions.strategies import DefaultSamplingUnivariateStrategy
19+
from pysatl_core.sampling.default import DefaultSamplingUnivariateStrategy
2020
from pysatl_core.sampling.unuran.core.unuran_sampler import DefaultUnuranSampler
2121
from pysatl_core.sampling.unuran.method_config import (
2222
UnuranMethodConfig,

0 commit comments

Comments
 (0)