Skip to content

Commit d78553b

Browse files
jaxter03darkfriend77
authored andcommitted
Changed map to filter map so that Phragmen ignores empty voters (paritytech#7378)
* Changed map to filter map so that Phragmen ignores empty voters * Resolve flaws and added test case * Updated test
1 parent 0e86126 commit d78553b

File tree

2 files changed

+52
-6
lines changed

2 files changed

+52
-6
lines changed

primitives/npos-elections/src/lib.rs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -629,7 +629,7 @@ pub(crate) fn setup_inputs<AccountId: IdentifierT>(
629629
})
630630
.collect::<Vec<CandidatePtr<AccountId>>>();
631631

632-
let voters = initial_voters.into_iter().map(|(who, voter_stake, votes)| {
632+
let voters = initial_voters.into_iter().filter_map(|(who, voter_stake, votes)| {
633633
let mut edges: Vec<Edge<AccountId>> = Vec::with_capacity(votes.len());
634634
for v in votes {
635635
if edges.iter().any(|e| e.who == v) {
@@ -650,12 +650,18 @@ pub(crate) fn setup_inputs<AccountId: IdentifierT>(
650650
);
651651
} // else {} would be wrong votes. We don't really care about it.
652652
}
653-
Voter {
654-
who,
655-
edges: edges,
656-
budget: voter_stake.into(),
657-
load: Rational128::zero(),
653+
if edges.is_empty() {
654+
None
655+
}
656+
else {
657+
Some(Voter {
658+
who,
659+
edges: edges,
660+
budget: voter_stake.into(),
661+
load: Rational128::zero(),
662+
})
658663
}
664+
659665
}).collect::<Vec<_>>();
660666

661667
(candidates, voters,)

primitives/npos-elections/src/tests.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,46 @@ fn float_phragmen_poc_works() {
7272
);
7373
}
7474

75+
#[test]
76+
fn phragmen_core_test_without_edges() {
77+
let candidates = vec![1, 2, 3];
78+
let voters = vec![
79+
(10, 10, vec![]),
80+
(20, 20, vec![]),
81+
(30, 30, vec![]),
82+
];
83+
84+
let (candidates, voters) = setup_inputs(candidates, voters);
85+
86+
assert_eq!(
87+
voters
88+
.iter()
89+
.map(|v| (
90+
v.who,
91+
v.budget,
92+
(v.edges.iter().map(|e| (e.who, e.weight)).collect::<Vec<_>>()),
93+
))
94+
.collect::<Vec<_>>(),
95+
vec![]
96+
);
97+
98+
assert_eq!(
99+
candidates
100+
.iter()
101+
.map(|c_ptr| (
102+
c_ptr.borrow().who,
103+
c_ptr.borrow().elected,
104+
c_ptr.borrow().round,
105+
c_ptr.borrow().backed_stake,
106+
)).collect::<Vec<_>>(),
107+
vec![
108+
(1, false, 0, 0),
109+
(2, false, 0, 0),
110+
(3, false, 0, 0),
111+
]
112+
);
113+
}
114+
75115
#[test]
76116
fn phragmen_core_poc_works() {
77117
let candidates = vec![1, 2, 3];

0 commit comments

Comments
 (0)