Initial implementation of NSW Local Government STV
This commit is contained in:
parent
9fcb643fe5
commit
d94549dc42
@ -13,6 +13,7 @@ The preset dropdown allows you to choose from a hardcoded list of preloaded STV
|
|||||||
| • Meek STV (2006) | Operates according to Hill's 2006 revisions ([*Voting Matters* 2006;(22):7–10](http://www.votingmatters.org.uk/ISSUE22/I22P2.pdf)). This is the algorithm referred to in OpenSTV/OpaVote as ‘Meek STV’, and forms the basis of New Zealand's Meek STV rules. | [E1] | ✓ |
|
| • Meek STV (2006) | Operates according to Hill's 2006 revisions ([*Voting Matters* 2006;(22):7–10](http://www.votingmatters.org.uk/ISSUE22/I22P2.pdf)). This is the algorithm referred to in OpenSTV/OpaVote as ‘Meek STV’, and forms the basis of New Zealand's Meek STV rules. | [E1] | ✓ |
|
||||||
| • Meek STV (New Zealand) | Operates according to Schedule 1A of the [*Local Electoral Regulations 2001*](https://www.legislation.govt.nz/regulation/public/2001/0145/latest/DLM57125.html). | [E1] | ✓ |
|
| • Meek STV (New Zealand) | Operates according to Schedule 1A of the [*Local Electoral Regulations 2001*](https://www.legislation.govt.nz/regulation/public/2001/0145/latest/DLM57125.html). | [E1] | ✓ |
|
||||||
| Australian Senate STV | Rules from the [*Commonwealth Electoral Act 1918*](https://www.legislation.gov.au/Details/C2020C00400/Html/Text#_Toc59107700), using the unweighted inclusive Gregory method. | [E2] [E3] [E4] | ✓ |
|
| Australian Senate STV | Rules from the [*Commonwealth Electoral Act 1918*](https://www.legislation.gov.au/Details/C2020C00400/Html/Text#_Toc59107700), using the unweighted inclusive Gregory method. | [E2] [E3] [E4] | ✓ |
|
||||||
|
| NSW Local Government STV | Rules from the [*Local Government (General) Regulation 2021*](https://legislation.nsw.gov.au/view/html/inforce/current/sl-2021-0460), using the weighted inclusive Gregory method. | [E2] | |
|
||||||
| Western Australia STV | Rules from the [*Electoral Act 1907* (WA)](https://www.legislation.wa.gov.au/legislation/prod/filestore.nsf/FileURL/mrdoc_29498.pdf/$FILE/Electoral%20Act%201907%20-%20[17-a0-06].pdf), using the weighted inclusive Gregory method. | [E2] [E3] | |
|
| Western Australia STV | Rules from the [*Electoral Act 1907* (WA)](https://www.legislation.wa.gov.au/legislation/prod/filestore.nsf/FileURL/mrdoc_29498.pdf/$FILE/Electoral%20Act%201907%20-%20[17-a0-06].pdf), using the weighted inclusive Gregory method. | [E2] [E3] | |
|
||||||
| Australian Capital Territory STV | Rules from the [*Electoral Act 1992* (ACT)](https://www.legislation.act.gov.au/View/a/1992-71/current/PDF/1992-71.PDF), using the exclusive Gregory method. | | ✓ |
|
| Australian Capital Territory STV | Rules from the [*Electoral Act 1992* (ACT)](https://www.legislation.act.gov.au/View/a/1992-71/current/PDF/1992-71.PDF), using the exclusive Gregory method. | | ✓ |
|
||||||
| Minneapolis STV | Rules from chapter 167 of the [*Minneapolis Code of Ordinances*](https://library.municode.com/mn/minneapolis/codes/code_of_ordinances?nodeId=COOR_TIT8.5EL_CH167MUELRUCO), using the weighted inclusive Gregory method. | [E5] | ✓ |
|
| Minneapolis STV | Rules from chapter 167 of the [*Minneapolis Code of Ordinances*](https://library.municode.com/mn/minneapolis/codes/code_of_ordinances?nodeId=COOR_TIT8.5EL_CH167MUELRUCO), using the weighted inclusive Gregory method. | [E5] | ✓ |
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<!--
|
<!--
|
||||||
* OpenTally: Open-source election vote counting
|
* OpenTally: Open-source election vote counting
|
||||||
* Copyright © 2021 Lee Yingtong Li (RunasSudo)
|
* Copyright © 2021–2022 Lee Yingtong Li (RunasSudo)
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
@ -43,6 +43,7 @@
|
|||||||
<optgroup label="Legislative">
|
<optgroup label="Legislative">
|
||||||
<option value="senate">Australian Senate STV</option>
|
<option value="senate">Australian Senate STV</option>
|
||||||
<option value="act">Australian Capital Territory STV</option>
|
<option value="act">Australian Capital Territory STV</option>
|
||||||
|
<option value="nswlg">NSW Local Government STV</option>
|
||||||
<option value="wa">Western Australia STV</option>
|
<option value="wa">Western Australia STV</option>
|
||||||
<option value="meeknz">Meek STV (New Zealand)</option>
|
<option value="meeknz">Meek STV (New Zealand)</option>
|
||||||
<option value="minneapolis">Minneapolis STV</option>
|
<option value="minneapolis">Minneapolis STV</option>
|
||||||
@ -335,5 +336,6 @@
|
|||||||
|
|
||||||
<script src="vendor/vanilla-js-dropdown.min.js"></script>
|
<script src="vendor/vanilla-js-dropdown.min.js"></script>
|
||||||
<script src="index.js?v=GITVERSION"></script>
|
<script src="index.js?v=GITVERSION"></script>
|
||||||
|
<script src="presets.js?v=GITVERSION"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
437
html/index.js
437
html/index.js
@ -1,5 +1,5 @@
|
|||||||
/* OpenTally: Open-source election vote counting
|
/* OpenTally: Open-source election vote counting
|
||||||
* Copyright © 2021 Lee Yingtong Li (RunasSudo)
|
* Copyright © 2021–2022 Lee Yingtong Li (RunasSudo)
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
@ -432,438 +432,3 @@ async function printResult() {
|
|||||||
// Trigger print when ready
|
// Trigger print when ready
|
||||||
onLoadStylesheet();
|
onLoadStylesheet();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Presets
|
|
||||||
|
|
||||||
function changePreset() {
|
|
||||||
if (document.getElementById('selPreset').value === 'wigm') {
|
|
||||||
document.getElementById('selQuotaCriterion').value = 'gt';
|
|
||||||
document.getElementById('selQuota').value = 'droop';
|
|
||||||
document.getElementById('selQuotaMode').value = 'static';
|
|
||||||
document.getElementById('chkBulkElection').checked = true;
|
|
||||||
document.getElementById('chkBulkExclusion').checked = false;
|
|
||||||
document.getElementById('chkDeferSurpluses').checked = false;
|
|
||||||
document.getElementById('chkImmediateElect').checked = true;
|
|
||||||
document.getElementById('txtMinThreshold').value = '0';
|
|
||||||
document.getElementById('selNumbers').value = 'rational';
|
|
||||||
document.getElementById('txtPPDP').value = '2';
|
|
||||||
document.getElementById('chkNormaliseBallots').checked = false;
|
|
||||||
document.getElementById('chkRoundQuota').checked = false;
|
|
||||||
document.getElementById('chkRoundVotes').checked = false;
|
|
||||||
document.getElementById('chkRoundSFs').checked = false;
|
|
||||||
document.getElementById('chkRoundValues').checked = false;
|
|
||||||
document.getElementById('selSumTransfers').value = 'by_value';
|
|
||||||
document.getElementById('selSurplus').value = 'by_size';
|
|
||||||
document.getElementById('selMethod').value = 'wig';
|
|
||||||
document.getElementById('selPapers').value = 'both';
|
|
||||||
document.getElementById('selExclusion').value = 'single_stage';
|
|
||||||
document.getElementById('selTies').value = 'backwards,random';
|
|
||||||
} else if (document.getElementById('selPreset').value === 'scottish') {
|
|
||||||
document.getElementById('selQuotaCriterion').value = 'geq';
|
|
||||||
document.getElementById('selQuota').value = 'droop';
|
|
||||||
document.getElementById('selQuotaMode').value = 'static';
|
|
||||||
document.getElementById('chkBulkElection').checked = true;
|
|
||||||
document.getElementById('chkBulkExclusion').checked = false;
|
|
||||||
document.getElementById('chkDeferSurpluses').checked = false;
|
|
||||||
document.getElementById('chkImmediateElect').checked = true;
|
|
||||||
document.getElementById('txtMinThreshold').value = '0';
|
|
||||||
document.getElementById('selNumbers').value = 'fixed';
|
|
||||||
document.getElementById('txtDP').value = '5';
|
|
||||||
document.getElementById('txtPPDP').value = '5';
|
|
||||||
document.getElementById('chkNormaliseBallots').checked = false;
|
|
||||||
document.getElementById('chkRoundQuota').checked = true;
|
|
||||||
document.getElementById('txtRoundQuota').value = '0';
|
|
||||||
document.getElementById('chkRoundVotes').checked = false;
|
|
||||||
document.getElementById('chkRoundSFs').checked = true;
|
|
||||||
document.getElementById('txtRoundSFs').value = '5';
|
|
||||||
document.getElementById('chkRoundValues').checked = false;
|
|
||||||
document.getElementById('selSumTransfers').value = 'per_ballot';
|
|
||||||
document.getElementById('selSurplus').value = 'by_size';
|
|
||||||
document.getElementById('selMethod').value = 'wig';
|
|
||||||
document.getElementById('selPapers').value = 'both';
|
|
||||||
document.getElementById('selExclusion').value = 'single_stage';
|
|
||||||
document.getElementById('selTies').value = 'backwards,random';
|
|
||||||
} else if (document.getElementById('selPreset').value === 'meek87') {
|
|
||||||
document.getElementById('selQuotaCriterion').value = 'gt';
|
|
||||||
document.getElementById('selQuota').value = 'droop_exact';
|
|
||||||
document.getElementById('selQuotaMode').value = 'dynamic_by_total';
|
|
||||||
document.getElementById('chkBulkElection').checked = true;
|
|
||||||
document.getElementById('chkBulkExclusion').checked = false;
|
|
||||||
document.getElementById('chkDeferSurpluses').checked = false;
|
|
||||||
document.getElementById('chkImmediateElect').checked = false;
|
|
||||||
document.getElementById('chkMeekNZExclusion').checked = false;
|
|
||||||
document.getElementById('txtMinThreshold').value = '0';
|
|
||||||
document.getElementById('selNumbers').value = 'fixed';
|
|
||||||
document.getElementById('txtDP').value = '5';
|
|
||||||
document.getElementById('txtPPDP').value = '2';
|
|
||||||
document.getElementById('chkNormaliseBallots').checked = false;
|
|
||||||
document.getElementById('chkRoundQuota').checked = false;
|
|
||||||
document.getElementById('chkRoundVotes').checked = false;
|
|
||||||
document.getElementById('chkRoundSFs').checked = false;
|
|
||||||
document.getElementById('chkRoundValues').checked = false;
|
|
||||||
//document.getElementById('selSumTransfers').value = 'single_step';
|
|
||||||
document.getElementById('txtMeekSurplusTolerance').value = '0.001%';
|
|
||||||
//document.getElementById('selSurplus').value = 'by_size';
|
|
||||||
document.getElementById('selMethod').value = 'meek';
|
|
||||||
document.getElementById('selPapers').value = 'both';
|
|
||||||
document.getElementById('selExclusion').value = 'single_stage';
|
|
||||||
document.getElementById('selTies').value = 'backwards,random';
|
|
||||||
} else if (document.getElementById('selPreset').value === 'meek06') {
|
|
||||||
document.getElementById('selQuotaCriterion').value = 'geq';
|
|
||||||
document.getElementById('selQuota').value = 'droop';
|
|
||||||
document.getElementById('selQuotaMode').value = 'dynamic_by_total';
|
|
||||||
document.getElementById('chkBulkElection').checked = true;
|
|
||||||
document.getElementById('chkBulkExclusion').checked = false;
|
|
||||||
document.getElementById('chkDeferSurpluses').checked = true;
|
|
||||||
document.getElementById('chkImmediateElect').checked = true;
|
|
||||||
document.getElementById('chkMeekNZExclusion').checked = false;
|
|
||||||
document.getElementById('txtMinThreshold').value = '0';
|
|
||||||
document.getElementById('selNumbers').value = 'fixed';
|
|
||||||
document.getElementById('txtDP').value = '12';
|
|
||||||
document.getElementById('txtPPDP').value = '2';
|
|
||||||
document.getElementById('chkNormaliseBallots').checked = false;
|
|
||||||
document.getElementById('chkRoundQuota').checked = true;
|
|
||||||
document.getElementById('txtRoundQuota').value = '9';
|
|
||||||
document.getElementById('chkRoundVotes').checked = true;
|
|
||||||
document.getElementById('txtRoundVotes').value = '9';
|
|
||||||
document.getElementById('chkRoundSFs').checked = true;
|
|
||||||
document.getElementById('txtRoundSFs').value = '9';
|
|
||||||
document.getElementById('chkRoundValues').checked = true;
|
|
||||||
document.getElementById('txtRoundValues').value = '9';
|
|
||||||
//document.getElementById('selSumTransfers').value = 'single_step';
|
|
||||||
document.getElementById('txtMeekSurplusTolerance').value = '0.0001';
|
|
||||||
//document.getElementById('selSurplus').value = 'by_size';
|
|
||||||
document.getElementById('selMethod').value = 'meek';
|
|
||||||
document.getElementById('selPapers').value = 'both';
|
|
||||||
document.getElementById('selExclusion').value = 'single_stage';
|
|
||||||
document.getElementById('selTies').value = 'forwards,random';
|
|
||||||
} else if (document.getElementById('selPreset').value === 'meeknz') {
|
|
||||||
document.getElementById('selQuotaCriterion').value = 'geq';
|
|
||||||
document.getElementById('selQuota').value = 'droop';
|
|
||||||
document.getElementById('selQuotaMode').value = 'dynamic_by_total';
|
|
||||||
document.getElementById('chkBulkElection').checked = true;
|
|
||||||
document.getElementById('chkBulkExclusion').checked = false;
|
|
||||||
document.getElementById('chkDeferSurpluses').checked = true;
|
|
||||||
document.getElementById('chkImmediateElect').checked = true;
|
|
||||||
document.getElementById('chkMeekNZExclusion').checked = true;
|
|
||||||
document.getElementById('txtMinThreshold').value = '0';
|
|
||||||
document.getElementById('selNumbers').value = 'fixed';
|
|
||||||
document.getElementById('txtDP').value = '12';
|
|
||||||
document.getElementById('txtPPDP').value = '2';
|
|
||||||
document.getElementById('chkNormaliseBallots').checked = false;
|
|
||||||
document.getElementById('chkRoundQuota').checked = true;
|
|
||||||
document.getElementById('txtRoundQuota').value = '9';
|
|
||||||
document.getElementById('chkRoundVotes').checked = true;
|
|
||||||
document.getElementById('txtRoundVotes').value = '9';
|
|
||||||
document.getElementById('chkRoundSFs').checked = true;
|
|
||||||
document.getElementById('txtRoundSFs').value = '9';
|
|
||||||
document.getElementById('chkRoundValues').checked = true;
|
|
||||||
document.getElementById('txtRoundValues').value = '9';
|
|
||||||
//document.getElementById('selSumTransfers').value = 'single_step';
|
|
||||||
document.getElementById('txtMeekSurplusTolerance').value = '0.0001';
|
|
||||||
//document.getElementById('selSurplus').value = 'by_size';
|
|
||||||
document.getElementById('selMethod').value = 'meek';
|
|
||||||
document.getElementById('selPapers').value = 'both';
|
|
||||||
document.getElementById('selExclusion').value = 'single_stage';
|
|
||||||
document.getElementById('selTies').value = 'forwards,random';
|
|
||||||
} else if (document.getElementById('selPreset').value === 'senate') {
|
|
||||||
document.getElementById('selQuotaCriterion').value = 'geq';
|
|
||||||
document.getElementById('selQuota').value = 'droop';
|
|
||||||
document.getElementById('selQuotaMode').value = 'static';
|
|
||||||
document.getElementById('chkBulkElection').checked = true;
|
|
||||||
document.getElementById('chkBulkExclusion').checked = false; // Senate "bulk exclusion" does not permit quota to be exceeded
|
|
||||||
document.getElementById('chkDeferSurpluses').checked = false;
|
|
||||||
document.getElementById('chkImmediateElect').checked = true;
|
|
||||||
document.getElementById('txtMinThreshold').value = '0';
|
|
||||||
document.getElementById('selNumbers').value = 'rational';
|
|
||||||
document.getElementById('txtPPDP').value = '0';
|
|
||||||
document.getElementById('chkNormaliseBallots').checked = false;
|
|
||||||
document.getElementById('chkRoundQuota').checked = true;
|
|
||||||
document.getElementById('txtRoundQuota').value = '0';
|
|
||||||
document.getElementById('chkRoundVotes').checked = true;
|
|
||||||
document.getElementById('txtRoundVotes').value = '0';
|
|
||||||
document.getElementById('chkRoundSFs').checked = false;
|
|
||||||
document.getElementById('chkRoundValues').checked = false;
|
|
||||||
document.getElementById('selSumTransfers').value = 'by_value';
|
|
||||||
document.getElementById('selSurplus').value = 'by_order';
|
|
||||||
document.getElementById('selMethod').value = 'uig';
|
|
||||||
document.getElementById('selPapers').value = 'both';
|
|
||||||
document.getElementById('selExclusion').value = 'by_value';
|
|
||||||
document.getElementById('selTies').value = 'backwards,random';
|
|
||||||
} else if (document.getElementById('selPreset').value === 'wa') {
|
|
||||||
document.getElementById('selQuotaCriterion').value = 'geq';
|
|
||||||
document.getElementById('selQuota').value = 'droop';
|
|
||||||
document.getElementById('selQuotaMode').value = 'static';
|
|
||||||
document.getElementById('chkBulkElection').checked = true;
|
|
||||||
document.getElementById('chkBulkExclusion').checked = false;
|
|
||||||
document.getElementById('chkDeferSurpluses').checked = false;
|
|
||||||
document.getElementById('chkImmediateElect').checked = true;
|
|
||||||
document.getElementById('txtMinThreshold').value = '0';
|
|
||||||
document.getElementById('selNumbers').value = 'rational';
|
|
||||||
document.getElementById('txtPPDP').value = '0';
|
|
||||||
document.getElementById('chkNormaliseBallots').checked = false;
|
|
||||||
document.getElementById('chkRoundQuota').checked = true;
|
|
||||||
document.getElementById('txtRoundQuota').value = '0';
|
|
||||||
document.getElementById('chkRoundVotes').checked = true;
|
|
||||||
document.getElementById('txtRoundVotes').value = '0';
|
|
||||||
document.getElementById('chkRoundSFs').checked = false;
|
|
||||||
document.getElementById('chkRoundValues').checked = false;
|
|
||||||
document.getElementById('selSumTransfers').value = 'by_value';
|
|
||||||
document.getElementById('selSurplus').value = 'by_order';
|
|
||||||
document.getElementById('selMethod').value = 'wig';
|
|
||||||
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 = true;
|
|
||||||
document.getElementById('chkBulkExclusion').checked = false;
|
|
||||||
document.getElementById('chkDeferSurpluses').checked = false;
|
|
||||||
document.getElementById('chkImmediateElect').checked = true;
|
|
||||||
document.getElementById('txtMinThreshold').value = '0';
|
|
||||||
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('chkRoundSFs').checked = false;
|
|
||||||
document.getElementById('chkRoundValues').checked = false;
|
|
||||||
document.getElementById('selSumTransfers').value = 'by_value';
|
|
||||||
document.getElementById('selSurplus').value = 'by_order';
|
|
||||||
document.getElementById('selMethod').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 === 'minneapolis') {
|
|
||||||
document.getElementById('selQuotaCriterion').value = 'geq';
|
|
||||||
document.getElementById('selQuota').value = 'droop';
|
|
||||||
document.getElementById('selQuotaMode').value = 'static';
|
|
||||||
document.getElementById('chkBulkElection').checked = true;
|
|
||||||
document.getElementById('chkBulkExclusion').checked = true;
|
|
||||||
document.getElementById('chkDeferSurpluses').checked = true;
|
|
||||||
document.getElementById('chkImmediateElect').checked = false;
|
|
||||||
document.getElementById('txtMinThreshold').value = '0';
|
|
||||||
document.getElementById('selNumbers').value = 'fixed';
|
|
||||||
document.getElementById('txtDP').value = '4';
|
|
||||||
document.getElementById('txtPPDP').value = '4';
|
|
||||||
document.getElementById('chkNormaliseBallots').checked = false;
|
|
||||||
document.getElementById('chkRoundQuota').checked = true;
|
|
||||||
document.getElementById('txtRoundQuota').value = '0';
|
|
||||||
document.getElementById('chkRoundVotes').checked = false;
|
|
||||||
document.getElementById('chkRoundSFs').checked = true;
|
|
||||||
document.getElementById('txtRoundSFs').value = '4';
|
|
||||||
document.getElementById('chkRoundValues').checked = false;
|
|
||||||
document.getElementById('selSumTransfers').value = 'by_value';
|
|
||||||
document.getElementById('selSurplus').value = 'by_size';
|
|
||||||
document.getElementById('selMethod').value = 'wig';
|
|
||||||
document.getElementById('selPapers').value = 'both';
|
|
||||||
document.getElementById('selExclusion').value = 'single_stage';
|
|
||||||
document.getElementById('selTies').value = 'random';
|
|
||||||
} else if (document.getElementById('selPreset').value === 'cambridge') {
|
|
||||||
document.getElementById('selQuotaCriterion').value = 'geq';
|
|
||||||
document.getElementById('selQuota').value = 'droop';
|
|
||||||
document.getElementById('selQuotaMode').value = 'static';
|
|
||||||
document.getElementById('chkBulkElection').checked = true;
|
|
||||||
document.getElementById('chkBulkExclusion').checked = false;
|
|
||||||
document.getElementById('chkDeferSurpluses').checked = false;
|
|
||||||
document.getElementById('chkImmediateElect').checked = true;
|
|
||||||
document.getElementById('selSample').value = 'cincinnati';
|
|
||||||
document.getElementById('chkSamplePerBallot').checked = true;
|
|
||||||
document.getElementById('txtMinThreshold').value = '49';
|
|
||||||
document.getElementById('selNumbers').value = 'rational';
|
|
||||||
document.getElementById('txtPPDP').value = '0';
|
|
||||||
document.getElementById('chkNormaliseBallots').checked = true;
|
|
||||||
document.getElementById('chkRoundQuota').checked = true;
|
|
||||||
document.getElementById('txtRoundQuota').value = '0';
|
|
||||||
document.getElementById('selSumTransfers').value = 'by_value';
|
|
||||||
document.getElementById('selMethod').value = 'hare';
|
|
||||||
document.getElementById('selPapers').value = 'transferable';
|
|
||||||
document.getElementById('selExclusion').value = 'single_stage';
|
|
||||||
document.getElementById('selTies').value = 'backwards,random';
|
|
||||||
} else if (document.getElementById('selPreset').value === 'dail') {
|
|
||||||
document.getElementById('selQuotaCriterion').value = 'geq';
|
|
||||||
document.getElementById('selQuota').value = 'droop';
|
|
||||||
document.getElementById('selQuotaMode').value = 'static';
|
|
||||||
document.getElementById('chkBulkElection').checked = true;
|
|
||||||
document.getElementById('chkBulkExclusion').checked = false;
|
|
||||||
document.getElementById('chkDeferSurpluses').checked = true;
|
|
||||||
document.getElementById('chkImmediateElect').checked = true;
|
|
||||||
document.getElementById('selSample').value = 'stratify';
|
|
||||||
document.getElementById('chkSamplePerBallot').checked = false;
|
|
||||||
document.getElementById('txtMinThreshold').value = '0';
|
|
||||||
document.getElementById('selNumbers').value = 'rational';
|
|
||||||
document.getElementById('txtPPDP').value = '0';
|
|
||||||
document.getElementById('chkNormaliseBallots').checked = true;
|
|
||||||
document.getElementById('chkRoundQuota').checked = true;
|
|
||||||
document.getElementById('txtRoundQuota').value = '0';
|
|
||||||
document.getElementById('selSumTransfers').value = 'by_value';
|
|
||||||
document.getElementById('selSurplus').value = 'by_order';
|
|
||||||
document.getElementById('selMethod').value = 'hare';
|
|
||||||
document.getElementById('selPapers').value = 'transferable';
|
|
||||||
document.getElementById('selExclusion').value = 'single_stage';
|
|
||||||
document.getElementById('selTies').value = 'forwards,random';
|
|
||||||
} else if (document.getElementById('selPreset').value === 'wright') {
|
|
||||||
document.getElementById('selQuotaCriterion').value = 'geq';
|
|
||||||
document.getElementById('selQuota').value = 'droop';
|
|
||||||
document.getElementById('selQuotaMode').value = 'static';
|
|
||||||
document.getElementById('chkBulkElection').checked = true;
|
|
||||||
document.getElementById('chkBulkExclusion').checked = true;
|
|
||||||
document.getElementById('chkDeferSurpluses').checked = false;
|
|
||||||
document.getElementById('chkImmediateElect').checked = true;
|
|
||||||
document.getElementById('txtMinThreshold').value = '0';
|
|
||||||
document.getElementById('selNumbers').value = 'fixed';
|
|
||||||
document.getElementById('txtDP').value = '5';
|
|
||||||
document.getElementById('txtPPDP').value = '2';
|
|
||||||
document.getElementById('chkNormaliseBallots').checked = false;
|
|
||||||
document.getElementById('chkRoundQuota').checked = true;
|
|
||||||
document.getElementById('txtRoundQuota').value = '0';
|
|
||||||
document.getElementById('chkRoundVotes').checked = false;
|
|
||||||
document.getElementById('chkRoundSFs').checked = false;
|
|
||||||
document.getElementById('chkRoundValues').checked = false;
|
|
||||||
document.getElementById('selSumTransfers').value = 'by_value';
|
|
||||||
document.getElementById('selSurplus').value = 'by_size';
|
|
||||||
document.getElementById('selMethod').value = 'wig';
|
|
||||||
document.getElementById('selPapers').value = 'both';
|
|
||||||
document.getElementById('selExclusion').value = 'wright';
|
|
||||||
document.getElementById('selTies').value = 'random';
|
|
||||||
} else if (document.getElementById('selPreset').value === 'prsa77') {
|
|
||||||
document.getElementById('selQuotaCriterion').value = 'geq';
|
|
||||||
document.getElementById('selQuota').value = 'droop';
|
|
||||||
document.getElementById('selQuotaMode').value = 'static';
|
|
||||||
document.getElementById('chkBulkElection').checked = true;
|
|
||||||
document.getElementById('chkBulkExclusion').checked = false;
|
|
||||||
document.getElementById('chkDeferSurpluses').checked = true;
|
|
||||||
document.getElementById('chkImmediateElect').checked = true;
|
|
||||||
document.getElementById('txtMinThreshold').value = '0';
|
|
||||||
document.getElementById('selNumbers').value = 'fixed';
|
|
||||||
document.getElementById('txtDP').value = '6';
|
|
||||||
document.getElementById('txtPPDP').value = '3';
|
|
||||||
document.getElementById('chkNormaliseBallots').checked = false;
|
|
||||||
document.getElementById('chkRoundQuota').checked = true;
|
|
||||||
document.getElementById('txtRoundQuota').value = '3';
|
|
||||||
document.getElementById('chkRoundVotes').checked = true;
|
|
||||||
document.getElementById('txtRoundVotes').value = '3';
|
|
||||||
document.getElementById('chkRoundSFs').checked = true;
|
|
||||||
document.getElementById('txtRoundSFs').value = '3';
|
|
||||||
document.getElementById('chkRoundValues').checked = true;
|
|
||||||
document.getElementById('txtRoundValues').value = '3';
|
|
||||||
document.getElementById('selSumTransfers').value = 'by_value';
|
|
||||||
document.getElementById('selSurplus').value = 'by_order';
|
|
||||||
document.getElementById('selMethod').value = 'eg';
|
|
||||||
document.getElementById('selPapers').value = 'transferable';
|
|
||||||
document.getElementById('selExclusion').value = 'parcels_by_order';
|
|
||||||
document.getElementById('selTies').value = 'backwards,random';
|
|
||||||
} else if (document.getElementById('selPreset').value === 'ers97') {
|
|
||||||
document.getElementById('selQuotaCriterion').value = 'geq';
|
|
||||||
document.getElementById('selQuota').value = 'droop_exact';
|
|
||||||
document.getElementById('selQuotaMode').value = 'ers97';
|
|
||||||
document.getElementById('chkBulkElection').checked = true;
|
|
||||||
document.getElementById('chkBulkExclusion').checked = true;
|
|
||||||
document.getElementById('chkDeferSurpluses').checked = true;
|
|
||||||
document.getElementById('chkImmediateElect').checked = true;
|
|
||||||
document.getElementById('txtMinThreshold').value = '0';
|
|
||||||
document.getElementById('selNumbers').value = 'fixed';
|
|
||||||
document.getElementById('txtDP').value = '5';
|
|
||||||
document.getElementById('txtPPDP').value = '2';
|
|
||||||
document.getElementById('chkNormaliseBallots').checked = false;
|
|
||||||
document.getElementById('chkRoundQuota').checked = true;
|
|
||||||
document.getElementById('txtRoundQuota').value = '2';
|
|
||||||
document.getElementById('chkRoundVotes').checked = true;
|
|
||||||
document.getElementById('txtRoundVotes').value = '2';
|
|
||||||
document.getElementById('chkRoundSFs').checked = true;
|
|
||||||
document.getElementById('txtRoundSFs').value = '2';
|
|
||||||
document.getElementById('chkRoundValues').checked = true;
|
|
||||||
document.getElementById('txtRoundValues').value = '2';
|
|
||||||
document.getElementById('selSumTransfers').value = 'by_value';
|
|
||||||
document.getElementById('selSurplus').value = 'by_size';
|
|
||||||
document.getElementById('selMethod').value = 'eg';
|
|
||||||
document.getElementById('selPapers').value = 'transferable';
|
|
||||||
document.getElementById('selExclusion').value = 'by_value';
|
|
||||||
document.getElementById('selTies').value = 'forwards,random';
|
|
||||||
} else if (document.getElementById('selPreset').value === 'ers76') {
|
|
||||||
document.getElementById('selQuotaCriterion').value = 'geq';
|
|
||||||
document.getElementById('selQuota').value = 'droop_exact';
|
|
||||||
document.getElementById('selQuotaMode').value = 'ers76';
|
|
||||||
document.getElementById('chkBulkElection').checked = true;
|
|
||||||
document.getElementById('chkBulkExclusion').checked = true;
|
|
||||||
document.getElementById('chkDeferSurpluses').checked = true;
|
|
||||||
document.getElementById('chkImmediateElect').checked = true;
|
|
||||||
document.getElementById('txtMinThreshold').value = '0';
|
|
||||||
document.getElementById('selNumbers').value = 'fixed';
|
|
||||||
document.getElementById('txtDP').value = '5';
|
|
||||||
document.getElementById('txtPPDP').value = '2';
|
|
||||||
document.getElementById('chkNormaliseBallots').checked = false;
|
|
||||||
document.getElementById('chkRoundQuota').checked = true;
|
|
||||||
document.getElementById('txtRoundQuota').value = '2';
|
|
||||||
document.getElementById('chkRoundVotes').checked = true;
|
|
||||||
document.getElementById('txtRoundVotes').value = '2';
|
|
||||||
document.getElementById('chkRoundSFs').checked = true;
|
|
||||||
document.getElementById('txtRoundSFs').value = '2';
|
|
||||||
document.getElementById('chkRoundValues').checked = true;
|
|
||||||
document.getElementById('txtRoundValues').value = '2';
|
|
||||||
document.getElementById('selSumTransfers').value = 'by_value';
|
|
||||||
document.getElementById('selSurplus').value = 'by_size';
|
|
||||||
document.getElementById('selMethod').value = 'eg';
|
|
||||||
document.getElementById('selPapers').value = 'transferable';
|
|
||||||
document.getElementById('selExclusion').value = 'by_value';
|
|
||||||
document.getElementById('selTies').value = 'forwards,random';
|
|
||||||
} else if (document.getElementById('selPreset').value === 'ers73') {
|
|
||||||
document.getElementById('selQuotaCriterion').value = 'geq';
|
|
||||||
document.getElementById('selQuota').value = 'droop_exact';
|
|
||||||
document.getElementById('selQuotaMode').value = 'static';
|
|
||||||
document.getElementById('chkBulkElection').checked = true;
|
|
||||||
document.getElementById('chkBulkExclusion').checked = true;
|
|
||||||
document.getElementById('chkDeferSurpluses').checked = true;
|
|
||||||
document.getElementById('chkImmediateElect').checked = true;
|
|
||||||
document.getElementById('txtMinThreshold').value = '0';
|
|
||||||
document.getElementById('selNumbers').value = 'fixed';
|
|
||||||
document.getElementById('txtDP').value = '5';
|
|
||||||
document.getElementById('txtPPDP').value = '2';
|
|
||||||
document.getElementById('chkNormaliseBallots').checked = false;
|
|
||||||
document.getElementById('chkRoundQuota').checked = true;
|
|
||||||
document.getElementById('txtRoundQuota').value = '2';
|
|
||||||
document.getElementById('chkRoundVotes').checked = true;
|
|
||||||
document.getElementById('txtRoundVotes').value = '2';
|
|
||||||
document.getElementById('chkRoundSFs').checked = true;
|
|
||||||
document.getElementById('txtRoundSFs').value = '2';
|
|
||||||
document.getElementById('chkRoundValues').checked = true;
|
|
||||||
document.getElementById('txtRoundValues').value = '2';
|
|
||||||
document.getElementById('selSumTransfers').value = 'by_value';
|
|
||||||
document.getElementById('selSurplus').value = 'by_size';
|
|
||||||
document.getElementById('selMethod').value = 'eg';
|
|
||||||
document.getElementById('selPapers').value = 'transferable';
|
|
||||||
document.getElementById('selExclusion').value = 'by_value';
|
|
||||||
document.getElementById('selTies').value = 'forwards,random';
|
|
||||||
} else if (document.getElementById('selPreset').value === 'cofe') {
|
|
||||||
document.getElementById('selQuotaCriterion').value = 'geq';
|
|
||||||
document.getElementById('selQuota').value = 'droop';
|
|
||||||
document.getElementById('selQuotaMode').value = 'static';
|
|
||||||
document.getElementById('chkBulkElection').checked = true;
|
|
||||||
document.getElementById('chkBulkExclusion').checked = false;
|
|
||||||
document.getElementById('chkDeferSurpluses').checked = true;
|
|
||||||
document.getElementById('chkImmediateElect').checked = true;
|
|
||||||
document.getElementById('txtMinThreshold').value = '0';
|
|
||||||
document.getElementById('selNumbers').value = 'fixed';
|
|
||||||
document.getElementById('txtDP').value = '5';
|
|
||||||
document.getElementById('txtPPDP').value = '2';
|
|
||||||
document.getElementById('chkNormaliseBallots').checked = false;
|
|
||||||
document.getElementById('chkRoundQuota').checked = true;
|
|
||||||
document.getElementById('txtRoundQuota').value = '2';
|
|
||||||
document.getElementById('chkRoundVotes').checked = true;
|
|
||||||
document.getElementById('txtRoundVotes').value = '2';
|
|
||||||
document.getElementById('chkRoundSFs').checked = true;
|
|
||||||
document.getElementById('txtRoundSFs').value = '2';
|
|
||||||
document.getElementById('chkRoundValues').checked = true;
|
|
||||||
document.getElementById('txtRoundValues').value = '2';
|
|
||||||
document.getElementById('selSumTransfers').value = 'per_ballot';
|
|
||||||
document.getElementById('selSurplus').value = 'by_size';
|
|
||||||
document.getElementById('selMethod').value = 'eg';
|
|
||||||
document.getElementById('selPapers').value = 'transferable';
|
|
||||||
document.getElementById('selExclusion').value = 'by_value';
|
|
||||||
document.getElementById('selTies').value = 'forwards,random';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
473
html/presets.js
Normal file
473
html/presets.js
Normal file
@ -0,0 +1,473 @@
|
|||||||
|
/* OpenTally: Open-source election vote counting
|
||||||
|
* Copyright © 2021–2022 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function changePreset() {
|
||||||
|
if (document.getElementById('selPreset').value === 'wigm') {
|
||||||
|
document.getElementById('selQuotaCriterion').value = 'gt';
|
||||||
|
document.getElementById('selQuota').value = 'droop';
|
||||||
|
document.getElementById('selQuotaMode').value = 'static';
|
||||||
|
document.getElementById('chkBulkElection').checked = true;
|
||||||
|
document.getElementById('chkBulkExclusion').checked = false;
|
||||||
|
document.getElementById('chkDeferSurpluses').checked = false;
|
||||||
|
document.getElementById('chkImmediateElect').checked = true;
|
||||||
|
document.getElementById('txtMinThreshold').value = '0';
|
||||||
|
document.getElementById('selNumbers').value = 'rational';
|
||||||
|
document.getElementById('txtPPDP').value = '2';
|
||||||
|
document.getElementById('chkNormaliseBallots').checked = false;
|
||||||
|
document.getElementById('chkRoundQuota').checked = false;
|
||||||
|
document.getElementById('chkRoundVotes').checked = false;
|
||||||
|
document.getElementById('chkRoundSFs').checked = false;
|
||||||
|
document.getElementById('chkRoundValues').checked = false;
|
||||||
|
document.getElementById('selSumTransfers').value = 'by_value';
|
||||||
|
document.getElementById('selSurplus').value = 'by_size';
|
||||||
|
document.getElementById('selMethod').value = 'wig';
|
||||||
|
document.getElementById('selPapers').value = 'both';
|
||||||
|
document.getElementById('selExclusion').value = 'single_stage';
|
||||||
|
document.getElementById('selTies').value = 'backwards,random';
|
||||||
|
} else if (document.getElementById('selPreset').value === 'scottish') {
|
||||||
|
document.getElementById('selQuotaCriterion').value = 'geq';
|
||||||
|
document.getElementById('selQuota').value = 'droop';
|
||||||
|
document.getElementById('selQuotaMode').value = 'static';
|
||||||
|
document.getElementById('chkBulkElection').checked = true;
|
||||||
|
document.getElementById('chkBulkExclusion').checked = false;
|
||||||
|
document.getElementById('chkDeferSurpluses').checked = false;
|
||||||
|
document.getElementById('chkImmediateElect').checked = true;
|
||||||
|
document.getElementById('txtMinThreshold').value = '0';
|
||||||
|
document.getElementById('selNumbers').value = 'fixed';
|
||||||
|
document.getElementById('txtDP').value = '5';
|
||||||
|
document.getElementById('txtPPDP').value = '5';
|
||||||
|
document.getElementById('chkNormaliseBallots').checked = false;
|
||||||
|
document.getElementById('chkRoundQuota').checked = true;
|
||||||
|
document.getElementById('txtRoundQuota').value = '0';
|
||||||
|
document.getElementById('chkRoundVotes').checked = false;
|
||||||
|
document.getElementById('chkRoundSFs').checked = true;
|
||||||
|
document.getElementById('txtRoundSFs').value = '5';
|
||||||
|
document.getElementById('chkRoundValues').checked = false;
|
||||||
|
document.getElementById('selSumTransfers').value = 'per_ballot';
|
||||||
|
document.getElementById('selSurplus').value = 'by_size';
|
||||||
|
document.getElementById('selMethod').value = 'wig';
|
||||||
|
document.getElementById('selPapers').value = 'both';
|
||||||
|
document.getElementById('selExclusion').value = 'single_stage';
|
||||||
|
document.getElementById('selTies').value = 'backwards,random';
|
||||||
|
} else if (document.getElementById('selPreset').value === 'meek87') {
|
||||||
|
document.getElementById('selQuotaCriterion').value = 'gt';
|
||||||
|
document.getElementById('selQuota').value = 'droop_exact';
|
||||||
|
document.getElementById('selQuotaMode').value = 'dynamic_by_total';
|
||||||
|
document.getElementById('chkBulkElection').checked = true;
|
||||||
|
document.getElementById('chkBulkExclusion').checked = false;
|
||||||
|
document.getElementById('chkDeferSurpluses').checked = false;
|
||||||
|
document.getElementById('chkImmediateElect').checked = false;
|
||||||
|
document.getElementById('chkMeekNZExclusion').checked = false;
|
||||||
|
document.getElementById('txtMinThreshold').value = '0';
|
||||||
|
document.getElementById('selNumbers').value = 'fixed';
|
||||||
|
document.getElementById('txtDP').value = '5';
|
||||||
|
document.getElementById('txtPPDP').value = '2';
|
||||||
|
document.getElementById('chkNormaliseBallots').checked = false;
|
||||||
|
document.getElementById('chkRoundQuota').checked = false;
|
||||||
|
document.getElementById('chkRoundVotes').checked = false;
|
||||||
|
document.getElementById('chkRoundSFs').checked = false;
|
||||||
|
document.getElementById('chkRoundValues').checked = false;
|
||||||
|
//document.getElementById('selSumTransfers').value = 'single_step';
|
||||||
|
document.getElementById('txtMeekSurplusTolerance').value = '0.001%';
|
||||||
|
//document.getElementById('selSurplus').value = 'by_size';
|
||||||
|
document.getElementById('selMethod').value = 'meek';
|
||||||
|
document.getElementById('selPapers').value = 'both';
|
||||||
|
document.getElementById('selExclusion').value = 'single_stage';
|
||||||
|
document.getElementById('selTies').value = 'backwards,random';
|
||||||
|
} else if (document.getElementById('selPreset').value === 'meek06') {
|
||||||
|
document.getElementById('selQuotaCriterion').value = 'geq';
|
||||||
|
document.getElementById('selQuota').value = 'droop';
|
||||||
|
document.getElementById('selQuotaMode').value = 'dynamic_by_total';
|
||||||
|
document.getElementById('chkBulkElection').checked = true;
|
||||||
|
document.getElementById('chkBulkExclusion').checked = false;
|
||||||
|
document.getElementById('chkDeferSurpluses').checked = true;
|
||||||
|
document.getElementById('chkImmediateElect').checked = true;
|
||||||
|
document.getElementById('chkMeekNZExclusion').checked = false;
|
||||||
|
document.getElementById('txtMinThreshold').value = '0';
|
||||||
|
document.getElementById('selNumbers').value = 'fixed';
|
||||||
|
document.getElementById('txtDP').value = '12';
|
||||||
|
document.getElementById('txtPPDP').value = '2';
|
||||||
|
document.getElementById('chkNormaliseBallots').checked = false;
|
||||||
|
document.getElementById('chkRoundQuota').checked = true;
|
||||||
|
document.getElementById('txtRoundQuota').value = '9';
|
||||||
|
document.getElementById('chkRoundVotes').checked = true;
|
||||||
|
document.getElementById('txtRoundVotes').value = '9';
|
||||||
|
document.getElementById('chkRoundSFs').checked = true;
|
||||||
|
document.getElementById('txtRoundSFs').value = '9';
|
||||||
|
document.getElementById('chkRoundValues').checked = true;
|
||||||
|
document.getElementById('txtRoundValues').value = '9';
|
||||||
|
//document.getElementById('selSumTransfers').value = 'single_step';
|
||||||
|
document.getElementById('txtMeekSurplusTolerance').value = '0.0001';
|
||||||
|
//document.getElementById('selSurplus').value = 'by_size';
|
||||||
|
document.getElementById('selMethod').value = 'meek';
|
||||||
|
document.getElementById('selPapers').value = 'both';
|
||||||
|
document.getElementById('selExclusion').value = 'single_stage';
|
||||||
|
document.getElementById('selTies').value = 'forwards,random';
|
||||||
|
} else if (document.getElementById('selPreset').value === 'meeknz') {
|
||||||
|
document.getElementById('selQuotaCriterion').value = 'geq';
|
||||||
|
document.getElementById('selQuota').value = 'droop';
|
||||||
|
document.getElementById('selQuotaMode').value = 'dynamic_by_total';
|
||||||
|
document.getElementById('chkBulkElection').checked = true;
|
||||||
|
document.getElementById('chkBulkExclusion').checked = false;
|
||||||
|
document.getElementById('chkDeferSurpluses').checked = true;
|
||||||
|
document.getElementById('chkImmediateElect').checked = true;
|
||||||
|
document.getElementById('chkMeekNZExclusion').checked = true;
|
||||||
|
document.getElementById('txtMinThreshold').value = '0';
|
||||||
|
document.getElementById('selNumbers').value = 'fixed';
|
||||||
|
document.getElementById('txtDP').value = '12';
|
||||||
|
document.getElementById('txtPPDP').value = '2';
|
||||||
|
document.getElementById('chkNormaliseBallots').checked = false;
|
||||||
|
document.getElementById('chkRoundQuota').checked = true;
|
||||||
|
document.getElementById('txtRoundQuota').value = '9';
|
||||||
|
document.getElementById('chkRoundVotes').checked = true;
|
||||||
|
document.getElementById('txtRoundVotes').value = '9';
|
||||||
|
document.getElementById('chkRoundSFs').checked = true;
|
||||||
|
document.getElementById('txtRoundSFs').value = '9';
|
||||||
|
document.getElementById('chkRoundValues').checked = true;
|
||||||
|
document.getElementById('txtRoundValues').value = '9';
|
||||||
|
//document.getElementById('selSumTransfers').value = 'single_step';
|
||||||
|
document.getElementById('txtMeekSurplusTolerance').value = '0.0001';
|
||||||
|
//document.getElementById('selSurplus').value = 'by_size';
|
||||||
|
document.getElementById('selMethod').value = 'meek';
|
||||||
|
document.getElementById('selPapers').value = 'both';
|
||||||
|
document.getElementById('selExclusion').value = 'single_stage';
|
||||||
|
document.getElementById('selTies').value = 'forwards,random';
|
||||||
|
} else if (document.getElementById('selPreset').value === 'senate') {
|
||||||
|
document.getElementById('selQuotaCriterion').value = 'geq';
|
||||||
|
document.getElementById('selQuota').value = 'droop';
|
||||||
|
document.getElementById('selQuotaMode').value = 'static';
|
||||||
|
document.getElementById('chkBulkElection').checked = true;
|
||||||
|
document.getElementById('chkBulkExclusion').checked = false; // Senate "bulk exclusion" does not permit quota to be exceeded
|
||||||
|
document.getElementById('chkDeferSurpluses').checked = false;
|
||||||
|
document.getElementById('chkImmediateElect').checked = true;
|
||||||
|
document.getElementById('txtMinThreshold').value = '0';
|
||||||
|
document.getElementById('selNumbers').value = 'rational';
|
||||||
|
document.getElementById('txtPPDP').value = '0';
|
||||||
|
document.getElementById('chkNormaliseBallots').checked = false;
|
||||||
|
document.getElementById('chkRoundQuota').checked = true;
|
||||||
|
document.getElementById('txtRoundQuota').value = '0';
|
||||||
|
document.getElementById('chkRoundVotes').checked = true;
|
||||||
|
document.getElementById('txtRoundVotes').value = '0';
|
||||||
|
document.getElementById('chkRoundSFs').checked = false;
|
||||||
|
document.getElementById('chkRoundValues').checked = false;
|
||||||
|
document.getElementById('selSumTransfers').value = 'by_value';
|
||||||
|
document.getElementById('selSurplus').value = 'by_order';
|
||||||
|
document.getElementById('selMethod').value = 'uig';
|
||||||
|
document.getElementById('selPapers').value = 'both';
|
||||||
|
document.getElementById('selExclusion').value = 'by_value';
|
||||||
|
document.getElementById('selTies').value = 'backwards,random';
|
||||||
|
} else if (document.getElementById('selPreset').value === 'wa') {
|
||||||
|
document.getElementById('selQuotaCriterion').value = 'geq';
|
||||||
|
document.getElementById('selQuota').value = 'droop';
|
||||||
|
document.getElementById('selQuotaMode').value = 'static';
|
||||||
|
document.getElementById('chkBulkElection').checked = true;
|
||||||
|
document.getElementById('chkBulkExclusion').checked = false;
|
||||||
|
document.getElementById('chkDeferSurpluses').checked = false;
|
||||||
|
document.getElementById('chkImmediateElect').checked = true;
|
||||||
|
document.getElementById('txtMinThreshold').value = '0';
|
||||||
|
document.getElementById('selNumbers').value = 'rational';
|
||||||
|
document.getElementById('txtPPDP').value = '0';
|
||||||
|
document.getElementById('chkNormaliseBallots').checked = false;
|
||||||
|
document.getElementById('chkRoundQuota').checked = true;
|
||||||
|
document.getElementById('txtRoundQuota').value = '0';
|
||||||
|
document.getElementById('chkRoundVotes').checked = true;
|
||||||
|
document.getElementById('txtRoundVotes').value = '0';
|
||||||
|
document.getElementById('chkRoundSFs').checked = false;
|
||||||
|
document.getElementById('chkRoundValues').checked = false;
|
||||||
|
document.getElementById('selSumTransfers').value = 'per_ballot';
|
||||||
|
document.getElementById('selSurplus').value = 'by_order';
|
||||||
|
document.getElementById('selMethod').value = 'wig';
|
||||||
|
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 = true;
|
||||||
|
document.getElementById('chkBulkExclusion').checked = false;
|
||||||
|
document.getElementById('chkDeferSurpluses').checked = false;
|
||||||
|
document.getElementById('chkImmediateElect').checked = true;
|
||||||
|
document.getElementById('txtMinThreshold').value = '0';
|
||||||
|
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('chkRoundSFs').checked = false;
|
||||||
|
document.getElementById('chkRoundValues').checked = false;
|
||||||
|
document.getElementById('selSumTransfers').value = 'by_value';
|
||||||
|
document.getElementById('selSurplus').value = 'by_order';
|
||||||
|
document.getElementById('selMethod').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 === 'nswlg') {
|
||||||
|
document.getElementById('selQuotaCriterion').value = 'geq';
|
||||||
|
document.getElementById('selQuota').value = 'droop';
|
||||||
|
document.getElementById('selQuotaMode').value = 'static';
|
||||||
|
document.getElementById('chkBulkElection').checked = true;
|
||||||
|
document.getElementById('chkBulkExclusion').checked = false;
|
||||||
|
document.getElementById('chkDeferSurpluses').checked = false;
|
||||||
|
document.getElementById('chkImmediateElect').checked = true;
|
||||||
|
document.getElementById('txtMinThreshold').value = '0';
|
||||||
|
document.getElementById('selNumbers').value = 'rational';
|
||||||
|
document.getElementById('txtPPDP').value = '0';
|
||||||
|
document.getElementById('chkNormaliseBallots').checked = false;
|
||||||
|
document.getElementById('chkRoundQuota').checked = true;
|
||||||
|
document.getElementById('txtRoundQuota').value = '0';
|
||||||
|
document.getElementById('chkRoundVotes').checked = true;
|
||||||
|
document.getElementById('txtRoundVotes').value = '0';
|
||||||
|
document.getElementById('chkRoundSFs').checked = false;
|
||||||
|
document.getElementById('chkRoundValues').checked = false;
|
||||||
|
document.getElementById('selSumTransfers').value = 'per_ballot';
|
||||||
|
document.getElementById('selSurplus').value = 'by_order';
|
||||||
|
document.getElementById('selMethod').value = 'wig';
|
||||||
|
document.getElementById('selPapers').value = 'transferable';
|
||||||
|
document.getElementById('selExclusion').value = 'single_stage';
|
||||||
|
document.getElementById('selTies').value = 'backwards,random';
|
||||||
|
} else if (document.getElementById('selPreset').value === 'minneapolis') {
|
||||||
|
document.getElementById('selQuotaCriterion').value = 'geq';
|
||||||
|
document.getElementById('selQuota').value = 'droop';
|
||||||
|
document.getElementById('selQuotaMode').value = 'static';
|
||||||
|
document.getElementById('chkBulkElection').checked = true;
|
||||||
|
document.getElementById('chkBulkExclusion').checked = true;
|
||||||
|
document.getElementById('chkDeferSurpluses').checked = true;
|
||||||
|
document.getElementById('chkImmediateElect').checked = false;
|
||||||
|
document.getElementById('txtMinThreshold').value = '0';
|
||||||
|
document.getElementById('selNumbers').value = 'fixed';
|
||||||
|
document.getElementById('txtDP').value = '4';
|
||||||
|
document.getElementById('txtPPDP').value = '4';
|
||||||
|
document.getElementById('chkNormaliseBallots').checked = false;
|
||||||
|
document.getElementById('chkRoundQuota').checked = true;
|
||||||
|
document.getElementById('txtRoundQuota').value = '0';
|
||||||
|
document.getElementById('chkRoundVotes').checked = false;
|
||||||
|
document.getElementById('chkRoundSFs').checked = true;
|
||||||
|
document.getElementById('txtRoundSFs').value = '4';
|
||||||
|
document.getElementById('chkRoundValues').checked = false;
|
||||||
|
document.getElementById('selSumTransfers').value = 'by_value';
|
||||||
|
document.getElementById('selSurplus').value = 'by_size';
|
||||||
|
document.getElementById('selMethod').value = 'wig';
|
||||||
|
document.getElementById('selPapers').value = 'both';
|
||||||
|
document.getElementById('selExclusion').value = 'single_stage';
|
||||||
|
document.getElementById('selTies').value = 'random';
|
||||||
|
} else if (document.getElementById('selPreset').value === 'cambridge') {
|
||||||
|
document.getElementById('selQuotaCriterion').value = 'geq';
|
||||||
|
document.getElementById('selQuota').value = 'droop';
|
||||||
|
document.getElementById('selQuotaMode').value = 'static';
|
||||||
|
document.getElementById('chkBulkElection').checked = true;
|
||||||
|
document.getElementById('chkBulkExclusion').checked = false;
|
||||||
|
document.getElementById('chkDeferSurpluses').checked = false;
|
||||||
|
document.getElementById('chkImmediateElect').checked = true;
|
||||||
|
document.getElementById('selSample').value = 'cincinnati';
|
||||||
|
document.getElementById('chkSamplePerBallot').checked = true;
|
||||||
|
document.getElementById('txtMinThreshold').value = '49';
|
||||||
|
document.getElementById('selNumbers').value = 'rational';
|
||||||
|
document.getElementById('txtPPDP').value = '0';
|
||||||
|
document.getElementById('chkNormaliseBallots').checked = true;
|
||||||
|
document.getElementById('chkRoundQuota').checked = true;
|
||||||
|
document.getElementById('txtRoundQuota').value = '0';
|
||||||
|
document.getElementById('selSumTransfers').value = 'by_value';
|
||||||
|
document.getElementById('selMethod').value = 'hare';
|
||||||
|
document.getElementById('selPapers').value = 'transferable';
|
||||||
|
document.getElementById('selExclusion').value = 'single_stage';
|
||||||
|
document.getElementById('selTies').value = 'backwards,random';
|
||||||
|
} else if (document.getElementById('selPreset').value === 'dail') {
|
||||||
|
document.getElementById('selQuotaCriterion').value = 'geq';
|
||||||
|
document.getElementById('selQuota').value = 'droop';
|
||||||
|
document.getElementById('selQuotaMode').value = 'static';
|
||||||
|
document.getElementById('chkBulkElection').checked = true;
|
||||||
|
document.getElementById('chkBulkExclusion').checked = false;
|
||||||
|
document.getElementById('chkDeferSurpluses').checked = true;
|
||||||
|
document.getElementById('chkImmediateElect').checked = true;
|
||||||
|
document.getElementById('selSample').value = 'stratify';
|
||||||
|
document.getElementById('chkSamplePerBallot').checked = false;
|
||||||
|
document.getElementById('txtMinThreshold').value = '0';
|
||||||
|
document.getElementById('selNumbers').value = 'rational';
|
||||||
|
document.getElementById('txtPPDP').value = '0';
|
||||||
|
document.getElementById('chkNormaliseBallots').checked = true;
|
||||||
|
document.getElementById('chkRoundQuota').checked = true;
|
||||||
|
document.getElementById('txtRoundQuota').value = '0';
|
||||||
|
document.getElementById('selSumTransfers').value = 'by_value';
|
||||||
|
document.getElementById('selSurplus').value = 'by_order';
|
||||||
|
document.getElementById('selMethod').value = 'hare';
|
||||||
|
document.getElementById('selPapers').value = 'transferable';
|
||||||
|
document.getElementById('selExclusion').value = 'single_stage';
|
||||||
|
document.getElementById('selTies').value = 'forwards,random';
|
||||||
|
} else if (document.getElementById('selPreset').value === 'wright') {
|
||||||
|
document.getElementById('selQuotaCriterion').value = 'geq';
|
||||||
|
document.getElementById('selQuota').value = 'droop';
|
||||||
|
document.getElementById('selQuotaMode').value = 'static';
|
||||||
|
document.getElementById('chkBulkElection').checked = true;
|
||||||
|
document.getElementById('chkBulkExclusion').checked = true;
|
||||||
|
document.getElementById('chkDeferSurpluses').checked = false;
|
||||||
|
document.getElementById('chkImmediateElect').checked = true;
|
||||||
|
document.getElementById('txtMinThreshold').value = '0';
|
||||||
|
document.getElementById('selNumbers').value = 'fixed';
|
||||||
|
document.getElementById('txtDP').value = '5';
|
||||||
|
document.getElementById('txtPPDP').value = '2';
|
||||||
|
document.getElementById('chkNormaliseBallots').checked = false;
|
||||||
|
document.getElementById('chkRoundQuota').checked = true;
|
||||||
|
document.getElementById('txtRoundQuota').value = '0';
|
||||||
|
document.getElementById('chkRoundVotes').checked = false;
|
||||||
|
document.getElementById('chkRoundSFs').checked = false;
|
||||||
|
document.getElementById('chkRoundValues').checked = false;
|
||||||
|
document.getElementById('selSumTransfers').value = 'by_value';
|
||||||
|
document.getElementById('selSurplus').value = 'by_size';
|
||||||
|
document.getElementById('selMethod').value = 'wig';
|
||||||
|
document.getElementById('selPapers').value = 'both';
|
||||||
|
document.getElementById('selExclusion').value = 'wright';
|
||||||
|
document.getElementById('selTies').value = 'random';
|
||||||
|
} else if (document.getElementById('selPreset').value === 'prsa77') {
|
||||||
|
document.getElementById('selQuotaCriterion').value = 'geq';
|
||||||
|
document.getElementById('selQuota').value = 'droop';
|
||||||
|
document.getElementById('selQuotaMode').value = 'static';
|
||||||
|
document.getElementById('chkBulkElection').checked = true;
|
||||||
|
document.getElementById('chkBulkExclusion').checked = false;
|
||||||
|
document.getElementById('chkDeferSurpluses').checked = true;
|
||||||
|
document.getElementById('chkImmediateElect').checked = true;
|
||||||
|
document.getElementById('txtMinThreshold').value = '0';
|
||||||
|
document.getElementById('selNumbers').value = 'fixed';
|
||||||
|
document.getElementById('txtDP').value = '6';
|
||||||
|
document.getElementById('txtPPDP').value = '3';
|
||||||
|
document.getElementById('chkNormaliseBallots').checked = false;
|
||||||
|
document.getElementById('chkRoundQuota').checked = true;
|
||||||
|
document.getElementById('txtRoundQuota').value = '3';
|
||||||
|
document.getElementById('chkRoundVotes').checked = true;
|
||||||
|
document.getElementById('txtRoundVotes').value = '3';
|
||||||
|
document.getElementById('chkRoundSFs').checked = true;
|
||||||
|
document.getElementById('txtRoundSFs').value = '3';
|
||||||
|
document.getElementById('chkRoundValues').checked = true;
|
||||||
|
document.getElementById('txtRoundValues').value = '3';
|
||||||
|
document.getElementById('selSumTransfers').value = 'by_value';
|
||||||
|
document.getElementById('selSurplus').value = 'by_order';
|
||||||
|
document.getElementById('selMethod').value = 'eg';
|
||||||
|
document.getElementById('selPapers').value = 'transferable';
|
||||||
|
document.getElementById('selExclusion').value = 'parcels_by_order';
|
||||||
|
document.getElementById('selTies').value = 'backwards,random';
|
||||||
|
} else if (document.getElementById('selPreset').value === 'ers97') {
|
||||||
|
document.getElementById('selQuotaCriterion').value = 'geq';
|
||||||
|
document.getElementById('selQuota').value = 'droop_exact';
|
||||||
|
document.getElementById('selQuotaMode').value = 'ers97';
|
||||||
|
document.getElementById('chkBulkElection').checked = true;
|
||||||
|
document.getElementById('chkBulkExclusion').checked = true;
|
||||||
|
document.getElementById('chkDeferSurpluses').checked = true;
|
||||||
|
document.getElementById('chkImmediateElect').checked = true;
|
||||||
|
document.getElementById('txtMinThreshold').value = '0';
|
||||||
|
document.getElementById('selNumbers').value = 'fixed';
|
||||||
|
document.getElementById('txtDP').value = '5';
|
||||||
|
document.getElementById('txtPPDP').value = '2';
|
||||||
|
document.getElementById('chkNormaliseBallots').checked = false;
|
||||||
|
document.getElementById('chkRoundQuota').checked = true;
|
||||||
|
document.getElementById('txtRoundQuota').value = '2';
|
||||||
|
document.getElementById('chkRoundVotes').checked = true;
|
||||||
|
document.getElementById('txtRoundVotes').value = '2';
|
||||||
|
document.getElementById('chkRoundSFs').checked = true;
|
||||||
|
document.getElementById('txtRoundSFs').value = '2';
|
||||||
|
document.getElementById('chkRoundValues').checked = true;
|
||||||
|
document.getElementById('txtRoundValues').value = '2';
|
||||||
|
document.getElementById('selSumTransfers').value = 'by_value';
|
||||||
|
document.getElementById('selSurplus').value = 'by_size';
|
||||||
|
document.getElementById('selMethod').value = 'eg';
|
||||||
|
document.getElementById('selPapers').value = 'transferable';
|
||||||
|
document.getElementById('selExclusion').value = 'by_value';
|
||||||
|
document.getElementById('selTies').value = 'forwards,random';
|
||||||
|
} else if (document.getElementById('selPreset').value === 'ers76') {
|
||||||
|
document.getElementById('selQuotaCriterion').value = 'geq';
|
||||||
|
document.getElementById('selQuota').value = 'droop_exact';
|
||||||
|
document.getElementById('selQuotaMode').value = 'ers76';
|
||||||
|
document.getElementById('chkBulkElection').checked = true;
|
||||||
|
document.getElementById('chkBulkExclusion').checked = true;
|
||||||
|
document.getElementById('chkDeferSurpluses').checked = true;
|
||||||
|
document.getElementById('chkImmediateElect').checked = true;
|
||||||
|
document.getElementById('txtMinThreshold').value = '0';
|
||||||
|
document.getElementById('selNumbers').value = 'fixed';
|
||||||
|
document.getElementById('txtDP').value = '5';
|
||||||
|
document.getElementById('txtPPDP').value = '2';
|
||||||
|
document.getElementById('chkNormaliseBallots').checked = false;
|
||||||
|
document.getElementById('chkRoundQuota').checked = true;
|
||||||
|
document.getElementById('txtRoundQuota').value = '2';
|
||||||
|
document.getElementById('chkRoundVotes').checked = true;
|
||||||
|
document.getElementById('txtRoundVotes').value = '2';
|
||||||
|
document.getElementById('chkRoundSFs').checked = true;
|
||||||
|
document.getElementById('txtRoundSFs').value = '2';
|
||||||
|
document.getElementById('chkRoundValues').checked = true;
|
||||||
|
document.getElementById('txtRoundValues').value = '2';
|
||||||
|
document.getElementById('selSumTransfers').value = 'by_value';
|
||||||
|
document.getElementById('selSurplus').value = 'by_size';
|
||||||
|
document.getElementById('selMethod').value = 'eg';
|
||||||
|
document.getElementById('selPapers').value = 'transferable';
|
||||||
|
document.getElementById('selExclusion').value = 'by_value';
|
||||||
|
document.getElementById('selTies').value = 'forwards,random';
|
||||||
|
} else if (document.getElementById('selPreset').value === 'ers73') {
|
||||||
|
document.getElementById('selQuotaCriterion').value = 'geq';
|
||||||
|
document.getElementById('selQuota').value = 'droop_exact';
|
||||||
|
document.getElementById('selQuotaMode').value = 'static';
|
||||||
|
document.getElementById('chkBulkElection').checked = true;
|
||||||
|
document.getElementById('chkBulkExclusion').checked = true;
|
||||||
|
document.getElementById('chkDeferSurpluses').checked = true;
|
||||||
|
document.getElementById('chkImmediateElect').checked = true;
|
||||||
|
document.getElementById('txtMinThreshold').value = '0';
|
||||||
|
document.getElementById('selNumbers').value = 'fixed';
|
||||||
|
document.getElementById('txtDP').value = '5';
|
||||||
|
document.getElementById('txtPPDP').value = '2';
|
||||||
|
document.getElementById('chkNormaliseBallots').checked = false;
|
||||||
|
document.getElementById('chkRoundQuota').checked = true;
|
||||||
|
document.getElementById('txtRoundQuota').value = '2';
|
||||||
|
document.getElementById('chkRoundVotes').checked = true;
|
||||||
|
document.getElementById('txtRoundVotes').value = '2';
|
||||||
|
document.getElementById('chkRoundSFs').checked = true;
|
||||||
|
document.getElementById('txtRoundSFs').value = '2';
|
||||||
|
document.getElementById('chkRoundValues').checked = true;
|
||||||
|
document.getElementById('txtRoundValues').value = '2';
|
||||||
|
document.getElementById('selSumTransfers').value = 'by_value';
|
||||||
|
document.getElementById('selSurplus').value = 'by_size';
|
||||||
|
document.getElementById('selMethod').value = 'eg';
|
||||||
|
document.getElementById('selPapers').value = 'transferable';
|
||||||
|
document.getElementById('selExclusion').value = 'by_value';
|
||||||
|
document.getElementById('selTies').value = 'forwards,random';
|
||||||
|
} else if (document.getElementById('selPreset').value === 'cofe') {
|
||||||
|
document.getElementById('selQuotaCriterion').value = 'geq';
|
||||||
|
document.getElementById('selQuota').value = 'droop';
|
||||||
|
document.getElementById('selQuotaMode').value = 'static';
|
||||||
|
document.getElementById('chkBulkElection').checked = true;
|
||||||
|
document.getElementById('chkBulkExclusion').checked = false;
|
||||||
|
document.getElementById('chkDeferSurpluses').checked = true;
|
||||||
|
document.getElementById('chkImmediateElect').checked = true;
|
||||||
|
document.getElementById('txtMinThreshold').value = '0';
|
||||||
|
document.getElementById('selNumbers').value = 'fixed';
|
||||||
|
document.getElementById('txtDP').value = '5';
|
||||||
|
document.getElementById('txtPPDP').value = '2';
|
||||||
|
document.getElementById('chkNormaliseBallots').checked = false;
|
||||||
|
document.getElementById('chkRoundQuota').checked = true;
|
||||||
|
document.getElementById('txtRoundQuota').value = '2';
|
||||||
|
document.getElementById('chkRoundVotes').checked = true;
|
||||||
|
document.getElementById('txtRoundVotes').value = '2';
|
||||||
|
document.getElementById('chkRoundSFs').checked = true;
|
||||||
|
document.getElementById('txtRoundSFs').value = '2';
|
||||||
|
document.getElementById('chkRoundValues').checked = true;
|
||||||
|
document.getElementById('txtRoundValues').value = '2';
|
||||||
|
document.getElementById('selSumTransfers').value = 'per_ballot';
|
||||||
|
document.getElementById('selSurplus').value = 'by_size';
|
||||||
|
document.getElementById('selMethod').value = 'eg';
|
||||||
|
document.getElementById('selPapers').value = 'transferable';
|
||||||
|
document.getElementById('selExclusion').value = 'by_value';
|
||||||
|
document.getElementById('selTies').value = 'forwards,random';
|
||||||
|
}
|
||||||
|
}
|
@ -24,6 +24,7 @@ use crate::election::{Candidate, CountState};
|
|||||||
use crate::numbers::Number;
|
use crate::numbers::Number;
|
||||||
use crate::stv::{STVOptions, SumSurplusTransfersMode};
|
use crate::stv::{STVOptions, SumSurplusTransfersMode};
|
||||||
|
|
||||||
|
use std::cmp::max;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
/// Table describing vote transfers during a surplus distribution or exclusion
|
/// Table describing vote transfers during a surplus distribution or exclusion
|
||||||
@ -128,7 +129,7 @@ impl<'e, N: Number> TransferTable<'e, N> {
|
|||||||
|
|
||||||
// Iterate through columns
|
// Iterate through columns
|
||||||
for column in self.columns.iter_mut() {
|
for column in self.columns.iter_mut() {
|
||||||
let mut new_value_fraction = N::new();
|
let mut new_value_fraction;
|
||||||
if self.surplus.is_some() && opts.sum_surplus_transfers == SumSurplusTransfersMode::PerBallot {
|
if self.surplus.is_some() && opts.sum_surplus_transfers == SumSurplusTransfersMode::PerBallot {
|
||||||
if is_weighted {
|
if is_weighted {
|
||||||
new_value_fraction = column.value_fraction.clone();
|
new_value_fraction = column.value_fraction.clone();
|
||||||
@ -153,6 +154,8 @@ impl<'e, N: Number> TransferTable<'e, N> {
|
|||||||
if let Some(dps) = opts.round_values {
|
if let Some(dps) = opts.round_values {
|
||||||
new_value_fraction.floor_mut(dps);
|
new_value_fraction.floor_mut(dps);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
new_value_fraction = column.value_fraction.clone();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Candidate votes
|
// Candidate votes
|
||||||
@ -167,8 +170,13 @@ impl<'e, N: Number> TransferTable<'e, N> {
|
|||||||
self.total.cells.get_mut(*candidate).unwrap().votes_in += &votes_in;
|
self.total.cells.get_mut(*candidate).unwrap().votes_in += &votes_in;
|
||||||
self.total.total.votes_in += votes_in;
|
self.total.total.votes_in += votes_in;
|
||||||
|
|
||||||
if self.surplus.is_some() && opts.sum_surplus_transfers == SumSurplusTransfersMode::PerBallot {
|
if self.surplus.is_some() || opts.sum_surplus_transfers == SumSurplusTransfersMode::PerBallot {
|
||||||
let votes_out = cell.ballots.clone() * &new_value_fraction;
|
let mut votes_out = cell.ballots.clone() * &new_value_fraction;
|
||||||
|
// Round if required
|
||||||
|
if let Some(dps) = opts.round_votes {
|
||||||
|
votes_out.floor_mut(dps);
|
||||||
|
}
|
||||||
|
|
||||||
cell.votes_out += &votes_out;
|
cell.votes_out += &votes_out;
|
||||||
column.total.votes_out += &votes_out;
|
column.total.votes_out += &votes_out;
|
||||||
self.total.cells.get_mut(*candidate).unwrap().votes_out += &votes_out;
|
self.total.cells.get_mut(*candidate).unwrap().votes_out += &votes_out;
|
||||||
@ -187,9 +195,14 @@ impl<'e, N: Number> TransferTable<'e, N> {
|
|||||||
self.total.exhausted.votes_in += &votes_in;
|
self.total.exhausted.votes_in += &votes_in;
|
||||||
self.total.total.votes_in += votes_in;
|
self.total.total.votes_in += votes_in;
|
||||||
|
|
||||||
if self.surplus.is_some() && opts.sum_surplus_transfers == SumSurplusTransfersMode::PerBallot {
|
if self.surplus.is_some() || opts.sum_surplus_transfers == SumSurplusTransfersMode::PerBallot {
|
||||||
if !opts.transferable_only {
|
if !opts.transferable_only {
|
||||||
let votes_out = column.exhausted.ballots.clone() * &new_value_fraction;
|
let mut votes_out = column.exhausted.ballots.clone() * &new_value_fraction;
|
||||||
|
// Round if required
|
||||||
|
if let Some(dps) = opts.round_votes {
|
||||||
|
votes_out.floor_mut(dps);
|
||||||
|
}
|
||||||
|
|
||||||
column.exhausted.votes_out += &votes_out;
|
column.exhausted.votes_out += &votes_out;
|
||||||
column.total.votes_out += &votes_out;
|
column.total.votes_out += &votes_out;
|
||||||
self.total.exhausted.votes_out += &votes_out;
|
self.total.exhausted.votes_out += &votes_out;
|
||||||
@ -198,10 +211,11 @@ impl<'e, N: Number> TransferTable<'e, N> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Need to calculate votes_out?
|
// Need to calculate total candidate votes_out?
|
||||||
if self.surplus.is_none() || opts.sum_surplus_transfers == SumSurplusTransfersMode::ByValue {
|
if opts.sum_surplus_transfers == SumSurplusTransfersMode::ByValue {
|
||||||
for (_candidate, cell) in self.total.cells.iter_mut() {
|
for (_candidate, cell) in self.total.cells.iter_mut() {
|
||||||
let mut votes_out;
|
let mut votes_out;
|
||||||
|
|
||||||
if is_weighted || self.surpfrac.is_none() {
|
if is_weighted || self.surpfrac.is_none() {
|
||||||
// NB: If surplus.is_none, then votes transferred at values received
|
// NB: If surplus.is_none, then votes transferred at values received
|
||||||
votes_out = cell.votes_in.clone();
|
votes_out = cell.votes_in.clone();
|
||||||
@ -296,7 +310,7 @@ impl<'e, N: Number> TransferTable<'e, N> {
|
|||||||
let mut table = Table::new();
|
let mut table = Table::new();
|
||||||
set_table_format(&mut table);
|
set_table_format(&mut table);
|
||||||
|
|
||||||
let show_transfers_per_ballot = self.surpfrac.is_some() && opts.sum_surplus_transfers == SumSurplusTransfersMode::PerBallot;
|
let show_transfers_per_ballot = self.surpfrac.is_some() || opts.sum_surplus_transfers == SumSurplusTransfersMode::PerBallot;
|
||||||
|
|
||||||
let num_cols;
|
let num_cols;
|
||||||
if show_transfers_per_ballot {
|
if show_transfers_per_ballot {
|
||||||
@ -315,15 +329,21 @@ impl<'e, N: Number> TransferTable<'e, N> {
|
|||||||
let mut row = Vec::with_capacity(num_cols);
|
let mut row = Vec::with_capacity(num_cols);
|
||||||
row.push(Cell::new("Preference"));
|
row.push(Cell::new("Preference"));
|
||||||
for column in self.columns.iter() {
|
for column in self.columns.iter() {
|
||||||
row.push(Cell::new(&format!("Ballots @ {:.dps$}", column.value_fraction, dps=opts.pp_decimals)).style_spec("cH2"));
|
row.push(Cell::new(&format!("Ballots @ {:.dps2$}", column.value_fraction, dps2=max(opts.pp_decimals, 2))).style_spec("cH2"));
|
||||||
|
|
||||||
if show_transfers_per_ballot {
|
if show_transfers_per_ballot {
|
||||||
row.push(Cell::new(&format!("× {:.dps$}", self.surpfrac.as_ref().unwrap(), dps=opts.pp_decimals)).style_spec("r"));
|
if self.surplus.is_some() {
|
||||||
|
row.push(Cell::new(&format!("× {:.dps2$}", self.surpfrac.as_ref().unwrap(), dps2=max(opts.pp_decimals, 2))).style_spec("r"));
|
||||||
|
} else {
|
||||||
|
row.push(Cell::new("=").style_spec("c"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
row.push(Cell::new("Total").style_spec("cH2"));
|
row.push(Cell::new("Total").style_spec("cH2"));
|
||||||
if self.surpfrac.is_some() {
|
if self.surpfrac.is_some() {
|
||||||
row.push(Cell::new(&format!("× {:.dps$}", self.surpfrac.as_ref().unwrap(), dps=opts.pp_decimals)).style_spec("r"));
|
row.push(Cell::new(&format!("× {:.dps2$}", self.surpfrac.as_ref().unwrap(), dps2=max(opts.pp_decimals, 2))).style_spec("r"));
|
||||||
|
} else if show_transfers_per_ballot {
|
||||||
|
row.push(Cell::new("=").style_spec("c"));
|
||||||
}
|
}
|
||||||
table.set_titles(Row::new(row));
|
table.set_titles(Row::new(row));
|
||||||
|
|
||||||
@ -353,13 +373,13 @@ impl<'e, N: Number> TransferTable<'e, N> {
|
|||||||
if let Some(cell) = self.total.cells.get(candidate) {
|
if let Some(cell) = self.total.cells.get(candidate) {
|
||||||
row.push(Cell::new(&format!("{:.0}", cell.ballots)).style_spec("r"));
|
row.push(Cell::new(&format!("{:.0}", cell.ballots)).style_spec("r"));
|
||||||
row.push(Cell::new(&format!("{:.dps$}", cell.votes_in, dps=opts.pp_decimals)).style_spec("r"));
|
row.push(Cell::new(&format!("{:.dps$}", cell.votes_in, dps=opts.pp_decimals)).style_spec("r"));
|
||||||
if self.surpfrac.is_some() {
|
if self.surpfrac.is_some() || show_transfers_per_ballot {
|
||||||
row.push(Cell::new(&format!("{:.dps$}", cell.votes_out, dps=opts.pp_decimals)).style_spec("r"));
|
row.push(Cell::new(&format!("{:.dps$}", cell.votes_out, dps=opts.pp_decimals)).style_spec("r"));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
row.push(Cell::new(""));
|
row.push(Cell::new(""));
|
||||||
row.push(Cell::new(""));
|
row.push(Cell::new(""));
|
||||||
if self.surpfrac.is_some() {
|
if self.surpfrac.is_some() || show_transfers_per_ballot {
|
||||||
row.push(Cell::new(""));
|
row.push(Cell::new(""));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -396,7 +416,7 @@ impl<'e, N: Number> TransferTable<'e, N> {
|
|||||||
if !self.total.exhausted.ballots.is_zero() {
|
if !self.total.exhausted.ballots.is_zero() {
|
||||||
row.push(Cell::new(&format!("{:.0}", self.total.exhausted.ballots)).style_spec("r"));
|
row.push(Cell::new(&format!("{:.0}", self.total.exhausted.ballots)).style_spec("r"));
|
||||||
row.push(Cell::new(&format!("{:.dps$}", self.total.exhausted.votes_in, dps=opts.pp_decimals)).style_spec("r"));
|
row.push(Cell::new(&format!("{:.dps$}", self.total.exhausted.votes_in, dps=opts.pp_decimals)).style_spec("r"));
|
||||||
if self.surpfrac.is_some() {
|
if self.surpfrac.is_some() || show_transfers_per_ballot {
|
||||||
if self.total.exhausted.votes_out.is_zero() {
|
if self.total.exhausted.votes_out.is_zero() {
|
||||||
row.push(Cell::new("-").style_spec("c"));
|
row.push(Cell::new("-").style_spec("c"));
|
||||||
} else {
|
} else {
|
||||||
@ -406,7 +426,7 @@ impl<'e, N: Number> TransferTable<'e, N> {
|
|||||||
} else {
|
} else {
|
||||||
row.push(Cell::new(""));
|
row.push(Cell::new(""));
|
||||||
row.push(Cell::new(""));
|
row.push(Cell::new(""));
|
||||||
if self.surpfrac.is_some() {
|
if self.surpfrac.is_some() || show_transfers_per_ballot {
|
||||||
row.push(Cell::new(""));
|
row.push(Cell::new(""));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -446,7 +466,7 @@ impl<'e, N: Number> TransferTable<'e, N> {
|
|||||||
|
|
||||||
row.push(Cell::new(&format!("{:.0}", gt_ballots)).style_spec("r"));
|
row.push(Cell::new(&format!("{:.0}", gt_ballots)).style_spec("r"));
|
||||||
row.push(Cell::new(&format!("{:.dps$}", gt_votes_in, dps=opts.pp_decimals)).style_spec("r"));
|
row.push(Cell::new(&format!("{:.dps$}", gt_votes_in, dps=opts.pp_decimals)).style_spec("r"));
|
||||||
if self.surpfrac.is_some() {
|
if self.surpfrac.is_some() || show_transfers_per_ballot {
|
||||||
row.push(Cell::new(&format!("{:.dps$}", gt_votes_out, dps=opts.pp_decimals)).style_spec("r"));
|
row.push(Cell::new(&format!("{:.dps$}", gt_votes_out, dps=opts.pp_decimals)).style_spec("r"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user