diff --git a/Cargo.toml b/Cargo.toml index dfca7ae..d4a5a96 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,8 @@ edition = "2021" [dependencies] num-traits = "0.2.19" +rand_distr = "0.4" +rand="0.8" [lib] diff --git a/src/brownian.rs b/src/brownian.rs new file mode 100644 index 0000000..dd7230f --- /dev/null +++ b/src/brownian.rs @@ -0,0 +1,41 @@ +use num_traits::Num; +use rand_distr::{Normal, Distribution}; +use crate::{storage::DimensionalStorage, Dimensional}; +use std::ops::AddAssign; + +// TODO: make it work for all types (now works only for floating types) +// TODO: have the option to save the path of the walk (although may be costly) + + +fn brownian_motion(dimensional: &mut Dimensional, std_dev: f64, n_steps: usize) +where + T: Num + Copy + AddAssign , + f64: Into, + S: DimensionalStorage, +{ + let normal = Normal::new(0.0, std_dev).unwrap(); + let length_dimensional = dimensional.len(); + let mut iter = dimensional.iter_mut(); + for _ in 1..=length_dimensional { + if let Some(elem) = iter.next() { + for _ in 0..n_steps{ + *elem += normal.sample(&mut rand::thread_rng()).into(); + } + } + } + +} + +mod tests { + use crate::{brownian::brownian_motion, Dimensional, LinearArrayStorage}; + + + #[test] + fn test_len() { + let mut zeros: Dimensional, 2> = Dimensional::zeros([2, 3]); + brownian_motion(&mut zeros,0.1, 1000); + println!("{}", format!("{}", zeros)); + + } + +} diff --git a/src/lib.rs b/src/lib.rs index b148a2c..b4fd809 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -50,6 +50,7 @@ mod display; mod iterators; mod operators; mod storage; +mod brownian; // Public API pub use crate::core::Dimensional;