Skip to content

Instantly share code, notes, and snippets.

@PhilipVinc
Last active June 14, 2022 17:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save PhilipVinc/e25cfea5916f86c9a78cf9981441baa9 to your computer and use it in GitHub Desktop.
Save PhilipVinc/e25cfea5916f86c9a78cf9981441baa9 to your computer and use it in GitHub Desktop.
tree log
def tree_log(tree, root, data, *, iter=None):
if tree is None:
return
elif isinstance(tree, list):
for (i, val) in enumerate(tree):
tree_log(val, f"{root}/{i}", data, iter=iter)
# handle namedtuples
elif isinstance(tree, list) and hasattr(tree, "_fields"):
tree_log(iter, f"{root}/iter", data)
for key in tree._fields:
tree_log(getattr(tree, key), f"root/{key}", data)
elif isinstance(tree, tuple):
tree_log(iter, f"{root}/iter", data)
for (i, val) in enumerate(tree):
tree_log(val, f"{root}/{i}", data)
elif isinstance(tree, dict):
for key, value in tree.items():
tree_log(value, f"{root}/{key}", data, iter=iter) # noqa: F722
elif hasattr(tree, "to_compound"):
tree_log(tree.to_dict(), f"{root}/iter", data)
tree_log(tree.to_compound()[1], root, data) # noqa: F722
elif hasattr(tree, "to_dict"):
tree_log(tree.to_dict(), f"{root}/iter", data)
tree_log(iter, root, data) # noqa: F722
else:
if iter is not None:
tree_log(iter, f"{root}/iter", data)
root = f"{root}/value"
value = np.asarray(tree)
if root in data:
f_value = data[root]
f_value.resize(f_value.shape[0]+1, axis=0)
f_value[-1] = value
else:
maxshape = (None, ) + value.shape
data.create_dataset(root, data=[value], maxshape = maxshape)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment