YAML Metadata Warning:empty or missing yaml metadata in repo card
Check out the documentation for more information.
NeuroGolf Solver v5
Builds minimal ONNX networks for ARC-AGI tasks. Modular Python package with opset 17, zero-cost Slice-based transforms.
Currently running on Kaggle β results pending.
Version History
| Version | Date | Solved (local) | Arc-gen Validated | Est LB | Key Changes |
|---|---|---|---|---|---|
| v5 | 2026-04-26 | TBD | TBD | TBD | Refactored to package, opset 17, Slice-based flip/rotate (0 MACs), lstsq crash fix, tensor-based Pad & ReduceSum |
| v4.3 | 2026-04-25 | 307 | 50 | ~670 | Methodology docs, no code changes |
| v4.0 | 2026-04-24 | 307 | 50 | ~656 | ARC-GEN validation, static profiler |
| v3 | 2026-04-24 | 307 | ~40 | 501 | concat_enhanced, varshape_spatial_gather |
| v2 | prior | 294 | β | β | Spatial_gather, variable-shape conv |
| v1 | prior | 128 | β | β | Conv solver only |
Project Structure
neurogolf_solver/ # Python package (v5)
βββ __init__.py # Package marker
βββ config.py # Runtime config (providers, opset)
βββ constants.py # All constants (grid dims, excluded tasks, limits)
βββ data_loader.py # Task loading, one-hot encoding, example extraction
βββ gather_helpers.py # Gather-based ONNX model builders
βββ main.py # Entry point with W&B init
βββ onnx_helpers.py # Opset 17 builders (Slice, Pad, ReduceSum, mk)
βββ profiler.py # Static cost profiler (fallback for onnx_tool)
βββ submission.py # run_tasks with W&B logging, zip/csv generation
βββ validators.py # Model validation against train+test+arc-gen
βββ solvers/
βββ __init__.py # Exports solve_task, ANALYTICAL_SOLVERS
βββ analytical.py # identity, constant, color_map, transpose
βββ conv.py # lstsq conv solvers (fixed, variable, diffshape, var_diff)
βββ geometric.py # flip, rotate, shift, crop, gravity
βββ solver_registry.py # Solver ordering + solve_task orchestration
βββ tiling.py # tile, upscale, mirror, concat, spatial_gather
neurogolf_solver.py # Legacy monolith (v4, kept for reference)
neurogolf_utils.py # Official Kaggle scoring library
ARC-GEN-100K.zip # 400 files Γ ~250 examples synthetic data
neurogolf-2026-solver-notebooks.zip # 5 reference notebooks (LB 4000+)
Quick Start
# Clone
git clone https://huggingface.co/rogermt/neurogolf-solver
cd neurogolf-solver
# Install deps
pip install numpy onnx onnxruntime
# Get ARC data
git clone --depth 1 https://github.com/fchollet/ARC-AGI.git
# Run (local)
python -m neurogolf_solver.main --data_dir ARC-AGI/data/training/ --output_dir submission --conv_budget 30
# Run (Kaggle)
python -m neurogolf_solver.main --kaggle --data_dir /kaggle/input/competitions/neurogolf-2026/ --output_dir /kaggle/working/submission --conv_budget 60
# With ARC-GEN data and W&B logging
python -m neurogolf_solver.main --data_dir ARC-AGI/data/training/ --arcgen_dir ARC-GEN-100K/ --output_dir submission --use_wandb
Parameters
| Flag | Default | Description |
|---|---|---|
--data_dir |
ARC-AGI/data/training/ |
Path to task JSONs |
--arcgen_dir |
`` | Path to ARC-GEN-100K/ directory |
--output_dir |
/kaggle/working/submission |
Where to save .onnx files |
--kaggle |
off | Use Kaggle task format (task001.json with embedded arc-gen) |
--conv_budget |
30 |
Seconds per task for conv solver |
--tasks |
all | Comma-separated task numbers (e.g., 1,2,3) |
--device |
auto |
auto, cpu, or cuda |
--use_wandb |
off | Enable W&B logging |
How It Works
Format: Input/output = [1, 10, 30, 30] one-hot float32. ONNX opset 17, IR version 8.
Solver pipeline (in order):
Analytical solvers (instant, near-zero cost): identity β constant β color_map β transpose β flip β rotate β shift β tile β upscale β kronecker β nonuniform_scale β mirror_h β mirror_v β quad_mirror β concat β concat_enhanced β diagonal_tile β fixed_crop β spatial_gather β varshape_spatial_gather
Conv solvers (learned via least-squares, validated against arc-gen):
conv_fixedβ Slice β Conv β ArgMax β Equal+Cast β Padconv_variableβ Conv(30Γ30) β ArgMax β Equal+Cast β Mul(mask)conv_diffshapeβ Slice β Conv β Slice(crop) β ArgMax β Equal+Cast β Padconv_var_diffβ Conv(30Γ30) β ArgMax β Equal+Cast β Mul(input_mask)
v5 Changes from v4
| Change | Impact |
|---|---|
| Opset 10 β 17, IR 10 β 8 | Enables Slice(step=-1) for zero-cost transforms |
| s_flip: Slice(step=-1) | 0 MACs (was ~165K with Gather) |
| s_rotate k=2: double Slice reverse | 0 MACs (was ~165K) |
| s_rotate k=1,3 (square): Slice+Transpose | 0 MACs (was ~165K) |
| All Pad nodes: tensor-based pads input | Required for opset 17 compatibility |
| All ReduceSum nodes: axes as tensor input | Required for opset 13+ compatibility |
| lstsq crash fix: try/except LinAlgError | Prevents SVD non-convergence crash (task 313) |
| Refactored to 16-file package | Maintainable, testable, no more monolith |
Scoring
Score per task = max(1.0, 25.0 - ln(MACs + memory_bytes + params))
- Analytical solvers (Slice/Transpose/Gather) β near-zero cost β ~20-25 pts
- Conv solvers β cost proportional to kernel size β ~7-14 pts
- Unsolved β 1.0 pt minimum
Competition Rules
| Item | Value |
|---|---|
| Input/Output | float32 [1,10,30,30] one-hot |
| Opset | 10 or 17 (both accepted on Kaggle) |
| Max file size | 1.44 MB per model |
| Banned ops | Loop, Scan, NonZero, Unique, Script, Function |
| Excluded tasks | {21, 55, 80, 184, 202, 366} |
| Validation | Models checked against train + test + arc-gen (ALL splits) |
Key Docs
- SKILL.md β Competition rules, architecture, methodology, checklist
- LEARNING.md β All mistakes, research findings, what works/doesn't
- TODO.md β Roadmap, experiment queue, status tracking
Strategy
We build our own solver. No blending. No public datasets. See LEARNING.md for competitive intelligence on what others do (for awareness only).