shuttle_engine/scheduler/data/
random.rs1use crate::scheduler::data::DataSource;
2use rand::{RngCore, SeedableRng};
3use rand_pcg::Pcg64Mcg;
4
5#[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}