>>>>>>>>>>>>>> This breaks the API. <<<<<<<<<<<<<<<<<<<<<<<<<<
authorBenjamin Mako Hill <mako@atdot.cc>
Sat, 18 Aug 2007 00:00:04 +0000 (00:00 +0000)
committerBenjamin Mako Hill <mako@atdot.cc>
Sat, 18 Aug 2007 00:00:04 +0000 (00:00 +0000)
Refactored the commits added by Joe Slag to return the full lists of
candidates.

In Joe's code, the full list of candidates were associated with the vote
objects which didn't make sense since they are really part of results.
I've gone ahead and reimplented this. It does mean that the API has
changed. In the old version, you would get a ranked list of candidates
by using:

  vote_object.results

You now get it by doing:

  result_object.ranked_candidates
  vote_object.result.ranked_candidates

>>>>>>>>>>>>>> This breaks the API. <<<<<<<<<<<<<<<<<<<<<<<<<<

git-svn-id: svn://rubyforge.org/var/svn/rubyvote/trunk@46 1440c7f4-e209-0410-9a04-881b5eb134a8

lib/rubyvote/condorcet.rb
lib/rubyvote/election.rb

index a78524b..85cb897 100644 (file)
@@ -1,6 +1,10 @@
 # election library -- a ruby library for elections
 # copyright © 2005 MIT Media Lab and Benjamin Mako Hill
 
+require 'rubygems'
+require 'ruby-debug'
+Debugger.start
+
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 # the Free Software Foundation; either version 2 of the License, or
@@ -33,8 +37,6 @@
 
 class CondorcetVote < ElectionVote
   
-  attr_accessor :results
-
   def initialize(votes=nil)
     unless defined?(@candidates)
       @candidates = Array.new
@@ -46,7 +48,6 @@ class CondorcetVote < ElectionVote
       end
     end
     super(votes)
-    @results = Array.new
   end
 
   def tally_vote(vote=nil)
@@ -86,53 +87,24 @@ class CondorcetVote < ElectionVote
     end
   end
 
-  def results
-    if @results.size < 2 && (not @candidates.empty?)
-      tabulate
-    end
-    @results
-  end
-
-  def result
-    find_only_winner unless @winner
-    @winner
-  end
-
   protected
 
   def verify_vote(vote=nil)
     vote.instance_of?( Array ) and
       vote == vote.uniq
   end
-
-  def tabulate
-    find_only_winner unless @winner
-    until @candidates.empty? 
-      aResult = resultFactory( self )
-      @results << aResult.winners
-      filter_out(aResult)
-    end
-  end
-
-  def find_only_winner
-    @winner = resultFactory( self )
-    @results << @winner.winners
-    filter_out(@winner)
-  end
-
 end
 
 class PureCondorcetVote < CondorcetVote
-  def resultFactory(init)
-    PureCondorcetResult.new(init)
+  def result
+    PureCondorcetResult.new(self)
   end
 end
 
 class CloneproofSSDVote < CondorcetVote
-  def resultFactory(init)
-    CloneproofSSDResult.new(init)
+  def result
+    CloneproofSSDResult.new(self)
   end
-
 end
 
 
@@ -183,6 +155,14 @@ class CondorcetResult < ElectionResult
     
     return victories, ties    
   end
+
+  def ranked_candidates
+    if not defined?(@ranked_candidates)
+      @ranked_candidates = build_ranked_candidates()
+    end
+
+    @ranked_candidates
+  end
         
   protected
   def defeats(candidates=nil, votes=nil)
@@ -203,6 +183,27 @@ class CondorcetResult < ElectionResult
 
     defeats
   end
+  
+  def build_ranked_candidates
+    # build a lis of ranked candidates by dropping the winner and
+    # cursing
+
+    ranked_candidates = []
+
+    resultobj = self.dup
+    candidates = self.election.candidates
+
+    until candidates.empty? 
+      ranked_candidates << resultobj.winners
+      
+      new_voteobj = resultobj.election.dup
+      candidates = new_voteobj.candidates
+      new_voteobj.candidates.delete_if {|x| resultobj.winners.include?(x)}
+      resultobj = new_voteobj.result
+    end
+
+    ranked_candidates
+  end
 
 end
 
index 5a58243..3655a03 100644 (file)
@@ -66,10 +66,6 @@ class ElectionVote
     self.verify_vote(vote)
   end
 
-  def filter_out(winner)
-    @candidates.delete_if {|x| winner.winners.include?(x)}
-  end
-
 end
 
 class PluralityVote < ElectionVote
@@ -118,6 +114,7 @@ end
 
 class ElectionResult
   attr_reader :winners
+  attr_reader :election
 
   def initialize(voteobj=nil)
     unless voteobj and voteobj.kind_of?( ElectionVote )
@@ -135,7 +132,7 @@ class ElectionResult
   def winner?
     @winners.length > 0 and not @winners[0].nil?
   end
-
+  
 end
 
 class PluralityResult < ElectionResult

Benjamin Mako Hill || Want to submit a patch?