class svvamp.VotingRuleTasks(voting_systems=None, study_rule_criteria=None, detailed_tasks=None)[source]

A set of tasks for the simulator, i.e. which voting rules with which options and which criteria about them.

A “task” consists of: a voting rule, a dictionary of options, and a StudyRuleCriteria object. A VotingRuleTasks is essentially a list of tasks.

In the following, what we call a “voting system” consists of a voting rule and a dictionary of options (i.e. like a task, but with no StudyRuleCriteria object specified).

Parameters:
  • voting_systems (List, optional) – A list of pairs (rule_class, options), where rule_class is a subclass of Rule and options is a dictionary of options. Instead of (rule_class, options), one may provide a singleton rule_class (without parentheses), which is equivalent to (rule_class, {}).

  • study_rule_criteria (StudyRuleCriteria, optional) – A StudyRuleCriteria object.

  • detailed_tasks (object, optional) – Either a list of triples (rule_class, options, study_rule_criteria), or a VotingRuleTasks object.

Examples

Basically, there are two non-exclusive ways to define a VotingRuleTasks object:

  • Exhaustively with detailed_tasks.

  • As a Cartesian product by voting_systems and study_rule_criteria.

>>> voting_rule_tasks1 = VotingRuleTasks(
...     voting_systems=[
...         RulePlurality,
...         RuleExhaustiveBallot,
...         (RuleIRV, {'cm_option': 'fast'}),
...         (RuleApproval, {'approval_threshold': 10}),
...     ],
...     study_rule_criteria=StudyRuleCriteria(
...         manipulation_criteria=['is_cm_', 'is_tm_', 'is_um_'],
...     ),
...     detailed_tasks=[
...         (
...             RuleIRV,
...             {'cm_option': 'exact'},
...             StudyRuleCriteria(
...                 manipulation_criteria=['is_cm_'],
...                 manipulation_only=True
...             )
...         ),
...         (
...             RuleApproval,
...             {'approval_threshold': 5},
...             StudyRuleCriteria(
...                 manipulation_criteria=['is_cm_', 'is_tm_', 'is_um_']
...             )
...         ),
...     ]
... )
>>> voting_rule_tasks2 = VotingRuleTasks(
...     voting_systems=[RuleIRV, RuleExhaustiveBallot],
...     study_rule_criteria=StudyRuleCriteria(),
...     detailed_tasks=VotingRuleTasks(
...         voting_systems=[
...             (RuleIRV, {'cm_option': 'exact'}),
...             (RuleExhaustiveBallot, {'cm_option': 'exact'})
...         ],
...         study_rule_criteria=StudyRuleCriteria(
...             manipulation_criteria=['is_cm_'],
...             manipulation_only=True
...         )
...     )
... )

In examples 1 and 2 above, all elements of voting_systems will be assigned the same set of criteria, the argument study_rule_criteria. The argument detailed_tasks allows to give different criteria for voting systems needing a specific treatment.

  • When voting_systems is None (default), it is normally set to []. But if detailed_tasks is empty, or study_rule_criteria is not empty, then voting_systems is set to a quite extensive list of voting systems.

  • When study_rule_criteria is None (default), it is normally set to []. But if detailed_tasks is empty, or voting_systems is not empty, then study_rule_criteria is set to StudyRuleCriteria(), which leads to study an quite extensive list of criteria.

Study RuleSchulze and Ranked Pairs with a quite extensive list of criteria:

>>> voting_rule_tasks = VotingRuleTasks(
...     voting_systems=[RuleSchulze, RuleRankedPairs]
... )

Study a quite extensive list of voting systems, with CM being the only manipulation criterion:

>>> voting_rule_tasks = VotingRuleTasks(
...     study_rule_criteria=StudyRuleCriteria(manipulation_criteria=['is_cm_'])
... )

Study a quite extensive list of voting systems with a quite extensive list of criteria:

>>> voting_rule_tasks = VotingRuleTasks()
append_manipulation_criterion(criterion, rule_class=None)[source]

Add a manipulation criterion for one or all voting rules.

