JaamCTRL-OpenEnv / env /task_easy.py
Akshara
Fresh start: Clean repo without large file history - ready for HF Spaces
f4f43f0
""""
───────────────────────────────────────────────────────────────────────────────
Task 1 — Easy: Single intersection (Barakhamba Road).
This is a thin convenience wrapper around JaamCTRLTrafficEnv that:
- Hard-codes task_id = 1 so callers never need to pass it
- Documents the task contract clearly for judges and team members
- Exposes no new logic — all behaviour lives in base_env / reward / observation
Usage
-----
from env.task_easy import Task1Env
env = Task1Env(mock_sumo=True)
obs, info = env.reset()
obs, r, term, trunc, info = env.step(env.action_space.sample())
# Or via gymnasium.make after register_envs() is called:
import gymnasium
env = gymnasium.make("JaamCTRL-Easy-v0")
───────────────────────────────────────────────────────────────────────────────
Task contract
─────────────
Intersections : 1 (INT_1 — Barakhamba Road)
Vehicle mix : 100% passenger cars
Demand : 400 veh / hr (steady, no spike)
Incidents : none
Probe noise : none
Obs dim : 46 (slots for INT_2 and INT_3 zero-padded)
Action space : MultiDiscrete([4])
Episode steps : 300 (25 sim-minutes at 5 s/step)
Success : ≥15% delay reduction vs fixed-time baseline
"""
from __future__ import annotations
from typing import Any, Optional
from env.base_env import JaamCTRLTrafficEnv
class Task1Env(JaamCTRLTrafficEnv):
"""
Convenience wrapper for Task 1 (Easy).
Identical to JaamCTRLTrafficEnv(task_id=1); task_id is locked.
"""
def __init__(
self,
sumo_cfg_path: str = "sumo/corridor.sumocfg",
use_gui: bool = False,
port: int = 0,
seed: Optional[int] = None,
mock_sumo: bool = False,
) -> None:
super().__init__(
task_id = 1,
sumo_cfg_path = sumo_cfg_path,
use_gui = use_gui,
port = port,
seed = seed,
mock_sumo = mock_sumo,
)
def reset(self, *, seed=None, options: Optional[Any] = None):
# Strip any task_id from options — Task1Env is always task 1.
if options:
options = {k: v for k, v in options.items()
if k not in ("task_id", "difficulty")}
return super().reset(seed=seed, options=options)