forgeenv-source / tests /test_evaluators.py
akhiilll's picture
forgeenv source snapshot for training job
a15535e verified
"""Tests for visible verifier, held-out evaluator, and R-Zero reward functions."""
from forgeenv.tasks.models import ExecutionResult, Task
from forgeenv.training.reward_functions import (
compute_alignment_score,
compute_drift_gen_reward,
compute_repetition_penalty,
compute_uncertainty_reward,
)
from forgeenv.verifier.held_out_evaluator import compute_held_out_scores
from forgeenv.verifier.visible_verifier import compute_visible_reward
SAMPLE_TASK = Task(
task_id="test_001",
description="Test task",
script_content=(
"from transformers import Trainer\n"
"trainer = Trainer()\n"
"trainer.train()\n"
),
difficulty="easy",
)
def test_visible_reward_success():
result = ExecutionResult(
exit_code=0,
stdout="step=1 loss=3.5\nstep=2 loss=2.1\nTRAINING_COMPLETE",
stderr="",
wall_time_ms=1000,
checkpoint_exists=True,
script_content=SAMPLE_TASK.script_content,
)
reward, breakdown = compute_visible_reward(result, SAMPLE_TASK)
assert reward > 0, f"Successful run should have positive reward, got {reward}"
assert breakdown["script_executes"] == 1.0
assert breakdown["loss_decreased"] > 0
def test_visible_reward_failure():
result = ExecutionResult(
exit_code=1,
stdout="",
stderr="Error",
wall_time_ms=100,
script_content=SAMPLE_TASK.script_content,
)
reward, breakdown = compute_visible_reward(result, SAMPLE_TASK)
assert breakdown["script_executes"] == 0.0
assert reward <= 0.0
def test_held_out_success():
result = ExecutionResult(
exit_code=0,
stdout="step=1 loss=3.5\nstep=2 loss=2.1\neval_accuracy=0.78\nTRAINING_COMPLETE",
stderr="",
wall_time_ms=1000,
checkpoint_exists=True,
script_content=SAMPLE_TASK.script_content,
)
scores = compute_held_out_scores(result, SAMPLE_TASK)
assert scores["executed_cleanly"] == 1.0
assert scores["loss_decreased"] > 0
assert scores["hidden_tests_passed"] == 1.0
assert scores["intent_preserved"] == 1.0
def test_held_out_workaround_detection():
"""Bare except wrapping all code should reduce no_forbidden_workarounds."""
result = ExecutionResult(
exit_code=0,
stdout="TRAINING_COMPLETE",
stderr="",
wall_time_ms=100,
checkpoint_exists=True,
script_content="try:\n bad()\nexcept:\n pass\n",
)
scores = compute_held_out_scores(result, SAMPLE_TASK)
assert scores["no_forbidden_workarounds"] < 1.0
def test_uncertainty_peaks_at_half():
r_half = compute_uncertainty_reward([True, False, True, False, True, False])
r_all = compute_uncertainty_reward([True, True, True, True])
r_none = compute_uncertainty_reward([False, False, False, False])
assert r_half > r_all
assert r_half > r_none
assert abs(r_all) < 0.01
assert abs(r_none) < 0.01
def test_uncertainty_handles_empty():
assert compute_uncertainty_reward([]) == 0.0
def test_repetition_penalty_higher_for_duplicates():
batch = [
"rename evaluate to eval_model",
"rename evaluate to eval_model",
"rename evaluate to eval_model",
"change import path for trainer",
]
p_dup = compute_repetition_penalty(batch[0], batch)
p_unique = compute_repetition_penalty(batch[3], batch)
assert p_dup >= p_unique
def test_drift_gen_reward_combines_signals():
"""Composite reward should rise with uncertainty and fall with repetition."""
high_unc_unique = compute_drift_gen_reward(
"unique unique unique tokens",
[True, False, True, False],
["totally different a b c", "unique unique unique tokens"],
)
high_unc_repeated = compute_drift_gen_reward(
"same same same same",
[True, False, True, False],
["same same same same", "same same same same", "same same same same"],
)
assert high_unc_unique >= high_unc_repeated
def test_alignment_score_perfect_correlation():
visible = [0.0, 0.25, 0.5, 0.75, 1.0]
held_out = [0.0, 0.25, 0.5, 0.75, 1.0]
assert compute_alignment_score(visible, held_out) > 0.99
def test_alignment_score_anti_correlation():
visible = [1.0, 0.5, 0.0]
held_out = [0.0, 0.5, 1.0]
assert compute_alignment_score(visible, held_out) < -0.99
def test_alignment_score_constant_returns_zero():
"""No variance in either array → no signal → 0.0."""
assert compute_alignment_score([0.5, 0.5, 0.5], [0.1, 0.9, 0.4]) == 0.0