12. Annex: Statistics model — XG / gnuBG / blunderDB alignment

This page describes how blunderDB computes PR (Performance Rate), Snowie Error Rate, and MWC loss, and how these metrics are aligned with eXtreme Gammon (XG) and gnuBG (open reference).

12.1. Formal definitions

12.1.1. PR (Performance Rate)

PR (also called “error rate per decision” in gnuBG) measures the average error in thousandths of an equity point (millipoints, mpt) per counted decision.

\[\mathrm{PR} = \frac{\sum_i |\mathrm{error}_i|}{\mathrm{N_{counted}}} \times 500\]
  • The numerator is the absolute sum of EMG errors (cubeful equity) over all decisions in the scope.

  • The denominator \(N_\text{counted}\) is the number of counted decisions (see below).

  • The factor 500 converts equity to millipoints (1 point = 1000 mpt, but the scale is ×500 by XG/gnuBG convention — cf. gnubg/formatgs.c:399–409).

12.1.2. Snowie Error Rate

Snowie ER uses the same numerator as PR, but the denominator is the total number of moves of both players, forced moves included (all decisions, no filter):

\[\mathrm{SnowieER} = \frac{\sum_i |\mathrm{error}_i|}{N_\text{P1} + N_\text{P2}} \times 500\]

Reference: gnubg/formatgs.c:415–424.

Snowie ER is more stable across tools because its denominator does not depend on the forced/trivial decision filter. It serves as a cross-check metric between XG, gnuBG, and blunderDB.

Note

A player’s Snowie ER is typically about half their PR, because the denominator includes moves from both players while PR only uses that player’s decisions.

12.1.3. MWC loss (Match Winning Chance)

MWC loss expresses in percentage points of match-winning probability the cumulative effect of a player’s errors. For each decision, the EMG error is converted to MWC using the MET (Match Equity Table) at the current score:

\[\mathrm{MWCLoss} = \sum_i \mathrm{eq2mwc}(\mathrm{error}_i, \mathrm{score}_i)\]

Reference: gnubg/analysis.c:1449–1464.

12.2. Decisions counted in the PR denominator

blunderDB follows the same exclusion rules as XG and gnuBG.

12.2.1. Checker plays — counted decisions

Only unforced moves are counted:

  • A move is forced if the dice offer only one legal play (cMoves == 1 in gnubg/analysis.c:458).

  • Forced moves have zero error by definition: the player had no choice. Including them in the denominator would artificially lower PR.

12.2.2. Cube decisions — counted decisions

Only close cube decisions are counted:

  • A cube decision is close if it lies within the equity window [-0.16, +0.16] around the doubling point (predicate isCloseCubedecision in gnubg/eval.c:5088–5100).

  • A trivial No Double (very negative or very positive equity) is not a genuine strategic decision; including it would inflate the denominator and depress PR.

12.2.3. Filter summary

Decision type

Included in \(N_\text{counted}\) (PR)

Unforced move

Yes

Forced move

No

Close cube

Yes

Trivial No Double

No

Take / Pass

Always (these are responses to a double)

12.3. blunderDB ↔ XG ↔ gnuBG correspondence

Metrics are aligned within the following bounds (measured on 3 reference matches):

12.3.1. XG ↔ blunderDB comparison (same analysis engine)

Metric

Typical gap

Total decisions

≤ 5

Unforced moves

≤ 7

PR

≤ 0.10

MWC loss

≤ 1.0 pp

Total equity (EMG)

≤ 0.05

12.3.2. gnuBG ↔ blunderDB comparison (SGF import — different engines)

Metric

Typical gap | Main cause

PR (checker)

≤ 0.20

cross-engine equity differences

MWC loss

≤ 3.5 pp

incomplete close-cube data in SGF

Snowie ER

≤ 0.50

forced moves without analysis (SGF)

Note

SGF files (gnuBG) do not include alternatives for forced moves, which means blunderDB cannot detect all forced moves when importing SGF. This creates a structural gap on Snowie ER (slightly different denominator).

12.4. Validating your own figures

If your PR or MWC values diverge from XG figures, check the following points:

  1. Complete analyses — PR can only be computed on positions that have an analysis. Positions without analysis count as zero error but are not included in \(N_\text{counted}\).

  2. XG version — XG may change its calculations between versions. blunderDB is aligned with the behaviour observed in recent versions.

  3. Import format — gnuBG SGF files produce larger gaps on cube metrics (see table above) because the file does not include complete analyses for all cube decisions.

  4. Database migration — After updating blunderDB, existing databases are migrated automatically. Make a backup before opening a database with a new version.

12.5. gnuBG reference

Formulas have been verified against the following source files (gnuBG repository):

  • gnubg/formatgs.c:399–409 — PR (“Error rate per decision”).

  • gnubg/formatgs.c:415–424 — Snowie Error Rate.

  • gnubg/analysis.c:458–462 — Checker accumulation, exclusion of forced moves (cMoves > 1).

  • gnubg/analysis.c:1430–1474 — Per-decision EMG → MWC conversion.

  • gnubg/analysis.c:1449–1464 — MWC loss accumulation (eq2mwc).

  • gnubg/eval.c:5088–5100isCloseCubedecision predicate (0.16 threshold).