Parameters:
  • criterion (str) –

  • rule_class (class) – Subclass of Rule.

Examples

Add criterion for all occurrences of rule_class:

>>> voting_rule_tasks = VotingRuleTasks(
...     voting_systems=[RuleExhaustiveBallot, RuleIRV, (RuleIRV, {'cm_option': 'exact'})],
...     study_rule_criteria=StudyRuleCriteria(manipulation_criteria=['is_cm_'], manipulation_only=True,
...                                           numerical_criteria=[])
... )
>>> voting_rule_tasks.append_manipulation_criterion(criterion='is_um_', rule_class=RuleIRV)
>>> print(voting_rule_tasks)
VotingRuleTasks with:
    voting_system: RuleExhaustiveBallot
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None
    voting_system: RuleIRV
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
            is_um_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None
    voting_system: RuleIRV
    options: {'cm_option': 'exact'}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
            is_um_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None

If rule_class is None (default), then add criterion for all voting rules:

>>> voting_rule_tasks = VotingRuleTasks(
...     voting_systems=[RuleExhaustiveBallot, RuleIRV],
...     study_rule_criteria=StudyRuleCriteria(manipulation_criteria=['is_cm_'], manipulation_only=True,
...                                           numerical_criteria=[])
... )
>>> voting_rule_tasks.append_manipulation_criterion('is_um_')
>>> print(voting_rule_tasks)
VotingRuleTasks with:
    voting_system: RuleExhaustiveBallot
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
            is_um_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None
    voting_system: RuleIRV
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
            is_um_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None
append_manipulation_criterion_c(criterion, rule_class=None)[source]

Add a manipulation criterion (candidates) for one or all voting rules.

Parameters:
  • criterion (str) –

  • rule_class (class) – Subclass of Rule.

Examples

Add criterion for all occurrences of rule_class:

>>> voting_rule_tasks = VotingRuleTasks(
...     voting_systems=[RuleExhaustiveBallot, RuleIRV, (RuleIRV, {'cm_option': 'exact'})],
...     study_rule_criteria=StudyRuleCriteria(manipulation_criteria=['is_cm_'], manipulation_only=True,
...                                           numerical_criteria=[])
... )
>>> voting_rule_tasks.append_manipulation_criterion_c(criterion='candidates_cm_', rule_class=RuleIRV)
>>> print(voting_rule_tasks)
VotingRuleTasks with:
    voting_system: RuleExhaustiveBallot
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None
    voting_system: RuleIRV
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c:
            candidates_cm_
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None
    voting_system: RuleIRV
    options: {'cm_option': 'exact'}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c:
            candidates_cm_
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None

If rule_class is None (default), then add criterion for all voting rules:

>>> voting_rule_tasks = VotingRuleTasks(
...     voting_systems=[RuleExhaustiveBallot, RuleIRV],
...     study_rule_criteria=StudyRuleCriteria(manipulation_criteria=['is_cm_'], manipulation_only=True,
...                                           numerical_criteria=[])
... )
>>> voting_rule_tasks.append_manipulation_criterion_c('candidates_cm_')
>>> print(voting_rule_tasks)
VotingRuleTasks with:
    voting_system: RuleExhaustiveBallot
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c:
            candidates_cm_
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None
    voting_system: RuleIRV
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c:
            candidates_cm_
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None
append_numerical_criterion(criterion, rule_class=None)[source]

Add a numerical criterion for one or all voting rules

Parameters:
  • criterion (str) –

  • rule_class (class) – Subclass of Rule.

Examples

Add criterion for all occurrences of rule_class:

>>> voting_rule_tasks = VotingRuleTasks(
...     voting_systems=[RuleExhaustiveBallot, RuleIRV, (RuleIRV, {'cm_option': 'exact'})],
...     study_rule_criteria=StudyRuleCriteria(manipulation_criteria=['is_cm_'], manipulation_only=True,
...                                           numerical_criteria=[])
... )
>>> voting_rule_tasks.append_numerical_criterion(criterion='nb_candidates_cm_', rule_class=RuleIRV)
>>> print(voting_rule_tasks)
VotingRuleTasks with:
    voting_system: RuleExhaustiveBallot
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None
    voting_system: RuleIRV
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria:
            nb_candidates_cm_
    voting_system: RuleIRV
    options: {'cm_option': 'exact'}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria:
            nb_candidates_cm_

