4个版本

0.2.1 2024年3月1日
0.2.0 2024年3月1日
0.1.1 2023年6月26日
0.1.0 2023年6月26日

#582 in 算法

Download history 736/week @ 2024-04-03 1111/week @ 2024-04-10 1028/week @ 2024-04-17 1059/week @ 2024-04-24 888/week @ 2024-05-01 639/week @ 2024-05-08 725/week @ 2024-05-15 813/week @ 2024-05-22 835/week @ 2024-05-29 932/week @ 2024-06-05 1663/week @ 2024-06-12 1239/week @ 2024-06-19 2207/week @ 2024-06-26 1779/week @ 2024-07-03 1286/week @ 2024-07-10 1735/week @ 2024-07-17

7,150 每月下载量
用于 7 个crate(6个直接使用)

Apache-2.0

27KB
573

sample-std

核心采样定义和策略。设计用于与sample-test一起使用。


lib.rs:

核心采样策略,以及用于从[std]和quickcheck crate中的类型上的采样器的有用实现。

该库的核心是Sample trait,它使用Random从采样Output类型生成任意值,并使用自定义的“采样策略”。它还定义了一个“缩小”生成值的程序,可用于生成简单的反例以对抗预期的属性。

该库通常与sample_test crate一起使用。请参阅该crate以获取用于在单元测试中使用采样器的宏和示例。

采样策略

最简单的Sample实现是为Range。它是一个从给定范围内均匀生成值的采样器,并尝试缩小到范围的开始。

use sample_std::{Sample, Random};

let mut s = 10..100;
let v = s.generate(&mut Random::new());
assert!(s.contains(&v));
let mut shrunk = s.shrink(v);
assert_eq!(shrunk.next(), Some(s.start));
if v > s.start {
    assert!(shrunk.next().unwrap() < v)
}

定义了大小最多为8的采样器元组,可以与Sample::try_convert一起使用,将采样器组合为较大类型的采样器。

use sample_std::{Chance, Sample, VecSampler, choice};

struct Large {
    values: Vec<usize>,
    is_blue: bool,
    name: String,
}

let sampler = (
    VecSampler { length: 0..10, el: 5..20 },
    Chance(0.5),
    choice(["cora".to_string(), "james".to_string()])
).try_convert(
    |(values, is_blue, name)| Large { values, is_blue, name },
    |large| Some((large.values, large.is_blue, large.name))
);

有关采样枚举的示例,请参阅sampler_choice

前期工作

此crate深受quickcheck的启发。它在此基础上构建,特别是在定义Arbitrary(见arbitrary)的采样器方面。这里的方法和结构体大多来自其quickcheck对应物。

它试图迭代并改进quickcheck的核心思想

  • 允许为同一类型定义多个采样策略。
  • 无需定义新的类型来表示自定义采样策略。

这种早期尝试将不同世界观结合起来的过程中仍然存在一些冗余和奇怪之处。

  • 在具有采样策略的世界中,size 的概念并非真正必要。
  • Random 结构体可能只需成为底层 rng 的类型定义。

采样“策略”的核心思想来自 proptest,它使用宏而不是组合子进行组合,并且具有更复杂的收缩功能。

依赖项

约 3.5-5MB
约 99K SLoC