diff --git a/forrustts-core/Cargo.toml b/forrustts-core/Cargo.toml index 0301a838..f27c00a4 100644 --- a/forrustts-core/Cargo.toml +++ b/forrustts-core/Cargo.toml @@ -14,7 +14,7 @@ keywords = ["simulation", "tree_sequences", "tskit", "population_genetics"] [dependencies] thiserror = "1.0" # NOTE: automagically adds rand as a cargo feature -rand = { version = "0.8.5", optional = true } +rand = { version = "0.9.0", optional = true } [dev-dependencies] proptest = "1.1.0" diff --git a/forrustts-core/src/rand_position.rs b/forrustts-core/src/rand_position.rs index 33644ed3..f0b13925 100644 --- a/forrustts-core/src/rand_position.rs +++ b/forrustts-core/src/rand_position.rs @@ -1,4 +1,4 @@ -use rand::distributions::uniform::{SampleBorrow, SampleUniform, UniformInt, UniformSampler}; +use rand::distr::uniform::{SampleBorrow, SampleUniform, UniformInt, UniformSampler}; use rand::prelude::Rng; use crate::Position; @@ -9,25 +9,25 @@ pub struct UniformPos(UniformInt); impl UniformSampler for UniformPos { type X = Position; - fn new(low: B1, high: B2) -> Self + fn new(low: B1, high: B2) -> Result where B1: SampleBorrow + Sized, B2: SampleBorrow + Sized, { - UniformPos(UniformInt::::new( + Ok(UniformPos(UniformInt::::new( i64::from(*low.borrow()), i64::from(*high.borrow()), - )) + )?)) } - fn new_inclusive(low: B1, high: B2) -> Self + fn new_inclusive(low: B1, high: B2) -> Result where B1: SampleBorrow + Sized, B2: SampleBorrow + Sized, { - UniformPos(UniformInt::::new_inclusive( + Ok(UniformPos(UniformInt::::new_inclusive( i64::from(*low.borrow()), i64::from(*high.borrow()), - )) + )?)) } fn sample(&self, rng: &mut R) -> Self::X { Position::new_valid(self.0.sample(rng)) diff --git a/forrustts-core/tests/tests.rs b/forrustts-core/tests/tests.rs index e017d0dc..3296f212 100644 --- a/forrustts-core/tests/tests.rs +++ b/forrustts-core/tests/tests.rs @@ -2,6 +2,7 @@ mod test_rand_traits { use forrustts_core::Position; use proptest::prelude::*; + use rand::Rng; use rand::SeedableRng; proptest! { @@ -11,7 +12,7 @@ mod test_rand_traits { if a != b { // else rand will panic let lo = Position::new_valid(std::cmp::min(a, b)); let hi = Position::new_valid(std::cmp::max(a, b)); - let upos = rand::distributions::Uniform::::new(lo, hi); + let upos = rand::distr::Uniform::::new(lo, hi).unwrap(); let mut rng = rand::rngs::StdRng::seed_from_u64(seed); for _ in 0..100 { let _ = rng.sample(upos); @@ -27,7 +28,7 @@ mod test_rand_traits { if a != b { // else rand will panic let lo = Position::new_valid(std::cmp::min(a, b)); let hi = Position::new_valid(std::cmp::max(a, b)); - let upos = rand::distributions::Uniform::::new_inclusive(lo, hi); + let upos = rand::distr::Uniform::::new_inclusive(lo, hi).unwrap(); let mut rng = rand::rngs::StdRng::seed_from_u64(seed); for _ in 0..100 { let _ = rng.sample(upos); diff --git a/forrustts-genetics/Cargo.toml b/forrustts-genetics/Cargo.toml index eae9de75..3c658fe3 100644 --- a/forrustts-genetics/Cargo.toml +++ b/forrustts-genetics/Cargo.toml @@ -13,5 +13,5 @@ keywords = ["simulation", "tree_sequences", "tskit", "population_genetics"] [dependencies] forrustts-core = { version = "0.1.0", path = "../forrustts-core", features = ["rand"]} -rand = "0.8.5" -rand_distr = "0.4.3" +rand = "0.9.0" +rand_distr = "0.5.0" diff --git a/forrustts-genetics/src/genetic_maps.rs b/forrustts-genetics/src/genetic_maps.rs index f5aaf9ee..9103023b 100644 --- a/forrustts-genetics/src/genetic_maps.rs +++ b/forrustts-genetics/src/genetic_maps.rs @@ -238,7 +238,7 @@ impl GeneticMapBuilder { #[derive(Debug)] struct PoissonRegions { regions: Vec>, - lookup: rand_distr::WeightedAliasIndex, + lookup: rand_distr::weighted::WeightedAliasIndex, poisson: rand_distr::Poisson, } @@ -250,13 +250,13 @@ impl PoissonRegions { for p in poisson { let mean = p.mean(); if mean > 0.0 { - let u = rand_distr::Uniform::new(p.left(), p.right()); + let u = rand_distr::Uniform::new(p.left(), p.right()).ok()?; regions.push(u); weights.push(mean); sum_poisson_means += mean; } } - let lookup = rand_distr::WeightedAliasIndex::new(weights).ok()?; + let lookup = rand_distr::weighted::WeightedAliasIndex::new(weights).ok()?; let poisson = rand_distr::Poisson::new(sum_poisson_means).ok()?; Some(Self { regions, @@ -285,7 +285,7 @@ impl BernoulliRegions { for b in binomial { let prob = b.probability(); if prob > 0.0 { - let u = rand_distr::Uniform::new(b.left(), b.right()); + let u = rand_distr::Uniform::new(b.left(), b.right()).ok()?; regions.push(u); let dist = rand_distr::Bernoulli::new(prob).ok()?; probabilities.push(dist); @@ -357,7 +357,7 @@ impl GenerateBreakpoints for GeneticMap { } } } - let uint = rand_distr::Uniform::new(0., 1.); + let uint = rand_distr::Uniform::new(0., 1.).unwrap(); for i in self.independent_assortment.iter() { if rng.sample(uint) < 0.5 { self.breakpoints.push(i.at());