use std::fmt;
use crate::circular::SelectedCircularCoordinate;
use crate::{
Bar, CriticalPair, IntegralCocycleTerm, PersistenceCycleTerm, PersistenceTriangleTerm,
PersistentClass, PersistentClassArtifact, SparseDistanceMatrix,
};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PersistentCoordinateArtifactError {
pub(super) message: String,
}
impl PersistentCoordinateArtifactError {
pub(crate) fn new(message: impl Into<String>) -> Self {
Self {
message: message.into(),
}
}
pub fn message(&self) -> &str {
&self.message
}
}
impl fmt::Display for PersistentCoordinateArtifactError {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
formatter,
"persistent coordinate artifact: {}",
self.message
)
}
}
impl std::error::Error for PersistentCoordinateArtifactError {}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct PersistentCoordinateArtifactSummary {
pub vertices: usize,
pub source_edges: usize,
pub integral_terms: usize,
pub potential_values: usize,
}
#[derive(Debug, Clone)]
pub struct PersistentCoordinateArtifact {
pub(super) class_artifact: PersistentClassArtifact,
pub(super) coordinate: SelectedCircularCoordinate,
}
impl PersistentCoordinateArtifact {
pub fn class_artifact(&self) -> &PersistentClassArtifact {
&self.class_artifact
}
pub fn source(&self) -> &SparseDistanceMatrix {
self.class_artifact.source()
}
pub fn class(&self) -> &PersistentClass {
self.class_artifact.class()
}
pub fn interval(&self) -> Bar {
self.class().interval
}
pub fn critical_pair(&self) -> &CriticalPair {
self.class_artifact.critical_pair()
}
pub fn cycle(&self) -> &[PersistenceCycleTerm] {
self.class_artifact.cycle()
}
pub fn bounding_chain(&self) -> &[PersistenceTriangleTerm] {
self.class_artifact.bounding_chain()
}
pub fn modulus(&self) -> u32 {
self.coordinate.modulus
}
pub fn scale(&self) -> f64 {
self.coordinate.scale
}
pub fn field_multiplier(&self) -> u32 {
self.coordinate.field_multiplier
}
pub fn integral(&self) -> &[IntegralCocycleTerm] {
&self.coordinate.integral
}
pub fn divisibility(&self) -> u64 {
self.coordinate.divisibility
}
pub fn potential(&self) -> &[f64] {
&self.coordinate.potential
}
pub fn phase(&self) -> &[f64] {
&self.coordinate.phase
}
pub fn energy(&self) -> f64 {
self.coordinate.energy
}
pub fn max_residual(&self) -> f64 {
self.coordinate.max_residual
}
pub fn relative_residual(&self) -> f64 {
self.coordinate.relative_residual
}
pub fn iterations(&self) -> usize {
self.coordinate.iterations
}
pub fn tolerance(&self) -> f64 {
self.coordinate.tolerance
}
pub fn summary(&self) -> PersistentCoordinateArtifactSummary {
PersistentCoordinateArtifactSummary {
vertices: self.source().len(),
source_edges: self.source().num_edges(),
integral_terms: self.integral().len(),
potential_values: self.potential().len(),
}
}
}