use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Decision {
Keep,
Review,
Drop,
}
impl std::fmt::Display for Decision {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Decision::Keep => write!(f, "keep"),
Decision::Review => write!(f, "review"),
Decision::Drop => write!(f, "drop"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StabilityReport {
pub sample_id: String,
pub n_observations: usize,
#[serde(skip_serializing_if = "Option::is_none")]
pub majority_label: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub label_agreement: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub score_mean: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub score_std: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub score_range: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub budget_sensitivity: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub seed_sensitivity: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub model_agreement: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub evaluator_agreement: Option<f64>,
pub disagreement_score: f64,
pub stability_score: f64,
pub decision: Decision,
}