From 4205d9b26214a9d2bdc56df26289857cb5379f71 Mon Sep 17 00:00:00 2001 From: RunasSudo Date: Tue, 19 Jan 2021 02:36:36 +1100 Subject: [PATCH] Minor optimisations --- pyRCV2/method/base_stv.py | 4 +++- pyRCV2/method/gregory.py | 21 ++++++++++++--------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/pyRCV2/method/base_stv.py b/pyRCV2/method/base_stv.py index 6e0a2f4..1fa3a4f 100644 --- a/pyRCV2/method/base_stv.py +++ b/pyRCV2/method/base_stv.py @@ -624,7 +624,9 @@ class BaseSTVCounter: count_card = self.candidates[candidate] if count_card.state == CandidateState.HOPEFUL: - next_preferences[candidate][0].append(BallotInCount(bc.ballot, bc.ballot_value, i)) + #next_preferences[candidate][0].append(BallotInCount(bc.ballot, bc.ballot_value, i)) + bc.last_preference = i + next_preferences[candidate][0].append(bc) next_preferences[candidate][1] += bc.ballot.value next_preferences[candidate][2] += bc.ballot_value break diff --git a/pyRCV2/method/gregory.py b/pyRCV2/method/gregory.py index 35b1c71..684fb04 100644 --- a/pyRCV2/method/gregory.py +++ b/pyRCV2/method/gregory.py @@ -183,21 +183,24 @@ class BaseGregorySTVCounter(BaseSTVCounter): c, cc = candidates_excluded[0] self._exclusion = (candidates_excluded, [[(c, p)] for p in cc.parcels]) elif self.options['exclusion'] == 'by_value': - ballots = [(c, bc) for c, cc in candidates_excluded for p in cc.parcels for bc in p] - - # Sort ballots by value - __pragma__('opov') - ballots.sort(key=lambda x: x[1].ballot_value / x[1].ballot.value, reverse=True) + # Precompute ballot transfer values if self.options['round_tvs']: - ballots_by_value = groupby(ballots, lambda x: self.round_tv(x[1].ballot_value / x[1].ballot.value)) + __pragma__('opov') + ballots = [(c, bc, self.round_tv(bc.ballot_value / bc.ballot.value)) for c, cc in candidates_excluded for p in cc.parcels for bc in p] + __pragma__('noopov') else: # Round to 8 decimal places to consider equality # FIXME: Work out a better way of doing this - ballots_by_value = groupby(ballots, lambda x: (x[1].ballot_value / x[1].ballot.value).round(8, x[1].ballot_value.ROUND_DOWN)) - __pragma__('noopov') + __pragma__('opov') + ballots = [(c, bc, (bc.ballot_value / bc.ballot.value).round(8, bc.ballot_value.ROUND_DOWN)) for c, cc in candidates_excluded for p in cc.parcels for bc in p] + __pragma__('noopov') + + # Sort ballots by value + ballots.sort(key=lambda x: x[2], reverse=True) + ballots_by_value = groupby(ballots, lambda x: x[2]) # TODO: Can we combine ballots for each candidate within each stage? - self._exclusion = (candidates_excluded, [[(c, [bc]) for c, bc in x] for x in ballots_by_value]) + self._exclusion = (candidates_excluded, [[(c, [bc]) for c, bc, tv in x] for x in ballots_by_value]) else: raise STVException('Invalid exclusion mode') # pragma: no cover