From aedf5193ed2a020c02fac7932198eb556bfb4b0a Mon Sep 17 00:00:00 2001 From: Benjamin Mako Hill Date: Sat, 18 Aug 2007 00:00:04 +0000 Subject: [PATCH 1/1] >>>>>>>>>>>>>> This breaks the API. <<<<<<<<<<<<<<<<<<<<<<<<<< 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 | 73 ++++++++++++++++++++------------------- lib/rubyvote/election.rb | 7 ++-- 2 files changed, 39 insertions(+), 41 deletions(-) diff --git a/lib/rubyvote/condorcet.rb b/lib/rubyvote/condorcet.rb index a78524b..85cb897 100644 --- a/lib/rubyvote/condorcet.rb +++ b/lib/rubyvote/condorcet.rb @@ -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 diff --git a/lib/rubyvote/election.rb b/lib/rubyvote/election.rb index 5a58243..3655a03 100644 --- a/lib/rubyvote/election.rb +++ b/lib/rubyvote/election.rb @@ -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 -- 2.39.5