Counting SMV using a Bucklin approach

Sequential Monroe Voting can be counted by keeping track of how many voters give a candidate a particular score. This post will assume a scale of 0 to 5.

A candidate’s quota is filled with the voters that gave them the highest scores, so all you need to do to find their quota score is look at the number of voters who gave them a 5, and if this isn’t a quota of voters, then now count the number of voters who scored the candidate a 5 or a 4, and repeat. Once you’ve found the scores given by the candidate’s quota of voters, you can add up these voters’ points to find the candidate’s quota score.

After the reweighting in the first round, there are at most 5 additional possibilities for how voters can score the candidates (if using fractional reweighting). This is because every voter who scored the first round’s winner a 5 will have all of their ballots reweighted by the same amount, with the same applying to all 5 of the positive integer scores between 0 and 5.

This idea only requires two passes of all of the ballots per round: one to find the “score matrix” for the round, the second to isolate the ballots in the winner’s quota. To reference my negative counting idea for SPAV, it’s possible to, between rounds, only keep track of the changes in scores for ballots that were reweighted. In other words, if you have the score matrix for the first round, and you’re told that 5 voters are no longer giving a particular candidate a 4, with 3 of them now giving the candidate a 2.8 and the other 2 now giving the candidate a 0, then you can use this information to figure out the second round’s matrix for that candidate.
As a bonus, this scheme allows you to find the candidate’s overall scores in each round as well, which not only offers additional information, but is useful for implementing the Pareto-compliant tiebreaker.

The reason this is a Bucklin-style approach is because Bucklin can be counted by looking at the number of voters who ranked a candidate 1st, the number of voters who ranked them 2nd, etc.

I did a modification of SSS like this where you take the winner as the candidate who has the highest sum of score in the Hare quota of Ballots. See Quota of Ballot Selection. When we simulated it there did not seem to be any benefit so it was abandoned.

This post isn’t describing a modification to SMV, but rather, an alternative way to count the votes for SMV.

Unless I misunderstand that alternative way is the way that I tried it for SSS.

The modification to SSS that you’re discussing uses a different reweighting scheme, though, and I think the confusion is because I might have made a mistake in the post; I said

but if I’m understanding it correctly now (based off of this Footnote from the SMV post by Parker:

Footnote for step 2: In this method’s purest form, fractional exhaustion would be used to break ties: when calculating which ballots belong to a candidate’s quota, if for a particular score including voters that gave that candidate that score in the quota would make the quota to large and excluding it would make it to small, exhaust a portion of those vote’s weights such that the total weight of the exhausted ballots still equals the hare quota

so this means that in SMV, every voter in the winner’s quota will have their ballot fully spent, with the possible exception (if using fractional reweighting) of these voters mentioned in the Footnote whose scores are on the “cusp” of being in the candidate’s quota. That actually means you at most have to keep track of 1 additional score per round (the fractional score given by the cusp voters to the remaining candidates).

I’m going to pull up the description for SMV to try to clear up doubts, along with a note under each step showing how this idea is simply implementing that step.

  1. For candidate X, sort the ballots in order of highest score given to candidate X to lowest score given to candidate X.
    1. This is done by having the count of how many voters gave candidate X the max score, how many voters gave candidate X the score one point below max, etc.
  2. Calculate the average score given to X on the first hare quota of those ballots. Record this score as that candidate’s hare quota score. See Footnote.
    2. This is done by looking at the average score given to X on the smallest Hare quota of ballots that give X higher scores than all other ballots.
  3. Repeat this process for every candidate.
  4. Elect the candidate with the highest hare quota score and exhaust the votes that contribute to that candidate’s hare quota score.
    4. This step requires, as usual, doing an additional pass of the ballots to find the ones in the winner’s quota, and then reweighting them. Once you’ve spent these ballots, you have to re-count the number of voters that give the remaining candidates the max score, the score one point below max, etc. with the caveat that there may be fractional scores (as mentioned above) to keep track of due to reweighting.
  5. Repeat this process until all the seats are filled.

I have an implementation of SMV in my ssmpr.py code (turned on using the -s flag). See https://github.com/dodecatheon/approval-sorted-margins, in particular both ssmpr.py and tabulate.py.

I already do something much like what you describe, one pass for scores and another pass for reweighting. It is technically possible to eliminate the second reweighting pass by combining it with the counting stage for the next seat, but for demonstration code I don’t bother.

One difference between my code and SMV is that for reweighting, I reweight ballots above the threshold rating to zero only to the degree necessary so that ballots below some threshold can be scaled in proportion to the score they give to the seat winner. For details, see the repo’s README file.

Your idea about looking only at ballots with changes would be useful for hand counts. It is similar to IRV’s hand count methodology in some respects.

1 Like