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()