// 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_signeds; use malachite_base::random::EXAMPLE_SEED; use malachite_base::test_util::stats::moments::{ double_truncated_geometric_dist_assertions, CheckedToF64, MomentStats, }; use std::panic::catch_unwind; fn geometric_random_signeds_helper( um_numerator: u64, um_denominator: u64, expected_values: &[T], expected_common_values: &[(T, usize)], expected_natural_mean: NiceFloat, expected_pop_median: (T, Option), expected_sample_median: (T, Option), expected_pop_moment_stats: MomentStats, expected_sample_moment_stats: MomentStats, ) { double_truncated_geometric_dist_assertions( geometric_random_signeds::(EXAMPLE_SEED, um_numerator, um_denominator), T::MIN, T::MAX, um_numerator, um_denominator, expected_values, expected_common_values, expected_natural_mean, expected_pop_median, expected_sample_median, expected_pop_moment_stats, expected_sample_moment_stats, ); } #[test] fn test_geometric_random_signeds() { // i64, um = 1 / 64 let values = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; let common_values = &[(0, 969281), (-1, 15234), (1, 14983), (-2, 267), (2, 230), (3, 3), (-3, 2)]; let natural_mean = NiceFloat(0.01570299999999922); let pop_median = (0, None); let sample_median = (0, None); let pop_moment_stats = MomentStats { mean: NiceFloat(-0.0), standard_deviation: NiceFloat(0.17815241017173997), skewness: NiceFloat(0.0), excess_kurtosis: NiceFloat(34.507692307692416), }; let sample_moment_stats = MomentStats { mean: NiceFloat(-0.0003219999999999915), standard_deviation: NiceFloat(0.17958265107166738), skewness: NiceFloat(-0.08440731496142939), excess_kurtosis: NiceFloat(34.08776956313593), }; geometric_random_signeds_helper::( 1, 64, values, common_values, natural_mean, pop_median, sample_median, pop_moment_stats, sample_moment_stats, ); // i64, um = 12345/10000 let values = &[-1, -1, 0, -3, 1, 0, 0, -4, 0, -6, 1, 4, 0, 1, -2, 4, -3, -3, 1, -3]; let common_values = &[ (0, 288130), (1, 159322), (-1, 158541), (-2, 88726), (2, 88078), (3, 48713), (-3, 48584), (-4, 26933), (4, 26804), (-5, 14960), ]; let natural_mean = NiceFloat(1.233504000000006); let pop_median = (0, None); let sample_median = (0, None); let pop_moment_stats = MomentStats { mean: NiceFloat(-0.0), standard_deviation: NiceFloat(2.3488253447202068), skewness: NiceFloat(0.0), excess_kurtosis: NiceFloat(3.181258570698229), }; let sample_moment_stats = MomentStats { mean: NiceFloat(-0.0021609999999999915), standard_deviation: NiceFloat(2.3469592749549535), skewness: NiceFloat(-0.007388197841520547), excess_kurtosis: NiceFloat(3.1771115107088255), }; geometric_random_signeds_helper::( 12345, 10000, values, common_values, natural_mean, pop_median, sample_median, pop_moment_stats, sample_moment_stats, ); // i64, um = 2 let values = &[-5, 0, 0, 1, -1, -1, -4, 2, 4, 6, -2, -2, 0, -1, -9, -13, 0, -2, 0, -7]; let common_values = &[ (0, 200052), (-1, 133433), (1, 133168), (2, 89079), (-2, 88845), (3, 59306), (-3, 59229), (-4, 39537), (4, 39457), (-5, 26287), ]; let natural_mean = NiceFloat(1.9983939999999663); let pop_median = (0, None); let sample_median = (0, None); let pop_moment_stats = MomentStats { mean: NiceFloat(-0.0), standard_deviation: NiceFloat(3.4641016151377553), skewness: NiceFloat(0.0), excess_kurtosis: NiceFloat(3.0833333333333304), }; let sample_moment_stats = MomentStats { mean: NiceFloat(-0.004637999999999956), standard_deviation: NiceFloat(3.462957476064434), skewness: NiceFloat(-0.0014668264694796887), excess_kurtosis: NiceFloat(3.1056798270038826), }; geometric_random_signeds_helper::( 2, 1, values, common_values, natural_mean, pop_median, sample_median, pop_moment_stats, sample_moment_stats, ); // i8, um = 64 let values = &[ -58, -18, 80, -31, -85, -74, 114, 29, 46, -28, -5, -54, -73, -67, 96, 74, -67, -20, 93, -95, ]; let common_values = &[ (0, 8916), (1, 8897), (-1, 8830), (3, 8811), (-2, 8800), (2, 8757), (-4, 8491), (4, 8459), (-3, 8413), (-5, 8336), ]; let natural_mean = NiceFloat(43.609158999998506); let pop_median = (0, None); let sample_median = (0, None); let pop_moment_stats = MomentStats { mean: NiceFloat(-0.15811030451314936), standard_deviation: NiceFloat(55.48244935032745), skewness: NiceFloat(-0.006618243685084806), excess_kurtosis: NiceFloat(-0.3947891766587368), }; let sample_moment_stats = MomentStats { mean: NiceFloat(-0.09556800000000087), standard_deviation: NiceFloat(55.48675459546383), skewness: NiceFloat(-0.007283472641276268), excess_kurtosis: NiceFloat(-0.3961004797032963), }; geometric_random_signeds_helper::( 64, 1, values, common_values, natural_mean, pop_median, sample_median, pop_moment_stats, sample_moment_stats, ); // i8, um = 1000 let values = &[25, -53, 39, 32, 26, 13, -94, 45, 125, 119, 11, 15, 66, 68, 60, -71, -54, 83, 76, -33]; let common_values = &[ (-2, 4277), (1, 4263), (9, 4217), (-1, 4213), (5, 4207), (-4, 4207), (0, 4206), (-6, 4200), (19, 4199), (8, 4179), ]; let natural_mean = NiceFloat(62.13860000000173); let pop_median = (0, None); let sample_median = (0, None); let pop_moment_stats = MomentStats { mean: NiceFloat(-0.4686977489785049), standard_deviation: NiceFloat(72.71434769926142), skewness: NiceFloat(-0.0006359350720949359), excess_kurtosis: NiceFloat(-1.1608263148064384), }; let sample_moment_stats = MomentStats { mean: NiceFloat(-0.446604999999992), standard_deviation: NiceFloat(72.6977982881445), skewness: NiceFloat(-0.0006088230606281416), excess_kurtosis: NiceFloat(-1.1593850084998423), }; geometric_random_signeds_helper::( 1000, 1, values, common_values, natural_mean, pop_median, sample_median, pop_moment_stats, sample_moment_stats, ); } fn geometric_random_signeds_fail_helper() { assert_panic!(geometric_random_signeds::(EXAMPLE_SEED, 0, 1)); assert_panic!(geometric_random_signeds::(EXAMPLE_SEED, 1, 0)); assert_panic!(geometric_random_signeds::( EXAMPLE_SEED, u64::MAX, u64::MAX - 1 )); } #[test] fn geometric_random_signeds_fail() { apply_fn_to_signeds!(geometric_random_signeds_fail_helper); }