1pub mod config;
100pub use config::*;
101
102pub mod algorithms;
104pub use algorithms::*;
105
106pub mod observers;
108pub use observers::*;
109
110pub mod specialized;
116pub use specialized::*;
117
118pub mod metrics;
124pub use metrics::*;
125
126pub mod analysis;
128pub use analysis::*;
129
130pub mod memory_pool;
132pub use memory_pool::*;
133
134pub mod simd_ops;
136pub use simd_ops::{
138 calculate_tensor_stats_simd, dequantize_per_tensor_affine_simd, find_min_max_simd,
139 get_mobile_optimization_hints, get_simd_width, is_simd_available,
140 quantize_batch_consistent_simd, quantize_mobile_optimized, quantize_per_channel_simd,
141 quantize_per_tensor_affine_simd, quantize_to_int8_simd, MobileOptimizationHints,
142 TensorStats as SimdTensorStats,
143};
144
145#[cfg(target_arch = "aarch64")]
147pub use simd_ops::{find_min_max_neon, quantize_neon_optimized};
148
149pub mod quantum;
155pub use quantum::*;
156
157pub mod quantum_enhanced;
159pub use quantum_enhanced::*;
160
161pub mod benchmarks;
163pub use benchmarks::{
164 BaselineMetrics, BenchmarkConfig as SuiteBenchmarkConfig,
165 BenchmarkResult as SuiteBenchmarkResult, HardwareInfo, QuantizationBenchmarkSuite,
166};
167
168pub mod utils;
174pub use utils::*;
175
176pub mod auto_config;
178pub use auto_config::*;
179
180#[cfg(feature = "experimental")]
188pub mod quantize;
189
190#[cfg(feature = "experimental")]
192pub mod dequantize;
193
194#[cfg(feature = "experimental")]
196pub mod advanced;
197
198#[cfg(feature = "experimental")]
200pub mod compression;
201
202#[cfg(feature = "experimental")]
204pub mod fake_quantize;
205
206#[cfg(feature = "experimental")]
208pub mod qat;
209
210#[cfg(feature = "experimental")]
212pub mod post_training;
213
214#[cfg(feature = "experimental")]
216pub mod optimizer;
217
218#[cfg(feature = "experimental")]
220pub mod realtime_adaptive;
221
222#[cfg(feature = "experimental")]
224pub mod hardware;
225
226#[cfg(feature = "experimental")]
228pub mod fusion;
229
230#[cfg(feature = "experimental")]
232pub mod profiler;
233
234#[cfg(feature = "experimental")]
236pub mod debugging;
237
238#[cfg(feature = "experimental")]
240pub mod neural_codecs;
241
242#[cfg(feature = "experimental")]
244pub mod research;
245
246#[cfg(feature = "experimental")]
248pub mod export;
249
250pub use torsh_core::{error::Result as TorshResult, DType, TorshError};
252pub use torsh_tensor::Tensor;
253
254pub const VERSION: &str = env!("CARGO_PKG_VERSION");
256pub const VERSION_MAJOR: u32 = 0;
257pub const VERSION_MINOR: u32 = 1;
258pub const VERSION_PATCH: u32 = 0;
259
260pub mod prelude {
262 pub use crate::algorithms::*;
263 pub use crate::analysis::*;
264 pub use crate::auto_config::*;
265 pub use crate::config::*;
266 pub use crate::memory_pool::*;
267 pub use crate::metrics::*;
268 pub use crate::observers::*;
269 pub use crate::specialized::*;
270 pub use crate::utils::*;
271}
272
273#[cfg(test)]
274mod tests {
275 use super::*;
276 use torsh_tensor::creation::tensor_1d;
277
278 #[test]
279 fn test_basic_quantization_workflow() {
280 let data = vec![0.0, 1.0, 2.0, 3.0];
281 let tensor = tensor_1d(&data).unwrap();
282
283 let config = QuantConfig::int8();
285 let result = quantize_with_config(&tensor, &config);
286 assert!(result.is_ok());
287
288 let (quantized, scale, zero_point) = result.unwrap();
289 let quantized_data = quantized.data().unwrap();
291 let all_in_range = quantized_data.iter().all(|&x| x >= -128.0 && x <= 127.0);
292 assert!(
293 all_in_range,
294 "Quantized values should be in I8 range [-128, 127]"
295 );
296 assert!(scale > 0.0);
297
298 let dequantized = dequantize(&quantized, scale, zero_point).unwrap();
300 assert_eq!(dequantized.dtype(), DType::F32);
301 }
302
303 #[test]
304 fn test_configuration_validation() {
305 let valid_config = QuantConfig::int8();
306 assert!(valid_config.validate().is_ok());
307
308 let per_channel_config = QuantConfig::per_channel(0);
309 assert!(per_channel_config.validate().is_ok());
310 }
311
312 #[test]
313 fn test_specialized_quantization() {
314 let data = vec![0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0];
315 let _tensor = tensor_1d(&data).unwrap();
316
317 let int4_config = QuantConfig::int4();
319 assert!(int4_config.validate().is_ok());
320
321 let binary_config = QuantConfig::binary();
323 assert!(binary_config.validate().is_ok());
324
325 let ternary_config = QuantConfig::ternary();
327 assert!(ternary_config.validate().is_ok());
328 }
329
330 #[test]
331 fn test_utils_functionality() {
332 let data = vec![0.0, 1.0, 2.0, 3.0];
333 let tensor = tensor_1d(&data).unwrap();
334 let config = QuantConfig::int8();
335
336 let suggestions = validate_config_with_suggestions(&config).unwrap();
338 assert!(suggestions.len() > 0);
339
340 let hints = get_optimization_hints(&tensor, &config);
342 assert!(hints.is_empty() || !hints.is_empty());
344
345 let json = export_config_to_json(&config).unwrap();
347 let imported_config = import_config_from_json(&json).unwrap();
348 assert_eq!(config.dtype, imported_config.dtype);
349 assert_eq!(config.scheme, imported_config.scheme);
350 }
351
352 #[test]
353 fn test_batch_processing() {
354 let data1 = vec![0.0, 1.0, 2.0, 3.0];
355 let data2 = vec![4.0, 5.0, 6.0, 7.0];
356 let tensor1 = tensor_1d(&data1).unwrap();
357 let tensor2 = tensor_1d(&data2).unwrap();
358
359 let tensors = vec![&tensor1, &tensor2];
360 let config = QuantConfig::int8();
361
362 let results = quantize_batch_consistent(&tensors, &config).unwrap();
363 assert_eq!(results.len(), 2);
364
365 let (_, scale1, zp1) = &results[0];
367 let (_, scale2, zp2) = &results[1];
368 assert_eq!(scale1, scale2);
369 assert_eq!(zp1, zp2);
370 }
371
372 #[test]
373 fn test_metrics_calculation() {
374 let data = vec![0.0, 1.0, 2.0, 3.0];
375 let tensor = tensor_1d(&data).unwrap();
376 let config = QuantConfig::int8();
377
378 let (quantized, scale, zero_point) = quantize_with_config(&tensor, &config).unwrap();
379 let dequantized = dequantize(&quantized, scale, zero_point).unwrap();
380
381 let metrics = calculate_quantization_metrics(&tensor, &dequantized, 32, 8).unwrap();
382
383 assert!(metrics.psnr > 0.0);
384 assert!(metrics.snr > 0.0);
385 assert!(metrics.compression_ratio > 1.0);
386 assert!(metrics.cosine_similarity >= 0.0 && metrics.cosine_similarity <= 1.0);
387 }
388
389 #[test]
390 fn test_configuration_comparison() {
391 let data = vec![0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0];
392 let tensor = tensor_1d(&data).unwrap();
393
394 let configs = vec![
395 QuantConfig::int8(),
396 QuantConfig::per_channel(0),
397 QuantConfig::int4(),
398 ];
399
400 let comparison = compare_quantization_configs(&tensor, &configs).unwrap();
401 assert_eq!(comparison.len(), 3);
402
403 for i in 1..comparison.len() {
405 assert!(comparison[i - 1].1.psnr >= comparison[i].1.psnr);
406 }
407 }
408
409 #[test]
410 fn test_auto_calibration() {
411 let data1 = vec![0.0, 1.0, 2.0, 3.0];
412 let data2 = vec![4.0, 5.0, 6.0, 7.0];
413 let tensor1 = tensor_1d(&data1).unwrap();
414 let tensor2 = tensor_1d(&data2).unwrap();
415
416 let calibration_tensors = vec![&tensor1, &tensor2];
417 let target_psnr = 30.0;
418 let max_compression = 8.0;
419
420 let optimal_config =
421 auto_calibrate_quantization(&calibration_tensors, target_psnr, max_compression)
422 .unwrap();
423
424 assert!(optimal_config.validate().is_ok());
425 }
426
427 #[test]
428 fn test_report_generation() {
429 let data = vec![0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0];
430 let tensor = tensor_1d(&data).unwrap();
431
432 let configs = vec![QuantConfig::int8(), QuantConfig::int4()];
433
434 let report = generate_quantization_report(&tensor, &configs).unwrap();
435
436 assert!(report.contains("# Quantization Analysis Report"));
438 assert!(report.contains("## Quantization Configuration Comparison"));
439 assert!(report.contains("## Detailed Metrics"));
440 assert!(report.contains("## Recommendations"));
441 }
442
443 #[test]
444 fn test_error_diagnostics() {
445 let data = vec![0.0, 1.0, 2.0, 3.0];
446 let tensor = tensor_1d(&data).unwrap();
447 let config = QuantConfig::int8();
448
449 let error = TorshError::InvalidArgument("Test error".to_string());
451 let diagnosis = diagnose_quantization_failure(&tensor, &config, &error);
452
453 assert!(diagnosis.contains("Quantization failed with error"));
454 assert!(diagnosis.contains("Tensor Analysis"));
455 assert!(diagnosis.contains("Configuration Analysis"));
456 assert!(diagnosis.contains("Recovery Suggestions"));
457 }
458
459 #[test]
460 fn test_optimized_config_creation() {
461 let inference_config = create_optimized_config("inference_cpu", "x86").unwrap();
463 assert!(inference_config.validate().is_ok());
464
465 let mobile_config = create_optimized_config("inference_mobile", "arm").unwrap();
466 assert!(mobile_config.validate().is_ok());
467
468 let training_config = create_optimized_config("training", "gpu").unwrap();
469 assert!(training_config.validate().is_ok());
470
471 let invalid_result = create_optimized_config("invalid_use_case", "x86");
473 assert!(invalid_result.is_err());
474 }
475}