Skip to main content

use_simulation/
lib.rs

1#![forbid(unsafe_code)]
2//! Thin facade for the `use-simulation` workspace.
3//!
4//! The crate reexports the focused simulation crates directly so consumers can
5//! opt into one dependency while still using the smaller APIs.
6//!
7//! # Examples
8//!
9//! ```rust
10//! use use_simulation::*;
11//!
12//! let seed = SimulationSeed::new(5);
13//! let path = random_walk(RandomWalkConfig {
14//!     start: 0.0,
15//!     step_size: 1.0,
16//!     steps: 3,
17//!     seed,
18//! })
19//! .unwrap();
20//! let result = summarize(&path).unwrap();
21//! let mut clock = SimulationClock::new(0.5).unwrap();
22//!
23//! assert_eq!(clock.advance().unwrap(), 0.5);
24//! assert_eq!(result.steps, 3);
25//! assert_eq!(step_state(1.0, 0.5, 0).unwrap().next_state, 1.5);
26//! ```
27
28pub use use_event_simulation;
29pub use use_event_simulation::*;
30pub use use_monte_carlo;
31pub use use_monte_carlo::*;
32pub use use_random_walk;
33pub use use_random_walk::*;
34pub use use_seed;
35pub use use_seed::*;
36pub use use_simulation_clock;
37pub use use_simulation_clock::*;
38pub use use_simulation_result;
39pub use use_simulation_result::*;
40pub use use_state_step;
41pub use use_state_step::*;
42
43#[cfg(test)]
44mod tests {
45    use super::{
46        RandomWalkConfig, SimulationClock, SimulationEvent, SimulationSeed, monte_carlo_mean,
47        random_walk, run_event_simulation, step_state, summarize,
48    };
49
50    #[test]
51    fn facade_reexports_workspace_apis() {
52        let seed = SimulationSeed::new(3);
53        let branches = seed.split(2).unwrap();
54        assert_eq!(branches.len(), 2);
55
56        let path = random_walk(RandomWalkConfig {
57            start: 0.0,
58            step_size: 1.0,
59            steps: 4,
60            seed,
61        })
62        .unwrap();
63        let result = summarize(&path).unwrap();
64        assert_eq!(result.steps, 4);
65
66        let estimate = monte_carlo_mean(seed, 4, |sample| sample).unwrap();
67        assert_eq!(estimate.samples, 4);
68
69        let states = run_event_simulation(
70            0.0,
71            &[
72                SimulationEvent::new(1.0, 2.0).unwrap(),
73                SimulationEvent::new(2.0, -1.0).unwrap(),
74            ],
75        )
76        .unwrap();
77        assert_eq!(states.len(), 3);
78
79        let mut clock = SimulationClock::new(1.0).unwrap();
80        assert_eq!(clock.advance().unwrap(), 1.0);
81        assert_eq!(step_state(1.0, 2.0, 0).unwrap().next_state, 3.0);
82    }
83}