Source code for httk.atomistic.models.sites.numeric

"""
The NumericSites presentation: a Sites object exposed as plain numpy numbers.
"""

from collections.abc import Iterator

from httk.core import NumericVector, to_numeric

from httk.atomistic.models._vector_guards import require_numpy
from httk.atomistic.models.sites.like import SitesLike
from httk.atomistic.models.sites.sites import Sites
from httk.atomistic.models.sites.view import SitesView


[docs] class NumericSites: """ A plain-numpy presentation of a :class:`~httk.atomistic.Sites` object. Where a ``Sites`` holds its reduced coordinates exactly (an Nx3 rational :class:`~httk.core.FracVector`), a ``NumericSites`` mirrors that interface but returns plain ``float64`` numpy arrays, for callers who do not need exact arithmetic and just want numpy arrays. It is len/iter/indexable over its rows, each yielded as a ``(3,)`` numpy array. The presentation is numpy-backed, so constructing a ``NumericSites`` **requires numpy** (the ``httk-atomistic[numpy]`` extra) and raises :class:`ImportError` eagerly when it is unavailable. The exact object is always one hop away via :attr:`exact`. :param sites: The sites or sites-like object to present. """ _sites: Sites def __init__(self, sites: SitesLike) -> None: require_numpy() self._sites = sites if isinstance(sites, Sites) else SitesView(sites) @property
[docs] def precision(self) -> float | None: """The fractional coordinate precision, or ``None`` if unknown. :return: The precision as a floating-point value. """ return None if self._sites.precision is None else float(self._sites.precision)
@property
[docs] def reduced_coords(self) -> NumericVector: """The Nx3 reduced site coordinates. :return: The coordinates as floating-point values. """ return to_numeric(self._sites.reduced_coords)
def __len__(self) -> int: """Return the number of sites. :return: The number of coordinate rows. """ return len(self._sites) def __iter__(self) -> Iterator[NumericVector]: """Iterate over the reduced-coordinate rows. :yield: Each coordinate row. """ for row in self._sites: yield to_numeric(row) def __getitem__(self, index: int) -> NumericVector: """Return one reduced-coordinate row. :param index: The row index. :return: The selected coordinate row. """ return to_numeric(self._sites[index]) @property
[docs] def exact(self) -> Sites: """The exact sites this presentation wraps. :return: The exact sites. """ return self._sites
def __repr__(self) -> str: return f"NumericSites(reduced_coords={self.reduced_coords!r})"