///|
/// Selects the held-out metric maximized during candidate search.
pub(all) enum SelectionMetric {
  SelectAccuracy
  SelectBalancedAccuracy
  SelectMacroF1
  SelectWeightedF1
} derive(Eq, Debug)

///|
/// Names one explicit training and preprocessing candidate.
pub struct SvmCandidate {
  candidate_name : String
  binary_configuration : BinaryConfig
  candidate_scaling : ScalingPlan
} derive(Eq, Debug)

///|
/// Stores one successfully evaluated candidate.
pub struct CandidateEvaluation {
  original_index : Int
  evaluated_name : String
  metric_score : Double
  validation_report : ValidationReport
} derive(Eq, Debug)

///|
/// Stores one candidate's typed evaluation failure.
pub struct CandidateFailure {
  original_index : Int
  failed_name : String
  failure_error : SvmError
} derive(Eq, Debug)

///|
/// Stores candidate evidence and a full-data refit of the selected workflow.
pub struct SearchResult {
  successful_candidates : Array[CandidateEvaluation]
  failed_candidates : Array[CandidateFailure]
  selected_original_index : Int
  selected_name : String
  selected_score : Double
  selected_metric : SelectionMetric
  selected_validation : ValidationReport
  selected_model : MulticlassModel
  selected_scaler : FeatureScaler?
} derive(Eq, Debug)