rogermt's picture
Move own-solver/README.md to own-solver/
872fabe verified
# 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
```bash
# 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):**
1. **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
2. **Conv solvers** (learned via least-squares, validated against arc-gen):
- `conv_fixed` β€” Slice β†’ Conv β†’ ArgMax β†’ Equal+Cast β†’ Pad
- `conv_variable` β€” Conv(30Γ—30) β†’ ArgMax β†’ Equal+Cast β†’ Mul(mask)
- `conv_diffshape` β€” Slice β†’ Conv β†’ Slice(crop) β†’ ArgMax β†’ Equal+Cast β†’ Pad
- `conv_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).
## Repo
https://huggingface.co/rogermt/neurogolf-solver