Implement forwards/backwards tie-breaking in web UI
This commit is contained in:
parent
2dc5ed963b
commit
daeb706b44
|
@ -114,25 +114,25 @@
|
|||
</select>
|
||||
</label>
|
||||
</div>
|
||||
<!--<div class="subheading">
|
||||
<div class="subheading">
|
||||
Tie-breaking:
|
||||
</div>
|
||||
<div>
|
||||
<label>
|
||||
Ties:
|
||||
<select id="selTies">
|
||||
<option value="backwards_random" selected>Backwards then random</option>
|
||||
<option value="forwards_random">Forwards then random</option>
|
||||
<option value="backwards,random" selected>Backwards then random</option>
|
||||
<option value="forwards,random">Forwards then random</option>
|
||||
<option value="random">Random</option>
|
||||
<option value="prompt">Prompt</option>
|
||||
</select>
|
||||
</label>
|
||||
<label>
|
||||
<!--<label>
|
||||
Random seed:
|
||||
<input type="text" id="txtSeed" value="">
|
||||
</label>
|
||||
</label>-->
|
||||
</div>
|
||||
<div class="subheading">
|
||||
<!--<div class="subheading">
|
||||
Constraints:
|
||||
</div>
|
||||
<div>
|
||||
|
|
|
@ -107,6 +107,7 @@ async function clickCount() {
|
|||
document.getElementById('selQuota').value,
|
||||
document.getElementById('selQuotaCriterion').value,
|
||||
document.getElementById('selQuotaMode').value,
|
||||
document.getElementById('selTies').value.split(','),
|
||||
document.getElementById('selTransfers').value,
|
||||
document.getElementById('selSurplus').value,
|
||||
document.getElementById('selPapers').value == 'transferable',
|
||||
|
@ -320,7 +321,7 @@ function changePreset() {
|
|||
document.getElementById('selTransfers').value = 'wig';
|
||||
document.getElementById('selPapers').value = 'both';
|
||||
document.getElementById('selExclusion').value = 'single_stage';
|
||||
//document.getElementById('selTies').value = 'backwards_random';
|
||||
document.getElementById('selTies').value = 'backwards,random';
|
||||
} else if (document.getElementById('selPreset').value === 'scottish') {
|
||||
document.getElementById('selQuotaCriterion').value = 'geq';
|
||||
document.getElementById('selQuota').value = 'droop';
|
||||
|
@ -343,7 +344,7 @@ function changePreset() {
|
|||
document.getElementById('selTransfers').value = 'wig';
|
||||
document.getElementById('selPapers').value = 'both';
|
||||
document.getElementById('selExclusion').value = 'single_stage';
|
||||
//document.getElementById('selTies').value = 'backwards_random';
|
||||
document.getElementById('selTies').value = 'backwards,random';
|
||||
} else if (document.getElementById('selPreset').value === 'senate') {
|
||||
document.getElementById('selQuotaCriterion').value = 'geq';
|
||||
document.getElementById('selQuota').value = 'droop';
|
||||
|
@ -366,7 +367,7 @@ function changePreset() {
|
|||
document.getElementById('selTransfers').value = 'uig';
|
||||
document.getElementById('selPapers').value = 'both';
|
||||
document.getElementById('selExclusion').value = 'by_value';
|
||||
//document.getElementById('selTies').value = 'backwards_random';
|
||||
document.getElementById('selTies').value = 'backwards,random';
|
||||
} else if (document.getElementById('selPreset').value === 'prsa77') {
|
||||
document.getElementById('selQuotaCriterion').value = 'geq';
|
||||
document.getElementById('selQuota').value = 'droop';
|
||||
|
@ -391,7 +392,7 @@ function changePreset() {
|
|||
document.getElementById('selTransfers').value = 'eg';
|
||||
document.getElementById('selPapers').value = 'transferable';
|
||||
document.getElementById('selExclusion').value = 'parcels_by_order';
|
||||
//document.getElementById('selTies').value = 'backwards_random';
|
||||
document.getElementById('selTies').value = 'backwards,random';
|
||||
} else if (document.getElementById('selPreset').value === 'ers97') {
|
||||
document.getElementById('selQuotaCriterion').value = 'geq';
|
||||
document.getElementById('selQuota').value = 'droop_exact';
|
||||
|
@ -416,6 +417,6 @@ function changePreset() {
|
|||
document.getElementById('selTransfers').value = 'eg';
|
||||
document.getElementById('selPapers').value = 'transferable';
|
||||
document.getElementById('selExclusion').value = 'by_value';
|
||||
//document.getElementById('selTies').value = 'forwards_random';
|
||||
document.getElementById('selTies').value = 'forwards,random';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -103,7 +103,7 @@ impl<'o> STVOptions<'o> {
|
|||
ties: ties.into_iter().map(|t| match t.as_str() {
|
||||
"forwards" => TieStrategy::Forwards,
|
||||
"backwards" => TieStrategy::Backwards,
|
||||
"random" => todo!(),
|
||||
"random" => TieStrategy::Random(&"TODO"),
|
||||
"prompt" => TieStrategy::Prompt,
|
||||
_ => panic!("Invalid --ties"),
|
||||
}).collect(),
|
||||
|
|
|
@ -55,13 +55,13 @@ macro_rules! impl_type {
|
|||
|
||||
#[wasm_bindgen]
|
||||
#[allow(non_snake_case)]
|
||||
pub fn [<count_init_$type>](state: &mut [<CountState$type>], opts: &STVOptionsWrapper) {
|
||||
pub fn [<count_init_$type>](state: &mut [<CountState$type>], opts: &STVOptions) {
|
||||
stv::count_init(&mut state.0, &opts.0);
|
||||
}
|
||||
|
||||
#[wasm_bindgen]
|
||||
#[allow(non_snake_case)]
|
||||
pub fn [<count_one_stage_$type>](state: &mut [<CountState$type>], opts: &STVOptionsWrapper) -> Result<bool, JsValue> {
|
||||
pub fn [<count_one_stage_$type>](state: &mut [<CountState$type>], opts: &STVOptions) -> Result<bool, JsValue> {
|
||||
match stv::count_one_stage(&mut state.0, &opts.0) {
|
||||
Ok(v) => Ok(v),
|
||||
Err(stv::STVError::RequireInput) => Err("RequireInput".into()),
|
||||
|
@ -73,19 +73,19 @@ macro_rules! impl_type {
|
|||
|
||||
#[wasm_bindgen]
|
||||
#[allow(non_snake_case)]
|
||||
pub fn [<init_results_table_$type>](election: &[<Election$type>], opts: &STVOptionsWrapper) -> String {
|
||||
pub fn [<init_results_table_$type>](election: &[<Election$type>], opts: &STVOptions) -> String {
|
||||
return init_results_table(&election.0, &opts.0);
|
||||
}
|
||||
|
||||
#[wasm_bindgen]
|
||||
#[allow(non_snake_case)]
|
||||
pub fn [<describe_count_$type>](filename: String, election: &[<Election$type>], opts: &STVOptionsWrapper) -> String {
|
||||
pub fn [<describe_count_$type>](filename: String, election: &[<Election$type>], opts: &STVOptions) -> String {
|
||||
return describe_count(filename, &election.0, &opts.0);
|
||||
}
|
||||
|
||||
#[wasm_bindgen]
|
||||
#[allow(non_snake_case)]
|
||||
pub fn [<update_results_table_$type>](stage_num: usize, state: &[<CountState$type>], opts: &STVOptionsWrapper) -> Array {
|
||||
pub fn [<update_results_table_$type>](stage_num: usize, state: &[<CountState$type>], opts: &STVOptions) -> Array {
|
||||
return update_results_table(stage_num, &state.0, &opts.0);
|
||||
}
|
||||
|
||||
|
@ -141,7 +141,50 @@ impl_type!(NativeFloat64);
|
|||
impl_type!(Rational);
|
||||
|
||||
#[wasm_bindgen]
|
||||
pub struct STVOptionsWrapper(stv::STVOptions<'static>);
|
||||
pub struct STVOptions(stv::STVOptions<'static>);
|
||||
|
||||
#[wasm_bindgen]
|
||||
impl STVOptions {
|
||||
pub fn new(
|
||||
round_tvs: Option<usize>,
|
||||
round_weights: Option<usize>,
|
||||
round_votes: Option<usize>,
|
||||
round_quota: Option<usize>,
|
||||
sum_surplus_transfers: &str,
|
||||
normalise_ballots: bool,
|
||||
quota: &str,
|
||||
quota_criterion: &str,
|
||||
quota_mode: &str,
|
||||
ties: Array,
|
||||
surplus: &str,
|
||||
surplus_order: &str,
|
||||
transferable_only: bool,
|
||||
exclusion: &str,
|
||||
bulk_exclude: bool,
|
||||
defer_surpluses: bool,
|
||||
pp_decimals: usize,
|
||||
) -> Self {
|
||||
Self(stv::STVOptions::new(
|
||||
round_tvs,
|
||||
round_weights,
|
||||
round_votes,
|
||||
round_quota,
|
||||
sum_surplus_transfers,
|
||||
normalise_ballots,
|
||||
quota,
|
||||
quota_criterion,
|
||||
quota_mode,
|
||||
&ties.iter().map(|v| v.as_string().unwrap()).collect(),
|
||||
surplus,
|
||||
surplus_order,
|
||||
transferable_only,
|
||||
exclusion,
|
||||
bulk_exclude,
|
||||
defer_surpluses,
|
||||
pp_decimals,
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
// Reporting
|
||||
|
||||
|
|
|
@ -38,7 +38,7 @@ impl<'s> TieStrategy<'s> {
|
|||
match self {
|
||||
Self::Forwards => "forwards",
|
||||
Self::Backwards => "backwards",
|
||||
Self::Random(_) => todo!(),
|
||||
Self::Random(_) => "random",
|
||||
Self::Prompt => "prompt",
|
||||
}.to_string()
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue