use std::{fs::File, io::Write};
use csf::coding::minimum_redundancy::Frequencies;
pub struct Input {
pub keys: Box<[u32]>,
pub values: Box<[u8]>,
pub frequencies: [u32; 256],
pub entropy: f64
}
impl Input {
pub const HEADER: &'static str = "input_len different_values entropy";
pub fn print_params_to(&self, file: &mut Option<File>) {
if let Some(ref mut f) = file {
write!(f, "{} {} {}", self.keys.len(), self.frequencies.number_of_occurring_values(), self.entropy).unwrap();
}
}
}
impl From<(Box<[u32]>, Box<[u8]>, [u32; 256])> for Input {
fn from((keys, values, frequencies): (Box<[u32]>, Box<[u8]>, [u32; 256])) -> Self {
let entropy = frequencies.entropy();
Self { keys, values, frequencies, entropy }
}
}
impl From<(Box<[u32]>, Box<[u8]>)> for Input {
fn from((keys, values): (Box<[u32]>, Box<[u8]>)) -> Self {
let frequencies = <[u32; 256]>::with_occurrences_of(values.iter());
(keys, values, frequencies).into()
}
}
impl From<(Box<[u32]>, Box<[u8]>, f64)> for Input {
fn from((keys, values, entropy): (Box<[u32]>, Box<[u8]>, f64)) -> Self {
let frequencies = <[u32; 256]>::with_occurrences_of(values.iter());
Self { keys, values, frequencies, entropy }
}
}
pub fn kv_dominated_lo(len: u32, mut different_values: u32, lo_count: u32) -> (Box<[u32]>, Box<[u8]>) {
different_values -= 1; let non_dominated_count = different_values * lo_count;
(
(0..len).collect(),
(0..non_dominated_count).map(|v| (v % different_values as u32) as u8)
.chain((non_dominated_count..len).map(|_| different_values as u8)).collect()
)
}
pub fn kv_dominated_lo_entropy(len: u32, mut different_values: u32, lo_count: u32) -> f64 {
different_values -= 1;
let dominated_count = (len - different_values * lo_count) as f64 / len as f64;
let lo_count = lo_count as f64 / len as f64;
return different_values as f64 * -lo_count * lo_count.log2()
- dominated_count * dominated_count.log2();
}