use crate::classes::CocycleTerm;
use crate::cohomology::{CohomologyContinuation, CohomologyLimits, CohomologySpaceId};
#[derive(Debug, Clone, Copy, PartialEq)]
#[non_exhaustive]
pub struct CircularCoordinateParams {
pub tolerance: f64,
pub max_iterations: usize,
pub cohomology: CohomologyLimits,
}
impl Default for CircularCoordinateParams {
fn default() -> Self {
Self {
tolerance: 1e-10,
max_iterations: 10_000,
cohomology: CohomologyLimits::default(),
}
}
}
impl CircularCoordinateParams {
#[must_use]
pub fn with_tolerance(mut self, tolerance: f64) -> Self {
self.tolerance = tolerance;
self
}
#[must_use]
pub fn with_max_iterations(mut self, max_iterations: usize) -> Self {
self.max_iterations = max_iterations;
self
}
#[must_use]
pub fn with_cohomology_limits(mut self, cohomology: CohomologyLimits) -> Self {
self.cohomology = cohomology;
self
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub struct IntegralCocycleTerm {
pub u: usize,
pub v: usize,
pub coefficient: i64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub struct CircularClassTerm {
pub basis_index: usize,
pub coefficient: u32,
}
#[derive(Debug, Clone, PartialEq)]
pub struct CircularCoordinate {
pub space: CohomologySpaceId,
pub modulus: u32,
pub scale: f64,
pub field_multiplier: u32,
pub class: Vec<CircularClassTerm>,
pub source: Vec<CocycleTerm>,
pub integral: Vec<IntegralCocycleTerm>,
pub divisibility: u64,
pub potential: Vec<f64>,
pub phase: Vec<f64>,
pub energy: f64,
pub max_residual: f64,
pub relative_residual: f64,
pub iterations: usize,
pub tolerance: f64,
}
#[derive(Debug, Clone, PartialEq)]
pub struct CircularCoordinateContinuation {
pub topology: CohomologyContinuation,
pub coordinate: Option<CircularCoordinate>,
}
#[derive(Debug, Clone, PartialEq)]
pub(crate) struct SelectedCircularCoordinate {
pub(crate) modulus: u32,
pub(crate) scale: f64,
pub(crate) field_multiplier: u32,
pub(crate) integral: Vec<IntegralCocycleTerm>,
pub(crate) divisibility: u64,
pub(crate) potential: Vec<f64>,
pub(crate) phase: Vec<f64>,
pub(crate) energy: f64,
pub(crate) max_residual: f64,
pub(crate) relative_residual: f64,
pub(crate) iterations: usize,
pub(crate) tolerance: f64,
}