use scirs2_core::random::prelude::*;
use scirs2_core::random::rngs::SmallRng;
use scirs2_neural::utils::colors::ColorOptions;
use scirs2_neural::utils::evaluation::ConfusionMatrix;
#[allow(dead_code)]
fn main() {
let mut rng = SmallRng::from_seed([42; 32]);
let num_classes = 5;
let mut matrix = vec![vec![0; num_classes]; num_classes];
#[allow(clippy::needless_range_loop)]
for i in 0..num_classes {
matrix[i][i] = 70 + rng.random_range(0..15); }
matrix[0][1] = 25;
matrix[1][0] = 15;
matrix[2][3] = 18;
matrix[4][0] = 8;
matrix[4][1] = 5;
matrix[4][2] = 10;
matrix[4][3] = 12;
#[allow(clippy::needless_range_loop)]
for i in 0..num_classes {
for j in 0..num_classes {
if i != j && matrix[i][j] == 0 {
matrix[i][j] = rng.random_range(0..5);
}
}
}
let flat_matrix: Vec<f64> = matrix.iter().flatten().map(|&x| x as f64).collect();
let ndarray_matrix =
scirs2_core::ndarray::Array::from_shape_vec((num_classes, num_classes), flat_matrix)
.expect("Operation failed");
let class_labels = vec![
"Class A".to_string(),
"Class B".to_string(),
"Class C".to_string(),
"Class D".to_string(),
"Class E".to_string(),
];
let cm =
ConfusionMatrix::from_matrix(ndarray_matrix, Some(class_labels)).expect("Operation failed");
println!("Example 1: Standard Confusion Matrix\n");
let regular_output = cm.to_ascii(Some("Classification Results"), false);
println!("{regular_output}");
println!("\n\nExample 2: Standard Heatmap Visualization\n");
let color_options = ColorOptions {
enabled: true,
use_bright: true,
use_background: false,
};
let heatmap_output = cm.to_heatmap_with_options(
Some("Classification Heatmap"),
true, &color_options,
);
println!("{heatmap_output}");
println!("\n\nExample 3: Error Pattern Heatmap (highlighting misclassifications)\n");
let error_heatmap = cm.error_heatmap(Some("Misclassification Analysis"));
println!("{error_heatmap}");
}