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>
Expand description

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 rounds members. 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.
  • If balance parameter is Some(i, t), i iterations of balancing is with tolerance t is performed.
  • 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::SupportMap for 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 P generic argument.
  • 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 P::one().

This can only fail of the normalization fails. This can happen if for any of the resulting assignments, 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 Ok.

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.