feat: introduce trait-based distance aggregation and layered store

Introduces ColumnWeights, CountPartials, and BitPartials traits to compute and finalize partial distance matrices. Implements these traits for PersistentBitMatrix, PersistentCompactIntMatrix, and a new LayeredStore<S> wrapper that aggregates metrics across layers via parallel reduction. Adds ndarray for numerical aggregation and updates architecture documentation to reflect the trait-driven design and pending refactoring roadmap.
This commit is contained in:
Eric Coissac
2026-05-15 21:18:16 +08:00
parent 45d49ed501
commit 13e69e23c9
11 changed files with 721 additions and 355 deletions
+29
View File
@@ -203,6 +203,35 @@ where
m
}
// ── Trait impls ───────────────────────────────────────────────────────────────
use crate::traits::{ColumnWeights, CountPartials};
impl ColumnWeights for PersistentCompactIntMatrix {
fn col_weights(&self) -> Array1<u64> { self.sum() }
}
impl CountPartials for PersistentCompactIntMatrix {
fn partial_bray(&self) -> Array2<u64> {
self.partial_bray_dist_matrix()
}
fn partial_euclidean(&self) -> Array2<f64> {
self.partial_euclidean_dist_matrix()
}
fn partial_threshold_jaccard(&self, threshold: u32) -> (Array2<u64>, Array2<u64>) {
self.partial_threshold_jaccard_dist_matrix(threshold)
}
fn partial_relfreq_bray(&self, global: &Array1<u64>) -> Array2<f64> {
self.partial_relfreq_bray_dist_matrix(global)
}
fn partial_relfreq_euclidean(&self, global: &Array1<u64>) -> Array2<f64> {
self.partial_relfreq_euclidean_dist_matrix(global)
}
fn partial_hellinger(&self, global: &Array1<u64>) -> Array2<f64> {
self.partial_hellinger_euclidean_dist_matrix(global)
}
}
// ── Builder ───────────────────────────────────────────────────────────────────
pub struct PersistentCompactIntMatrixBuilder {