Source code for httk.atomistic.numeric_sites

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

from collections.abc import Iterator

from httk.core import NumericVector, to_numeric

from ._vector_guards import require_numpy
from .sites import Sites
from .sites_class_view import SitesClassView
from .sites_like import SitesLike


[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`. """ _sites: Sites def __init__(self, sites: SitesLike) -> None: require_numpy() self._sites = sites if isinstance(sites, Sites) else SitesClassView(sites) @property
[docs] def reduced_coords(self) -> NumericVector: """The Nx3 reduced site coordinates as a ``float64`` numpy array.""" return to_numeric(self._sites.reduced_coords)
def __len__(self) -> int: return len(self._sites) def __iter__(self) -> Iterator[NumericVector]: for row in self._sites: yield to_numeric(row) def __getitem__(self, index: int) -> NumericVector: return to_numeric(self._sites[index]) @property
[docs] def exact(self) -> Sites: """The exact :class:`~httk.atomistic.Sites` this presentation wraps.""" return self._sites
def __repr__(self) -> str: return f"NumericSites(reduced_coords={self.reduced_coords!r})"