What it is. The newest line (built 2026-05-28 → today): general distributional regression. The model answers numeric questions — house prices, Fermi estimates, patient survival times — with a full density over the target, scored by the log density \(\log p_{\text{model}}(y^{*})\). Two expressiveness levels are compared: an explicit mixture-of-Gaussians XML format, and pluck programs — small probabilistic programs whose exact marginal the pluck engine (Alex's Rust PPL, Python bindings) computes, inducing the density for scoring. Model: Qwen3-4B.
| Dataset | Target | Why it's here | Status |
|---|---|---|---|
| ames_housing (2,930 sales) | log price | discrete features (neighborhood, pool…) gate a continuous price — natural branching | headline + Phase 3 |
| fermieval (3,915 questions) | base-10 exponent | Fermi estimates = products of independent factors | headline + Phase 3 |
| survival (SUPPORT/METABRIC/GBSG) | log time-to-event, right-censored | mixture-cure structure (cured → no event; else T ~ F); censored rows scored as \(\log S(y)\) | headline + Phase 3 |
| openestimate | per-variable continuous, Gaussian GT | multi-domain numerical estimation | headline (eval only) |
| metaculus (AutoCast numeric) | normalized position in range | real forecasting questions | leak: resolved pre-cutoff — scalar median log-score +0.244 is implausibly good; within-dataset comparisons only |
| what_are_the_odds | probabilistic-reasoning QA | distributional reasoning | stubbed: labels need regeneration |
Every method induces a real density, so log scores are directly comparable across formats:
| Method | Output | Induced density |
|---|---|---|
| scalar (baseline) | <answer>V</answer> | \( \mathcal N(V, \hat\sigma) \), \(\hat\sigma\) fit on train residuals — richer formats must beat this |
| beta | <beta><alpha>A</alpha><beta>B</beta></beta> | Beta(A,B) on range-normalized target (Jacobian-corrected) |
| calibrated_ci | 90% interval [L,U] | \( \mathcal N\!\bigl(\tfrac{L+U}{2}, \tfrac{U-L}{2\cdot1.645}\bigr) \) |
| mog_xml ← Phase 3 target | <mixture><component><mu><sigma><w>… | \( \sum_k w_k \,\mathcal N(y;\mu_k,\sigma_k) \), K ≤ 4 |
| pluck ← Phase 4 | Scheme-like program (below) | exact-inference marginal: Gaussian + point-mass components |
A pluck program for a mixture-cure survival model — the harness wraps the body in a
(query …) scaffold, runs exact inference, and scores the resulting mixture:
(let ((cured (flip 0.3))
(baseline (gaussian 4.0 1.5))) ; std-dev, not variance
(if cured 100.0 baseline))
; → exact marginal: 30% point mass + 70% · N(4.0, 1.5)
5.0, never 5.
No multiplying two Gaussians ((*. c g) with constant c only). No division by a
Gaussian. No scientific notation (1e9 panics the parser). No expt.
These restrictions are visible in the baseline parse failures below — the base model reaches for
exactly the forbidden constructs.| dataset | scalar | beta | calibrated_ci | mog_xml |
|---|---|---|---|---|
| ames_housing | −1.136 | −1.343 | −4.040 | −0.707 |
| fermieval | −11.976 | — | −62.710 | −6.333 |
| openestimate | −9.812 | −8.595 | −6.4M | −463k |
| metaculus (leaky) | −1,862 | −11.83 | −203k | −35k |
| survival | −67.022 | — | −449.7 | −15.488 |
| dataset | scalar | beta | cal_ci | mog |
|---|---|---|---|---|
| ames | −0.687 | −0.808 | −0.585 | −0.493 |
| fermi | −2.073 | — | −1.081 | −1.172 |
| openest. | −7.119 | −8.028 | −64.0 | −12.26 |
| metaculus | +0.244 | −0.287 | −21.05 | −16.92 |
| survival | −1.899 | — | −33.22 | −6.259 |
| dataset | scalar | beta | cal_ci | mog |
|---|---|---|---|---|
| ames | 0.698 | 0.870 | 0.532 | 0.863 |
| fermi | 0.892 | — | 0.675 | 0.780 |
| openest. | 0.775 | 0.787 | 0.085 | 0.285 |
| metaculus | 0.719 | 0.495 | 0.167 | 0.149 |
| survival | 0.584 | — | 0.092 | 0.343 |
Readings. MoG-XML wins the mean log score on 3/5 datasets. The mean-vs-median gap on calibrated_ci and mog_xml is itself informative: means are dominated by a small fraction of catastrophically overconfident outputs — the proper scoring rule punishing overconfidence. Calibrated-CI replicates FermiEval's "perception tunnel": asked for a 90% interval, the base LM emits one ~10× too narrow (9% coverage on openestimate/survival). And beta parses only ≈50% of the time (the model writes "I'd say Beta(3,5)" as prose) — so beta is a format-discipline test, not a scoring-rule test; it is excluded from Phase 3 training.
All numbers below are computed on the pairwise matched subset — the
examples both the base and trained model parse — via matched_report.py. Parse
rate is shown separately because the base model abstains (fails to parse) on the hard
examples, so a parse-conditioned mean would flatter it (see the methodological lesson below).
| dataset (ckpt) | parse rate | log-score mean ↑ | log-score median ↑ | abs err ↓ | cov 90% (→0.9) | |||||
|---|---|---|---|---|---|---|---|---|---|---|
| base | tr | base | tr | base | tr | base | tr | base | tr | |
| ames (250) n=197 | 0.985 | 1.00 | −0.707 | −0.575 | −0.493 | −0.444 | 0.373 | 0.317 | 0.863 | 0.954 |
| survival (250) n=143 | 0.715 | 1.00 | −15.488 | −2.106 | −6.259 | −1.875 | 2.734 | 2.326 | 0.343 | 0.804 |
| fermieval (300) n=132 | 0.660 | 1.00 | −6.333 | −3.877 | −1.172 | −1.549 | 6.957 | 3.695 | 0.780 | 0.818 |
fermieval nuance: training improves the matched mean (−6.33 → −3.88, far fewer catastrophic tail misses, abs-err 6.96 → 3.70) but the median slips (−1.17 → −1.55) — mild over-sharpening on the typical question while the tails tighten. The other two datasets improve on every metric.
The model emits a Pluck program; exact inference induces its density, scored by the same
clipped log-score reward as Phase 3 (reward_pluck.py caches each inference so the
reward + 5 metric heads cost one program execution, ~1 ms/rollout). Training order survival →
fermieval → ames, 300 steps each, LoRA. Two things resolved a prior open question:
pluck_v2: explicit no-division / binary-+. rules + a log-space recipe)
was tested zero-shot and hurt (survival parse 0.70 → 0.33; the denser prompt worsened
<think> overrun), so it was dropped — the base model needs fewer rules, not
more; GRPO is what fixes the language gaps.flip/if, but between two
gaussians, inducing a gaussian mixture (≈1.8 components). It does not reach for
point-mass "cure" leaves — the one structure a plain MoG cannot express.The fair comparison is trained-vs-trained on the full held-out 200 cells (both parse everything). Base baselines (parse-conditioned) shown for context. All three datasets done.
| dataset · series | parse | log-score mean ↑ | median ↑ | abs err ↓ | CRPS ↓ | cov 90% |
|---|---|---|---|---|---|---|
| survival · base MoG / base pluck | .72/.70 | −15.5/−6.7 | −6.3/−2.3 | — | — | .34/.51 |
| survival · trained MoG (s250) | 1.00 | −1.99 | −1.79 | 2.61 | 1.71 | 0.83 |
| survival · trained pluck (s250) | 1.00 | −2.10 | −1.79 | 1.79 | 1.25 | 0.81 |
| fermieval · base MoG / base pluck | .66/.47 | −6.3/−15.2 | −1.2/−1.4 | — | — | .75/.58 |
| fermieval · trained MoG (s300) | 1.00 | −7.11 | −1.62 | 4.20 | 3.52 | 0.78 |
| fermieval · trained pluck (s250) | 1.00 | −4.93 | −1.61 | 3.26 | 2.80 | 0.80 |
| ames · base MoG / base scalar | .99/.91 | −0.71/−1.15 | −0.49/−0.69 | — | — | .86/.69 |
| ames · trained MoG (s250) | 1.00 | −0.567 | −0.440 | 0.314 | 0.229 | 0.955 |
| ames · trained pluck (s250) | 1.00 | −0.555 | −0.421 | 0.304 | 0.220 | 0.950 |
(+.) log-space factor composition is never used; the model directly estimates the
final exponent.flip/
if just produces gaussian mixtures, or collapses to a single gaussian. The payoff is
cleaner means and adaptive spread from exact inference over a clean parametric family,
not the latent expressivity. That reframes the PPL pitch: today it's a better-conditioned way to
emit a mixture; realizing structural advantages needs a reward or exploration signal that pays
for structure (the cure-exemplar probe below tests the exploration side).A survival run (--method pluck_cure) adds one worked exemplar showing a
point-mass cure branch ((if no-event 99.0 (gaussian 4.0 1.5))), everything else
identical to v1, to separate an exploration/prompt limit from a reward limit.
The result is nuanced — and surprising.
| survival rows | n | trained MoG | v1 pluck | cure pluck | cure point-mass | % rows w/ point-mass |
|---|---|---|---|---|---|---|
| censored | 74 | −1.481 | −1.399 | −1.411 | 0.015 | 5% |
| uncensored | 125 | −2.294 | −2.516 | −2.115 | 0.028 | 11% |
| all | 199 | −1.992 | −2.101 | −1.853 | 0.023 | 9% |
Variance control (2 runs each). v1 pluck across two runs lands at −2.10 and −2.17/−2.22; the cure model across two runs lands at −1.85 and −1.92. Both cure runs beat both v1 runs — the distributions don't overlap, so the ~0.27 nat cure gain is real and reproducible (cure ~−1.90 > trained MoG −1.99 > v1 pluck ~−2.16). But all runs share a median ~−1.70…−1.79, so the gain lives in the mean (tail robustness, coverage 0.86–0.91), not the typical case — a better-calibrated prior, not correct deployment of the cure structure.
The failure traces below show the two distinct ways a pluck rollout fails: a program is
emitted but the language rejects it (variadic +., division, scientific notation),
or <think> overruns the budget so no program appears at all.
The central finding (pluck never realizes structure) could be a capacity limit. To test it, the same survival pluck GRPO was run at 4B, 8B, and 14B (the largest that fits this 96 GB GPU under vLLM colocate). Held-out 200 cells, best checkpoint each:
| model | log-score mean ↑ | median ↑ | CRPS ↓ | cov 90% | structure used |
|---|---|---|---|---|---|
| Qwen3-4B pluck | −2.099 | −1.793 | 1.251 | 0.81 | branch≡0, ncomp ~1.8 |
| Qwen3-8B pluck | −2.135 | −1.823 | 1.306 | 0.77 | branch≡0, ncomp ~1.8 |
| Qwen3-14B pluck | −1.976 | −1.767 | 1.060 | 0.86 | branch≡0, ncomp ~1.0 |
| Qwen3-4B MoG (reference) | −1.994 | −1.794 | — | 0.83 | — |
branch (point-mass / label mass) is identically 0 at 4B, 8B, and 14B
— and 14B uses the least structure of all, collapsing to a single gaussian (ncomp ~1.0)
rather than the smaller models' mixtures. Scaling 3.5× (4B→14B) buys only ~0.12 nat on the mean
(a 14B pluck ≈ a 4B MoG), with the gain in calibration/CRPS, not structure. So pluck's unrealized
expressivity is reward-bound, not capacity-bound: a bigger model does not
discover point masses or factor composition under the log-density signal. Realizing PPL structure
needs a reward or exploration signal that pays for it — the cure-exemplar probe is the cheap
exploration lever; a structure-aware reward is the principled one. (32B would not fit colocate on
one GPU; sequence length was never the constraint — prompts are 350–510 tokens.)bash training/gpu_session.sh 300
(skip-if-done pluck generation → in-place scoring → three sequential resumable trainings).