>>>>>>>>>>>>>> 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 a78524b7003dd7eaa5d589c9af671a7551fde611..85cb897df9dc975e8c00238bfc81388d97aba417 100644 (file)
@@ -1,6 +1,10 @@
 # election library -- a ruby library for elections
 # copyright © 2005 MIT Media Lab and Benjamin Mako Hill
 
 # 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
 # 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
   
 
 class CondorcetVote < ElectionVote
   
-  attr_accessor :results
-
   def initialize(votes=nil)
     unless defined?(@candidates)
       @candidates = Array.new
   def initialize(votes=nil)
     unless defined?(@candidates)
       @candidates = Array.new
@@ -46,7 +48,6 @@ class CondorcetVote < ElectionVote
       end
     end
     super(votes)
       end
     end
     super(votes)
-    @results = Array.new
   end
 
   def tally_vote(vote=nil)
   end
 
   def tally_vote(vote=nil)
@@ -86,53 +87,24 @@ class CondorcetVote < ElectionVote
     end
   end
 
     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
   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
 end
 
 class PureCondorcetVote < CondorcetVote
-  def resultFactory(init)
-    PureCondorcetResult.new(init)
+  def result
+    PureCondorcetResult.new(self)
   end
 end
 
 class CloneproofSSDVote < CondorcetVote
   end
 end
 
 class CloneproofSSDVote < CondorcetVote
-  def resultFactory(init)
-    CloneproofSSDResult.new(init)
+  def result
+    CloneproofSSDResult.new(self)
   end
   end
-
 end
 
 
 end
 
 
@@ -183,6 +155,14 @@ class CondorcetResult < ElectionResult
     
     return victories, ties    
   end
     
     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)
         
   protected
   def defeats(candidates=nil, votes=nil)
@@ -203,6 +183,27 @@ class CondorcetResult < ElectionResult
 
     defeats
   end
 
     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
 
 
 end
 
index 5a5824341a57c1f4c9f6aef7ec14ed41f40dc693..3655a034e7575d7be3541ab49e1be12a80fb0c17 100644 (file)
@@ -66,10 +66,6 @@ class ElectionVote
     self.verify_vote(vote)
   end
 
     self.verify_vote(vote)
   end
 
-  def filter_out(winner)
-    @candidates.delete_if {|x| winner.winners.include?(x)}
-  end
-
 end
 
 class PluralityVote < ElectionVote
 end
 
 class PluralityVote < ElectionVote
@@ -118,6 +114,7 @@ end
 
 class ElectionResult
   attr_reader :winners
 
 class ElectionResult
   attr_reader :winners
+  attr_reader :election
 
   def initialize(voteobj=nil)
     unless voteobj and voteobj.kind_of?( ElectionVote )
 
   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
   def winner?
     @winners.length > 0 and not @winners[0].nil?
   end
-
+  
 end
 
 class PluralityResult < ElectionResult
 end
 
 class PluralityResult < ElectionResult

Benjamin Mako Hill || Want to submit a patch?