-
-
Notifications
You must be signed in to change notification settings - Fork 436
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Implement Pareto distribution #495
Changes from 2 commits
4f30a51
d06553f
f79146a
99816b7
bd7d579
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT | ||
// file at the top-level directory of this distribution and at | ||
// https://rust-lang.org/COPYRIGHT. | ||
// | ||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | ||
// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license | ||
// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your | ||
// option. This file may not be copied, modified, or distributed | ||
// except according to those terms. | ||
|
||
//! The Pareto distribution. | ||
|
||
use Rng; | ||
use distributions::{Distribution, OpenClosed01}; | ||
|
||
/// Samples floating-point numbers according to the Pareto distribution | ||
/// | ||
/// # Example | ||
/// ``` | ||
/// use rand::prelude::*; | ||
/// use rand::distributions::Pareto; | ||
/// | ||
/// let val: f64 = SmallRng::from_entropy().sample(Pareto::new(1., 2.)); | ||
/// println!("{}", val); | ||
/// ``` | ||
#[derive(Clone, Copy, Debug)] | ||
pub struct Pareto { | ||
scale: f64, | ||
shape: f64, | ||
} | ||
|
||
impl Pareto { | ||
/// Construct a new Pareto distribution with given `scale` and `shape`. | ||
/// | ||
/// # Panics | ||
/// | ||
/// `scale` and `shape` have to be non-zero and positive. | ||
pub fn new(scale: f64, shape: f64) -> Pareto { | ||
assert!((scale > 0.) & (shape > 0.)); | ||
Pareto { scale, shape } | ||
} | ||
} | ||
|
||
impl Distribution<f64> for Pareto { | ||
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> f64 { | ||
let u: f64 = rng.sample(OpenClosed01); | ||
self.scale * u.powf(-1.0 / self.shape) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It should be equivalent to store There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Good point! Done. |
||
} | ||
} | ||
|
||
#[cfg(test)] | ||
mod tests { | ||
use distributions::Distribution; | ||
use super::Pareto; | ||
|
||
#[test] | ||
#[should_panic] | ||
fn invalid() { | ||
Pareto::new(0., 0.); | ||
} | ||
|
||
#[test] | ||
fn sample() { | ||
let d = Pareto::new(1.0, 2.0); | ||
let mut rng = ::test::rng(1); | ||
for _ in 0..1000 { | ||
d.sample(&mut rng); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In theory the sample must never be less than the shape parameter, so you should either test this or give some small allowance for rounding (but hopefully this isn't necessary). There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I assume you meant the scale parameter? Done. |
||
} | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
May be worth mentioning common variable names such as
k
,x_m
andα
.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I agree and added those to the docs.