Source code for openmdao.recorders.hdf5_reader

from __future__ import print_function, absolute_import

import numpy as np

try:
    import h5py
except ImportError:
    h5py = None

from openmdao.recorders.case_reader_base import CaseReaderBase
from openmdao.recorders.case import Case


def _group_to_dict(grp):
    """ Given an HDF5 group, converted it to a nested dictionary.

    Parameters
    ----------
    grp : h5py.Group or h5py.Dataset
        The group to be converted to a nested python dictionary.

    Returns
    -------
    dict
        The given group converted to a nested python dictionary.
    """
    d = {}
    if isinstance(grp, h5py.Group):
        for k, v in grp.items():
            d[k] = _group_to_dict(v)
    elif isinstance(grp, h5py.Dataset):
        if not grp.shape:
            # Value is scalar
            val = grp[()]
        else:
            val = np.zeros(grp.shape, dtype=grp.dtype)
            grp.read_direct(val)
        return val
    elif isinstance(grp, dict):
        return grp
    else:
        raise(ValueError('Encountered unhandled type '
                         'in group {0}'.format(type(grp))))
    return d


[docs]class HDF5CaseReader(CaseReaderBase): """ A case reader intended to read data from files recorded using the HDF5Recorder. Args ---- filename : str The name of the file to be read by the case reader. """ def __init__(self, filename): super(HDF5CaseReader, self).__init__(filename) if h5py is None: raise RuntimeError('h5py not available. ' 'Cannot instantiate HDF5CaseReader.') with h5py.File(self.filename, 'r') as f: self.format_version = f['metadata']['format_version'][()] self._load() self.num_cases = len(self._case_keys) def _load(self): """ Load the metadata and iteration keys from the given file. """ if self.format_version in (3, 4): with h5py.File(self.filename, 'r') as f: self._parameters = f['metadata'].get('Parameters', None) self._unknowns = f['metadata'].get('Unknowns', None) if isinstance(self._parameters, h5py.Group): self._parameters = _group_to_dict(self._parameters) if isinstance(self._unknowns, h5py.Group): self._unknowns = _group_to_dict(self._unknowns) self._case_keys = tuple([key for key in f.keys() if key != 'metadata']) else: raise ValueError('HDF5CaseReader encountered an unhandled ' 'format version: {0}'.format(self.format_version))
[docs] def get_case(self, case_id): """ Parameters ---------- case_id : int or str The integer index or string-identifier of the case to be retrieved. Returns ------- An instance of Case populated with data from the specified case/iteration. """ if isinstance(case_id, int): # If case_id is an integer, assume the user # wants a case as an index _case_id = self._case_keys[case_id] else: # Otherwise assume we were given the case string identifier _case_id = case_id with h5py.File(self.filename, 'r') as f: case_dict = _group_to_dict(f[_case_id]) return Case(self.filename, _case_id, case_dict)