Source code for minerva.cli.experiment

import os
import time
import yaml
from minerva.pipelines.experiment import Experiment
from jsonargparse import auto_cli, capture_parser, strip_meta


[docs] def get_parser(): return capture_parser( lambda: auto_cli(Experiment, as_positional=False, fail_untyped=True) )
[docs] def timestamp_now(): return time.strftime("%Y-%m-%d_%H-%M-%S", time.localtime())
[docs] def write_experiment_config(experiment, string): # create root log directory if it does not exist runs_dir = experiment.log_dir / "runs" runs_dir.mkdir(parents=True, exist_ok=True) # write the configuration to a file config_file = runs_dir / f"config_{experiment.run_id}.yaml" with open(config_file, "w") as f: f.write(string) print(f"Configuration saved to '{config_file}'") return config_file
[docs] def write_system_info(experiment): # create root log directory if it does not exist runs_dir = experiment.log_dir / "runs" runs_dir.mkdir(parents=True, exist_ok=True) # write the system info to a file system_info_file = runs_dir / f"system_info_{experiment.run_id}.yaml" info = experiment.system_info with open(system_info_file, "w") as f: yaml.dump(info, f) print(f"System info saved to '{system_info_file}'") return system_info_file
[docs] def main(): parser = get_parser() args = parser.parse_args() args = strip_meta(args) string = parser.dump(args, format="parser_mode") run = parser.instantiate_classes(args).as_dict() command_to_run = run.pop("subcommand", None) command_to_run_args = run.pop(command_to_run, None) run.pop("config", None) command_to_run_args.pop("config", None) # Instantiate the class with the provided arguments experiment = Experiment(**run) if command_to_run: func = getattr(experiment, command_to_run, None) if func is None: raise ValueError( f"Command '{command_to_run}' not found in {experiment.__class__.__name__}." ) if not callable(func): raise ValueError( f"Command '{command_to_run}' is not callable in {experiment.__class__.__name__}." ) if command_to_run_args is None: command_to_run_args = {} is_debug = command_to_run_args.get("debug", False) if is_debug: print("Running in debug mode. Outputs will not be logged to files.") experiment.log_outputs = False else: print(f"Logging outputs to {experiment.log_dir}") write_experiment_config(experiment, string) write_system_info(experiment) print(f"Running command: {command_to_run} with args: {command_to_run_args}") print("\n") print("-" * 80) print(experiment) print("-" * 80) print("\n") result = func(**command_to_run_args) print("Experiment completed successfully!") print(f"Result: {result}") print("✨ 🍰 ✨") else: write_experiment_config(experiment, string) print("No command provided. Configuration file has been written.")
if __name__ == "__main__": main()