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."""
_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})"