If rule_class is None (default), then add criterion for all voting rules:

>>> voting_rule_tasks = VotingRuleTasks(
...     voting_systems=[RuleExhaustiveBallot, RuleIRV],
...     study_rule_criteria=StudyRuleCriteria(manipulation_criteria=['is_cm_'], manipulation_only=True,
...                                           numerical_criteria=[])
... )
>>> voting_rule_tasks.append_numerical_criterion(criterion='nb_candidates_cm_')
>>> print(voting_rule_tasks)
VotingRuleTasks with:
    voting_system: RuleExhaustiveBallot
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria:
            nb_candidates_cm_
    voting_system: RuleIRV
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria:
            nb_candidates_cm_
append_result_criterion(criterion, rule_class=None)[source]

Add a result criterion for one or all voting rules

Parameters:
  • criterion (str) –

  • rule_class (class) – Subclass of Rule.

Examples

Add criterion for all occurrences of rule_class:

>>> voting_rule_tasks = VotingRuleTasks(
...     voting_systems=[RuleExhaustiveBallot, RuleIRV, (RuleIRV, {'cm_option': 'exact'})],
...     study_rule_criteria=StudyRuleCriteria(manipulation_criteria=['is_cm_'], manipulation_only=True,
...                                           numerical_criteria=[])
... )
>>> voting_rule_tasks.append_result_criterion(criterion='w_is_condorcet_admissible_', rule_class=RuleIRV)
>>> print(voting_rule_tasks)
VotingRuleTasks with:
    voting_system: RuleExhaustiveBallot
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None
    voting_system: RuleIRV
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria:
            w_is_condorcet_admissible_
        utility_criteria: None
        numerical_criteria: None
    voting_system: RuleIRV
    options: {'cm_option': 'exact'}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria:
            w_is_condorcet_admissible_
        utility_criteria: None
        numerical_criteria: None

If rule_class is None (default), then add criterion for all voting rules:

>>> voting_rule_tasks = VotingRuleTasks(
...     voting_systems=[RuleExhaustiveBallot, RuleIRV],
...     study_rule_criteria=StudyRuleCriteria(manipulation_criteria=['is_cm_'], manipulation_only=True,
...                                           numerical_criteria=[])
... )
>>> voting_rule_tasks.append_result_criterion(criterion='w_is_condorcet_admissible_')
>>> print(voting_rule_tasks)
VotingRuleTasks with:
    voting_system: RuleExhaustiveBallot
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria:
            w_is_condorcet_admissible_
        utility_criteria: None
        numerical_criteria: None
    voting_system: RuleIRV
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria:
            w_is_condorcet_admissible_
        utility_criteria: None
        numerical_criteria: None
append_task(rule_class, options=None, study_rule_criteria=None)[source]

Append a task to the list.

Parameters:
  • rule_class (class) – Subclass of Rule.

  • options (dict, optional) – A dictionary of options. If None (default), then options will be an empty dictionary, which amounts to using the default options for this voting rule.

  • study_rule_criteria (StudyRuleCriteria, optional) – If None (default), then use the default StudyRuleCriteria() (with a quite extensive list of criteria).

Examples

>>> voting_rule_tasks = VotingRuleTasks(detailed_tasks=[
...     (
...         RuleIRV,
...         {'cm_option': 'fast'},
...         StudyRuleCriteria(manipulation_criteria=['is_cm_'], manipulation_only=True,
...                           numerical_criteria=[])
...     ),
... ])
>>> voting_rule_tasks.append_task(
...     RuleIRV,
...     {'cm_option': 'exact'},
...     StudyRuleCriteria(manipulation_criteria=['is_cm_'], manipulation_only=True,
...                       numerical_criteria=[])
... )
>>> print(voting_rule_tasks)
VotingRuleTasks with:
    voting_system: RuleIRV
    options: {'cm_option': 'fast'}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None
    voting_system: RuleIRV
    options: {'cm_option': 'exact'}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None

