use super::{Deserialize, EvaluationError, Serialize, ensure_ratio};
#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Serialize)]
pub struct RegressionPolicy {
pub max_mean_drop: f64,
pub max_pass_rate_drop: f64,
pub max_execution_success_drop: f64,
}
impl RegressionPolicy {
pub fn new(
max_mean_drop: f64,
max_pass_rate_drop: f64,
max_execution_success_drop: f64,
) -> Result<Self, EvaluationError> {
let policy = Self {
max_mean_drop,
max_pass_rate_drop,
max_execution_success_drop,
};
policy.validate()?;
Ok(policy)
}
pub(super) fn validate(&self) -> Result<(), EvaluationError> {
ensure_ratio("maximum mean drop", self.max_mean_drop)?;
ensure_ratio("maximum pass-rate drop", self.max_pass_rate_drop)?;
ensure_ratio(
"maximum execution-success drop",
self.max_execution_success_drop,
)
}
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
pub struct MetricRegression {
pub name: String,
pub baseline_mean: f64,
pub candidate_mean: f64,
pub mean_delta: f64,
pub baseline_pass_rate: f64,
pub candidate_pass_rate: f64,
pub pass_rate_delta: f64,
pub passed: bool,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
pub struct RegressionComparison {
pub baseline_version: String,
pub candidate_version: String,
pub execution_success_rate_delta: f64,
pub metrics: Vec<MetricRegression>,
pub passed: bool,
}