Source code for synkit.CRN.Symmetry.symmetry

from __future__ import annotations

from typing import Any, Optional

from ._common import SymmetryConfig
from .automorphism import CRNAutomorphism
from .canon import CRNCanonicalizer
from .isomorphism import CRNIsomorphism
from .wl_canon import WLCanonicalizer


[docs] class CRNSymmetry: """Unified façade for WL, automorphism, canonicalization, and isomorphism.""" def __init__( self, source: Any, *, include_rule: bool = True, include_stoich: bool = True, wl_iters: int = 20, wl_digest_size: int = 16, config: Optional[SymmetryConfig] = None, ) -> None: self.config = config or SymmetryConfig.topological() self.kwargs = dict( include_rule=include_rule, include_stoich=include_stoich, wl_iters=wl_iters, wl_digest_size=wl_digest_size, config=self.config, ) self.wl = WLCanonicalizer( source, n_iter=wl_iters, digest_size=wl_digest_size, include_rule=include_rule, include_stoich=include_stoich, config=self.config, ) self.automorphism = CRNAutomorphism(source, **self.kwargs) self.canonicalizer = CRNCanonicalizer(source, **self.kwargs) self.isomorphism = CRNIsomorphism(source, **self.kwargs)
[docs] def wl_orbits(self): return self.wl.orbits()
[docs] def orbits(self, **kwargs: Any): return self.automorphism.orbits(**kwargs)
[docs] def has_nontrivial_automorphism(self, **kwargs: Any): return self.automorphism.has_nontrivial_automorphism(**kwargs)
[docs] def automorphism_summary(self, **kwargs: Any): return self.automorphism.summary(**kwargs)
[docs] def canonical_result(self, **kwargs: Any): return self.canonicalizer.canonical_result(**kwargs)
[docs] def canonical_graph(self, **kwargs: Any): return self.canonicalizer.canonical_graph(**kwargs)