DRAM-Native &|~ Classification

Only Bits Matter

99.0% MNIST — 69.99% CIFAR-10 (ensemble) — 92.96% Fashion-MNIST — Pure &|~ + int32/flt32

No float multiply-accumulate — only bit-logic. Otto Score runs the same frozen-projection + Bayes-log-score classifier on two equivalent DRAM-native container formats: int32 (exact) and flt32 (float). All members share one frozen W0 (const seed) — the matrix data shrinks drastically, cutting memory access. The 2026-08 precision finding: the container is format-neutral, but the score accumulation must be exact (int64/double) — float32 drifts at large sums. Results: 99.0% MNIST (data-limited) · 69.99% CIFAR-10 (ensemble beam-search) · 92.96% Fashion-MNIST (beam 20 --max --filter eval gt 20%) · 66.88% beam-selected (maj1+flt32). See the August status →

Independent Research by Andreas Otto  |  August 2026
Otto Score reaches 99.0% MNIST / 69.99% CIFAR-10 (ensemble beam-search). Read the August status report →
🔬 Current Highlight — Fashion-MNIST: The Trap Is Broken 🆕 DRAM-native bit-logic reaches 92.96% on Fashion-MNIST — every search strategy lands in the 88.7–92.96% basin. The 91% trap is BROKEN — beam 20 --max + filter eval gt 20% → 92.96%. Speed is the differentiator: a 221-member sweep in ~1 minute.
🧩 Open Challenge — Ensemble Subset Selection in a 30,000-Member Library 🆕 We can build 10,000–30,000 DRAM-native classifiers in minutes — but finding the small subset with the best majority vote is NP-hard. Public challenge: we publish the score corpora, the search tool and reference results (91.84% greedy / 92.32% beam / 94.24–94.83% with class exclusion); you provide the better subset-search algorithm. Read the challenge → · Leaderboard →
🔬 Latest Findings — maj1-half (m1t), H-Scaling, Determinism & IFC Zero-Gap (2026-08-27)
Finding Evidence
m1t is a per-member flag, never a global — the model file now carries the concrete maj1-half per member (v9 format). Internal sentinels (-2 auto) are hard-rejected on export. model.otto v9: import == training, 97.82% MNIST zero-gap (was 86.54% — the import silently fell back to ki_default_half=107 while members trained with m1t=105)
m1t hybrid (mixing 103/105/107 thresholds) is refuted — file_eval-based mixing does NOT beat single-m1t pools; the 18% vote divergence is noise, not complement. Hybrid 92.26–92.39% < single 105-only 92.84% (Fashion, H196); best-of-3 extract 92.81% at 125 members (bloat)
H-scaling peaks at H=392 (2×KI_NC) — more neurons beyond 392 DILUTE the ensemble; H512/H588/H784 are dropped. Shared 12-member set: H392 92.32% > H588 92.04% > H784 91.95% (Fashion-OT8, --max 12 --eff)
Beam results are thread-count deterministic — cmp_exp tiebreak (lowest member/slot index) fixed the timing-dependent expansion order. 12 vs 16 threads: identical eval (91.69% H196-BV8; 92.27% H392-OT8, 3× repeat)
W0 (Otto) beats Bit-Voting by ~0.4pp at equal H; H392-OT8 is the current Fashion sweet spot. OT8 92.32% vs BV16 91.96% (H392, --max 12 --eff); --filter-bv measured neutral
Search precision: OP17 (fixed-point) is the binding constraint, NOT the counter width — int64 vs int32 width makes 0.00pp; the beam non-monotonicity (wider beam = worse) is OP17-inherent. int64-OP17 == int32-OP17 == 90.91% greedy (BV8, 2026-08-25); int64-OP17 beam 10→20→30 = 91.68→91.49→91.47 (tips), int64-OP24 monotone 91.51→91.76→91.78; filter closes the gap (91.77 ≈ 91.76)
Training logit is now DRAM-native — LUT instead of float log() (PROMOTED 2026-08-28): the int64 LUT logit (65535×8B, ln(x)·2^40) is the STANDARD trainer — the SINGLE implementation. Float-only training was tested and brought nothing; the float path is archived. Full H196 sweep: 0.539 s/member ≈ float (0.533); merge FIXED vs float = 0.00pp on 6 configs; score bytes identical (0/809863 diff)
More epochs keep paying — the training curve saturates at EP16 (BV8, H196): EP13 beats EP10 everywhere; the 16→19 gain collapses to +0.03pp (noise). **EP16 is the new BV standard (92.24%).** --max 12 --eff (beam30, full pool): EP7 91.47% → EP10 91.85% → EP13 92.04% → EP16 92.24% → EP19 92.27%; training is linear (~9 min/EP); BV-EP16 closes the W0 gap to OT (0.18pp)
More epochs homogenize the member pool — the per-member eval spread shrinks and plateaus (span 31.86 at EP7 → ~29.85 from EP10); the weakest seeds rise +1.9pp while the top stays stable. seed-sort max/min: EP7 87.95/56.09 → EP10+ 87.84-87.94/~58.0; per-member eval EP7 vs EP19 correlates r=0.9876; the biggest movers (+6pp) are all dog:log8 members
Filter note: eval gt66% is OT-specific — it helps OT (compact W0 information) but HURTS Bit-Voting (~0.2-0.25pp); BV must use the full pool (gt0%). BV EP13: gt0% 91.91-92.22% vs gt66% 91.69-92.00%; OT: gt66% was the 92.32% best (H392)
Recipe: --beam 30 --max 12 --eff --filter m1th eq 105 --filter eval gt 66% → 92.32% Fashion (H392-OT8, 12 members). Production default: --max 12 --eff drops the unproductive member mass.
Report Key result Breakthrough
Fashion-MNIST 🆕 92.96% ceiling; 88.7–92.96% basin across all search strategies Beam 20 --max + filter eval gt 20% → 92.96%; 221-member sweep in ~1 min
August 2026 66.88% beam-selected (M1-FLT32); IFC end-to-end 66.36% Precision is the feature (float32 drift refuted); .ens v12/v13; IFC v7 heterogeneous ensembles
July 2026 64.4% CIFAR-10 (H=1024); 69.99% ensemble beam-search Target-init invariance; 60% barrier; decoupled train/merge workflow
Otto Score 98.1% MNIST / 92.96% Fashion / 64.4% CIFAR-10 Frozen W0 + MAJ1; thermometer encoding; bit-density vs Bit-Voting
Bit-Voting Baseline Linear floor: 91.4% MNIST, 88.9% Fashion, 55.2% CIFAR-10 W0 = critical nonlinear ingredient (4–9pp); bit-density trade-off; IFC inference 14.7× faster

