Source code for openmdao.recorders.sqlite_reader
from __future__ import print_function, absolute_import
from sqlitedict import SqliteDict
from openmdao.recorders.case_reader_base import CaseReaderBase
from openmdao.recorders.case import Case
from openmdao.util.record_util import is_valid_sqlite3_db
[docs]class SqliteCaseReader(CaseReaderBase):
""" A CaseReader specific to files created with SqliteRecorder.
Parameters
----------
filename : str
The path to the filename containing the recorded data.
"""
def __init__(self, filename):
super(SqliteCaseReader, self).__init__(filename)
if filename is not None:
if not is_valid_sqlite3_db(filename):
raise IOError('File does not contain a valid '
'sqlite database ({0})'.format(filename))
with SqliteDict(self.filename, 'metadata', flag='r') as db:
self.format_version = db.get('format_version', None)
self._load()
self.num_cases = len(self._case_keys)
def _load(self):
""" The initial load of data from the sqlite database file.
Load the metadata from the sqlite file, populating the
`format_version`, `parameters`, and `unknowns` attributes of this
CaseReader.
The `iterations` table is read to load the keys which identify
the individual cases/iterations from the recorded file.
Parameters
----------
format_version : int
The version of the format assumed when loading the file.
"""
if self.format_version in (3, 4):
# Read the metadata and save it in the reader
with SqliteDict(self.filename, 'metadata', flag='r') as db:
self._parameters = db.get('Parameters', None)
self._unknowns = db.get('Unknowns', None)
# Store the identifier for each iteration in _case_keys
with SqliteDict(self.filename, 'iterations', flag='r') as db:
self._case_keys = tuple(db.keys())
else:
raise ValueError('SQliteCaseReader 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
# Initialize the Case object from the iterations data
with SqliteDict(self.filename, 'iterations', flag='r') as iter_db:
case = Case(self.filename, _case_id, iter_db[_case_id])
# Set the derivs data for the case if available
with SqliteDict(self.filename, 'derivs', flag='r') as derivs_db:
# If derivs weren't recorded then don't bother sending them
# to the Case.
if len(derivs_db) == 0:
pass
else:
if _case_id in derivs_db:
case._derivs = derivs_db[_case_id].get('Derivatives', None)
return case