// 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::floats::PrimitiveFloat; use malachite_base::num::random::special_random_positive_primitive_floats; use malachite_base::random::EXAMPLE_SEED; use malachite_base::test_util::num::random::special_random_primitive_floats_helper_helper; use malachite_base::test_util::stats::moments::{CheckedToF64, MomentStats, NAN_MOMENT_STATS}; use std::panic::catch_unwind; fn special_random_positive_primitive_floats_helper( mean_exponent_numerator: u64, mean_exponent_denominator: u64, mean_precision_numerator: u64, mean_precision_denominator: u64, mean_special_p_numerator: u64, mean_special_p_denominator: u64, expected_values: &[T], expected_common_values: &[(T, usize)], expected_median: (T, Option), expected_moment_stats: MomentStats, ) { special_random_primitive_floats_helper_helper( special_random_positive_primitive_floats::( EXAMPLE_SEED, mean_exponent_numerator, mean_exponent_denominator, mean_precision_numerator, mean_precision_denominator, mean_special_p_numerator, mean_special_p_denominator, ), expected_values, expected_common_values, expected_median, expected_moment_stats, ); } #[test] fn test_special_random_positive_primitive_floats() { // f32, mean abs of exponent = 1/64, mean precision = 65/64, mean special P = 1/4 let values = &[ f32::INFINITY, 1.5, 1.0, f32::INFINITY, 1.0, 1.0, f32::INFINITY, 1.0, f32::INFINITY, f32::INFINITY, 1.0, f32::INFINITY, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, f32::INFINITY, 1.0, f32::INFINITY, f32::INFINITY, 1.0, 1.0, 1.0, 1.0, 1.0, f32::INFINITY, 1.0, 1.0, 0.5, 1.0, f32::INFINITY, f32::INFINITY, f32::INFINITY, 1.0, ]; let common_values = &[ (1.0, 716268), (f32::INFINITY, 250209), (2.0, 10938), (0.5, 10888), (1.5, 10871), (4.0, 172), (0.25, 165), (3.0, 161), (0.75, 155), (1.25, 75), (1.75, 74), (0.375, 6), (3.5, 4), (0.125, 4), (8.0, 3), (0.875, 2), (1.875, 2), (6.0, 1), (0.625, 1), (1.125, 1), ]; let sample_median = (1.0, None); special_random_positive_primitive_floats_helper::( 1, 64, 65, 64, 1, 4, values, common_values, sample_median, NAN_MOMENT_STATS, ); // f32, mean abs of exponent = 1, mean precision = 2, mean special P = 1/10 let values = &[ 1.0, 1.0, 3.0, f32::INFINITY, 1.0, 1.0, 2.0, 2.0, 1.0, 3.0, 1.0, 3.0, 3.0, f32::INFINITY, 6.0, 1.125, 1.25, f32::INFINITY, 3.0, 0.125, 1.0, 0.25, 1.75, 4.0, 4.0, 4.0, 0.75, 0.125, 1.0, f32::INFINITY, 0.125, 6.0, f32::INFINITY, 0.5, 4.0, 6.5, 2.0, 0.21875, 2.0, 0.5, 0.5, 4.0, 16.0, 16.0, 3.0, 1.0, f32::INFINITY, 1.0, 10.0, 6.0, ]; let common_values = &[ (1.0, 151036), (f32::INFINITY, 100224), (0.5, 75239), (2.0, 74939), (1.5, 74396), (0.25, 37669), (0.75, 37538), (3.0, 37523), (4.0, 37411), (0.375, 18737), (6.0, 18708), (0.125, 18698), (1.25, 18586), (8.0, 18570), (1.75, 18339), (3.5, 9676), (0.0625, 9668), (16.0, 9474), (0.875, 9416), (12.0, 9376), ]; let sample_median = (1.5, None); special_random_positive_primitive_floats_helper::( 1, 1, 2, 1, 1, 10, values, common_values, sample_median, NAN_MOMENT_STATS, ); // f32, mean abs of exponent = 10, mean precision = 10, mean special P = 1/100 let values = &[ 0.6328125, 9.536743e-7, 0.013671875, 0.6875, 70208.0, 0.01550293, 0.028625488, 3.3095703, 5.775879, 0.000034958124, 0.4375, 31678.0, 49152.0, 1.0, 49.885254, 0.40625, 0.0015869141, 1889.5625, 0.14140439, 0.001449585, 1.4901161e-8, 0.03125, 5750784.0, 0.17578125, 248.0, 5.4375, 1892352.0, 1.5280966e-7, 0.2826419, 0.0057373047, 51642370.0, 6384.0, 27.875542, 6.152041, 6.0, 2.796875, 0.0000057816505, 0.029174805, 0.00011384487, 0.000039815903, 0.00012207031, 48.0, 0.00390625, 0.01171875, 20.0, 21.625, 0.171875, 197.0, 0.11743164, 5532.0, ]; let common_values = &[ (f32::INFINITY, 9989), (1.0, 5059), (2.0, 4689), (0.5, 4622), (1.5, 4576), (4.0, 4280), (3.0, 4153), (0.25, 4130), (0.75, 4105), (8.0, 3912), (6.0, 3841), (0.125, 3772), (0.375, 3663), (16.0, 3536), (0.1875, 3530), (0.0625, 3441), (12.0, 3433), (0.09375, 3185), (0.03125, 3176), (32.0, 3094), ]; let sample_median = (1.5, None); special_random_positive_primitive_floats_helper::( 10, 1, 10, 1, 1, 100, values, common_values, sample_median, NAN_MOMENT_STATS, ); // f64, mean abs of exponent = 1/64, mean precision = 65/64, mean special P = 1/4 let values = &[ f64::INFINITY, 1.5, 1.0, f64::INFINITY, 1.0, 1.0, f64::INFINITY, 1.0, f64::INFINITY, f64::INFINITY, 1.0, f64::INFINITY, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, f64::INFINITY, 1.0, f64::INFINITY, f64::INFINITY, 1.0, 1.0, 1.0, 1.0, 1.0, f64::INFINITY, 1.0, 1.0, 0.5, 1.0, f64::INFINITY, f64::INFINITY, f64::INFINITY, 1.0, ]; let common_values = &[ (1.0, 716268), (f64::INFINITY, 250209), (2.0, 10938), (0.5, 10888), (1.5, 10871), (4.0, 172), (0.25, 165), (3.0, 161), (0.75, 155), (1.25, 75), (1.75, 74), (0.375, 6), (3.5, 4), (0.125, 4), (8.0, 3), (0.875, 2), (1.875, 2), (6.0, 1), (0.625, 1), (1.125, 1), ]; let sample_median = (1.0, None); special_random_positive_primitive_floats_helper::( 1, 64, 65, 64, 1, 4, values, common_values, sample_median, NAN_MOMENT_STATS, ); // f64, mean abs of exponent = 1, mean precision = 2, mean special P = 1/10 let values = &[ 1.0, 1.0, 3.0, f64::INFINITY, 1.0, 1.0, 2.0, 2.0, 1.0, 3.0, 1.0, 3.0, 3.0, f64::INFINITY, 6.0, 1.125, 1.25, f64::INFINITY, 3.0, 0.125, 1.0, 0.25, 1.75, 4.0, 4.0, 4.0, 0.75, 0.125, 1.0, f64::INFINITY, 0.125, 6.0, f64::INFINITY, 0.5, 4.0, 6.5, 2.0, 0.21875, 2.0, 0.5, 0.5, 4.0, 16.0, 16.0, 3.0, 1.0, f64::INFINITY, 1.0, 10.0, 6.0, ]; let common_values = &[ (1.0, 151036), (f64::INFINITY, 100224), (0.5, 75239), (2.0, 74939), (1.5, 74396), (0.25, 37669), (0.75, 37538), (3.0, 37523), (4.0, 37411), (0.375, 18737), (6.0, 18708), (0.125, 18698), (1.25, 18586), (8.0, 18570), (1.75, 18339), (3.5, 9676), (0.0625, 9668), (16.0, 9474), (0.875, 9416), (12.0, 9376), ]; let sample_median = (1.5, None); special_random_positive_primitive_floats_helper::( 1, 1, 2, 1, 1, 10, values, common_values, sample_median, NAN_MOMENT_STATS, ); // f64, mean abs of exponent = 10, mean precision = 10, mean special P = 1/100 let values = &[ 0.6328125, 9.5367431640625e-7, 0.013671875, 0.6875, 70208.0, 0.0155029296875, 0.02862548828125, 3.3095703125, 5.77587890625, 0.0000349581241607666, 0.4375, 31678.0, 49152.0, 1.0, 49.88525390625, 0.40625, 0.0015869140625, 1889.5625, 0.141404390335083, 0.0014495849609375, 1.4901161193847656e-8, 0.03125, 5750784.0, 0.17578125, 248.0, 5.4375, 1892352.0, 1.528096618130803e-7, 0.2826418876647949, 0.0057373046875, 51642368.0, 6384.0, 27.87554168701172, 6.152040958404541, 6.0, 2.796875, 5.781650543212891e-6, 0.0291748046875, 0.0001138448715209961, 0.00003981590270996094, 0.0001220703125, 48.0, 0.00390625, 0.01171875, 20.0, 21.625, 0.171875, 205.175663292408, 0.118408203125, 6436.0, ]; let common_values = &[ (f64::INFINITY, 9989), (1.0, 4750), (2.0, 4357), (0.5, 4257), (1.5, 4256), (4.0, 3955), (3.0, 3844), (0.25, 3812), (0.75, 3799), (8.0, 3628), (6.0, 3535), (0.125, 3447), (0.375, 3398), (16.0, 3257), (0.1875, 3234), (12.0, 3202), (0.0625, 3182), (0.09375, 2957), (0.03125, 2919), (32.0, 2805), ]; let sample_median = (1.5162887573242188, Some(1.516387939453125)); special_random_positive_primitive_floats_helper::( 10, 1, 10, 1, 1, 100, values, common_values, sample_median, NAN_MOMENT_STATS, ); } fn special_random_positive_primitive_floats_fail_helper() { assert_panic!(special_random_positive_primitive_floats::( EXAMPLE_SEED, 0, 1, 10, 1, 1, 10 )); assert_panic!(special_random_positive_primitive_floats::( EXAMPLE_SEED, 1, 0, 10, 1, 1, 10 )); assert_panic!(special_random_positive_primitive_floats::( EXAMPLE_SEED, 10, 1, 1, 1, 1, 10 )); assert_panic!(special_random_positive_primitive_floats::( EXAMPLE_SEED, 10, 1, 1, 0, 1, 10 )); assert_panic!(special_random_positive_primitive_floats::( EXAMPLE_SEED, 10, 1, 10, 1, 1, 0 )); assert_panic!(special_random_positive_primitive_floats::( EXAMPLE_SEED, 10, 1, 10, 1, 2, 1 )); } #[test] fn special_random_positive_primitive_floats_fail() { apply_fn_to_primitive_floats!(special_random_positive_primitive_floats_fail_helper); }