Odds Generation — soccer · goal · regular
Enter a period's Handicap and Total in Malay and its 1X2 in decimal — margins included. The engine:
- strips the margins (Power for the two-way pairs, Shin for the 1X2) to fair probabilities;
- back-solves the goal rates (λₕ, λₐ) by nested bisection — Total fixes how many goals, Handicap fixes who scores them;
- refines the score grid in stages — Poisson baseline, Dixon-Coles ρ, optional φ draw lift;
- prices every market off the last stage.

Flip Poisson / Dixon-Coles / φ on the grid to see what ρ and φ move.
Each period — full match, 1st half, 2nd half — is its own inversion. Timing and cross-half markets (HT/FT, First Goal, …) are out of scope; see the Markets reference.
↑/↓ steps a field, Shift steps bigger; on a Malay pair the partner moves the opposite way. Handicap/Total ladders use your line ±0.25; team-total, 3-way and which-team lines are illustrative — probabilities are exact given λ.
Valid inputs: Malay in [−1, +1] and never 0, 1X2 decimals above 1, and each book must carry margin (implied probabilities summing over 1).
| A=0 | A=1 | A=2 | A=3 | A=4 | A=5 | |
|---|---|---|---|---|---|---|
| H=0 | 6.69 | 7.14 | 3.81 | 1.35 | 0.36 | 0.08 |
| H=1 | 10.95 | 11.69 | 6.24 | 2.22 | 0.59 | 0.13 |
| H=2 | 8.97 | 9.57 | 5.11 | 1.82 | 0.48 | 0.10 |
| H=3 | 4.90 | 5.23 | 2.79 | 0.99 | 0.26 | 0.06 |
| H=4 | 2.01 | 2.14 | 1.14 | 0.41 | 0.11 | 0.02 |
| H=5 | 0.66 | 0.70 | 0.37 | 0.13 | 0.04 | 0.01 |
| A=0 | A=1 | A=2 | A=3 | A=4 | A=5 | |
|---|---|---|---|---|---|---|
| H=0 | 8.02 | 5.96 | 3.72 | 1.29 | 0.34 | 0.07 |
| H=1 | 10.09 | 12.93 | 6.13 | 2.13 | 0.56 | 0.12 |
| H=2 | 9.28 | 9.68 | 5.04 | 1.75 | 0.46 | 0.10 |
| H=3 | 5.09 | 5.31 | 2.77 | 0.96 | 0.25 | 0.05 |
| H=4 | 2.10 | 2.19 | 1.14 | 0.40 | 0.10 | 0.02 |
| H=5 | 0.69 | 0.72 | 0.38 | 0.13 | 0.03 | 0.01 |
| A=0 | A=1 | A=2 | A=3 | A=4 | A=5 | |
|---|---|---|---|---|---|---|
| H=0 | 8.67 | 5.15 | 3.17 | 1.07 | 0.27 | 0.06 |
| H=1 | 9.53 | 14.30 | 5.49 | 1.86 | 0.47 | 0.10 |
| H=2 | 9.20 | 9.36 | 5.73 | 1.61 | 0.41 | 0.08 |
| H=3 | 5.32 | 5.41 | 2.75 | 1.12 | 0.24 | 0.05 |
| H=4 | 2.30 | 2.34 | 1.19 | 0.40 | 0.12 | 0.02 |
| H=5 | 0.80 | 0.81 | 0.41 | 0.14 | 0.04 | 0.01 |
How these numbers are computed
A two-way Malay price converts to decimal ( if , else ), which implies a probability ; the two sides sum to an overround . The Power method finds the exponent that deflates them to a fair pair , and the stripped (margin-free) decimal odds are the reciprocals . The three-way 1X2 needs a different deflation — Shin (the formula is in step 5) — but lands in the same table shape. The fair numbers are the constraints the solver must reproduce.
| Home | Away | |
|---|---|---|
| Malay quote | +0.96 | +0.96 |
| Decimal | 1.9600 | 1.9600 |
| Implied | 0.5102 | 0.5102 |
| Fair | 0.5000 | 0.5000 |
| Fair decimal | 2.0000 | 2.0000 |
| Over | Under | |
|---|---|---|
| Malay quote | +0.95 | +0.95 |
| Decimal | 1.9500 | 1.9500 |
| Implied | 0.5128 | 0.5128 |
| Fair | 0.5000 | 0.5000 |
| Fair decimal | 2.0000 | 2.0000 |
| Home | Draw | Away | |
|---|---|---|---|
| Decimal quote | 1.8900 | 3.1300 | 4.7000 |
| Implied | 0.5291 | 0.3195 | 0.2128 |
| Fair (Shin) | 0.5060 | 0.2995 | 0.1945 |
| Fair decimal | 1.9762 | 3.3389 | 5.1420 |
Try the strips standalone — Margin — two-way (Power) · Margin — multi-way (Shin): the same math on any quotes, with the bisection narrated.
Step 1 left three fair targets, and the model has matching knobs — the scoring rates plus the diagonal lift φ (step 5). Model each side’s goals as Poisson — — and independent. Independent Poissons add — — so the match total depends only on : the Total quote pins the match size on its own, before caring who scores (step 3’s job). Every line class settles by the same rule (the line rules below): take the win mass and push mass of that one total — point masses — and the fair over-probability is . That makes size a one-dimensional root-find, laid out below in the order a solver runs it — target, search, then the evaluation every iteration repeats:
Ptail(2.50, x) = 0.50000000 (tolerance 1e-8; the target needs its full precision — here). Its search lands on — close to, but not the above: . The calculator inverts the closed-form total , while this stage inverts the score grid truncated at N = 5 (no renormalization), which clips the upper tail. That gap is a model difference, not rounding — the 6-dp above is what a faithful N = 5 re-implementation reproduces; the two agree only where the truncated tail is negligible.Each trial λ is scored the same way — the settlement rule evaluated under Poisson(λ). These are the figures a re-implementation should reproduce at the converged : first each component line’s Poisson masses, then the weighted and , then the fair check against the target:
(Additivity is exact only for the plain independent-Poisson grid, so this λ is the Poisson stage’s; the τ and φ adjustments of the later stages perturb it, so each re-solves size and split jointly against the same targets — all the recovered λ’s land in the per-stage tables (steps 4–5).)
Line rules — over wins ⟺ ; an exact hit () is a push: the stake refunds, so a two-way fair probability renormalizes it away, (win mass over non-push mass). A .5 line cannot push, so and the formula degenerates to — same rule, not a shortcut method; a quarter line (±0.25, ±0.75, …) puts half the stake on each neighbouring line, so and are the ½-weighted sums over the two components. The same settlement applies to the Handicap (step 3) and the priced ladders (step 6).
The Handicap decides who scores them — and settling it needs the full scoreline distribution, the score grid: independence makes each cell a plain product of the two Poisson masses,
— exactly the grid the score-grid panel’s Poisson stage displays. Hold fixed and slide the home share (with ). Home covers ⟺ , an exact is a push — step 2’s one rule again, with the masses now read off the grid: and (½-weighted across a quarter line’s two components), fair cover probability — which rises with , so the same solver shape applies:
Ptail); the Handicap turns on their difference — the goal margin (home goals minus away goals). A margin depends on both rates at once — its distribution is a Skellam, the difference of two Poissons — so no single Ptail in can express it. The trick is to condition on the away score : once is pinned, only the home goals still vary, and the cover collapses to one plain home tail (). Home covers (a half-line cannot push), so each away score contributes its Poisson mass times that tail:P(0, 2.704832-x)*Ptail(1, x) + P(1, 2.704832-x)*Ptail(2, x) + P(2, 2.704832-x)*Ptail(3, x) + P(3, 2.704832-x)*Ptail(4, x) + P(4, 2.704832-x)*Ptail(5, x) + P(5, 2.704832-x)*Ptail(6, x) = 0.50000000Its search lands on ; at that the 6 terms evaluate and add straight up to the target ():
At the converged split the grid masses and the fair check are:
The recovered pair is the Poisson stage’s chips in the grid panel — and with it both quotes are reproduced exactly. That closes the fit, but not the model: the two quotes pinned just two numbers, size and split, while step 6 prices whole ladders off the grid’s shape — and that shape so far rests entirely on the independence assumption. The next steps correct the shape where independence is known to fail, then re-solve so the quotes still hold: Dixon-Coles’ low-score τ (step 4), then the 1X2 draw lift φ (step 5).
Steps 2–3 hit both targets exactly — so what is left? Infinitely many grids satisfy those same two constraints; the independent product is merely the simplest of them, and it is empirically wrong in one known corner: real matches produce slightly more 0-0 and 1-1, and fewer 1-0/0-1, than independence predicts (the Dixon-Coles finding). The fix multiplies exactly those four cells by a tilt τ driven by a correlation knob ρ. Note ρ is not recovered from your quotes — steps 2–3 already spent both of them — it is a modelling input, the ρ field in the Dixon-Coles section above (league-calibrated in practice). Negative ρ lifts 0-0/1-1 and trims 1-0/0-1; positive ρ the reverse; τ = 1 leaves everything else alone:
The tilted grid is renormalized to (ρ is valid only while every τ stays positive). That reshaping breaks the step 2–3 fit — the same λ pair now prices differently, because and are sums over a grid whose mass just moved. Nothing else changes: the targets stay step 1’s, the settlement rule stays , and the same two nested bisections simply run again with the τ-tilted grid underneath. In the same solver order as steps 2–3:
Step 3 ended on with ; step 4 ends on the same 0.5000 with . That is by construction, not coincidence: 0.5000 is the target — step 1’s — and a bisection only stops when it lands there, so every ✓ line prints the same number no matter which grid sits underneath. The fair value is a function of two inputs, the grid and the λ pair; the λ’s differ precisely because the grid differs. Evaluate both pairs on both grids and the compensation becomes visible:
| fair P(home covers -0.50) | product grid (step 3) | τ-grid, ρ = -0.10 (step 4) |
|---|---|---|
| step-3 pair (1.6378, 1.0670) | 0.5000 ✓ | 0.4920 ✗ |
| step-4 pair (1.6469, 1.0427) | 0.5078 ✗ | 0.5000 ✓ |
Read it by row — same pair, swap the grid — and the tilt shows: at the step-3 pair, τ alone drags the cover value 0.5000 → 0.4920. Read it by column — same grid, swap the pair — and the repair shows: on the τ-grid, moving to the step-4 pair brings it back to 0.5000. Each grid has exactly one ✓ cell; tilting the grid moved the solution point, and finding its new location is all the step-4 bisection does. ρ itself never enters the settlement rule — it acts one layer down, inside the cells that and sum over: step 3’s is summed off the product grid, step 4’s off the τ-tilted grid (the subscript names the grid the sum runs over — it is not a power). For example the 1-0 cell (a τ cell) goes while the re-split of λₕ vs λₐ moves the untouched cells by exactly enough that the aggregate lands back on the targets. The side-by-side grids at the end of this step show that recomposition cell by cell. Outer loop — size. Each row takes the bracket midpoint as a trial , runs the full inner bisection (second table) to find the λₕ that restores the cover target on that trial’s τ-grid, then compares the resulting fair with to decide which half of the bracket survives: Inner loop — split. At the converged , each row prices the τ-grid at and checks fair against : move: ↑ = fair below target → keep the upper half (lo = mid) · ↓ = above → keep the lower half (hi = mid) · ✓ = |fair − target| < 1e-7 (the dc-stage tolerance; 60-iteration cap). The two final rows land on (1.6469, 1.0427) — step 4’s pair in the ⟹ line above. Every earlier outer row ran this same inner loop against its own trial λ_total; the inner table shown is the one belonging to the winning size.Unroll the search — every bisection iteration
k lo hi trial λ_total inner λₕ fair P(over) move 1 0.020000 8.000000 4.010000 2.314064 0.75390658 ↓ 2 0.020000 4.010000 2.015000 1.314016 0.32573724 ↑ 3 2.015000 4.010000 3.012500 1.807982 0.57445562 ↓ 4 2.015000 3.012500 2.513750 1.559643 0.45654525 ↑ 5 2.513750 3.012500 2.763125 1.683477 0.51759954 ↓ 6 2.513750 2.763125 2.638437 1.621478 0.48755270 ↑ 7 2.638437 2.763125 2.700781 1.652457 0.50270268 ↓ 8 2.638437 2.700781 2.669609 1.636962 0.49515858 ↑ 9 2.669609 2.700781 2.685195 1.644708 0.49893845 ↑ 10 2.685195 2.700781 2.692988 1.648582 0.50082253 ↓ 11 2.685195 2.692988 2.689092 1.646645 0.49988098 ↑ 12 2.689092 2.692988 2.691040 1.647614 0.50035188 ↓ 13 2.689092 2.691040 2.690066 1.647130 0.50011646 ↓ 14 2.689092 2.690066 2.689579 1.646888 0.49999873 ↑ 15 2.689579 2.690066 2.689822 1.647009 0.50005760 ↓ 16 2.689579 2.689822 2.689701 1.646948 0.50002816 ↓ 17 2.689579 2.689701 2.689640 1.646918 0.50001345 ↓ 18 2.689579 2.689640 2.689609 1.646902 0.50000609 ↓ 19 2.689579 2.689609 2.689594 1.646895 0.50000241 ↓ 20 2.689579 2.689594 2.689586 1.646891 0.50000057 ↓ 21 2.689579 2.689586 2.689583 1.646889 0.49999965 ↑ 22 2.689583 2.689586 2.689585 1.646890 0.50000011 ↓ 23 2.689583 2.689585 2.689584 1.646890 0.49999988 ↑ 24 2.689584 2.689585 2.689584 1.646890 0.49999999 ✓ j lo hi trial λₕ fair P(cover) move 1 0.010000 2.679584 1.344792 0.35759231 ↑ 2 1.344792 2.679584 2.012188 0.67290199 ↓ 3 1.344792 2.012188 1.678490 0.51520853 ↓ 4 1.344792 1.678490 1.511641 0.43527488 ↑ 5 1.511641 1.678490 1.595066 0.47509906 ↑ 6 1.595066 1.678490 1.636778 0.49513575 ↑ 7 1.636778 1.678490 1.657634 0.50516984 ↓ 8 1.636778 1.657634 1.647206 0.50015194 ↓ 9 1.636778 1.647206 1.641992 0.49764360 ↑ 10 1.641992 1.647206 1.644599 0.49889772 ↑ 11 1.644599 1.647206 1.645902 0.49952482 ↑ 12 1.645902 1.647206 1.646554 0.49983838 ↑ 13 1.646554 1.647206 1.646880 0.49999516 ↑ 14 1.646880 1.647206 1.647043 0.50007355 ↓ 15 1.646880 1.647043 1.646961 0.50003436 ↓ 16 1.646880 1.646961 1.646921 0.50001476 ↓ 17 1.646880 1.646921 1.646900 0.50000496 ↓ 18 1.646880 1.646900 1.646890 0.50000006 ✓
Reading the repair: each miss has its own knob — a Total miss moves the size (step 2’s bisection on λ_total), a Handicap miss moves the split (step 3’s on λₕ). Here the tilt knocked the cover target off harder (by 0.0080, vs 0.0038 for the over) — ρ < 0 parks its extra mass on the draw cells 0-0/1-1, and on a home -0.50 line a draw is a lost cover — so the correction lands mainly in the split: λₕ +0.0090, λₐ −0.0243, λ_total −0.0152.
Both stages so far are the same nested solve (steps 2–3), each run on its own grid:
| Stage | λₕ | λₐ | λₕ+λₐ | Δ cover | Δ over |
|---|---|---|---|---|---|
| Poisson | 1.6378 | 1.0670 | 2.7048 | 1.9e-9 | 1.4e-9 |
| Dixon-Coles | 1.6469 | 1.0427 | 2.6896 | 6.0e-8 | 8.0e-9 |
These rows are the score-grid panel’s λ chips; the Δ’s are each stage’s achieved |model − target| residuals — the convergence check. One optional constraint remains before the markets price — step 5.
Side by side, the tilt becomes visible — the low-score corner of both grids, every cell shaded by how Dixon-Coles moved it (green = up, red = down; hover a cell for the exact before → after, and click any Dixon-Coles cell for its full derivation from the Poisson pieces):
| A=0 | A=1 | A=2 | A=3 | A=4 | A=5 | |
|---|---|---|---|---|---|---|
| H=0 | 0.0669 | 0.0714 | 0.0381 | 0.0135 | 0.0036 | 0.0008 |
| H=1 | 0.1095 | 0.1169 | 0.0624 | 0.0222 | 0.0059 | 0.0013 |
| H=2 | 0.0897 | 0.0957 | 0.0511 | 0.0182 | 0.0048 | 0.0010 |
| H=3 | 0.0490 | 0.0523 | 0.0279 | 0.0099 | 0.0026 | 0.0006 |
| H=4 | 0.0201 | 0.0214 | 0.0114 | 0.0041 | 0.0011 | 0.0002 |
| H=5 | 0.0066 | 0.0070 | 0.0037 | 0.0013 | 0.0004 | 0.0001 |
| A=0 | A=1 | A=2 | A=3 | A=4 | A=5 | |
|---|---|---|---|---|---|---|
| H=0 | 0.0802 | 0.0596 | 0.0372 | 0.0129 | 0.0034 | 0.0007 |
| H=1 | 0.1009 | 0.1293 | 0.0613 | 0.0213 | 0.0056 | 0.0012 |
| H=2 | 0.0928 | 0.0968 | 0.0504 | 0.0175 | 0.0046 | 0.0010 |
| H=3 | 0.0509 | 0.0531 | 0.0277 | 0.0096 | 0.0025 | 0.0005 |
| H=4 | 0.0210 | 0.0219 | 0.0114 | 0.0040 | 0.0010 | 0.0002 |
| H=5 | 0.0069 | 0.0072 | 0.0038 | 0.0013 | 0.0003 | 0.0001 |
The 1X2 is a three-way book, so Shin stripped it in step 1: with implied and overround , Shin’s insider fraction deflates each side to
giving fair , , . The handicap already fixes the win sides; the draw — the grid’s diagonal — is the new constraint. Multiplying every equal-score cell by , renormalizing the grid to , and re-solving so the Handicap and Total still hold, a third bisection lands φ on the draw (Method A: one flat factor across the whole diagonal, i.e. per-cell weights ). The “two-input draw” below is the φ = 0 grid’s diagonal mass — the Dixon-Coles stage’s draw chip in the score-grid panel:
Unroll the φ search — every bisection iteration
Third loop — the draw. Each row lifts every equal-score cell by at its trial φ, renormalizes, re-solves against the Handicap and Total targets — the entire two-level bisection unrolled in step 4, now on the lifted grid — and reads the solved grid’s diagonal against the draw target . Bracket: the two-input draw 0.2706 < target → inflate it: φ ∈ [0.0000, 1.0000]:
| i | lo | hi | trial φ | λₕ | λₐ | draw | move |
|---|---|---|---|---|---|---|---|
| 1 | 0.000000 | 1.000000 | 0.50000000 | 1.851442 | 0.980329 | 0.333069327 | ↓ |
| 2 | 0.000000 | 0.500000 | 0.25000000 | 1.752676 | 1.011626 | 0.305280237 | ↓ |
| 3 | 0.000000 | 0.250000 | 0.12500000 | 1.700712 | 1.027253 | 0.288930801 | ↑ |
| 4 | 0.125000 | 0.250000 | 0.18750000 | 1.726920 | 1.019454 | 0.297333627 | ↑ |
| 5 | 0.187500 | 0.250000 | 0.21875000 | 1.739853 | 1.015542 | 0.301362045 | ↓ |
| 6 | 0.187500 | 0.218750 | 0.20312500 | 1.733400 | 1.017499 | 0.299361869 | ↑ |
| 7 | 0.203125 | 0.218750 | 0.21093750 | 1.736630 | 1.016521 | 0.300365439 | ↓ |
| 8 | 0.203125 | 0.210938 | 0.20703125 | 1.735016 | 1.017010 | 0.299864494 | ↓ |
| 9 | 0.203125 | 0.207031 | 0.20507813 | 1.734208 | 1.017255 | 0.299613402 | ↓ |
| 10 | 0.203125 | 0.205078 | 0.20410156 | 1.733804 | 1.017377 | 0.299487680 | ↑ |
| 11 | 0.204102 | 0.205078 | 0.20458984 | 1.734007 | 1.017316 | 0.299550541 | ↓ |
| 12 | 0.204102 | 0.204590 | 0.20434570 | 1.733906 | 1.017346 | 0.299519081 | ↓ |
| 13 | 0.204102 | 0.204346 | 0.20422363 | 1.733855 | 1.017361 | 0.299503397 | ↑ |
| 14 | 0.204224 | 0.204346 | 0.20428467 | 1.733880 | 1.017354 | 0.299511273 | ↓ |
| 15 | 0.204224 | 0.204285 | 0.20425415 | 1.733868 | 1.017358 | 0.299507338 | ↓ |
| 16 | 0.204224 | 0.204254 | 0.20423889 | 1.733861 | 1.017359 | 0.299505365 | ↓ |
| 17 | 0.204224 | 0.204239 | 0.20423126 | 1.733858 | 1.017360 | 0.299504384 | ↓ |
| 18 | 0.204224 | 0.204231 | 0.20422745 | 1.733857 | 1.017361 | 0.299503893 | ↓ |
| 19 | 0.204224 | 0.204227 | 0.20422554 | 1.733856 | 1.017361 | 0.299503661 | ↓ |
| 20 | 0.204224 | 0.204226 | 0.20422459 | 1.733856 | 1.017361 | 0.299503495 | ↑ |
| 21 | 0.204225 | 0.204226 | 0.20422506 | 1.733856 | 1.017361 | 0.299503578 | ↑ |
| 22 | 0.204225 | 0.204226 | 0.20422530 | 1.733856 | 1.017361 | 0.299503619 | ↑ |
| 23 | 0.204225 | 0.204226 | 0.20422542 | 1.733856 | 1.017361 | 0.299503640 | ↓ |
| 24 | 0.204225 | 0.204225 | 0.20422536 | 1.733856 | 1.017361 | 0.299503630 | ↑ |
| 25 | 0.204225 | 0.204225 | 0.20422539 | 1.733856 | 1.017361 | 0.299503635 | ↓ |
| 26 | 0.204225 | 0.204225 | 0.20422538 | 1.733856 | 1.017361 | 0.299503632 | ↓ |
| 27 | 0.204225 | 0.204225 | 0.20422537 | 1.733856 | 1.017361 | 0.299503631 | ✓ |
move: ↑ = draw below target → keep the upper half (lo = mid) · ↓ = above → keep the lower half (hi = mid) · ✓ = |draw − target| < 1e-9 (48-iteration cap). The ✓ row is the stage’s result: φ = 0.2042 with the re-solved pair (1.7339, 1.0174) — the 1X2 φ chips in the grid panel and the last row of the table below. Every row re-ran the whole step-4 nest at its own trial φ.
The φ stage re-runs the same nested solve with this third constraint attached, completing step 4’s per-stage table:
| Stage | λₕ | λₐ | λₕ+λₐ | φ | Δ cover | Δ over | Δ draw |
|---|---|---|---|---|---|---|---|
| Poisson | 1.6378 | 1.0670 | 2.7048 | — | 1.9e-9 | 1.4e-9 | — |
| Dixon-Coles | 1.6469 | 1.0427 | 2.6896 | — | 6.0e-8 | 8.0e-9 | — |
| 1X2 φ | 1.7339 | 1.0174 | 2.7512 | 0.2042 | 1.7e-9 | 2.1e-8 | 2.0e-10 |
Every market below prices off the last row’s grid; Δ draw is the φ bisection’s achieved residual.
Consistency — the Handicap owns the tilt, so the 1X2 win legs are a cross-check, not a constraint: model P(home win) 0.5000 vs 1X2 0.5060, P(away win) 0.2005 vs 0.1945. A large gap means the three quotes disagree (different books or times). One draw number fixes the diagonal’s level only — the 2-2/3-3/4-4 shape rides on the flat wₖ; pin it with correct-score quotes. Flat wₖ also lifts only even totals (every k-k totals 2k), so the fit nudges Odd/Even and Exact-Total toward even — Method A is not draw-isolated. ρ and φ both lift 0-0/1-1, so φ absorbs part of ρ — the two are not independently interpretable; flip the Dixon-Coles and 1X2 φ stages in the grid panel to see φ’s residual move.
With λₕ, λₐ and φ fixed, the last stage’s grid (step 5) is fully determined — the score-grid panel above — and every market probability is just a sum of its matching cells. Each outcome is one grid cell J[h][a]; scores beyond the board cap (4-4 full match, 3-3 halves) fold into “AOS”.
| Outcome | Σ from grid | Fair | Priced dec |
|---|---|---|---|
| 0-0 | 0.0867 | 0.0867 | 11.139 |
| 0-1 | 0.0515 | 0.0515 | 18.615 |
| 0-2 | 0.0317 | 0.0317 | 29.890 |
| 0-3 | 0.0107 | 0.0107 | 83.286 |
| 0-4 | 0.0027 | 0.0027 | 269.624 |
| 1-0 | 0.0953 | 0.0953 | 10.142 |
| 1-1 | 0.1430 | 0.1430 | 6.784 |
| 1-2 | 0.0549 | 0.0549 | 17.468 |
| … 18 more | |||
Raw masses are normalized to Σ = 1, then inflated by Shin to overround 1 + 0.05 — the insider model run forward: with and , bisecting until (this run: ).
targets tH = powerStrip(HCP pair) # fair P(home covers L) — step 1
tT = powerStrip(Total pair) # fair P(over T) — step 1
tD = shinStrip(1X2).draw # fair P(draw); Method A only — step 5
bisect φ ∈ (−1, ∞) # outermost; skip (φ = 0) with no 1X2
bisect λ_total ∈ [0.02, 8] # size — step 2
bisect λₕ ∈ (0, λ_total) # split — step 3; λₐ = λ_total − λₕ
J = Poisson(λₕ, λₐ) on 0…N # ×τ + renorm (DC — step 4); φ stage: diag ×(1+φ) + renorm
until fairHcp(J, L) = tH # line rules — step 2
until fairTot(J, T) = tT
until Σₖ J[k][k] = tDThe grid panel’s stages run this same nest with the adjustments off/on — Poisson: neither, Dixon-Coles: τ only, 1X2 φ: both. Every residual is monotone in its knob — cover rises with λₕ, over with λ_total, draw with φ — so plain bisection converges: 48–60 iterations per loop at tolerances 1e-9…1e-7 (the round-trip Δp above is this run’s achieved error). The φ bracket doubles upward from [0, 1], or flips to (−1, 0] when the two-input draw already exceeds the 1X2 target. The grid truncates at N = 5: the plain Poisson grid is not renormalized, the τ- and φ-adjusted grids are, and every market group renormalizes its outcome masses to Σ = 1 before its margin is applied — that absorbs the truncation loss. The executable reference for all of the above is docs/src/lib/odds/core.ts + markets.ts, held to the original simulator by the golden-master test in docs/src/lib/odds/__tests__/.