True Measures
UML Overview
AbstractTrueMeasure
Bases: object
Source code in qmcpy/true_measure/abstract_true_measure.py
__call__
- If just
nis supplied, generate samples from the sequence at indices 0,...,n-1. - If
n_minandn_maxare supplied, generate samples from the sequence at indicesn_min,...,n_max-1. - If
nandn_minare supplied, then generate samples from the sequence at indicesn,...,n_min-1.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
n
|
Union[None, int]
|
Number of points to generate. |
None
|
n_min
|
Union[None, int]
|
Starting index of sequence. |
None
|
n_max
|
Union[None, int]
|
Final index of sequence. |
None
|
return_weights
|
bool
|
If |
False
|
warn
|
bool
|
If |
True
|
Returns:
| Name | Type | Description |
|---|---|---|
t |
ndarray
|
Samples from the sequence.
|
weights |
ndarray
|
Only returned when |
Source code in qmcpy/true_measure/abstract_true_measure.py
spawn
Spawn new instances of the current true measure but with new seeds and dimensions. Used by multi-level QMC algorithms which require different seeds and dimensions on each level.
Note
Use replications instead of using spawn when possible, e.g., when spawning copies which all have the same dimension.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
s
|
int
|
Number of copies to spawn |
1
|
dimensions
|
ndarray
|
Length |
None
|
Returns:
| Name | Type | Description |
|---|---|---|
spawned_true_measures |
list
|
True measure with new seeds and dimensions. |
Source code in qmcpy/true_measure/abstract_true_measure.py
SciPyWrapper
Bases: AbstractTrueMeasure
True measure that wraps SciPy style distributions.
This class keeps the original behavior of SciPyWrapper with independent 1D marginals and adds an optional "joint" mode for dependent distributions.
Examples:
Independent marginals from scipy.stats:
>>> import scipy.stats as stats
>>> tm = SciPyWrapper(
... sampler=DigitalNetB2(3, seed=7),
... scipy_distribs=[
... stats.uniform(loc=1, scale=2),
... stats.norm(loc=0, scale=1),
... stats.gamma(a=5, loc=0, scale=2)])
>>> x = tm(2)
>>> x.shape
(2, 3)
Joint multivariate normal passed as a single object:
>>> mvn = stats.multivariate_normal(
... mean=[0.0, 0.0],
... cov=[[1.0, 0.8], [0.8, 1.0]])
>>> tm_joint = SciPyWrapper(DigitalNetB2(2, seed=7), mvn)
>>> tm_joint(2).shape
(2, 2)
2D Student t distribution (independent marginals):
>>> df = 5
>>> true_measure = SciPyWrapper(
... sampler=DigitalNetB2(2, seed=13),
... scipy_distribs=[
... stats.t(df=df, loc=0.0, scale=1.0),
... stats.t(df=df, loc=1.0, scale=2.0),
... ],
... )
>>> xs = true_measure(4)
>>> xs.shape
(4, 2)
Parameters
sampler : AbstractDiscreteDistribution Low discrepancy or iid sampler in dimension d, living on [0,1)^d. scipy_distribs : One of the following:
- A single SciPy 1D continuous frozen distribution.
- A list of such frozen distributions (independent marginals).
- A custom 1D distribution object with ``ppf`` and ``pdf`` or
``logpdf`` methods.
- A joint object with:
* ``transform(u)`` method
* optional ``logpdf(x)`` method
* ``dim`` or ``dimension`` attribute (otherwise ``sampler.d``).
Source code in qmcpy/true_measure/scipy_wrapper.py
Uniform
Bases: AbstractTrueMeasure
Uniform distribution, see https://en.wikipedia.org/wiki/Continuous_uniform_distribution.
Examples:
>>> true_measure = Uniform(DigitalNetB2(2,seed=7),lower_bound=[0,.5],upper_bound=[2,3])
>>> true_measure(4)
array([[1.44324713, 2.7873875 ],
[0.32691107, 1.5741214 ],
[1.97352511, 0.58590959],
[0.8591331 , 1.89690854]])
>>> true_measure
Uniform (AbstractTrueMeasure)
lower_bound [0. 0.5]
upper_bound [2 3]
With independent replications
>>> x = Uniform(DigitalNetB2(3,seed=7,replications=2),lower_bound=[.25,.5,.75],upper_bound=[1.75,1.5,1.25])(4)
>>> x.shape
(2, 4, 3)
>>> x
array([[[0.61979915, 0.6821862 , 1.12366296],
[1.27229355, 1.16169442, 0.9644598 ],
[0.97209782, 1.29818233, 0.79100643],
[1.62311988, 0.79520621, 1.13747905]],
[[0.92315337, 1.35899604, 1.0027484 ],
[1.05453886, 0.54353443, 0.91782473],
[0.59821215, 0.79281506, 0.78420518],
[1.37943573, 1.10241448, 1.13481488]]])
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
sampler
|
Union[AbstractDiscreteDistribution, AbstractTrueMeasure]
|
Either
|
required |
lower_bound
|
Union[float, ndarray]
|
Lower bound. |
0
|
upper_bound
|
Union[float, ndarray]
|
Upper bound. |
1
|
Source code in qmcpy/true_measure/uniform.py
Gaussian
Bases: AbstractTrueMeasure
Gaussian (Normal) distribution as described in https://en.wikipedia.org/wiki/Multivariate_normal_distribution.
Note
Normalis an alias forGaussian
Examples:
>>> true_measure = Gaussian(DigitalNetB2(2,seed=7),mean=[1,2],covariance=[[9,4],[4,5]])
>>> true_measure(4)
array([[ 3.83994612, 1.19097885],
[-1.9727727 , 0.49405353],
[ 5.87242307, 8.41341485],
[ 0.61222205, 1.48402653]])
>>> true_measure
Gaussian (AbstractTrueMeasure)
mean [1 2]
covariance [[9 4]
[4 5]]
decomp_type PCA
With independent replications
>>> x = Gaussian(DigitalNetB2(3,seed=7,replications=2),mean=0,covariance=3)(4)
>>> x.shape
(2, 4, 3)
>>> x
array([[[-1.18721904, -1.57108272, 1.15371635],
[ 0.81749123, 0.72242445, -0.31025434],
[-0.0807895 , 1.44651585, -2.41042379],
[ 2.38133494, -0.93225637, 1.30817519]],
[[-0.22304017, 1.86337427, 0.02386568],
[ 0.15807672, -2.96365385, -0.73502346],
[-1.26753687, -0.94427848, -2.57683314],
[ 1.1844196 , 0.44964332, 1.27760936]]])
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
sampler
|
Union[AbstractDiscreteDistribution, AbstractTrueMeasure]
|
Either
|
required |
mean
|
Union[float, ndarray]
|
Mean vector. |
0.0
|
covariance
|
Union[float, ndarray]
|
Covariance matrix. A float or vector will be expanded into a diagonal matrix. |
1.0
|
decomp_type
|
str
|
Method for decomposition for covariance matrix. Options include
|
'PCA'
|
Source code in qmcpy/true_measure/gaussian.py
BrownianMotion
Bases: Gaussian
Brownian Motion as described in https://en.wikipedia.org/wiki/Brownian_motion. For a standard Brownian Motion \(W\) we define the Brownian Motion \(B\) with initial value \(B_0\), drift \(\gamma\), and diffusion \(\sigma^2\) to be
Examples:
>>> true_measure = BrownianMotion(DigitalNetB2(4,seed=7),t_final=2,drift=2)
>>> true_measure(2)
array([[0.82189263, 2.7851793 , 3.60126805, 3.98054724],
[0.2610643 , 0.06170064, 1.06448269, 2.30990767]])
>>> true_measure
BrownianMotion (AbstractTrueMeasure)
time_vec [0.5 1. 1.5 2. ]
drift 2^(1)
mean [1. 2. 3. 4.]
covariance [[0.5 0.5 0.5 0.5]
[0.5 1. 1. 1. ]
[0.5 1. 1.5 1.5]
[0.5 1. 1.5 2. ]]
decomp_type PCA
With independent replications
>>> x = BrownianMotion(DigitalNetB2(3,seed=7,replications=2),t_final=2,drift=2)(4)
>>> x.shape
(2, 4, 3)
>>> x
array([[[0.66154685, 1.50620966, 3.52322901],
[1.77064217, 3.32782204, 4.45013223],
[1.33558688, 3.26017547, 3.40692337],
[2.10317345, 3.78961839, 6.17948096]],
[[1.77868019, 2.75347902, 3.41161419],
[0.44891984, 2.53987304, 4.7224811 ],
[0.23147948, 2.25289769, 3.00039101],
[2.06762574, 3.21756319, 4.93375923]]])
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
sampler
|
Union[AbstractDiscreteDistribution, AbstractTrueMeasure]
|
Either
|
required |
t_final
|
float
|
End time. |
1
|
initial_value
|
float
|
Initial value \(B_0\). |
0
|
drift
|
int
|
Drift \(\gamma\). |
0
|
diffusion
|
int
|
Diffusion \(\sigma^2\). |
1
|
decomp_type
|
str
|
Method for decomposition for covariance matrix. Options include
|
'PCA'
|
lazy_decomp
|
bool
|
If True, defer expensive matrix decomposition until needed. |
True
|
Source code in qmcpy/true_measure/brownian_motion.py
GeometricBrownianMotion
Bases: BrownianMotion
A Geometric Brownian Motion (GBM) with initial value \(S_0\), drift \(\gamma\), and diffusion \(\sigma^2\) is
where BM is a Brownian Motion drift \(\gamma\) and diffusion \(\sigma^2\).
Examples:
>>> gbm = GeometricBrownianMotion(DigitalNetB2(4,seed=7), t_final=2, drift=0.1, diffusion=0.2)
>>> gbm.gen_samples(2)
array([[0.92343761, 1.42069027, 1.30851806, 0.99133819],
[0.7185916 , 0.42028013, 0.42080335, 0.4696196 ]])
>>> gbm
GeometricBrownianMotion (AbstractTrueMeasure)
time_vec [0.5 1. 1.5 2. ]
drift 0.100
diffusion 0.200
mean_gbm [1.051 1.105 1.162 1.221]
covariance_gbm [[0.116 0.122 0.128 0.135]
[0.122 0.27 0.284 0.299]
[0.128 0.284 0.472 0.496]
[0.135 0.299 0.496 0.734]]
decomp_type PCA
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
sampler
|
DiscreteDistribution / TrueMeasure
|
A discrete distribution or true measure. |
required |
t_final
|
float
|
End time for the geometric Brownian motion, non-negative. |
1
|
initial_value
|
float
|
Positive initial value of the process, \(S_0\). |
1
|
drift
|
float
|
Drift coefficient \(\gamma\). |
0
|
diffusion
|
float
|
Positive diffusion coefficient \(\sigma^2\), where \(\sigma\) is volatility. |
1
|
decomp_type
|
str
|
Method of decomposition, either "PCA" or "Cholesky". |
'PCA'
|
lazy_load
|
bool
|
If True, defer GBM-specific computations until needed. |
True
|
lazy_decomp
|
bool
|
If True, defer expensive matrix decomposition until needed. |
True
|
Source code in qmcpy/true_measure/geometric_brownian_motion.py
gen_samples
Generate GBM samples using the parent's transform pipeline.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
n
|
int
|
number of samples to generate |
None
|
n_min
|
int
|
minimum index of sequence |
None
|
n_max
|
int
|
maximum index of sequence |
None
|
return_weights
|
bool
|
whether to return Jacobian weights |
False
|
warn
|
bool
|
whether to warn about sample generation |
True
|
Returns:
| Name | Type | Description |
|---|---|---|
samples |
Union[ndarray, tuple]
|
GBM samples, optionally with weights if return_weights=True |
Source code in qmcpy/true_measure/geometric_brownian_motion.py
MaternGP
Bases: Gaussian
A Gaussian process with Matérn covariance kernel.
Examples:
>>> true_measure = MaternGP(DigitalNetB2(dimension=3,seed=7),points=np.linspace(0,1,3)[:,None],nu=3/2,length_scale=[3,4,5],variance=0.01,mean=np.array([.3,.4,.5]))
>>> true_measure(4)
array([[0.3515401 , 0.43083384, 0.51801119],
[0.20272448, 0.31312011, 0.4241431 ],
[0.40189226, 0.53502934, 0.63826677],
[0.29943567, 0.38491661, 0.48296594]])
>>> true_measure
MaternGP (AbstractTrueMeasure)
mean [0.3 0.4 0.5]
covariance [[0.01 0.01 0.01 ]
[0.01 0.01 0.01 ]
[0.009 0.01 0.01 ]]
decomp_type PCA
With independent replications
>>> x = MaternGP(DigitalNetB2(dimension=3,seed=7,replications=2),points=np.linspace(0,1,3)[:,None],nu=3/2,length_scale=[3,4,5],variance=0.01,mean=np.array([.3,.4,.5]))(4)
>>> x.shape
(2, 4, 3)
>>> x
array([[[0.21490091, 0.33078241, 0.45151042],
[0.35465127, 0.44705898, 0.53793358],
[0.31091595, 0.39868187, 0.47660193],
[0.42419919, 0.53572415, 0.64674883]],
[[0.31010701, 0.38522001, 0.46670381],
[0.27221177, 0.413546 , 0.54101758],
[0.2147053 , 0.33293508, 0.43572791],
[0.37343973, 0.46534628, 0.56356714]]])
References:
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
sampler
|
Union[AbstractDiscreteDistribution, AbstractTrueMeasure]
|
Either
|
required |
points
|
ndarray
|
The positions of points on a metric space. The array should have shape \((d,k)\) where \(d\) is the dimension of the sampler and \(k\) is the latent dimension. |
required |
nu
|
float
|
The "smoothness" of the MaternGP function, e.g.,
Note that when \(\nu \notin \{1/2, 3/2, 5/2, \infty \}\) the kernel is around \(10\) times slower to evaluate. |
1.5
|
length_scale
|
Union[float, ndarray]
|
Determines "peakiness", or how correlated two points are based on their distance. |
1.0
|
variance
|
float
|
Global scaling factor. |
1.0
|
mean
|
Union[float, ndarray]
|
Mean vector for multivariate |
0.0
|
nugget
|
float
|
Positive nugget to add to diagonal. |
1e-06
|
decomp_type
|
str
|
Method for decomposition for covariance matrix. Options include
|
'PCA'
|
Source code in qmcpy/true_measure/matern_gp.py
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | |
Lebesgue
Bases: AbstractTrueMeasure
Lebesgue measure as described in https://en.wikipedia.org/wiki/Lebesgue_measure.
Examples:
>>> Lebesgue(Gaussian(DigitalNetB2(2,seed=7)))
Lebesgue (AbstractTrueMeasure)
transform Gaussian (AbstractTrueMeasure)
mean 0
covariance 1
decomp_type PCA
>>> Lebesgue(Uniform(DigitalNetB2(2,seed=7)))
Lebesgue (AbstractTrueMeasure)
transform Uniform (AbstractTrueMeasure)
lower_bound 0
upper_bound 1
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
sampler
|
AbstractTrueMeasure
|
A true measure by which to compose a transform. |
required |
Source code in qmcpy/true_measure/lebesgue.py
BernoulliCont
Bases: AbstractTrueMeasure
Continuous Bernoulli distribution with independent marginals as described in https://en.wikipedia.org/wiki/Continuous_Bernoulli_distribution.
Examples:
>>> true_measure = BernoulliCont(DigitalNetB2(2,seed=7),lam=.2)
>>> true_measure(4)
array([[0.56205914, 0.83607872],
[0.09433983, 0.28057299],
[0.97190779, 0.01883497],
[0.28050753, 0.39178506]])
>>> true_measure
BernoulliCont (AbstractTrueMeasure)
lam 0.200
With independent replications
>>> x = BernoulliCont(DigitalNetB2(3,seed=7,replications=2),lam=[.25,.5,.75])(4)
>>> x.shape
(2, 4, 3)
>>> x
array([[[0.16343492, 0.1821862 , 0.83209443],
[0.55140696, 0.66169442, 0.56381501],
[0.35229402, 0.79818233, 0.13825119],
[0.85773226, 0.29520621, 0.85203898]],
[[0.32359293, 0.85899604, 0.63591945],
[0.40278251, 0.04353443, 0.46749989],
[0.1530438 , 0.29281506, 0.116725 ],
[0.6345258 , 0.60241448, 0.84822692]]])
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
sampler
|
Union[AbstractDiscreteDistribution, AbstractTrueMeasure]
|
Either
|
required |
lam
|
Union[float, ndarray]
|
Vector of shape parameters, each in \((0,1)\). |
1 / 2
|
Source code in qmcpy/true_measure/bernoulli_cont.py
JohnsonsSU
Bases: AbstractTrueMeasure
Johnson's \(S_U\)-distribution with independent marginals as described in https://en.wikipedia.org/wiki/Johnson%27s_SU-distribution.
Examples:
>>> true_measure = JohnsonsSU(DigitalNetB2(2,seed=7),gamma=1,xi=2,delta=3,lam=4)
>>> true_measure(4)
array([[ 1.44849599, 2.49715741],
[-0.83646172, 0.38970902],
[ 3.67068094, -2.33911196],
[ 0.38940887, 0.84843818]])
>>> true_measure
JohnsonsSU (AbstractTrueMeasure)
gamma 1
xi 2^(1)
delta 3
lam 2^(2)
With independent replications
>>> x = JohnsonsSU(DigitalNetB2(3,seed=7,replications=2),gamma=1,xi=2,delta=3,lam=4)(4)
>>> x.shape
(2, 4, 3)
>>> x
array([[[-0.36735335, -0.71750135, 1.55387818],
[ 1.29233112, 1.21788962, 0.3870404 ],
[ 0.57599197, 1.78008445, -1.53756327],
[ 2.50112084, -0.14204369, 1.67333839]],
[[ 0.45920696, 2.10110361, 0.66122546],
[ 0.76973983, -2.12724026, 0.02868419],
[-0.43948474, -0.1525475 , -1.71041918],
[ 1.57765245, 1.00275 , 1.64972468]]])
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
sampler
|
Union[AbstractDiscreteDistribution, AbstractTrueMeasure]
|
Either
|
required |
gamma
|
Union[float, ndarray]
|
First parameter \(\gamma\). |
1
|
xi
|
Union[float, ndarray]
|
Second parameter \(\xi\). |
1
|
delta
|
Union[float, ndarray]
|
Third parameter \(\delta > 0\). |
2
|
lam
|
Union[float, ndarray]
|
Fourth parameter \(\lambda > 0\). |
2
|
Source code in qmcpy/true_measure/johnsons_su.py
Kumaraswamy
Bases: AbstractTrueMeasure
Kumaraswamy distribution as described in https://en.wikipedia.org/wiki/Kumaraswamy_distribution.
Examples:
>>> true_measure = Kumaraswamy(DigitalNetB2(2,seed=7),a=[1,2],b=[3,4])
>>> true_measure(4)
array([[0.34705366, 0.6782161 ],
[0.0577568 , 0.36189538],
[0.76344358, 0.0932949 ],
[0.17065545, 0.43009386]])
>>> true_measure
Kumaraswamy (AbstractTrueMeasure)
a [1 2]
b [3 4]
With independent replications
>>> x = Kumaraswamy(DigitalNetB2(3,seed=7,replications=2),a=[1,2,3],b=[3,4,5])(4)
>>> x.shape
(2, 4, 3)
>>> x
array([[[0.09004177, 0.22144305, 0.62190133],
[0.31710078, 0.48718217, 0.47325643],
[0.19657641, 0.57423463, 0.25697057],
[0.56103074, 0.28939035, 0.63654112]],
[[0.18006788, 0.62226635, 0.5083556 ],
[0.22602452, 0.10519477, 0.42823814],
[0.08428482, 0.28804621, 0.2414302 ],
[0.37253319, 0.45379743, 0.63366422]]])
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
sampler
|
Union[AbstractDiscreteDistribution, AbstractTrueMeasure]
|
Either
|
required |
a
|
Union[float, ndarray]
|
First parameter \(\alpha > 0\). |
2
|
b
|
Union[float, ndarray]
|
Second parameter \(\beta > 0\). |
2
|
Source code in qmcpy/true_measure/kumaraswamy.py
AcceptanceRejection
Bases: AbstractTrueMeasure
Deterministic Acceptance-Rejection (DAR) sampler on the unit cube.
Implements Algorithm 2 from Zhu & Dick (2014). A (t,m,s)-net in dimension s = d+1 is used as the driver, where the first d coordinates form the candidate point and the last coordinate is the acceptance threshold. This gives a star discrepancy bound of O(N^{-1/s}) on the accepted samples, compared to O(N^{-1/2}) for standard random acceptance-rejection.
The sampler dimension must be d+1 where d is the target dimension. The number of driver points is always a power of 2 (required for the (t,m,s)-net property of Theorem 1).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
sampler
|
AbstractDiscreteDistribution
|
A QMCPy discrete distribution of dimension s = target_dim + 1. Must mimic StdUniform. The last coordinate is used as the acceptance threshold. |
required |
target_density
|
callable
|
Unnormalised target density psi(x) where x has shape (N, d). Must return shape (N,) and be non-negative on [0,1]^d. |
required |
upper_bound
|
float
|
L = sup_{x in [0,1]^d} psi(x). Every evaluation of psi must be <= L. |
required |
density_integral
|
float
|
C = integral_{[0,1]^d} psi(x) dx. The acceptance rate is C/L. |
required |
max_retries
|
int
|
Number of times gen_samples will double the driver size if not enough points are accepted. Default 4. |
4
|
Examples:
>>> import numpy as np
>>> from qmcpy.discrete_distribution import DigitalNetB2
>>> from qmcpy.true_measure import AcceptanceRejection
>>> def psi(x): return 2 * x[:, 0] # target density on [0,1]
>>> sampler = DigitalNetB2(dimension=2, seed=7)
>>> measure = AcceptanceRejection(sampler, psi, upper_bound=2., density_integral=1.)
>>> samples = measure.gen_samples(n=8)
>>> samples.shape
(8, 1)
>>> measure
AcceptanceRejection (AbstractTrueMeasure)
target_dim 1
upper_bound 2^(1)
density_integral 1
acceptance_rate 2^(-1)
Continued sampling: two batches equal one single call.
>>> m1 = AcceptanceRejection(DigitalNetB2(dimension=2, seed=7), psi, upper_bound=2., density_integral=1.)
>>> b1 = m1.gen_samples(n_min=0, n_max=8)
>>> b2 = m1.gen_samples(n_min=8, n_max=16)
>>> m2 = AcceptanceRejection(DigitalNetB2(dimension=2, seed=7), psi, upper_bound=2., density_integral=1.)
>>> all_at_once = m2.gen_samples(n_min=0, n_max=16)
>>> np.allclose(np.concatenate([b1, b2]), all_at_once)
True
Calling with n_min > 0 without a prior call raises an error.
>>> m3 = AcceptanceRejection(DigitalNetB2(dimension=2, seed=7), psi, upper_bound=2., density_integral=1.)
>>> m3.gen_samples(n_min=8, n_max=16)
Traceback (most recent call last):
...
qmcpy.util.exceptions_warnings.ParameterError: n_min > 0 but no prior call was made. Call gen_samples with n_min=0 first.
Source code in qmcpy/true_measure/acceptance_rejection.py
gen_samples
Generate accepted samples from the target density.
Unlike other TrueMeasures, this method cannot be decomposed into a fixed 1-to-1 _transform because acceptance-rejection produces a variable number of outputs from a fixed driver batch. gen_samples is therefore overridden directly.
Supports continued sampling: calling with n_min=0 starts fresh, and subsequent calls with n_min>0 continue from the same driver sequence position.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
n
|
int
|
Number of accepted samples to return. Treated as n_min=0, n_max=n (always resets the driver sequence). |
None
|
n_min
|
int
|
Starting accepted-sample index. Use 0 to reset and start fresh. Use a positive value to continue from the previous call. |
None
|
n_max
|
int
|
Ending accepted-sample index (exclusive). Number of samples returned is n_max - n_min. |
None
|
return_weights
|
bool
|
If True, also return importance weights psi(x)/C for each accepted sample. |
False
|
warn
|
bool
|
If True, warn when fewer than n samples are returned after all retries. |
True
|
Returns:
| Name | Type | Description |
|---|---|---|
samples |
ndarray
|
Shape (n, target_dim). |
weights |
ndarray
|
Shape (n,). Only returned when return_weights=True. |
Source code in qmcpy/true_measure/acceptance_rejection.py
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 | |
AcceptanceRejectionReal
Bases: AbstractTrueMeasure
Deterministic Acceptance-Rejection (DAR) sampler on real space R^d.
Implements Algorithm 3 from Zhu & Dick (2014). Extends Algorithm 2 to densities on R^d by mapping the unit-cube driver through marginal quantile functions (inverse Rosenblatt transform, Lemma 4) before applying the acceptance test.
The driver point (u_1, ..., u_d, u_{d+1}) is transformed as:
z_j = F_j^{-1}(u_j) for j = 1, ..., d
u = u_{d+1} threshold coordinate (unchanged)
Acceptance condition: psi(z) >= L * H(z) * u
where H is the auxiliary bound function satisfying psi(z) <= L * H(z) for all z in R^d. This gives the same discrepancy bound O(N^{-1/s}) as Algorithm 2.
Note
inv_cdfs applies each quantile function independently per dimension. This is exact when H factors as a product of independent marginals (e.g. a product of univariate distributions).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
sampler
|
AbstractDiscreteDistribution
|
A QMCPy discrete distribution of dimension s = target_dim + 1. Must mimic StdUniform. |
required |
target_density
|
callable
|
Unnormalised target density psi(z) where z has shape (N, d). Must return shape (N,). Must satisfy psi(z) <= L * H(z) for all z. |
required |
inv_cdfs
|
list of callable
|
List of d quantile functions [F_1^{-1}, ..., F_d^{-1}], one per dimension. Each maps a 1-D array of uniforms in [0,1] to R. Example: [scipy.stats.norm.ppf] for a 1-D standard Gaussian. |
required |
H_func
|
callable
|
Auxiliary bound function H(z) where z has shape (N, d). Must return shape (N,) and satisfy psi(z) <= L * H(z) for all z in R^d. |
required |
upper_bound
|
float
|
L satisfying psi(z) <= L * H(z) for all z. |
required |
density_integral
|
float
|
C = integral_{R^d} psi(z) dz. The acceptance rate is C/L. |
required |
max_retries
|
int
|
Number of times gen_samples will double the driver size if not enough points are accepted. Default 4. |
4
|
Examples:
>>> import numpy as np
>>> from scipy.stats import norm
>>> from qmcpy.discrete_distribution import DigitalNetB2
>>> from qmcpy.true_measure import AcceptanceRejectionReal
>>> def psi(z): return norm.pdf(z[:, 0], loc=0, scale=1)
>>> def H(z): return norm.pdf(z[:, 0], loc=0, scale=2)
>>> sampler = DigitalNetB2(dimension=2, seed=7)
>>> measure = AcceptanceRejectionReal(
... sampler, psi,
... inv_cdfs=[lambda u: norm.ppf(u, loc=0, scale=2)],
... H_func=H, upper_bound=2., density_integral=1.)
>>> samples = measure.gen_samples(n=8)
>>> samples.shape
(8, 1)
>>> measure
AcceptanceRejectionReal (AbstractTrueMeasure)
target_dim 1
upper_bound 2^(1)
density_integral 1
acceptance_rate 2^(-1)
Continued sampling: batches resume the driver sequence without restarting.
>>> inv_cdfs = [lambda u: norm.ppf(u, loc=0, scale=2)]
>>> m1 = AcceptanceRejectionReal(DigitalNetB2(dimension=2, seed=7), psi, inv_cdfs=inv_cdfs, H_func=H, upper_bound=2., density_integral=1.)
>>> b1 = m1.gen_samples(n_min=0, n_max=8)
>>> b2 = m1.gen_samples(n_min=8, n_max=16)
>>> b1.shape, b2.shape
((8, 1), (8, 1))
Calling with n_min > 0 without a prior call raises an error.
>>> m3 = AcceptanceRejectionReal(DigitalNetB2(dimension=2, seed=7), psi, inv_cdfs=inv_cdfs, H_func=H, upper_bound=2., density_integral=1.)
>>> m3.gen_samples(n_min=8, n_max=16)
Traceback (most recent call last):
...
qmcpy.util.exceptions_warnings.ParameterError: n_min > 0 but no prior call was made. Call gen_samples with n_min=0 first.
Source code in qmcpy/true_measure/acceptance_rejection.py
gen_samples
Generate accepted samples from the target density on R^d.
Unlike other TrueMeasures, this method cannot be decomposed into a fixed 1-to-1 _transform because acceptance-rejection produces a variable number of outputs from a fixed driver batch. gen_samples is therefore overridden directly.
Supports continued sampling: calling with n_min=0 starts fresh, and subsequent calls with n_min>0 continue from the same driver sequence position.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
n
|
int
|
Number of accepted samples to return. Treated as n_min=0, n_max=n (always resets the driver sequence). |
None
|
n_min
|
int
|
Starting accepted-sample index. Use 0 to reset and start fresh. Use a positive value to continue from the previous call. |
None
|
n_max
|
int
|
Ending accepted-sample index (exclusive). Number of samples returned is n_max - n_min. |
None
|
return_weights
|
bool
|
If True, also return importance weights psi(z)/C for each accepted sample. |
False
|
warn
|
bool
|
If True, warn when fewer than n samples are returned after all retries. |
True
|
Returns:
| Name | Type | Description |
|---|---|---|
samples |
ndarray
|
Shape (n, target_dim). |
weights |
ndarray
|
Shape (n,). Only returned when return_weights=True. |
Source code in qmcpy/true_measure/acceptance_rejection.py
328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 | |