Repo2RLEnv
Full prompts (generated)

SCALER: instruction construction

Edit on GitHub

This recipe makes zero LLM calls. Its generator and reference are supplied programs executed remotely. The code below shows exactly how the concrete learner instruction is assembled; it is not a system prompt sent to a model. See the walkthrough.

Instruction assembly and instance contract

families.py

Source: src/repo2rlenv/pipelines/recipes/scaler/families.py · SHA-256 0b36f4d19d6103cc30d8454743a3ebe8da7f4a2b49f2f6bc96a223416512d93b

Source hash covers the original file; trailing whitespace is omitted below.

Read families.py
"""Difficulty scaling and native generator result parsing without code execution."""

from __future__ import annotations

import ast
import hashlib
import json
import math
from decimal import Decimal
from pathlib import Path


def load_families(path: Path) -> tuple[dict, str]:
    payload = path.read_bytes()
    if len(payload) > 32 * 1024 * 1024:
        raise ValueError("Family input exceeds 32 MiB")
    data = json.loads(payload)
    if not isinstance(data, dict) or not data:
        raise ValueError("SCALER expects a native mapping of family names to definitions")
    for name, family in data.items():
        if not isinstance(name, str) or not isinstance(family, dict):
            raise ValueError("Invalid family definition")
        for key in (
            "name",
            "logic_description",
            "generate_testcase",
            "params",
            "difficulty_dict",
            "solutions",
        ):
            if not family.get(key):
                raise ValueError(f"Family {name!r} lacks {key}")
        solutions = family["solutions"]
        if len(solutions["solution"]) != len(solutions["language"]) or not any(
            lang in {2, 3} for lang in solutions["language"]
        ):
            raise ValueError("Family requires aligned Python/C++ reference programs")
        answer_contract(family)
    return data, hashlib.sha256(payload).hexdigest()


def answer_contract(family: dict) -> dict:
    """Keep answer semantics explicit; do not guess tolerances from prose."""
    kind = family.get("output_type")
    if kind is None:
        return {}  # Older family fixtures use the original math-verify route.
    if kind not in {"number", "string", "array"}:
        raise ValueError("Unsupported family output_type")
    contract = {"output_type": kind}
    tolerance = family.get("answer_tolerance", {})
    if not isinstance(tolerance, dict) or set(tolerance) - {"absolute", "relative"}:
        raise ValueError("Answer tolerance requires absolute/relative values")
    if tolerance and kind == "string":
        raise ValueError("String outputs cannot have numeric tolerances")
    for key, value in tolerance.items():
        number = Decimal(str(value))
        if not number.is_finite() or not 0 <= number < 1:
            raise ValueError("Answer tolerance must be finite, nonnegative and below one")
        contract[key + "_tolerance"] = str(number)
    return contract


def scale_parameters(family: dict, difficulty: int) -> dict[str, int]:
    scale = family["difficulty_dict"][str(difficulty)]
    if not isinstance(scale, (int, float)) or not math.isfinite(scale) or scale < 0:
        raise ValueError("Difficulty scale must be finite and nonnegative")
    return {
        key: int(scale * value.get("base", 1.0) + value["min"])
        for key, value in family["params"].items()
        if key != "difficulty"
    }


def parse_testcase(text: str) -> tuple[str, dict]:
    """Retain the native first-comma parser and JSON/Python-literal fallback."""
    value = text.strip()
    if value.startswith("(") and value.endswith(")"):
        value = value[1:-1].strip()
    parts = value.split(",", 1)
    if len(parts) != 2:
        raise ValueError("Generator must emit a string and concrete-input dictionary")
    stdin, detail = parts[0].strip(), parts[1].strip()
    if len(stdin) >= 2 and stdin[0] in {"'", '"'} and stdin[-1] == stdin[0]:
        try:
            parsed = ast.literal_eval(stdin)
            if isinstance(parsed, str):
                stdin = parsed
        except (SyntaxError, ValueError):
            pass
    try:
        detail = json.loads(detail.replace("'", '"'))
    except json.JSONDecodeError:
        detail = ast.literal_eval(detail)
    if not isinstance(detail, dict):
        raise ValueError("Generator detail must be a dictionary")
    return stdin, detail


def instruction_for(family: dict, detail: dict) -> str:
    text = f"# {family['name']} Problem Description:\n{family['logic_description']}\n\n# Input Instance:\n{detail}\n\n# Instruction\n{family.get('instruction', '')}\n"
    text += "Treat the description as a single fully specified math/algorithm problem about the given concrete input, and ignore any mentions of writing a program, input/output formats, or multiple test cases. Reason step by step to compute the required answer for this instance.\n"
    if family.get("output_type") == "array":
        text += (
            r"Output all required numerical answers in \boxed{[]} as a one-dimensional array."
            + "\n"
        )
    contract = answer_contract(family)
    if family.get("output_type") == "string":
        text += "Preserve the complete output string, including any leading zeros.\n"
    if family.get("output_type") in {"number", "array"}:
        text += "Use decimal numbers (scientific notation is allowed).\n"
    if family.get("answer_tolerance"):
        text += (
            "A numeric answer is accepted when its absolute error is at most "
            f"{contract.get('absolute_tolerance', '0')} or its relative error is at most "
            f"{contract.get('relative_tolerance', '0')}.\n"
        )
    return (
        text + r"Write your final answer to `/workspace/answer.txt`, using \boxed{answer}." + "\n"
    )

On this page