#![allow(clippy::disallowed_methods, clippy::float_cmp)]
use cbtop::{
ClassificationResult, RecommendedBackend, WorkloadCategory, WorkloadCharacterizer,
WorkloadFeatures,
};
#[test]
fn f1271_feature_extraction() {
let characterizer = WorkloadCharacterizer::new();
let features = characterizer.extract_features(
1_000_000.0, 100_000.0, 1_000_000, 100_000, );
assert_eq!(features.arithmetic_intensity, 10.0); assert_eq!(features.memory_footprint, 1_000_000);
}
#[test]
fn f1271_feature_to_vec() {
let features = WorkloadFeatures::new()
.with_intensity(5.0)
.with_compute_density(4.0);
let vec = features.to_vec();
assert_eq!(vec[0], 5.0); assert_eq!(vec[4], 4.0); }
#[test]
fn f1272_gemm_classification() {
let characterizer = WorkloadCharacterizer::new();
let features = WorkloadFeatures::new()
.with_intensity(45.0)
.with_compute_density(7.0)
.with_data_reuse(30.0)
.with_branch_rate(0.01);
let result = characterizer.classify(&features);
assert_eq!(result.category, WorkloadCategory::Gemm);
}
#[test]
fn f1272_gemm_is_compute_bound() {
assert!(WorkloadCategory::Gemm.is_compute_bound());
assert!(!WorkloadCategory::Gemm.is_memory_bound());
}
#[test]
fn f1273_bandwidth_classification() {
let characterizer = WorkloadCharacterizer::new();
let features = WorkloadFeatures::new()
.with_intensity(0.2)
.with_compute_density(0.5)
.with_access_pattern(1.0)
.with_data_reuse(1.0);
let result = characterizer.classify(&features);
assert_eq!(result.category, WorkloadCategory::Bandwidth);
}
#[test]
fn f1273_bandwidth_is_memory_bound() {
assert!(WorkloadCategory::Bandwidth.is_memory_bound());
assert!(!WorkloadCategory::Bandwidth.is_compute_bound());
}
#[test]
fn f1274_attention_classification() {
let characterizer = WorkloadCharacterizer::new();
let features = WorkloadFeatures::new()
.with_intensity(4.5)
.with_compute_density(3.8)
.with_access_pattern(0.6)
.with_data_reuse(4.0);
let result = characterizer.classify(&features);
assert_eq!(result.category, WorkloadCategory::Attention);
}
#[test]
fn f1274_attention_intensity_range() {
let (low, high) = WorkloadCategory::Attention.typical_intensity_range();
assert!(low < high);
assert!(low >= 1.0);
assert!(high <= 20.0);
}
#[test]
fn f1275_similarity_range() {
let characterizer = WorkloadCharacterizer::new();
let a = WorkloadFeatures::new().with_intensity(10.0);
let b = WorkloadFeatures::new().with_intensity(20.0);
let sim = characterizer.workload_similarity(&a, &b);
assert!((0.0..=1.0).contains(&sim));
}
#[test]
fn f1275_identical_similarity() {
let characterizer = WorkloadCharacterizer::new();
let a = WorkloadFeatures::new().with_intensity(10.0);
let b = WorkloadFeatures::new().with_intensity(10.0);
let sim = characterizer.workload_similarity(&a, &b);
assert!(sim > 0.99);
}
#[test]
fn f1275_cosine_similarity() {
let a = WorkloadFeatures::new()
.with_intensity(10.0)
.with_compute_density(5.0);
let b = WorkloadFeatures::new()
.with_intensity(20.0)
.with_compute_density(10.0);
let sim = a.cosine_similarity(&b);
assert!((-1.0..=1.0).contains(&sim));
}
#[test]
fn f1276_unknown_workload() {
let characterizer = WorkloadCharacterizer::new();
let features = WorkloadFeatures::new()
.with_intensity(1000.0) .with_compute_density(100.0);
let result = characterizer.classify(&features);
assert!(result.category != WorkloadCategory::Unknown || result.confidence < 0.5);
}
#[test]
fn f1276_classification_confidence() {
let characterizer = WorkloadCharacterizer::new();
let features = WorkloadFeatures::new().with_intensity(50.0);
let result = characterizer.classify(&features);
assert!(result.confidence >= 0.0 && result.confidence <= 1.0);
}
#[test]
fn f1277_backend_small_size() {
let characterizer = WorkloadCharacterizer::new();
let backend = characterizer.recommend_backend(WorkloadCategory::Gemm, 1000);
assert_eq!(backend, RecommendedBackend::CpuSimd);
}
#[test]
fn f1277_backend_large_size() {
let characterizer = WorkloadCharacterizer::new();
let backend = characterizer.recommend_backend(WorkloadCategory::Gemm, 1_000_000);
assert_eq!(backend, RecommendedBackend::Gpu);
}
#[test]
fn f1277_backend_names() {
assert_eq!(RecommendedBackend::CpuSimd.name(), "cpu_simd");
assert_eq!(RecommendedBackend::Gpu.name(), "gpu");
assert_eq!(RecommendedBackend::Either.name(), "either");
}
#[test]
fn f1278_crossover_point() {
let characterizer = WorkloadCharacterizer::new();
let crossover = characterizer.predict_crossover(WorkloadCategory::Gemm);
assert!(crossover.is_some());
assert!(crossover.unwrap() > 0);
}
#[test]
fn f1278_gpu_crossover_in_result() {
let characterizer = WorkloadCharacterizer::new();
let features = WorkloadFeatures::new().with_intensity(50.0);
let result = characterizer.classify(&features);
assert!(result.gpu_crossover_size.is_some());
}
#[test]
fn f1279_feature_normalization() {
let features = WorkloadFeatures::new()
.with_intensity(10.0)
.with_compute_density(5.0);
let means = vec![10.0, 0.0, 0.0, 0.5, 5.0, 0.0, 1.0];
let stds = vec![2.0, 1.0, 1.0, 0.2, 1.0, 0.1, 0.5];
let normalized = features.normalize(&means, &stds);
assert!((normalized[0] - 0.0).abs() < 0.001);
assert!((normalized[4] - 0.0).abs() < 0.001);
}
#[test]
fn f1280_confidence_probability() {
let characterizer = WorkloadCharacterizer::new();
let features = WorkloadFeatures::new().with_intensity(50.0);
let result = characterizer.classify(&features);
assert!(result.confidence >= 0.0);
assert!(result.confidence <= 1.0);
}
#[test]
fn f1280_is_confident() {
let result = ClassificationResult {
category: WorkloadCategory::Gemm,
confidence: 0.8,
distance: 5.0,
recommended_backend: RecommendedBackend::Gpu,
gpu_crossover_size: Some(10000),
};
assert!(result.is_confident());
let low_conf = ClassificationResult {
confidence: 0.5,
..result
};
assert!(!low_conf.is_confident());
}
#[test]
fn test_category_names() {
assert_eq!(WorkloadCategory::Gemm.name(), "gemm");
assert_eq!(WorkloadCategory::Bandwidth.name(), "bandwidth");
assert_eq!(WorkloadCategory::Attention.name(), "attention");
assert_eq!(WorkloadCategory::Conv2d.name(), "conv2d");
assert_eq!(WorkloadCategory::Elementwise.name(), "elementwise");
assert_eq!(WorkloadCategory::Reduction.name(), "reduction");
assert_eq!(WorkloadCategory::Unknown.name(), "unknown");
}
#[test]
fn test_feature_distance() {
let a = WorkloadFeatures::new().with_intensity(10.0);
let b = WorkloadFeatures::new().with_intensity(20.0);
let dist = a.distance(&b);
assert!(dist > 0.0);
}
#[test]
fn test_add_prototype() {
let mut characterizer = WorkloadCharacterizer::new();
let initial_count = characterizer.get_prototypes().len();
characterizer.add_prototype(
WorkloadCategory::Unknown,
WorkloadFeatures::new().with_intensity(100.0),
);
assert_eq!(characterizer.get_prototypes().len(), initial_count + 1);
}
#[test]
fn test_conv2d_classification() {
let characterizer = WorkloadCharacterizer::new();
let features = WorkloadFeatures::new()
.with_intensity(18.0)
.with_compute_density(5.5)
.with_access_pattern(0.7)
.with_data_reuse(8.0);
let result = characterizer.classify(&features);
assert_eq!(result.category, WorkloadCategory::Conv2d);
}
#[test]
fn test_elementwise_classification() {
let characterizer = WorkloadCharacterizer::new();
let features = WorkloadFeatures::new()
.with_intensity(0.12)
.with_compute_density(1.0)
.with_access_pattern(1.0)
.with_data_reuse(1.0);
let result = characterizer.classify(&features);
assert_eq!(result.category, WorkloadCategory::Elementwise);
}