use crate::SparseDistanceMatrix;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum CollapseObjective {
H1,
H2,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum CollapseCompleteness {
CompleteFixedPoint,
BudgetLimited,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub struct AdaptiveCollapseParams {
pub objective: CollapseObjective,
pub work_limit: Option<u64>,
}
impl Default for AdaptiveCollapseParams {
fn default() -> Self {
Self {
objective: CollapseObjective::H2,
work_limit: None,
}
}
}
impl AdaptiveCollapseParams {
pub fn new(objective: CollapseObjective) -> Self {
Self {
objective,
work_limit: None,
}
}
pub fn with_work_limit(mut self, work_limit: u64) -> Self {
self.work_limit = Some(work_limit);
self
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum SchedulePosition {
Pass(usize),
Round(usize),
Sequence(usize),
}
impl SchedulePosition {
pub fn number(self) -> usize {
match self {
Self::Pass(number) | Self::Round(number) | Self::Sequence(number) => number,
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct RemovalStep {
pub(super) u: usize,
pub(super) v: usize,
pub(super) value: f64,
pub(super) position: SchedulePosition,
pub(super) witnesses: Vec<(f64, usize)>,
}
impl RemovalStep {
pub fn edge(&self) -> (usize, usize) {
(self.u, self.v)
}
pub fn value(&self) -> f64 {
self.value
}
pub fn position(&self) -> SchedulePosition {
self.position
}
pub fn witnesses(&self) -> &[(f64, usize)] {
&self.witnesses
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct CollapseCertificate {
pub(super) algorithm_version: u32,
pub(super) objective: Option<CollapseObjective>,
pub(super) completeness: CollapseCompleteness,
pub(super) work_limit: Option<u64>,
pub(super) work_used: u64,
pub(super) vertex_count: usize,
pub(super) requested_threshold: Option<f64>,
pub(super) terminal_level: f64,
pub(super) input_edge_count: usize,
pub(super) output_edge_count: usize,
pub(super) steps: Vec<RemovalStep>,
}
impl CollapseCertificate {
pub fn algorithm_version(&self) -> u32 {
self.algorithm_version
}
pub fn objective(&self) -> Option<CollapseObjective> {
self.objective
}
pub fn completeness(&self) -> CollapseCompleteness {
self.completeness
}
pub fn work_limit(&self) -> Option<u64> {
self.work_limit
}
pub fn work_used(&self) -> u64 {
self.work_used
}
pub fn vertex_count(&self) -> usize {
self.vertex_count
}
pub fn requested_threshold(&self) -> Option<f64> {
self.requested_threshold
}
pub fn terminal_level(&self) -> f64 {
self.terminal_level
}
pub fn input_edge_count(&self) -> usize {
self.input_edge_count
}
pub fn output_edge_count(&self) -> usize {
self.output_edge_count
}
pub fn steps(&self) -> &[RemovalStep] {
&self.steps
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
#[non_exhaustive]
pub struct CollapseStats {
pub input_edges: usize,
pub output_edges: usize,
pub removed_edges: usize,
pub epochs: usize,
pub edge_tests: usize,
pub witness_segments: usize,
pub max_common_neighborhood: usize,
pub logical_tests: usize,
pub invalidated_results: usize,
pub global_invalidations: usize,
pub window_batches: usize,
pub window_slots_offered: usize,
pub window_members_formed: usize,
pub window_members_reused: usize,
pub adaptive_score_evaluations: usize,
pub adaptive_queue_pops: usize,
pub adaptive_stale_pops: usize,
pub adaptive_triangles_removed: u64,
pub adaptive_tetrahedra_removed: u64,
}
impl CollapseStats {
pub(super) fn new(input_edges: usize) -> Self {
CollapseStats {
input_edges,
output_edges: input_edges,
..Default::default()
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
#[non_exhaustive]
pub struct CollapseTimings {
pub predicate_ns: u64,
pub retirement_ns: u64,
pub repair_ns: u64,
}
#[derive(Debug, Clone)]
#[non_exhaustive]
pub struct CollapsedRips {
pub matrix: SparseDistanceMatrix,
pub certificate: CollapseCertificate,
pub stats: CollapseStats,
pub timings: CollapseTimings,
}