pub fn seq_phragmen<AccountId: IdentifierT, P: PerThing128>( to_elect: usize, candidates: Vec<AccountId>, voters: Vec<(AccountId, VoteWeight, impl IntoIterator<Item = AccountId>)>, balancing: Option<BalancingConfig> ) -> Result<ElectionResult<AccountId, P>, Error>
Execute sequential phragmen with potentially some rounds of
balancing. The return type is list
of winners and a weight distribution vector of all voters who contribute to the winners.
- This function is a best effort to elect
roundsmembers. Nonetheless, if less candidates are available, it will only return what is available. It is the responsibility of the call site to ensure they have provided enough members.
iiterations of balancing is with tolerance
- Returning winners are sorted based on desirability. Voters are unsorted. Nonetheless, seq-phragmen is in general an un-ranked election and the desirability should not be interpreted with any significance.
- The returning winners are zipped with their final backing stake. Yet, to get the exact final
weight distribution from the winner’s point of view, one needs to build a support map. See
crate::SupportMapfor more info. Note that this backing stake is computed in ExtendedBalance and may be slightly different that what will be computed from the support map, due to accuracy loss.
- The accuracy of the returning edge weight ratios can be configured via the
- The returning weight distribution is normalized, meaning that it is guaranteed that the sum
of the ratios in each voter’s distribution sums up to exactly
This can only fail of the normalization fails. This can happen if for any of the resulting
assignment.distribution.map(|p| p.deconstruct()).sum() fails to fit inside
UpperOf<P>. A user of this crate may statically assert that this can never happen and safely
expect this to return
This can only fail if the normalization fails.
Note that rounding errors can potentially cause the output of this function to fail a t-PJR check where t is the standard threshold. The underlying algorithm is sound, but the conversions between numeric types can be lossy.