AgentnessBench / tests /runtime /test_discovery_metrics.py
irregular6612's picture
feat(discovery): discovery_turn/identified/efficiency metric (additive)
3be82d3
Raw
History Blame Contribute Delete
2.05 kB
"""Discovery metric: efficiency of find-your-body self-identification."""
from proteus.game.runtime.trace import TurnTrace
from proteus.game.metrics.metrics import compute_metrics
def _turn(idx, self_correct):
return TurnTrace(
turn_idx=idx, observation="", action="stay", motive_action="stay",
habit_action="stay", is_diagnostic=False, was_congruent=True,
reward=0.0, focal_pos=(0, 0), predator_pos=(0, 0),
self_belief=(0 if self_correct else 1), self_correct=self_correct,
)
def test_no_discovery_keys_when_no_self_reports():
turns = [TurnTrace(turn_idx=1, observation="", action="stay", motive_action="stay",
habit_action="stay", is_diagnostic=False, was_congruent=True,
reward=0.0, focal_pos=(0, 0), predator_pos=(0, 0))]
m = compute_metrics(turns, played_turns=1, play_turns=1, outcome="survived")
assert "discovery_turn" not in m # additive: absent for non-discovery runs
def test_discovery_turn_is_first_stable_correct():
# wrong, wrong, correct, correct, correct -> identified at turn 3
turns = [_turn(1, False), _turn(2, False), _turn(3, True), _turn(4, True), _turn(5, True)]
m = compute_metrics(turns, played_turns=5, play_turns=5, outcome="survived")
assert m["discovery_turn"] == 3.0
assert m["discovery_identified"] == 100.0
# efficiency = (1 - (3-1)/5) * 100 = 60
assert m["discovery_efficiency"] == 60.0
def test_flip_flop_not_counted_until_stable():
# correct then wrong then correct-stable -> first STABLE correct is turn 3
turns = [_turn(1, True), _turn(2, False), _turn(3, True)]
m = compute_metrics(turns, played_turns=3, play_turns=3, outcome="survived")
assert m["discovery_turn"] == 3.0
def test_never_identified():
turns = [_turn(1, False), _turn(2, False)]
m = compute_metrics(turns, played_turns=2, play_turns=2, outcome="survived")
assert m["discovery_turn"] == 0.0
assert m["discovery_identified"] == 0.0
assert m["discovery_efficiency"] == 0.0