Skip to main content

aprender/serialization/
mod.rs

1//! Model Serialization Module
2//!
3//! Provides two serialization formats:
4//!
5//! ## `SafeTensors` Format
6//! Industry-standard format compatible with `HuggingFace` ecosystem.
7//! ```text
8//! [8-byte header: u64 metadata length (little-endian)]
9//! [JSON metadata: tensor names, dtypes, shapes, data_offsets]
10//! [Raw tensor data: F32 values in little-endian]
11//! ```
12//!
13//! ## APR Format
14//! Compact binary format optimized for WASM deployment with JSON metadata.
15//! ```text
16//! [4-byte magic: "APR1"]
17//! [4-byte metadata_len][JSON metadata]
18//! [4-byte n_tensors][tensor index][tensor data]
19//! [4-byte CRC32]
20//! ```
21//!
22//! Example (SafeTensors):
23//! ```rust
24//! use aprender::linear_model::LinearRegression;
25//! use aprender::primitives::{Matrix, Vector};
26//! use aprender::traits::Estimator;
27//!
28//! # let x = Matrix::from_vec(3, 1, vec![1.0, 2.0, 3.0]).expect("valid matrix dimensions");
29//! # let y = Vector::from_vec(vec![2.0, 3.0, 4.0]);
30//! let mut model = LinearRegression::new();
31//! model.fit(&x, &y).expect("linear regression fit should succeed");
32//!
33//! // Save to SafeTensors
34//! model.save_safetensors("model.safetensors").expect("save safetensors should succeed");
35//!
36//! // Load from SafeTensors
37//! let loaded = LinearRegression::load_safetensors("model.safetensors").expect("load safetensors should succeed");
38//! # std::fs::remove_file("model.safetensors").ok();
39//! ```
40//!
41//! Example (APR with metadata):
42//! ```rust
43//! use aprender::serialization::apr::{AprWriter, AprReader};
44//! use serde_json::json;
45//!
46//! let mut writer = AprWriter::new();
47//! writer.set_metadata("model_type", json!("whisper-tiny"));
48//! writer.set_metadata("vocab", json!(["hello", "world"]));
49//! writer.add_tensor_f32("weights", vec![2, 2], &[1.0, 2.0, 3.0, 4.0]);
50//!
51//! let bytes = writer.to_bytes().expect("APR writer to_bytes should succeed");
52//! let reader = AprReader::from_bytes(bytes).expect("APR reader from_bytes should succeed");
53//! assert_eq!(reader.get_metadata("model_type").expect("model_type metadata should exist"), "whisper-tiny");
54//! ```
55
56pub mod apr;
57pub mod safetensors;
58
59pub use apr::{AprReader, AprWriter};
60pub use safetensors::SafeTensorsMetadata;