Spaces:
Sleeping
Sleeping
File size: 4,896 Bytes
4904e85 6172160 4904e85 e259b96 4904e85 6172160 4904e85 6172160 4904e85 6172160 4904e85 6172160 4904e85 6172160 4904e85 e259b96 6172160 4904e85 6172160 4904e85 6172160 4904e85 e259b96 4904e85 6172160 4904e85 6172160 4904e85 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | #!/usr/bin/env python3
"""Demo script showing the 911 dispatch supervisor environment in action.
This non-interactive demo runs an episode using OpenEnvEnvironment directly
(no LLM/API server required). It uses `legal_actions()` so it is seed/task
independent.
"""
import asyncio
import sys
from src.models import Action, DispatchAction
from src.openenv_environment import OpenEnvEnvironment
async def run_demo_episode(
seed: int = 42, task_id: str = "multi_incident", max_steps: int = 120
) -> dict:
"""Run a deterministic demo episode."""
print("=" * 60)
print("911 DISPATCH SUPERVISOR - DEMO EPISODE")
print("=" * 60)
print(f"Task: {task_id}")
print(f"Seed: {seed}")
print("-" * 60)
# Initialize environment
env = OpenEnvEnvironment(task_id=task_id, seed=seed)
try:
# Reset environment
observation = await env.reset()
state = env.state()
print(f"Episode ID: {state.episode_id}")
print(f"Initial incidents: {len(state.incidents)}")
print(f"Initial units: {len(state.units)}")
for inc in sorted(state.incidents.values(), key=lambda i: i.incident_id):
print(
f" - {inc.incident_id}: {inc.incident_type.value} {inc.severity.value} ({inc.status.value})"
)
print("-" * 60)
# Track episode progress
step_count = 0
total_reward = 0.0
rewards = []
errors = []
# Step through the environment using only legal actions.
while step_count < max_steps:
legal = env.legal_actions()
if not legal:
break
action = legal[0]
step_count += 1
try:
obs, reward, done = await env.step(action)
rewards.append(reward)
total_reward += reward
print(
f"[STEP {step_count}] Action: {action.action_type.value} {action.unit_id}->{action.incident_id} "
f"Reward: {reward:.4f} Done: {done} Issues: {obs.issues}"
)
if done:
break
except Exception as e:
errors.append(f"Step {step_count}: {str(e)}")
print(f"[STEP {step_count}] ERROR: {e}")
break
# Final state
final_state = env.state()
# Calculate final score
final_score = min(1.0, total_reward)
print("-" * 60)
print("EPISODE SUMMARY")
print("-" * 60)
print(f"Task ID: {task_id}")
print(f"Episode ID: {final_state.episode_id}")
print(f"Steps Taken: {step_count}")
print(f"Total Reward: {total_reward:.4f}")
print(f"Final Score: {final_score:.4f}")
print(f"Active incidents: {sum(1 for i in final_state.incidents.values() if i.status.value != 'RESOLVED')}")
print("\n" + "β" * 60)
print(f"{'Incident':<12} {'Type':<22} {'Severity':<12} {'Status':<12}")
print("β" * 60)
for inc in sorted(final_state.incidents.values(), key=lambda i: i.incident_id):
print(
f"{inc.incident_id:<12} {inc.incident_type.value:<22} {inc.severity.value:<12} {inc.status.value:<12}"
)
print("β" * 60)
if errors:
print(f"\nErrors encountered: {len(errors)}")
for err in errors:
print(f" - {err}")
else:
print(f"\nErrors: None")
print("=" * 60)
return {
"task_id": task_id,
"episode_id": final_state.episode_id,
"steps": step_count,
"total_reward": total_reward,
"final_score": final_score,
"errors": errors,
}
finally:
env.close()
def main() -> int:
"""Main entry point for demo script."""
print("\n")
print("ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ")
print("β 911 DISPATCH SUPERVISOR DEMO β")
print("β City-wide emergency dispatch RL environment β")
print("ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ")
print("\n")
try:
result = asyncio.run(
run_demo_episode(seed=42, task_id="multi_incident", max_steps=120)
)
print("\n[SUCCESS] Demo episode completed successfully!")
return 0
except Exception as e:
print(f"\n[FATAL ERROR] {e}")
import traceback
traceback.print_exc()
return 1
if __name__ == "__main__":
sys.exit(main())
|