Source code for openmdao.utils.iter_utils
"""
Various utilities for working with iterators.
"""
[docs]def meta2item_iter(meta_iter, item):
"""
Convert a metadata iterator to an iterator over (name, <item>).
Parameters
----------
meta_iter : iter of (name, meta)
Iterator over variable names and their metadata dicts.
item : str
The name of the item to extract from the metadata.
Yields
------
tuple
Tuple of (name, <item>) for each variable.
"""
for name, meta in meta_iter:
yield name, meta[item]
[docs]def meta2items_iter(meta_iter, items):
"""
Convert a metadata iterator to an iterator over [name, meta[item0], meta[item1], ...].
Parameters
----------
meta_iter : iter of (name, meta)
Iterator over variable names and their metadata dicts.
items : list of str
The names of the items to extract from the metadata.
Yields
------
list
[name, meta[item0], meta[item1], ...] for each variable.
"""
for name, meta in meta_iter:
to_yield = [name]
for item in items:
to_yield.append(meta[item])
yield to_yield
[docs]def size2range_iter(size_iter):
"""
Convert a size iterator to a range iterator.
Parameters
----------
size_iter : iter of (name, size)
Iterator over variable names and their sizes.
Yields
------
tuple
Tuple of (name, (start, end)) for each variable.
"""
start = end = 0
for name, size in size_iter:
end += size
yield name, (start, end)
start = end
[docs]def meta2range_iter(meta_iter, size_name='size', subset=None):
"""
Iterate over variables and their ranges, based on size metadata for each variable.
Parameters
----------
meta_iter : iterator over (name, meta)
Iterator over variable name and metadata (which contains size information).
size_name : str
Name of the size metadata entry. Defaults to 'size', but could also be 'global_size'.
subset : iter of str or None
If not None, restrict the ranges to those variables contained in subset.
Yields
------
str
Name of variable.
int
Starting index.
int
Ending index.
"""
start = end = 0
if subset is None:
for name, meta in meta_iter:
end += meta[size_name]
yield name, start, end
start = end
else:
if not isinstance(subset, (set, dict)):
subset = set(subset)
seen = set()
for name, meta in meta_iter:
end += meta[size_name]
if name in subset:
yield name, start, end
seen.add(name)
start = end
if subset - seen:
raise KeyError(f"In meta2range_iter, subset members {sorted(subset - seen)} not found.")