hoops.dumbmodel.com Lab • MTNN v4 • Solo personal project, no connection to employer, built with public/free-tier only

Vector Hoops Lab — MTNN v4 pipeline

The exact MTNN v4 behind all 8 games: 12,392 player-seasons 1996-2026 per-100 zσ → 17 families 120 feats cat([x·m,m]) → 17×160→32×2 =544 +12 =556→128→48 L2 ~224K → heads 8/5/14/18 → ONNX WASM 2MB. Glass-box explorer at /model. Novice on top, expert one click.

MTNN v4 12,392 seasons • 120 feats ×17 • 224K • ONNX WASM 2MB • 8 games • Chimera 68% top-3
01Gatherstats.nba 12,392 seasons
02Cleanper-season σ ±4 era-z
03Towers17×160→32×2 544
04Fusion556→128→48 L2 224K
05DeployONNX WASM 2MB • puzz #1 2026-07-01

Manim — precise math animations

manim 0.20.1 • 480p15 • 2 relevant videos only • 508KB total

Turned static SVG flow (W1380 H780 truthful 1:1) into programmatic math animations: Manim turns Python code into precise vector graphics. Each video is code — class MTNNFlow(Scene) with Write(), Create(Rectangle), Arrow() LaTeX-ready, ffmpeg mux. Only MTNN-relevant videos kept.

MTNNFlow — 17 families 120 feats cat([x·m,m]) → 17× 160→32 LN GELU res×2 544+12 556→128→48 L2 → heads 8/5/14/18 • Powers 8 MTNN games
ChimeraEquation — Donor A + Donor B = closest real 48-d L2 nearest • argmin ||f(A)⊕f(B)-f(real)||₂

Source: workspace/manim_dumbmodels/mtnn_flow.py + chimera_procrustes.py • Render: manim -ql mtnn_flow.py MTNNFlow && manim -ql chimera_procrustes.py ChimeraEquation → MTNNFlow.mp4 352KB + ChimeraEquation.mp4 153KB 480p15. Solo personal project, no connection to employer, built with public/free-tier only. MTNN v4 truthful flow W1380 H780 COLS 110/230/320/400/480/560/720/800/900/1120 1:1 input→tower

01 Gather — stats.nba.com → 120 feats 17 families era-z

12,392 seasons 1996-97→2025-26 • per-100 poss • 800 MIN filter

We pull every season per-100 splits from stats.nba.com. Not raw points — sigmas vs that season (era-z) so 1999 and 2025 compare fairly. 12,392 seasons × 17 families: volume, playmaking, rebounding (OREB/DREB), defense (STL/BLK/DEF_RTG), efficiency (EFG%/TS%/OFF_RTG/NET_RTG), shotmix, bio (AGE/HEIGHT/WEIGHT/DRAFT), tracking (2013+ masked), form (FORM_DD), market, roster, career (YEAR_IN_LEAGUE/LAG1_COSINE/DELTA_NORM), competition (SOS_NET_RTG/B2B_RATE), team, pedigree, playoffs, honors. Mask m∈{0,1} → input cat([x·m,m]) so model knows "never measured" vs zero.

12,392seasons
120feats
17families
8archetypes

Files: archetype_assignments.json, drift.json (Procrustes 30 seasons), mtnn_arch.json v4_h160_t32_d48_mlp128, mtnn_embeddings.f32 48-d L2-norm, mtnn_heads.f32 (8/5/14/18), mtnn_meta.json. Season emb 12-d. Masking cat([x·m,m]) truthful. Flow viz W1380 H780 COLS 110/230/320/400/480/560/720/800/900/1120 1:1.

mtnn_arch.json v4
{
  "model": "mtnn_v4_h160_t32_d48_mlp128",
  "dTower": 32, "dEmb": 48, "blocks": 2,
  "nFamilies": 17, "nFeats": 120,
  "input": "cat([x·m,m]) 160→32 LN GELU res×2",
  "fusion": "544 (17×32) +12 season =556 →128→48 L2",
  "params": 224000,
  "heads": {"archetype": 8, "pos":5, "next_profile":14, "skills":18},
  "file": "mtnn.onnx 2MB WASM"
}

02 Clean — Era-honest σ ±4 + family masking + Procrustes root frame

pipeline/era_procrustes_align.py • 30 seasons aligned

