File size: 3,140 Bytes
feb08d1 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | """
Headless entrypoint for running a single experiment or a sweep.
Usage:
python scripts/entrypoint.py --task example1 --out_dir experiments
python scripts/entrypoint.py --task example1 --out_dir experiments --use_wandb
By default Weights & Biases logging is disabled. Use --use_wandb to enable it.
"""
import argparse
import json
import os
import importlib
def main():
parser = argparse.ArgumentParser(description="Run ARC-AGI experiment (headless).")
parser.add_argument("--task", type=str, required=True, help="Task name or path to task JSON")
parser.add_argument("--out_dir", type=str, default="experiments", help="Output directory")
parser.add_argument("--use_wandb", action="store_true", help="Enable Weights & Biases logging (default: off)")
parser.add_argument("--params", type=str, default=None, help="Optional JSON string of params")
args = parser.parse_args()
os.makedirs(args.out_dir, exist_ok=True)
# lazy imports to avoid heavy startup cost
import itt_solver.experiment_driver as ed
import itt_solver.solver_core as sc
# load task: if args.task is a JSON file path, load it; otherwise expect a built-in name
if os.path.exists(args.task):
with open(args.task) as fh:
task = json.load(fh)
else:
# minimal built-in example if user passed 'example1'
# Corrected target from real ARC task 007bbfb7 (Kronecker self-similar)
if args.task == "example1":
task = {
'name': 'example1',
'input': [[0,7,7],[7,7,7],[0,7,7]],
'target': [
[0,0,0,0,7,7,0,7,7],
[0,0,0,7,7,7,7,7,7],
[0,0,0,0,7,7,0,7,7],
[0,7,7,0,7,7,0,7,7],
[7,7,7,7,7,7,7,7,7],
[0,7,7,0,7,7,0,7,7],
[0,0,0,0,7,7,0,7,7],
[0,0,0,7,7,7,7,7,7],
[0,0,0,0,7,7,0,7,7],
],
'target_shape': (9,9)
}
else:
raise SystemExit(f"Unknown task identifier: {args.task}")
# parse params if provided
params = {}
if args.params:
try:
params = json.loads(args.params)
except Exception:
print("Warning: could not parse --params JSON; ignoring.")
# build atomic library using default factory
atomic_library = ed.default_atomic_factory(params, task)
# run single experiment
result = ed.run_single(task, atomic_library, params, out_dir=args.out_dir)
# optionally run W&B logging externally (only if requested)
if args.use_wandb:
try:
from itt_solver.wandb_runner import run_and_log_wandb
run_and_log_wandb(task, atomic_library, params, out_dir=args.out_dir,
wandb_project=params.get('wandb_project','itt_solver'),
wandb_entity=None, resume="allow")
except Exception as e:
print("W&B logging failed or not configured:", e)
print("Run finished. Result summary:")
print(json.dumps(result, indent=2))
if __name__ == "__main__":
main()
|