irregular6612 commited on
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