6 个版本 (重大变更)
0.5.0 | 2023 年 7 月 5 日 |
---|---|
0.4.0 | 2022 年 7 月 17 日 |
0.3.1 | 2021 年 5 月 16 日 |
0.2.0 | 2021 年 5 月 12 日 |
0.1.0 | 2021 年 5 月 11 日 |
#320 在 算法 中
每月 59 次下载
在 3 crates 中使用
43KB
708 行
Sobol-Burley
基于 Brent Burley 的论文 实用哈希基础 Owen 混洗 的可播种 Owen 混洗 Sobol 序列,但使用了改进的哈希(来自 构建更好的 LK 哈希)和更多维度(由于 Kuo 等)。
此 crate 针对实用图形应用程序,因此存在一些限制
- 最大序列长度为 2^16。
- 最大维度数为 256(尽管可以通过播种来解决这个问题)。
- 仅支持
f32
输出。
这些都是为了更好的性能和更小的内存占用所做的权衡。
将此 crate 扩展为更适合更广泛的范围的应用是未来的一个尝试性目标。然而,图形应用程序的效率执行始终是首要任务。
基本用法
基本用法相当简单
use sobol_burley::sample;
// Print 1024 3-dimensional points.
for i in 0..1024 {
let x = sample(i, 0, 0);
let y = sample(i, 1, 0);
let z = sample(i, 2, 0);
println!("({}, {}, {})", x, y, z);
}
sample()
的第一个参数是你想要的样本索引,第二个参数是你想要的维度索引。参数是零索引的,输出在区间 [0, 1) 内。
如果你只需要一个 Owen 混洗 Sobol 序列,那么这就足够了。对于更高级的使用,请参阅 crate 文档。
为什么是 Owen 混洗 Sobol?
其他资源可以更合适、更深入地解释这一点,包括上述链接的 Brent Burley 的论文。但这里只给出简短版本,以便给出一些直观感受
如果你使用随机点,你会得到这个
如果你使用普通的 Sobol,你会得到这个
但是如果你使用 Owen 混洗 Sobol,你会得到这个
随机点具有不均匀的分布,而普通的 Sobol 显示出强大的结构,可能导致偏差和伪影。但 Owen 混洗 Sobol 在某种程度上得到了两者的最佳:Sobol 的均匀分布,但随机化以最小化结构。
不安全代码
此 crate 使用不安全代码进行 SIMD 加速。对于 100% 安全的代码,您可以通过启用 simd
特性标志(默认启用)来禁用 SIMD 支持。
许可
此项目中的主要代码根据以下任一许可授权:
- 麻省理工学院许可证(licenses/MIT.txt 或 http://opensource.org/licenses/MIT)
- Apache许可证,版本2.0,(licenses/APACHE-2.0.txt 或 http://www.apache.org/licenses/LICENSE-2.0)
由您自行选择。
位于 direction_numbers/
下的Sobol方向数以及 build.rs
中的一些代码(通过注释进行标识)是改编自Stephen Joe和Frances Y. Kuo的工作,并受3条款BSD许可证的保护。有关详细信息,请参阅 licenses/JOE_KUO.txt
。
贡献
贡献绝对受欢迎!请注意,这个crate旨在成为
- 无std和无分配。使用分配等功能的PR很可能被拒绝。
- 尽可能小,包括传递性依赖项。除非它们真的举足轻重,否则引入依赖项的PR(尤其是深度依赖树)很可能会被拒绝。
除非您明确表示,否则您提交给本项目包含的任何有意贡献都将根据上述许可证(MIT/Apache双重许可证)授权,不附加任何其他条款或条件。