alien-physics-openenv / curriculum.py
LostDecimal's picture
fix: GRPO zero-gradient trap, DSL prompt seed, best_reward, teacher oracle
0b77231
Raw History Blame Contribute Delete
2.58 kB
"""Oracle curriculum generation for staged code-agent training."""
from __future__ import annotations
import json
from pathlib import Path
from typing import Iterable
try:
from .baselines import get_baseline
from .config import ExperimentConfig
from .models import OntologyArchitectAction
from .server.ontology_architect_environment import OntologyArchitectEnvironment
except ImportError: # pragma: no cover
from baselines import get_baseline
from config import ExperimentConfig
from models import OntologyArchitectAction
from server.ontology_architect_environment import OntologyArchitectEnvironment
def generate_oracle_curriculum(
config: ExperimentConfig,
output_path: str | Path,
episodes: int = 3,
teacher_name: str = "dual_fluid_dsl",
) -> list[dict]:
output = Path(output_path)
output.parent.mkdir(parents=True, exist_ok=True)
examples: list[dict] = []
teacher_module = get_baseline(teacher_name)
with output.open("w", encoding="utf-8") as handle:
for episode_index in range(episodes):
env = OntologyArchitectEnvironment(config)
observation = env.reset()
for step_index in range(config.universe.max_steps):
example = {
"episode": episode_index,
"step": step_index,
"prompt": observation.text,
"completion": teacher_module,
"teacher": teacher_name,
}
result = env.step(
OntologyArchitectAction(
theory_module=teacher_module,
revision_note="oracle curriculum teacher rewrite",
)
)
example["reward"] = result.reward
example["metrics"] = result.metadata.get("last_metrics", {})
handle.write(json.dumps(example, sort_keys=True) + "\n")
examples.append(example)
observation = result
if result.done:
break
return examples
def read_jsonl(path: str | Path) -> list[dict]:
with Path(path).open("r", encoding="utf-8") as handle:
return [json.loads(line) for line in handle if line.strip()]
def write_jsonl(rows: Iterable[dict], path: str | Path) -> None:
output = Path(path)
output.parent.mkdir(parents=True, exist_ok=True)
with output.open("w", encoding="utf-8") as handle:
for row in rows:
handle.write(json.dumps(row, sort_keys=True) + "\n")