use crate::{Result, SuperAPQ, SuperAPQConfig};
use serde::{Deserialize, Serialize};
use sha2::Digest;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QuantizationResult {
pub chunks: Vec<QuantizedChunk>,
pub metadata: QuantizationMetadata,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QuantizedChunk {
pub id: String,
pub data: Vec<u8>,
pub size: usize,
pub sha256: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QuantizationMetadata {
pub model_id: String,
pub target_bits: u8,
pub layer_count: usize,
pub total_params: usize,
pub compression_ratio: f32,
}
pub struct ApqQuantizer {
super_apq: SuperAPQ,
}
impl ApqQuantizer {
pub fn new(config: crate::ApqConfig) -> Self {
let super_config = SuperAPQConfig::default();
Self {
super_apq: SuperAPQ::new(super_config),
}
}
pub fn quantize_model(&mut self, model_path: &str) -> Result<QuantizationResult> {
println!("🚀 Using Super-APQ for 1000x compression...");
let super_result = self.super_apq.quantize_model(model_path)?;
let chunk = QuantizedChunk {
id: "super_chunk_000".to_string(),
data: super_result.compressed_model.data.clone(),
size: super_result.compressed_model.metadata.compressed_size,
sha256: format!("{:x}", sha2::Sha256::digest(&super_result.compressed_model.data)),
};
let metadata = QuantizationMetadata {
model_id: model_path.to_string(),
target_bits: 2, layer_count: super_result.architecture.layers,
total_params: super_result.compressed_model.metadata.original_size / 4,
compression_ratio: super_result.compressed_model.metadata.compression_ratio,
};
Ok(QuantizationResult {
chunks: vec![chunk],
metadata,
})
}
pub fn verify_determinism(&mut self, model_path: &str, runs: usize) -> Result<bool> {
let mut results = Vec::new();
for _ in 0..runs {
let result = self.quantize_model(model_path)?;
results.push(result);
}
let first = &results[0];
for result in results.iter().skip(1) {
if result.chunks.len() != first.chunks.len() {
return Ok(false);
}
for (chunk1, chunk2) in result.chunks.iter().zip(first.chunks.iter()) {
if chunk1.sha256 != chunk2.sha256 {
return Ok(false);
}
}
}
Ok(true)
}
}
pub use crate::super_apq_min::{
SuperAPQ as ModernQuantizer,
SuperAPQConfig as ModernConfig,
SuperQuantizedModel as ModernResult,
};