pub struct Pdf { /* private fields */ }Expand description
Represents a Probability Distribution Function.
PDFs are used to indicate to schedule generators where samples should be taken.
Implementations§
Source§impl Pdf
impl Pdf
Sourcepub fn from_integral(
integral: impl Fn(f64) -> f64 + 'static + Send + Sync,
len: usize,
) -> Pdf
pub fn from_integral( integral: impl Fn(f64) -> f64 + 'static + Send + Sync, len: usize, ) -> Pdf
Create a PDF from a continuous representation.
Expects the integral of the PDF being represented. This is often called the Cumulative Distribution Function or CDF. The function will receive inputs from 0..=len. The len parameter is the length of the PDF in number of samples.
The CDF is expected to be monotonically increasing, and integral(len as f64) - integral(0.) must be one. These are the necessary conditions for a function to be a valid CDF.
It is not assumed that integral(0.) = 0..
§Example
// This represents an unweighted PDF because the integral of a constant function is linear.
// You can use the `unweighted` preset instead if you would like
let pdf = Pdf::from_integral(|v| v / 256., 256);§Panics
This function will assert that
integral(len as f64) - integral(0.) ≈ 1.with some margin for floating point error allowed;- the CDF is monotonically increasing for particular intervals; and
lenis non-zero.
Sourcepub fn from_discrete(discrete: Vec<f64>) -> Pdf
pub fn from_discrete(discrete: Vec<f64>) -> Pdf
Create a PDF from a discrete representation.
Expects a list of probabilities, one for each sample, that are all non-negative and sum to one.
§Example
let pdf = Pdf::from_discrete(vec![0.125, 0.5, 0.375]);§Panics
This function will assert that
- the sum of all of the probabilities is one, with some margin for floating point error allowed;
- all probabilities are non-negative; and
- the length of the PDF is non-zero.
Sourcepub fn get_distribution(&self) -> &[f64]
pub fn get_distribution(&self) -> &[f64]
Calculate the discrete representation of the PDF.
This method is memoized.
§Example
assert!(
unweighted(3)
.get_distribution()
.iter()
.zip([1. / 3., 1. / 3., 1. / 3.])
.all(|(l, r)| (l - r).abs() < 0.00001),
);Sourcepub fn get_integral(&self) -> &[f64]
pub fn get_integral(&self) -> &[f64]
Calculate the integral of the PDF for whole number values
The output has length self.len() + 1. The value at index 0 is guaranteed to be zero and the output at index self.len() is guaranteed to be one with a small margin for floating point error.
This method is memoized.
§Example
assert!(
Pdf::from_discrete(vec![0.3, 0.6, 0.1])
.get_integral()
.iter()
.zip([0., 0.3, 0.9, 1.])
.all(|(l, r)| (l - r).abs() < 0.00001),
);Sourcepub fn slice(&self, range: Range<usize>) -> Pdf
pub fn slice(&self, range: Range<usize>) -> Pdf
Slice a PDF to fit a certain range
The PDF will be automatically rescaled to still sum to one.
§Example
assert!(
exponential(256, 4.)
.slice(0..128)
.get_distribution()
.iter()
.zip(exponential(128, 2.)
.get_distribution()
)
.all(|(l, r)| (l - r).abs() < 0.00001),
);Sourcepub fn probabilities(&self, count: usize) -> &Probabilities
pub fn probabilities(&self, count: usize) -> &Probabilities
Calculate the probabilities of selecting each sample position under random sampling given the number of samples to select.
§Example
// With unweighted sampling and selecting 128 out of 256,
// each sample position has a 1/2 chance of being selected.
assert!(
unweighted(256)
.probabilities(128)
.iter()
.all(|v| (*v - 0.5).abs() < 0.000001)
);Note that this only gives a very good approximation because the true value is (as of now) computationally infeasible to find.
This method is memoized.
Sourcepub fn sample_pdf<R: Rng + ?Sized>(&self, rng: &mut R) -> usize
pub fn sample_pdf<R: Rng + ?Sized>(&self, rng: &mut R) -> usize
Sample the PDF using the given Rng
Returns the zero-based index of the position that was sampled.
Sourcepub fn continuous_integral<'a>(&'a self) -> Rc<dyn Fn(f64) -> f64 + 'a>
pub fn continuous_integral<'a>(&'a self) -> Rc<dyn Fn(f64) -> f64 + 'a>
Return a continuous representation of the integral of the PDF. Applying 0. to the returned function will return 0..
This function is implemented for discretely represented PDFs by interpolating self.get_integral() using Catmull-Rom to give a once-differentiable interpolation.
§Example
let pdf = qsin(256, QSinBias::Low, PI);
let integral = pdf.continuous_integral();
assert_eq!(integral(0.), 0.);
assert_eq!(integral(256.), 1.);
let c = FRAC_PI_2 - 1.;
assert_eq!(integral(128.), (FRAC_PI_4 + FRAC_PI_4.cos()) / c - 1. / c);§Panics
The function returned will panic if it is called with values outside of the range of the PDF.
Trait Implementations§
Auto Trait Implementations§
impl !Freeze for Pdf
impl !RefUnwindSafe for Pdf
impl Send for Pdf
impl Sync for Pdf
impl Unpin for Pdf
impl !UnwindSafe for Pdf
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<D> OwoColorize for D
impl<D> OwoColorize for D
Source§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
Source§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
Source§fn black(&self) -> FgColorDisplay<'_, Black, Self>
fn black(&self) -> FgColorDisplay<'_, Black, Self>
Source§fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
Source§fn red(&self) -> FgColorDisplay<'_, Red, Self>
fn red(&self) -> FgColorDisplay<'_, Red, Self>
Source§fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
Source§fn green(&self) -> FgColorDisplay<'_, Green, Self>
fn green(&self) -> FgColorDisplay<'_, Green, Self>
Source§fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
Source§fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
Source§fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
Source§fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
Source§fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
Source§fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
Source§fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
Source§fn white(&self) -> FgColorDisplay<'_, White, Self>
fn white(&self) -> FgColorDisplay<'_, White, Self>
Source§fn on_white(&self) -> BgColorDisplay<'_, White, Self>
fn on_white(&self) -> BgColorDisplay<'_, White, Self>
Source§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
Source§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
Source§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
Source§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
Source§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
Source§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
Source§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
Source§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
Source§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
Source§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
Source§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
Source§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
Source§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
Source§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
Source§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
Source§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
Source§fn bold(&self) -> BoldDisplay<'_, Self>
fn bold(&self) -> BoldDisplay<'_, Self>
Source§fn dimmed(&self) -> DimDisplay<'_, Self>
fn dimmed(&self) -> DimDisplay<'_, Self>
Source§fn italic(&self) -> ItalicDisplay<'_, Self>
fn italic(&self) -> ItalicDisplay<'_, Self>
Source§fn underline(&self) -> UnderlineDisplay<'_, Self>
fn underline(&self) -> UnderlineDisplay<'_, Self>
Source§fn blink(&self) -> BlinkDisplay<'_, Self>
fn blink(&self) -> BlinkDisplay<'_, Self>
Source§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
Source§fn reversed(&self) -> ReversedDisplay<'_, Self>
fn reversed(&self) -> ReversedDisplay<'_, Self>
Source§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
Source§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg or
a color-specific method, such as OwoColorize::green, Read moreSource§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg or
a color-specific method, such as OwoColorize::on_yellow, Read more