Skip to content

The Preference Matrix (head-to-head) and the Condorcet check

One line: the Preference Matrix shows every candidate against every other, one pair at a time — how many voters prefer each, and how many rated them equal. It's how you check whether STAR's winner is also the Condorcet winner (the candidate who beats everyone head-to-head).

→ Hub: STAR Reporting · the full report: How the LH engine reports · the no-preference bucket: Runoff percentages · GLOSSARY.


Reading a cell — For – Equal Support – Against

Each cell reads in the direction of its row. For "Banana > Apple | 3 - 4 - 1": 3 voters prefer Banana (For), 4 rate the two equally (Equal Support), 1 prefers Apple (Against). The reverse cell mirrors it (Apple > Banana | 1 - 4 - 3). The diagonal is ---, and * marks the two finalists. The Equal Support count is the same idea as in the runoff — ballots that scored the pair the same.

Two candidates — the matrix is trivial

With only two candidates the matrix just restates the runoff, so the engine suppresses it automatically for two-candidate races. For reference, it looks like:

               |    * A     |   * B     |
         * A > |    ---     |2 - 2 - 1  |
         * B > | 1 - 2 - 2  |   ---     |

A > B | 2 - 2 - 1: 2 prefer A, 2 Equal Support, 1 prefers B — the same 2 vs 1 that decides the runoff (Voters with a preference: 3 of 5 (2 Equal Support)). Nothing new, hence hidden by default. (→ Runoff percentages.)

Full N×N — every pair, and the Condorcet check

With three or more candidates the full grid earns its place — it shows match-ups the runoff never stages (the losers against each other):

               |  * Apple   | * Banana  |   Cherry  |
     * Apple > |    ---     |1 - 4 - 3  |4 - 3 - 1  |
    * Banana > | 3 - 4 - 1  |   ---     |5 - 3 - 0  |
      Cherry > | 1 - 3 - 4  |0 - 3 - 5  |   ---     |

[Condorcet Winner]
  Condorcet Winner: Banana — matches the STAR winner

Read down Banana's row: it beats Apple (3 vs 1) and Cherry (5 vs 0), so Banana wins every head-to-head — the Condorcet winner. Here it matches the STAR winner, which is the most uncontroversial outcome there is. When the score leader, the runoff winner, and the Condorcet winner are the same candidate, no reasonable method disagrees.

The options

These are engine defaults, not something you write into a case file — case files carry no options: block (dropped repo-wide 2026-08-09). To see more than the default render, read the case's _tabulated.txt mirror or add --full to the run. Details: LH reporting options.

  • show_matrix — print the matrix at all. Default true, auto-suppressed for two-candidate races (it would just echo the runoff) and for multi-winner (a "Top 2 Finalist" matrix is a single-winner idea). When a multi-winner report does render the grid — the _tabulated mirror and --full always carry it, and a file can force it on screen — it prints as plain head-to-head data: retitled Preference Matrix, no * finalist markers, and a legend line saying the grid is informational only, not part of the multi-winner count.
  • matrix_finalists_onlytrue prints only the two finalists' row/column (a compact check that the runoff matches the pairwise result); false prints the full N×N grid. The saved _tabulated.txt always forces the full grid.
  • show_condorcettrue prints the [Condorcet Winner] line and whether it matches the STAR winner; false hides it (the on-screen default, keeping the report lean). The _tabulated.txt copy always includes it, and the --full flag puts it on screen.

When the Condorcet winner and the STAR winner differ, that's the interesting case — see three notions of "winner".