Source code for httk.atomistic.models.formula.record

"""Backend projecting a normalized composition storage record."""

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

from httk.atomistic.models.formula.backend import ChemicalFormulaBackend
from httk.atomistic.models.formula.composition import Composition
from httk.atomistic.models.formula.diagnostics import CompositionDiagnostic
from httk.atomistic.storage.records import (
    NormalizedCompositionRecord,
    _composition_from_record,
)


[docs] class RecordComposition(ChemicalFormulaBackend): r"""Read a composition from a :class:`NormalizedCompositionRecord`. :param obj: The normalized-composition record to wrap. :param \*\*hints: Backend-selection hints. """ _record: NormalizedCompositionRecord @classmethod def _backend_adopt(cls, obj: Any, **hints: Any) -> Self | None: r"""Adopt a normalized composition record. :param obj: The source object to adopt. :param \**hints: Backend-selection hints. :return: An initialized backend, or ``None`` when this backend declines ``obj``. """ if hints and hints.get("kind", "record") != "record": return None if not isinstance(obj, NormalizedCompositionRecord): return None return cls(obj, **hints) def __init__(self, obj: NormalizedCompositionRecord, **hints: Any) -> None: self._record = obj @cached_property def _composition(self) -> Composition: return _composition_from_record(self._record) @property
[docs] def amounts(self) -> tuple[tuple[str, Fraction], ...]: """Return the stored elemental amounts.""" return self._composition.amounts
@property
[docs] def uncertainties(self) -> tuple[tuple[str, Fraction | None], ...]: """Return the stored amount precisions.""" return self._composition.uncertainties
@property
[docs] def complete(self) -> bool: """Return whether the stored composition is complete.""" return self._composition.complete
@property
[docs] def exact(self) -> bool: """Return whether the stored amounts are exact.""" return self._composition.exact
@property
[docs] def normalized(self) -> bool: """Return whether the stored composition is normalized.""" return self._composition.normalized
@property
[docs] def normalization_status(self) -> str: """Return the stored composition's normalization status.""" return self._composition.normalization_status
@property
[docs] def diagnostics(self) -> tuple[CompositionDiagnostic, ...]: """Return diagnostics stored with the composition.""" return self._composition.diagnostics
[docs] def unwrap(self) -> NormalizedCompositionRecord: """Return the original normalized-composition record.""" return self._record