class CondorcetVote < ElectionVote
- attr_accessor :results
-
def initialize(votes=nil)
unless defined?(@candidates)
@candidates = Array.new
end
end
super(votes)
- @results = Array.new
end
def tally_vote(vote=nil)
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
def victories_and_ties
victors = Array.new
ties = Array.new
+ victories = Hash.new
candidates = @matrix.keys.sort
candidates.each do |candidate|
ties << [candidate, challenger]
end
end
- end
+ end
- victories = victors.sort {|a,b| b[2] <=> a[2]}
+ victors.each do |list|
+ if victories.has_key?(list[0])
+ victories[list[0]][list[1]] = list[2]
+ else
+ victories[list[0]] = Hash.new
+ victories[list[0]][list[1]] = list[2]
+ end
+ 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)
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