IterableStrategyThresholdGrid
- class poisson_approval.IterableStrategyThresholdGrid(denominator_threshold, denominator_ratio_optimistic=None, profile=None, voting_rule=None, d_ranking_fixed_strategy=None, test=None, **kwargs)[source]
Iterate over threshold strategies (
StrategyThreshold
).- Parameters
denominator_threshold (int or iterable) – The grain(s) of the grid for the utility thresholds.
denominator_ratio_optimistic (int or iterable, optional) – The grain(s) of the grid for the ratios of optimistic voters.
profile (Profile, optional) – The attached profile.
voting_rule (str, optional) – The voting rule. Possible values are
APPROVAL
,PLURALITY
andANTI_PLURALITY
. Default: the same voting rule as profile if a profile is specified,APPROVAL
otherwise.d_ranking_fixed_strategy (dict) – Key: ranking. Value: fixed strategy. Cf. examples below.
test (callable) – A function
StrategyThreshold -> bool
. Only strategies meeting this test are given.kwargs – Additional parameters are passed to
StrategyThreshold
when creating the strategy.
Examples
Basic usage:
>>> for strategy in IterableStrategyThresholdGrid(denominator_threshold=3): ... print(strategy) <abc: ab, acb: ac, bac: ab, bca: bc, cab: ac, cba: bc> <abc: ab, acb: ac, bac: ab, bca: bc, cab: ac, cba: utility-dependent (1/3)> <abc: ab, acb: ac, bac: ab, bca: bc, cab: ac, cba: utility-dependent (2/3)> <abc: ab, acb: ac, bac: ab, bca: bc, cab: ac, cba: c> <abc: ab, acb: ac, bac: ab, bca: bc, cab: utility-dependent (1/3), cba: bc> ... <abc: a, acb: a, bac: b, bca: b, cab: c, cba: c>
Specify a profile:
>>> from poisson_approval import ProfileHistogram >>> profile = ProfileHistogram({'abc': 0.75, 'bac': 0.25}, {'abc': [1], 'bac': [1]}) >>> for strategy in IterableStrategyThresholdGrid(denominator_threshold=2, profile=profile): ... print(strategy) <abc: ab, bac: ab> ==> a, b <abc: ab, bac: utility-dependent (1/2)> ==> b <abc: ab, bac: b> ==> b <abc: utility-dependent (1/2), bac: ab> ==> a <abc: utility-dependent (1/2), bac: utility-dependent (1/2)> ==> a <abc: utility-dependent (1/2), bac: b> ==> a <abc: a, bac: ab> ==> a <abc: a, bac: utility-dependent (1/2)> ==> a <abc: a, bac: b> ==> a
Specify some fixed strategies:
>>> iterable = IterableStrategyThresholdGrid( ... denominator_threshold=2, ... d_ranking_fixed_strategy={'abc': 1, 'acb': 1, 'bac': 1, 'bca': 1}) >>> for strategy in iterable: ... print(strategy) <abc: a, acb: a, bac: b, bca: b, cab: ac, cba: bc> <abc: a, acb: a, bac: b, bca: b, cab: ac, cba: utility-dependent (1/2)> <abc: a, acb: a, bac: b, bca: b, cab: ac, cba: c> <abc: a, acb: a, bac: b, bca: b, cab: utility-dependent (1/2), cba: bc> <abc: a, acb: a, bac: b, bca: b, cab: utility-dependent (1/2), cba: utility-dependent (1/2)> <abc: a, acb: a, bac: b, bca: b, cab: utility-dependent (1/2), cba: c> <abc: a, acb: a, bac: b, bca: b, cab: c, cba: bc> <abc: a, acb: a, bac: b, bca: b, cab: c, cba: utility-dependent (1/2)> <abc: a, acb: a, bac: b, bca: b, cab: c, cba: c>
Use a condition with the parameter test:
>>> profile = ProfileHistogram({'abc': 0.75, 'bac': 0.25}, {'abc': [1], 'bac': [1]}) >>> def test_a_wins(strategy): ... return strategy.winners == {'a'} >>> for strategy in IterableStrategyThresholdGrid(denominator_threshold=2, profile=profile, test=test_a_wins): ... print(strategy) <abc: utility-dependent (1/2), bac: ab> ==> a <abc: utility-dependent (1/2), bac: utility-dependent (1/2)> ==> a <abc: utility-dependent (1/2), bac: b> ==> a <abc: a, bac: ab> ==> a <abc: a, bac: utility-dependent (1/2)> ==> a <abc: a, bac: b> ==> a
Loop also over the ratios of optimistic voters:
>>> from poisson_approval import ProfileDiscrete >>> profile = ProfileDiscrete({('abc', 0.2): 0.75, ('bac', 0.4): 0.25}) >>> iterable = IterableStrategyThresholdGrid(denominator_threshold=2, denominator_ratio_optimistic=2, ... profile=profile) >>> for strategy in iterable: ... print(repr(strategy)) StrategyThreshold({'abc': 0, 'bac': 0}) StrategyThreshold({'abc': 0, 'bac': (Fraction(1, 2), 0)}) StrategyThreshold({'abc': 0, 'bac': (Fraction(1, 2), Fraction(1, 2))}) StrategyThreshold({'abc': 0, 'bac': (Fraction(1, 2), 1)}) StrategyThreshold({'abc': 0, 'bac': 1}) StrategyThreshold({'abc': (Fraction(1, 2), 0), 'bac': 0}) ... StrategyThreshold({'abc': 1, 'bac': 1})