///|
pub(all) struct RepeatedClassificationValidation {
  repeat_means : Array[Double]
  fold_scores : Array[Double]
  mean_accuracy : Double
  standard_deviation : Double
  minimum_accuracy : Double
  maximum_accuracy : Double
} derive(Eq, Debug)

///|
pub(all) struct RepeatedRegressionValidation {
  repeat_mse : Array[Double]
  repeat_mae : Array[Double]
  fold_mse : Array[Double]
  fold_mae : Array[Double]
  mean_mse : Double
  mean_mae : Double
  mse_standard_deviation : Double
  mae_standard_deviation : Double
} derive(Eq, Debug)

///|
pub(all) struct ClassificationPruningCandidate {
  alpha : Double
  mean_accuracy : Double
  node_count : Int
  leaf_count : Int
} derive(Eq, Debug)

///|
pub(all) struct ClassificationPruningSelection {
  best_alpha : Double
  best_accuracy : Double
  model : ClassificationTree
  candidates : Array[ClassificationPruningCandidate]
} derive(Eq, Debug)

///|
pub(all) struct RegressionPruningCandidate {
  alpha : Double
  mean_mse : Double
  mean_mae : Double
  node_count : Int
  leaf_count : Int
} derive(Eq, Debug)

///|
pub(all) struct RegressionPruningSelection {
  best_alpha : Double
  best_mse : Double
  best_mae : Double
  model : RegressionTree
  candidates : Array[RegressionPruningCandidate]
} derive(Eq, Debug)