use crate::{
CohomologyRelation, CohomologyRestriction, CohomologySpaceId, SparseDistanceMatrix,
ZigzagBarcode, ZigzagDirection,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub struct KineticLimits {
pub max_edges: usize,
pub max_pair_tests: usize,
pub max_events: usize,
}
impl Default for KineticLimits {
fn default() -> Self {
Self {
max_edges: 100_000,
max_pair_tests: 20_000_000,
max_events: 1_000_000,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct KineticEdgeKey {
pub u: usize,
pub v: usize,
}
impl KineticEdgeKey {
pub fn new(u: usize, v: usize) -> Self {
Self {
u: u.min(v),
v: u.max(v),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct KineticEdge {
pub u: usize,
pub v: usize,
pub intercept: f64,
pub velocity: f64,
}
impl KineticEdge {
pub fn key(&self) -> KineticEdgeKey {
KineticEdgeKey::new(self.u, self.v)
}
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub enum KineticEventKind {
ThresholdCrossing {
edge: KineticEdgeKey,
},
EdgeOrderSwap {
first: KineticEdgeKey,
second: KineticEdgeKey,
},
}
#[derive(Debug, Clone, PartialEq)]
pub struct KineticEvent {
pub time: f64,
pub lower: f64,
pub upper: f64,
pub kinds: Vec<KineticEventKind>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct KineticSchedule {
pub start: f64,
pub end: f64,
pub events: Vec<KineticEvent>,
pub persistent_ties: usize,
}
#[derive(Debug, Clone, PartialEq)]
pub struct KineticCohomologyEvent {
pub event: KineticEvent,
pub before_space: CohomologySpaceId,
pub after_space: CohomologySpaceId,
pub before_rank: usize,
pub after_rank: usize,
pub relation: CohomologyRelation,
}
#[derive(Debug, Clone, PartialEq)]
pub enum KineticZigzagNodeKind {
OpenCell {
sample: f64,
},
Event(KineticEvent),
}
#[derive(Debug, Clone, PartialEq)]
pub struct KineticZigzagNode {
pub kind: KineticZigzagNodeKind,
pub space: CohomologySpaceId,
pub rank: usize,
pub active_edges: usize,
}
#[derive(Debug, Clone, PartialEq)]
pub struct KineticZigzagArrow {
pub direction: ZigzagDirection,
pub restriction: CohomologyRestriction,
}
#[derive(Debug, Clone, PartialEq)]
pub struct KineticZigzag {
pub dimension: usize,
pub scale: f64,
pub modulus: u32,
pub persistent_ties: usize,
pub nodes: Vec<KineticZigzagNode>,
pub arrows: Vec<KineticZigzagArrow>,
pub barcode: ZigzagBarcode,
}
#[derive(Debug, Clone, PartialEq)]
pub enum KineticGraphStateKind {
Start,
OpenCell {
sample: f64,
},
Event(KineticEvent),
End,
}
#[derive(Debug, Clone)]
pub struct KineticGraphState {
pub kind: KineticGraphStateKind,
pub graph: SparseDistanceMatrix,
}
#[derive(Debug, Clone)]
pub struct KineticFiltration {
pub(super) vertex_count: usize,
pub(super) edges: Vec<KineticEdge>,
pub(super) start: f64,
pub(super) end: f64,
pub(super) limits: KineticLimits,
}