Odds Generation — point · game + game · game (badminton)
Enter the match's Point Handicap and Points Total in Malay and its Moneyline in decimal — margins still embedded. Rally scoring makes the score a pure race — first to 21 by 2, capped at 30 (golden point at 29-29), best of three games — so one strength parameter would pin the totals the moment the handicap is known: the same one-parameter straitjacket that made Poisson wrong for basketball. The engine (ADR-030):
- strips each bookmaker margin (Power method — all three books two-way);
- bisects the rally-win share r against the Point Handicap on the exact race DP (win-by-2 barriers, golden-point cap);
- fits γ, a score coupling ("restoring force": the rally probability tilts by γ · deficit), to the Points Total — γ > 0 keeps games close and lengthens them, γ < 0 shortens; a two-sided knob a mixture cannot give;
- fits κ_M, a match-level form shock, to the Moneyline (toggle in the ML box) with a probed direction — counterintuitively κ_M raises the re-solved favorite's ML, and an ML outside the reachable band is a cross-anchor inconsistency surfaced as Δ ML, not a solver failure;
- prices both scopes off the one solved distribution — game · game (Moneyline, ±1.5 game handicap) and point · game (match point lines plus per-game sheets, game 3 conditional on being played).

Each stage re-solves the same fair targets — flip Race / γ / κ_M and watch the totals humps breathe while the handicap holds. Race lengths are per-tournament config: the BWF approved 3×15 (cap 21) at the 2026 AGM with rollout pending, so both formats ship here; switching loads that format's seed quotes.
↑/↓ steps a field, Shift steps bigger; Malay pairs step their partner the opposite way. Quotes are whole-match; per-game sheets derive from the same solve, game 3 conditional on being played.
Valid inputs: Malay in [−1, +1] non-zero with margin, decimals above 1. The κ_M fit re-solves (r, γ) at every trial — allow it a second.
| A=0 | A=1 | A=2 | |
|---|---|---|---|
| H=0 | 16.3 | ||
| H=1 | 15.8 | ||
| H=2 | 43.4 | 24.6 |
| -21 | -20 | -19 | -18 | -17 | -16 | -15 | -14 | -13 | -12 | -11 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 | 0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +10 | +11 | +12 | +13 | +14 | +15 | +16 | +17 | +18 | +19 | +20 | +21 | +22 | +23 | +24 | +25 | +26 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0.1 | 0.1 | 0.1 | 0.2 | 0.3 | 0.4 | 0.6 | 0.8 | 1.0 | 1.3 | 1.6 | 1.9 | 2.2 | 2.5 | 2.7 | 2.9 | 2.9 | 3.3 | 1.8 | 2.0 | 1.8 | 1.8 | 2.0 | 2.4 | 2.3 | 4.7 | 4.7 | 5.1 | 5.4 | 5.4 | 5.3 | 5.0 | 4.6 | 4.1 | 3.6 | 3.0 | 2.5 | 2.0 | 1.6 | 1.2 | 0.9 | 0.6 | 0.5 | 0.3 | 0.2 | 0.1 | 0.1 | 0.0 |
| 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0.0 | 0.1 | 0.1 | 0.2 | 0.3 | 0.5 | 0.7 | 0.9 | 1.2 | 1.6 | 2.0 | 2.5 | 2.9 | 3.4 | 3.9 | 4.2 | 4.5 | 4.6 | 4.5 | 4.2 | 3.8 | 3.2 | 2.4 | 1.6 | 1.7 | 0.8 | 1.1 | 0.4 | 0.7 | 0.2 | 0.4 | 0.1 | 0.2 | 0.1 | 0.1 | 0.0 | 0.1 | 0.0 | 0.1 | 0.1 | 0.1 | 0.1 | 0.2 | 0.2 | 0.4 | 0.5 | 0.6 | 0.8 | 1.1 | 1.3 | 1.6 | 1.9 | 2.2 | 2.4 | 2.6 | 2.7 | 2.8 | 2.7 | 2.5 | 2.3 | 2.0 | 1.7 | 1.4 | 1.2 | 1.0 | 0.8 | 0.7 | 0.5 | 0.5 | 0.3 | 0.3 | 0.2 | 0.2 | 0.1 | 0.1 | 0.1 | 0.1 | 0.0 | 0.0 |
| Outcome | Fair | Dec | Priced | Malay |
|---|---|---|---|---|
| Home | 68.0% | 1.471 | 1.439 | +0.44 |
| Away | 32.0% | 3.122 | 2.926 | -0.52 |
How these numbers are computed
| Home | Away | |
|---|---|---|
| Malay quote | +0.88 | +0.99 |
| Decimal | 1.8800 | 1.9900 |
| Implied | 0.5319 | 0.5025 |
| Fair | 0.5149 | 0.4851 |
| Fair decimal | 1.9420 | 2.0616 |
| Over | Under | |
|---|---|---|
| Malay quote | +0.80 | -0.93 |
| Decimal | 1.8000 | 2.0753 |
| Implied | 0.5556 | 0.4819 |
| Fair | 0.5375 | 0.4625 |
| Fair decimal | 1.8604 | 2.1622 |
| Home | Away | |
|---|---|---|
| Decimal quote | 1.45 | 2.99 |
| Decimal | 1.4500 | 2.9900 |
| Implied | 0.6897 | 0.3344 |
| Fair | 0.6797 | 0.3203 |
| Fair decimal | 1.4713 | 3.1216 |
Standalone strips: Margin — two-way (Power).
Every rally scores a point, so a game is a race to 21 by 2, capped at 30 (golden point at 29-29), best of three. A single strength r would pin the totals once the handicap is known — the same one-parameter straitjacket that made Poisson wrong for basketball — so the rally probability carries a score coupling:
γ > 0 is a restoring force (the trailing player lifts — games stay close and run long, deuces multiply); γ < 0 lets games run away and shorten. The DP walks the exact (x, y) lattice, so the coupling costs nothing; the match folds games carrying the points margin and total pmfs, the games joint and each game's grid. Validated against a 200k-run Monte Carlo.
| Stage | r | γ | κ_M | Δ cover | Δ total | Δ ML |
|---|---|---|---|---|---|---|
| Race | 0.5224 | 0.0000 | 0.0000 | 4.1e-6 | 3.7e-2 | 0.83% |
| γ | 0.5167 | -0.0096 | 0.0000 | 9.4e-6 | 7.9e-6 | 5.42% |
| κ_M | 0.5296 | 0.0076 | 0.0391 | 1.0e-5 | 9.8e-6 | 0.00% |
κ_M is a 3-node form mixture on r. Counterintuitively it RAISES the re-solved favorite’s ML — the mixture widens cumulative point margins faster than the game race, so the handicap re-solves to a stronger r — hence the direction is probed at the bracket ends, never assumed. An ML outside the reachable band keeps the nearer endpoint and leaves Δ ML large: a cross-anchor inconsistency (alertable), not a solver failure.
Game 3 exists with probability 40.4% here; its markets are void if it is not played, so its sheet prices conditional on being played — and under the κ_M mixture the conditioning re-weights the form nodes (deciders come from the close-form nodes). The same fold yields the game·game scope for free (Moneyline, ±1.5 game handicap, correct score). Race lengths are per-tournament config: the BWF approved 3×15 (cap 21) at the AGM on 2026-04-25 with rollout pending, so 3×21 and 3×15 will coexist — the format toggle above re-prices the same latents under either race.
Full match: P(home wins the game race) — no tie leg. Per game: the game winner, conditional on the game being played (void otherwise). Fair groups are re-margined exactly as in goal-regular (Power ladder two-way, Shin multi-way).
targets tH = powerStrip(HDP pair) tO = powerStrip(OU pair) tW = powerStrip(ML pair)
stage iid : γ = 0, κ_M = 0 bisect r until P(A covers | dist) = tH
stage γ : bisect γ until P(over | dist) = tO (r re-solved inside — restoring
force lengthens games, runaway shortens; two-sided, unlike a mixture)
stage κ_M : probe ml(0) vs ml(κ_max) at re-solved (r, γ) → bisect toward tW
(κ_M RAISES the re-solved favorite's ML; unreachable target ⇒ Δ ML alert)
dist: game DP on the (x, y) lattice — race to 21 by 2, cap 30 (golden point) —
folded best-of-3 with margin/total pmfs, games joint, per-game grids
scopes: ONE dist prices game·game (ML, ±1.5) and point·game (match + per-game, conditional)Engine + invariants: docs/src/lib/odds/badminton.ts, __tests__/badminton.test.ts; decision record ADR-030 (extends ADR-029).