Merge commit 'd803bfe2b1fe7f5e219e50ac20d6801a0a58ac75' as 'vendor/ruvector'
This commit is contained in:
143
vendor/ruvector/examples/verified-applications/src/quantization_proof.rs
vendored
Normal file
143
vendor/ruvector/examples/verified-applications/src/quantization_proof.rs
vendored
Normal file
@@ -0,0 +1,143 @@
|
||||
//! # 6. Quantization and Compression Proofs
|
||||
//!
|
||||
//! Extend beyond dimension equality to prove:
|
||||
//! - Quantized vector corresponds to original within bound epsilon
|
||||
//! - Metric invariants preserved under compression
|
||||
//! - HNSW insert preserves declared index type
|
||||
//!
|
||||
//! Result: quantization goes from heuristic to certified transform.
|
||||
|
||||
use ruvector_verified::{proof_store, vector_types, ProofEnvironment};
|
||||
|
||||
/// Proof that quantization preserved dimensional and metric invariants.
|
||||
#[derive(Debug)]
|
||||
pub struct QuantizationCertificate {
|
||||
pub original_dim: u32,
|
||||
pub quantized_dim: u32,
|
||||
pub max_error: f32,
|
||||
pub actual_error: f32,
|
||||
pub dim_proof_id: u32,
|
||||
pub metric_proof_id: u32,
|
||||
pub attestation: Vec<u8>,
|
||||
pub certified: bool,
|
||||
}
|
||||
|
||||
/// Verify that a quantized vector preserves the original's dimensional contract
|
||||
/// and that the reconstruction error is within bounds.
|
||||
pub fn certify_quantization(
|
||||
original: &[f32],
|
||||
quantized: &[f32],
|
||||
declared_dim: u32,
|
||||
max_error: f32,
|
||||
metric: &str,
|
||||
) -> QuantizationCertificate {
|
||||
let mut env = ProofEnvironment::new();
|
||||
|
||||
// 1. Prove original matches declared dimension
|
||||
let orig_proof = match vector_types::verified_dim_check(&mut env, declared_dim, original) {
|
||||
Ok(op) => op.proof_id,
|
||||
Err(_) => {
|
||||
return QuantizationCertificate {
|
||||
original_dim: original.len() as u32,
|
||||
quantized_dim: quantized.len() as u32,
|
||||
max_error,
|
||||
actual_error: f32::INFINITY,
|
||||
dim_proof_id: 0,
|
||||
metric_proof_id: 0,
|
||||
attestation: vec![],
|
||||
certified: false,
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
// 2. Prove quantized matches same dimension
|
||||
let quant_proof = match vector_types::verified_dim_check(&mut env, declared_dim, quantized) {
|
||||
Ok(op) => op.proof_id,
|
||||
Err(_) => {
|
||||
return QuantizationCertificate {
|
||||
original_dim: original.len() as u32,
|
||||
quantized_dim: quantized.len() as u32,
|
||||
max_error,
|
||||
actual_error: f32::INFINITY,
|
||||
dim_proof_id: orig_proof,
|
||||
metric_proof_id: 0,
|
||||
attestation: vec![],
|
||||
certified: false,
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
// 3. Prove dimension equality between original and quantized
|
||||
let _eq_proof =
|
||||
vector_types::prove_dim_eq(&mut env, original.len() as u32, quantized.len() as u32);
|
||||
|
||||
// 4. Prove metric type is valid
|
||||
let metric_id = vector_types::mk_distance_metric(&mut env, metric).unwrap_or(0);
|
||||
|
||||
// 5. Compute reconstruction error (L2 norm of difference)
|
||||
let error: f32 = original
|
||||
.iter()
|
||||
.zip(quantized.iter())
|
||||
.map(|(a, b)| (a - b).powi(2))
|
||||
.sum::<f32>()
|
||||
.sqrt();
|
||||
|
||||
let within_bounds = error <= max_error;
|
||||
let attestation = if within_bounds {
|
||||
proof_store::create_attestation(&env, quant_proof).to_bytes()
|
||||
} else {
|
||||
vec![]
|
||||
};
|
||||
|
||||
QuantizationCertificate {
|
||||
original_dim: original.len() as u32,
|
||||
quantized_dim: quantized.len() as u32,
|
||||
max_error,
|
||||
actual_error: error,
|
||||
dim_proof_id: orig_proof,
|
||||
metric_proof_id: metric_id,
|
||||
attestation,
|
||||
certified: within_bounds,
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn perfect_quantization() {
|
||||
let orig = vec![1.0f32; 128];
|
||||
let quant = vec![1.0f32; 128]; // identical
|
||||
let cert = certify_quantization(&orig, &quant, 128, 0.01, "L2");
|
||||
assert!(cert.certified);
|
||||
assert!(cert.actual_error < 0.001);
|
||||
assert_eq!(cert.attestation.len(), 82);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn slight_error_within_bounds() {
|
||||
let orig = vec![1.0f32; 128];
|
||||
let quant: Vec<f32> = orig.iter().map(|x| x + 0.001).collect();
|
||||
let cert = certify_quantization(&orig, &quant, 128, 1.0, "L2");
|
||||
assert!(cert.certified);
|
||||
assert!(cert.actual_error > 0.0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn error_exceeds_bound() {
|
||||
let orig = vec![1.0f32; 128];
|
||||
let quant = vec![2.0f32; 128]; // large error
|
||||
let cert = certify_quantization(&orig, &quant, 128, 0.01, "L2");
|
||||
assert!(!cert.certified);
|
||||
assert!(cert.attestation.is_empty());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn dimension_mismatch_rejected() {
|
||||
let orig = vec![1.0f32; 128];
|
||||
let quant = vec![1.0f32; 64]; // wrong dim
|
||||
let cert = certify_quantization(&orig, &quant, 128, 1.0, "L2");
|
||||
assert!(!cert.certified);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user