Add uniformity test for unit sphere and circle
This introduces an external dev-dependency on the `average` crate.
This commit is contained in:
committed by
Diggory Hardy
parent
96f43ed79c
commit
c4cbb558fd
@@ -55,6 +55,10 @@ fuchsia-zircon = { version = "0.3.2", optional = true }
|
||||
stdweb = { version = "0.4", optional = true }
|
||||
wasm-bindgen = { version = "0.2.12", optional = true }
|
||||
|
||||
[dev-dependencies]
|
||||
# This has a histogram implementation used for testing uniformity.
|
||||
average = "0.9.2"
|
||||
|
||||
[build-dependencies]
|
||||
rustc_version = "0.2"
|
||||
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
#![cfg(feature = "std")]
|
||||
|
||||
#[macro_use]
|
||||
extern crate average;
|
||||
extern crate rand;
|
||||
|
||||
use std as core;
|
||||
use rand::FromEntropy;
|
||||
use rand::distributions::Distribution;
|
||||
use average::Histogram;
|
||||
|
||||
const N_BINS: usize = 100;
|
||||
const N_SAMPLES: u32 = 1_000_000;
|
||||
const TOL: f64 = 1e-3;
|
||||
define_histogram!(hist, 100);
|
||||
use hist::Histogram as Histogram100;
|
||||
|
||||
#[test]
|
||||
fn unit_sphere() {
|
||||
const N_DIM: usize = 3;
|
||||
let h = Histogram100::with_const_width(-1., 1.);
|
||||
let mut histograms = [h.clone(), h.clone(), h];
|
||||
let dist = rand::distributions::UnitSphereSurface::new();
|
||||
let mut rng = rand::rngs::SmallRng::from_entropy();
|
||||
for _ in 0..N_SAMPLES {
|
||||
let v = dist.sample(&mut rng);
|
||||
for i in 0..N_DIM {
|
||||
histograms[i].add(v[i]).map_err(
|
||||
|e| { println!("v: {}", v[i]); e }
|
||||
).unwrap();
|
||||
}
|
||||
}
|
||||
for h in &histograms {
|
||||
let sum: u64 = h.bins().iter().sum();
|
||||
println!("{:?}", h);
|
||||
for &b in h.bins() {
|
||||
let p = (b as f64) / (sum as f64);
|
||||
assert!((p - 1.0 / (N_BINS as f64)).abs() < TOL, "{}", p);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn unit_circle() {
|
||||
use ::std::f64::consts::PI;
|
||||
let mut h = Histogram100::with_const_width(-PI, PI);
|
||||
let dist = rand::distributions::UnitCircle::new();
|
||||
let mut rng = rand::rngs::SmallRng::from_entropy();
|
||||
for _ in 0..N_SAMPLES {
|
||||
let v = dist.sample(&mut rng);
|
||||
h.add(v[0].atan2(v[1])).unwrap();
|
||||
}
|
||||
let sum: u64 = h.bins().iter().sum();
|
||||
println!("{:?}", h);
|
||||
for &b in h.bins() {
|
||||
let p = (b as f64) / (sum as f64);
|
||||
assert!((p - 1.0 / (N_BINS as f64)).abs() < TOL, "{}", p);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user