use crate::types::Color;
use super::types::Evaluation;
use super::expected_points::get_expected_points_loss;
pub fn get_move_accuracy(point_loss: f64) -> f64 {
(103.16 * (-4.0 * point_loss).exp() - 3.17).clamp(0.0, 100.0)
}
pub fn get_move_accuracy_from_evals(
before: &Evaluation,
after: &Evaluation,
color: Color,
) -> f64 {
let loss = get_expected_points_loss(before, after, color);
get_move_accuracy(loss)
}
#[derive(Debug, Clone)]
pub struct PlayerAccuracy {
pub average: f64,
pub per_move: Vec<f64>,
}
impl PlayerAccuracy {
pub fn from_point_losses(losses: &[f64]) -> Self {
let per_move: Vec<f64> = losses.iter().map(|&l| get_move_accuracy(l)).collect();
let average = if per_move.is_empty() {
0.0
} else {
per_move.iter().sum::<f64>() / per_move.len() as f64
};
Self { average, per_move }
}
}