///|
/// Stores all evidence used for one multiclass prediction.
pub struct PredictionObservation {
  source_row_index : Int
  observed_class : Int
  selected_class : Int
  selected_score : Double
  runner_up_class : Int
  runner_up_score : Double
  selected_margin : Double
  ordered_scores : Array[Double]
  prediction_correct : Bool
} derive(Eq, Debug)

///|
/// Summarizes one OvR classifier's scores on positive and negative rows.
pub struct ClassScoreProfile {
  profiled_class : Int
  positive_observations : Int
  negative_observations : Int
  positive_score_minimum : Double
  positive_score_maximum : Double
  positive_score_mean : Double
  negative_score_minimum : Double
  negative_score_maximum : Double
  negative_score_mean : Double
  mean_score_separation : Double
} derive(Eq, Debug)

///|
/// Aggregates row-level prediction evidence and class-score separation.
pub struct PredictionAudit {
  audited_observations : Array[PredictionObservation]
  audited_class_profiles : Array[ClassScoreProfile]
  audit_metrics : ClassificationMetrics
  correct_prediction_count : Int
  incorrect_prediction_count : Int
  smallest_winning_margin : Double
  largest_winning_margin : Double
  average_winning_margin : Double
} derive(Eq, Debug)