From 09656bfd7ba9cb6c85b44a1f6a306dd918c8f78c Mon Sep 17 00:00:00 2001 From: Simon Vervisch <44346751+SimonVervisch@users.noreply.github.com> Date: Sat, 11 Jan 2025 15:38:20 +0100 Subject: [PATCH 1/2] basic initial version of brownian motion --- Cargo.toml | 2 ++ src/brownian.rs | 41 +++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + 3 files changed, 44 insertions(+) create mode 100644 src/brownian.rs 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..8049539 --- /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::{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; From 1a98881ae62e7daaea7524c13973b01b68fc4f2d Mon Sep 17 00:00:00 2001 From: Simon Vervisch <44346751+SimonVervisch@users.noreply.github.com> Date: Sat, 11 Jan 2025 15:47:05 +0100 Subject: [PATCH 2/2] include brownian motion --- src/brownian.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/brownian.rs b/src/brownian.rs index 8049539..dd7230f 100644 --- a/src/brownian.rs +++ b/src/brownian.rs @@ -27,7 +27,7 @@ where } mod tests { - use crate::{Dimensional, LinearArrayStorage}; + use crate::{brownian::brownian_motion, Dimensional, LinearArrayStorage}; #[test]