runifold_testkit/evaluation/
regression.rs1use super::{Deserialize, EvaluationError, Serialize, ensure_ratio};
2
3#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Serialize)]
5pub struct RegressionPolicy {
6 pub max_mean_drop: f64,
8 pub max_pass_rate_drop: f64,
10 pub max_execution_success_drop: f64,
12}
13
14impl RegressionPolicy {
15 pub fn new(
21 max_mean_drop: f64,
22 max_pass_rate_drop: f64,
23 max_execution_success_drop: f64,
24 ) -> Result<Self, EvaluationError> {
25 let policy = Self {
26 max_mean_drop,
27 max_pass_rate_drop,
28 max_execution_success_drop,
29 };
30 policy.validate()?;
31 Ok(policy)
32 }
33
34 pub(super) fn validate(&self) -> Result<(), EvaluationError> {
35 ensure_ratio("maximum mean drop", self.max_mean_drop)?;
36 ensure_ratio("maximum pass-rate drop", self.max_pass_rate_drop)?;
37 ensure_ratio(
38 "maximum execution-success drop",
39 self.max_execution_success_drop,
40 )
41 }
42}
43
44#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
46pub struct MetricRegression {
47 pub name: String,
49 pub baseline_mean: f64,
51 pub candidate_mean: f64,
53 pub mean_delta: f64,
55 pub baseline_pass_rate: f64,
57 pub candidate_pass_rate: f64,
59 pub pass_rate_delta: f64,
61 pub passed: bool,
63}
64
65#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
67pub struct RegressionComparison {
68 pub baseline_version: String,
70 pub candidate_version: String,
72 pub execution_success_rate_delta: f64,
74 pub metrics: Vec<MetricRegression>,
76 pub passed: bool,
78}