If options is not specified, then it is considered empty:

>>> voting_rule_tasks = VotingRuleTasks(voting_systems=[], detailed_tasks=[])
>>> voting_rule_tasks.append_task(
...     rule_class=RuleIRV,
...     study_rule_criteria=StudyRuleCriteria(
...         manipulation_criteria=['is_cm_'], manipulation_only=True, numerical_criteria=[]
...     )
... )
>>> print(voting_rule_tasks)
VotingRuleTasks with:
    voting_system: RuleIRV
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None

If study_rule_criteria is not specified, then it is the default instance StudyRuleCriteria():

>>> voting_rule_tasks = VotingRuleTasks(voting_systems=[], detailed_tasks=[])
>>> voting_rule_tasks.append_task(rule_class=RuleIRV, options={'cm_option': 'exact'})
>>> print(voting_rule_tasks)  
VotingRuleTasks with:
    voting_system: RuleIRV
    options: {'cm_option': 'exact'}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_tm_
            is_um_
            ...
append_utility_criterion(criterion, func, name, rule_class=None)[source]

Add a utility criterion for one or all voting rules

Parameters:
  • criterion (str) – The numerical data to be processed.

  • func (callable) – An aggregating function.

  • name (str) – The name chosen for this pair criterion / aggregation function. Cf. StudyRuleCriteria.append_utility_criterion().

  • rule_class (class) – Subclass of Rule.

Examples

Add criterion for all occurrences of rule_class:

>>> voting_rule_tasks = VotingRuleTasks(
...     voting_systems=[RuleExhaustiveBallot, RuleIRV, (RuleIRV, {'cm_option': 'exact'})],
...     study_rule_criteria=StudyRuleCriteria(manipulation_criteria=['is_cm_'], manipulation_only=True,
...                                           numerical_criteria=[])
... )
>>> voting_rule_tasks.append_utility_criterion(
...     criterion='total_utility_w_', func=np.sum, name='total_u_sum', rule_class=RuleIRV)
>>> print(voting_rule_tasks)  
VotingRuleTasks with:
    voting_system: RuleExhaustiveBallot
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None
    voting_system: RuleIRV
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria:
            ('total_utility_w_', <function sum at ...>, 'total_u_sum')
        numerical_criteria: None
    voting_system: RuleIRV
    options: {'cm_option': 'exact'}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria:
            ('total_utility_w_', <function sum at ...>, 'total_u_sum')
        numerical_criteria: None

If rule_class is None (default), then add criterion for all voting rules:

>>> voting_rule_tasks = VotingRuleTasks(
...     voting_systems=[RuleExhaustiveBallot, RuleIRV],
...     study_rule_criteria=StudyRuleCriteria(manipulation_criteria=['is_cm_'], manipulation_only=True,
...                                           numerical_criteria=[])
... )
>>> voting_rule_tasks.append_utility_criterion(
...     criterion='total_utility_w_', func=np.sum, name='total_u_sum')
>>> print(voting_rule_tasks)  
VotingRuleTasks with:
    voting_system: RuleExhaustiveBallot
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria:
            ('total_utility_w_', <function sum at ...>, 'total_u_sum')
        numerical_criteria: None
    voting_system: RuleIRV
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria:
            ('total_utility_w_', <function sum at ...>, 'total_u_sum')
        numerical_criteria: None
check_sanity()[source]

Check sanity of the object

Preform some basic checks. It is recommended to use this method before launching big simulations.

Examples

Confirm that a configuration is sound:

>>> voting_rule_tasks = VotingRuleTasks()
>>> voting_rule_tasks.check_sanity()
VotingRuleTasks: Sanity check was successful.

Detect an illegal option:

>>> voting_rule_tasks = VotingRuleTasks(
...     voting_systems=[(RuleIRV, {'cm_option': 'unexpected_option'})],
... )
>>> voting_rule_tasks.check_sanity()
Traceback (most recent call last):
ValueError: 'cm_option' = 'unexpected_option' is not allowed in RuleIRV.

