use std::collections::BTreeMap;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub struct CohomologyLimits {
pub max_vertices: usize,
pub max_simplices_per_dimension: usize,
pub max_boundary_terms: usize,
pub max_dimension: usize,
}
impl Default for CohomologyLimits {
fn default() -> Self {
Self {
max_vertices: 1_000_000,
max_simplices_per_dimension: 20_000_000,
max_boundary_terms: 200_000_000,
max_dimension: 8,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct CohomologySpaceId(pub(crate) [u8; 32]);
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct CohomologyClassId(pub(crate) [u8; 32]);
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct CochainTerm {
pub simplex: Vec<usize>,
pub coefficient: u32,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CohomologyClass {
pub id: CohomologyClassId,
pub basis_index: usize,
pub terms: Vec<CochainTerm>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub struct CohomologySubspaceTerm {
pub class: CohomologyClassId,
pub coefficient: u32,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CohomologySubspaceGenerator {
pub terms: Vec<CohomologySubspaceTerm>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CohomologySubspace {
pub(crate) space: CohomologySpaceId,
pub(crate) ambient_rank: usize,
pub(crate) modulus: u32,
pub(crate) generators: Vec<CohomologySubspaceGenerator>,
}
#[derive(Debug, Clone)]
pub struct CohomologySpace {
pub(crate) id: CohomologySpaceId,
pub(crate) vertex_count: usize,
pub(crate) dimension: usize,
pub(crate) scale: f64,
pub(crate) modulus: u32,
pub(crate) active_graph_digest: [u8; 32],
pub(crate) simplex_counts: Vec<usize>,
pub(crate) simplices: Vec<Vec<usize>>,
pub(crate) coboundaries: Vec<SparseVector>,
pub(crate) basis_vectors: Vec<SparseVector>,
pub(crate) basis: Vec<CohomologyClass>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub struct CohomologyRelationTerm {
pub class: CohomologyClassId,
pub coefficient: u32,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CohomologyRelationVector {
pub old: Vec<CohomologyRelationTerm>,
pub new: Vec<CohomologyRelationTerm>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct CohomologyRelation {
pub old_space: CohomologySpaceId,
pub new_space: CohomologySpaceId,
pub dimension: usize,
pub scale: f64,
pub modulus: u32,
pub old_rank: usize,
pub new_rank: usize,
pub old_image_rank: usize,
pub new_image_rank: usize,
pub old_kernel_rank: usize,
pub new_kernel_rank: usize,
pub relation_rank: usize,
pub basis: Vec<CohomologyRelationVector>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CohomologyContinuationKind {
Unique,
Ambiguous,
NoExtension,
NoNonzeroContinuation,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CohomologyContinuation {
pub old_space: CohomologySpaceId,
pub new_space: CohomologySpaceId,
pub kind: CohomologyContinuationKind,
pub old: Vec<CohomologyRelationTerm>,
pub new: Vec<CohomologyRelationTerm>,
pub ambiguity: Vec<Vec<CohomologyRelationTerm>>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub struct CohomologyMapTerm {
pub class: CohomologyClassId,
pub coefficient: u32,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CohomologyMapColumn {
pub source: CohomologyClassId,
pub image: Vec<CohomologyMapTerm>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct CohomologyRestriction {
pub source_space: CohomologySpaceId,
pub target_space: CohomologySpaceId,
pub dimension: usize,
pub scale: f64,
pub modulus: u32,
pub rank: usize,
pub columns: Vec<CohomologyMapColumn>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub(crate) struct SparseVector(pub(crate) BTreeMap<usize, u32>);