Skip to main content

shuttle_engine/scheduler/data/
random.rs

1use crate::scheduler::data::DataSource;
2use rand::{RngCore, SeedableRng};
3use rand_pcg::Pcg64Mcg;
4
5/// A `RandomDataSource` generates non-deterministic data from a random number generator, and
6/// arranges to re-seed that RNG on each new execution to enable deterministic replay.
7#[derive(Debug)]
8pub struct RandomDataSource {
9    rng: Pcg64Mcg,
10    next_seed: Option<u64>,
11}
12
13impl RandomDataSource {
14    fn new_from_seed(seed: u64) -> Self {
15        Self {
16            rng: Pcg64Mcg::seed_from_u64(seed),
17            next_seed: Some(seed),
18        }
19    }
20}
21
22impl DataSource for RandomDataSource {
23    type Seed = u64;
24
25    fn initialize(seed: Self::Seed) -> Self {
26        Self::new_from_seed(seed)
27    }
28
29    fn reinitialize(&mut self) -> Self::Seed {
30        let next_seed = self.next_seed.take().unwrap_or_else(|| self.rng.next_u64());
31        self.rng = Pcg64Mcg::seed_from_u64(next_seed);
32
33        next_seed
34    }
35
36    fn next_u64(&mut self) -> u64 {
37        self.rng.next_u64()
38    }
39}