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
# 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
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
end
def tally_vote(vote=nil)
end
def tally_vote(vote=nil)
- 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)
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)
+
+ 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
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
class ElectionResult
attr_reader :winners
class ElectionResult
attr_reader :winners
def initialize(voteobj=nil)
unless voteobj and voteobj.kind_of?( ElectionVote )
def initialize(voteobj=nil)
unless voteobj and voteobj.kind_of?( ElectionVote )
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