use std::fmt;
use crate::classes::IntervalGroupId;
use crate::{
ClassContinuation, ClassCorrespondence, Diagram, Error, PersistenceProgram, ProgramArtifact,
ProgramDecodeLimits, ProgramEvent, ProgramUpdateMode, ProgramWork, SparseDistanceMatrix,
};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ProgramTraceError {
message: String,
}
impl ProgramTraceError {
pub(crate) fn new(message: impl Into<String>) -> Self {
Self {
message: message.into(),
}
}
pub fn message(&self) -> &str {
&self.message
}
}
impl fmt::Display for ProgramTraceError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "program trace: {}", self.message)
}
}
impl std::error::Error for ProgramTraceError {}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub struct ProgramTraceDecodeLimits {
pub max_bytes: usize,
pub max_steps: usize,
pub max_vertices: usize,
pub max_total_edges: usize,
pub max_events: usize,
pub max_continuations: usize,
pub max_transports: usize,
pub max_correspondences: usize,
pub max_correspondence_vectors: usize,
pub max_correspondence_terms: usize,
pub max_bars: usize,
pub max_checkpoint_bytes: usize,
pub program: ProgramDecodeLimits,
}
impl Default for ProgramTraceDecodeLimits {
fn default() -> Self {
Self {
max_bytes: 1 << 30,
max_steps: 10_000_000,
max_vertices: 1_000_000,
max_total_edges: 200_000_000,
max_events: 100_000_000,
max_continuations: 100_000_000,
max_transports: 200_000_000,
max_correspondences: 100_000_000,
max_correspondence_vectors: 200_000_000,
max_correspondence_terms: 400_000_000,
max_bars: 100_000_000,
max_checkpoint_bytes: 1 << 30,
program: ProgramDecodeLimits::default(),
}
}
}
#[derive(Debug, Clone)]
pub struct ProgramTraceStep {
pub(crate) graph: SparseDistanceMatrix,
pub(crate) mode: ProgramUpdateMode,
pub(crate) work: ProgramWork,
pub(crate) events: Vec<ProgramEvent>,
pub(crate) continuation: Vec<ClassContinuation>,
pub(crate) correspondence: Vec<ClassCorrespondence>,
pub(crate) diagram: Diagram,
pub(crate) checkpoint: Option<ProgramArtifact>,
}
impl ProgramTraceStep {
pub fn graph(&self) -> &SparseDistanceMatrix {
&self.graph
}
pub fn mode(&self) -> ProgramUpdateMode {
self.mode
}
pub fn work(&self) -> ProgramWork {
self.work
}
pub fn events(&self) -> &[ProgramEvent] {
&self.events
}
pub fn continuation(&self) -> &[ClassContinuation] {
&self.continuation
}
pub fn correspondence(&self) -> &[ClassCorrespondence] {
&self.correspondence
}
pub fn diagram(&self) -> &Diagram {
&self.diagram
}
pub fn checkpoint(&self) -> Option<&ProgramArtifact> {
self.checkpoint.as_ref()
}
}
#[derive(Debug, Clone)]
pub struct ProgramTraceArtifact {
pub(crate) initial_graph: SparseDistanceMatrix,
pub(crate) initial_program: ProgramArtifact,
pub(crate) steps: Vec<ProgramTraceStep>,
}
#[derive(Debug, Clone)]
pub struct VerifiedProgramTraceStep {
pub mode: ProgramUpdateMode,
pub work: ProgramWork,
pub events: Vec<ProgramEvent>,
pub continuation: Vec<ClassContinuation>,
pub correspondence: Vec<ClassCorrespondence>,
pub diagram: Diagram,
}
#[derive(Debug, Clone)]
pub struct VerifiedProgramTrace {
pub initial_result: crate::ExplainedDiagram,
pub steps: Vec<VerifiedProgramTraceStep>,
pub final_program: PersistenceProgram,
}
#[derive(Default)]
pub(crate) struct TraceTotals {
pub(crate) events: usize,
pub(crate) continuations: usize,
pub(crate) transports: usize,
pub(crate) correspondences: usize,
pub(crate) correspondence_vectors: usize,
pub(crate) correspondence_terms: usize,
pub(crate) bars: usize,
pub(crate) checkpoint_bytes: usize,
}
pub(crate) struct TraceHeader {
pub(crate) step_count: usize,
pub(crate) initial_program_bytes: usize,
}
pub(crate) struct StepCounts {
pub(crate) events: usize,
pub(crate) continuations: usize,
pub(crate) correspondences: usize,
pub(crate) bars: usize,
pub(crate) checkpoint_bytes: usize,
}
pub(crate) struct DecodedStepBody {
pub(crate) events: Vec<ProgramEvent>,
pub(crate) continuation: Vec<ClassContinuation>,
pub(crate) correspondence: Vec<ClassCorrespondence>,
pub(crate) diagram: Diagram,
}
pub(crate) struct CorrespondenceHeader {
pub(crate) old_space: IntervalGroupId,
pub(crate) new_space: IntervalGroupId,
pub(crate) scale: f64,
pub(crate) old_rank: usize,
pub(crate) new_rank: usize,
pub(crate) old_image_rank: usize,
pub(crate) new_image_rank: usize,
pub(crate) relation_rank: usize,
pub(crate) basis_count: usize,
}
impl From<crate::ProgramUpdate> for VerifiedProgramTraceStep {
fn from(update: crate::ProgramUpdate) -> Self {
Self {
mode: update.mode,
work: update.work,
events: update.events,
continuation: update.continuation,
correspondence: update.correspondence,
diagram: update.result.diagram,
}
}
}
impl From<ProgramTraceError> for Error {
fn from(error: ProgramTraceError) -> Self {
Self::InvalidInput(error.to_string())
}
}