torch.quasirandom 的源代码
# mypy: 允许未类型化定义
from 打字
导入
可选
导入
火炬
[文档]
类
Sobol 引擎:
r""
The :class:`torch.quasirandom.SobolEngine` 是一个用于生成
随机化 Sobol 序列。Sobol 序列是低维随机化序列的一个例子。
差异准随机序列。
这个 Sobol 序列引擎的实现能够
采样序列最多达到 21201 维。它使用方向
从 https://web.maths.unsw.edu.au/~fkuo/sobol/获取的数字
搜索条件 D(6)至维度 21201。这是推荐
作者的选择。
参考文献:
艺术家 B.欧文。Sobol 和 Niederreiter-Xing 点的打乱
《复杂性杂志》,第 14 卷第 4 期,第 466-489 页,1998 年 12 月
I. M. Sobol. 立方体内点的分布和积分的精确评估
评估
中. 数值计算与数学物理,7:784-802,1967.
参数:
维度(Int):要抽取的序列的维度
打乱(bool,可选):将此设置为 ``True`` 将生成
打乱的 Sobol 序列。打乱是
能够生成更好的 Sobol
序列。默认:``False``。
种子(Int,可选):这是打乱顺序的种子。种子
随机数生成器的设置为此
如果指定,则使用随机种子。否则,使用随机种子。
默认:`None`
示例:
>>> # xdoctest: +SKIP("未设置随机状态")
>>> soboleng = torch.quasirandom.SobolEngine(dimension=5)
>>> soboleng.draw(3)
tensor([[0.0000, 0.0000, 0.0000, 0.0000, 0.0000],
[0.5000, 0.5000, 0.5000, 0.5000, 0.5000],
[0.7500, 0.2500, 0.2500, 0.2500, 0.7500]])
"""
MAXBIT = 30
MAXDIM = 21201
定义 __init__(self,
维度,
打乱=False,
种子=
无):
如果
尺度 > self.
MAX 尺度
或者
尺度 < 1:
抛出
值错误(
"支持的维度范围"
f"for SobolEngine is [1, "{self.MAXDIM}]"
)
self.种子 =
种子
self.混乱 =
混乱
self.维度 =
维度
cpu = 火炬.
设备("cpu")
self.蒙特卡洛状态 =
火炬.
零值(
维度, self.
最大比特数,
设备=cpu,
数据类型=
火炬.
长的
)
火炬.
_sobol 引擎初始化状态_(self.
sobol 状态, self.
维度)
如果 not self.
打乱:
self.转换 =
火炬.
零值(self.
维度,
设备=cpu,
数据类型=
火炬.
长)
否则:
self.混乱()
self.准似 = self.
转移.
克隆(
内存格式=
火炬.
连续格式)
self._第一个要点 = (self.
几乎 / 2**self.MAXBIT).
重塑(1, -1)
self.已生成数量 = 0
[文档]
定义
绘制(
self,
n: 整型 = 1,
出:
可选[
火炬.
张量] =
无,
数据类型:
可选[
火炬.
数据类型] =
无,
) -> 火炬.
张量:
r""
函数用于从 Sobol 序列中绘制一个由:attr:`n`个点组成的序列。
请注意,样本依赖于前面的样本。大小
结果为:(n, 维度)。
参数:
n(Int,可选):绘制点序列的长度。
默认:1
输出(张量,可选):输出张量
dtype(:class:`torch.dtype`,可选):返回张量的期望数据类型
。
默认值:``None``
"""
如果 dtype
是
无:
dtype = 火炬.
获取默认数据类型()
如果 self.
生成数量 == 0:
如果 n == 1:
结果 = self.
_第一个点.
到(
数据类型)
否则:
结果, self.
准似 =
火炬.
_索布尔引擎绘图(
self.准似,
n - 1,
self.索布尔状态,
self.尺度,
self.生成的数量,
数据类型=
数据类型,
)
结果 =
火炬.
猫((self.
第一个点.
到(
数据类型),
结果),
维度=-2)
否则:
结果, self.
准似 =
火炬.
_Sobol_引擎绘制(
self.准似,
n,
self.Sobol 状态,
self.维度,
self.生成数量 - 1,
数据类型=
数据类型,
)
self.生成数量 += n
如果
外部
是 not
无:
出.
调整大小为_(
结果).
复制_(
结果)
返回
外部
返回
结果
[文档] def 绘制基础 2(
self,
m: 整数类型,
out: Optional[torch.Tensor] = None,
dtype: Optional[torch.dtype] = None,
) -> torch.Tensor:
r"""
绘制从 Sobol 序列中生成的 :attr:`2**m` 个点的序列的函数。
注意,样本依赖于前面的样本。结果的大小为 :math:`(2**m, dimension)`。
结果的大小为 :math:`(2**m, dimension)`。
Args:
m (Int): 要绘制的点数的(二进制)指数。
out (Tensor, optional): 输出张量
dtype (:class:`torch.dtype`, optional): 所需的数据类型
返回张量。
默认:无
```python
# 输入文本
input_text = '"""'
# 翻译函数(此处为示例,实际翻译功能需调用真实的翻译 API)
def translate_to_simplified_chinese(text):
# 假设的翻译结果
return text
# 输出翻译结果
translated_text = translate_to_simplified_chinese(input_text)
print(translated_text)
```
n = 2 的 m 次方
total_n = self.num_generated + n
if not (total_n & (total_n - 1) == 0):
raise ValueError(
"Sobol'点的平衡性质要求"
n 要成为 2 的幂。已经生成了{self.num_generated}个点。
如果之前已经生成,那么:n={self.num_generated}+2**{m}={total_n}。
"如果您仍然想这样做,请使用"
"'SobolEngine.draw()'代替。"
)
return self.draw(n=n, out=out, dtype=dtype)
[文档] def reset(self):
r"""
重置 ``SobolEngine`` 到基本状态的函数。
""
self.quasi.copy_(self.shift)
self.num_generated = 0
返回自身
[文档] def fast_forward(self, n):
r"""
快速前进 `SobolEngine` 状态的函数
attr:`n` 步骤。这相当于绘制 :attr:`n` 个样本
不使用样本。
Args:
n (Int): 快进步数的数量。
"""
如果 self.num_generated 等于 0:
torch._sobol_engine_ff_(
self.quasi, n - 1, self.sobolstate, self.dimension, self.num_generated
)
else:
torch._sobol_engine_ff_(
self.quasi, n, self.sobolstate, self.dimension, self.num_generated - 1
)
self.num_generated += n
return self
定义 _scramble(self):
g: 可选[
火炬.
生成器] =
无
如果 self.
种子
是 not
无:
g = 火炬.
生成器()
g.手动播种(self.
种子)
cpu = 火炬.
设备("cpu")
生成平移向量
平移整数 =
火炬.randint(
2, (self.尺度, self.MAXBIT),
设备=cpu,
生成器=g
)
self.移位 =
火炬.mv(
shift_ints, 火炬.pow(2,
火炬.arange(0, self.MAXBIT,
设备=cpu))
)
生成下三角矩阵(沿维度堆叠)
ltm_dims = (self.维度, self.MAXBIT, self.MAXBIT)
ltm = 火炬.randint(2,
长度维度,
设备=cpu,
生成器=g).
三角()
火炬.
_Sobol_引擎_打乱_(self.
随机状态, ltm, self.
维度)
定义 __repr__(self):
格式化字符串 = [f
"维度="{self.
维度}"]
如果 self.
打乱:
格式化字符串 += [
scramble=True]
如果 self.
种子
是 not
无:
格式化字符串 += [f
seed={self.
种子}"]
返回 self.
类.__name__ +
“(” +
“,”.
连接(
格式化字符串) +
“)”