Spaces:
Sleeping
Sleeping
| """Shared helpers for A/B/C condition comparisons.""" | |
| from __future__ import annotations | |
| from environments.pomir_env.env import POMIREnv | |
| from training.baselines.random_commander import RandomCommander | |
| def _difficulty_for_episode(index: int, requested: str) -> str: | |
| if requested != "mixed": | |
| return requested | |
| cycle = ("easy", "medium", "hard") | |
| return cycle[index % len(cycle)] | |
| def run_condition(condition: str, steps: int, difficulty: str) -> list[dict[str, object]]: | |
| records: list[dict[str, object]] = [] | |
| for episode in range(steps): | |
| if condition == "B": | |
| env = POMIREnv( | |
| mode="deterministic", | |
| specialist_mode="deterministic", | |
| observation_mode="single_agent", | |
| ) | |
| else: | |
| env = POMIREnv( | |
| mode="deterministic", | |
| specialist_mode="deterministic", | |
| observation_mode="multi_agent", | |
| ) | |
| obs = env.reset(difficulty=_difficulty_for_episode(episode, difficulty), seed=42 + episode) | |
| random_commander = RandomCommander(seed=100 + episode) | |
| random_commander.reset() | |
| total_reward = 0.0 | |
| total_component_rewards = { | |
| "r1_resolution": 0.0, | |
| "r2_root_cause": 0.0, | |
| "r3_coordination": 0.0, | |
| "r4_efficiency": 0.0, | |
| "r5_trust": 0.0, | |
| "penalty_wrong_target": 0.0, | |
| } | |
| actions: list[dict[str, str]] = [] | |
| while not obs.done: | |
| if condition == "A": | |
| action = random_commander.act(env.allowed_action_strings) | |
| else: | |
| action = env.decide_next_action() | |
| obs = env.step(action) | |
| actions.append(action.model_dump()) | |
| total_reward += float(obs.reward_breakdown.get("total", 0.0)) | |
| for key in total_component_rewards: | |
| total_component_rewards[key] += float(obs.reward_breakdown.get(key, 0.0)) | |
| records.append( | |
| { | |
| "episode": episode, | |
| "condition": condition, | |
| "difficulty": env.master_env.state.difficulty, | |
| "scenario_id": env.master_env.state.scenario_id, | |
| "success": obs.incident_resolved, | |
| "steps": len(actions), | |
| "total_reward": round(total_reward, 3), | |
| "actions": actions, | |
| **{key: round(value, 3) for key, value in total_component_rewards.items()}, | |
| } | |
| ) | |
| return records | |