File Coverage

blib/lib/Vote/Count/Method/CondorcetIRV.pm
Criterion Covered Total %
statement 41 41 100.0
branch 4 4 100.0
condition n/a
subroutine 9 9 100.0
pod 1 1 100.0
total 55 55 100.0


line stmt bran cond sub pod time code
1 3     3   554 use strict;
  3         9  
  3         98  
2 3     3   18 use warnings;
  3         6  
  3         75  
3 3     3   48 use 5.024;
  3         10  
4 3     3   16 use feature qw /postderef signatures/;
  3         10  
  3         278  
5              
6             package Vote::Count::Method::CondorcetIRV;
7 3     3   23 use namespace::autoclean;
  3         6  
  3         19  
8 3     3   270 use Moose;
  3         6  
  3         18  
9             extends 'Vote::Count';
10             with 'Vote::Count::BottomRunOff';
11              
12             our $VERSION='2.01';
13              
14             =head1 NAME
15              
16             Vote::Count::Method::CondorcetIRV
17              
18             =head1 VERSION 2.01
19              
20             =cut
21              
22             # ABSTRACT: Simple Condorcet IRV Methods.
23              
24             =pod
25              
26             =head1 SYNOPSIS
27              
28             use Vote::Count::Method::CondorcetIRV ;
29              
30             my $Election = Vote::Count::Method::CondorcetIRV->new(
31             'BallotSet' => $someballotset,
32             'TieBreakMethod' => 'precedence', # defaults to all
33             );
34             my $result = $Election->SmithSetIRV() ;
35             say "Winner is: " . $result->{'winner'};
36             say $Election->logv();
37              
38             =head1 Description
39              
40             Provides Common Basic Condorcet-IRV Methods. These methods are simple and beat other Condorcet Methods on Later Harm.
41              
42             =head1 Method Common Names: Smith Set IRV, Smith-IRV
43              
44             Identifies the Smith Set and runs IRV on it.
45              
46             =head2 Function Name: SmithSetIRV
47              
48             SmithSetIRV is exported and requires a Vote::Count object, an optional second argument is an IRV tiebreaker rule name (see IRV module). It will return a hashref similar to RunIRV, in the event of a tie the Vote::Count Object's Active Set will also be the tied choices (available for any later tie breakers you would implement). Events will be logged to the Vote::Count Object.
49              
50             =head2 Criteria
51              
52             =head3 Simplicity
53              
54             SmithSet IRV is easy to understand but requires a full matrix and thus is harder to handcount than Benham or BTR IRV. If it desired to handcount, an aggressive Floor Rule like TCA (see Floor module) is recommended, or an Approval or Top Count Floor of up to 15%. 15% Top Count permits at most 6 choices, but 6 choices still require 15 pairings to complete the Matrix.
55              
56             =head3 Later Harm
57              
58             When there is no Condorcet Winner this method is Later Harm Sufficient. There might be edge cases where IRV's sensitivity to dropping order creates a Later Harm effect, but they should be pretty rare. When there is a Condorcet Winner the effect is the normal one for a Condorcet Method.
59              
60             The easiest way to imagine a case where a choice not in the Smith Set changed the outcome is by cloning the winner, such that there is a choice defeating them in early Top Count but not defeating them. The negative impact of the clone is an established weakness of IRV. It would appear that any possible Later Harm issue in addition to being very much at the edge is more than offset by consistency improvement.
61              
62             Smith Set IRV still inherits the Later Harm failure of requiring a Condorcet Winner, but it has the lowest possible Later Harm effect for a Smith compliant Method. Woodhull and restricting Pairwise Opposition to the Smith Set have equal Later Harm effect to Smith Set IRV.
63              
64             =head3 Condorcet Criteria
65              
66             Meets Condorcer Winner, Condorcet Loser, and Smith.
67              
68             =head3 Consistency
69              
70             By meeting the three Condorcet Criteria a level of consistency is guaranteed. When there is no Condorcet Winner the resolution has all of the weaknesses of IRV, as discussed in the Later Harm topic above restricting IRV to the Smith Set would appear to provide a consistency gain over basic IRV.
71              
72             Smith Set IRV is therefore substantially more consistent than basic IRV, but less consistent than Condorcet methods like SSD that focus on Consistency.
73              
74             =head1 Smith Set Restricted MinMax (Currently Unimplemented, See Vote::Count::Method::MinMax)
75              
76             MinMax methods do not meet the Smith Criteria nor the Condorcet Loser Criteria, two do meet the Condorcet Winner Criteria, and one meets Later Harm. Restricting MinMax to the Smith Set will make all of the sub-methods meet all three Condorcet Criteria; "Opposition" will match the Later Harm protection of Smith Set IRV.
77              
78             =head1 Method Common Name: Woodhull Method (Currently Unimplemented)
79              
80             The Woodhull method is similar to Smith Set IRV. The difference is: instead of eliminating the choices outside the Smith Set, Woodhull does not permit them to win. Since, it has to deal with the situation where an ineligible choice wins via IRV, it becomes slightly more complex. In addition, group elimination of unwinnable choices improves consistency, which is another advantage to Smith Set IRV. As for possible differences in Later Harm effect, the Later Harm comes from the restriction of the victor to the Smith Set, which is the same effect for both methods.
81              
82             The argument in favor of Woodhull over Smith would be that: Anything which alters the dropping order can alter the outcome of IRV, and Woodhull preserves the IRV dropping order. Since, a dropping order change has an equal possiblity of helping or hurting one's preferred choice, this side-effect is a random flaw. Removing the least consequential choices is preventing them from impacting the election (in a random manner), thus this author sees it as an advantage for Smith Set IRV.
83              
84             =head1 Method Common Name: Bottom Two Runoff IRV, BTR IRV
85              
86             This is the simplest modification to IRV which meets the Condorcet Winner Criteria. Instead of eliminating the low choice, the lowest two choices enter a virtual runoff, eliminating the loser. This is the easiest Hand Count Condorcet method, there will always be fewer pairings than choices. This method fails LNH, when there is no Condorcet Winner the LNH impact may substantial since it can come into play for each runoff. BTR IRV will only eliminate a member of the Smith Set when both members of the runoff are in it, it can never eliminate the final member of the Smith Set. BTR IRV meets both Condorcet Criteria and the Smith Criteria.
87              
88             This method is implemented in the Main IRV Role L<Vote::Count::IRV|Vote::Count::IRV/RunBTRIRV>.
89              
90             =head1 Method Common Names: Benham, Benham IRV
91              
92             This method modifies IRV by checking for a Condorcet Winner each round, and then drops the low choice as regular IRV. It is probably the most widely used Condorcet Method for Hand Counting because it does not require a full matrix. For each choice it is only required to determine if they lose to any of the other active choices.
93              
94             This method is implemented by L<Vote::Count::Method::CondorcetDropping|Vote::Count::Method::CondorcetDropping/Benham>.
95              
96             =cut
97              
98 3     3   21467 no warnings 'experimental';
  3         9  
  3         121  
