From f6cc873d056e626c5fc1e33bfc6482fcb819449b Mon Sep 17 00:00:00 2001 From: RunasSudo Date: Sat, 16 Jan 2021 02:59:16 +1100 Subject: [PATCH] Add test case for ERS97 BLT with Meek STV --- tests/data/ers97_meekm.csv | 15 +++++++ tests/data/ers97_meekm.ods | Bin 0 -> 14615 bytes tests/test_ers97.py | 2 +- tests/test_ers97_meekm.py | 85 +++++++++++++++++++++++++++++++++++++ tests/test_meekm.py | 2 +- 5 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 tests/data/ers97_meekm.csv create mode 100644 tests/data/ers97_meekm.ods create mode 100644 tests/test_ers97_meekm.py diff --git a/tests/data/ers97_meekm.csv b/tests/data/ers97_meekm.csv new file mode 100644 index 0000000..8dab496 --- /dev/null +++ b/tests/data/ers97_meekm.csv @@ -0,0 +1,15 @@ +Stage:,1,,2,,4,,6,,9,,11, +Comment:,First preferences,,Surpluses distributed,,Surpluses distributed,,Surpluses distributed,,Surpluses distributed,,Surpluses distributed, +Smith,134,EL,107.26,EL,106.96,EL,104.42,EL,101.58,EL,73,EL +Carpenter,81,,87.98,,88.47,,97.71,,101.58,EL,73,EL +Wright,27,,31.99,,32.34,,34.97,,0,EX,0,EX +Glazier,24,,30.19,,30.62,,0,EX,0,EX,0,EX +Duke,105,,106.6,,106.96,EL,104.42,EL,101.58,EL,73,EL +Prince,91,,91,,91,,92.45,,97.07,,73,EL +Baron,64,,64,,64,,64.03,,67.24,,0,EX +Abbot,59,,59.8,,64.85,,66,,68.92,,70.83, +Vicar,55,,55,,69.21,,70.99,,73.27,,75.16,EL +Monk,23,,23.4,,0,EX,0,EX,0,EX,0,EX +Freeman,90,,93.59,,94.27,,95.97,,99.81,,73,EL +Exhausted,0,,2.2,,4.31,,22.05,,41.95,,242.01, +Quota,107.57,,107.26,,106.96,,104.42,,101.58,,73.01, diff --git a/tests/data/ers97_meekm.ods b/tests/data/ers97_meekm.ods new file mode 100644 index 0000000000000000000000000000000000000000..74e2366607f591378157934ca4a8d5b43f2f817a GIT binary patch literal 14615 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 N!{~L=Nd^4Q{a^OBE%^Wd literal 0 HcmV?d00001 diff --git a/tests/test_ers97.py b/tests/test_ers97.py index df12fef..c346018 100644 --- a/tests/test_ers97.py +++ b/tests/test_ers97.py @@ -19,7 +19,7 @@ from pytest_steps import test_steps import pyRCV2.blt import pyRCV2.numbers from pyRCV2.method.gregory import EGSTVCounter -from pyRCV2.model import CandidateState, CountCompleted +from pyRCV2.model import CandidateState import tests.util import csv diff --git a/tests/test_ers97_meekm.py b/tests/test_ers97_meekm.py new file mode 100644 index 0000000..53444ea --- /dev/null +++ b/tests/test_ers97_meekm.py @@ -0,0 +1,85 @@ +# pyRCV2: Preferential vote counting +# Copyright © 2020–2021 Lee Yingtong Li (RunasSudo) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +from pytest_steps import test_steps + +import pyRCV2.blt +import pyRCV2.numbers +from pyRCV2.method.meek import MeekSTVCounter +from pyRCV2.model import CandidateState +import tests.util + +import csv + +def isclose(a, b): + # Allow discrepancy of ~0.01 + diff = a - b + if diff < pyRCV2.numbers.Num('0.014') and diff > pyRCV2.numbers.Num('-0.014'): + return True + return False + +# Read model CSV + +with open('tests/data/ers97_meekm.csv', 'r', newline='') as f: + reader = csv.reader(f) + data = [x for x in reader] + +candidates = [data[i][0] for i in range(2, len(data) - 2)] + +@test_steps(*['Stage {}'.format(data[0][i]) for i in range(1, len(data[0]), 2)]) +def test_ers97_meekm_py(): + """Compare count of ers97.blt with model result produced by Hill et al. reference implementation""" + + pyRCV2.numbers.set_numclass(pyRCV2.numbers.FixedGuarded) + pyRCV2.numbers.set_dps(4) + + with open('tests/data/ers97.blt', 'r') as f: + election = pyRCV2.blt.readBLT(f.read()) + + assert len(election.candidates) == len(candidates) + + counter = MeekSTVCounter(election, { + 'quota': 'droop_exact', + 'quota_criterion': 'gt', + 'quota_mode': 'progressive', + 'ties': [] + }) + result = counter.reset() + + for i in range(1, len(data[0]), 2): + stage = int(data[0][i]) + + while len(counter.step_results) < stage: + result = counter.step() + + comment = data[1][i] + assert result.comment == comment, 'Failed to verify comment' + + for j, cand in enumerate(candidates): + votes = pyRCV2.numbers.Num(data[j + 2][i]) + cc = next(cc for c, cc in result.candidates.items() if c.name == cand) + assert isclose(cc.votes, votes), 'Failed to verify candidate "{}" votes, got {} expected {}'.format(cand, cc.votes.pp(2), votes.pp(2)) + + state = data[j + 2][i + 1] if len(data[j + 2]) > (i + 1) else '' + accept = {'': CandidateState.HOPEFUL, 'EL': CandidateState.ELECTED, 'EX': CandidateState.EXCLUDED} + assert cc.state == accept[state], 'Failed to verify candidate "{}" state'.format(cand) + + # NB: Ignore exhausted votes + + quota = pyRCV2.numbers.Num(data[len(candidates) + 3][i]) + assert isclose(result.quota, quota), 'Failed to verify quota, got {} expected {}'.format(result.quota.pp(2), quota.pp(2)) + + yield 'Stage {}'.format(stage) diff --git a/tests/test_meekm.py b/tests/test_meekm.py index e2dd3f6..ec4fd57 100644 --- a/tests/test_meekm.py +++ b/tests/test_meekm.py @@ -23,7 +23,7 @@ from pyRCV2.method.meek import MeekSTVCounter from pyRCV2.model import CandidateState, CountCompleted from pyRCV2.ties import TiesBackwards -def test_meekm(): +def test_meekm_py(): """Compare count of meekm.blt with model result produced by Hill et al. reference implementation""" pyRCV2.numbers.set_numclass(pyRCV2.numbers.FixedGuarded)