use std::fmt;
use crate::{
Bar, ExplainedDiagram, IntervalGroupId, ReductionCertificate, ReductionRepairMode,
ReductionRepairWork,
};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AtlasArtifactError {
message: String,
}
impl AtlasArtifactError {
pub(crate) fn new(message: impl Into<String>) -> Self {
Self {
message: message.into(),
}
}
pub fn message(&self) -> &str {
&self.message
}
}
impl fmt::Display for AtlasArtifactError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "atlas artifact: {}", self.message)
}
}
impl std::error::Error for AtlasArtifactError {}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub struct AtlasDecodeLimits {
pub max_bytes: usize,
pub max_vertices: usize,
pub max_bars: usize,
pub max_spaces: usize,
pub max_basis: usize,
pub max_critical_pairs: usize,
pub max_terms: usize,
pub max_certificate_bytes: usize,
}
impl Default for AtlasDecodeLimits {
fn default() -> Self {
Self {
max_bytes: 1 << 30,
max_vertices: 1_000_000,
max_bars: 100_000_000,
max_spaces: 50_000_000,
max_basis: 100_000_000,
max_critical_pairs: 100_000_000,
max_terms: 200_000_000,
max_certificate_bytes: 1 << 30,
}
}
}
#[derive(Debug, Clone)]
pub struct AtlasArtifact {
pub(crate) vertex_count: usize,
pub(crate) threshold: Option<f64>,
pub(crate) modulus: u32,
pub(crate) input_digest: [u8; 32],
pub(crate) explained: ExplainedDiagram,
pub(crate) reduction: ReductionCertificate,
}
pub(crate) struct AtlasHeader {
pub(crate) modulus: u32,
pub(crate) vertex_count: usize,
pub(crate) threshold: Option<f64>,
pub(crate) bars: usize,
pub(crate) spaces: usize,
pub(crate) certificate_bytes: usize,
pub(crate) input_digest: [u8; 32],
}
#[derive(Default)]
pub(crate) struct AtlasTotals {
pub(crate) basis: usize,
pub(crate) critical_pairs: usize,
pub(crate) terms: usize,
}
pub(crate) struct SpaceHeader {
pub(crate) id: IntervalGroupId,
pub(crate) interval: Bar,
pub(crate) basis: usize,
pub(crate) critical_pairs: usize,
}
#[derive(Debug, Clone)]
pub struct AtlasArtifactRepair {
pub(crate) artifact: AtlasArtifact,
pub(crate) mode: ReductionRepairMode,
pub(crate) work: ReductionRepairWork,
}
impl AtlasArtifactRepair {
pub fn artifact(&self) -> &AtlasArtifact {
&self.artifact
}
pub fn mode(&self) -> ReductionRepairMode {
self.mode
}
pub fn work(&self) -> ReductionRepairWork {
self.work
}
pub(crate) fn into_artifact(self) -> AtlasArtifact {
self.artifact
}
}