use std::sync::Arc;
use crate::{
Bar, CertificateLimits, ClassCorrespondence, Diagram, EdgeKey, GradedReductionCertificate,
RelativeInterfaceCertificate, RipsParams, SparseDistanceMatrix,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub struct IndexParams {
pub max_separator_width: usize,
pub separator_search_limit: usize,
pub leaf_vertices: usize,
pub interface_policy: InterfacePolicy,
}
impl Default for IndexParams {
fn default() -> Self {
Self {
max_separator_width: 4,
separator_search_limit: 100_000,
leaf_vertices: 4,
interface_policy: InterfacePolicy::Relative,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum InterfacePolicy {
Relative,
Compose,
Materialize,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct IndexSummary {
pub max_dim: usize,
pub nodes: usize,
pub leaves: usize,
pub separators: usize,
pub component_splits: usize,
pub widest_separator: usize,
pub largest_interface_vertices: usize,
pub largest_interface_edges: usize,
pub composed_interfaces: usize,
pub materialized_interfaces: usize,
pub relative_interfaces: usize,
pub relative_input_cells: usize,
pub relative_core_cells: usize,
pub largest_relative_core_cells: usize,
pub relative_cancellations: usize,
pub root_composed: bool,
pub separator_candidates_checked: usize,
pub separator_search_complete: bool,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct IndexWork {
pub edges_checked: usize,
pub nodes_touched: usize,
pub nodes_shared: usize,
pub nodes_repaired: usize,
pub nodes_rebuilt: usize,
pub nodes_composed: usize,
pub relative_nodes_rebuilt: usize,
pub relative_nodes_composed: usize,
pub relative_input_cells: usize,
pub relative_core_cells: usize,
pub relative_cancellations: usize,
pub reduction_columns_reused: usize,
pub reduction_columns_reduced: usize,
pub reduction_column_additions: usize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum IndexUpdateMode {
Unchanged,
Repaired,
Composed,
Relative,
Rebuilt,
Recompiled,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum IndexEventKind {
ThresholdCrossing,
ReductionRepaired,
ReductionRebuilt,
InterfaceComposed,
RelativeCoreRebuilt,
RelativeCoreComposed,
EnvelopeRecompiled,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct IndexEvent {
pub kind: IndexEventKind,
pub node: Option<[u8; 32]>,
pub edge: Option<EdgeKey>,
}
#[derive(Debug, Clone, Default)]
pub struct DiagramDelta {
pub removed: Vec<Bar>,
pub added: Vec<Bar>,
}
#[derive(Debug, Clone, Copy, PartialEq)]
#[non_exhaustive]
pub enum IndexEdit {
SetWeight {
edge: EdgeKey,
value: f64,
},
Activate {
edge: EdgeKey,
value: f64,
},
Deactivate {
edge: EdgeKey,
},
}
impl IndexEdit {
pub fn set_weight(u: usize, v: usize, value: f64) -> Self {
Self::SetWeight {
edge: EdgeKey::new(u, v),
value,
}
}
pub fn deactivate(u: usize, v: usize) -> Self {
Self::Deactivate {
edge: EdgeKey::new(u, v),
}
}
pub fn activate(u: usize, v: usize, value: f64) -> Self {
Self::Activate {
edge: EdgeKey::new(u, v),
value,
}
}
pub(crate) fn edge(self) -> EdgeKey {
match self {
Self::SetWeight { edge, .. }
| Self::Activate { edge, .. }
| Self::Deactivate { edge } => edge,
}
}
}
#[derive(Debug, Clone, Default, PartialEq)]
pub struct TopologyPatch {
edits: Vec<IndexEdit>,
}
impl TopologyPatch {
pub fn new(edits: Vec<IndexEdit>) -> Self {
Self { edits }
}
pub fn edits(&self) -> &[IndexEdit] {
&self.edits
}
pub fn into_edits(self) -> Vec<IndexEdit> {
self.edits
}
}
#[derive(Debug, Clone)]
pub struct IndexDiff {
pub same_envelope: bool,
pub shared_nodes: usize,
pub diagram: DiagramDelta,
}
#[derive(Debug, Clone)]
pub struct IndexBranch {
pub index: usize,
pub transition: IndexTransition,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct InterfaceSummary {
pub digest: [u8; 32],
pub depth: usize,
pub vertices: Vec<usize>,
pub separator: Vec<usize>,
pub protected_vertices: Vec<usize>,
pub edges: usize,
pub children: usize,
pub mode: InterfaceMode,
pub reduction_columns: usize,
pub columns_by_dimension: Vec<usize>,
pub relative_input_cells: usize,
pub relative_core_cells: usize,
pub relative_cancellations: usize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum InterfaceMode {
Relative,
Materialized,
Disjoint,
ZeroSimplex,
ZeroCone,
}
#[derive(Debug, Clone)]
pub struct IndexTransition {
pub index: PersistenceIndex,
pub mode: IndexUpdateMode,
pub delta: DiagramDelta,
pub events: Vec<IndexEvent>,
pub correspondence: Vec<ClassCorrespondence>,
pub work: IndexWork,
}
#[derive(Debug, Clone)]
pub(crate) struct InterfaceNode {
pub(crate) digest: [u8; 32],
pub(crate) vertices: Vec<usize>,
pub(crate) edge_positions: Vec<usize>,
pub(crate) separator: Vec<usize>,
pub(crate) protected_vertices: Vec<usize>,
pub(crate) children: Vec<Arc<InterfaceNode>>,
pub(crate) state: InterfaceState,
}
#[derive(Debug, Clone)]
pub(crate) enum InterfaceState {
Relative(RelativeInterfaceCertificate),
Materialized(GradedReductionCertificate),
Composed {
mode: InterfaceMode,
diagram: Diagram,
},
}
impl InterfaceNode {
pub(crate) fn diagram(&self) -> &Diagram {
match &self.state {
InterfaceState::Relative(relative) => relative.diagram(),
InterfaceState::Materialized(reduction) => reduction.diagram(),
InterfaceState::Composed { diagram, .. } => diagram,
}
}
pub(crate) fn mode(&self) -> InterfaceMode {
match &self.state {
InterfaceState::Relative(_) => InterfaceMode::Relative,
InterfaceState::Materialized(_) => InterfaceMode::Materialized,
InterfaceState::Composed { mode, .. } => *mode,
}
}
pub(crate) fn reduction(&self) -> Option<&GradedReductionCertificate> {
match &self.state {
InterfaceState::Materialized(reduction) => Some(reduction),
InterfaceState::Relative(_) | InterfaceState::Composed { .. } => None,
}
}
pub(crate) fn relative(&self) -> Option<&RelativeInterfaceCertificate> {
match &self.state {
InterfaceState::Relative(relative) => Some(relative),
InterfaceState::Materialized(_) | InterfaceState::Composed { .. } => None,
}
}
}
#[derive(Debug, Clone)]
pub struct PersistenceIndex {
pub(crate) params: RipsParams,
pub(crate) index_params: IndexParams,
pub(crate) limits: CertificateLimits,
pub(crate) graph: Arc<SparseDistanceMatrix>,
pub(crate) topology: Arc<Vec<EdgeKey>>,
pub(crate) root: Arc<InterfaceNode>,
pub(crate) summary: IndexSummary,
}