Implement Australian Capital Territory STV
This commit is contained in:
parent
12635decec
commit
bea51611b0
@ -6,29 +6,29 @@ The preset dropdown allows you to choose from a hardcoded list of preloaded STV
|
||||
|
||||
<table>
|
||||
<tr><th>Method</th><th>Description</th><th>Exceptions</th><th>Validated against</th></tr>
|
||||
<tr><td>OpenTally WIGM</td><td>A recommended set of simple STV rules designed for computer counting, using the weighted inclusive Gregory method and rational arithmetic.</td><td></td><td></td></tr>
|
||||
<tr><td>OpenTally WIGM</td><td>Recommended set of simple STV rules designed for computer counting, using the weighted inclusive Gregory method and rational arithmetic.</td><td></td><td></td></tr>
|
||||
<tr><td>Scottish STV</td><td>Rules from the <a href="https://www.legislation.gov.uk/ssi/2011/399/schedule/1/made"><i>Scottish Local Government Elections Order 2011</i></a>, using the weighted inclusive Gregory method.</td><td></td><td><a href="https://web.archive.org/web/20121004213938/http://www.glasgow.gov.uk/en/YourCouncil/Elections_Voting/Election_Results/ElectionScotland2007/LGWardResults.htm?ward=1&wardname=1%20-%20Linn">2007 Linn ward local election</a> (eSTV 2.0.16)</td></tr>
|
||||
<tr><td>Meek STV</td><td>Advanced STV rules designed for computer counting, recognised by the Proportional Representation Society of Australia (Victoria–Tasmania) as the superior STV system.</td><td></td><td></td></tr>
|
||||
<tr><td>• OpenTally Meek</td><td>Operates according to the original 1987 Hill–Wichmann–Woodall <a href="https://www.dia.govt.nz/diawebsite.NSF/Files/meekm/%24file/meekm.pdf">‘Algorithm 123’</a> specification of Meek STV, except that (a) ties are broken backwards then at random, (b) fixed-point arithmetic with 5 decimal places is used, and (c) candidates are elected on strictly exceeding the quota.</td><td></td><td><a href="https://yingtongli.me/blog/2021/01/04/ers97.html">Ballot papers derived from the ERS97 model election</a> (Hill–Wichmann–Woodall implementation)</td></tr>
|
||||
<tr><td>• Meek STV (2006)</td><td>Operates according to <a href="http://www.votingmatters.org.uk/ISSUE22/I22P2.pdf">Hill's 2006 revisions</a>. This is the algorithm referred to in OpenSTV/OpaVote as ‘Meek STV’, and forms the basis of New Zealand's Meek STV rules.</td><td>[E1]</td><td><a href="https://yingtongli.me/blog/2021/01/04/ers97.html">Ballot papers derived from the ERS97 model election</a> (<a href="https://github.com/Conservatory/openstv">OpenSTV 1.7</a>)</td></tr>
|
||||
<tr><td>• Meek STV (New Zealand)</td><td>Operates according to Schedule 1A of the <a href="https://www.legislation.govt.nz/regulation/public/2001/0145/latest/DLM57125.html"><i>Local Electoral Regulations 2001</i></a>.</td><td>[E1]</td><td><a href="https://yingtongli.me/blog/2021/01/04/ers97.html">Ballot papers derived from the ERS97 model election</a> (OpenSTV 1.7, <a href="https://yingtongli.me/blog/2021/07/08/nzmeek.html">Hill's nzmeek 6.7.7</a>)</td></tr>
|
||||
<tr><td>• OpenTally Meek</td><td>Recommended rules for Meek STV. Operates according to the original 1987 Hill–Wichmann–Woodall <a href="https://www.dia.govt.nz/diawebsite.NSF/Files/meekm/%24file/meekm.pdf">‘Algorithm 123’</a> specification (<i>The Computer Journal</i> 1987;30(3):277–81), except that (a) ties are broken backwards then at random, (b) fixed-point arithmetic with 5 decimal places is used, and (c) candidates are elected on strictly exceeding the quota.</td><td></td><td><a href="https://yingtongli.me/blog/2021/01/04/ers97.html">Ballot papers derived from the ERS97 model election</a> (Algorithm 123)</td></tr>
|
||||
<tr><td>• Meek STV (2006)</td><td>Operates according to Hill's 2006 revisions (<a href="http://www.votingmatters.org.uk/ISSUE22/I22P2.pdf"><i>Voting Matters</i> 2006;(22):7–10</a>). This is the algorithm referred to in OpenSTV/OpaVote as ‘Meek STV’, and forms the basis of New Zealand's Meek STV rules.</td><td>[E1]</td><td>Ballot papers derived from the ERS97 model election (<a href="https://github.com/Conservatory/openstv">OpenSTV 1.7</a>)</td></tr>
|
||||
<tr><td>• Meek STV (New Zealand)</td><td>Operates according to Schedule 1A of the <a href="https://www.legislation.govt.nz/regulation/public/2001/0145/latest/DLM57125.html"><i>Local Electoral Regulations 2001</i></a>.</td><td>[E1]</td><td>Ballot papers derived from the ERS97 model election (OpenSTV 1.7, <a href="https://yingtongli.me/blog/2021/07/08/nzmeek.html">Hill's nzmeek 6.7.7</a>)</td></tr>
|
||||
<tr><td>Australian Senate STV</td><td>Rules from the <a href="https://www.legislation.gov.au/Details/C2020C00400/Html/Text#_Toc59107700"><i>Commonwealth Electoral Act 1918</i></a>, using the unweighted inclusive Gregory method.</td><td>[E2] [E3]</td><td><a href="https://results.aec.gov.au/24310/Website/SenateDownloadsMenu-24310-Csv.htm">2019 Tasmanian Senate election</a> (AEC EasyCount)</td></tr>
|
||||
<tr><td>Western Australia STV</td><td>Rules from the <a href="https://www.legislation.wa.gov.au/legislation/prod/filestore.nsf/FileURL/mrdoc_29498.pdf/$FILE/Electoral Act 1907 - [17-a0-06].pdf"><i>Electoral Act 1907</i> (WA)</a>, using the weighted inclusive Gregory method.</td><td>[E2] [E3]</td><td></td></tr>
|
||||
<tr><td>Australian Capital Territory STV</td><td>Rules from the <a href="https://www.legislation.act.gov.au/View/a/1992-71/current/PDF/1992-71.PDF"><i>Electoral Act 1992</i> (ACT)</a>, using the exclusive Gregory method.</td><td></td><td><a href="https://www.elections.act.gov.au/elections_and_voting/2020_legislative_assembly_election/ballot-paper-preference-data-2020-election">2020 Kurrajong territory election</a> (eVACS 2016)</td></tr>
|
||||
<tr><td><a href="https://www.aph.gov.au/Parliamentary_Business/Committees/House_of_Representatives_Committees?url=em/elect07/subs/sub051.1.pdf">Wright STV</a></td><td>Rules proposed by Anthony van der Craats designed for computer counting, involving reset and re-iteration of the count after each candidate exclusion.</td><td></td><td><a href="https://www.eveonline.com/news/view/meet-the-new-council">EVE Online CSM 15 election</a> (<a href="https://github.com/ccpgames/ccp-wright-stv">EVE reference implementation</a>)</td></tr>
|
||||
<tr><td><a href="https://www.prsa.org.au/rule1977.htm">PRSA 1977</a></td><td>Simple rules designed for hand counting, using the exclusive Gregory method, with counting performed in thousandths of a vote.</td><td></td><td><a href="https://www.prsa.org.au/example1.pdf">Example 1</a> of the PRSA's <a href="https://www.prsa.org.au/publicat.htm#p2"><i>Proportional Representation Manual</i></a></td></tr>
|
||||
<tr><td><a href="https://www.electoral-reform.org.uk/latest-news-and-research/publications/how-to-conduct-an-election-by-the-single-transferable-vote-3rd-edition/">ERS97</a></td><td>More complex rules designed for hand counting, using the exclusive Gregory method.</td><td></td><td><a href="https://yingtongli.me/blog/2021/01/04/ers97.html">Ballot papers derived from the ERS97 model election</a></td></tr>
|
||||
<tr><td><a href="https://www.electoral-reform.org.uk/latest-news-and-research/publications/how-to-conduct-an-election-by-the-single-transferable-vote-3rd-edition/">ERS97</a></td><td>More complex rules designed for hand counting, using the exclusive Gregory method.</td><td></td><td>Ballot papers derived from the ERS97 model election</td></tr>
|
||||
<tr><td>• ERS76</td><td>Former rules from the 1976 2nd edition.</td><td>[E4]</td><td></td></tr>
|
||||
<tr><td>• ERS73</td><td>Former rules from the 1973 1st edition.</td><td>[E4]</td><td></td></tr>
|
||||
<tr><td>Church of England</td><td>Rules from the Church of England <a href="https://www.churchofengland.org/sites/default/files/2020-02/STV Rules 2020 - final.pdf"><i>Single Transferable Vote Rules 2020</i></a>, similar to ERS73.</td><td></td><td></td></tr>
|
||||
</table>
|
||||
|
||||
[E1]: When generating random numbers, OpenTally uses a [deterministic random number generator based on SHA-256](rng.md), rather than the Wichmann–Hill(-based) algorithm.
|
||||
Exceptions:
|
||||
|
||||
[E2]: When breaking ties forwards/backwards, OpenTally selects the candidate who had more/fewer votes at the first/last stage when *any* tied candidate had more/fewer votes than the others, rather than when each all had unequal votes.
|
||||
|
||||
[E3]: A tie between 2 candidates for the final vacancy will be broken backwards then at random, rather than the method described in the legislation.
|
||||
|
||||
[E4]: The quota is always calculated to 2 decimal places. For full ERS76 (ERS73) compliance, set *Round quota to 0 d.p.* when the quota is more than 100 (100 or more).
|
||||
* [E1] When generating random numbers, OpenTally uses a [deterministic random number generator based on SHA-256](rng.md), rather than the Wichmann–Hill(-based) algorithm.
|
||||
* [E2] When breaking ties forwards/backwards, OpenTally selects the candidate who had more/fewer votes at the first/last stage when *any* tied candidate had more/fewer votes than the others, rather than the method described in the legislation (when each all had unequal votes). The OpenTally developers regard the method described in the legislation as a defect. For an independent discussion, see <a href="https://dl.acm.org/doi/10.1145/3014812.3014837">Conway et al.</a>
|
||||
* [E3] A tie between 2 candidates for the final vacancy will be broken backwards then at random, rather than the method described in the legislation.
|
||||
* [E4] The quota is always calculated to 2 decimal places. For full ERS76 (ERS73) compliance, set *Round quota to 0 d.p.* when the quota is more than 100 (100 or more).
|
||||
|
||||
This functionality is not available on the command line.
|
||||
|
||||
@ -134,7 +134,7 @@ This file selector allows you to load a [CON file](con.md) specifying constraint
|
||||
|
||||
OpenTally applies constraints using the Grey–Fitzgerald method. Whenever a candidate is declared elected or excluded, any candidate who must be elected to secure a conformant result is deemed *guarded*, and any candidate who must not be elected to secure a conformant result is deemed *doomed*. Any candidate who is doomed is excluded at the next opportunity. Any candidate who is guarded is prevented from being excluded.
|
||||
|
||||
Multiple constraints are supported using the method described by Hill ([*Voting Matters* 1998;9(1):2–4](http://www.votingmatters.org.uk/ISSUE9/P1.HTM)) and Otten ([*Voting Matters* 2001;13(3):4–7](http://www.votingmatters.org.uk/ISSUE13/P3.HTM)).
|
||||
Multiple constraints are supported using the method described by Hill ([*Voting Matters* 1998;(9):2–4](http://www.votingmatters.org.uk/ISSUE9/P1.HTM)) and Otten ([*Voting Matters* 2001;(13):4–7](http://www.votingmatters.org.uk/ISSUE13/P3.HTM)).
|
||||
|
||||
## Numeric representation
|
||||
|
||||
|
@ -45,6 +45,7 @@
|
||||
<option value="meeknz">Meek STV (New Zealand)</option>
|
||||
<option value="senate">Australian Senate STV</option>
|
||||
<option value="wa">Western Australia STV</option>
|
||||
<option value="act">Australian Capital Territory STV</option>
|
||||
<option value="wright">Wright STV</option>
|
||||
<option value="prsa77">PRSA 1977</option>
|
||||
<option value="ers97">ERS97</option>
|
||||
|
@ -508,6 +508,28 @@ function changePreset() {
|
||||
document.getElementById('selPapers').value = 'both';
|
||||
document.getElementById('selExclusion').value = 'by_source';
|
||||
document.getElementById('selTies').value = 'backwards,random';
|
||||
} else if (document.getElementById('selPreset').value === 'act') {
|
||||
document.getElementById('selQuotaCriterion').value = 'geq';
|
||||
document.getElementById('selQuota').value = 'droop';
|
||||
document.getElementById('selQuotaMode').value = 'static';
|
||||
document.getElementById('chkBulkElection').checked = false;
|
||||
document.getElementById('chkBulkExclusion').checked = false;
|
||||
document.getElementById('chkDeferSurpluses').checked = false;
|
||||
document.getElementById('selNumbers').value = 'rational';
|
||||
document.getElementById('txtPPDP').value = '2';
|
||||
document.getElementById('chkNormaliseBallots').checked = false;
|
||||
document.getElementById('chkRoundQuota').checked = true;
|
||||
document.getElementById('txtRoundQuota').value = '0';
|
||||
document.getElementById('chkRoundVotes').checked = true;
|
||||
document.getElementById('txtRoundVotes').value = '6';
|
||||
document.getElementById('chkRoundTVs').checked = false;
|
||||
document.getElementById('chkRoundWeights').checked = false;
|
||||
document.getElementById('selSumTransfers').value = 'single_step';
|
||||
document.getElementById('selSurplus').value = 'by_order';
|
||||
document.getElementById('selTransfers').value = 'eg';
|
||||
document.getElementById('selPapers').value = 'transferable';
|
||||
document.getElementById('selExclusion').value = 'by_value';
|
||||
document.getElementById('selTies').value = 'backwards,random';
|
||||
} else if (document.getElementById('selPreset').value === 'wright') {
|
||||
document.getElementById('selQuotaCriterion').value = 'geq';
|
||||
document.getElementById('selQuota').value = 'droop';
|
||||
|
@ -29,12 +29,12 @@ static mut FACTOR: Option<IBig> = None;
|
||||
|
||||
#[inline]
|
||||
pub fn get_dps() -> usize {
|
||||
unsafe { DPS.unwrap() }
|
||||
unsafe { DPS.expect("Attempted Fixed arithmetic before dps set") }
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn get_factor() -> &'static IBig {
|
||||
unsafe { FACTOR.as_ref().unwrap() }
|
||||
unsafe { FACTOR.as_ref().expect("Attempted Fixed arithmetic before dps set") }
|
||||
}
|
||||
|
||||
/// Fixed-point number
|
||||
|
@ -30,17 +30,17 @@ static mut FACTOR_CMP: Option<IBig> = None;
|
||||
|
||||
#[inline]
|
||||
pub fn get_dps() -> usize {
|
||||
unsafe { DPS.unwrap() }
|
||||
unsafe { DPS.expect("Attempted GuardedFixed arithmetic before dps set") }
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn get_factor() -> &'static IBig {
|
||||
unsafe { FACTOR.as_ref().unwrap() }
|
||||
unsafe { FACTOR.as_ref().expect("Attempted GuardedFixed arithmetic before dps set") }
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn get_factor_cmp() -> &'static IBig {
|
||||
unsafe { FACTOR_CMP.as_ref().unwrap() }
|
||||
unsafe { FACTOR_CMP.as_ref().expect("Attempted GuardedFixed arithmetic before dps set") }
|
||||
}
|
||||
|
||||
/// Guarded fixed-point number
|
||||
|
51
tests/act.rs
Normal file
51
tests/act.rs
Normal file
@ -0,0 +1,51 @@
|
||||
/* OpenTally: Open-source election vote counting
|
||||
* Copyright © 2021 Lee Yingtong Li (RunasSudo)
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
mod utils;
|
||||
|
||||
use opentally::numbers::Rational;
|
||||
use opentally::stv;
|
||||
|
||||
#[test]
|
||||
fn act_kurrajong20_rational() {
|
||||
let stv_opts = stv::STVOptions {
|
||||
round_tvs: None,
|
||||
round_weights: None,
|
||||
round_votes: Some(6),
|
||||
round_quota: Some(0),
|
||||
sum_surplus_transfers: stv::SumSurplusTransfersMode::SingleStep,
|
||||
meek_surplus_tolerance: String::new(),
|
||||
normalise_ballots: false,
|
||||
quota: stv::QuotaType::Droop,
|
||||
quota_criterion: stv::QuotaCriterion::GreaterOrEqual,
|
||||
quota_mode: stv::QuotaMode::Static,
|
||||
ties: vec![],
|
||||
surplus: stv::SurplusMethod::EG,
|
||||
surplus_order: stv::SurplusOrder::ByOrder,
|
||||
transferable_only: true,
|
||||
exclusion: stv::ExclusionMethod::ByValue,
|
||||
meek_nz_exclusion: false,
|
||||
early_bulk_elect: false,
|
||||
bulk_exclude: false,
|
||||
defer_surpluses: false,
|
||||
meek_immediate_elect: false,
|
||||
constraints_path: None,
|
||||
constraint_mode: stv::ConstraintMode::GuardDoom,
|
||||
pp_decimals: 2,
|
||||
};
|
||||
utils::read_validate_election::<Rational>("tests/data/ACT2020Kurrajong.csv", "tests/data/ACT2020Kurrajong.blt", stv_opts, Some(6), &["exhausted", "lbf"]);
|
||||
}
|
30242
tests/data/ACT2020Kurrajong.blt
Normal file
30242
tests/data/ACT2020Kurrajong.blt
Normal file
File diff suppressed because it is too large
Load Diff
32
tests/data/ACT2020Kurrajong.csv
Normal file
32
tests/data/ACT2020Kurrajong.csv
Normal file
@ -0,0 +1,32 @@
|
||||
Stage:,1,,2,,3,,4,,5,,6,,7,,8,,9,,10,,11,,12,,13,,14,,15,,16,,17,,18,,19,,20,,21,,22,,23,,24,,25,,26,,27,,28,,29,,30,,31,,32,,33,,34,,35,,36,,37,,38,,39,,40,,41,,42,,43,,44,,45,,46,,47,,48,,49,,50,,51,,52,,53,,54,,55,,56,,57,
|
||||
Comment:,First preferences,,"Surplus of BARR, Andrew",,"Exclusion of WILLIAMS, Robyn",,"Exclusion of WILLIAMS, Robyn",,"Exclusion of HOPPER, Alvin",,"Exclusion of HOPPER, Alvin",,"Exclusion of JOHNSON, Petar",,"Exclusion of JOHNSON, Petar",,"Exclusion of DAMIANO, Marilena",,"Exclusion of DAMIANO, Marilena",,"Exclusion of FORNER, Sophia",,"Exclusion of FORNER, Sophia",,"Exclusion of RUTLEDGE-PRIOR, Serrin",,"Exclusion of RUTLEDGE-PRIOR, Serrin",,"Exclusion of HAYDON, John",,"Exclusion of HAYDON, John",,"Exclusion of O'HARA, Alix",,"Exclusion of O'HARA, Alix",,"Exclusion of BRYANT, Peta Anne",,"Exclusion of BRYANT, Peta Anne",,"Exclusion of SMITH, Julie",,"Exclusion of SMITH, Julie",,"Exclusion of ANGEL, Joy",,"Exclusion of ANGEL, Joy",,"Exclusion of GUMBER, Rattesh",,"Exclusion of GUMBER, Rattesh",,"Exclusion of BREWER, Michael",,"Exclusion of BREWER, Michael",,"Exclusion of PAINE, Bruce",,"Exclusion of PAINE, Bruce",,"Exclusion of FAULKNER, Therese",,"Exclusion of FAULKNER, Therese",,"Exclusion of BOISEN, Adriana",,"Exclusion of BOISEN, Adriana",,"Exclusion of ANDERSON, Judy",,"Exclusion of ANDERSON, Judy",,"Exclusion of JOHNSON, Robert",,"Exclusion of JOHNSON, Robert",,"Exclusion of BOHM, Tim",,"Exclusion of BOHM, Tim",,"Surplus of RATTENBURY, Shane",,"Exclusion of INGRAM, Jacob",,"Exclusion of INGRAM, Jacob",,"Exclusion of INGRAM, Jacob",,"Exclusion of PENTONY, Patrick",,"Exclusion of PENTONY, Patrick",,"Exclusion of PENTONY, Patrick",,"Exclusion of NORTHAM, Maddy",,"Exclusion of NORTHAM, Maddy",,"Exclusion of NORTHAM, Maddy",,"Surplus of STEPHEN-SMITH, Rachel",,"Exclusion of BURCH, Candice",,"Exclusion of BURCH, Candice",,"Exclusion of BURCH, Candice",,"Exclusion of BURCH, Candice",,"Surplus of LEE, Elizabeth",,Bulk election,
|
||||
"BOISEN, Adriana",1250,H,1277.386971,H,1277.386971,H,1277.386971,H,1282.386971,H,1282.386971,H,1287.386971,H,1288.12055,H,1292.12055,H,1292.365076,H,1300.365076,H,1300.365076,H,1304.365076,H,1304.609602,H,1313.609602,H,1314.098655,H,1330.098655,H,1330.587708,H,1359.587708,H,1359.587708,H,1401.587708,H,1403.54392,H,1445.54392,H,1446.032973,H,1460.032973,H,1461.011079,H,1686.011079,H,1689.678977,H,1721.678977,H,1722.16803,H,1776.16803,H,1776.901609,H,37.901609,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX
|
||||
"BREWER, Michael",904,H,930.408865,H,931.408865,H,931.897918,H,934.897918,H,934.897918,H,934.897918,H,934.897918,H,938.897918,H,938.897918,H,951.897918,H,952.142444,H,960.142444,H,960.142444,H,967.142444,H,967.631497,H,981.631497,H,982.12055,H,997.12055,H,997.609603,H,1027.609603,H,1027.854129,H,1066.854129,H,1068.076761,H,1071.076761,H,1071.076761,H,30.076761,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX
|
||||
"RATTENBURY, Shane",6388,H,6703.439228,H,6704.439228,H,6704.928281,H,6711.928281,H,6712.417334,H,6718.417334,H,6718.906387,H,6724.906387,H,6725.150913,H,6735.150913,H,6735.884492,H,6748.884492,H,6749.862598,H,6761.862598,H,6763.08523,H,6819.08523,H,6822.753128,H,6853.753128,H,6854.242181,H,6946.242181,H,6948.442919,H,7020.442919,H,7023.13271,H,7034.13271,H,7034.621763,H,7298.621763,H,7302.534187,H,7373.534187,H,7374.756819,H,7487.756819,H,7490.935663,H,7978.935663,H,7985.293352,H,8078.293352,H,8097.121895,H,8133.121895,H,8134.83358,H,8728.83358,EL,8728.83358,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL
|
||||
"VASSAROTTI, Rebecca",3093,H,3142.394359,H,3143.394359,H,3143.394359,H,3150.394359,H,3150.394359,H,3151.394359,H,3151.394359,H,3157.394359,H,3157.394359,H,3174.394359,H,3175.861518,H,3186.861518,H,3187.106044,H,3194.106044,H,3194.35057,H,3220.35057,H,3220.839623,H,3254.839623,H,3255.084149,H,3337.084149,H,3339.040361,H,3426.040361,H,3427.50752,H,3432.50752,H,3432.752046,H,3729.752046,H,3732.686364,H,3783.686364,H,3785.398049,H,3949.398049,H,3951.598787,H,4800.598787,H,4810.135321,H,4906.135321,H,4915.182802,H,4941.182802,H,4941.427328,H,5552.427328,H,5555.606172,H,5780.295592,H,6028.295592,H,6031.717258,H,6063.99476,H,6167.99476,H,6167.99476,H,6170.684551,H,6636.684551,H,6643.527883,H,6848.685644,H,7343.315104,H,7466.315104,H,7467.455659,H,7479.485935,H,7487.066257,H,8013.066257,H,8013.066257,EL
|
||||
"HAYDON, John",365,H,370.379583,H,370.379583,H,370.868636,H,380.868636,H,381.113162,H,391.113162,H,392.091268,H,392.091268,H,392.091268,H,396.091268,H,396.091268,H,399.091268,H,399.091268,H,7.091268,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX
|
||||
"ANGEL, Joy",435,H,440.868636,H,442.868636,H,443.357689,H,450.357689,H,450.602215,H,452.602215,H,452.602215,H,458.602215,H,458.602215,H,477.602215,H,478.580321,H,495.580321,H,495.580321,H,746.580321,H,748.292006,H,812.292006,H,813.514638,H,825.514638,H,825.514638,H,934.514638,H,936.226323,H,12.226323,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX
|
||||
"GUMBER, Rattesh",929,H,934.379583,H,934.379583,H,934.379583,H,935.379583,H,935.868636,H,935.868636,H,935.868636,H,936.868636,H,936.868636,H,937.868636,H,937.868636,H,937.868636,H,937.868636,H,942.868636,H,942.868636,H,946.868636,H,946.868636,H,949.868636,H,950.357689,H,958.357689,H,958.602215,H,969.602215,H,969.602215,H,6.602215,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX
|
||||
"BURCH, Candice",3978,H,4011.255608,H,4012.255608,H,4012.500134,H,4021.500134,H,4021.500134,H,4022.500134,H,4022.74466,H,4025.74466,H,4025.74466,H,4028.74466,H,4028.989186,H,4035.989186,H,4035.989186,H,4039.989186,H,4039.989186,H,4044.989186,H,4045.722765,H,4046.722765,H,4047.211818,H,4073.211818,H,4073.700871,H,4116.700871,H,4116.700871,H,4336.700871,H,4337.189924,H,4373.189924,H,4374.16803,H,4431.16803,H,4431.412556,H,4455.412556,H,4455.901609,H,4476.901609,H,4478.368768,H,4545.368768,H,4548.058559,H,5049.058559,H,5050.525718,H,5198.525718,H,5199.503824,H,5204.066045,H,5254.066045,H,5254.636322,H,5265.884542,H,6810.884542,H,6810.884542,H,6816.997705,H,6902.997705,H,6903.567982,H,6914.082622,H,6936.292363,H,100.292363,EX,,EX,,EX,0,EX,0,EX,0,EX
|
||||
"LEE, Elizabeth",5040,H,5102.843319,H,5107.843319,H,5108.087845,H,5114.087845,H,5114.087845,H,5116.087845,H,5116.087845,H,5125.087845,H,5125.332371,H,5129.332371,H,5129.576897,H,5131.576897,H,5131.576897,H,5141.576897,H,5141.576897,H,5153.576897,H,5154.06595,H,5161.06595,H,5161.310476,H,5191.310476,H,5192.288582,H,5241.288582,H,5242.022161,H,5471.022161,H,5471.75574,H,5487.75574,H,5488.244793,H,5573.244793,H,5573.733846,H,5595.733846,H,5596.467425,H,5623.467425,H,5623.956478,H,5658.956478,H,5664.825114,H,6265.825114,H,6266.80322,H,6474.80322,H,6477.982064,H,6485.965952,H,6573.965952,H,6573.965952,H,6588.14849,H,8099.14849,H,8099.14849,H,8104.528073,H,8205.528073,H,8205.528073,H,8231.692412,H,8264.081618,H,14074.081618,EL,14074.081618,EL,14074.081618,EL,14074.081618,EL,8434,EL,8434,EL
|
||||
"PENTONY, Patrick",2384,H,2402.584016,H,2402.584016,H,2402.584016,H,2406.584016,H,2406.584016,H,2407.584016,H,2407.584016,H,2409.584016,H,2409.828542,H,2411.828542,H,2411.828542,H,2412.828542,H,2413.073068,H,2415.073068,H,2415.073068,H,2416.073068,H,2416.317594,H,2418.317594,H,2418.806647,H,2425.806647,H,2426.051173,H,2446.051173,H,2446.051173,H,2645.051173,H,2645.540226,H,2658.540226,H,2659.029279,H,2708.029279,H,2708.029279,H,2715.029279,H,2715.273805,H,2722.273805,H,2722.518331,H,2739.518331,H,2740.496437,H,3338.496437,H,3339.963596,H,3445.963596,H,3446.208122,H,3447.348677,H,3525.348677,H,3525.348677,H,3532.684473,H,32.684473,EX,31.543918,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX
|
||||
"JOHNSON, Robert",1628,H,1640.715379,H,1640.715379,H,1640.715379,H,1644.715379,H,1644.715379,H,1644.715379,H,1644.715379,H,1647.715379,H,1647.715379,H,1650.715379,H,1651.204432,H,1653.204432,H,1653.204432,H,1658.204432,H,1658.693485,H,1665.693485,H,1665.693485,H,1667.693485,H,1667.693485,H,1675.693485,H,1675.938011,H,1699.938011,H,1699.938011,H,1890.938011,H,1890.938011,H,1913.938011,H,1914.67159,H,1956.67159,H,1956.916116,H,1965.916116,H,1965.916116,H,1984.916116,H,1985.405169,H,2001.405169,H,2003.850434,H,17.850434,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX
|
||||
"HOPPER, Alvin",108,H,109.467159,H,149.467159,H,149.467159,H,1.467159,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX
|
||||
"WILLIAMS, Robyn",75,H,79.156951,H,4.156951,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX
|
||||
"STEPHEN-SMITH, Rachel",2786,H,3708.354085,H,3709.354085,H,3709.354085,H,3717.354085,H,3717.354085,H,3723.354085,H,3723.598611,H,3725.598611,H,3725.843137,H,3731.843137,H,3732.33219,H,3734.33219,H,3734.33219,H,3745.33219,H,3745.576716,H,3748.576716,H,3750.288401,H,3755.288401,H,3756.02198,H,3782.02198,H,3783.489139,H,3806.489139,H,3807.467245,H,3838.467245,H,3838.711771,H,3851.711771,H,3853.667983,H,3893.667983,H,3894.890615,H,3952.890615,H,3953.868721,H,4050.868721,H,4056.981884,H,4559.981884,H,4669.285244,H,4692.285244,H,4694.485982,H,4923.485982,H,4928.865565,H,4960.230839,H,5936.230839,H,5938.511949,H,6214.582405,H,6270.582405,H,6270.582405,H,6275.228409,H,8983.228409,EL,8983.228409,EL,8983.228409,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL
|
||||
"ANDERSON, Judy",1371,H,1655.384358,H,1657.384358,H,1657.384358,H,1658.384358,H,1658.384358,H,1659.384358,H,1660.117937,H,1660.117937,H,1660.362463,H,1667.362463,H,1667.362463,H,1676.362463,H,1676.851516,H,1677.851516,H,1678.096042,H,1681.096042,H,1681.829621,H,1687.829621,H,1687.829621,H,1708.829621,H,1709.318674,H,1717.318674,H,1718.29678,H,1725.29678,H,1726.030359,H,1765.030359,H,1769.431836,H,1793.431836,H,1793.920889,H,1827.920889,H,1829.388048,H,1862.388048,H,1865.077839,H,298.077839,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX
|
||||
"BARR, Andrew",11148,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL,8434,EL
|
||||
"INGRAM, Jacob",1736,H,2226.031173,H,2228.031173,H,2228.520226,H,2231.520226,H,2231.520226,H,2232.520226,H,2232.764752,H,2233.764752,H,2233.764752,H,2238.764752,H,2239.742858,H,2243.742858,H,2243.742858,H,2249.742858,H,2250.231911,H,2262.231911,H,2263.454543,H,2268.454543,H,2268.943596,H,2286.943596,H,2287.921702,H,2312.921702,H,2313.166228,H,2327.166228,H,2328.144334,H,2347.144334,H,2350.567705,H,2378.567705,H,2379.301284,H,2402.301284,H,2403.034863,H,2430.034863,H,2432.235601,H,2757.235601,H,2827.170189,H,2860.170189,H,2863.104507,H,3038.104507,H,3042.750511,H,3056.437176,H,594.437176,EX,580.750511,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX
|
||||
"NORTHAM, Maddy",2172,H,2529.497792,H,2530.497792,H,2530.497792,H,2533.497792,H,2533.497792,H,2535.497792,H,2535.742318,H,2542.742318,H,2542.986844,H,2543.986844,H,2545.209476,H,2547.209476,H,2547.698529,H,2548.698529,H,2548.943055,H,2559.943055,H,2560.676634,H,2571.676634,H,2571.92116,H,2601.92116,H,2602.410213,H,2636.410213,H,2637.388319,H,2644.388319,H,2644.388319,H,2675.388319,H,2677.833584,H,2705.833584,H,2707.056216,H,2744.056216,H,2745.278848,H,2815.278848,H,2818.213166,H,3142.213166,H,3214.59302,H,3276.59302,H,3278.549232,H,3441.549232,H,3445.950709,H,3457.356263,H,4278.356263,H,4282.348207,H,4494.108185,H,4539.108185,H,4539.108185,H,4542.531556,H,679.531556,EX,664.134058,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX
|
||||
"JOHNSON, Petar",156,H,164.313902,H,164.313902,H,164.313902,H,166.313902,H,166.313902,H,8.313902,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX
|
||||
"FORNER, Sophia",209,H,218.781061,H,220.781061,H,220.781061,H,220.781061,H,220.781061,H,255.781061,H,256.270114,H,260.270114,H,260.270114,H,10.270114,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX
|
||||
"O'HARA, Alix",195,H,208.448959,H,209.448959,H,209.448959,H,211.448959,H,211.448959,H,270.448959,H,272.160644,H,275.160644,H,275.160644,H,393.160644,H,394.383276,H,399.383276,H,399.872329,H,407.872329,H,408.116855,H,17.116855,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX
|
||||
"BRYANT, Peta Anne",472,H,475.178844,H,475.178844,H,475.42337,H,485.42337,H,485.42337,H,489.42337,H,490.156949,H,500.156949,H,500.156949,H,501.156949,H,501.401475,H,504.401475,H,504.890528,H,514.890528,H,514.890528,H,536.890528,H,537.135054,H,5.135054,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX
|
||||
"FAULKNER, Therese",901,H,912.003694,H,914.003694,H,914.737273,H,922.737273,H,922.737273,H,927.737273,H,928.470852,H,938.470852,H,938.470852,H,945.470852,H,945.715378,H,966.715378,H,966.715378,H,972.715378,H,972.959904,H,988.959904,H,989.448957,H,1180.448957,H,1180.93801,H,1221.93801,H,1222.182536,H,1312.182536,H,1313.160642,H,1319.160642,H,1319.405168,H,1344.405168,H,1345.872327,H,1493.872327,H,1494.36138,H,17.36138,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX
|
||||
"BOHM, Tim",1173,H,1192.317596,H,1195.317596,H,1195.562122,H,1208.562122,H,1208.562122,H,1212.562122,H,1212.562122,H,1225.562122,H,1225.562122,H,1230.562122,H,1230.806648,H,1257.806648,H,1258.540227,H,1267.540227,H,1267.540227,H,1299.540227,H,1300.273806,H,1440.273806,H,1440.273806,H,1491.273806,H,1492.740965,H,1581.740965,H,1581.740965,H,1585.740965,H,1585.740965,H,1598.740965,H,1599.474544,H,1897.474544,H,1898.45265,H,2743.45265,H,2745.408862,H,2777.408862,H,2777.408862,H,2807.408862,H,2809.365074,H,2837.365074,H,2838.098653,H,29.098653,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX
|
||||
"SMITH, Julie",447,H,457.270114,H,460.270114,H,460.270114,H,462.270114,H,462.270114,H,465.270114,H,466.003693,H,472.003693,H,472.003693,H,480.003693,H,481.226325,H,682.226325,H,683.93801,H,696.93801,H,697.182536,H,749.182536,H,751.627801,H,777.627801,H,777.872327,H,16.872327,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX
|
||||
"RUTLEDGE-PRIOR, Serrin",343,H,349.113163,H,349.113163,H,349.113163,H,352.113163,H,352.113163,H,353.113163,H,353.113163,H,359.113163,H,359.113163,H,365.113163,H,365.113163,H,6.113163,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX
|
||||
"PAINE, Bruce",693,H,699.602216,H,701.602216,H,701.602216,H,725.602216,H,725.602216,H,731.602216,H,731.602216,H,851.602216,H,853.313901,H,854.313901,H,854.313901,H,871.313901,H,871.313901,H,883.313901,H,883.802954,H,901.802954,H,902.292007,H,914.292007,H,914.292007,H,982.292007,H,982.78106,H,1106.78106,H,1106.78106,H,1115.78106,H,1116.025586,H,1117.025586,H,1118.003692,H,11.003692,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX
|
||||
"DAMIANO, Marilena",221,H,224.423371,H,227.423371,H,227.423371,H,230.423371,H,230.423371,H,232.423371,H,232.423371,H,3.423371,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX,0,EX
|
||||
Exhausted,0,,0,,2,,2,,5,,5,,6,,6,,9,,9,,10,,10,,10,,10,,13,,13,,30,,30.489053,,30.489053,,30.489053,,102.489053,,103.467159,,247.467159,,248.934318,,261.934318,,262.667897,,288.667897,,290.135056,,444.135056,,445.602215,,532.602215,,536.025586,,605.025586,,610.405169,,671.405169,,676.051173,,754.051173,,758.208124,,1333.208124,,1340.299393,,1340.299393,,1541.299393,,1544.721059,,1572.597083,,1811.597083,,1812.737638,,1822.029646,,2324.029646,,2332.013534,,2754.310858,,2754.310858,,3657.310858,,3661.873079,,3672.052544,,3736.852075,,8850.933693,,8850.933693,
|
||||
Loss by fraction,0,,0.000015,,0.000015,,0.000018,,0.000018,,0.000019,,0.000019,,0.000025,,0.000025,,0.000029,,0.000029,,0.000035,,0.000035,,0.000038,,0.000038,,0.000042,,0.000042,,0.000046,,0.000046,,0.000046,,0.000046,,0.000048,,0.000048,,0.000048,,0.000048,,0.000051,,0.000051,,0.000053,,0.000053,,0.000056,,0.000056,,0.000058,,0.000058,,0.00006,,0.00006,,0.000059,,0.000059,,0.00006,,0.00006,,0.00006,,0.000063,,0.000063,,0.000065,,0.000062,,0.000062,,0.000062,,0.00006,,0.00006,,0.000061,,0.000055,,0.000057,,0.000057,,,,,,0.00005,,0.00005,,0.00005,
|
|
BIN
tests/data/ACT2020Kurrajong.ods
Normal file
BIN
tests/data/ACT2020Kurrajong.ods
Normal file
Binary file not shown.
@ -88,11 +88,11 @@ where
|
||||
assert_eq!(stv::count_one_stage(&mut state, &stv_opts).unwrap(), false);
|
||||
stage_num += 1;
|
||||
}
|
||||
validate_stage(idx, &state, &records, cmp_dps, sum_rows);
|
||||
validate_stage(idx, stage_num, &state, &records, cmp_dps, sum_rows);
|
||||
}
|
||||
}
|
||||
|
||||
fn validate_stage<N: Number>(idx: usize, state: &CountState<N>, records: &Vec<StringRecord>, cmp_dps: Option<usize>, sum_rows: &[&str])
|
||||
fn validate_stage<N: Number>(idx: usize, stage_num: usize, state: &CountState<N>, records: &Vec<StringRecord>, cmp_dps: Option<usize>, sum_rows: &[&str])
|
||||
where
|
||||
for<'r> &'r N: ops::Add<&'r N, Output=N>,
|
||||
{
|
||||
@ -109,31 +109,30 @@ where
|
||||
.map(|r| if r[idx*2 + 1].len() > 0 { Some(N::parse(&r[idx*2 + 1])) } else { None })
|
||||
.collect();
|
||||
|
||||
// Validate candidate votes
|
||||
for (candidate, votes) in state.election.candidates.iter().zip(candidate_votes.iter()) {
|
||||
let count_card = state.candidates.get(candidate).unwrap();
|
||||
if votes.is_some() {
|
||||
approx_eq(&count_card.votes, votes.as_ref().unwrap(), cmp_dps, stage_num, &format!("votes for candidate {}", candidate.name));
|
||||
}
|
||||
}
|
||||
|
||||
// Validate exhausted/LBF
|
||||
for kind in sum_rows.iter().rev() {
|
||||
let votes = candidate_votes.pop().unwrap_or(None);
|
||||
if let Some(votes) = votes {
|
||||
match kind {
|
||||
&"exhausted" => approx_eq(&state.exhausted.votes, &votes, cmp_dps, idx, "exhausted votes"),
|
||||
&"lbf" => approx_eq(&state.loss_fraction.votes, &votes, cmp_dps, idx, "LBF"),
|
||||
&"nt" => approx_eq(&(&state.exhausted.votes + &state.loss_fraction.votes), &votes, cmp_dps, idx, "NTs"),
|
||||
&"quota" => approx_eq(state.quota.as_ref().unwrap(), &votes, cmp_dps, idx, "quota"),
|
||||
//&"vre" => approx_eq(state.vote_required_election.as_ref().unwrap(), &votes, cmp_dps, idx, "VRE"),
|
||||
&"vre" => approx_eq(state.vote_required_election.as_ref().unwrap(), &votes, Some(2), idx, "VRE"),
|
||||
&"exhausted" => approx_eq(&state.exhausted.votes, &votes, cmp_dps, stage_num, "exhausted votes"),
|
||||
&"lbf" => approx_eq(&state.loss_fraction.votes, &votes, cmp_dps, stage_num, "LBF"),
|
||||
&"nt" => approx_eq(&(&state.exhausted.votes + &state.loss_fraction.votes), &votes, cmp_dps, stage_num, "NTs"),
|
||||
&"quota" => approx_eq(state.quota.as_ref().unwrap(), &votes, cmp_dps, stage_num, "quota"),
|
||||
//&"vre" => approx_eq(state.vote_required_election.as_ref().unwrap(), &votes, cmp_dps, stage_num, "VRE"),
|
||||
&"vre" => approx_eq(state.vote_required_election.as_ref().unwrap(), &votes, Some(2), stage_num, "VRE"),
|
||||
_ => panic!("Unknown sum_rows"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Validate candidate votes
|
||||
for (candidate, votes) in state.election.candidates.iter().zip(candidate_votes) {
|
||||
let count_card = state.candidates.get(candidate).unwrap();
|
||||
if votes.is_some() {
|
||||
let votes = votes.unwrap();
|
||||
approx_eq(&count_card.votes, &votes, cmp_dps, idx, &format!("votes for candidate {}", candidate.name));
|
||||
}
|
||||
}
|
||||
|
||||
// Validate candidate states
|
||||
let mut candidate_states: Vec<&str> = records.iter().skip(2).map(|r| &r[idx*2 + 2]).collect();
|
||||
candidate_states.truncate(candidate_states.len() - 2);
|
||||
@ -143,26 +142,26 @@ where
|
||||
if candidate_state == "" {
|
||||
}
|
||||
else if candidate_state == "H" {
|
||||
assert!(count_card.state == CandidateState::Hopeful, "Unexpected state for \"{}\" at index {}", candidate.name, idx);
|
||||
assert!(count_card.state == CandidateState::Hopeful, "Unexpected state for \"{}\" at stage {}", candidate.name, stage_num);
|
||||
} else if candidate_state == "EL" || candidate_state == "PEL" {
|
||||
assert!(count_card.state == CandidateState::Elected, "Unexpected state for \"{}\" at index {}", candidate.name, idx);
|
||||
assert!(count_card.state == CandidateState::Elected, "Unexpected state for \"{}\" at stage {}", candidate.name, stage_num);
|
||||
} else if candidate_state == "EX" || candidate_state == "EXCLUDING" {
|
||||
assert!(count_card.state == CandidateState::Excluded, "Unexpected state for \"{}\" at index {}", candidate.name, idx);
|
||||
assert!(count_card.state == CandidateState::Excluded, "Unexpected state for \"{}\" at stage {}", candidate.name, stage_num);
|
||||
} else {
|
||||
panic!("Unknown state descriptor {}", candidate_state);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn approx_eq<N: Number>(n1: &N, n2: &N, cmp_dps: Option<usize>, idx: usize, description: &str) {
|
||||
fn approx_eq<N: Number>(n1: &N, n2: &N, cmp_dps: Option<usize>, stage_num: usize, description: &str) {
|
||||
match cmp_dps {
|
||||
Some(dps) => {
|
||||
let s1 = format!("{:.dps$}", n1, dps=dps);
|
||||
let s2 = format!("{:.dps$}", n2, dps=dps);
|
||||
assert!(s1 == s2, "Failed to verify {} for idx {}. Expected {}, got {}", description, idx, s2, s1);
|
||||
assert!(s1 == s2, "Failed to verify {} for stage {}. Expected {}, got {}", description, stage_num, s2, s1);
|
||||
}
|
||||
None => {
|
||||
assert!(n1 == n2, "Failed to verify {} for idx {}. Expected {}, got {}", description, idx, n2, n1);
|
||||
assert!(n1 == n2, "Failed to verify {} for stage {}. Expected {}, got {}", description, stage_num, n2, n1);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user