use super::super::*;
#[test]
fn f021_no_nan_features() {
let features = TunerFeatures::builder()
.model_params_b(1.5)
.hidden_dim(1536)
.batch_size(4)
.quant_type(QuantType::Q4K)
.build();
let v = features.to_vector();
assert!(!v.iter().any(|x| x.is_nan()), "Features contain NaN");
}
#[test]
fn f022_no_infinite_features() {
let features =
TunerFeatures::builder().model_params_b(1.5).hidden_dim(1536).batch_size(4).build();
let v = features.to_vector();
assert!(!v.iter().any(|x| x.is_infinite()), "Features contain infinity");
}
#[test]
fn f023_features_in_0_1_range() {
let features = TunerFeatures::builder()
.model_params_b(100.0) .hidden_dim(16384) .batch_size(64) .seq_len(32768) .build();
let v = features.to_vector();
for (i, x) in v.iter().enumerate() {
assert!(*x >= -0.001 && *x <= 1.001, "Feature {} = {} is outside [0, 1]", i, x);
}
}
#[test]
fn f026_roofline_bound() {
let model_params_b: f32 = 7.0;
let bytes_per_param: f32 = QuantType::Q4K.bytes_per_param();
let gpu_mem_bw_gbs: f32 = 1008.0;
let model_bytes: f32 = model_params_b * bytes_per_param * 1e9;
let theoretical_max_tps: f32 = (gpu_mem_bw_gbs * 1e9) / model_bytes;
let features = TunerFeatures::builder()
.model_params_b(model_params_b)
.batch_size(1)
.quant_type(QuantType::Q4K)
.gpu_mem_bw_gbs(gpu_mem_bw_gbs)
.gpu_compute_tflops(82.6) .is_prefill(false) .build();
let tuner = BrickTuner::new();
let rec = tuner.recommend(&features);
let margin = 1.10;
assert!(
rec.throughput.predicted_tps <= theoretical_max_tps * margin,
"Roofline violation: predicted {} tok/s exceeds theoretical max {} tok/s \
(model: {}B, quant: Q4K, mem_bw: {} GB/s)",
rec.throughput.predicted_tps,
theoretical_max_tps,
model_params_b,
gpu_mem_bw_gbs
);
assert!(
theoretical_max_tps > 100.0 && theoretical_max_tps < 500.0,
"Theoretical max {} tok/s is outside expected range for 7B Q4_K on RTX 4090",
theoretical_max_tps
);
}
#[test]
fn f029_onehot_sums_to_one() {
let features = TunerFeatures::builder()
.quant_type(QuantType::Q4K)
.kernel_type(KernelType::VectorizedQ4K)
.build();
let quant_sum: f32 = features.quant_type_onehot.iter().sum();
let kernel_sum: f32 = features.kernel_type_onehot.iter().sum();
assert!((quant_sum - 1.0).abs() < 0.001, "Quant one-hot sum = {}", quant_sum);
assert!((kernel_sum - 1.0).abs() < 0.001, "Kernel one-hot sum = {}", kernel_sum);
}
#[test]
fn f040_feature_dimension_is_42() {
assert_eq!(TunerFeatures::DIM, 42, "DIM must be 42 per spec v1.1.0");
let features = TunerFeatures::builder().build();
assert_eq!(features.to_vector().len(), TunerFeatures::DIM);
}