This repository has been archived on 2021-05-25. You can view files and clone it, but cannot push or open issues or pull requests.
pyRCV2/tests/test_constraints_otten.py

135 lines
4.5 KiB
Python

# 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 <https://www.gnu.org/licenses/>.
from pyRCV2 import constraints
class CounterStub:
pass
def test_constraints_otten():
"""Check constraints matrix is stabilised correctly, according to example by Otten J. Voting Matters 2001;13(3):4-7"""
counter = CounterStub()
counter._constraint_matrix = constraints.ConstraintMatrix([2, 3])
cm = counter._constraint_matrix
# Fill in details
c = cm.get([0, 0]); c.max = 7; c.cands = 4
c = cm.get([0, 1]); c.max = 6; c.cands = 11
c = cm.get([0, 2]); c.max = 1; c.cands = 2
c = cm.get([0, -1]); c.min = 7; c.max = 7; c.cands = 17
c = cm.get([1, 0]); c.max = 7; c.cands = 7
c = cm.get([1, 1]); c.max = 6; c.cands = 3
c = cm.get([1, 2]); c.max = 1; c.cands = 1
c = cm.get([1, -1]); c.min = 7; c.max = 7; c.cands = 11
c = cm.get([-1, 0]); c.min = 7; c.max = 7; c.cands = 11
c = cm.get([-1, 1]); c.min = 6; c.max = 6; c.cands = 14
c = cm.get([-1, 2]); c.min = 1; c.max = 1; c.cands = 3
c = cm.get([-1, -1]); c.min = 14; c.max = 14; c.cands = 28
assert cm.get([0, 0]).max != 4
assert cm.get([1, 1]).max != 3
assert cm.get([0, 1]).min != 3
assert cm.get([1, 0]).min != 3
assert constraints.step_matrix(counter) == False
assert constraints.step_matrix(counter) == False
assert constraints.step_matrix(counter) == False
assert constraints.step_matrix(counter) == False
assert constraints.step_matrix(counter) == False
assert constraints.step_matrix(counter) == True
assert cm.get([0, 0]).max == 4
assert cm.get([1, 1]).max == 3
assert cm.get([0, 1]).min == 3
assert cm.get([1, 0]).min == 3
# Election of Welsh Man
cm.get([0, 2]).elected += 1
cm.get([-1, 2]).elected += 1
cm.get([0, -1]).elected += 1
assert cm.get([0, 2]).min != 1
assert cm.get([0, 0]).max != 3
assert cm.get([1, 0]).min != 4
assert cm.get([1, 2]).max != 0
assert constraints.step_matrix(counter) == False
assert constraints.step_matrix(counter) == False
assert constraints.step_matrix(counter) == False
assert constraints.step_matrix(counter) == False
assert constraints.step_matrix(counter) == True
assert cm.get([0, 2]).min == 1
assert cm.get([0, 0]).max == 3
assert cm.get([1, 0]).min == 4
assert cm.get([1, 2]).max == 0
# Welsh Man and Welsh Woman are doomed
assert cm.get([0, 2]).elected == cm.get([0, 2]).max
assert cm.get([1, 2]).elected == cm.get([1, 2]).max
cm.get([0, 2]).cands = 1
cm.get([1, 2]).cands = 0
# Election of 2 English Men
cm.get([0, 0]).elected += 2
cm.get([-1, 0]).elected += 2
cm.get([0, -1]).elected += 2
# Election of 2 English Women
cm.get([1, 0]).elected += 2
cm.get([-1, 0]).elected += 2
cm.get([1, -1]).elected += 2
# Exclusion of Scottish Woman
cm.get([1, 1]).cands -= 1
cm.get([-1, 1]).cands -= 1
cm.get([1, -1]).cands -= 1
assert cm.get([0, 0]).min != 2
assert cm.get([1, 1]).max != 2
assert cm.get([0, 1]).min != 4
assert cm.get([1, 0]).min != 5
assert cm.get([0, 0]).max != 2
assert cm.get([0, 1]).max != 4
assert cm.get([1, 1]).min != 2
assert cm.get([1, 0]).max != 5
assert constraints.step_matrix(counter) == False
assert constraints.step_matrix(counter) == False
assert constraints.step_matrix(counter) == False
assert constraints.step_matrix(counter) == False
assert constraints.step_matrix(counter) == False
assert constraints.step_matrix(counter) == False
assert constraints.step_matrix(counter) == False
assert constraints.step_matrix(counter) == False
assert constraints.step_matrix(counter) == True
assert cm.get([0, 0]).min == 2
assert cm.get([1, 1]).max == 2
assert cm.get([0, 1]).min == 4
assert cm.get([1, 0]).min == 5
assert cm.get([0, 0]).max == 2
assert cm.get([0, 1]).max == 4
assert cm.get([1, 1]).min == 2
assert cm.get([1, 0]).max == 5
# English Men doomed
assert cm.get([0, 0]).elected == cm.get([0, 0]).max
# Scottish Women guarded
assert cm.get([1, 1]).cands == cm.get([1, 1]).min