pub struct PhragmenModelConfig<Backed> {
pub weighted: bool,
pub scale: Option<Backed>,
}Expand description
Configuration for the PhragmenModel plugin model
This struct allows fine-tuning of the Phragmen election algorithm to produce different variants of fair elections, including weighted, sequential, and scaled variants.
Each field modifies how candidates are evaluated and how backer loads are computed.
§References:
- Phragmen voting - Wikipedia
- Enestrom, E. “Mathematical Theory of Proportional Representation”, 1896
- Thiele, T. N., “Proportional Representation in Elections”, 1895
Fields§
§weighted: boolweighted: If true, the algorithm scales each backer’s contribution by their
influence or stake.
- Behavior when true: Candidates supported by high-influence backers contribute more to the backers’ load. The algorithm prioritizes minimizing load while respecting weighted influence, meaning candidates with concentrated high-weight backers may be elected later to balance maximum loads.
- Behavior when false: All backers’ contributions are treated equally. Only the sum of contributions matters, ignoring stake or influence differences.
scale: Option<Backed>scale: Optional multiplier applied to backer contributions when weighted is true.
- Behavior when Some(value): Each backer’s contribution is multiplied by
scale. This allows amplifying or reducing the effective weight of all backers, controlling how heavily influence/stake impacts candidate ranking. - Behavior when None: Contributions are used as-is, without additional scaling.
Trait Implementations§
Source§impl<Candidate, FairWeight, Backer, Backed, Input, Output> PurePluginModel<Input, PhragmenModelConfig<Backed>, Output> for PhragmenModelwhere
Input: IntoIterator<Item = (Candidate, FairWeight)> + Clone,
Output: FromIterator<Candidate>,
FairWeight: IntoIterator<Item = (Backer, Backed)> + Clone,
Backed: Clone + Zero + Add<Output = Backed> + Ord + Div<usize, Output = Backed> + Mul<Backed, Output = Backed>,
Candidate: Clone + Eq,
Backer: Clone + Eq + Hash + Ord,
impl<Candidate, FairWeight, Backer, Backed, Input, Output> PurePluginModel<Input, PhragmenModelConfig<Backed>, Output> for PhragmenModelwhere
Input: IntoIterator<Item = (Candidate, FairWeight)> + Clone,
Output: FromIterator<Candidate>,
FairWeight: IntoIterator<Item = (Backer, Backed)> + Clone,
Backed: Clone + Zero + Add<Output = Backed> + Ord + Div<usize, Output = Backed> + Mul<Backed, Output = Backed>,
Candidate: Clone + Eq,
Backer: Clone + Eq + Hash + Ord,
Source§fn compute(&self, input: Input, ctx: &PhragmenModelConfig<Backed>) -> Output
fn compute(&self, input: Input, ctx: &PhragmenModelConfig<Backed>) -> Output
Computes the Phragmen ranking of candidates imperatively.
Steps:
- Initialize all backer loads to zero.
- While candidates remain:
- Compute maximum load increase for each candidate if elected.
- Apply weighting/scaling if configured.
- Deterministically select candidate with minimal max load (tie = first in list).
- Update ranking and backer loads.
- Return all candidates in ranked order.
Auto Trait Implementations§
impl<Backed> Freeze for PhragmenModelConfig<Backed>where
Backed: Freeze,
impl<Backed> RefUnwindSafe for PhragmenModelConfig<Backed>where
Backed: RefUnwindSafe,
impl<Backed> Send for PhragmenModelConfig<Backed>where
Backed: Send,
impl<Backed> Sync for PhragmenModelConfig<Backed>where
Backed: Sync,
impl<Backed> Unpin for PhragmenModelConfig<Backed>where
Backed: Unpin,
impl<Backed> UnwindSafe for PhragmenModelConfig<Backed>where
Backed: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> CheckedConversion for T
impl<T> CheckedConversion for T
§fn checked_from<T>(t: T) -> Option<Self>where
Self: TryFrom<T>,
fn checked_from<T>(t: T) -> Option<Self>where
Self: TryFrom<T>,
§fn checked_into<T>(self) -> Option<T>where
Self: TryInto<T>,
fn checked_into<T>(self) -> Option<T>where
Self: TryInto<T>,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T, U, Tag> IntoTag<U, Tag> for Twhere
U: FromTag<T, Tag>,
Tag: DiscriminantTag,
impl<T, U, Tag> IntoTag<U, Tag> for Twhere
U: FromTag<T, Tag>,
Tag: DiscriminantTag,
§impl<Src, Dest> IntoTuple<Dest> for Srcwhere
Dest: FromTuple<Src>,
impl<Src, Dest> IntoTuple<Dest> for Srcwhere
Dest: FromTuple<Src>,
fn into_tuple(self) -> Dest
§impl<T> IsType<T> for T
impl<T> IsType<T> for T
§impl<T, Outer> IsWrappedBy<Outer> for T
impl<T, Outer> IsWrappedBy<Outer> for T
Source§impl<T, Time> Logging<Time> for Twhere
Time: Time,
impl<T, Time> Logging<Time> for Twhere
Time: Time,
Source§const FALLBACK_TARGET: &'static str = "routine"
const FALLBACK_TARGET: &'static str = "routine"
Default logging target if none is provided.
Most routines, especially offchain workers or background tasks, use this target for simplicity.
It allows a consistent place to look for routine logs without requiring every call to specify a target.
Note: This target is only a conveninence and may be somewhat vague. To ensure errors can still be traced accurately, the logged messages should include additional metadata (e.g., module name, error index, or contextual info) so that the source of the error can be identified even if the target is generic.
Source§type Logger = DispatchError
type Logger = DispatchError
The type taken and returned for logging.
We simply return the same [DispatchError] that was logged,
so logging does not change control flow or error propagation.
DispatchError is used because in Substrate it encompasses all
runtime errors - including module errors, token errors, arithmetic
issues, and transactional boundaries - making it the universal
substrate-side error representation.
Source§type Level = LogLevel
type Level = LogLevel
The log level type.
We use the LogLevel enum to standardize severity levels
(Info, Warn, Error, Debug) across all routine logs.
Source§fn log(
level: <T as Logging<Time>>::Level,
err: &<T as Logging<Time>>::Logger,
timestamp: Time,
target: Option<&str>,
fmt: Option<fn(Time, &<T as Logging<Time>>::Level, &str, &str) -> String>,
) -> <T as Logging<Time>>::Logger
fn log( level: <T as Logging<Time>>::Level, err: &<T as Logging<Time>>::Logger, timestamp: Time, target: Option<&str>, fmt: Option<fn(Time, &<T as Logging<Time>>::Level, &str, &str) -> String>, ) -> <T as Logging<Time>>::Logger
Source§fn info(
err: &Self::Logger,
timestamp: Timestamp,
target: Option<&str>,
fmt: Option<fn(Timestamp, &Self::Level, &str, &str) -> String>,
) -> Self::Loggerwhere
Self: Sized,
fn info(
err: &Self::Logger,
timestamp: Timestamp,
target: Option<&str>,
fmt: Option<fn(Timestamp, &Self::Level, &str, &str) -> String>,
) -> Self::Loggerwhere
Self: Sized,
Source§fn warn(
err: &Self::Logger,
timestamp: Timestamp,
target: Option<&str>,
fmt: Option<fn(Timestamp, &Self::Level, &str, &str) -> String>,
) -> Self::Loggerwhere
Self: Sized,
fn warn(
err: &Self::Logger,
timestamp: Timestamp,
target: Option<&str>,
fmt: Option<fn(Timestamp, &Self::Level, &str, &str) -> String>,
) -> Self::Loggerwhere
Self: Sized,
§impl<T> SaturatedConversion for T
impl<T> SaturatedConversion for T
§fn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
fn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
§fn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
fn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
T. Read more§impl<T, U> TryIntoKey<U> for Twhere
U: TryFromKey<T>,
impl<T, U> TryIntoKey<U> for Twhere
U: TryFromKey<T>,
type Error = <U as TryFromKey<T>>::Error
fn try_into_key(self) -> Result<U, <U as TryFromKey<T>>::Error>
§impl<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
impl<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
§fn unchecked_into(self) -> T
fn unchecked_into(self) -> T
unchecked_from.§impl<T, S> UniqueSaturatedInto<T> for S
impl<T, S> UniqueSaturatedInto<T> for S
§fn unique_saturated_into(self) -> T
fn unique_saturated_into(self) -> T
T.