Abstract

Every previous approach treated the MAJ1 output (uint32) as a number — comparing it as a uint32 or treating it as a scalar. All failed because the information is in the pattern of bits, not in the numeric value.

The Otto Score treats each of the 32 MAJ1 bits as an independent feature. For each class, neuron, and bit-position, it counts "how often is this bit = 1 for this class?" → Laplace-smoothed log-odds → Bayes log-Score. One pass of counting: 86.6%. No training, no float, no AdamW.

Iterative target-tuning (20 passes): 96.4%. Each iteration corrects log-odds for misclassified samples — a Perceptron-style correction in log-odds space. Still pure &|~ + int32. Beats AdamW (95.8%) with 0.6pp margin — the first DRAM-native path to 96%.

Otto Score 1-pass — 86.6%

No training, no float, no AdamW

  • Random W0 → MAJ1 → Bayes log-Score
  • 1× counting: Target[10][H][32] = log-odds
  • Forward: &|~ + int32 addition
  • 86.6% at H=2048, 4.8s on CPU

Otto Score Iterative — 96.4%

20 passes, beats AdamW

  • Same forward: &|~ + int32
  • log-odds correction (Perceptron-style)
  • No float, no gradient, no AdamW
  • Beats AdamW (95.4%) by 1pp

Results — MNIST 50K/10K, seed=42

