From 675367328a63bde8fcb80fd8b5b895907318b03a Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 24 Feb 2023 09:55:59 -0500 Subject: [PATCH] =?UTF-8?q?Poisson=20distribution=20falls=20into=20an=20in?= =?UTF-8?q?finite=20loop=20for=20parameter=20=CE=BB=3D=E2=88=9E=20(#1290)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rand_distr/CHANGELOG.md | 1 + rand_distr/src/poisson.rs | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/rand_distr/CHANGELOG.md b/rand_distr/CHANGELOG.md index 50cd913b21..d1da24a5a7 100644 --- a/rand_distr/CHANGELOG.md +++ b/rand_distr/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 This breaks serialization compatibility with older versions. - Upgrade Rand - Fix Knuth's method so `Poisson` doesn't return -1.0 for small lambda +- Fix `Poisson` distribution instantiation so it return an error if lambda is infinite ## [0.4.3] - 2021-12-30 - Fix `no_std` build (#1208) diff --git a/rand_distr/src/poisson.rs b/rand_distr/src/poisson.rs index b0b3d15a8a..b6ced49093 100644 --- a/rand_distr/src/poisson.rs +++ b/rand_distr/src/poisson.rs @@ -46,12 +46,15 @@ where F: Float + FloatConst, Standard: Distribution pub enum Error { /// `lambda <= 0` or `nan`. ShapeTooSmall, + /// `lambda == +∞` + ParameterInfinite, } impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.write_str(match self { Error::ShapeTooSmall => "lambda is not positive in Poisson distribution", + Error::ParameterInfinite => "lambda is infinite in Poisson distribution", }) } } @@ -69,6 +72,9 @@ where F: Float + FloatConst, Standard: Distribution if !(lambda > F::zero()) { return Err(Error::ShapeTooSmall); } + if lambda.is_infinite() { + return Err(Error::ParameterInfinite); + } let log_lambda = lambda.ln(); Ok(Poisson { lambda, @@ -163,7 +169,7 @@ mod test { fn test_poisson_avg() { test_poisson_avg_gen::(10.0, 0.1); test_poisson_avg_gen::(15.0, 0.1); - + test_poisson_avg_gen::(10.0, 0.1); test_poisson_avg_gen::(15.0, 0.1); @@ -178,6 +184,12 @@ mod test { Poisson::new(0.0).unwrap(); } + #[test] + #[should_panic] + fn test_poisson_invalid_lambda_infinity() { + Poisson::new(f64::INFINITY).unwrap(); + } + #[test] #[should_panic] fn test_poisson_invalid_lambda_neg() { @@ -188,4 +200,4 @@ mod test { fn poisson_distributions_can_be_compared() { assert_eq!(Poisson::new(1.0), Poisson::new(1.0)); } -} \ No newline at end of file +}