use serde::{Deserialize, Serialize};
use crate::{
codebook::CODEBOOK_SCHEMA,
codec::CODE_SCHEMA,
profile::{FibQuantProfileV1, NormFormat, PROFILE_SCHEMA},
rotation::ROTATION_ALGORITHM_VERSION,
};
pub const RECEIPT_SCHEMA: &str = "fib_quant_compression_receipt_v1";
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FibQuantCompressionReceiptV1 {
pub schema_version: String,
pub profile_digest: String,
pub codebook_digest: String,
pub rotation_digest: String,
pub source_vector_digest: String,
pub encoded_digest: String,
pub norm_format: NormFormat,
pub code_schema_version: String,
pub profile_schema_version: String,
pub codebook_schema_version: String,
pub ambient_dim: u32,
pub block_dim: u32,
pub codebook_size: u32,
pub paper_rate_bits_per_coord: f64,
pub wire_index_bits: u8,
pub wire_bits_per_coord: f64,
pub rotation_seed: u64,
pub rotation_algorithm_version: String,
pub codebook_seed: u64,
pub mse: Option<f64>,
pub cosine_similarity: Option<f64>,
pub fallback_available: bool,
pub recorded_unix_seconds: i64,
}
impl FibQuantCompressionReceiptV1 {
pub(crate) fn new(
profile: &FibQuantProfileV1,
profile_digest: String,
codebook_digest: String,
rotation_digest: String,
source_vector_digest: String,
encoded_digest: String,
) -> Self {
Self {
schema_version: RECEIPT_SCHEMA.into(),
profile_digest,
codebook_digest,
rotation_digest,
source_vector_digest,
encoded_digest,
norm_format: profile.norm_format.clone(),
code_schema_version: CODE_SCHEMA.into(),
profile_schema_version: PROFILE_SCHEMA.into(),
codebook_schema_version: CODEBOOK_SCHEMA.into(),
ambient_dim: profile.ambient_dim,
block_dim: profile.block_dim,
codebook_size: profile.codebook_size,
paper_rate_bits_per_coord: profile.paper_rate_bits_per_coord,
wire_index_bits: profile.wire_index_bits,
wire_bits_per_coord: profile.wire_bits_per_coord,
rotation_seed: profile.rotation_seed,
rotation_algorithm_version: ROTATION_ALGORITHM_VERSION.into(),
codebook_seed: profile.codebook_seed,
mse: None,
cosine_similarity: None,
fallback_available: false,
recorded_unix_seconds: current_unix_seconds(),
}
}
}
fn current_unix_seconds() -> i64 {
std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.map(|duration| duration.as_secs() as i64)
.unwrap_or(0)
}