///|
/// Describes rejected data, invalid configurations, and failed SVM operations.
pub(all) enum SvmError {
  EmptyDataset
  EmptyFeatureSet
  RaggedRow(Int, Int, Int)
  LabelLengthMismatch(Int, Int)
  NonFiniteFeature(Int, Int)
  SingleClassDataset
  InvalidSubsetIndex(Int, Int)
  DuplicateSubsetIndex(Int)
  InvalidKernelParameter(String, Double)
  KernelDimensionMismatch(Int, Int)
  InvalidConfiguration(String, Double)
  InvalidIterationCount(Int)
  InvalidWeight(Int, Double)
  WeightLengthMismatch(Int, Int)
  InvalidClassWeight(Int, Double)
  DuplicateClassWeight(Int)
  ZeroEffectiveWeight
  InvalidBinaryClassCount(Int)
  PredictionDimensionMismatch(Int, Int)
  TrainingDidNotConverge(Int)
  NumericFailure(String)
  InvalidFoldCount(Int)
  InsufficientClassSamples(Int, Int, Int)
  EmptyMetricInput
  MetricLengthMismatch(Int, Int)
  UnknownClassLabel(Int)
  InvalidCandidateCount(Int)
  NoValidCandidate
  NonFiniteReportValue(String)
} derive(Eq, Debug)

///|
/// Returns a stable machine-readable category for an error.
pub fn error_code(error : SvmError) -> String {
  match error {
    EmptyDataset => "empty_dataset"
    EmptyFeatureSet => "empty_feature_set"
    RaggedRow(_, _, _) => "ragged_row"
    LabelLengthMismatch(_, _) => "label_length_mismatch"
    NonFiniteFeature(_, _) => "nonfinite_feature"
    SingleClassDataset => "single_class_dataset"
    InvalidSubsetIndex(_, _) => "invalid_subset_index"
    DuplicateSubsetIndex(_) => "duplicate_subset_index"
    InvalidKernelParameter(_, _) => "invalid_kernel_parameter"
    KernelDimensionMismatch(_, _) => "kernel_dimension_mismatch"
    InvalidConfiguration(_, _) => "invalid_configuration"
    InvalidIterationCount(_) => "invalid_iteration_count"
    InvalidWeight(_, _) => "invalid_weight"
    WeightLengthMismatch(_, _) => "weight_length_mismatch"
    InvalidClassWeight(_, _) => "invalid_class_weight"
    DuplicateClassWeight(_) => "duplicate_class_weight"
    ZeroEffectiveWeight => "zero_effective_weight"
    InvalidBinaryClassCount(_) => "invalid_binary_class_count"
    PredictionDimensionMismatch(_, _) => "prediction_dimension_mismatch"
    TrainingDidNotConverge(_) => "training_did_not_converge"
    NumericFailure(_) => "numeric_failure"
    InvalidFoldCount(_) => "invalid_fold_count"
    InsufficientClassSamples(_, _, _) => "insufficient_class_samples"
    EmptyMetricInput => "empty_metric_input"
    MetricLengthMismatch(_, _) => "metric_length_mismatch"
    UnknownClassLabel(_) => "unknown_class_label"
    InvalidCandidateCount(_) => "invalid_candidate_count"
    NoValidCandidate => "no_valid_candidate"
    NonFiniteReportValue(_) => "nonfinite_report_value"
  }
}