spawn_stochastic/
bridge.rs1use rand::rngs::OsRng;
2use rand::Rng;
3
4pub struct BrownianBridge {
6 pub alpha: f64,
7 pub beta: f64,
8 pub sigma: f64,
9 pub n_paths: usize,
10 pub n_steps: usize,
11 pub t_end: f64,
12}
13
14impl BrownianBridge {
15 pub fn new(alpha: f64, beta: f64, sigma: f64, n_paths: usize, n_steps: usize, t_end: f64) -> Self {
17 Self { alpha, beta, sigma, n_paths, n_steps, t_end }
18 }
19
20 pub fn simulate(&self) -> Vec<Vec<f64>> {
22 let dt = self.t_end / self.n_steps as f64;
23 let mut rng = OsRng;
24 let mut paths = vec![vec![self.alpha; self.n_steps + 1]; self.n_paths];
25
26 for i in 0..self.n_paths {
27 for j in 1..self.n_steps {
28 let d_w = rng.gen::<f64>() * dt.sqrt();
29 if let Some(prev) = paths[i].get(j - 1) {
30 paths[i][j] = prev + (self.beta - prev) / (self.n_steps - j + 1) as f64 + self.sigma * d_w;
31 }
32 }
33 paths[i][self.n_steps] = self.beta; }
35
36 paths
37 }
38}