// Copyright © 2024 Mikhail Hogrefe
//
// This file is part of Malachite.
//
// Malachite is free software: you can redistribute it and/or modify it under the terms of the GNU
// Lesser General Public License (LGPL) as published by the Free Software Foundation; either version
// 3 of the License, or (at your option) any later version. See .
use malachite_base::num::basic::unsigneds::PrimitiveUnsigned;
use malachite_base::num::float::NiceFloat;
use malachite_base::num::random::geometric::geometric_random_positive_unsigneds;
use malachite_base::random::EXAMPLE_SEED;
use malachite_base::test_util::stats::moments::{
truncated_geometric_dist_assertions, CheckedToF64, MomentStats,
};
use std::panic::catch_unwind;
fn geometric_random_positive_unsigneds_helper(
um_numerator: u64,
um_denominator: u64,
expected_values: &[T],
expected_common_values: &[(T, usize)],
expected_pop_median: (T, Option),
expected_sample_median: (T, Option),
expected_pop_moment_stats: MomentStats,
expected_sample_moment_stats: MomentStats,
) {
truncated_geometric_dist_assertions(
geometric_random_positive_unsigneds::(EXAMPLE_SEED, um_numerator, um_denominator),
T::ONE,
T::MAX,
um_numerator,
um_denominator,
expected_values,
expected_common_values,
expected_pop_median,
expected_sample_median,
expected_pop_moment_stats,
expected_sample_moment_stats,
);
}
#[test]
fn test_geometric_random_positive_unsigneds() {
// u64, um = 65 / 64
let values = &[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2];
let common_values = &[(1, 984537), (2, 15210), (3, 253)];
let pop_median = (1, None);
let sample_median = (1, None);
let pop_moment_stats = MomentStats {
mean: NiceFloat(1.015625),
standard_deviation: NiceFloat(0.12597277731716458),
skewness: NiceFloat(8.186292482887549),
excess_kurtosis: NiceFloat(69.01538461538773),
};
let sample_moment_stats = MomentStats {
mean: NiceFloat(1.0157160000000027),
standard_deviation: NiceFloat(0.12639233884624257),
skewness: NiceFloat(8.160460378454992),
excess_kurtosis: NiceFloat(68.31033619043166),
};
geometric_random_positive_unsigneds_helper::(
65,
64,
values,
common_values,
pop_median,
sample_median,
pop_moment_stats,
sample_moment_stats,
);
// u64, um = 12345/10000
let values = &[1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1];
let common_values = &[
(1, 809395),
(2, 154707),
(3, 29037),
(4, 5577),
(5, 1053),
(6, 185),
(7, 40),
(8, 5),
(9, 1),
];
let pop_median = (1, None);
let sample_median = (1, None);
let pop_moment_stats = MomentStats {
mean: NiceFloat(1.2345),
standard_deviation: NiceFloat(0.538042981554448),
skewness: NiceFloat(2.730265146765687),
excess_kurtosis: NiceFloat(9.45434777164341),
};
let sample_moment_stats = MomentStats {
mean: NiceFloat(1.2349320000000084),
standard_deviation: NiceFloat(0.5376590410783139),
skewness: NiceFloat(2.716807176148366),
excess_kurtosis: NiceFloat(9.308727522629948),
};
geometric_random_positive_unsigneds_helper::(
12345,
10000,
values,
common_values,
pop_median,
sample_median,
pop_moment_stats,
sample_moment_stats,
);
// u64, um = 2
let values = &[2, 1, 1, 4, 5, 5, 2, 1, 1, 2, 1, 1, 3, 3, 1, 1, 2, 1, 4, 2];
let common_values = &[
(1, 500085),
(2, 249510),
(3, 125328),
(4, 62428),
(5, 31280),
(6, 15676),
(7, 7853),
(8, 3994),
(9, 1932),
(10, 942),
];
let pop_median = (1, Some(2));
let sample_median = (1, None);
let pop_moment_stats = MomentStats {
mean: NiceFloat(2.0),
standard_deviation: NiceFloat(std::f64::consts::SQRT_2),
skewness: NiceFloat(2.1213203435596424),
excess_kurtosis: NiceFloat(6.5),
};
let sample_moment_stats = MomentStats {
mean: NiceFloat(2.0006159999998947),
standard_deviation: NiceFloat(1.414547850547892),
skewness: NiceFloat(2.114056944012543),
excess_kurtosis: NiceFloat(6.4341815215340645),
};
geometric_random_positive_unsigneds_helper::(
2,
1,
values,
common_values,
pop_median,
sample_median,
pop_moment_stats,
sample_moment_stats,
);
// u8, um = 64
let values = &[53, 56, 71, 20, 113, 87, 55, 44, 4, 17, 44, 36, 5, 25, 55, 9, 114, 24, 15, 76];
let common_values = &[
(1, 16172),
(2, 15695),
(3, 15520),
(4, 15241),
(5, 15089),
(6, 14676),
(7, 14543),
(8, 14211),
(9, 13961),
(10, 13836),
];
let pop_median = (43, None);
let sample_median = (43, None);
let pop_moment_stats = MomentStats {
mean: NiceFloat(59.318470051671945),
standard_deviation: NiceFloat(53.06875861106282),
skewness: NiceFloat(1.275790253790931),
excess_kurtosis: NiceFloat(1.21378930742857),
};
let sample_moment_stats = MomentStats {
mean: NiceFloat(59.312081000000006),
standard_deviation: NiceFloat(53.01872774251563),
skewness: NiceFloat(1.2706951236419683),
excess_kurtosis: NiceFloat(1.1982916278084028),
};
geometric_random_positive_unsigneds_helper::(
64,
1,
values,
common_values,
pop_median,
sample_median,
pop_moment_stats,
sample_moment_stats,
);
// u8, um = 1000
let values =
&[27, 115, 1, 27, 107, 217, 210, 242, 42, 36, 197, 207, 42, 43, 250, 195, 255, 122, 5, 221];
let common_values = &[
(6, 4501),
(2, 4490),
(8, 4461),
(21, 4453),
(10, 4449),
(3, 4446),
(11, 4440),
(13, 4422),
(12, 4415),
(25, 4407),
];
let pop_median = (120, None);
let sample_median = (120, None);
let pop_moment_stats = MomentStats {
mean: NiceFloat(122.58449448192029),
standard_deviation: NiceFloat(73.49201840569208),
skewness: NiceFloat(0.08835569448221604),
excess_kurtosis: NiceFloat(-1.1892531716440173),
};
let sample_moment_stats = MomentStats {
mean: NiceFloat(122.63144799999775),
standard_deviation: NiceFloat(73.49633071884523),
skewness: NiceFloat(0.08793356388157667),
excess_kurtosis: NiceFloat(-1.1900100973541539),
};
geometric_random_positive_unsigneds_helper::(
1000,
1,
values,
common_values,
pop_median,
sample_median,
pop_moment_stats,
sample_moment_stats,
);
}
fn geometric_random_positive_unsigneds_fail_helper() {
assert_panic!(geometric_random_positive_unsigneds::(EXAMPLE_SEED, 1, 0));
assert_panic!(geometric_random_positive_unsigneds::(EXAMPLE_SEED, 2, 3));
}
#[test]
fn geometric_random_positive_unsigneds_fail() {
apply_fn_to_unsigneds!(geometric_random_positive_unsigneds_fail_helper);
}