simplify access to full results - now available as voteobject.results,
authorJoe Slag <joe@slagwerks.com>
Mon, 9 Apr 2007 18:33:54 +0000 (18:33 +0000)
committerJoe Slag <joe@slagwerks.com>
Mon, 9 Apr 2007 18:33:54 +0000 (18:33 +0000)
instead of voteobject.result.get_full_results.

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

lib/rubyvote/condorcet.rb
lib/rubyvote/election.rb
test/condorcet_test.rb

index 3269261bb681bb58d230c06af68d77ca7b3439f8..b0471ecce2d7a5d7ab8010dcfac8fd42f6e7bf88 100644 (file)
@@ -33,6 +33,8 @@
 
 class CondorcetVote < ElectionVote
 
+  attr_accessor :results
+
   def initialize(votes=nil)
     unless defined?(@candidates)
       @candidates = Array.new
@@ -44,6 +46,7 @@ class CondorcetVote < ElectionVote
       end
     end
     super(votes)
+    @results = Array.new
   end
 
   def tally_vote(vote=nil)
@@ -80,21 +83,45 @@ class CondorcetVote < ElectionVote
     end
   end
 
+  def results
+    if @results.size < 2 && (not @candidates.empty?)
+      tabulate
+    end
+    @results
+  end
+
   def result
-    resultFactory( self )
+    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
 
@@ -103,16 +130,6 @@ class CloneproofSSDVote < CondorcetVote
     CloneproofSSDResult.new(init)
   end
 
-  def result
-    top_result = resultFactory( self )
-    until @candidates.empty?
-      aResult = resultFactory( self )
-      top_result.full_results << aResult
-      filter_out(aResult)
-    end
-    top_result
-  end
-
 end
 
 
index 4d51d78b86027014236b0fc581cf070e33bf4486..3d816a89212e572a2c2165a2180908ab20fc7198 100644 (file)
@@ -114,7 +114,6 @@ end
 
 class ElectionResult
   attr_reader :winners
-  attr_accessor :full_results
 
   def initialize(voteobj=nil)
     unless voteobj and voteobj.kind_of?( ElectionVote )
@@ -123,7 +122,6 @@ class ElectionResult
 
     @election = voteobj
     @winners = Array.new
-    @full_results = Array.new
   end
 
   def winner
@@ -134,10 +132,6 @@ class ElectionResult
     @winners.length > 0
   end
 
-  def get_full_results
-    @full_results.collect {|x| x.winners}
-  end
-
 end
 
 class PluralityResult < ElectionResult
index f0dd1cc016d1ec97faec7f81d856b82dc83721d5..67d544e4f51d41e7136623a72c86d47c88d45fb4 100644 (file)
@@ -28,7 +28,7 @@ class TestCondorcetVote < Test::Unit::TestCase
 
     assert_equal "E", CloneproofSSDVote.new(vote_array).result.winners[0]
     assert_equal [['E'], ['A'], ['C'], ['B'], ['D']], 
-                 CloneproofSSDVote.new(vote_array).result.get_full_results
+                 CloneproofSSDVote.new(vote_array).results
   end
 
   def test_ssd2
@@ -45,7 +45,7 @@ class TestCondorcetVote < Test::Unit::TestCase
 
     assert_equal "D", CloneproofSSDVote.new(vote_array).result.winners[0] 
     assert_equal [['D'], ['A'], ['C'], ['B']], 
-                 CloneproofSSDVote.new(vote_array).result.get_full_results
+                 CloneproofSSDVote.new(vote_array).results
   end
 
   def test_ssd3
@@ -57,7 +57,7 @@ class TestCondorcetVote < Test::Unit::TestCase
 
     assert_equal "B", CloneproofSSDVote.new(vote_array).result.winners[0]
     assert_equal [['B'], ['C'], ['D'], ['A']], 
-                 CloneproofSSDVote.new(vote_array).result.get_full_results
+                 CloneproofSSDVote.new(vote_array).results
   end
 
   def test_ssd_incomplete_votes
@@ -68,9 +68,9 @@ class TestCondorcetVote < Test::Unit::TestCase
     4.times {vote_array << ["C"]}
     2.times {vote_array << "DBC".split("")}
 
-    result = CloneproofSSDVote.new(vote_array).result
-    assert_equal "B", result.winners[0]
-    assert_equal [['B'], ['C'], ['D'], ['A']], result.get_full_results
+    vote = CloneproofSSDVote.new(vote_array)
+    assert_equal "B", vote.result.winners[0]
+    assert_equal [['B'], ['C'], ['D'], ['A']], vote.results
   end
 
   def test_ssd_incomplete_votes_2
@@ -81,9 +81,9 @@ class TestCondorcetVote < Test::Unit::TestCase
     2.times {vote_array << "DBCA".split("")}
     2.times {vote_array << "DBC".split("")}
 
-    result = CloneproofSSDVote.new(vote_array).result
-    assert_equal "B", result.winners[0]
-    assert_equal [['B'], ['C'], ['D'], ['A']], result.get_full_results
+    vote = CloneproofSSDVote.new(vote_array)
+    assert_equal "B", vote.result.winners[0]
+    assert_equal [['B'], ['C'], ['D'], ['A']], vote.results
   end
 
   # 
@@ -93,9 +93,9 @@ class TestCondorcetVote < Test::Unit::TestCase
   # condition.
   #
   def test_ssd_single_vote
-    result = CloneproofSSDVote.new([[78]]).result
-    assert_equal 78, result.winners[0]
-    assert_equal [[78]], result.get_full_results
+    vote = CloneproofSSDVote.new([[78]])
+    assert_equal 78, vote.result.winners[0]
+    assert_equal [[78]], vote.results
   end
 
   def test_ssd_sparse
@@ -103,8 +103,17 @@ class TestCondorcetVote < Test::Unit::TestCase
     vote_array << ['B', 'D']
     vote_array << ['A', 'C']
     vote_array << ['E', 'C']
-    result = CloneproofSSDVote.new(vote_array).result
-    assert_equal 5, result.get_full_results.flatten.size
+    results = CloneproofSSDVote.new(vote_array).results
+    assert_equal 5, results.flatten.size
+  end
+
+  def test_ssd_sparse_2
+    vote_array = Array.new
+    vote_array << [65, 63, 64]
+    vote_array << [64, 65, 66, 63]
+    vote = CloneproofSSDVote.new(vote_array)
+    assert_equal 65, vote.result.winners[0]
+    assert_equal [[65, 64], [63, 66]], vote.results
   end
 
 end

Benjamin Mako Hill || Want to submit a patch?