(
player_name: str,
policy_path: str,
*,
episode_idx: int,
steps: int,
drones: int,
decision_timeout: float,
)
| 222 | |
| 223 | |
| 224 | def evaluate_player( |
| 225 | player_name: str, |
| 226 | policy_path: str, |
| 227 | *, |
| 228 | episode_idx: int, |
| 229 | steps: int, |
| 230 | drones: int, |
| 231 | decision_timeout: float, |
| 232 | ) -> dict: |
| 233 | seed = 4100 + episode_idx |
| 234 | random.seed(seed) |
| 235 | np.random.seed(seed) |
| 236 | policies = {} |
| 237 | |
| 238 | try: |
| 239 | from CybORG import CybORG |
| 240 | from CybORG.Agents.Wrappers.PettingZooParallelWrapper import PettingZooParallelWrapper |
| 241 | from CybORG.Simulator.Scenarios import DroneSwarmScenarioGenerator |
| 242 | |
| 243 | scenario = DroneSwarmScenarioGenerator(num_drones=drones) |
| 244 | env = PettingZooParallelWrapper(CybORG(scenario, "sim")) |
| 245 | observations = env.reset() |
| 246 | action_spaces = env.action_spaces |
| 247 | policies = { |
| 248 | agent_name: PolicyController(player_name, agent_name, policy_path, timeout=decision_timeout) |
| 249 | for agent_name in env.possible_agents |
| 250 | } |
| 251 | |
| 252 | step_rewards = [] |
| 253 | for _ in range(steps): |
| 254 | actions = { |
| 255 | agent_name: policies[agent_name].decide(observations[agent_name], action_spaces[agent_name]) |
| 256 | for agent_name in env.agents |
| 257 | } |
| 258 | observations, rewards, done, _info = env.step(actions) |
| 259 | step_rewards.append(mean(rewards.values())) |
| 260 | if all(done.values()): |
| 261 | break |
| 262 | |
| 263 | policy_errors = sum(len(policy.errors) for policy in policies.values()) |
| 264 | invalid_actions = sum(policy.invalid_actions for policy in policies.values()) |
| 265 | decisions = sum(policy.decisions for policy in policies.values()) |
| 266 | error_samples = [error for policy in policies.values() for error in policy.errors[:2]][:5] |
| 267 | |
| 268 | return { |
| 269 | "player": player_name, |
| 270 | "episode": episode_idx, |
| 271 | "score": float(sum(step_rewards)), |
| 272 | "steps_completed": len(step_rewards), |
| 273 | "decisions": decisions, |
| 274 | "policy_errors": policy_errors, |
| 275 | "invalid_actions": invalid_actions, |
| 276 | "policy_error_samples": error_samples, |
| 277 | "status": "ok", |
| 278 | } |
| 279 | except Exception as exc: |
| 280 | return { |
| 281 | "player": player_name, |
no test coverage detected