Source code for httk.atomistic.models.moments.collinear

"""Collinear per-site magnetic-moment backend."""

import fractions
from typing import Any

from httk.core import FracVector, SurdVector, VectorLike

from httk.atomistic.models._vector_guards import to_fracvector, to_precision
from httk.atomistic.models.moments.backend import SiteMomentsBackend


[docs] class CollinearSiteMoments(SiteMomentsBackend): """Signed per-site scalar moments with no assigned Cartesian axis."""
[docs] kind = "collinear"
_collinear_moments: FracVector def __init__(self, moments: VectorLike, precision: Any = None) -> None: value = to_fracvector(moments) if len(value.dim) != 1: raise ValueError("CollinearSiteMoments moments must be an N-dimensional vector-like") self._collinear_moments = value self._precision = to_precision(precision) @property
[docs] def collinear_moments(self) -> FracVector: """The exact signed scalar moment for each site.""" return self._collinear_moments
@property
[docs] def cartesian_moments(self) -> SurdVector: raise ValueError( "a collinear scalar carries no axis and none is fabricated; " "construct a CartesianSiteMoments explicitly to assign one" )
@property
[docs] def precision(self) -> fractions.Fraction | None: return self._precision
def __len__(self) -> int: return len(self._collinear_moments) def __eq__(self, other: object) -> bool: if not isinstance(other, CollinearSiteMoments): return NotImplemented return self._collinear_moments == other._collinear_moments def __hash__(self) -> int: return hash(self._collinear_moments) def __repr__(self) -> str: return f"CollinearSiteMoments(moments={self._collinear_moments!r})"