From c78a30d5b22787cf3859811ca49bca6f1ff6fcdb Mon Sep 17 00:00:00 2001 From: RunasSudo Date: Sun, 10 Jan 2021 02:05:02 +1100 Subject: [PATCH] Report transfer values in detailed comments --- pyRCV2/method/base_stv.py | 1 - pyRCV2/method/gregory.py | 60 +++++++++++++++++++++++++++++++++++---- 2 files changed, 54 insertions(+), 7 deletions(-) diff --git a/pyRCV2/method/base_stv.py b/pyRCV2/method/base_stv.py index b3456c1..be23488 100644 --- a/pyRCV2/method/base_stv.py +++ b/pyRCV2/method/base_stv.py @@ -272,7 +272,6 @@ class BaseSTVCounter: __pragma__('noopov') # Transfer surplus - self.logs.append('Surplus of ' + candidate_surplus.name + ' distributed.') self.do_surplus(candidate_surplus, count_card, surplus) # Declare elected any candidates meeting the quota as a result of surpluses diff --git a/pyRCV2/method/gregory.py b/pyRCV2/method/gregory.py index fb2ade5..91835ea 100644 --- a/pyRCV2/method/gregory.py +++ b/pyRCV2/method/gregory.py @@ -65,6 +65,24 @@ class WIGSTVCounter(BaseSTVCounter): transferable_votes = total_votes - exhausted_votes __pragma__('noopov') + __pragma__('opov') + if self.options['papers'] == 'transferable': + if transferable_votes > surplus: + if self.options['round_tvs'] is None: + self.logs.append('Surplus of ' + candidate_surplus.name + ' distributed at value ' + (surplus / transferable_votes).pp(2) + '.') + else: + tv = self.round_tv(surplus / transferable_votes) + self.logs.append('Surplus of ' + candidate_surplus.name + ' distributed at value ' + tv.pp(2) + '.') + else: + self.logs.append('Surplus of ' + candidate_surplus.name + ' distributed at value received.') + else: + if self.options['round_tvs'] is None: + self.logs.append('Surplus of ' + candidate_surplus.name + ' distributed at value ' + (surplus / total_votes).pp(2) + '.') + else: + tv = self.round_tv(surplus / total_votes) + self.logs.append('Surplus of ' + candidate_surplus.name + ' distributed at value ' + tv.pp(2) + '.') + __pragma__('noopov') + for candidate, x in next_preferences.items(): cand_ballots = x[0] num_ballots = x[1] @@ -82,7 +100,6 @@ class WIGSTVCounter(BaseSTVCounter): if self.options['round_tvs'] is None: self.candidates[candidate].transfers += self.round_votes((num_votes * surplus) / transferable_votes) else: - tv = self.round_tv(surplus / transferable_votes) self.candidates[candidate].transfers += self.round_votes(num_votes * tv) else: self.candidates[candidate].transfers += self.round_votes(num_votes) # Do not allow weight to increase @@ -90,7 +107,6 @@ class WIGSTVCounter(BaseSTVCounter): if self.options['round_tvs'] is None: self.candidates[candidate].transfers += self.round_votes((num_votes * surplus) / total_votes) else: - tv = self.round_tv(surplus / total_votes) self.candidates[candidate].transfers += self.round_votes(num_votes * tv) __pragma__('noopov') @@ -238,6 +254,24 @@ class UIGSTVCounter(WIGSTVCounter): transferable_votes = total_votes - exhausted_votes __pragma__('noopov') + __pragma__('opov') + if self.options['papers'] == 'transferable': + if transferable_votes > surplus: + if self.options['round_tvs'] is None: + self.logs.append('Surplus of ' + candidate_surplus.name + ' distributed at value ' + (surplus / transferable_ballots).pp(2) + '.') + else: + tv = self.round_tv(surplus / transferable_ballots) + self.logs.append('Surplus of ' + candidate_surplus.name + ' distributed at value ' + tv.pp(2) + '.') + else: + self.logs.append('Surplus of ' + candidate_surplus.name + ' distributed at value received.') + else: + if self.options['round_tvs'] is None: + self.logs.append('Surplus of ' + candidate_surplus.name + ' distributed at value ' + (surplus / total_ballots).pp(2) + '.') + else: + tv = self.round_tv(surplus / total_ballots) + self.logs.append('Surplus of ' + candidate_surplus.name + ' distributed at value ' + tv.pp(2) + '.') + __pragma__('noopov') + for candidate, x in next_preferences.items(): cand_ballots = x[0] num_ballots = x[1] @@ -255,7 +289,6 @@ class UIGSTVCounter(WIGSTVCounter): if self.options['round_tvs'] is None: self.candidates[candidate].transfers += self.round_votes((num_ballots * surplus) / transferable_ballots) else: - tv = self.round_tv(surplus / transferable_ballots) self.candidates[candidate].transfers += self.round_votes(num_ballots * tv) else: self.candidates[candidate].transfers += self.round_votes(num_votes) @@ -263,7 +296,6 @@ class UIGSTVCounter(WIGSTVCounter): if self.options['round_tvs'] is None: self.candidates[candidate].transfers += self.round_votes((num_ballots * surplus) / total_ballots) else: - tv = self.round_tv(surplus / total_ballots) self.candidates[candidate].transfers += self.round_votes(num_ballots * tv) __pragma__('noopov') @@ -325,6 +357,24 @@ class EGSTVCounter(UIGSTVCounter): transferable_votes = total_votes - exhausted_votes __pragma__('noopov') + __pragma__('opov') + if self.options['papers'] == 'transferable': + if transferable_votes > surplus: + if self.options['round_tvs'] is None: + self.logs.append('Surplus of ' + candidate_surplus.name + ' distributed at value ' + (surplus / transferable_ballots).pp(2) + '.') + else: + tv = self.round_tv(surplus / transferable_ballots) + self.logs.append('Surplus of ' + candidate_surplus.name + ' distributed at value ' + tv.pp(2) + '.') + else: + self.logs.append('Surplus of ' + candidate_surplus.name + ' distributed at value received.') + else: + if self.options['round_tvs'] is None: + self.logs.append('Surplus of ' + candidate_surplus.name + ' distributed at value ' + (surplus / total_ballots).pp(2) + '.') + else: + tv = self.round_tv(surplus / total_ballots) + self.logs.append('Surplus of ' + candidate_surplus.name + ' distributed at value ' + tv.pp(2) + '.') + __pragma__('noopov') + for candidate, x in next_preferences.items(): cand_ballots = x[0] num_ballots = x[1] @@ -342,7 +392,6 @@ class EGSTVCounter(UIGSTVCounter): if self.options['round_tvs'] is None: self.candidates[candidate].transfers += self.round_votes((num_ballots * surplus) / transferable_ballots) else: - tv = self.round_tv(surplus / transferable_ballots) self.candidates[candidate].transfers += self.round_votes(num_ballots * tv) else: self.candidates[candidate].transfers += self.round_votes(num_votes) @@ -350,7 +399,6 @@ class EGSTVCounter(UIGSTVCounter): if self.options['round_tvs'] is None: self.candidates[candidate].transfers += self.round_votes((num_ballots * surplus) / total_ballots) else: - tv = self.round_tv(surplus / total_ballots) self.candidates[candidate].transfers += self.round_votes(num_ballots * tv) __pragma__('noopov')