use std::fmt;
#[derive(Debug, Clone, PartialEq)]
pub struct SymmetryGroup {
pub name: String,
pub generators: usize,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Symmetry {
TimeTranslation,
SpatialTranslation,
Rotation,
Gauge(SymmetryGroup),
}
impl Symmetry {
pub fn conserved_quantity(&self) -> &str {
match self {
Self::TimeTranslation => "Energy",
Self::SpatialTranslation => "Momentum",
Self::Rotation => "Angular Momentum",
Self::Gauge(g) => &g.name,
}
}
pub fn component_count(&self) -> usize {
match self {
Self::TimeTranslation => 1,
Self::SpatialTranslation => 3,
Self::Rotation => 3,
Self::Gauge(g) => g.generators,
}
}
}
impl fmt::Display for Symmetry {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::TimeTranslation => write!(f, "Time Translation → Energy"),
Self::SpatialTranslation => write!(f, "Spatial Translation → Momentum"),
Self::Rotation => write!(f, "Rotation → Angular Momentum"),
Self::Gauge(g) => write!(f, "Gauge({}) → {}", g.name, g.name),
}
}
}
impl fmt::Display for SymmetryGroup {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{} ({} generators)", self.name, self.generators)
}
}