Anti-Harassment Tools/SecurePoll Improvements/Test Results/100 uniform elections

Comments edit

I used a script to generate 100 random elections. Voters were simulated casting votes for candidates based on the assumption that each candidate was equally popular.

Each election was run in SecurePoll and OpenSTV, and their respective elected candidates compared.

In 12 of 100 elections, the candidates SecurePoll elected differed from OpenSTV (here is an example of one of these). This is possibly for the same reason as 7_5_1000, but it is hard to tell for sure.

Election setup edit

  • Candidates: 20
  • Seats: 4
  • Votes: 5000

Comparisons edit

A script compared the candidates SecurePoll and OpenSTV elected. I list below only the test data files where SecurePoll and OpenSTV differed:

  • 20_4_5000_2155278963.blt
  • 20_4_5000_2449345045.blt
  • 20_4_5000_2639270897.blt
  • 20_4_5000_3311518991.blt
  • 20_4_5000_5413623462.blt
  • 20_4_5000_5572588763.blt
  • 20_4_5000_5594736126.blt
  • 20_4_5000_6163321089.blt
  • 20_4_5000_6258154944.blt
  • 20_4_5000_8477213657.blt
  • 20_4_5000_8689352809.blt
  • 20_4_5000_8910242957.blt

R code used to generate test data edit

writeBallot <- function(filename, ballots, candidates, numSeats, totalVotes) {
    sink(filename)

    cat(sprintf("%s %s", length(candidates), numSeats))
    cat("\n")
    for (i in 1:totalVotes) {
        cat("1")
        for (cand in ballots[[i]]) {
            if (!is.na(cand)) {
                cat(" ")
                cat(cand)
            }
        }
        cat(" 0")
        cat("\n")
    }
    cat("0")
    cat("\n")
    for (candidate in candidates) {
        cat("\"")
        cat(candidate)
        cat("\"")
        cat("\n")
    }
    cat("\"")
    cat("ElectionTitle")
    cat("\"")
    cat("\n")

    sink()
}

candidates <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
numSeats <- 4
totalVotes <- 5000
distribution <- dunif(1:20, 1, 20)

for (j in 1:100) {

    ballots <- list()
    for (i in 1:totalVotes) {
        ballots[[i]] <- sample(1:length(candidates), sample(1:length(candidates), 1), replace=FALSE, distribution)
    }

    randomInt <- sample(1:9999999999, 1)
    filename <- sprintf("%s_%s_%s_%s.blt", length(candidates), numSeats, totalVotes, randomInt)

    writeBallot(filename, ballots, candidates, numSeats, totalVotes)

}

Files edit

All test data and output here: https://github.com/dominic998/SecurePoll-Test-Data/tree/main/test_data/100_uniform_elections

  • Test blt files: files ending in .blt
  • SecurePoll results: files ending _results.txt
  • OpenSTV results: files ending in .php

Environment edit

  • Where you tested: local docker using PHPUnit
  • Version of SecurePoll: 3.0.0 (624ef32) 00:10, 28 September 2021.