use tempfile::TempDir;
use torsh_tensor::Tensor;
use torsh_utils::mobile_optimizer::*;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_mobile_optimization_pipeline() {
let _temp_dir = TempDir::new().unwrap();
let config = MobileOptimizerConfig {
quantize: true,
quantization_strategy: QuantizationStrategy::StaticInt8,
fuse_ops: true,
remove_dropout: true,
fold_bn: true,
optimize_for_inference: true,
backend: MobileBackend::Cpu,
platform_optimization: PlatformOptimization::None,
size_optimization: SizeOptimizationConfig {
pruning: true,
pruning_sparsity: 0.1,
weight_sharing: false,
weight_clusters: 16,
layer_compression: true,
compression_ratio: 0.8,
knowledge_distillation: false,
teacher_model_path: None,
},
preserve_layers: vec![],
custom_passes: vec![],
};
assert!(config.quantize);
assert!(config.fuse_ops);
assert!(config.optimize_for_inference);
}
#[test]
fn test_tensor_quantization() {
let tensor_data: Vec<f32> = (0..100).map(|i| i as f32 / 10.0).collect();
let tensor = Tensor::from_vec(tensor_data, &[10, 10]).unwrap();
let _strategy = QuantizationStrategy::StaticInt8;
assert_eq!(tensor.shape().dims(), &[10, 10]);
assert_eq!(tensor.shape().numel(), 100);
}
#[test]
fn test_mobile_platforms() {
let ios_platform = MobilePlatform::iOS {
chip: "A17 Pro".to_string(),
neural_engine: true,
};
let android_platform = MobilePlatform::Android {
soc: "Snapdragon 8 Gen 3".to_string(),
npu_available: true,
};
let other_platform = MobilePlatform::Other("Custom SoC".to_string());
match ios_platform {
MobilePlatform::iOS { neural_engine, .. } => assert!(neural_engine),
_ => panic!("Expected iOS platform"),
}
match android_platform {
MobilePlatform::Android { npu_available, .. } => assert!(npu_available),
_ => panic!("Expected Android platform"),
}
match other_platform {
MobilePlatform::Other(name) => assert_eq!(name, "Custom SoC"),
_ => panic!("Expected Other platform"),
}
}
#[test]
fn test_cpu_info() {
let cpu_info = CpuInfo {
cores_performance: 4,
cores_efficiency: 4,
max_frequency_ghz: 3.2,
cache_l1_kb: 128,
cache_l2_kb: 4096,
cache_l3_kb: Some(16384),
};
assert_eq!(cpu_info.cores_performance, 4);
assert_eq!(cpu_info.cores_efficiency, 4);
assert!(cpu_info.max_frequency_ghz > 3.0);
assert!(cpu_info.cache_l3_kb.is_some());
}
#[test]
fn test_memory_info() {
let memory_info = MemoryInfo {
total_mb: 8192,
bandwidth_gb_s: 68.25,
memory_type: "LPDDR5".to_string(),
};
assert_eq!(memory_info.total_mb, 8192);
assert!(memory_info.bandwidth_gb_s > 60.0);
assert_eq!(memory_info.memory_type, "LPDDR5");
}
#[test]
fn test_benchmark_results() {
let benchmark_results = BenchmarkResults {
avg_latency_ms: 15.5,
min_latency_ms: 12.0,
max_latency_ms: 20.0,
memory_usage_mb: 128.0,
power_usage_mw: Some(2500.0),
};
assert!(benchmark_results.avg_latency_ms < 20.0);
assert!(benchmark_results.min_latency_ms < benchmark_results.avg_latency_ms);
assert!(benchmark_results.max_latency_ms > benchmark_results.avg_latency_ms);
assert!(benchmark_results.power_usage_mw.is_some());
}
fn simple_quantize_tensor(
tensor: &Tensor,
_strategy: QuantizationStrategy,
) -> Result<Tensor, Box<dyn std::error::Error>> {
let values: Vec<f32> = vec![0.0; tensor.shape().numel()];
Ok(Tensor::from_vec(values, tensor.shape().dims())?)
}
#[test]
fn test_quantize_return_type() {
let tensor_data: Vec<f32> = vec![1.0, 2.0, 3.0, 4.0];
let tensor = Tensor::from_vec(tensor_data, &[2, 2]).unwrap();
let result = simple_quantize_tensor(&tensor, QuantizationStrategy::StaticInt8);
assert!(result.is_ok());
let quantized = result.unwrap();
assert_eq!(quantized.shape(), tensor.shape());
}
}