// 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 itertools::{assert_equal, Itertools};
use malachite_base::bools::random::random_bools;
use malachite_base::num::basic::unsigneds::PrimitiveUnsigned;
use malachite_base::num::conversion::traits::ExactFrom;
use malachite_base::num::float::NiceFloat;
use malachite_base::num::random::random_unsigned_bit_chunks;
use malachite_base::random::EXAMPLE_SEED;
use malachite_base::test_util::stats::moments::{
uniform_primitive_int_assertions, CheckedToF64, MomentStats,
};
use std::panic::catch_unwind;
fn random_unsigned_bit_chunks_helper(
chunk_size: 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,
) {
let xs = random_unsigned_bit_chunks(EXAMPLE_SEED, chunk_size);
uniform_primitive_int_assertions(
xs.clone(),
T::ZERO,
T::low_mask(chunk_size),
expected_values,
expected_common_values,
expected_pop_median,
expected_sample_median,
expected_pop_moment_stats,
expected_sample_moment_stats,
);
if chunk_size != 0 {
assert_equal(
random_bools(EXAMPLE_SEED)
.chunks(usize::exact_from(chunk_size))
.into_iter()
.take(1000000)
.map(T::from_bits_asc),
xs.take(1000000),
);
}
}
#[test]
fn test_random_unsigned_bit_chunks() {
// u16, chunk_size = 1
let values = &[1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0];
let common_values = &[(1, 500473), (0, 499527)];
let pop_median = (0, Some(1));
let sample_median = (1, None);
let pop_moment_stats = MomentStats {
mean: NiceFloat(0.5),
standard_deviation: NiceFloat(0.5),
skewness: NiceFloat(0.0),
excess_kurtosis: NiceFloat(-1.9999999999999998),
};
let sample_moment_stats = MomentStats {
mean: NiceFloat(0.5004730000000077),
standard_deviation: NiceFloat(0.5000000262710417),
skewness: NiceFloat(-0.0018920008465908307),
excess_kurtosis: NiceFloat(-1.999996420332894),
};
random_unsigned_bit_chunks_helper::(
1,
values,
common_values,
pop_median,
sample_median,
pop_moment_stats,
sample_moment_stats,
);
// u32, chunk_size = 2
let values = &[1, 0, 3, 1, 3, 3, 2, 3, 1, 1, 0, 1, 0, 3, 2, 1, 0, 1, 2, 3];
let common_values = &[(1, 250314), (3, 250015), (2, 249955), (0, 249716)];
let pop_median = (1, Some(2));
let sample_median = (1, None);
let pop_moment_stats = MomentStats {
mean: NiceFloat(1.5),
standard_deviation: NiceFloat(1.118033988749895),
skewness: NiceFloat(0.0),
excess_kurtosis: NiceFloat(-1.3599999999999999),
};
let sample_moment_stats = MomentStats {
mean: NiceFloat(1.5002690000000294),
standard_deviation: NiceFloat(1.117793888470597),
skewness: NiceFloat(-0.00003155128630032229),
excess_kurtosis: NiceFloat(-1.3594490446207492),
};
random_unsigned_bit_chunks_helper::(
2,
values,
common_values,
pop_median,
sample_median,
pop_moment_stats,
sample_moment_stats,
);
// u64, chunk_size = 3
let values = &[1, 6, 5, 7, 6, 3, 1, 2, 4, 5, 1, 2, 6, 5, 4, 6, 0, 5, 6, 0];
let common_values = &[
(3, 125437),
(6, 125372),
(7, 125322),
(4, 125116),
(0, 125049),
(5, 124759),
(2, 124542),
(1, 124403),
];
let pop_median = (3, Some(4));
let sample_median = (4, None);
let pop_moment_stats = MomentStats {
mean: NiceFloat(3.5),
standard_deviation: NiceFloat(2.29128784747792),
skewness: NiceFloat(0.0),
excess_kurtosis: NiceFloat(-1.238095238095238),
};
let sample_moment_stats = MomentStats {
mean: NiceFloat(3.503543000000029),
standard_deviation: NiceFloat(2.291658067611209),
skewness: NiceFloat(-0.002350008016990765),
excess_kurtosis: NiceFloat(-1.2376569368178467),
};
random_unsigned_bit_chunks_helper::(
3,
values,
common_values,
pop_median,
sample_median,
pop_moment_stats,
sample_moment_stats,
);
// u128, chunk_size = 7
let values =
&[113, 94, 23, 98, 70, 92, 52, 84, 33, 47, 1, 113, 54, 10, 47, 17, 89, 92, 119, 66];
let common_values = &[
(2, 8077),
(121, 8039),
(48, 8015),
(113, 7966),
(8, 7937),
(77, 7933),
(50, 7928),
(91, 7927),
(82, 7925),
(102, 7924),
];
let pop_median = (63, Some(64));
let sample_median = (63, None);
let pop_moment_stats = MomentStats {
mean: NiceFloat(63.5),
standard_deviation: NiceFloat(36.94928957368463),
skewness: NiceFloat(0.0),
excess_kurtosis: NiceFloat(-1.2001464933162425),
};
let sample_moment_stats = MomentStats {
mean: NiceFloat(63.478088999999315),
standard_deviation: NiceFloat(36.96113842989552),
skewness: NiceFloat(-0.000454036075457304),
excess_kurtosis: NiceFloat(-1.1998683031732713),
};
random_unsigned_bit_chunks_helper::(
7,
values,
common_values,
pop_median,
sample_median,
pop_moment_stats,
sample_moment_stats,
);
// u8, chunk_size = 8
let values = &[
113, 239, 69, 108, 228, 210, 168, 161, 87, 32, 110, 83, 188, 34, 89, 238, 93, 200, 149, 115,
];
let common_values = &[
(214, 4097),
(86, 4078),
(166, 4049),
(22, 4048),
(126, 4047),
(55, 4040),
(93, 4037),
(191, 4036),
(36, 4035),
(42, 4032),
];
let pop_median = (127, Some(128));
let sample_median = (127, None);
let pop_moment_stats = MomentStats {
mean: NiceFloat(127.5),
standard_deviation: NiceFloat(73.90027063549903),
skewness: NiceFloat(0.0),
excess_kurtosis: NiceFloat(-1.200036621652552),
};
let sample_moment_stats = MomentStats {
mean: NiceFloat(127.4588370000015),
standard_deviation: NiceFloat(73.908735397844),
skewness: NiceFloat(0.0004407839380447086),
excess_kurtosis: NiceFloat(-1.200418003526934),
};
random_unsigned_bit_chunks_helper::(
8,
values,
common_values,
pop_median,
sample_median,
pop_moment_stats,
sample_moment_stats,
);
}
fn random_unsigned_bit_chunks_fail_helper() {
assert_panic!(random_unsigned_bit_chunks::(EXAMPLE_SEED, 0));
assert_panic!(random_unsigned_bit_chunks::(EXAMPLE_SEED, T::WIDTH + 1));
}
#[test]
fn random_unsigned_bit_chunks_fail() {
apply_fn_to_unsigneds!(random_unsigned_bit_chunks_fail_helper);
}