Source code for latents.base

"""General-purpose base classes."""

from __future__ import annotations

import numpy as np


[docs] class ArrayContainer: """Base class for containers holding `numpy.ndarray` attributes. Provides common functionality for deep copying and clearing array attributes, plus a custom ``__repr__`` that shows shapes instead of full values. Notes ----- This is an abstract base class with no attributes of its own. Subclasses should define their own ``__init__`` that stores arrays as instance attributes. The ``copy()`` and ``clear()`` methods operate on all instance attributes. """ def __repr__(self) -> str: # If array attributes are specified, then display their shapes, rather # than their full values attr_reprs = [] for attr_name, attr_value in vars(self).items(): if isinstance(attr_value, np.ndarray): attr_reprs.append(f"{attr_name}.shape={attr_value.shape}") else: attr_reprs.append(f"{attr_name}={attr_value}") return type(self).__name__ + "(" + ", ".join(attr_reprs) + ")"
[docs] def copy(self) -> ArrayContainer: """Return a deep copy of self. Returns ------- ArrayContainer A deep copy of self. """ # If array attributes are specified, then create copies of them, and # create a new class instance with those copies new_attrs = {} for attr_name, attr_value in vars(self).items(): if isinstance(attr_value, np.ndarray): new_attrs[attr_name] = attr_value.copy() else: new_attrs[attr_name] = attr_value return self.__class__(**new_attrs)
[docs] def clear(self) -> None: """Set all attributes to None.""" for attr_name in vars(self): setattr(self, attr_name, None)