///|
/// Selects fold-local feature preprocessing for validation.
pub(all) enum ScalingPlan {
  NoScaling
  StandardScaling
  MinMaxScaling(Double, Double)
} derive(Eq, Debug)

///|
/// Stores complete evidence for one held-out fold.
pub struct FoldEvaluation {
  fold_number : Int
  training_rows : Array[Int]
  testing_rows : Array[Int]
  actual_labels : Array[Int]
  predicted_labels : Array[Int]
  fold_metrics : ClassificationMetrics
  fitted_scaler : FeatureScaler?
} derive(Eq, Debug)

///|
/// Stores all fold evidence and aggregate held-out metrics.
pub struct ValidationReport {
  fold_evaluations : Array[FoldEvaluation]
  aggregate_metrics : ClassificationMetrics
  evaluated_observations : Int
  scaling_plan : ScalingPlan
} derive(Eq, Debug)