From f717a204465d5a2fe5303c33073ac812983e7a0f Mon Sep 17 00:00:00 2001 From: Krishna Singh Date: Thu, 3 Dec 2020 18:14:53 +0530 Subject: [PATCH] Changed map to filter map so that Phragmen ignores empty voters (#7378) * Changed map to filter map so that Phragmen ignores empty voters * Resolve flaws and added test case * Updated test --- .../primitives/npos-elections/src/lib.rs | 18 ++++++--- .../primitives/npos-elections/src/tests.rs | 40 +++++++++++++++++++ 2 files changed, 52 insertions(+), 6 deletions(-) diff --git a/substrate/primitives/npos-elections/src/lib.rs b/substrate/primitives/npos-elections/src/lib.rs index 11951d2065..d82839f020 100644 --- a/substrate/primitives/npos-elections/src/lib.rs +++ b/substrate/primitives/npos-elections/src/lib.rs @@ -629,7 +629,7 @@ pub(crate) fn setup_inputs( }) .collect::>>(); - let voters = initial_voters.into_iter().map(|(who, voter_stake, votes)| { + let voters = initial_voters.into_iter().filter_map(|(who, voter_stake, votes)| { let mut edges: Vec> = Vec::with_capacity(votes.len()); for v in votes { if edges.iter().any(|e| e.who == v) { @@ -650,12 +650,18 @@ pub(crate) fn setup_inputs( ); } // else {} would be wrong votes. We don't really care about it. } - Voter { - who, - edges: edges, - budget: voter_stake.into(), - load: Rational128::zero(), + if edges.is_empty() { + None } + else { + Some(Voter { + who, + edges: edges, + budget: voter_stake.into(), + load: Rational128::zero(), + }) + } + }).collect::>(); (candidates, voters,) diff --git a/substrate/primitives/npos-elections/src/tests.rs b/substrate/primitives/npos-elections/src/tests.rs index dc7a1a5fdf..79f95a469a 100644 --- a/substrate/primitives/npos-elections/src/tests.rs +++ b/substrate/primitives/npos-elections/src/tests.rs @@ -72,6 +72,46 @@ fn float_phragmen_poc_works() { ); } +#[test] +fn phragmen_core_test_without_edges() { + let candidates = vec![1, 2, 3]; + let voters = vec![ + (10, 10, vec![]), + (20, 20, vec![]), + (30, 30, vec![]), + ]; + + let (candidates, voters) = setup_inputs(candidates, voters); + + assert_eq!( + voters + .iter() + .map(|v| ( + v.who, + v.budget, + (v.edges.iter().map(|e| (e.who, e.weight)).collect::>()), + )) + .collect::>(), + vec![] + ); + + assert_eq!( + candidates + .iter() + .map(|c_ptr| ( + c_ptr.borrow().who, + c_ptr.borrow().elected, + c_ptr.borrow().round, + c_ptr.borrow().backed_stake, + )).collect::>(), + vec![ + (1, false, 0, 0), + (2, false, 0, 0), + (3, false, 0, 0), + ] + ); +} + #[test] fn phragmen_core_poc_works() { let candidates = vec![1, 2, 3];