researchpath / scripts /plan.py
Chetan110801's picture
Upload folder using huggingface_hub
2f25a40 verified
Raw
History Blame Contribute Delete
2.96 kB
"""Compute a prerequisite reading path for a target RL paper.
Usage:
uv run python scripts/plan.py --target 1710.02298 # plan for Rainbow, no prior knowledge
uv run python scripts/plan.py --target 1710.02298 --known 1312.5602 # already know DQN
uv run python scripts/plan.py --target 1710.02298 --known DQN,A3C # use tags or arxiv IDs
uv run python scripts/plan.py --list # list all canonical papers
"""
from __future__ import annotations
import argparse
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from rich.console import Console
from rich.panel import Panel
from researchpath.corpus import CANONICAL_RL_PAPERS
from researchpath.planning import plan_reading_path
console = Console()
_TAG_TO_ID = {p.tag.lower(): p.arxiv_id for p in CANONICAL_RL_PAPERS}
_ID_TO_PAPER = {p.arxiv_id: p for p in CANONICAL_RL_PAPERS}
def _resolve(token: str) -> str:
"""Accept either an arxiv ID or a paper tag (case-insensitive)."""
token = token.strip()
if token in _ID_TO_PAPER:
return token
if token.lower() in _TAG_TO_ID:
return _TAG_TO_ID[token.lower()]
raise SystemExit(f"Unknown paper: {token!r}. Use --list to see options.")
def _list_papers() -> None:
console.print("[bold cyan]Canonical RL papers:[/bold cyan]\n")
for p in CANONICAL_RL_PAPERS:
console.print(f" [{p.arxiv_id}] [bold]{p.tag:20s}[/bold] ({p.year}) {p.title}")
def main() -> int:
parser = argparse.ArgumentParser(description="Plan a prerequisite reading path.")
parser.add_argument("--target", help="arxiv ID or tag of the paper you want to read.")
parser.add_argument(
"--known",
default="",
help="Comma-separated arxiv IDs or tags you already understand (default: none).",
)
parser.add_argument("--list", action="store_true", help="List all canonical papers.")
args = parser.parse_args()
if args.list:
_list_papers()
return 0
if not args.target:
parser.error("--target is required (or pass --list).")
target_id = _resolve(args.target)
known_ids = {_resolve(t) for t in args.known.split(",") if t.strip()}
plan = plan_reading_path(target_id, known_ids=known_ids)
target = _ID_TO_PAPER[target_id]
header = f"Reading path for [{target.arxiv_id}] {target.tag}{target.title}"
if known_ids:
known_tags = ", ".join(sorted(_ID_TO_PAPER[k].tag for k in known_ids))
header += f"\nAssuming you already know: {known_tags}"
console.print(Panel(header, border_style="cyan"))
console.print()
console.print(plan.render_text())
console.print()
console.print(
f"[dim]{len(plan.steps)} step(s). Static prerequisite graph; "
f"add LLM-extracted concept dependencies in a future iteration.[/dim]"
)
return 0
if __name__ == "__main__":
sys.exit(main())