Detect an illegal StudyRuleCriteria:

>>> voting_rule_tasks = VotingRuleTasks(
...     voting_systems=[RuleIRV],
...     study_rule_criteria=StudyRuleCriteria(manipulation_criteria=['unexpected_criterion'])
... )
>>> voting_rule_tasks.check_sanity()
Traceback (most recent call last):
ValueError: Criterion 'unexpected_criterion' is unknown for RuleIRV.
extend(iterable)[source]

Extend a VotingRuleTasks object.

Note that the usual command extend can be used to concatenate two VotingRuleTasks objects.

Examples

>>> voting_rule_tasks = VotingRuleTasks(
...     voting_systems=[RuleExhaustiveBallot, RuleIRV],
...     study_rule_criteria=StudyRuleCriteria(manipulation_criteria=['is_cm_'], manipulation_only=True,
...                                           numerical_criteria=[])
... )
>>> voting_rule_tasks_2 = VotingRuleTasks(
...     voting_systems=[RuleICRV, RuleCondorcetVtbIRV],
...     study_rule_criteria=StudyRuleCriteria(manipulation_criteria=['is_um_'], manipulation_only=True,
...                                           numerical_criteria=[])
... )
>>> voting_rule_tasks.extend(voting_rule_tasks_2)
>>> print(voting_rule_tasks)
VotingRuleTasks with:
    voting_system: RuleExhaustiveBallot
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None
    voting_system: RuleIRV
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None
    voting_system: RuleICRV
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_um_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None
    voting_system: RuleCondorcetVtbIRV
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_um_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None
remove_criterion(criterion, rule_class=None)[source]

Remove a criterion for one or all voting rules.

Parameters:
  • criterion (str) –

  • rule_class (class) – Subclass of Rule.

Examples

Removes all occurrences of criterion for all occurrences of rule_class:

>>> voting_rule_tasks = VotingRuleTasks(
...     voting_systems=[RuleExhaustiveBallot, RuleIRV, (RuleIRV, {'cm_option': 'exact'})],
...     study_rule_criteria=StudyRuleCriteria(
...         manipulation_criteria=['is_cm_', 'is_um_'],
...         manipulation_only=True,
...         numerical_criteria=[]
...     )
... )
>>> voting_rule_tasks.remove_criterion(criterion='is_um_', rule_class=RuleIRV)
>>> print(voting_rule_tasks)
VotingRuleTasks with:
    voting_system: RuleExhaustiveBallot
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
            is_um_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None
    voting_system: RuleIRV
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None
    voting_system: RuleIRV
    options: {'cm_option': 'exact'}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None

If rule_class is None (default), then criterion is removed for all voting rules:

>>> voting_rule_tasks = VotingRuleTasks(
...     voting_systems=[RuleExhaustiveBallot, RuleIRV],
...     study_rule_criteria=StudyRuleCriteria(
...         manipulation_criteria=['is_cm_', 'is_um_'],
...         manipulation_only=True,
...         numerical_criteria=[]
...     )
... )
>>> voting_rule_tasks.remove_criterion('is_um_')
>>> print(voting_rule_tasks)
VotingRuleTasks with:
    voting_system: RuleExhaustiveBallot
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None
    voting_system: RuleIRV
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None
remove_option(option, rule_class=None)[source]

Remove an option and its value for one or all voting rules

Parameters:
  • option (str) –

  • rule_class (class) – Subclass of Rule.

Examples

Remove option for all occurrences of rule_class:

>>> voting_rule_tasks = VotingRuleTasks(
...     voting_systems=[
...         (RuleExhaustiveBallot, {'cm_option': 'exact'}),
...         (RuleIRV, {'cm_option': 'exact'})
...     ],
...     study_rule_criteria=StudyRuleCriteria(manipulation_criteria=['is_cm_'], manipulation_only=True,
...                                           numerical_criteria=[])
... )
>>> voting_rule_tasks.remove_option(option='cm_option', rule_class=RuleIRV)
>>> print(voting_rule_tasks)
VotingRuleTasks with:
    voting_system: RuleExhaustiveBallot
    options: {'cm_option': 'exact'}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None
    voting_system: RuleIRV
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None

