use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SparsifierConfig {
pub epsilon: f64,
pub edge_budget_factor: usize,
pub audit_interval: usize,
pub walk_length: usize,
pub num_walks: usize,
pub n_audit_probes: usize,
pub auto_rebuild_on_audit_failure: bool,
pub local_rebuild_fraction: f64,
}
impl Default for SparsifierConfig {
fn default() -> Self {
Self {
epsilon: 0.2,
edge_budget_factor: 8,
audit_interval: 1000,
walk_length: 6,
num_walks: 10,
n_audit_probes: 30,
auto_rebuild_on_audit_failure: true,
local_rebuild_fraction: 0.1,
}
}
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
pub struct EdgeImportance {
pub u: usize,
pub v: usize,
pub weight: f64,
pub effective_resistance: f64,
pub score: f64,
}
impl EdgeImportance {
pub fn new(u: usize, v: usize, weight: f64, effective_resistance: f64) -> Self {
let score = weight * effective_resistance;
Self {
u,
v,
weight,
effective_resistance,
score,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AuditResult {
pub max_error: f64,
pub avg_error: f64,
pub passed: bool,
pub n_probes: usize,
pub threshold: f64,
}
impl AuditResult {
pub fn trivial_pass(threshold: f64) -> Self {
Self {
max_error: 0.0,
avg_error: 0.0,
passed: true,
n_probes: 0,
threshold,
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct SparsifierStats {
pub edge_count: usize,
pub full_edge_count: usize,
pub vertex_count: usize,
pub compression_ratio: f64,
pub insertions: u64,
pub deletions: u64,
pub audit_count: u64,
pub audit_pass_count: u64,
pub local_rebuilds: u64,
pub full_rebuilds: u64,
pub updates_since_audit: u64,
}
impl SparsifierStats {
pub fn refresh_ratio(&mut self) {
if self.edge_count > 0 {
self.compression_ratio = self.full_edge_count as f64 / self.edge_count as f64;
} else {
self.compression_ratio = 0.0;
}
}
}