Exercise 14 — The transfer machine: a book club buys two novels (STV)¶
Generated from ex14_two_novels.yaml — do not edit by hand. Regenerate: python STARVote_LH_tabulation_engine/tools_adam/scripts/build_yaml_pages.py.
Method: STV (proportional, ranked ballots) · 2 seats · Expected winners: Austen, Camus
▶ Live on BetterVoting: vote · results ↗ (election tk776t · test BV2201).
Scenario¶
A nine-member book club buys TWO novels by ranked ballot, counted with STV (the proportional cousin of RCV-IRV). Round 1: Austen has 5 first choices — over quota — and is elected; her surplus transfers, as fractions of the five ballots that elected her, to their next choice, Bronte. From there STV fills the second seat the way it always does — moving surpluses, and eliminating from the bottom if nobody is over the line — and Camus takes it. Seats: Austen + Camus. The drill follows one ballot through the whole journey — how much of it elected Austen, and where the remainder came to rest — to see how STV keeps a vote moving until it lands. How large that surplus is, and whether any elimination is needed, depends on which of the two published Droop quotas the count applies; the report below names the one it uses, and part (f) of the exercise works these same ballots both ways. Exercise: ex14_transfer_machine.md. Ballots and cast (novelists as candidates) are this repo's own. Live on BetterVoting (Test ID BV2201): https://bettervoting.com/tk776t — the vote page works, but BV's STV tabulator currently returns a server error on /results for this election, and for its fully-ranked probe twin BV2202 (bj8dfc, ex14_two_novels_fullranks.yaml) — a live BV bug, since DIAGNOSED: the count ends with Camus reaching quota as the sole remaining hopeful, and BV's IRV.ts redistributes his surplus over an empty candidate list ([].reduce with no initial value throws). Full bisection (BV2203-2205) and ready-to-file issue: 06_Other/STV/bv_stv_sole_survivor_crash/. The seats above are the LH engine's; BV STV races whose endgame leaves a hopeful standing (ywckmg, kcf8vf, 39py93) compute fine.
Ballots¶
Each row is one voter's ranking, most-preferred first (N: prefix = N identical ballots).
5:Austen>Bronte>Camus>Dickens
1:Bronte>Camus
3:Camus>Dickens
What the engine says¶
The count, step by step — the rounds and how the winner is reached:
--- STV / Single Transferable Vote (multi-winner — 2 seats) ---
Exercise 14 — The transfer machine: a book club buys two novels (STV)
Tabulating 9 ballots (ranked ballots).
2 seats; quota = 3.00 (exact Droop, votes/(seats+1)) — 33.3% of 9.
Elected at >= quota, and every surplus is measured from it.
(Hand-count Droop, floor(9/3)+1 = 4, is a different but equally standard rule.)
ROUND 1
Candidate Votes Status
----------- ------- --------
Austen 5 Elected
Camus 3 Hopeful
Bronte 1 Hopeful
Dickens 0 Hopeful
FINAL RESULT
Candidate Votes Status
----------- ------- --------
Austen 3.00 Elected
Camus 3.00 Elected
Bronte 3.00 Rejected
Dickens 0.00 Rejected
Winner(s) — STV / Single Transferable Vote (multi-winner — 2 seats)
Austen
Camus
Full audit — preference matrix, Condorcet, and score distribution¶
--- Smith Set (the generalized Condorcet winner) ---
The smallest group whose every member beats every candidate outside it —
the honest answer to "who is even in contention?".
Smith set (1 of 4): Austen
Outside (3): Bronte, Camus, Dickens
One member ⇒ Austen is the Condorcet winner, beating every rival head-to-head.
More: 07_Concepts/topics/smith_set.md
Everything in one file: the _tabulated mirror (regenerated on every run; every analysis forced on).
Run it yourself:
python STARVote_LH_tabulation_engine/starvote_larry_hastings.py 01_STAR/05_Practice/cases/ex14_two_novels.yaml
See also¶
More cases in this set: ex01_district_combined · ex01_district_east · ex01_district_west · ex02_bella_exits · ex02_nine_ballots · ex02_tenth_ballot · ex03_five_verdicts · ex04_olympics_1994 · ex05_center_squeeze · ex06_bullet_backfire · ex06_bullet_honest · ex07_vanishing_votes · ex08_minimal_reversal_2c · ex08_minimal_reversal_3c · ex09_game_night_cycle · ex10_generous · ex10_reticent · ex11_spoiler_added · ex11_two_way_base · ex12_bloc_sweep · ex12_proportional_share · ex13_approve3 · ex13_approve4 · ex13_bullet · ex13_opinions · ex14_two_novels_fullranks · ex15_approval_pairwise · ex15_approval_yes_no · ex15_score_profile