This means that from now on, RuleIRV will use its default value for cm_option.

If rule_class is None (default), then remove the option for all voting rules:

>>> voting_rule_tasks = VotingRuleTasks(
...     voting_systems=[
...         (RuleExhaustiveBallot, {'cm_option': 'exact'}),
...         (RuleIRV, {'cm_option': 'exact'})
...     ],
...     study_rule_criteria=StudyRuleCriteria(manipulation_criteria=['is_cm_'], manipulation_only=True,
...                                           numerical_criteria=[])
... )
>>> voting_rule_tasks.remove_option(option='cm_option')
>>> print(voting_rule_tasks)
VotingRuleTasks with:
    voting_system: RuleExhaustiveBallot
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None
    voting_system: RuleIRV
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None
remove_rule(rule_class)[source]

Remove a rule

Removes all occurrences of rule_class from this VotingRuleTasks object.

Parameters:

rule_class (class) – Subclass of Rule.

Examples

>>> voting_rule_tasks = VotingRuleTasks(detailed_tasks=[
...     (
...         RuleIRV,
...         {'cm_option': 'fast', 'um_option': 'fast'},
...         StudyRuleCriteria(manipulation_criteria=['is_cm_'], manipulation_only=True,
...                           numerical_criteria=[])
...     ),
...     (
...         RuleIRV,
...         {'cm_option': 'exact', 'um_option': 'exact'},
...         StudyRuleCriteria(manipulation_criteria=['is_cm_'], manipulation_only=True,
...                           numerical_criteria=[])
...     ),
...     (
...         RuleCondorcetVtbIRV,
...         {'cm_option': 'very_slow', 'um_option': 'exact'},
...         StudyRuleCriteria(manipulation_criteria=['is_cm_'], manipulation_only=True,
...                           numerical_criteria=[])
...     )
... ])
>>> voting_rule_tasks.remove_rule(RuleIRV)
>>> print(voting_rule_tasks)
VotingRuleTasks with:
    voting_system: RuleCondorcetVtbIRV
    options: {'cm_option': 'very_slow', 'um_option': 'exact'}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None
set_option(option, value, rule_class=None)[source]

Set an option for one or all voting rules

Parameters:
  • option (str) –

  • value (object) – New value for the option.

  • rule_class (class) – Subclass of Rule.

Examples

Set option to value for all occurrences of rule_class:

>>> voting_rule_tasks = VotingRuleTasks(
...     voting_systems=[RuleExhaustiveBallot, RuleIRV],
...     study_rule_criteria=StudyRuleCriteria(manipulation_criteria=['is_cm_'], manipulation_only=True,
...                                           numerical_criteria=[])
... )
>>> voting_rule_tasks.set_option('cm_option', 'exact', rule_class=RuleIRV)
>>> print(voting_rule_tasks)
VotingRuleTasks with:
    voting_system: RuleExhaustiveBallot
    options: {}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None
    voting_system: RuleIRV
    options: {'cm_option': 'exact'}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None

If rule_class is None (default), do this for all voting rules:

>>> voting_rule_tasks = VotingRuleTasks(
...     voting_systems=[RuleExhaustiveBallot, RuleIRV],
...     study_rule_criteria=StudyRuleCriteria(manipulation_criteria=['is_cm_'], manipulation_only=True,
...                                           numerical_criteria=[])
... )
>>> voting_rule_tasks.set_option('cm_option', 'exact')
>>> print(voting_rule_tasks)
VotingRuleTasks with:
    voting_system: RuleExhaustiveBallot
    options: {'cm_option': 'exact'}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None
    voting_system: RuleIRV
    options: {'cm_option': 'exact'}
    StudyRuleCriteria with:
        manipulation_criteria:
            is_cm_
        manipulation_criteria_c: None
        result_criteria: None
        utility_criteria: None
        numerical_criteria: None