use crate::{
BifiltrationLimits, Bigrade, BipersistenceLimits, BipersistenceMap, BipersistenceNode,
BipersistenceRectangle, BipersistenceRegion, BipersistenceTerm, ClassExtensionKind,
CohomologyClassAtlas,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub struct BipersistenceArtifactLimits {
pub max_bytes: usize,
pub max_source_edges: usize,
pub max_rectangles: usize,
pub max_regions: usize,
pub max_class_atlases: usize,
pub max_circular_families: usize,
pub max_circular_iterations: usize,
pub max_coordinate_bytes: usize,
pub bifiltration: BifiltrationLimits,
pub module: BipersistenceLimits,
}
impl Default for BipersistenceArtifactLimits {
fn default() -> Self {
Self {
max_bytes: 1 << 30,
max_source_edges: 200_000_000,
max_rectangles: 1_000_000,
max_regions: 1_000_000,
max_class_atlases: 1_000_000,
max_circular_families: 1_000_000,
max_circular_iterations: 10_000_000,
max_coordinate_bytes: 1 << 30,
bifiltration: BifiltrationLimits::default(),
module: BipersistenceLimits::default(),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct BipersistenceRectangleClaim {
pub rectangle: BipersistenceRectangle,
pub rank: usize,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BipersistenceRegionClaim {
pub region: BipersistenceRegion,
pub rank: usize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct BipersistenceArtifactSummary {
pub vertices: usize,
pub edges: usize,
pub nodes: usize,
pub cover_maps: usize,
pub rectangles: usize,
pub regions: usize,
pub class_atlases: usize,
pub circular_families: usize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(super) struct ArtifactEdge {
pub(super) u: usize,
pub(super) v: usize,
pub(super) value_bits: u64,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub(super) struct ArtifactCircularEntry {
pub(super) grade: Bigrade,
pub(super) extension: ClassExtensionKind,
pub(super) status: ArtifactCircularStatus,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub(super) enum ArtifactCircularStatus {
NotAttempted,
LiftFailed,
SolveFailed,
Success(Vec<u8>),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub(super) struct ArtifactCircularFamily {
pub(super) base_grade: Bigrade,
pub(super) base_class: Vec<BipersistenceTerm>,
pub(super) tolerance_bits: u64,
pub(super) max_iterations: usize,
pub(super) entries: Vec<ArtifactCircularEntry>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BipersistenceArtifact {
pub(super) vertex_count: usize,
pub(super) edges: Vec<ArtifactEdge>,
pub(super) threshold_bits: u64,
pub(super) modulus: u32,
pub(super) scale_bits: Vec<u64>,
pub(super) minimum_degrees: Vec<usize>,
pub(super) nodes: Vec<BipersistenceNode>,
pub(super) cover_maps: Vec<BipersistenceMap>,
pub(super) rectangles: Vec<BipersistenceRectangleClaim>,
pub(super) regions: Vec<BipersistenceRegionClaim>,
pub(super) class_atlases: Vec<CohomologyClassAtlas>,
pub(super) circular_families: Vec<ArtifactCircularFamily>,
pub(super) digest: [u8; 32],
}