Raw stats drift: pace 91 in 1999 vs 100 in 2025, 3PT rate 18% vs 41%. We z-score each stat within its season → era-honest ±4 clip. Then family masking cat([x·m,m]) preserves "never measured" vs zero. Procrustes: chain yearly rotations RᵀR=I back to 1996 root frame — lets 1999 directly compare 2025 without drift. Just honest geometry, no tricks.

  • ✅ Per-season σ — every stat vs its league ±4σ cap
  • ✅ Family mask cat([x·m,m]) — tracking pre-2013 masked not guessed
  • ✅ Procrustes root frame 1996-97 — RᵀR=I rotation chain, drift measured in degrees
  • ✅ Empirical-Bayes shrink % by attempts → shown as percentile not fake %
  • ✅ Used by Chimera, Deadline, Fader, Arc, Twin, WhatIf, Pivot, Chem
Era Drift Before → After Procrustes (degrees)
before after root align • Okabe-Ito triple-encoded

03 Train — MTNN v4 17×160→32 towers 556→128→48 L2 224K behind every guess

ONNX WASM 2MB • execuTorch ConvNeXt-Tiny distilled • localStorage only

17 towers

120 feats → 17×160→32 LN GELU res×2 =544
+ season emb12-d →556
Fusion556→128→48 L2
Params~224K (544+12=556→128→48)

Families: volume, playmaking, reb, def STL/BLK, efficiency EFG/TS, shotmix, bio AGE/HT/WT, tracking (masked pre-13), form FORM_DD, market, roster, career LAG1_COSINE/DELTA_NORM, competition SOS, team, pedigree, playoffs, honors.

Heads powering 8 games

8 archetypesTrends + Career Arc 48→64→8
5 positionspos classifier 48→5
14 next_profilePivot + What-If 14 per-100
18 skillsChem 48→16→1 per skill
Chimera fuse2 seasons →48-d nearest L2
Era TwinProcrustes root nearest cross-era
Deadlinehas-been/contender framing
Fader/FinisherFORM_* 1st vs 2nd half

Glass box not black box

Truthful flowW1380 H780 1:1 COLS
Probeclick node → family share
Signed pushesgrad×input per family
ONNX2MB WASM • local inference
EPOCH2026-07-01 puzzle #1
Bundlegame.js 363KB + games.js 16KB

Solo personal project, no connection to employer, built with public/free-tier only • Free-tier Vercel cleanUrls • ONNX WASM • localStorage only • Okabe-Ito AAA triple-encoded shape+icon+text+pattern • 18px/1.65 readability • 56px tabs safe-area.

04 Eval — accuracy harness gates every deploy

Same data as games — trends, player refs, team labs • verify_accuracy.py V15
GameMTNN v4 usesMetric
Chimera48-d fusion + chemistry.json68% top-3 human guess • 2 donors + target
Deadlinehas-been/contender • LAG1_COSINEhas-been framing validated
FaderFORM_* 1st/2nd half deltasrose/fell call verifiable
Arccareer order • LAG1_COSINE, DELTA_NORMchronology shuffle
Chemskills 48→16→1 ×18 coverage4 choices ×5 rounds
WhatIf14 profile per-100 forecastsandbox nearest duo TYPES
Pivotcareer inflection • YEAR_IN_LEAGUEpivot season guess
Era TwinProcrustes root nearestcross-decade twin

Every number recomputable from stats.nba.com — accuracy harness gates deploy. drift.json tracks archetype eras 1996-2026. 3P%/FG%/FT% empirical-Bayes shrunk → percentile shown not fake %.

Bundle that games load — free-tier only
mtnn.js WASMloader ONNX 2MB
mtnn_embeddings.f3248-d L2 per season
mtnn.onnxopset18 fallback ~2MB
mtnn.pteXNNPACK mobile ExecuTorch
total gz~105KB JS +2MB WASM free-tier ✅

EPOCH_DATE 2026-07-01 puzzle #1 • midnight UTC resets • ?+?=target tile

05 Deploy — daily puzzle + free-tier + best-app-ever polish

vite v5.4.21 65 modules • cleanUrls true • vercel.json /games /arcade → /play

Pipeline

EPOCH_DATE2026-07-01 puzzle #1
resetsmidnight UTC
today tile?+?=target • confetti

Domain

hoops.dumbmodel.comprimary
hoops.jcamd.com301 → primary
methods/methods credibility MTNN v4

Design gate

  • ✅ AAA Okabe-Ito triple encoding shape+icon+text+pattern
  • ✅ 18px/1.65 readability • 16px anti-zoom
  • ✅ 56px bottom tabs safe-area • 44px touch min
  • ✅ Confetti canvas + XP toast • Sunni SCAD bar
  • ✅ Solo disclaimer • public/free-tier only