Source code for imitation.util.sacred_file_parsing
"""Utilities to parse sacred run directories."""
import json
import pathlib
import warnings
from collections import defaultdict
from typing import Any, Dict, Generator, List, Tuple
SacredRun = Dict[str, Any]
SacredConfAndRun = Tuple[Dict[str, Any], SacredRun]
GroupedRuns = Dict[str, Dict[str, List[SacredRun]]]
[docs]def find_sacred_runs(
run_path: pathlib.Path,
only_completed_runs: bool = False,
) -> Generator[SacredConfAndRun, None, None]:
"""Recursively iterates the sacred runs found below the given path.
Assumes runs in the format of the sacred FileStorageObserver: each run consists
of a folder that contains a config.json and a run.json file.
Note: will work with nested directories and can therefore be applied to the
`output/sacred` folder of the command line interface which creates sub-folders for
each script.
Args:
run_path: The path to search for sacred run directories.
only_completed_runs: If True, only yields runs that have a run.json file with
status "COMPLETED".
Yields:
Tuples of (config, run) dicts.
"""
for config_path in run_path.rglob("config.json"):
run_path = config_path.parent / "run.json"
if run_path.exists():
run = json.loads(run_path.read_text())
if only_completed_runs and run["status"] != "COMPLETED":
continue
conf = json.loads(config_path.read_text())
yield conf, run
else: # pragma: no cover
warnings.warn(f"Run {config_path.parent} has no run.json")
[docs]def group_runs_by_algo_and_env(
path: pathlib.Path,
only_completed_runs: bool = False,
) -> GroupedRuns:
"""Groups the runs found below the given path by algorithm and environment.
Access all the runs of algorithm `algo` and environment `env` via
`runs_by_algo_and_env[algo][env]`.
Args:
path: The path to search for sacred run directories.
only_completed_runs: If True, only yields runs that have a run.json file with
status "COMPLETED".
Returns:
A dictionary mapping algorithms to environments to lists of runs.
"""
runs_by_algo_and_env: GroupedRuns = defaultdict(lambda: defaultdict(list))
for conf, run in find_sacred_runs(path, only_completed_runs):
algo = run["command"]
env = conf["environment"]["gym_id"]
runs_by_algo_and_env[algo][env].append(run)
return runs_by_algo_and_env