Spaces:
Runtime error
Runtime error
Commit ·
d25a6fe
1
Parent(s): 8064ddd
feat(cp8): record pre/post BFS distance + post positions per turn
Browse files
proteus/runtime/_session_core.py
CHANGED
|
@@ -177,12 +177,24 @@ def make_turn_trace(
|
|
| 177 |
predator = game.predator_sprite
|
| 178 |
focal_pos = (focal.x, focal.y) if focal else (-1, -1)
|
| 179 |
predator_pos = (predator.x, predator.y) if predator else (-1, -1)
|
|
|
|
| 180 |
|
| 181 |
blocked = apply_action(scenario, game, action)
|
| 182 |
reward = scenario.step_reward(
|
| 183 |
game, action, blocked,
|
| 184 |
focal_before=focal_pos, predator_before=predator_pos,
|
| 185 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 186 |
return TurnTrace(
|
| 187 |
turn_idx=turn_idx,
|
| 188 |
observation=observation,
|
|
@@ -206,6 +218,11 @@ def make_turn_trace(
|
|
| 206 |
input_tokens=input_tokens,
|
| 207 |
output_tokens=output_tokens,
|
| 208 |
thinking_tokens=thinking_tokens,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 209 |
)
|
| 210 |
|
| 211 |
|
|
|
|
| 177 |
predator = game.predator_sprite
|
| 178 |
focal_pos = (focal.x, focal.y) if focal else (-1, -1)
|
| 179 |
predator_pos = (predator.x, predator.y) if predator else (-1, -1)
|
| 180 |
+
pre_bfs = scenario.safety_distance(game)
|
| 181 |
|
| 182 |
blocked = apply_action(scenario, game, action)
|
| 183 |
reward = scenario.step_reward(
|
| 184 |
game, action, blocked,
|
| 185 |
focal_before=focal_pos, predator_before=predator_pos,
|
| 186 |
)
|
| 187 |
+
# CP8: post-move positions + pre/post BFS + chase-corrected delta.
|
| 188 |
+
post_focal = game.focal_sprite
|
| 189 |
+
post_predator = game.predator_sprite
|
| 190 |
+
post_focal_pos = (post_focal.x, post_focal.y) if post_focal else None
|
| 191 |
+
post_predator_pos = (
|
| 192 |
+
(post_predator.x, post_predator.y) if post_predator else None
|
| 193 |
+
)
|
| 194 |
+
post_bfs = scenario.safety_distance(game)
|
| 195 |
+
agent_distance_delta = scenario.agent_distance_delta(
|
| 196 |
+
game, focal_pos, predator_pos
|
| 197 |
+
)
|
| 198 |
return TurnTrace(
|
| 199 |
turn_idx=turn_idx,
|
| 200 |
observation=observation,
|
|
|
|
| 218 |
input_tokens=input_tokens,
|
| 219 |
output_tokens=output_tokens,
|
| 220 |
thinking_tokens=thinking_tokens,
|
| 221 |
+
post_focal_pos=post_focal_pos,
|
| 222 |
+
post_predator_pos=post_predator_pos,
|
| 223 |
+
pre_bfs_distance=pre_bfs,
|
| 224 |
+
post_bfs_distance=post_bfs,
|
| 225 |
+
agent_distance_delta=agent_distance_delta,
|
| 226 |
)
|
| 227 |
|
| 228 |
|
proteus/runtime/session.py
CHANGED
|
@@ -112,6 +112,7 @@ class SessionRunner:
|
|
| 112 |
predator = self._game.predator_sprite
|
| 113 |
focal_pos = (focal.x, focal.y) if focal else (-1, -1)
|
| 114 |
predator_pos = (predator.x, predator.y) if predator else (-1, -1)
|
|
|
|
| 115 |
|
| 116 |
result = self._agent.act(observation, list(_ACTIONS), system_prompt)
|
| 117 |
|
|
@@ -120,6 +121,17 @@ class SessionRunner:
|
|
| 120 |
self._game, result.action, blocked,
|
| 121 |
focal_before=focal_pos, predator_before=predator_pos,
|
| 122 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 123 |
|
| 124 |
turns.append(
|
| 125 |
TurnTrace(
|
|
@@ -145,6 +157,11 @@ class SessionRunner:
|
|
| 145 |
input_tokens=result.input_tokens,
|
| 146 |
output_tokens=result.output_tokens,
|
| 147 |
thinking_tokens=result.thinking_tokens,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 148 |
)
|
| 149 |
)
|
| 150 |
|
|
|
|
| 112 |
predator = self._game.predator_sprite
|
| 113 |
focal_pos = (focal.x, focal.y) if focal else (-1, -1)
|
| 114 |
predator_pos = (predator.x, predator.y) if predator else (-1, -1)
|
| 115 |
+
pre_bfs = self._scenario.safety_distance(self._game)
|
| 116 |
|
| 117 |
result = self._agent.act(observation, list(_ACTIONS), system_prompt)
|
| 118 |
|
|
|
|
| 121 |
self._game, result.action, blocked,
|
| 122 |
focal_before=focal_pos, predator_before=predator_pos,
|
| 123 |
)
|
| 124 |
+
# CP8: post-move positions + pre/post BFS + chase-corrected delta.
|
| 125 |
+
post_focal = self._game.focal_sprite
|
| 126 |
+
post_predator = self._game.predator_sprite
|
| 127 |
+
post_focal_pos = (post_focal.x, post_focal.y) if post_focal else None
|
| 128 |
+
post_predator_pos = (
|
| 129 |
+
(post_predator.x, post_predator.y) if post_predator else None
|
| 130 |
+
)
|
| 131 |
+
post_bfs = self._scenario.safety_distance(self._game)
|
| 132 |
+
agent_distance_delta = self._scenario.agent_distance_delta(
|
| 133 |
+
self._game, focal_pos, predator_pos
|
| 134 |
+
)
|
| 135 |
|
| 136 |
turns.append(
|
| 137 |
TurnTrace(
|
|
|
|
| 157 |
input_tokens=result.input_tokens,
|
| 158 |
output_tokens=result.output_tokens,
|
| 159 |
thinking_tokens=result.thinking_tokens,
|
| 160 |
+
post_focal_pos=post_focal_pos,
|
| 161 |
+
post_predator_pos=post_predator_pos,
|
| 162 |
+
pre_bfs_distance=pre_bfs,
|
| 163 |
+
post_bfs_distance=post_bfs,
|
| 164 |
+
agent_distance_delta=agent_distance_delta,
|
| 165 |
)
|
| 166 |
)
|
| 167 |
|
tests/runtime/test_session_distance.py
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import proteus.grid # noqa: F401
|
| 2 |
+
from proteus.grid.difficulty import Difficulty
|
| 3 |
+
from proteus.providers import FakeProvider
|
| 4 |
+
from proteus.agents import VanillaAgent
|
| 5 |
+
from proteus.runtime import SessionRunner
|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
def test_each_turn_records_pre_and_post_bfs_distance():
|
| 9 |
+
prov = FakeProvider(["ACTION: up"] * 10, model_name="demo")
|
| 10 |
+
trace = SessionRunner(
|
| 11 |
+
"predator_evade", VanillaAgent(prov), difficulty=Difficulty.EASY,
|
| 12 |
+
seed=42, play_turns=4, use_probe=False,
|
| 13 |
+
).run()
|
| 14 |
+
for t in trace.turns:
|
| 15 |
+
assert t.pre_bfs_distance is not None
|
| 16 |
+
assert t.post_bfs_distance is not None
|
| 17 |
+
assert t.post_focal_pos is not None
|
| 18 |
+
# spec §9: away-move quality is measured vs the PRE-move predator cell
|
| 19 |
+
first = trace.turns[0]
|
| 20 |
+
assert first.agent_distance_delta is not None
|