// 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::signeds::PrimitiveSigned;
use malachite_base::num::float::NiceFloat;
use malachite_base::num::random::geometric::geometric_random_nonzero_signeds;
use malachite_base::random::EXAMPLE_SEED;
use malachite_base::test_util::stats::moments::{
double_nonzero_truncated_geometric_dist_assertions, CheckedToF64, MomentStats,
};
use std::panic::catch_unwind;
fn geometric_random_nonzero_signeds_helper(
um_numerator: u64,
um_denominator: u64,
expected_values: &[T],
expected_common_values: &[(T, usize)],
expected_abs_mean: NiceFloat,
expected_pop_median: (T, Option),
expected_sample_median: (T, Option),
expected_pop_moment_stats: MomentStats,
expected_sample_moment_stats: MomentStats,
) {
double_nonzero_truncated_geometric_dist_assertions(
geometric_random_nonzero_signeds::(EXAMPLE_SEED, um_numerator, um_denominator),
T::MIN,
T::MAX,
um_numerator,
um_denominator,
expected_values,
expected_common_values,
expected_abs_mean,
expected_pop_median,
expected_sample_median,
expected_pop_moment_stats,
expected_sample_moment_stats,
);
}
#[test]
fn test_geometric_random_nonzero_signeds() {
// i64, um = 65 / 64
let values = &[-1, -1, -1, 1, -1, 1, -1, -1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, -1];
let common_values =
&[(1, 492630), (-1, 491792), (2, 7695), (-2, 7623), (-3, 130), (3, 128), (4, 1), (-4, 1)];
let abs_mean = NiceFloat(1.0158400000000025);
let pop_median = (-1, Some(1));
let sample_median = (1, None);
let pop_moment_stats = MomentStats {
mean: NiceFloat(-0.0),
standard_deviation: NiceFloat(1.0234076808633008),
skewness: NiceFloat(0.0),
excess_kurtosis: NiceFloat(-1.863403263403264),
};
let sample_moment_stats = MomentStats {
mean: NiceFloat(0.0009760000000000123),
standard_deviation: NiceFloat(1.0237422016660624),
skewness: NiceFloat(-0.0015925396363277624),
excess_kurtosis: NiceFloat(-1.8611455716465144),
};
geometric_random_nonzero_signeds_helper::(
65,
64,
values,
common_values,
abs_mean,
pop_median,
sample_median,
pop_moment_stats,
sample_moment_stats,
);
// i64, um = 12345/10000
let values = &[-3, -1, -1, 2, -1, 1, -1, -1, -1, 1, 3, 2, -2, -1, 1, -1, -2, -1, -1, -1];
let common_values = &[
(1, 405592),
(-1, 404788),
(2, 76970),
(-2, 76657),
(-3, 14659),
(3, 14550),
(-4, 2798),
(4, 2694),
(5, 525),
(-5, 504),
];
let abs_mean = NiceFloat(1.2340139999999655);
let pop_median = (-1, Some(1));
let sample_median = (1, None);
let pop_moment_stats = MomentStats {
mean: NiceFloat(-0.0),
standard_deviation: NiceFloat(1.3466553011071538),
skewness: NiceFloat(0.0),
excess_kurtosis: NiceFloat(-0.5329853284885049),
};
let sample_moment_stats = MomentStats {
mean: NiceFloat(0.0006879999999999908),
standard_deviation: NiceFloat(1.3459834093804237),
skewness: NiceFloat(-0.004555831860856982),
excess_kurtosis: NiceFloat(-0.5314899892072216),
};
geometric_random_nonzero_signeds_helper::(
12345,
10000,
values,
common_values,
abs_mean,
pop_median,
sample_median,
pop_moment_stats,
sample_moment_stats,
);
// i64, um = 2
let values = &[-2, -2, -2, 2, -3, 2, -1, -1, -1, 1, 1, 1, -2, -1, 1, -2, -1, -1, -2, -1];
let common_values = &[
(1, 250123),
(-1, 250114),
(2, 125321),
(-2, 124779),
(3, 62655),
(-3, 62429),
(4, 31220),
(-4, 30972),
(-5, 15670),
(5, 15610),
];
let abs_mean = NiceFloat(1.9985919999999855);
let pop_median = (-1, Some(1));
let sample_median = (1, None);
let pop_moment_stats = MomentStats {
mean: NiceFloat(-0.0),
standard_deviation: NiceFloat(2.449489742783178),
skewness: NiceFloat(0.0),
excess_kurtosis: NiceFloat(1.166666666666667),
};
let sample_moment_stats = MomentStats {
mean: NiceFloat(0.0027099999999999395),
standard_deviation: NiceFloat(2.4473305141166697),
skewness: NiceFloat(0.003736776778462254),
excess_kurtosis: NiceFloat(1.1584370930225818),
};
geometric_random_nonzero_signeds_helper::(
2,
1,
values,
common_values,
abs_mean,
pop_median,
sample_median,
pop_moment_stats,
sample_moment_stats,
);
// i8, um = 64
let values = &[
-3, -45, -90, 30, -33, -38, -25, 15, 40, -20, 42, -34, -74, -110, -15, 12, -76, -2, -6, -76,
];
let common_values = &[
(1, 9067),
(-1, 9026),
(-2, 8948),
(2, 8915),
(-3, 8837),
(3, 8719),
(5, 8571),
(4, 8530),
(-4, 8430),
(6, 8385),
];
let abs_mean = NiceFloat(44.16314300000121);
let pop_median = (-1, None);
let sample_median = (-1, None);
let pop_moment_stats = MomentStats {
mean: NiceFloat(-0.15631902384873833),
standard_deviation: NiceFloat(55.4586923219402),
skewness: NiceFloat(-0.006558922726586753),
excess_kurtosis: NiceFloat(-0.4026097866721505),
};
let sample_moment_stats = MomentStats {
mean: NiceFloat(-0.15813500000000466),
standard_deviation: NiceFloat(55.40978289585497),
skewness: NiceFloat(-0.008649136036163145),
excess_kurtosis: NiceFloat(-0.39765880957469824),
};
geometric_random_nonzero_signeds_helper::(
64,
1,
values,
common_values,
abs_mean,
pop_median,
sample_median,
pop_moment_stats,
sample_moment_stats,
);
// i8, um = 1000
let values =
&[29, -58, 40, 58, 29, 21, -101, 50, 126, -3, 13, 22, 22, 69, 70, 62, -82, -67, 91, 87];
let common_values = &[
(3, 4314),
(-1, 4293),
(-4, 4243),
(2, 4240),
(10, 4233),
(-12, 4223),
(-26, 4220),
(7, 4203),
(-7, 4198),
(-19, 4196),
];
let abs_mean = NiceFloat(62.86584099999888);
let pop_median = (-1, None);
let sample_median = (-1, None);
let pop_moment_stats = MomentStats {
mean: NiceFloat(-0.4706257221678366),
standard_deviation: NiceFloat(72.86493046408025),
skewness: NiceFloat(-0.0005545932485799438),
excess_kurtosis: NiceFloat(-1.1684399210707623),
};
let sample_moment_stats = MomentStats {
mean: NiceFloat(-0.5576419999999735),
standard_deviation: NiceFloat(72.84782263187428),
skewness: NiceFloat(0.0014314361576379332),
excess_kurtosis: NiceFloat(-1.1671979175710692),
};
geometric_random_nonzero_signeds_helper::(
1000,
1,
values,
common_values,
abs_mean,
pop_median,
sample_median,
pop_moment_stats,
sample_moment_stats,
);
}
fn geometric_random_nonzero_signeds_fail_helper() {
assert_panic!(geometric_random_nonzero_signeds::(EXAMPLE_SEED, 1, 0));
assert_panic!(geometric_random_nonzero_signeds::(EXAMPLE_SEED, 2, 3));
}
#[test]
fn geometric_random_nonzero_signeds_fail() {
apply_fn_to_signeds!(geometric_random_nonzero_signeds_fail_helper);
}