From 8b506fd3a5b89ff381b9458e75868a35b24264c1 Mon Sep 17 00:00:00 2001 From: maedmatt Date: Thu, 5 Feb 2026 17:15:34 +0100 Subject: [PATCH 1/3] fix double experiment directory creation during training base_task.py was calling get_timestamp() independently, creating a second experiment directory a few seconds after train_agent.py. Now train_agent.py passes its experiment_dir through EnvConfig so both use the same directory. --- src/holosoma/holosoma/config_types/env.py | 4 ++-- .../holosoma/envs/base_task/base_task.py | 21 ++++++++++++------- src/holosoma/holosoma/train_agent.py | 1 + 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/holosoma/holosoma/config_types/env.py b/src/holosoma/holosoma/config_types/env.py index a296d5c29..7329157b5 100644 --- a/src/holosoma/holosoma/config_types/env.py +++ b/src/holosoma/holosoma/config_types/env.py @@ -1,7 +1,5 @@ from __future__ import annotations -from pydantic.dataclasses import dataclass - from holosoma.config_types.action import ActionManagerCfg from holosoma.config_types.command import CommandManagerCfg from holosoma.config_types.curriculum import CurriculumManagerCfg @@ -14,6 +12,7 @@ from holosoma.config_types.simulator import SimulatorConfig from holosoma.config_types.termination import TerminationManagerCfg from holosoma.config_types.terrain import TerrainManagerCfg +from pydantic.dataclasses import dataclass @dataclass(frozen=True) @@ -34,6 +33,7 @@ class EnvConfig: robot: RobotConfig training: TrainingConfig logger: LoggerConfig + experiment_dir: str | None = None def get_tyro_env_config(tyro_config: ExperimentConfig) -> EnvConfig: diff --git a/src/holosoma/holosoma/envs/base_task/base_task.py b/src/holosoma/holosoma/envs/base_task/base_task.py index e46675a6a..6b9f24292 100644 --- a/src/holosoma/holosoma/envs/base_task/base_task.py +++ b/src/holosoma/holosoma/envs/base_task/base_task.py @@ -1,7 +1,8 @@ from __future__ import annotations -import numpy as np +from pathlib import Path +import numpy as np from holosoma.config_types.env import EnvConfig from holosoma.config_types.full_sim import FullSimConfig from holosoma.managers.action import ActionManager @@ -76,13 +77,17 @@ def __init__( torch._C._jit_set_profiling_mode(False) torch._C._jit_set_profiling_executor(False) - # Compute experiment directory from logger config - from holosoma.utils.experiment_paths import get_experiment_dir, get_timestamp - - timestamp = get_timestamp() - experiment_dir = get_experiment_dir( - tyro_config.logger, tyro_config.training, timestamp, task_name=self._get_task_name() - ) + # Use pre-computed experiment directory if provided (from train_agent.py), + # otherwise compute one (for replay, eval, etc.) + if tyro_config.experiment_dir is not None: + experiment_dir = Path(tyro_config.experiment_dir) + else: + from holosoma.utils.experiment_paths import get_experiment_dir, get_timestamp # noqa: PLC0415 + + timestamp = get_timestamp() + experiment_dir = get_experiment_dir( + tyro_config.logger, tyro_config.training, timestamp, task_name=self._get_task_name() + ) SimulatorClass = get_class(simulator_config._target_) full_sim_config = FullSimConfig( diff --git a/src/holosoma/holosoma/train_agent.py b/src/holosoma/holosoma/train_agent.py index a6a40546a..44e918f28 100644 --- a/src/holosoma/holosoma/train_agent.py +++ b/src/holosoma/holosoma/train_agent.py @@ -249,6 +249,7 @@ def train(tyro_config: ExperimentConfig, training_context: TrainingContext | Non env_target = tyro_config.env_class tyro_env_config = get_tyro_env_config(tyro_config) + tyro_env_config = dataclasses.replace(tyro_env_config, experiment_dir=str(experiment_dir)) env = get_class(env_target)(tyro_env_config, device=device) # For manager system, pre-process config AFTER env creation From b8e34ed7da82340f69d30493a6d2b3764a6728bc Mon Sep 17 00:00:00 2001 From: maedmatt Date: Wed, 18 Feb 2026 08:46:23 +0000 Subject: [PATCH 2/3] move experiment_paths import to top of file --- src/holosoma/holosoma/envs/base_task/base_task.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/holosoma/holosoma/envs/base_task/base_task.py b/src/holosoma/holosoma/envs/base_task/base_task.py index 6b9f24292..9e23cd5a1 100644 --- a/src/holosoma/holosoma/envs/base_task/base_task.py +++ b/src/holosoma/holosoma/envs/base_task/base_task.py @@ -3,6 +3,7 @@ from pathlib import Path import numpy as np + from holosoma.config_types.env import EnvConfig from holosoma.config_types.full_sim import FullSimConfig from holosoma.managers.action import ActionManager @@ -15,6 +16,7 @@ from holosoma.managers.termination import TerminationManager from holosoma.managers.terrain import TerrainManager from holosoma.simulator.base_simulator.base_simulator import BaseSimulator +from holosoma.utils.experiment_paths import get_experiment_dir, get_timestamp from holosoma.utils.helpers import get_class from holosoma.utils.safe_torch_import import torch from holosoma.utils.torch_utils import to_torch @@ -82,8 +84,6 @@ def __init__( if tyro_config.experiment_dir is not None: experiment_dir = Path(tyro_config.experiment_dir) else: - from holosoma.utils.experiment_paths import get_experiment_dir, get_timestamp # noqa: PLC0415 - timestamp = get_timestamp() experiment_dir = get_experiment_dir( tyro_config.logger, tyro_config.training, timestamp, task_name=self._get_task_name() From 766fc160be6c7abe52e50f3953d39e31059a0c29 Mon Sep 17 00:00:00 2001 From: maedmatt Date: Thu, 19 Feb 2026 21:16:22 +0000 Subject: [PATCH 3/3] fix import order in env config --- src/holosoma/holosoma/config_types/env.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/holosoma/holosoma/config_types/env.py b/src/holosoma/holosoma/config_types/env.py index 7329157b5..01d20c55b 100644 --- a/src/holosoma/holosoma/config_types/env.py +++ b/src/holosoma/holosoma/config_types/env.py @@ -1,5 +1,7 @@ from __future__ import annotations +from pydantic.dataclasses import dataclass + from holosoma.config_types.action import ActionManagerCfg from holosoma.config_types.command import CommandManagerCfg from holosoma.config_types.curriculum import CurriculumManagerCfg @@ -12,7 +14,6 @@ from holosoma.config_types.simulator import SimulatorConfig from holosoma.config_types.termination import TerminationManagerCfg from holosoma.config_types.terrain import TerrainManagerCfg -from pydantic.dataclasses import dataclass @dataclass(frozen=True)