Structured Sparse Memory for Recurrent Reasoning
Organizations: Department of Computer Science University of Chicago Chicago, IL 60637 · Argonne National Laboratory Lemont, IL 60439
Abstract
Recurrent models trained from scratch have recently become competitive on ARC-style reasoning tasks, but the usual framing around small recurrent backbones overlooks two important parts of the system: task-conditioned memory and synthetic augmentation data. We study this regime through CHARM, a compact hybrid ARC model that combines recurrent reasoning with structured task memory, synthetic data, and inference-time aggregation. In existing approaches, task-conditioned memory supplies a large hidden source of capacity, reaching more than 30x the size of the recurrent backbone. We introduce a compositional sparse embedding (CoSE) for task conditioning that reduces learned task-memory parameters by over 90% while improving pass@2 in controlled ARC ablations. For the recurrent backbone, recurrent depth helps only when balanced with learning horizon. Combining these ingredients, our system reaches 84% pass@2 on ARC-AGI-1 and 46.7% pass@2 on ARC-AGI-2 public evaluation. The benefits of structured memory also generalize to unseen puzzles and other domains. Our code, dataset, and model checkpoints are available at https://github.com/water-vapor/charm.
Figures & tables
| Benchmark | Synthetic data | Full task table | CoSE | ||
|---|---|---|---|---|---|
| pass@2 | Params | pass@2 | Params | ||
| ARC-AGI-1 | N/A | 462M | 43M | ||
| Re-ARC | 463M | 43M | |||
| ARC-AGI-2 | N/A | 623M | 53M | ||
| Re-ARC2 | 674M | 57M | |||
| Embedding setup | Color permutation | pass@2 | pass@1000 |
|---|---|---|---|
| Combinatorial task table | Unrestricted | ||
| Combinatorial task table | 1000-pooled | 52.08 | 71.25 |
| 3 separate tables | Unrestricted | 52.33 | 71.00 |
| 3 separate tables | 1000-pooled |
| Embedding setup | pass@2 | pass@1000 |
|---|---|---|
| Stock TRM full task table ( ) | ||
| Low-rank task table ( ) | 47.71 | 69.38 |
| Low-rank task table ( ) | 46.04 | 66.00 |
| Low-rank task table ( ) | 45.46 | 67.50 |
| Low-rank task table ( ) |
| Setup | Embedding params | pass@1 | pass@2 | pass@1000 |
|---|---|---|---|---|
| Full task table | 448.9M | |||
| Rank-32 task table only | 28.1M | 70.62 | 76.62 | 88.88 |
| Compositional branch only | 1.5M | 73.50 | 79.25 | 89.00 |
| CoSE (rank-32 residual) | 29.6M | |||
| CoSE (gated ) | 29.9M | |||
| CoSE (rank-512 residual) | 450.4M | 77.75 | 81.50 | 92.12 |
| Synthetic | Parameters | ARC-AGI-1 | ARC-AGI-2 | ||||
|---|---|---|---|---|---|---|---|
| Method | data | Backbone | ARC-1 all | pass@1 | pass@2 | pass@1 | pass@2 |
| HRM [ 1 ] | N/A | 27M | 475M | 34.4 | 40.3 | 3.8 | 5.0 |
| TRM [ 2 ] | N/A | 7M | 455M | 40.0 | 44.6 | 4.6 | 7.8 |
| URM [ 3 ] | N/A | 14M | 462M | 53.8 | 61.8 | 16.0 | 18.2 |
| VARC [ 4 ] | Re-ARC | 73M | 73M | 55.1 | 60.4 | 9.4 | 11.1 |
| CHARM | Re-ARC(2) 3 3 3 CHARM uses Re-ARC on ARC-AGI-1, as in VARC; and our synthetic Re-ARC2 dataset (Section 4.1 ) for ARC-AGI-2. | 14M | 44M | 78.6 | 84.0 | 39.3 | 46.7 |
| Synthetic data | Task embedding | pass@1 | pass@2 | pass@1000 |
|---|---|---|---|---|
| None (baseline) | full table | |||
| Re-ARC (aug=10) | full table | 68.0 | 72.5 | 84.63 |
| Re-ARC (aug=10) | CoSE | 70.88 | 76.38 | 86.25 |
| Re-ARC (aug=100) | CoSE |
| Synthetic data | Task embedding | pass@1 | pass@2 | pass@1000 |
|---|---|---|---|---|
| None (baseline) | full table | |||
| None | CoSE | |||
| Re-ARC (ARC-AGI-1) (aug=100) | CoSE | 23.89 | 28.47 | 46.39 |
| Synthetic Re-ARC2 (aug=10) | CoSE | 30.69 | 35.97 | 45.97 |
| Synthetic Re-ARC2 (aug=100) | full table | |||
| Synthetic Re-ARC2 (aug=100) | CoSE |
Appendix figures & tables39 assets
Supplementary material from the paper’s appendix.
Appendix
| Setting | Model | Rows | Task memory | Total |
|---|---|---|---|---|
| ARC-AGI-1 | URM, full table | 0.876M | 448.3M | 462.0M |
| ARC-AGI-1 + Re-ARC | URM, full table | 0.877M | 448.9M | 462.5M |
| ARC-AGI-1 + Re-ARC | CHARM ( + gate) | 0.877M | 29.9M | 43.5M |
| ARC-AGI-2 | URM, full table | 1.191M | 609.6M | 623.3M |
| ARC-AGI-2 | CHARM ( ) | 1.191M | 39.8M | 53.5M |
| ARC-AGI-2 + Re-ARC2 | CHARM ( ) | 1.289M | 43.0M | 56.6M |
| Component | Count | Parameters |
| URM backbone | measured | |
| Full instance table | ||
| CoSE compositional branch | ||
| CoSE residual table | ||
| CoSE residual up-projection | ||
| CoSE optional gate |
| Design | Data | Task table | Reasoning | Compositional | Table params | Total |
|---|---|---|---|---|---|---|
| TRM task table | ARC-AGI-1 | |||||
| URM task table | ARC-AGI-1 | |||||
| CoSE composition only | ARC-AGI-1 + Re-ARC | none | ||||
| URM task table | ARC-AGI-1 + Re-ARC | |||||
| Rank-32 table only | ARC-AGI-1 + Re-ARC | |||||
| CoSE + rank-32 table | ARC-AGI-1 + Re-ARC |
| Design | Data | Task table | Reasoning | Compositional | Table params | Total |
|---|---|---|---|---|---|---|
| URM task table | ARC-AGI-2 | |||||
| CoSE + rank-32 table | ARC-AGI-2 | |||||
| CoSE + rank-32 table | ARC-AGI-2 + Re-ARC2 |
| Benchmark | Synthetic data | Task memory | pass@1 | pass@2 | pass@1000 | |
|---|---|---|---|---|---|---|
| ARC-AGI-1 | None | Full task table | 4 | |||
| CoSE (ungated) | 3 | |||||
| CoSE (gated) | 4 | |||||
| Re-ARC | Full task table | 4 | ||||
| CoSE (ungated) | 3 | |||||
| CoSE (gated) | 4 |
| Setup | Embedding params | pass@1 | pass@2 | pass@1000 |
|---|---|---|---|---|
| Full task table | 448.3M | |||
| Rank-32 task table only | 28.0M | 52.88 | 58.00 | 79.25 |
| Compositional branch only | 1.5M | 47.38 | 51.50 | 70.12 |
| CoSE (rank-32 residual) | 29.6M | |||
| CoSE (gated ) | 29.8M |
| Dihedral Embedding | Color Embedding | Combination method | pass@2 | pass@1000 |
| Full task table | Full task table | Lookup | ||
| Lookup table | Slotperm | FiLM-concat | ||
| Slotperm | Slotperm | FiLM-concat | ||
| Lookup table | Slotperm | Hypernetwork | 46.46 | 59.38 |
| Lookup table | Slotperm | More expressive FiLM | ||
| Lookup table | Slotperm | FiLM-concat, larger backbone |
| Dihedral Embedding | Color Embedding | Combination/residual method | pass@2 | pass@1000 |
| Full task table | Full task table | Lookup | ||
| Slotperm | Slotperm | FiLM-concat + gated residual ( ) | ||
| Slotperm | Slotperm | FiLM-concat + residual ( ) | ||
| Slotperm | Slotperm | FiLM-concat + Engram residual ( ) | 50.08 | 66.88 |
| Seen | Unseen | |||||
|---|---|---|---|---|---|---|
| Task memory | Total params | Memory params | pass@1 | pass@2 | pass@1 | pass@2 |
| Full table | 4.783M | 3.072M | ||||
| Low-rank table | 1.906M | 0.196M | ||||
| Three-factor composition | 2.229M | 0.519M | ||||
| Three-factor CoSE | 2.425M | 0.715M | ||||
| Three-factor composition | Three-factor CoSE | |||
|---|---|---|---|---|
| pass@1 | pass@2 | pass@1 | pass@2 | |
| 1 | ||||
| 2 | ||||
| 4 | ||||
| 8 | ||||
| Memory params | Single-horizon | All-horizons | ||||
|---|---|---|---|---|---|---|
| Task memory | 1.5k | 6k | pass@1 | pass@2 | pass@1 | pass@2 |
| Full table | 3.072M | 12.288M | ||||
| Low-rank table | 0.196M | 0.772M | ||||
| Two-factor composition | 0.518M | 1.670M | ||||
| Two-factor CoSE | 0.714M | 2.442M | ||||
| Three-factor composition | 0.519M | 0.519M | ||||
| Method | pass@1 | pass@2 | pass@1 | pass@2 | pass@1 | pass@2 | pass@1 | pass@2 |
|---|---|---|---|---|---|---|---|---|
| CAR, three-factor CoSE | 31.56 | 34.15 | 10.50 | 11.77 | ||||
| GPT-5.6, no tools | 48.0 | 66.0 | 8.5 | 11.0 | 3.0 | 5.0 | 5.0 | 8.0 |
| GPT-5.6, Python | 78.5 | 90.0 | 73.5 | 78.0 | ||||
| Memory params | Validation bpb | |||
|---|---|---|---|---|
| Capacity | Engram | CoSE | Engram | CoSE |
| 0 | 0 | 3.5M | ||
| 254M | 258M | |||
| 506M | 510M | |||
| 1.01B | 1.01B | |||
| 2.02B | 2.02B | |||
| Memory params | Validation bpb | |||||
|---|---|---|---|---|---|---|
| Width | Engram | CoSE | CoSE -Mix | Engram | CoSE | CoSE -Mix |
| 24 | 15.9M | 19.4M | 19.3M | |||
| 48 | 31.8M | 35.3M | 35.1M | |||
| 96 | 63.6M | 67.1M | 66.7M | |||
| Memory params | Validation bpb | |||
|---|---|---|---|---|
| Capacity | Engram | CoSE | Engram | CoSE |
| 426M | 436M | |||
| 846M | 856M | |||
| 1.68B | 1.69B | |||
| Backbone | 1.19B tokens | 4.64B tokens |
|---|---|---|
| d12 | ( ) | ( ) |
| d20 | ( ) | ( ) |
| ARC-1 accuracy | ARC-2 train zero-shot | ARC-2 eval zero-shot | |||
|---|---|---|---|---|---|
| Base task memory | pass@2 | pass@1 | pass@2 | pass@1 | pass@2 |
| CoSE | 77.50 | 0.86 | 0.86 | 0.00 | 0.00 |
| CoSE | 78.33 | 0.86 | 0.86 | 0.00 | 0.00 |
| CoSE | 77.50 | 0.43 | 0.43 | 0.00 | 0.00 |
| CoSE | 80.00 | 0.43 | 0.86 | 0.00 | 0.00 |
| CoSE | 76.67 | 0.43 | 0.86 | 0.00 | 0.00 |
| Base task memory | Task embedding row | Residual rows | Train params/task | Eval params/task |
| CoSE | 32 | — | 32 | 32 |
| CoSE | 512 | — | 512 | 512 |
| CoSE | 32 | 31.28k | 31.91k | |
| CoSE | 512 | 31.76k | 32.39k | |
| CoSE | 512 | 500.44k | 510.61k | |
| Table | — | 31.25k | 31.88k |
| Memory-only CL | Per-puzzle FT Oracle | |||||
| Base task memory | Params/task | pass@1 | pass@2 | Params/task | pass@1 | pass@2 |
| ARC-AGI-2 training stream | ||||||
| CoSE | 32 | 14.733M | ||||
| CoSE | 512 | 14.717M | ||||
| CoSE | 31.28k | 14.781M | ||||
| CoSE | 31.76k | 14.765M | ||||
| Base task memory | Params/task | pass@1 | pass@2 | |
| ARC-AGI-2 training stream | ||||
| CoSE | 63.27k | 0.5 | ||
| CoSE | 63.67k | 0.5 | ||
| CoSE | 94.58k | 0.5 | ||
| CoSE | 94.99k | 0.5 | ||
| CoSE | 563.60k | 0.5 | ||
| Method | Scope | Params/task | Immediate | Final p@1 | Final p@2 | ARC-1 after |
|---|---|---|---|---|---|---|
| Per-puzzle FT Oracle | full, per-task | 14.765M | — | |||
| Memory-only | private rows | 31.76k | ||||
| L2-SP | composition | 1.102M | ||||
| Rehearsal | composition | 1.102M | ||||
| EWC | composition | 1.102M | ||||
| Naive | composition | 1.102M |
| Training stream | Public-evaluation stream | ||||
|---|---|---|---|---|---|
| Base task memory | Adaptation | ||||
| CoSE | Memory-only | 0.1990 | 0.1650 | 0.2791 | 0.2451 |
| CoSE | Per-puzzle FT | 0.0525 | 0.0259 | 0.0597 | 0.0281 |
| CoSE | Memory-only | 0.1613 | 0.1266 | 0.2412 | 0.2021 |
| CoSE | Per-puzzle FT | 0.0470 | 0.0237 | 0.0552 | 0.0261 |
| With halting loss ( ) | Without halting loss ( ) | |||
|---|---|---|---|---|
| Base task memory | pass@1 | pass@2 | pass@1 | pass@2 |
| CoSE | ||||
| CoSE | ||||
| CoSE | ||||
| CoSE | ||||
| CoSE | ||||
| With halting loss ( ) | Without halting loss ( ) | |||
|---|---|---|---|---|
| Base task memory | pass@1 | pass@2 | pass@1 | pass@2 |
| CoSE | ||||
| CoSE | ||||
| CoSE | ||||
| CoSE | ||||
| CoSE | ||||
| With halting loss ( ) | Without halting loss ( ) | |||
|---|---|---|---|---|
| Base task memory | pass@1 | pass@2 | pass@1 | pass@2 |
| CoSE | ||||
| CoSE | ||||
| CoSE | ||||
| CoSE | ||||
| CoSE | ||||
| With halting loss ( ) | Without halting loss ( ) | |||
|---|---|---|---|---|
| Base task memory | pass@1 | pass@2 | pass@1 | pass@2 |
| CoSE | ||||
| CoSE | ||||
| CoSE | ||||
| CoSE | ||||
| CoSE | ||||
| With halting loss ( ) | Without halting loss ( ) | |||
|---|---|---|---|---|
| Base task memory | pass@1 | pass@2 | pass@1 | pass@2 |
| CoSE | ||||
| CoSE | ||||
| CoSE | ||||
| CoSE | ||||
| CoSE | ||||
| With halting loss ( ) | Without halting loss ( ) | |||
|---|---|---|---|---|
| Base task memory | pass@1 | pass@2 | pass@1 | pass@2 |
| CoSE | ||||
| CoSE | ||||
| CoSE | ||||
| CoSE | ||||
| CoSE | ||||
| Method | Immediate p@2 | Final p@1 | Final p@2 | ARC-1 after | |
|---|---|---|---|---|---|
| L2-SP | 0.5 | ||||
| L2-SP | 0 | ||||
| Rehearsal | 0.5 | ||||
| Rehearsal | 0 | ||||
| EWC | 0.5 | ||||
| EWC | 0 |
| Method | Immediate p@2 | Final p@1 | Final p@2 | ARC-1 after | |
|---|---|---|---|---|---|
| L2-SP | 0.5 | ||||
| L2-SP | 0 | ||||
| Rehearsal | 0.5 | ||||
| Rehearsal | 0 | ||||
| EWC | 0.5 | ||||
| EWC | 0 |
| Review round | Error source | Count | Puzzle IDs |
|---|---|---|---|
| Round 1 | Generator | 19 | 15113be4 , 17cae0c1 , 2c0b0aff , 342ae2ed , 3ad05f52 , 423a55dc , 4e45f183 , 4ff4c9da , 538b439f , 705a3229 , 80214e03 , 8719f442 , 902510d5 , a416fc5b , b7955b3c , c6141b15 , c920a713 , e6de6e8f , e9fc42f2 |
| Round 1 | Official data | 3 | b74ca5d1 , d931c21c , f18ec8cc |
| Round 2 | Generator | 7 | 1b8318e3 , 689c358e , 79369cc6 , aee291af , c61be7dc , e048c9ed , e5c44e8f |
| Round 2 | Official data | 9 | 17829a00 , 85fa5666 , 963c33f8 , a3f84088 , ac0c5833 , b942fd60 , ba1aa698 , d753a70b , e1d2900e |
| Re-ARC aug per puzzle | Evaluation repeats | pass@2 | pass@1000 |
|---|---|---|---|
| 10 | 1 | 76.38 | 86.25 |
| 10 | 2 | 77.38 | 86.62 |
| 10 | 5 | 62.12 | 79.25 |
| 10 | 10 | 54.62 | 70.50 |
| 100 | 1 | 79.25 | 88.62 |
| 100 | 2 | 79.50 | 89.50 |
| Params (M) | Step | Loss | pass@1 | pass@2 | pass@1000 | ||||
|---|---|---|---|---|---|---|---|---|---|
| 12 | 2 | 6 | 6 | 6.8 | 67588 | 0.012 | 47.50 | 52.08 | 71.38 |
| 12 | 3 | 4 | 6 | 10.2 | 67588 | 0.009 | 45.88 | 50.21 | 69.75 |
| 12 | 4 | 3 | 6 | 13.6 | 67588 | 0.006 | 40.83 | 46.08 | 66.62 |
| 12 | 6 | 2 | 6 | 20.5 | 67588 | 0.005 | 34.62 | 39.21 | 54.62 |
| 24 | 2 | 12 | 12 | 6.8 | 33794 | 0.034 | 47.00 | 52.96 | 69.75 |
| 24 | 3 | 8 | 12 | 10.2 | 33794 | 0.029 | 48.12 | 52.08 | 70.12 |
| Params (M) | Step | Loss | pass@1 | pass@2 | pass@1000 | ||||
| 2 | 12 | 24 | 6 | 6.8 | 67588 | 0.014 | 46.25 | 51.58 | 70.62 |
| 2 | 12 | 24 | 12 | 6.8 | 67588 | 0.009 | 49.75 | 56.08 | 71.38 |
| 2 | 12 | 24 | 18 | 6.8 | 67588 | 0.007 | 51.88 | 56.83 | 71.12 |
| 2 | 12 | 24 | 24 | 6.8 | 67588 | 0.017 | 47.00 | 52.04 | 69.75 |
| 3 | 8 | 24 | 3 | 10.2 | 67588 | 0.015 | 39.25 | 45.83 | 66.75 |
| 3 | 8 | 24 | 6 | 10.2 | 67588 | 0.012 | 40.88 | 47.83 | 68.25 |
| Protocol | Augmentation view voting | Checkpoint vote window | Exponential vote decay | Outer-loop steps | Relative compute |
| HRM/TRM [ 1 , 2 ] | Yes | All | No | 16 | |
| URM [ 3 ] | Yes | All | No | 16, 24 | |
| No TTC | No | Current only | No | 16 | |
| Standard protocol (ours) | Yes | 10 most recent | No | 16 | |
| Additional TTC (ours) | Yes | recent half | Yes | 16, 24 | |
| Continual learning (ours) | Yes | Current only | No | 16 |
| Benchmark | Evaluator | pass@1 | pass@2 | pass@1000 |
|---|---|---|---|---|
| ARC-AGI-1 | CoSE , Re-ARC (aug=100) | 74.75 | 79.62 | 89.25 |
| ARC-AGI-1 | + loops 16/24, replay | 75.75 | 81.50 | 91.25 |
| ARC-AGI-2 | CoSE , synthetic Re-ARC2 (aug=100) | 34.72 | 38.47 | 55.0 |
| ARC-AGI-2 | + loops 16/24, replay | 33.50 | 39.30 | 58.3 |
| Re-ARC aug count | Eval repeats | Optimizer | pass@1 | pass@2 | pass@1000 |
|---|---|---|---|---|---|
| 10 | 1 | AdamW | 70.88 | 76.38 | 86.25 |
| 10 | 1 | Muon | 71.38 | 78.38 | 90.25 |
| 100 | 1 | AdamW | 72.62 | 79.25 | 88.62 |
| 100 | 1 | Muon | 72.50 | 77.38 | 91.50 |
| 100 | 2 | AdamW | 74.12 | 79.50 | 89.50 |
| 100 | 2 | Muon |
| Hardware (1 node, 8 GPUs) | |||||
|---|---|---|---|---|---|
| Benchmark | Model | Metric | RTX PRO 6000 | H100 | B200 |
| ARC-AGI-1 | TRM | Train (s/step) | 0.195 | 0.110 | 0.061 |
| Eval (s/iter) | 1.81 | 1.74 | 0.525 | ||
| Total (h) | 47.6 | 32.9 | 14.6 | ||
| URM | Train (s/step) | 0.578 | 0.385 | 0.257 | |
| Eval (s/iter) | 4.09 | 2.70 | 1.78 | ||
| ARC-AGI-1 TRM | ARC-AGI-1 CHARM | ARC-AGI-2 CHARM | ||||||||
| System | Nodes | Train (s) | Eval (s) | Total (h) | Train (s) | Eval (s) | Total (h) | Train (s) | Eval (s) | Total (h) |
| Polaris | 1 | 0.535 | 5.00 | 131.0 | 1.740 | 12.50 | 394.6 | 1.750 | 12.60 | 561.7 |
| 4 | 0.188 | 1.26 | 41.9 | 0.550 | 3.15 | 118.0 | 0.550 | 3.15 | 171.7 | |
| 8 | 0.107 | 0.69 | 23.6 | 0.320 | 1.65 | 67.1 | 0.316 | 1.64 | 97.8 | |
| Aurora | 1 | 1.630 | 15.36 | 400.2 | 3.720 | 25.46 | 833.0 | 3.720 | 25.46 | 1186.1 |
| 4 | 0.413 | 3.79 | 100.5 | 1.040 | 6.28 | 225.9 | 1.040 | 6.28 | 326.6 | |