use crate::statistical_tests::utils::convert_string;
pub fn get_kappa(text: &str) -> f64 {
let data = convert_string(text);
if data.len() < 2 {
return 0.0;
}
let max_shift = std::cmp::min(10, data.len() / 2);
let mut max_kappa = 0.0;
for shift in 1..=max_shift {
let kappa = calculate_kappa(&data, shift);
if kappa > max_kappa {
max_kappa = kappa;
}
}
max_kappa
}
fn calculate_kappa(data: &[usize], shift: usize) -> f64 {
let mut coincidences = 0;
let mut total = 0;
for i in 0..(data.len() - shift) {
if data[i] == data[i + shift] {
coincidences += 1;
}
total += 1;
}
if total > 0 {
(coincidences as f64 / total as f64) * 1000.0
} else {
0.0
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_kappa_repeated_pattern() {
let text = "ABCABCABCABC";
let kappa = get_kappa(text);
assert!(kappa > 100.0); }
#[test]
fn test_kappa_random_text() {
let text = "QWERTYUIOPASDFGHJKLZXCVBNM";
let kappa = get_kappa(text);
assert!(kappa < 100.0); }
}