SDK-Sovereign / scripts /run_random_episodes.py
ishansurdi's picture
Implement Phase 8 plots and Phase 9 play demo plumbing
8aca626
Raw History Blame Contribute Delete
2.76 kB
"""Smoke loop over multiple episodes using a random policy."""
from __future__ import annotations
import random
import statistics
from models import SDKAction
from server.environment import SDKSovereignEnvironment
def _random_action(obs, rng: random.Random) -> SDKAction:
"""Sample a random valid action for the current role."""
if obs.current_role == "auditor":
choice = rng.choice(["pass", "approve", "reject"])
if choice == "reject":
return SDKAction(
role="auditor",
action_type="reject",
rejection_reason="Random auditor rejection for exploration.",
reasoning="Exploration policy.",
)
return SDKAction(role="auditor", action_type=choice, reasoning="Exploration policy.")
choice = rng.choice(["pass", "propose_replacement", "submit_patch"])
if choice == "propose_replacement":
candidate = rng.choice(["razorpay", "mmi_sdk", "kaleyra", "unknown_sdk"])
return SDKAction(
role="lead",
action_type="propose_replacement",
proposed_sdk=candidate,
reasoning="Random proposal for exploration.",
)
if choice == "submit_patch":
snippet = rng.choice(
[
"import razorpay\ndef charge_customer(a, c):\n return {'id': 'x', 'status': 'captured'}",
"import mmi_sdk\ndef address_to_coords(a):\n return {'lat': 12.0, 'lng': 77.0}",
"import kaleyra\ndef send_otp(p, c):\n return {'sid': 'k1', 'status': 'sent'}",
"def malformed(:\n pass",
]
)
return SDKAction(
role="lead",
action_type="submit_patch",
patched_code=snippet,
reasoning="Random patch submission for exploration.",
)
return SDKAction(role="lead", action_type="pass", reasoning="Exploration policy.")
def main() -> None:
"""Run ten episodes and print reward summary statistics."""
env = SDKSovereignEnvironment(seed=1)
rng = random.Random(11)
rewards: list[float] = []
for index in range(10):
observation = env.reset()
while not observation.done:
observation = env.step(_random_action(observation, rng))
total = sum(env.state.cumulative_reward_by_role.values())
rewards.append(total)
print(
f"Episode {index + 1:02d}: total_reward={total:+6.2f} "
f"repo={env.state.repo_id} "
f"reason={env.state.terminated_reason}"
)
stdev = statistics.stdev(rewards) if len(rewards) > 1 else 0.0
print(f"\nMean: {statistics.mean(rewards):+.2f} Stdev: {stdev:.2f}")
if __name__ == "__main__":
main()