Every result with pure bit-logic forward (&|~). No float, no int32 matmul.

Procedure Forward Training H Eval DRAM
Otto Score 1-pass ★ MAJ1+int32 1-pass counting 2048 86.6%
Otto Score iterativ ★ MAJ1+int32 20-pass correction 2048 96.4%
Float AdamW W1-Only (ref) matmul+ReLU AdamW (20ep) 2048 95.8%
Otto Bridge+AdamW Bridge+matmul AdamW (3ep) 512 95.4%

Otto Score 1-pass — Scaling with H

H (neurons) Eval Time Bit-Mass Note
876.4%24ms207 Kbit
1680.3%43ms414 Kbit
3283.0%84ms829 Kbit
6484.6%194ms1.6 Mbit
12885.0%382ms3.2 Mbit
25685.3%688ms6.4 Mbit
51286.2%1.2s12.9 Mbit
102486.5%2.4s25.7 MbitRequires int64 class_offset
204886.6%4.8s51.5 MbitPlateau — 86%-Wall
86%-Wall broken: MAJ1 compresses 196 containers → 1 uint32 (non-linear, information loss). Bayes log-Score is optimal for conditionally independent bits — MAJ1 bits are weakly correlated (max |r| < 0.1). Without iterative correction, the wall stays at 86%. With iterative target-tuning: 96.4%beats AdamW (95.8%) by 0.6pp.

How It Works — Bayes log-Score on MAJ1 Bits

Three insights that eliminated every non-bit operation from the classifier.

Insight #1

MAJ1 output is a bit-string, not a number

The uint32 from majority_tree1 encodes 32 independent yes/no decisions. Treating it as a number (uint32 comparison) loses the pattern. The information is in the bits, not in the value.

Insight #2

Per-bit log-odds extract the signal

Each MAJ1 bit is a weak class-predictor (~50% random, ~0.1% signal). Log-odds amplifies the signal by ~4× vs linear probability. The Bayes log-Score combines all 32 × H bits into a optimal class decision.

Insight #3

Random W0 is enough — frozen, never trained

The random projection W0 balances MAJ1 input at ~50% 1s. This is the only condition where majority_tree1 produces informative features. Training W0 would destroy the balance.

How it works in detail → Otto Score paper   View source →

Explore — from catch to depth

Landed? Here is the smooth reading path: landing (hook)papers (deep dives) → docs on GitHub (exact math). No duplication — single source of truth.

Otto Score — Method

Frozen W0 + MAJ1 + Bayes log-Score, terminology, parallelism, bit-mass. The architecture paper.

Read → · doc on GitHub →

Fashion — Trap Broken

92.96% ceiling, 88.7–92.96% basin, beam-search, speed argument. Full leaderboard.

Read → · workflow doc →

CIFAR-10 — 69.99% Ensemble

64.9% single-config, 69.99% beam-search over 19,707 archives, 66.88% 4-way.

Read → · arch doc →

Bit-Voting Baseline

Equal-H parity: BV ≈ W0 at same H, W0 = free width. IFC 14.7× faster.

Read → · doc →

DRAM-Native

Why &|~ + int32 only, energy 99.7% fewer bit-transfers, row-parallel members.

Read → · DRAM doc →

All Docs on GitHub

Workflow, Scores, Ensemble, Encoding, Bit-Mass, Majority-Vote — rendered Markdown, single source.

Docs on GitHub → · GitHub/docs →

🧩 Open Challenge — Ensemble Subset Selection

NP-hard: find the best member subset for majority voting in a 30,240-member library. Corpora + tooling + reference results published; we invite better search algorithms.

Read the challenge →

Full journey, scaling argument, tech details and archive now live in their papers — this landing stays focused to catch you fast.