From 99797be0c88c35b08d72f91cd76f812eab922b5e Mon Sep 17 00:00:00 2001 From: Joe Slag Date: Mon, 9 Apr 2007 22:14:59 +0000 Subject: [PATCH] big speed up git-svn-id: svn://rubyforge.org/var/svn/rubyvote/trunk@24 1440c7f4-e209-0410-9a04-881b5eb134a8 --- lib/rubyvote/condorcet.rb | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/rubyvote/condorcet.rb b/lib/rubyvote/condorcet.rb index 4dd1745..e674115 100644 --- a/lib/rubyvote/condorcet.rb +++ b/lib/rubyvote/condorcet.rb @@ -149,6 +149,7 @@ class CondorcetResult < ElectionResult end protected + def defeats(candidates=nil, votes=nil) candidates = @election.candidates unless candidates votes = @election.votes unless votes @@ -205,6 +206,7 @@ class CloneproofSSDResult < CondorcetResult end protected + def cpssd votes = @election.votes candidates = *@election.candidates @@ -225,6 +227,8 @@ class CloneproofSSDResult < CondorcetResult # see the array with the standard defeats transitive_defeats = self.defeats(candidates, votes) + defeats_hash = Hash.new + transitive_defeats.each { |td| defeats_hash[td] = 1 } candidates = [candidates] unless candidates.class == Array candidates.each do |cand1| @@ -233,10 +237,11 @@ class CloneproofSSDResult < CondorcetResult candidates.each do |cand3| if not cand2 == cand3 and not cand1 == cand3 and - transitive_defeats.include?( [ cand2, cand1 ] ) and - transitive_defeats.include?( [ cand1, cand3 ] ) and - not transitive_defeats.include?( [ cand2, cand3 ] ) - transitive_defeats << [ cand2, cand3 ] + defeats_hash[[cand2, cand1]] and + defeats_hash[[cand1, cand3]] and + not defeats_hash[[cand2, cand3]] + transitive_defeats << [cand2, cand3] + defeats_hash[[cand2, cand3]] = 1 end end end -- 2.39.5