OpenSTV is open-source software for implementing the single transferable vote and other voting methods such as instant runoff voting, Condorcet voting, and approval voting. OpenSTV is the only open-source software that implements the single transferable vote exactly as used by governments, including Scotland and the City of Cambridge, Massachusetts. These methods have been extensively verified against other software and/or actual election results.
Organizations can use OpenSTV to implement their own elections by doing the following:
OpenSTV will run on MS Windows, Mac OS X, and Linux. To download OpenSTV to your computer, select the download link at the top of the page. OpenSTV is released under version 2 of the GNU General Public License.
Please send questions to the email list openstv at googlegroups.com.
Thomas Hare: "On the Application of a New Statistical Method to the Ascertainment of the Votes of Majorities in a More Exhaustive Manner", Journal of the Statistical Society of London, Vol 23 No 3 (Sep 1860)
John Stuart Mill: "Of True and False Democracy; Representation of All, and Representation of the Majority only", Chapter 7 of Considerations on Representative Democracy (1861)
Henry R Droop: "On Methods of Electing Representatives", Journal of the Statistical Society of London, Vol 4 No 2 (Jun 1881)
Brian L Meek: A New Approach to the Single Transferable Vote: Paper I: Equality of Treatment of voters and a feedback mechanism for vote counting (1969)
Brian L Meek: A New Approach to the Single Transferable Vote: Paper II: The problem of non-transferable votes (1970)
Voting matters: "To advance the understanding of preferential voting systems"
Q. Where do I get my questions answered?
A. Send an email to openstv at googlegroups.com.
Q. Which voting method should I use?
A. There is no clear answer to this question and you will get different answers from different people, but we will give our recommendations here.
If you are electing one person and simplicity is important, then we recommend instant runoff voting. Instant runoff voting is easy to explain and gives good results.
If you are electing one person and simplicity is not important, then we recommend Condorcet voting. Most people agree that Condorcet is the best method for electing one person, but it is more difficult to explain.
If you are electing multiple people and simplicity is important, then we recommend Scottish STV, as it is the simplest of all the STV methods.
If you are electing multiple people and simplicity is not important, then we recommend Meek STV. Most people agree that Meek STV is the best variant of STV, but it can only be implemented with a computer program.
Q. Will you implement a feature that I would like to see in OpenSTV?
A. It depends.
The main factors include (1) how worthwhile the desired feature is, (2) how important you or your organization is, and (3) how hard it is to implement the desired feature.
For example, if we have no idea who you are, but your request is a really good one and it is easy to implement, it will probably make the next release. On the other hand, if the United States Senate asks us to implement a really crummy feature, then we probably wouldn't do it.
OpenSTV was started in in the Fall of 2002 by Jeff O'Neill, who needed an excuse to get away from the mountain of reading required by the first year of law school. The code was first released in October 2003 under the name pSTV. The "p" in pSTV stood for Python as the code was and is written entirely in the Python programing language. The name was changed from pSTV to OpenSTV in October 2006 to better reflect the nature of the software. Jeff started OpenSTV partly out of an academic interest and partly out of frustration for the lack of available tools for conducting STV elections.
Brian Wichmann has created a database of election results for different preferential voting methods. Hundreds of ballots files are used and some are data from real elections.
Updated 30 October 2005.
This Guide is for a small database concerned with Preferential voting, as used in Single Transferable Vote elections. Given an example election in which a number of seats is contested between several candidates, the preferential votes can be counted in a number of ways. The Republic of Ireland, Malta, the Church of England and Northern Ireland all use STV but with slightly different counting rules. This database is designed to aid in the analysis and research into such systems.
There are two ways of using this database. You can access the database via the Web at https://phpmyadmin-s.sourceforge.net (you will then get a login page to which you need to give the user name s91982ro and password stv), or you can download the content of the database from the same site and then set it up on your own computer using MySql. This manual is designed for either situation, but the emphasis is on the Internet version. On the SourceForge system, after logging in, select the data base s91982_stvdb.
The SourceForge system has a number of limitations. It is set up to restrict the maximum number of joins. Some of the examples below have a command before the main query of: SET MAX_JOIN_SIZE =4294967295; This need not be included if you are using MySQL on your own computer.
The database is free and it is hoped that others will contribute to the information within it.
As an example of the type of problems the database is designed to resolve, David Hill reports an election (to elect 2 from A ... F) for which:
| Elects AD | Elects AC |
| ERS 97 | ERS 76 |
| ERS 72 | Sequential STV |
| Meek | Church of England |
| Northern Ireland | General Medical Council |
| Methodists | Gazeley's Exhaustive STV |
| Warren | Woodall's QPQ |
| New Zealand |
However, if B, E, and F are withdrawn, all methods elect AC.
It is easy to locate this and similar cases to this as we will demonstrate later.
The database is really a component of a bigger system, as it merely acts as a repository of properties of some preferential voting data and the application of counting rules to that data.
In fact, the database is currently just two MySql tables: one of those storing properties of the preferential election data and the other the results of running counting rules on the data. At this stage, no attempt has been made to check the material other than via the use of MySql - all the examples here use MySql. Users not familiar with MySql will probably need to consult the user manual (but you may well be able to manage by using and adapting the examples given here).
For the election data, there are seven categories denoted by a single letter. In alphabetical order they are:
(There is another class D which is not used in this database.)
Purists will state that the class is a property of the data which should be stored separately in the database, rather than being part of the data itself. However, the current scheme works and predates the MySql database.
An individual election is denoted by one of the letters above followed by three digits. The actual data file for the election is like: C012.BLT. From a logical analysis point of view, the T class is the most useful, but from the point of view of what might happen in real elections, all the others are most useful. The term election is used here even though for the T class no such election took place.
If you go to the Internet site http://stv.sourceforge.net/, log in to the database, and then select Databases, you will see on the column on the left, the two tables: BLT_info and Result.
Select BLT_info which then produces a screen full of a small part of the contents. Then select the left-most item at the top of the screen marked Structure. It is the structure of the two tables which is important (the entire contents is too large to be immediately useful). This table records the main characteristics of the ballot data from more than 700 elections.
You will now see a list of the items in the table as follows:
The other main table gives the results of applying a number of election rules to the ballot data. Selecting the table Result and then Structure (as before) one can see the fields of the table which are as follows:
The fields of these two tables are used extensively to find interesting election examples.
It is now easy to make simple lists of the all the elections in order of votes, say. We give more interesting example below.
Some examples now appear of the MySql input (in red) and output (in green). You can paste the input into your own system or the Web system to try out using the database. On the Web, select the third item in the top row marked SQL, and then paste the example into the SQL window and clicking on Go.
One important aspect is the total number of elections in the six classes noted above. This can be found by:
SELECT LEFT(X.ID, 1) AS "Class", SUM(X.Votes) AS "Total votes",
SUM(X.Candidates) AS "Total candidates", SUM(X.Seats) AS "Total seats",
SUM(X.Total_Prefs) AS "Total Preferences", COUNT(*) AS "Number in class"
FROM BLT_info X
GROUP BY LEFT(X.ID, 1);
With the Web version of the database, the results look slightly different as they are tabulated without using monospaced fonts.
The result of this is:
+-------+-------------+------------------+-------------+-------------------+-----------------+
| Class | Total votes | Total candidates | Total seats | Total Preferences | Number in class |
+-------+-------------+------------------+-------------+-------------------+-----------------+
| C | 9844664 | 919 | 206 | 48635283 | 23 |
| F | 2790567 | 1182 | 299 | 7154306 | 72 |
| M | 13428201 | 4940 | 1631 | 68078691 | 385 |
| R | 45311 | 1269 | 494 | 276363 | 119 |
| S | 204049 | 1102 | 285 | 343927 | 49 |
| T | 2658466 | 1414 | 788 | 5783467 | 192 |
+-------+-------------+------------------+-------------+-------------------+-----------------+
6 rows in set (0.02 sec)
The number in the full disclosure class (F) is small enough to list the key aspects:
SELECT X.ID, X.Title, X.Votes, X.Seats, X.Candidates
FROM BLT_info X
WHERE LEFT(X.ID, 1) = 'F'
ORDER BY X.Votes;
giving:
+------+----------------------------------------------------+---------+-------+------------+
| ID | Title | Votes | Seats | Candidates |
+------+----------------------------------------------------+---------+-------+------------+
| F072 | Stanford Sophomore Class Presidents 2001 | 1022 | 1 | 8 |
| F035 | New Zealand, Taieri Subdivision, 2004 | 1716 | 2 | 4 |
| F034 | New Zealand, Otago Peninsula Community Board, 2004 | 1789 | 6 | 8 |
| F032 | New Zealand, Saddle Hill Community Board, 2004 | 2005 | 6 | 9 |
| F033 | New Zealand, Chalmers Community Board, 2004 | 2036 | 6 | 8 |
| F012 | ASUCD Senate Fall Election, 2003 | 2447 | 6 | 16 |
| F028 | New Zealand, Porirua City, Western Ward, 2004 | 2631 | 3 | 11 |
| F031 | New Zealand, Waikouaiti Coast-Chalmers Ward, 2004 | 3320 | 1 | 4 |
| F070 | ASUCD Senate - Fall 2004 | 3584 | 6 | 20 |
| F069 | ASUCD Winter 2005 Senate Election | 3718 | 8 | 23 |
| F038 | ASUCD Winter 2005 Senate Election | 3718 | 8 | 23 |
| F025 | New Zealand, Porirua City, Eastern Ward, 2004 | 3782 | 5 | 10 |
| F013 | ASUCD Winter 2004 Presidential Election | 4029 | 1 | 3 |
| F014 | ASUCD Senate Winter 2004 | 4068 | 6 | 14 |
| F071 | ASSU President 2001 | 4075 | 1 | 7 |
| F050 | ASUC 2002 Student Advocate Election (UC Berkeley) | 4357 | 1 | 12 |
| F068 | ASUC 2005 Student Advocate Election (UC Berkeley) | 4528 | 1 | 6 |
| F044 | ASUC 2001 Student Advocate Election (UC Berkeley) | 4669 | 1 | 2 |
| F036 | New Zealand, Mosgiel Subdivision, 2004 | 4741 | 4 | 6 |
| F062 | ASUC 2004 Student Advocate Election (UC Berkeley) | 4890 | 1 | 5 |
| F056 | ASUC 2003 Student Advocate Election (UC Berkeley) | 5059 | 1 | 2 |
| F022 | New Zealand, Dunedin City, Cargill Ward, 2004 | 5210 | 3 | 10 |
| F039 | ASUC 2001 Academic VP Election (UC Berkeley) | 5656 | 1 | 5 |
| F041 | ASUC 2001 External VP Election (UC Berkeley) | 5808 | 1 | 6 |
| F057 | ASUC 2004 Academic VP Election (UC Berkeley) | 5851 | 1 | 3 |
| F063 | ASUC 2005 Academic VP Election (UC Berkeley) | 5884 | 1 | 5 |
| F065 | ASUC 2005 External VP Election (UC Berkeley) | 5927 | 1 | 5 |
| F046 | ASUC 2002 Executive VP Election (UC Berkeley) | 6046 | 1 | 8 |
| F040 | ASUC 2001 Executive VP Election (UC Berkeley) | 6057 | 1 | 9 |
| F064 | ASUC 2005 Executive VP Election (UC Berkeley) | 6156 | 1 | 4 |
| F045 | ASUC 2002 Academic VP Election (UC Berkeley) | 6175 | 1 | 4 |
| F047 | ASUC 2002 External VP Election (UC Berkeley) | 6207 | 1 | 6 |
| F059 | ASUC 2004 External VP Election (UC Berkeley) | 6220 | 1 | 4 |
| F027 | New Zealand, Porirua City, Northern Ward, 2004 | 6288 | 5 | 8 |
| F066 | ASUC 2005 President Election (UC Berkeley) | 6426 | 1 | 6 |
| F058 | ASUC 2004 Executive VP Election (UC Berkeley) | 6444 | 1 | 5 |
| F042 | ASUC 2001 President Election (UC Berkeley) | 6679 | 1 | 9 |
| F043 | ASUC 2001 Senator Election (UC Berkeley) | 6885 | 20 | 111 |
| F067 | ASUC 2005 Senator Election (UC Berkeley) | 6916 | 20 | 99 |
| F060 | ASUC 2004 President Election (UC Berkeley) | 6968 | 1 | 9 |
| F051 | ASUC 2003 Academic VP Election (UC Berkeley) | 7140 | 1 | 4 |
| F053 | ASUC 2003 External VP Election (UC Berkeley) | 7144 | 1 | 4 |
| F061 | ASUC 2004 Senator Election (UC Berkeley) | 7181 | 20 | 81 |
| F052 | ASUC 2003 Executive VP Election (UC Berkeley) | 7359 | 1 | 4 |
| F048 | ASUC 2002 President Election (UC Berkeley) | 7567 | 1 | 11 |
| F054 | ASUC 2003 President Election (UC Berkeley) | 7984 | 1 | 5 |
| F049 | ASUC 2002 Senator Election (UC Berkeley) | 8080 | 20 | 109 |
| F055 | ASUC 2003 Senator Election (UC Berkeley) | 8418 | 20 | 99 |
| F023 | New Zealand, Dunedin City, Hills Ward, 2004 | 9844 | 3 | 7 |
| F026 | New Zealand, Porirua City, Mayoralty, 2004 | 13099 | 1 | 6 |
| F024 | New Zealand, South Dunedin Ward, 2004 | 14113 | 4 | 12 |
| F010 | Cambridge, MA 1997 School Committee Election | 16386 | 6 | 14 |
| F006 | Cambridge, MA 2001 School Committee Election | 16489 | 6 | 16 |
| F009 | Cambridge, MA 1997 City Council Election | 16879 | 9 | 28 |
| F005 | Cambridge, MA 2001 City Council Election | 17126 | 9 | 28 |
| F011 | Cambridge, MA 1999 School Committee Election | 17961 | 6 | 19 |
| F008 | Cambridge, MA 2003 School Committee Election | 18698 | 6 | 14 |
| F004 | Cambridge, MA 1999 City Council Election | 18777 | 9 | 29 |
| F007 | Cambridge, MA 2003 City Council Election | 20080 | 9 | 29 |
| F021 | San Francisco City Supervisor District 11, 2004 | 23176 | 1 | 8 |
| F020 | San Francisco City Supervisor District 9, 2004 | 24868 | 1 | 7 |
| F017 | San Francisco City Supervisor District 3, 2004 | 25905 | 1 | 4 |
| F015 | San Francisco City Supervisor District 1, 2004 | 28787 | 1 | 7 |
| F002 | Dublin West 2002 (E:53780, D:17th May 2002) | 29988 | 3 | 9 |
| F019 | San Francisco City Supervisor District 7, 2004 | 31639 | 1 | 13 |
| F016 | San Francisco City Supervisor District 2, 2004 | 34488 | 1 | 5 |
| F018 | San Francisco City Supervisor District 5, 2004 | 35109 | 1 | 22 |
| F001 | Dublin North 2002 (E:72353, D:17th May 2002) | 43942 | 4 | 12 |
| F037 | New Zealand, Dunedin Mayor, 2004 | 45720 | 1 | 6 |
| F003 | Meath 2002 (E:108717, D:17th May 2002) | 64081 | 5 | 14 |
| F030 | New Zealand, Canterbury District Health Board, 200 | 108866 | 7 | 29 |
| F029 | London Mayoral election, 2004 | 1863686 | 1 | 10 |
+------+----------------------------------------------------+---------+-------+------------+
72 rows in set (0.00 sec)
In some Australian STV elections, all possible preferences must be given. We can find out how many such elections there are by:
SELECT X.ID, X.Votes, X.Candidates, X.Total_Prefs
FROM Blt_info X
WHERE X.Votes * X.Candidates = X.Total_Prefs;
The result of this is:
+------+-------+------------+-------------+
| ID | Votes | Candidates | Total_Prefs |
+------+-------+------------+-------------+
| S046 | 48 | 13 | 624 |
| T032 | 30 | 4 | 120 |
| T033 | 60 | 4 | 240 |
| T088 | 12 | 6 | 72 |
| T094 | 50 | 6 | 300 |
| T096 | 494 | 7 | 3458 |
| T103 | 100 | 4 | 400 |
| T104 | 105 | 4 | 420 |
| T105 | 1610 | 4 | 6440 |
| T149 | 2000 | 35 | 70000 |
+------+-------+------------+-------------+
10 rows in set (0.00 sec)
Hence there is only one election of this type, other than logical test cases (the T class).
A more interesting example is to see how many elections have more than one member in the Smith set. We have do this by finding if this field contains a comma (we exclude the T class to reduce the output):
SELECT ID, Smith_Set
FROM BLT_info
WHERE INSTR(Smith_Set, ',') <> 0
AND LEFT(ID, 1) <> 'T';
The result of this is:
+------+---------------------------------------------------------------+
| ID | Smith_Set |
+------+---------------------------------------------------------------+
| C002 | [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17] |
| F067 | [1,2,7,19,38,43,46,49,52,57,67,71,75,78,79,86,94] |
| M001 | [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21] |
| M016 | [1,2,4,5,8] |
| M026 | [1,2,3,4] |
| M033 | [1,2,4,5] |
| M041 | [1,2,6] |
| M044 | [1,2,5,6,9] |
| M045 | [1,2,4] |
| M046 | [1,2,3,4] |
| M052 | [1,2,3,4] |
| M057 | [1,4,7] |
| M067 | [1,2,3,4,5] |
| M074 | [1,2,3] |
| M079 | [1,4,5] |
| M081 | [1,2,4] |
| M083 | [1,2,4,5,6] |
| M085 | [1,4,6] |
| M104 | [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19,20,21,22,23] |
| M105 | [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18] |
| M114 | [1,2,3,4,5,6,7,8,9,10,11,12,13,15,16,17,18] |
| M141 | [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,19,20] |
| M145 | [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,24] |
| M373 | [1,2,4,16] |
| R018 | [9,11,13,20] |
| R031 | [1,2,4] |
| R060 | [6,7] |
| R116 | [1,6] |
| S002 | [2,12,15] |
| S004 | [2,4,6,10,12] |
| S008 | [1,2,3,4,5,6] |
| S014 | [3,4,5,7,8,9,11,12,15,19,20,21,22] |
| S025 | [2,11,15] |
| S031 | [1,3,4,7,8,9,10,11,13,14,16,17,19] |
| S032 | [12,13,17] |
| S039 | [4,11] |
| S041 | [4,7,8,9,11,17,18] |
| S046 | [3,6,8] |
+------+---------------------------------------------------------------+
38 rows in set (0.00 sec)
The number of results for each rule is easily found:
SELECT X.Rule, COUNT(*) AS "Results available"
FROM Result X
GROUP BY X.Rule;
+--------------+-------------------+
| Rule | Results available |
+--------------+-------------------+
| BCSTV | 832 |
| Borda | 832 |
| Bucklin | 123 |
| CambridgeSTV | 555 |
| CofESTV | 771 |
| Condorcet | 123 |
| Coombs | 798 |
| ERS76STV | 743 |
| ERS97STV | 832 |
| IRV | 810 |
| MeekSTV | 832 |
| NIrelandSTV | 832 |
| QPQe | 793 |
| QPQr | 793 |
| SNTV | 802 |
| SuppVote | 123 |
| WarrenSTV | 832 |
| XXvote | 776 |
+--------------+-------------------+
18 rows in set (0.06 sec)
Those rules ending in `STV' satisfy the conventional requirements to be regarded as a Single Transferable Vote counting rule.
The details of these election rules are as follows:
We can find those cases in which Warren and ERS76 elect different candidates, but excluding the logical tests (class T) and those in which a random choice was made:
SET MAX_JOIN_SIZE =4294967295;
SELECT X.ID, X.Elected AS "Elected by Warren", Y.Elected AS "Elected by ERS76"
FROM Result X, Result Y
WHERE X.ID = Y.ID
AND LEFT(X.ID,1) <> 'T'
AND X.Rule = "WarrenSTV"
AND X.Random = 0
AND Y.Rule = "ERS76STV"
AND Y.Random = 0
AND X.Elected <> Y.Elected
ORDER BY X.ID;
+------+------------------------------------------+-------------------------------------------+
| ID | Elected by Warren | Elected by ERS76 |
+------+------------------------------------------+-------------------------------------------+
| F006 | [4,5,7,8,9,10] | [4,5,6,7,8,9] |
| M005 | [1,2,5] | [1,2,4] |
| M010 | [1,3,4,5] | [1,2,4,5] |
| M019 | [1,4,8,9] | [1,5,8,9] |
| M028 | [1,3,6,7,8] | [1,2,3,6,7] |
| M051 | [1,3,4,5] | [1,2,4,5] |
| M059 | [1,4,5,7] | [1,2,4,5] |
| M060 | [1,4,7] | [1,4,5] |
| M066 | [1,2,5] | [1,2,4] |
| M070 | [1,2,6,7,8] | [1,3,6,7,8] |
| M073 | [2,4,5,8] | [1,4,5,8] |
| M078 | [1,3,4] | [1,2,3] |
| M092 | [1,2,3,14] | [1,3,5,14] |
| M093 | [1,2,3,14] | [1,3,5,14] |
| M094 | [1,2,3,14] | [1,3,5,14] |
| M100 | [1,2,4,6,8,17] | [1,2,4,7,8,17] |
| M103 | [1,2,4,6,7,9] | [1,2,3,4,6,7] |
| M104 | [1,2,4,6,9,16] | [1,2,4,5,9,16] |
| M106 | [1,2,6,8,9,12] | [1,2,4,5,8,12] |
| M108 | [1,2,4,6,7,12] | [1,2,4,7,12,13] |
| M109 | [1,2,3,5,9,13] | [1,2,5,9,10,13] |
| M110 | [1,2,3,7,11,12] | [1,2,3,6,9,11] |
| M111 | [1,2,5,6,9,14] | [1,2,3,5,9,14] |
| M114 | [1,2,3,5,6,13] | [1,2,3,5,6,8] |
| M116 | [1,2,4,5,6,7] | [1,2,4,5,7,14] |
| M117 | [1,2,3,4,9,13] | [1,2,4,9,11,13] |
| M119 | [1,2,4,5,9,16] | [1,2,4,5,6,16] |
| M120 | [1,2,5,7,8,15] | [1,2,5,7,8,11] |
| M121 | [1,2,5,7,8,16] | [1,2,4,7,8,16] |
| M122 | [1,2,3,5,6,7,10] | [1,2,3,5,6,11,13] |
| M123 | [1,2,4,5,7,9,13] | [1,2,3,4,5,7,9] |
| M124 | [1,3,7,8,9,11,12] | [1,2,3,7,8,9,11] |
| M126 | [1,4,5,6,9,11,13] | [1,2,4,5,6,9,13] |
| M130 | [1,2,4,5,6,8,13] | [1,2,4,5,6,11,12] |
| M134 | [1,2,3,5,7,9,11] | [1,2,3,5,6,7,9] |
| M137 | [1,2,3,4,5,9,13] | [1,2,3,4,5,7,9] |
| M139 | [1,2,3,5,7,10,13] | [1,3,5,7,8,10,13] |
| M140 | [1,2,4,5,8,10,11] | [1,2,4,5,6,8,11] |
| M145 | [1,2,4,5,6,7,11] | [1,2,3,4,6,7,11] |
| M147 | [1,2,3,5,6,7,16] | [1,2,3,5,6,14,16] |
| M149 | [1,2,3,4,6,8,18] | [1,2,3,4,6,13,18] |
| M150 | [1,2,3,4,5,12,14] | [1,2,3,4,5,12,13] |
| M181 | [1,4,6,7] | [1,4,7,11] |
| M182 | [1,4,6,7] | [1,4,7,11] |
| M190 | [2,6,8,14] | [6,8,10,14] |
| M191 | [2,6,8,14] | [6,8,10,14] |
| M193 | [1,2,3,14] | [1,3,5,14] |
| M197 | [2,4,8,12,13] | [2,4,8,11,13] |
| M198 | [2,4,8,12,13] | [2,4,8,11,13] |
| M207 | [4,6,11,15,16] | [4,6,13,15,16] |
| M228 | [2,8,10,11,12] | [2,3,8,11,12] |
| M229 | [4,5,7,11,13] | [5,7,9,11,13] |
| M230 | [4,5,8,11,13] | [5,8,9,11,13] |
| M231 | [4,5,7,11,13] | [5,8,9,11,13] |
| M253 | [2,3,4,8] | [1,2,3,8] |
| M254 | [2,3,4,8] | [1,2,3,8] |
| M303 | [1,3,8] | [3,5,8] |
| M353 | [3,5,6] | [3,6,7] |
| M386 | [2,4,6,13] | [2,4,6,11] |
| M387 | [2,4,6,13] | [2,4,6,11] |
| R003 | [1,3,8,10,14,16] | [1,8,10,14,16,17] |
| R004 | [1,4,6,8,10] | [1,2,4,8,10] |
| R005 | [1,2,3,5,6,7,8] | [1,2,3,4,5,7,8] |
| R046 | [1,6,7,10] | [1,2,7,10] |
| R048 | [1,4,5,6,9] | [1,4,6,9,10] |
| R072 | [1,4,5,7] | [1,5,6,7] |
| R081 | [3,4,5,6,7,8] | [1,3,5,6,7,8] |
| R083 | [1,2,3,4,5,6,9,12,14,15,19,20] | [1,2,3,4,5,6,9,11,12,14,19,20] |
| R096 | [2,4,5,6,7,9,10,11,12,14,15,16,18,19,20] | [2,5,6,7,9,10,11,12,14,15,16,17,18,19,20] |
| R098 | [1,3,5,8,9,10,14,20,26,27] | [1,5,8,9,10,12,14,20,26,27] |
| R109 | [1,5,6,8,9,10] | [1,4,5,6,8,10] |
| R113 | [1,4] | [2,4] |
| S044 | [1,3,5,8,9] | [1,3,5,7,9] |
| S045 | [1,2,3,4,6,7,8,9,10] | [1,2,3,4,5,6,7,9,10] |
+------+------------------------------------------+-------------------------------------------+
74 rows in set (0.63 sec)
Note the initial command to ensure that the query completes successfully.
We can explore the use of random choices:
SELECT X.Rule, COUNT(*) AS "Cases with random choice", SUM(X.Random)
FROM Result X
WHERE X.Random <> 0
GROUP BY X.Rule;
+--------------+--------------------------+---------------+
| Rule | Cases with random choice | SUM(X.Random) |
+--------------+--------------------------+---------------+
| BCSTV | 156 | 417 |
| Borda | 25 | 35 |
| Bucklin | 2 | 2 |
| CambridgeSTV | 37 | 164 |
| CofESTV | 149 | 1054 |
| ERS76STV | 126 | 384 |
| ERS97STV | 130 | 353 |
| IRV | 162 | 372 |
| MeekSTV | 110 | 275 |
| NIrelandSTV | 132 | 337 |
| QPQe | 192 | 1408 |
| QPQr | 198 | 1733 |
| SNTV | 83 | 136 |
| SuppVote | 27 | 35 |
| WarrenSTV | 113 | 283 |
| XXvote | 69 | 107 |
+--------------+--------------------------+---------------+
16 rows in set (0.02 sec)
+--------------+--------------------------+---------------+
As expected, CofE makes more random choices by not permitting multiple exclusions, and Meek makes only half the number of random choices after the first due to using very small fractions of a vote. (This query fails with a syntax error on the current SourceForge system for reasons which are not clear - it is OK with MySQL version 5.0.16 on an Apple.)
We now find all the elections for a single seat for which the Condorcet winner is not elected.
SET MAX_JOIN_SIZE =4294967295;
SELECT X.ID, X.Smith_Set, Y.Elected, Y.Rule
FROM BLT_info X, Result Y
WHERE X.Seats = 1
AND X.ID = Y.ID
AND INSTR(X.Smith_Set, ',') = 0
AND X.Smith_Set <> Y.Elected
AND LEFT(X.ID,1) <> 'T'
ORDER BY X.ID;
+------+-----------+---------+-------------+
| ID | Smith_Set | Elected | Rule |
+------+-----------+---------+-------------+
| F053 | [1] | [4] | SNTV |
| R026 | [2] | [8] | SNTV |
| R026 | [2] | [5] | Bucklin |
| R026 | [2] | [5] | Borda |
| R026 | [2] | [8] | XXvote |
| R035 | [1] | [2] | Bucklin |
| R051 | [2] | [6] | Bucklin |
| R054 | [4] | [1] | Bucklin |
| R084 | [6] | [12] | SuppVote |
| R084 | [6] | [12] | Bucklin |
| R084 | [6] | [12] | Borda |
| R097 | [15] | [3] | SNTV |
| R097 | [15] | [3] | SuppVote |
| R097 | [15] | [3] | XXvote |
| S001 | [2] | [9] | SNTV |
| S001 | [2] | [9] | SuppVote |
| S001 | [2] | [9] | Coombs |
| S001 | [2] | [9] | XXvote |
| S006 | [13] | [6] | Coombs |
| S006 | [13] | [3] | Borda |
| S007 | [3] | [6] | Bucklin |
| S009 | [13] | [10] | SNTV |
| S009 | [13] | [10] | SuppVote |
| S011 | [9] | [4] | SNTV |
| S011 | [9] | [4] | SuppVote |
| S011 | [9] | [21] | XXvote |
| S012 | [22] | [7] | SNTV |
| S012 | [22] | [7] | SuppVote |
| S012 | [22] | [7] | Bucklin |
| S012 | [22] | [7] | XXvote |
| S013 | [19] | [14] | SNTV |
| S013 | [19] | [14] | SuppVote |
| S013 | [19] | [14] | XXvote |
| S015 | [17] | [10] | SNTV |
| S015 | [17] | [16] | IRV |
| S015 | [17] | [10] | SuppVote |
| S015 | [17] | [16] | BCSTV |
| S015 | [17] | [16] | ERS97STV |
| S015 | [17] | [16] | NIrelandSTV |
| S015 | [17] | [16] | MeekSTV |
| S015 | [17] | [16] | WarrenSTV |
| S015 | [17] | [16] | QPQe |
| S015 | [17] | [16] | QPQr |
| S015 | [17] | [19] | XXvote |
| S015 | [17] | [16] | ERS76STV |
| S015 | [17] | [16] | CofESTV |
| S027 | [9] | [1] | SNTV |
| S027 | [9] | [1] | Borda |
| S027 | [9] | [1] | XXvote |
| S028 | [17] | [1] | SNTV |
| S028 | [17] | [1] | SuppVote |
| S028 | [17] | [1] | Bucklin |
| S028 | [17] | [1] | Borda |
| S028 | [17] | [1] | XXvote |
| S029 | [18] | [9] | SNTV |
| S029 | [18] | [9] | SuppVote |
| S029 | [18] | [1] | Bucklin |
| S029 | [18] | [9] | XXvote |
| S035 | [8] | [18] | Coombs |
| S035 | [8] | [16] | Borda |
| S035 | [8] | [16] | XXvote |
| S036 | [15] | [13] | Bucklin |
| S036 | [15] | [21] | XXvote |
| S042 | [3] | [2] | SNTV |
| S042 | [3] | [2] | SuppVote |
| S042 | [3] | [2] | Bucklin |
| S042 | [3] | [2] | Borda |
| S047 | [10] | [5] | SuppVote |
| S049 | [1] | [2] | Bucklin |
+------+-----------+---------+-------------+
69 rows in set (0.52 sec)
All of these cases indicates that the Condorcet winner is not necessarily elected by STV (as expected).
We can find the difference between Cambridge and Meek and produce the main characteristics from the BLT_info table:
SET MAX_JOIN_SIZE =4294967295;
SELECT Z.ID, Z.Votes, Z.Candidates, Z.Seats,
X.Elected AS "Elected by Meek", Y.Elected AS "Elected by Cambridge"
FROM Result X, Result Y, BLT_info Z
WHERE X.ID = Y.ID
AND X.ID = Z.ID
AND Y.ID = Z.ID
AND X.Rule = "MeekSTV"
AND Y.Rule = "CambridgeSTV"
AND X.Random = 0
AND LEFT(X.ID,1) <> 'T'
AND X.Elected <> Y.Elected;
+------+--------+------------+-------+----------------------+----------------------+
| ID | Votes | Candidates | Seats | Elected by Meek | Elected by Cambridge |
+------+--------+------------+-------+----------------------+----------------------+
| S044 | 2908 | 12 | 5 | [1,3,5,8,9] | [1,3,5,7,9] |
| S045 | 853 | 10 | 9 | [1,2,3,4,6,7,8,9,10] | [1,2,3,4,5,6,7,9,10] |
| R022 | 867 | 13 | 8 | [1,2,4,5,6,9,10,12] | [1,2,4,5,6,8,10,12] |
| R067 | 253 | 3 | 2 | [1,2] | [1,3] |
| R109 | 1147 | 10 | 6 | [1,4,5,6,8,9] | [1,5,6,8,9,10] |
| M005 | 27757 | 7 | 3 | [1,2,5] | [1,2,4] |
| M010 | 38410 | 9 | 4 | [1,3,4,5] | [1,2,4,5] |
| M012 | 28665 | 5 | 3 | [1,2,3] | [1,2,4] |
| M017 | 35205 | 14 | 4 | [1,2,4,9] | [1,2,4,5] |
| M019 | 29193 | 13 | 4 | [1,4,8,9] | [1,5,8,9] |
| M028 | 44454 | 13 | 5 | [1,3,6,7,8] | [1,2,3,6,7] |
| M030 | 28793 | 9 | 3 | [1,2,4] | [1,3,4] |
| M034 | 25247 | 7 | 3 | [1,2,4] | [1,3,4] |
| M045 | 28687 | 7 | 3 | [1,2,4] | [1,4,5] |
| M051 | 39991 | 10 | 4 | [1,3,4,5] | [1,2,4,5] |
| M059 | 35038 | 11 | 4 | [1,4,5,7] | [1,2,4,5] |
| M060 | 25553 | 9 | 3 | [1,4,7] | [1,4,5] |
| M066 | 24825 | 9 | 3 | [1,2,5] | [1,2,4] |
| M070 | 44914 | 13 | 5 | [1,2,6,7,8] | [1,3,6,7,8] |
| M073 | 36407 | 8 | 4 | [2,4,5,8] | [1,4,5,8] |
| M078 | 27881 | 8 | 3 | [1,3,4] | [1,2,3] |
| M081 | 28352 | 6 | 3 | [1,4,6] | [1,2,4] |
| M092 | 37438 | 16 | 4 | [1,2,3,14] | [1,3,5,14] |
| M181 | 36400 | 12 | 4 | [1,4,6,7] | [1,4,7,11] |
| M190 | 40009 | 14 | 4 | [2,6,8,14] | [6,8,10,14] |
| M191 | 40009 | 14 | 4 | [2,6,8,14] | [6,8,10,14] |
| M193 | 37438 | 16 | 4 | [1,2,3,14] | [1,3,5,14] |
| M197 | 59634 | 14 | 5 | [2,4,8,12,13] | [2,4,8,11,13] |
| M198 | 59634 | 14 | 5 | [2,4,8,12,13] | [2,4,8,11,13] |
| M207 | 42648 | 16 | 5 | [4,6,11,15,16] | [4,6,13,15,16] |
| M229 | 53670 | 13 | 5 | [4,5,7,11,13] | [5,7,9,11,13] |
| M230 | 53670 | 13 | 5 | [4,5,8,11,13] | [5,8,9,11,13] |
| M231 | 53670 | 13 | 5 | [4,5,7,11,13] | [5,8,9,11,13] |
| M253 | 42733 | 9 | 4 | [2,3,4,8] | [1,2,3,8] |
| M254 | 42733 | 9 | 4 | [2,3,4,8] | [1,2,3,8] |
| M266 | 30703 | 11 | 3 | [1,8,9] | [7,8,9] |
| M283 | 43076 | 10 | 4 | [1,2,7,10] | [1,2,7,9] |
| M303 | 32440 | 9 | 3 | [1,3,8] | [3,5,8] |
| M353 | 28808 | 8 | 3 | [3,5,6] | [3,6,7] |
| M386 | 44797 | 13 | 4 | [2,4,6,13] | [2,4,6,11] |
| M387 | 44797 | 13 | 4 | [2,4,6,13] | [2,4,6,11] |
| F006 | 16489 | 16 | 6 | [4,5,7,8,9,10] | [4,5,6,7,9,10] |
| C015 | 550000 | 16 | 4 | [1,2,3,11] | [1,2,7,11] |
| C019 | 750000 | 17 | 4 | [1,2,11,13] | [1,2,7,11] |
| C023 | 950000 | 20 | 4 | [1,2,11,13] | [1,2,7,11] |
+------+--------+------------+-------+----------------------+----------------------+
45 rows in set (0.61 sec)
Note that the non-logical cases are all for a relatively large number of seats. (The logically unnecessary AND Y.ID = Z.ID is added to speed up the query.)
Finally, we return to the example which we gave at the beginning. We try to find an example in which ERS97=Meek, but these two are not equal to (ERS76=QPQr), obviously in terms of the candidates elected.
SET MAX_JOIN_SIZE =4294967295;
SELECT X.ID
FROM Result X, Result Y, Result Z, Result U
WHERE X.ID = Y.ID
AND X.ID = Z.ID
AND Y.ID = Z.ID
AND Y.ID = U.ID
AND X.ID = U.ID
AND U.ID = Z.ID
AND X.Rule = "ERS97STV"
AND Y.Rule = "MeekSTV"
AND Z.Rule = "ERS76STV"
AND U.Rule = "QPQr"
AND X.Elected = Y.Elected
AND Z.Elected = U.Elected
AND X.Elected <> Z.Elected
AND Y.Elected <> Z.Elected
AND X.Elected <> U.Elected
AND Y.Elected <> U.Elected;
Without the initial SET command one gets:
#1104 - The SELECT would examine more than MAX_JOIN_SIZE rows; check
your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if
the SELECT is okay
With the initial SET command required in the SourceForge set-up, or without that using another MySQL system one gets:
+------+
| ID |
+------+
| T143 |
+------+
1 row in set (0.93 sec)
We can now see what information we have about this particular test:
SELECT *
FROM BLT_info
WHERE ID="T143";
This is too wide to display in the format given by MySQL, but gives:
| ID | T143 |
| Title | TEST97B Substage TieBreak |
| Candidates | 6 |
| Seats | 2 |
| Votes | 60 |
| Invalid_Votes | 0 |
| Total_Prefs | 100 |
| Withdrawn_Candidates | 0 |
| Zero_First | 0 |
| No_Support | 0 |
| Largest_Pile | 13 |
| Smith_Set | [1] |
| Single_Prefs | 28 |
| Source | Keith Edkins, email: keith.edkins at gwydir.demon.co.uk |
| Comment | See papers 5 and 6 in Voting matters, Issue 11, April 2000. |
| Extra_Doc | N |
SELECT *
FROM Result
WHERE ID="T143";
+------+-------------+---------+--------+--------+-------+-----------+-----------------------+
| ID | Rule | Elected | Stages | Random | First | Tie_Break | Program |
+------+-------------+---------+--------+--------+-------+-----------+-----------------------+
| T143 | SNTV | [1,2] | 1 | 0 | 2 | S | pSTV: version 0.9 |
| T143 | IRV | [1,4] | 5 | 0 | 0 | S | pSTV: version 0.9 |
| T143 | Coombs | [3,4] | 5 | 0 | 0 | S | pSTV: version 0.9 |
| T143 | Borda | [1,3] | 1 | 0 | 2 | S | pSTV: version 0.9 |
| T143 | BCSTV | [1,4] | 6 | 0 | 1 | S | pSTV: version 0.9 |
| T143 | ERS97STV | [1,4] | 7 | 0 | 1 | S | pSTV: version 0.9 |
| T143 | NIrelandSTV | [1,4] | 6 | 0 | 1 | S | pSTV: version 0.9 |
| T143 | MeekSTV | [1,4] | 5 | 0 | 1 | S | pSTV: version 0.9 |
| T143 | WarrenSTV | [1,4] | 5 | 0 | 1 | S | pSTV: version 0.9 |
| T143 | QPQe | [1,3] | 5 | 0 | 1 | S | Ada rule v0.04 |
| T143 | QPQr | [1,3] | 8 | 0 | 1 | S | Ada rule v0.04 |
| T143 | XXvote | [1,4] | 1 | 0 | 2 | S | Ada rule v0.04 |
| T143 | ERS76 | [1,3] | 5 | 0 | 1 | S | eSTV Reg. 12180,1.47a |
| T143 | CofE | [1,3] | 5 | 0 | 1 | S | eSTV Reg. 12180,1.48f |
+------+-------------+---------+--------+--------+-------+-----------+-----------------------+
14 rows in set (0.02 sec)
Finally, a script has been written to compare all the elections (but omitting the T Class and those involving a random choice), so that a table can be prepared giving the result. This is as a percentage of the elections in which a different set of candidates were elected. This result of this is:
| Borda | Bucklin | CambridgeSTV | CofESTV | ERS76STV | ERS97STV | IRV | MeekSTV | NIrelandSTV | QPQe | QPQr | SNTV | SuppVote | WarrenSTV | XXvote | |
| BCSTV | 65.30 | 11.67 | 3.21 | 4.56 | 5.10 | 4.97 | 18.82 | 12.23 | 3.37 | 20.56 | 15.06 | 36.35 | 3.45 | 12.97 | 71.98 |
| Borda | - | 13.68 | 62.39 | 66.99 | 68.73 | 63.45 | 66.05 | 60.82 | 64.36 | 63.42 | 61.68 | 67.72 | 12.99 | 60.58 | 20.47 |
| Bucklin | - | - | 9.43 | 21.21 | 34.62 | 13.64 | 13.64 | 13.64 | 13.64 | 16.67 | 16.67 | 19.10 | 16.46 | 13.64 | 30.00 |
| CambridgeSTV | - | - | - | 3.41 | 3.52 | 3.42 | 17.56 | 9.40 | 2.99 | 14.66 | 12.06 | 32.26 | 1.96 | 9.40 | 71.43 |
| CofESTV | - | - | - | - | 1.22 | 1.37 | 20.46 | 14.09 | 1.57 | 18.60 | 15.77 | 38.60 | 6.90 | 13.89 | 69.98 |
| ERS76STV | - | - | - | - | - | 0.20 | 21.75 | 14.68 | 2.39 | 19.18 | 16.02 | 40.12 | 15.00 | 14.68 | 70.35 |
| ERS97STV | - | - | - | - | - | - | 20.07 | 13.23 | 2.59 | 18.53 | 15.60 | 36.80 | 5.00 | 13.23 | 69.79 |
| IRV | - | - | - | - | - | - | - | 23.16 | 19.37 | 29.36 | 26.23 | 24.81 | 5.00 | 23.53 | 73.76 |
| MeekSTV | - | - | - | - | - | - | - | - | 12.93 | 15.87 | 7.39 | 40.46 | 5.00 | 1.36 | 67.70 |
| NIrelandSTV | - | - | - | - | - | - | - | - | - | 19.20 | 15.86 | 35.91 | 5.00 | 12.76 | 70.84 |
| QPQe | - | - | - | - | - | - | - | - | - | - | 13.82 | 45.34 | 3.57 | 15.11 | 67.86 |
| QPQr | - | - | - | - | - | - | - | - | - | - | - | 43.01 | 3.57 | 8.58 | 66.04 |
| SNTV | - | - | - | - | - | - | - | - | - | - | - | - | 6.49 | 40.71 | 72.50 |
| SuppVote | - | - | - | - | - | - | - | - | - | - | - | - | - | 5.00 | 10.26 |
| WarrenSTV | - | - | - | - | - | - | - | - | - | - | - | - | - | - | 67.50 |
These results might seem surprising at first. For instance, BCSTV and SuppVote are very different, since the Supplementary Vote only applies to electing a single candidate. In fact, they are seen to be quite similar since only those elections for which results of both voting rules are available are compared - in this case, those for a single seat. In fact, 58 elections are compared and just two give a different result. The percentage difference is then 2/58=3.45%.
A key program is one which computes the information for the BLT_info table. This is written in Ada 95 and is available without restriction. The other programs are those that do counts for various rules. At the moment, these are as follows:
SELECT X.Rule, X.Program
FROM Result X
GROUP BY X.Rule;
+--------------+-----------------------+
| Rule | Program |
+--------------+-----------------------+
| BCSTV | pSTV: version 0.9 |
| Borda | pSTV: version 0.9 |
| Bucklin | pSTV: version 0.9 |
| CambridgeSTV | pSTV: version 0.9 |
| CofE | eSTV Reg. 12180,1.48f |
| Condorcet | pSTV: version 0.9 |
| Coombs | pSTV: version 0.9 |
| ERS76 | eSTV Reg. 12180,1.47a |
| ERS97STV | pSTV: version 0.9 |
| IRV | pSTV: version 0.9 |
| MeekSTV | pSTV: version 0.9 |
| NIrelandSTV | pSTV: version 0.9 |
| QPQe | Ada rule v0.04 |
| QPQr | Ada rule v0.04 |
| SNTV | pSTV: version 0.9 |
| SuppVote | pSTV: version 0.9 |
| WarrenSTV | pSTV: version 0.9 |
| XXvote | Ada rule v0.04 |
+--------------+-----------------------+
18 rows in set (0.08 sec)
The main related information are all the election data files: Xddd.BLT. These are two big to handle apart from writing a CD. Those that would like a copy for non-commercial purposes should contact Brian Wichmann.
In undertaking work to validate implementations of various STV counting rules, Brian Wichmann has used a `standard' format for conventional result sheets. This CSV format has proved very useful, but is not used here for two results: firstly, it is not really appropriate for some counting rules like Meek; secondly it is very detailed and would increase the size of the tables to store the result by more than a factor of ten and be very difficult to use.
Hence the situation of the moment is that you may use this database to discover that a specific election E gives a different result with rules X and Y. You would then need to repeat these two election counts and examine the output to discover the reason for this.
It should be straightforward to add the results from additional counting rules. However, the work involved is much reduced if the table output is produced directly, as we have done.
It would a great advance if more full disclosure elections were available (R or F class). The number of such elections is too small for many statistical tests.
When full disclosure takes place and further information is available (F class) then this additional information should be stored. This needs to be considered at a later date.
Within the confines of the existing system, it seems that very detailed analysis of specific cases would require re-running the appropriate counting software. Hence the main purpose of the database is to collect statistical information and identify cases worthy of further study.
At the moment, there is no version control built into the system. When in doubt, use the dates on the two main files. The intention is to make the system from this point onwards upward compatible. Hence if an error is found in the BLT file, that test would be deleted and the test ID not re-used. Although this database inherits a lot of material from the previous collection of BLT files, it is not upward compatible with it.
Currently, if a counting program has a missing result, the reason for this is not recorded. Sometimes, this is a capacity issue, as with David Hill's MS-DOS system (not used here). With the Cambridge rules all candidates are excluded with fewer than 50 votes after all surplus votes have been transferred.
At the moment, results from two implementations of the same rule are not stored in the results table. If this is done, then the program name must be used to discriminate cases, which makes running queries more awkward.
Many thanks to those that made all of this possible. Too many people have contributed over the years to the election database to list here. Thanks to our SQL consultant, David Wichmann.
A special thanks for those who have written counting programs which have been used to compute the result for the database. Currently, this is David Hill (not actually in this edition), and Joe Otten.
This database consists of this guide and two SQL tables. The two tables must be loaded into a MySql database and are available from SourceForge.
If you are using the SourceForge Internet version of this database, then the tables will have already been set up. Please do not change any of the tables.
The two tables are enclosed in an SQL script to make importing them easy. From the command line of your computer, enter
mysql < stvdb-1.2.sql
The SQL for each table are:
CREATE TABLE `BLT_info` (
`ID` varchar(4) default NULL,
`Title` varchar(50) default NULL,
`Candidates` int(11) default NULL,
`Seats` int(11) default NULL,
`Votes` int(11) default NULL,
`Invalid_Votes` int(11) default NULL,
`Total_Prefs` int(11) default NULL,
`Withdrawn_Candidates` int(11) default NULL,
`Zero_First` int(11) default NULL,
`No_Support` int(11) default NULL,
`Largest_Pile` int(11) default NULL,
`Smith_Set` varchar(100) default NULL,
`Single_Prefs` int(11) default NULL,
`Source` varchar(80) default NULL,
`Comment` varchar(255) default NULL,
`Extra_Doc` char(1) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE `Result` (
`ID` varchar(4) default NULL,
`Rule` varchar(15) default NULL,
`Elected` varchar(220) default NULL,
`Stages` int(11) default NULL,
`Random` int(11) default NULL,
`First` int(11) default NULL,
`Tie_Break` char(1) default NULL,
`Program` varchar(31) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
To implement an election using the single transferable vote, instant runoff voting, or other methods that use ranked ballots, the election administrator must (1) collect the ranked ballots from the voters and then (2) count the votes. OpenSTV counts votes but does not provide any services for collecting votes.
To collect ranked ballots, please consider the following:
The authors of OpenSTV would like to thank the following people for their much appreciated assistance:
OpenSTV depends on other open-source and/or free software:
Jeff is the founder of the OpenSTV project and its primary programmer. When not working on OpenSTV, Jeff is an intellectual property attorney at Wolf Greenfield in Boston. Jeff previously worked as a senior speech scientist writing speech recognition software, has a J.D. from Cornell Law School, a Ph.D. in electrical engineering from the University of Michigan, and a B.S. in electrical engineering from Cornell University. You can reach Jeff at jco8 at cornell.edu.
Selected publications:
Jonathan is the CTO at Resilience Corp in Mountain View, California. He joined the OpenSTV project after helping to implement internal STV elections for the Green Party of the United States and the Green Party of California.
Jonathan studied philosophy at New College of Florida ('66), but drifted into computer technology to pay the rent. He blogs occasionally at Pragmatos.
STV-related publications:
Brian is a Software Engineer who has retired from the National Physical
Laboratory. While at NPL, he worked on the Pascal standard and was responsible for the design of the numerics in the Ada programming language. He is currently Editor of Voting matters.
Selected publications:
Organizations Advocating for STV
Other STV Software
Other Links