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

"""Cartesian class view for site moments."""

import fractions
from functools import cached_property
from typing import Any, Self

from httk.core import SurdVector

from httk.atomistic.models._vector_guards import to_precision, to_surdvector
from httk.atomistic.models.moments.backend import SiteMomentsBackend
from httk.atomistic.models.moments.cartesian import CartesianSiteMoments
from httk.atomistic.models.moments.like import SiteMomentsLike
from httk.atomistic.models.moments.view_base import SiteMomentsViewBase


[docs] class CartesianSiteMomentsView(SiteMomentsViewBase, CartesianSiteMoments): """A lazy Cartesian site-moments presentation of any site-moments backend.""" _backend: SiteMomentsBackend def __new__(cls, obj: SiteMomentsLike, **hints: Any) -> Self: if isinstance(obj, cls): return obj backend = cls._prepare_backend(obj, hints) instance = super().__new__(cls) instance._backend = backend return instance def __init__(self, obj: SiteMomentsLike, **hints: Any) -> None: pass def _fill_cartesian_moments(self) -> None: moments = to_surdvector(self._backend.cartesian_moments) if len(moments.dim) != 2 or moments.dim[1] != 3: raise ValueError("CartesianSiteMoments moments must be an Nx3 vector-like") object.__setattr__(self, "_cartesian_moments", moments) def _fill_precision(self) -> None: object.__setattr__(self, "_precision", to_precision(self._backend.precision)) @cached_property def _cartesian_moments(self) -> SurdVector: # type: ignore[override] # pyright: ignore[reportIncompatibleVariableOverride] self._fill_cartesian_moments() return self.__dict__["_cartesian_moments"] @cached_property def _precision(self) -> fractions.Fraction | None: # type: ignore[override] # pyright: ignore[reportIncompatibleVariableOverride] self._fill_precision() return self.__dict__["_precision"]
[docs] def unview(self) -> CartesianSiteMoments: # A genuine CartesianSiteMoments backend is exactly the presented value: reuse it. backend = self._backend if type(backend) is CartesianSiteMoments: return backend return CartesianSiteMoments(self._cartesian_moments, self._precision)