siv-org / siv

Secure Internet Voting protocol
https://siv.org
Other
13 stars 9 forks source link

Add support for Multi-Winner IRV Tallying #250

Closed dsernst closed 1 month ago

dsernst commented 1 month ago

Goal is to extend the existing Ranked Choice ballot design for voters, but to adapt the tallying algorithm to support declaring multiple winners, not just a single one.

Specific use-case:

There are 5 open nomination spots on the voting org's Executive Committee. 6 people have signed up as candidates.

The org's bylaws require all elections to use Ranked Choice Voting. Goal is to have voters fill out a single RCV ballot for the 6 candidates, but then be able to declare multiple winners.

Current Level of SIV Support

SIV does support ranked choice voting, with a nice front-end UI for voters.

But currently, the only RCV tallying SIV supports is single-winner IRV (Hare algorithm — eliminate lowest until someone crosses 50%.).

This PR would extend that to multiple winners.

Proportionality:

One unclear question is how important it is for the algorithm to respect Proportionality?

Without Proportionality, you get 5 clones of someone 51% of people like, rather than 3 of them and 2 for the 49%.

Must Do's before merging

vercel[bot] commented 1 month ago

@joshuaherr is attempting to deploy a commit to the SIV Team on Vercel.

A member of the Team first needs to authorize it.

CLAassistant commented 1 month ago

CLA assistant check
All committers have signed the CLA.

vercel[bot] commented 1 month ago

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Updated (UTC)
siv ✅ Ready (Inspect) Visit Preview Sep 27, 2024 4:28am
dsernst commented 1 month ago

Confirmed the unit tests (both old and new) all pass:

image
dsernst commented 1 month ago

How the election status page currently displays this (number_of_winners set to 5):

image
dsernst commented 1 month ago
dsernst commented 1 month ago

Going to merge & deploy this for now, as all the Must Do tasks are complete.

But also noting down these additional nice-to-haves:

UI Improvements:

Somewhat related to the above point, I found it a tad hard in the front-end UI to follow what's happening exactly. See this example (screenshot above), for example: https://siv-git-multiwinner-rcv-sivteam.vercel.app/election/1727427598586.

Some improvements I thought that might make it a lot easier to follow:

Handling ties among the winners:

Another slight issue to be mindful of— the same way single-winner IRV is a little ambiguous for who to eliminate in the case of bottom place ties, this new one is also a bit ambiguous in who to promote in the case of top-place ties.

E.g. if there are only two winner spots available, but three candidates all tie for the same top score.

(My guess is that as implemented, it will currently tie-break via alphabetical ordering, but haven't tested to be sure.)

Lastly, the two remaining unchecked nice-to-haves mentioned in previous comments:

  1. documenting this feature in the advanced ballot editor UI
  2. linking to further documentation about the specific algorithm.