99              
100 3     3   20 use Carp;
  3         5  
  3         1096  
101              
102 6     6 1 721 sub SmithSetIRV ( $E, $tiebreaker = 'all' ) {
  6         14  
  6         14  
  6         11  
103 6         176 my $matrix = $E->PairMatrix();
104 6         45 $E->logt('SmithSetIRV');
105 6         28 my $winner = $matrix->CondorcetWinner();
106 6 100       23 if ($winner) {
107 2         16 $E->logv("Condorcet Winner: $winner");
108             return {
109 2         17 'winner' => $winner,
110             'tied' => 0
111             };
112             }
113             else {
114 4         22 my $Smith = $matrix->SmithSet();
115 4         59 $E->logv( "Smith Set: " . join( ',', sort( keys $Smith->%* ) ) );
116 4         37 my $IRV = $E->RunIRV( $Smith, $tiebreaker );
117 4 100       23 unless ( $IRV->{'winner'} ) {
118 1         4 $winner = '';
119 1         3 $E->SetActive( { map { $_ => 1 } ( $IRV->{'tied'}->@* ) } );
  2         15  
120             }
121 4         28 return $IRV;
122             }
123             }
124              
125             1;
126              
127             #FOOTER
128              
129             =pod
130              
131             BUG TRACKER
132              
133             L<https://github.com/brainbuz/Vote-Count/issues>
134              
135             AUTHOR
136              
137             John Karr (BRAINBUZ) brainbuz@cpan.org
138              
139             CONTRIBUTORS
140              
141             Copyright 2019-2021 by John Karr (BRAINBUZ) brainbuz@cpan.org.
142              
143             LICENSE
144              
145             This module is released under the GNU Public License Version 3. See license file for details. For more information on this license visit L<http://fsf.org>.
146              
147             SUPPORT
148              
149             This software is provided as is, per the terms of the GNU Public License. Professional support and customisation services are available from the author.
150              
151             =cut
152