Source code for nodefinder.identify.result._containers

# -*- coding: utf-8 -*-

# © 2017-2019, ETH Zurich, Institut für Theoretische Physik
# Author: Dominik Gresch <greschd@gmx.ch>
"""
Defines the container classes for the identification results.
"""

from types import SimpleNamespace

import numpy as np
from fsc.export import export
from fsc.hdf5_io import subscribe_hdf5, SimpleHDF5Mapping, HDF5Enabled, to_hdf5, from_hdf5


[docs]@export @subscribe_hdf5('nodefinder.identification_result_container') class IdentificationResultContainer(SimpleNamespace, SimpleHDF5Mapping): """Container class for the result of the identification step. Attributes ---------- coordinate_system : CoordinateSystem The coordinate system of the problem. results : list(IdentificationResult) List of identified objects. feature_size : float The ``feature_size`` used when identifying the objects. """ HDF5_ATTRIBUTES = ['coordinate_system', 'results', 'feature_size'] def __init__(self, *, coordinate_system, feature_size, results=()): self.coordinate_system = coordinate_system self.results = results self.feature_size = feature_size def __iter__(self): return iter(self.results) def __getitem__(self, idx): return self.results[idx] def __len__(self): return len(self.results)
[docs]@export @subscribe_hdf5('nodefinder.identification_result') class IdentificationResult(SimpleNamespace, HDF5Enabled): """Contains the attributes of an identified object. Attributes ---------- positions : list(tuple(float)) Positions of the nodal points making up the object. shape : :obj:`None` or NodalPoint or NodalLine Shape of the identified object. If the shape could not be identified, it is set to ``None``. dimension : int Dimension of the identified object. Is set to ``None`` if the dimension is ambiguous. """ # HDF5_ATTRIBUTES = ['positions', 'shape', 'dimension'] def __init__(self, positions, dimension, shape=None): self.positions = [tuple(pos) for pos in positions] self.dimension = dimension self.shape = shape def __repr__(self): return 'IdentificationResult(dimension={}, shape={}, positions=<{} values>)'.format( self.dimension, self.shape, len(self.positions) )
[docs] def to_hdf5(self, hdf5_handle): to_hdf5(self.dimension, hdf5_handle.create_group('dimension')) hdf5_handle['positions'] = np.array(self.positions) to_hdf5(self.shape, hdf5_handle.create_group('shape'))
[docs] @classmethod def from_hdf5(cls, hdf5_handle): shape = from_hdf5(hdf5_handle['shape']) try: dimension = hdf5_handle['dimension'][()] except AttributeError: dimension = from_hdf5(hdf5_handle['dimension']) try: positions = [tuple(x) for x in hdf5_handle['positions'][()]] except AttributeError: positions = from_hdf5(hdf5_handle['positions']) return cls(positions=positions, dimension=dimension, shape=shape)