use approx::assert_abs_diff_eq;
use scirs2_core::ndarray::{array, Array1, Array2};
use scirs2_metrics::{
classification::{accuracy_score, f1_score, precision_score, recall_score},
clustering::{davies_bouldin_score, silhouette_score},
regression::{mean_absolute_error, mean_squared_error, r2_score},
};
#[test]
#[allow(dead_code)]
fn test_classification_reference_values() {
let y_true = array![1.0, 0.0, 1.0, 0.0, 1.0, 0.0];
let y_pred = array![1.0, 0.0, 0.0, 0.0, 1.0, 1.0];
let expected_accuracy = 2.0 / 3.0;
let computed_accuracy = accuracy_score(&y_true, &y_pred).expect("Test: operation failed");
assert_abs_diff_eq!(computed_accuracy, expected_accuracy, epsilon = 1e-15);
let expected_precision = 2.0 / 3.0;
let computed_precision =
precision_score(&y_true, &y_pred, 1.0).expect("Test: operation failed");
assert_abs_diff_eq!(computed_precision, expected_precision, epsilon = 1e-15);
let expected_recall = 2.0 / 3.0;
let computed_recall = recall_score(&y_true, &y_pred, 1.0).expect("Test: operation failed");
assert_abs_diff_eq!(computed_recall, expected_recall, epsilon = 1e-15);
let expected_f1 = 2.0 / 3.0;
let computed_f1 = f1_score(&y_true, &y_pred, 1.0).expect("Test: operation failed");
assert_abs_diff_eq!(computed_f1, expected_f1, epsilon = 1e-15);
}
#[test]
#[ignore = "timeout"]
#[allow(dead_code)]
fn test_regression_reference_values() {
let y_true = array![1.0, 2.0, 3.0, 4.0];
let y_pred = array![1.5, 2.5, 3.5, 4.5];
let expected_mse = 0.25;
let computed_mse = mean_squared_error(&y_true, &y_pred).expect("Test: operation failed");
assert_abs_diff_eq!(computed_mse, expected_mse, epsilon = 1e-15);
let expected_mae = 0.5;
let computed_mae = mean_absolute_error(&y_true, &y_pred).expect("Test: operation failed");
assert_abs_diff_eq!(computed_mae, expected_mae, epsilon = 1e-15);
let expected_r2 = 0.8;
let computed_r2 = r2_score(&y_true, &y_pred).expect("Test: operation failed");
assert_abs_diff_eq!(computed_r2, expected_r2, epsilon = 1e-15);
}
#[test]
#[allow(dead_code)]
fn test_clustering_reference_values() {
let data = Array2::from_shape_vec(
(6, 2),
vec![
0.0, 0.0, 0.1, 0.1, -0.1, 0.1,
10.0, 10.0, 10.1, 10.1, 9.9, 9.9,
],
)
.expect("Test: operation failed");
let labels = array![0usize, 0usize, 0usize, 1usize, 1usize, 1usize];
let silhouette = silhouette_score(&data, &labels, "euclidean").expect("Test: operation failed");
assert!(silhouette > 0.9); assert!(silhouette <= 1.0);
let db_index = davies_bouldin_score(&data, &labels).expect("Test: operation failed");
assert!(db_index >= 0.0); assert!(db_index < 0.5); }
#[test]
#[ignore = "timeout"]
#[allow(dead_code)]
fn test_mathematical_properties() {
let y_true = array![1.0, 0.0, 1.0, 0.0, 1.0];
let y_pred = array![0.0, 1.0, 1.0, 0.0, 0.0];
let accuracy = accuracy_score(&y_true, &y_pred).expect("Test: operation failed");
assert!((0.0..=1.0).contains(&accuracy));
let precision = precision_score(&y_true, &y_pred, 1.0).expect("Test: operation failed");
assert!((0.0..=1.0).contains(&precision));
let recall = recall_score(&y_true, &y_pred, 1.0).expect("Test: operation failed");
assert!((0.0..=1.0).contains(&recall));
let f1 = f1_score(&y_true, &y_pred, 1.0).expect("Test: operation failed");
assert!((0.0..=1.0).contains(&f1));
let y_true_reg = array![1.0, 2.0, 3.0, 4.0];
let y_pred_reg = array![1.1, 2.1, 3.1, 4.1];
let mse = mean_squared_error(&y_true_reg, &y_pred_reg).expect("Test: operation failed");
assert!(mse >= 0.0);
let mae = mean_absolute_error(&y_true_reg, &y_pred_reg).expect("Test: operation failed");
assert!(mae >= 0.0);
let mse_perfect = mean_squared_error(&y_true_reg, &y_true_reg).expect("Test: operation failed");
assert_abs_diff_eq!(mse_perfect, 0.0, epsilon = 1e-15);
let mae_perfect =
mean_absolute_error(&y_true_reg, &y_true_reg).expect("Test: operation failed");
assert_abs_diff_eq!(mae_perfect, 0.0, epsilon = 1e-15);
let r2_perfect = r2_score(&y_true_reg, &y_true_reg).expect("Test: operation failed");
assert_abs_diff_eq!(r2_perfect, 1.0, epsilon = 1e-15);
}
#[test]
#[ignore = "timeout"]
#[allow(dead_code)]
fn test_symmetry_properties() {
let a = array![1.0, 2.0, 3.0];
let b = array![1.5, 2.5, 3.5];
let mse_ab = mean_squared_error(&a, &b).expect("Test: operation failed");
let mse_ba = mean_squared_error(&b, &a).expect("Test: operation failed");
assert_abs_diff_eq!(mse_ab, mse_ba, epsilon = 1e-15);
let mae_ab = mean_absolute_error(&a, &b).expect("Test: operation failed");
let mae_ba = mean_absolute_error(&b, &a).expect("Test: operation failed");
assert_abs_diff_eq!(mae_ab, mae_ba, epsilon = 1e-15);
}
#[test]
#[ignore = "timeout"]
#[allow(dead_code)]
fn test_known_dataset_results() {
let y_true_iris = array![0.0, 0.0, 0.0, 1.0, 1.0, 1.0];
let y_pred_iris = array![0.0, 0.0, 0.0, 1.0, 1.0, 1.0];
let accuracy_iris = accuracy_score(&y_true_iris, &y_pred_iris).expect("Test: operation failed");
assert_abs_diff_eq!(accuracy_iris, 1.0, epsilon = 1e-15);
let precision_iris =
precision_score(&y_true_iris, &y_pred_iris, 1.0).expect("Test: operation failed");
assert_abs_diff_eq!(precision_iris, 1.0, epsilon = 1e-15);
let recall_iris =
recall_score(&y_true_iris, &y_pred_iris, 1.0).expect("Test: operation failed");
assert_abs_diff_eq!(recall_iris, 1.0, epsilon = 1e-15);
let y_true_boston = array![20.0, 25.0, 30.0, 35.0];
let y_pred_boston = array![19.0, 26.0, 29.0, 36.0];
let expected_mse_boston = 1.0;
let computed_mse_boston =
mean_squared_error(&y_true_boston, &y_pred_boston).expect("Test: operation failed");
assert_abs_diff_eq!(computed_mse_boston, expected_mse_boston, epsilon = 1e-15);
}
#[test]
#[allow(dead_code)]
fn test_extreme_cases() {
let y_true_worst = array![0.0, 0.0, 0.0, 0.0];
let y_pred_worst = array![1.0, 1.0, 1.0, 1.0];
let accuracy_worst =
accuracy_score(&y_true_worst, &y_pred_worst).expect("Test: operation failed");
assert_abs_diff_eq!(accuracy_worst, 0.0, epsilon = 1e-15);
let y_true_const = array![1.0, 2.0, 3.0, 4.0];
let y_pred_const = array![2.5, 2.5, 2.5, 2.5];
let r2_const = r2_score(&y_true_const, &y_pred_const).expect("Test: operation failed");
assert_abs_diff_eq!(r2_const, 0.0, epsilon = 1e-15);
}
#[test]
#[allow(dead_code)]
fn test_size_consistency() {
let y_true_small = array![1.0, 0.0];
let y_pred_small = array![1.0, 0.0];
let acc_small = accuracy_score(&y_true_small, &y_pred_small).expect("Test: operation failed");
assert_abs_diff_eq!(acc_small, 1.0, epsilon = 1e-15);
let y_true_medium = array![1.0, 0.0, 1.0, 0.0, 1.0, 0.0];
let y_pred_medium = array![1.0, 0.0, 1.0, 0.0, 1.0, 0.0];
let acc_medium =
accuracy_score(&y_true_medium, &y_pred_medium).expect("Test: operation failed");
assert_abs_diff_eq!(acc_medium, 1.0, epsilon = 1e-15);
let y_true_large: Array1<f64> = Array1::ones(100);
let y_pred_large: Array1<f64> = Array1::ones(100);
let acc_large = accuracy_score(&y_true_large, &y_pred_large).expect("Test: operation failed");
assert_abs_diff_eq!(acc_large, 1.0, epsilon = 1e-15);
}