From f31f87e397ade8cc08ac5c7bba3babaa03908ab1 Mon Sep 17 00:00:00 2001 From: Yonatan Gabay Date: Sun, 31 May 2026 15:15:45 +0300 Subject: [PATCH 1/8] Add Exact Equal Shares (EES) with add-opt rule --- pabutools/rules/__init__.py | 12 +- pabutools/rules/ees_addopt.py | 510 +++++++++++++++++++++++++++++++++ tests/rules/test_ees_addopt.py | 388 +++++++++++++++++++++++++ 3 files changed, 909 insertions(+), 1 deletion(-) create mode 100644 pabutools/rules/ees_addopt.py create mode 100644 tests/rules/test_ees_addopt.py diff --git a/pabutools/rules/__init__.py b/pabutools/rules/__init__.py index 3884e23..54f6636 100644 --- a/pabutools/rules/__init__.py +++ b/pabutools/rules/__init__.py @@ -40,6 +40,12 @@ ) from pabutools.rules.cstv import cstv, CSTV_Combination from pabutools.rules.maximin_support import maximin_support +from pabutools.rules.ees_addopt import ( + exact_equal_shares, + greedy_project_change, + add_opt, + EESAllocationDetails, +) __all__ = [ "completion_by_rule_combination", @@ -57,5 +63,9 @@ "MESIteration", "cstv", "CSTV_Combination", - "maximin_support" + "maximin_support", + "exact_equal_shares", + "greedy_project_change", + "add_opt", + "EESAllocationDetails", ] diff --git a/pabutools/rules/ees_addopt.py b/pabutools/rules/ees_addopt.py new file mode 100644 index 0000000..23bee82 --- /dev/null +++ b/pabutools/rules/ees_addopt.py @@ -0,0 +1,510 @@ +""" +An implementation of the algorithms in "Streamlining Equal Shares", +by Sonja Kraiczy, Isaac Robinson, Edith Elkind (2024), +https://arxiv.org/abs/2502.11797 + +Programmer: Yonatan Gabay +Date: 20-04-2026 +""" + +from __future__ import annotations + +from pabutools.election.instance import Instance, Project +from pabutools.election.profile import AbstractApprovalProfile +from pabutools.fractions import frac +from pabutools.rules.budgetallocation import BudgetAllocation, AllocationDetails +from pabutools.tiebreaking import lexico_tie_breaking +from pabutools.utils import Numeric + + +class EESAllocationDetails(AllocationDetails): + """ + Details of an EES rule run, storing per-voter payments. + + Attributes + ---------- + payments : dict[int, dict[Project, Numeric]] + payments[voter_index][project] = amount paid by voter for the project. + """ + + def __init__(self, payments: dict[int, dict[Project, Numeric]] | None = None): + super().__init__() + self.payments: dict[int, dict[Project, Numeric]] = payments if payments is not None else {} + + def __repr__(self): + return f"EESAllocationDetails[payments={self.payments}]" + + +def exact_equal_shares( + instance: Instance, + profile: AbstractApprovalProfile, + utilities: dict[Project, Numeric] | None = None, +) -> BudgetAllocation: + """ + Algorithm 1: EES for uniform utilities. + + Iteratively selects projects that maximise bang-per-buck (|V|·u(p)/cost(p)) + among all feasible (project, supporter-subset) pairs, splitting costs + equally among supporters. + + Parameters + ---------- + instance : :py:class:`~pabutools.election.instance.Instance` + The instance containing the projects and the budget limit. + profile : :py:class:`~pabutools.election.profile.approvalprofile.AbstractApprovalProfile` + The approval profile, one ballot per voter. + utilities : dict[:py:class:`~pabutools.election.instance.Project`, Numeric] or None + utilities[project] = u(p). When None, every project has utility 1 + (pure approval setting). + + Returns + ------- + :py:class:`~pabutools.rules.budgetallocation.BudgetAllocation` + The selected projects (in order of selection). The + :py:attr:`~pabutools.rules.budgetallocation.BudgetAllocation.details` attribute + is an :py:class:`EESAllocationDetails` holding per-voter payments. + + Examples + -------- + >>> from pabutools.election import Instance, Project, ApprovalProfile, ApprovalBallot + >>> p1, p2, p3 = Project("p1", 10), Project("p2", 16), Project("p3", 21) + >>> inst = Instance([p1, p2, p3], budget_limit=40) + >>> prof = ApprovalProfile([ + ... ApprovalBallot([p1]), + ... ApprovalBallot([p1, p3]), + ... ApprovalBallot([p2, p3]), + ... ApprovalBallot([p2, p3]), + ... ], instance=inst) + >>> result = exact_equal_shares(inst, prof) + >>> [p.name for p in result] + ['p1', 'p2'] + """ + n = len(profile) + if n == 0: + return BudgetAllocation(details=EESAllocationDetails()) + + b = instance.budget_limit + + # Line 1: W = ∅, X = 0^{n·m}, r_i = b/n for all i ∈ N + W: list[Project] = [] + selected_set: set[Project] = set() + payments: dict[int, dict[Project, Numeric]] = {i: {} for i in range(n)} + r: list[Numeric] = [frac(b) / n] * n + + # Maintain a globally sorted list of voters by remaining budget. + # Filtering this list to a project's supporters preserves sorted order + # in O(n), avoiding an O(n log n) sort per project per iteration. + sorted_voters: list[int] = list(range(n)) # all equal initially + + # Line 2: while true do + while True: + best_score: Numeric = -1 + best_candidates: list[tuple[Project, list[int]]] = [] + + # Line 3: Φ = {(p ∈ P\W, V ⊆ N_p) | r_i ≥ cost(p)/|V| ∀i ∈ V} + # For each project, find the largest feasible supporter subset V. + for p in instance: + if p in selected_set: + continue + + u_p = utilities[p] if utilities is not None else 1 + + # N_p: voters who approve p, filtered from sorted_voters (preserves order) + supporters = [i for i in sorted_voters if p in profile[i]] + if not supporters: + continue + + # Greedily remove the poorest voter while they can't afford + # their equal share cost(p)/|V|. + while supporters and r[supporters[0]] < frac(p.cost) / len(supporters): + supporters.pop(0) + + if not supporters: + continue + + # Line 8: score = |V|·u(p) / cost(p) + if p.cost == 0: + score = float('inf') + else: + score = frac(len(supporters) * u_p) / p.cost + if score > best_score: + best_score = score + best_candidates = [(p, supporters)] + elif score == best_score: + best_candidates.append((p, supporters)) + + # Line 4-5: if Φ = ∅ then return (W, X) + if not best_candidates: + return BudgetAllocation(W, details=EESAllocationDetails(payments)) + + # Line 9: Choose (p*, V*) from Φ* using tiebreaking (p* ◁ p) + # Use untie() (first/smallest name) so that unselected tied projects + # have larger names. The leximax (amount, selected_name) will then + # NOT exceed (amount, unselected_name) under Python's default tuple + # comparison, preventing spurious instability certificates. + if len(best_candidates) == 1: + p_star, V_star = best_candidates[0] + else: + tied_projects = [p for p, _ in best_candidates] + p_star = lexico_tie_breaking.untie(instance, profile, tied_projects) + V_star = next(V for p, V in best_candidates if p == p_star) + + # Line 10: W = W ∪ {p*} + W.append(p_star) + selected_set.add(p_star) + + # Line 11: x_{i,p*} = cost(p*)/|V*|, r_i = r_i − cost(p*)/|V*| ∀i ∈ V* + V_star_set = set(V_star) + payment = frac(p_star.cost) / len(V_star) + for i in V_star: + payments[i][p_star] = payment + r[i] -= payment + + # Update sorted_voters via O(n) merge. All V* voters decreased by + # the same amount so their relative order is preserved. + changed = [i for i in sorted_voters if i in V_star_set] + unchanged = [i for i in sorted_voters if i not in V_star_set] + merged: list[int] = [] + ci, ui = 0, 0 + while ci < len(changed) and ui < len(unchanged): + if r[changed[ci]] <= r[unchanged[ui]]: + merged.append(changed[ci]); ci += 1 + else: + merged.append(unchanged[ui]); ui += 1 + merged.extend(changed[ci:]) + merged.extend(unchanged[ui:]) + sorted_voters = merged + + +def get_leftover_budgets( + instance: Instance, + profile: AbstractApprovalProfile, + current_solution: BudgetAllocation, +) -> dict[int, Numeric]: + """ + Compute leftover budget for each voter. + + leftover[i] = b/n - sum of payments by voter i across all selected projects. + """ + n = len(profile) + b = instance.budget_limit + details: EESAllocationDetails = current_solution.details + leftover = {} + for i in range(n): + paid = sum(details.payments.get(i, {}).values()) + leftover[i] = frac(b) / n - paid + return leftover + + +def get_leximax_payment( + current_solution: BudgetAllocation, + voter: int, + instance: Instance, +) -> tuple[Numeric, str]: + """ + Return the leximax payment of a voter as ``(amount, project_name)``. + + The leximax payment c_i = (x_i, p_i) where x_i is the maximum payment + and p_i is the project with that payment that comes first in the total + order ⊲ (alphabetical by name, i.e. smallest name). When the voter + made no payments, x_i = 0 and p_i is the first project in ⊲ + (smallest name), so that non-paying voters never certify instability. + """ + details: EESAllocationDetails = current_solution.details + voter_payments = details.payments.get(voter, {}) + if not voter_payments: + min_project_name = min(p.name for p in instance) + return (0, min_project_name) + max_amount = max(voter_payments.values()) + max_projects = [p for p, v in voter_payments.items() if v == max_amount] + min_project = min(max_projects, key=lambda p: p.name) + return (max_amount, min_project.name) + + +def greedy_project_change( + instance: Instance, + profile: AbstractApprovalProfile, + current_solution: BudgetAllocation, + project: Project, + leftover: dict[int, Numeric], + leximax: dict[int, tuple[Numeric, str]], + voters_by_leftover: list[int] | None = None, + voters_by_leximax: list[int] | None = None, +) -> Numeric: + """ + Algorithm 2: GreedyProjectChange (GPC). + + Computes the minimum per-voter budget increase d > 0 such that + *project* certifies instability of the current equal-shares solution + for instance E(b + n·d). + The algorithm walks two sorted arrays simultaneously: + - leftover_budgets (A'): residual budgets of Op(X) voters, sorted ascending. + - leximax_payments (B'): leximax payment vectors of Op(X) voters, + sorted lex-ascending. + + Parameters + ---------- + instance : :py:class:`~pabutools.election.instance.Instance` + The instance containing the projects and the budget limit. + profile : :py:class:`~pabutools.election.profile.approvalprofile.AbstractApprovalProfile` + The approval profile, one ballot per voter. + current_solution : :py:class:`~pabutools.rules.budgetallocation.BudgetAllocation` + The current EES solution. Its + :py:attr:`~pabutools.rules.budgetallocation.BudgetAllocation.details` attribute + must be an :py:class:`EESAllocationDetails` holding per-voter payments. + project : :py:class:`~pabutools.election.instance.Project` + The candidate project p to test instability for. + leftover : dict[int, Numeric] + Leftover budget per voter, as returned by + :py:func:`get_leftover_budgets`. + leximax : dict[int, tuple[Numeric, str]] + Leximax payment per voter, as returned by + :py:func:`get_leximax_payment`. + voters_by_leftover : list[int] or None + All voters pre-sorted by leftover ascending. When provided the + function filters this list to O_p(X) in O(n) instead of sorting + per project. Used by :py:func:`add_opt` for O(mn) total. + voters_by_leximax : list[int] or None + All voters pre-sorted by leximax ascending. + + Returns + ------- + Numeric + Minimum per-voter budget increase d. + + Examples + -------- + >>> from pabutools.election import Instance, Project, ApprovalProfile, ApprovalBallot + >>> p1, p2, p3 = Project("p1", 2), Project("p2", 3.2), Project("p3", 6) + >>> inst = Instance([p1, p2, p3], budget_limit=10) + >>> prof = ApprovalProfile([ + ... ApprovalBallot([p1]), + ... ApprovalBallot([p1, p3]), + ... ApprovalBallot([p2, p3]), + ... ApprovalBallot([p2, p3]), + ... ApprovalBallot([p3]), + ... ], instance=inst) + >>> details = EESAllocationDetails({0: {p1: 1}, 1: {p1: 1}, 2: {p2: 1.6}, 3: {p2: 1.6}, 4: {}}) + >>> solution = BudgetAllocation([p1, p2], details=details) + >>> leftover = get_leftover_budgets(inst, prof, solution) + >>> leximax = {i: get_leximax_payment(solution, i, inst) for i in range(5)} + >>> greedy_project_change(inst, prof, solution, p3, leftover, leximax) + 0.5 + """ + n = len(profile) + p = project + + # All voters who approve p + all_supporters = {i for i in range(n) if p in profile[i]} + + # N_p(X): voters who pay for project p in the current solution + details: EESAllocationDetails = current_solution.details + N_p_X = {i for i in all_supporters if p in details.payments.get(i, {})} + # O_p(X) = N_p \ N_p(X): voters who approve p but don't pay for it + O_p_X = all_supporters - N_p_X + + # O_p(X) sorted by leftover budget ascending: v_1, ..., v_k + if voters_by_leftover is not None: + O_p = [i for i in voters_by_leftover if i in O_p_X] + else: + O_p = sorted(O_p_X, key=lambda i: leftover[i]) + k = len(O_p) + + # Leximax payments of O_p(X) voters, sorted ascending: w_1, ..., w_k + if voters_by_leximax is not None: + O_p_by_leximax = [i for i in voters_by_leximax if i in O_p_X] + else: + O_p_by_leximax = sorted(O_p_X, key=lambda i: leximax[i]) + + # Line 1: i, j ← 1, 1 (1-indexed in paper, 0-indexed here) + i = 0 + j = 0 + + # Line 2-3: SL ← ∅, LQ ← O_p(X) + SL: set[int] = set() + LQ: set[int] = set(O_p) + + # Line 4: d ← +∞ + d = float('inf') + + # Line 5: while LQ ∪ SL ≠ ∅ + while LQ or SL: + # Line 6: PvP ← cost(p) / |N_p(X) ∪ LQ ∪ SL| + B = N_p_X | LQ | SL + PvP = frac(p.cost) / len(B) + + pvp_lex = (PvP, p.name) + + # Line 7: if j ≤ |O_p(X)| and c_{w_j} <_lex (PvP, p) + if j < k and leximax[O_p_by_leximax[j]] < pvp_lex: + # Line 8: SL ← SL \ {w_j} + SL.discard(O_p_by_leximax[j]) + # Line 9: j ← j + 1 + j += 1 + # Line 10: else if c_{v_i} >_lex (PvP, p) + elif i < k and leximax[O_p[i]] > pvp_lex: + # Line 11: LQ ← LQ \ {v_i} + LQ.discard(O_p[i]) + # Line 12: SL ← SL ∪ {v_i} + SL.add(O_p[i]) + # Line 13: i ← i + 1 + i += 1 + else: + # Line 14-15: d ← min{d, PvP - r_{v_i}} + if i < k: + d = min(d, PvP - leftover[O_p[i]]) + # Line 16: LQ ← LQ \ {v_i} + if i < k: + LQ.discard(O_p[i]) + # Line 17: i ← i + 1 + i += 1 + + # Line 20: return d + return max(0, d) + + +def add_opt( + instance: Instance, + profile: AbstractApprovalProfile, + current_solution: BudgetAllocation, +) -> Numeric: + """ + Algorithm 3: add-opt. + + Iterates over every project p in the instance, restricts the sorted + leftover-budget and leximax-payment arrays to the voters in Op(X), and + calls GreedyProjectChange to find the minimum per-voter budget increase + that makes p certify instability. Returns the global minimum. + + Parameters + ---------- + instance : :py:class:`~pabutools.election.instance.Instance` + The instance containing the projects and the budget limit. + profile : :py:class:`~pabutools.election.profile.approvalprofile.AbstractApprovalProfile` + The approval profile, one ballot per voter. + current_solution : :py:class:`~pabutools.rules.budgetallocation.BudgetAllocation` + The current EES solution. Its + :py:attr:`~pabutools.rules.budgetallocation.BudgetAllocation.details` attribute + must be an :py:class:`EESAllocationDetails` holding per-voter payments. + + Returns + ------- + Numeric + Minimum per-voter budget increase d > 0 such that the current + solution is unstable for E(b + n·d). Returns ``float('inf')`` + when the solution is stable for every finite budget increase. + + Examples + -------- + >>> from pabutools.election import Instance, Project, ApprovalProfile, ApprovalBallot + >>> p1, p2, p3 = Project("p1", 2), Project("p2", 3.2), Project("p3", 6) + >>> inst = Instance([p1, p2, p3], budget_limit=10) + >>> prof = ApprovalProfile([ + ... ApprovalBallot([p1]), + ... ApprovalBallot([p1, p3]), + ... ApprovalBallot([p2, p3]), + ... ApprovalBallot([p2, p3]), + ... ApprovalBallot([p3]), + ... ], instance=inst) + >>> details = EESAllocationDetails({0: {p1: 1}, 1: {p1: 1}, 2: {p2: 1.6}, 3: {p2: 1.6}, 4: {}}) + >>> solution = BudgetAllocation([p1, p2], details=details) + >>> add_opt(inst, prof, solution) + 0.5 + """ + n = len(profile) + + # Precompute leftover budgets and leximax payments for all voters + leftover = get_leftover_budgets(instance, profile, current_solution) + leximax = {i: get_leximax_payment(current_solution, i, instance) for i in range(n)} + + # Pre-sort all voters once (Algorithm 3, lines A and B) + voters_by_leftover = sorted(range(n), key=lambda i: leftover[i]) + voters_by_leximax = sorted(range(n), key=lambda i: leximax[i]) + + # Line 1: d ← +∞ + d = float('inf') + + # Line 2: for p ∈ P do + for p in instance: + # Line 5: d ← min{d, GreedyProjectChange(E, (W, X), p, A', B')} + d = min(d, greedy_project_change( + instance, profile, current_solution, p, leftover, leximax, + voters_by_leftover, voters_by_leximax, + )) + + # Line 7: return d + return d + + +def ees_completion( + instance: Instance, + profile: AbstractApprovalProfile, + utilities: dict[Project, Numeric] | None = None, +) -> BudgetAllocation: + """ + Completion of EES via add-opt (§4.2, Corollary 4.7). + + Iteratively runs EES with increasing virtual per-voter budgets until + the outcome is exhaustive (no project can certify instability). + Returns the budget-feasible outcome with the highest total spending. + + Parameters + ---------- + instance : :py:class:`~pabutools.election.instance.Instance` + The instance containing the projects and the budget limit. + profile : :py:class:`~pabutools.election.profile.approvalprofile.AbstractApprovalProfile` + The approval profile, one ballot per voter. + utilities : dict[:py:class:`~pabutools.election.instance.Project`, Numeric] or None + utilities[project] = u(p). When None, every project has utility 1 + (pure approval setting). + + Returns + ------- + :py:class:`~pabutools.rules.budgetallocation.BudgetAllocation` + The completed EES outcome — a feasible outcome whose total cost + is at most ``instance.budget_limit``. + + Examples + -------- + >>> from pabutools.election import Instance, Project, ApprovalProfile, ApprovalBallot + >>> p1, p2, p3 = Project("p1", 2), Project("p2", 3.2), Project("p3", 6) + >>> inst = Instance([p1, p2, p3], budget_limit=10) + >>> prof = ApprovalProfile([ + ... ApprovalBallot([p1]), + ... ApprovalBallot([p1, p3]), + ... ApprovalBallot([p2, p3]), + ... ApprovalBallot([p2, p3]), + ... ApprovalBallot([p3]), + ... ], instance=inst) + >>> result = ees_completion(inst, prof) + >>> sorted(p.name for p in result) + ['p1', 'p3'] + """ + n = len(profile) + if n == 0: + return exact_equal_shares(instance, profile, utilities) + + original_budget = instance.budget_limit + budget = frac(original_budget) + projects = list(instance) + best: BudgetAllocation | None = None + best_cost = frac(-1) + + while True: + virtual_inst = Instance(projects, budget_limit=budget) + result = exact_equal_shares(virtual_inst, profile, utilities) + + total_cost = sum(frac(p.cost) for p in result) + if total_cost <= original_budget and total_cost > best_cost: + best = result + best_cost = total_cost + + d = add_opt(virtual_inst, profile, result) + if d == float('inf') or d <= 0: + break + + budget = budget + n * frac(d) + + if best is None: + best = exact_equal_shares(instance, profile, utilities) + return best diff --git a/tests/rules/test_ees_addopt.py b/tests/rules/test_ees_addopt.py new file mode 100644 index 0000000..c2b7777 --- /dev/null +++ b/tests/rules/test_ees_addopt.py @@ -0,0 +1,388 @@ +""" +Tests for EES (Algorithm 1), GreedyProjectChange (Algorithm 2) and add-opt (Algorithm 3). + +Programmer: Yonatan Gabay +Since: 2026-04 +""" + +import pytest + +from pabutools.election.instance import Instance, Project +from pabutools.election.profile import ApprovalProfile +from pabutools.election.ballot import ApprovalBallot +from pabutools.rules.budgetallocation import BudgetAllocation +from pabutools.rules.ees_addopt import ( + exact_equal_shares, + greedy_project_change, + add_opt, + EESAllocationDetails, + get_leftover_budgets, + get_leximax_payment, +) + + +# ---- helpers ---- + +def _make_instance_profile(project_costs, budget, approval_sets): + """ + Build an Instance + ApprovalProfile from simple descriptions. + + Parameters + ---------- + project_costs : dict[str, float] + Mapping from project name to cost. + budget : float + Budget limit. + approval_sets : list[set[str]] + One set of approved project names per voter. + + Returns + ------- + tuple[Instance, ApprovalProfile, dict[str, Project]] + The instance, profile, and a name→Project lookup dict. + """ + projects = {name: Project(name, cost) for name, cost in project_costs.items()} + inst = Instance(projects.values(), budget_limit=budget) + ballots = [ + ApprovalBallot([projects[pname] for pname in approved]) + for approved in approval_sets + ] + prof = ApprovalProfile(ballots, instance=inst) + return inst, prof, projects + + +def _selected_names(result): + """Return project names from a BudgetAllocation.""" + return [p.name for p in result] + + +def _get_payments(result): + """Return the payments dict from a BudgetAllocation's EESAllocationDetails.""" + return result.details.payments + + +####### EES tests + + +# empty input should return empty result +def test_ees_nothing_to_select(): + inst = Instance([], budget_limit=0) + prof = ApprovalProfile([], instance=inst) + + result = exact_equal_shares(inst, prof) + assert _selected_names(result) == [] + assert _get_payments(result) == {} + + +# project above budget should not be selected +def test_ees_single_project_too_expensive(): + inst, prof, projects = _make_instance_profile( + {"p1": 200}, 50, [{"p1"}, {"p1"}] + ) + result = exact_equal_shares(inst, prof) + assert projects["p1"] not in result + + +# one approved project should split cost evenly +def test_ees_cost_split_equally(): + inst, prof, projects = _make_instance_profile( + {"p1": 10}, 10, [{"p1"}, {"p1"}] + ) + result = exact_equal_shares(inst, prof) + assert projects["p1"] in result + payments = _get_payments(result) + assert payments[0][projects["p1"]] == pytest.approx(5) + assert payments[1][projects["p1"]] == pytest.approx(5) + + +# paper example +def test_ees_multiple_projects(): + inst, prof, projects = _make_instance_profile( + {"p1": 10, "p2": 16, "p3": 21}, + 40, + [{"p1"}, {"p1", "p3"}, {"p2", "p3"}, {"p2", "p3"}], + ) + result = exact_equal_shares(inst, prof) + assert _selected_names(result) == ["p1", "p2"] + payments = _get_payments(result) + assert payments[0][projects["p1"]] == 5 + assert payments[1][projects["p1"]] == 5 + assert payments[2][projects["p2"]] == 8 + assert payments[3][projects["p2"]] == 8 + + +# no approvals +def test_ees_no_approvals_means_nothing_funded(): + inst, prof, projects = _make_instance_profile( + {"p1": 10, "p2": 15}, + 100, + [set(), set(), set()], + ) + result = exact_equal_shares(inst, prof) + assert _selected_names(result) == [] + + +# payments should stay within budget +def test_ees_budget_feasibility(): + inst, prof, projects = _make_instance_profile( + {"p1": 2, "p2": 3.2, "p3": 6}, + 10, + [{"p1"}, {"p1", "p3"}, {"p2", "p3"}, {"p2", "p3"}, {"p3"}], + ) + result = exact_equal_shares(inst, prof) + payments = _get_payments(result) + + total_paid = sum( + payments.get(i, {}).get(p, 0) + for i in range(len(prof)) + for p in result + ) + assert total_paid <= inst.budget_limit + + # Each funded project is fully covered + for proj in result: + paid_for_proj = sum( + payments.get(i, {}).get(proj, 0) + for i in range(len(prof)) + ) + assert paid_for_proj == pytest.approx(proj.cost) + + +####### GPC tests + + +def _make_solution(selected_names, payments_by_voter, projects): + """ + Build a BudgetAllocation with EESAllocationDetails from simple descriptions. + + Parameters + ---------- + selected_names : list[str] + Names of selected projects. + payments_by_voter : dict[int, dict[str, float]] + payments_by_voter[voter_index][project_name] = payment. + projects : dict[str, Project] + Name→Project lookup. + """ + selected = [projects[n] for n in selected_names] + pay = {} + for voter_idx, voter_payments in payments_by_voter.items(): + pay[voter_idx] = {projects[pname]: amount for pname, amount in voter_payments.items()} + return BudgetAllocation(selected, details=EESAllocationDetails(pay)) + + +# zero-cost project should return zero delta +def test_gpc_free_project_needs_zero_increase(): + inst, prof, projects = _make_instance_profile( + {"p1": 0}, 10, [{"p1"}] + ) + solution = _make_solution([], {}, projects) + leftover = get_leftover_budgets(inst, prof, solution) + leximax = {i: get_leximax_payment(solution, i, inst) for i in range(len(prof))} + delta = greedy_project_change(inst, prof, solution, projects["p1"], leftover, leximax) + assert delta == pytest.approx(0) + + +# enough leftover should return zero delta +def test_gpc_leftover_covers_cost_exactly(): + inst, prof, projects = _make_instance_profile( + {"p1": 12}, 15, [{"p1"}, {"p1"}, {"p1"}] + ) + solution = _make_solution([], {}, projects) + leftover = get_leftover_budgets(inst, prof, solution) + leximax = {i: get_leximax_payment(solution, i, inst) for i in range(len(prof))} + delta = greedy_project_change(inst, prof, solution, projects["p1"], leftover, leximax) + assert delta == pytest.approx(0) + + +# not enough leftover should return positive delta +def test_gpc_not_enough_leftover(): + inst, prof, projects = _make_instance_profile( + {"p1": 30}, 6, [{"p1"}, {"p1"}, {"p1"}] + ) + solution = _make_solution([], {}, projects) + leftover = get_leftover_budgets(inst, prof, solution) + leximax = {i: get_leximax_payment(solution, i, inst) for i in range(len(prof))} + delta = greedy_project_change(inst, prof, solution, projects["p1"], leftover, leximax) + assert delta > 0 + + +# paper example +def test_gpc_paper_example(): + inst, prof, projects = _make_instance_profile( + {"p1": 2, "p2": 3.2, "p3": 6}, + 10, + [{"p1"}, {"p1", "p3"}, {"p2", "p3"}, {"p2", "p3"}, {"p3"}], + ) + solution = _make_solution( + ["p1", "p2"], + {0: {"p1": 1}, 1: {"p1": 1}, 2: {"p2": 1.6}, 3: {"p2": 1.6}, 4: {}}, + projects, + ) + leftover = get_leftover_budgets(inst, prof, solution) + leximax = {i: get_leximax_payment(solution, i, inst) for i in range(len(prof))} + delta = greedy_project_change(inst, prof, solution, projects["p3"], leftover, leximax) + assert delta == pytest.approx(0.5) + + +# some projects are already funded +def test_gpc_with_existing_selection(): + inst, prof, projects = _make_instance_profile( + {"p1": 5, "p2": 8}, + 10, + [{"p1", "p2"}, {"p1", "p2"}], + ) + solution = _make_solution( + ["p1"], + {0: {"p1": 5.0}, 1: {}}, + projects, + ) + leftover = get_leftover_budgets(inst, prof, solution) + leximax = {i: get_leximax_payment(solution, i, inst) for i in range(len(prof))} + delta = greedy_project_change(inst, prof, solution, projects["p2"], leftover, leximax) + assert delta >= 0 + + +####### add-opt tests + + +# empty input should return non-negative or infinite +def test_addopt_nothing_to_add(): + inst = Instance([], budget_limit=0) + prof = ApprovalProfile([], instance=inst) + solution = BudgetAllocation([], details=EESAllocationDetails({})) + + delta = add_opt(inst, prof, solution) + assert delta >= 0 or delta == float("inf") + + +# if all projects funded should not improve +def test_addopt_all_projects_already_funded(): + inst, prof, projects = _make_instance_profile( + {"p1": 5}, 10, [{"p1"}] + ) + solution = _make_solution(["p1"], {0: {"p1": 5.0}}, projects) + delta = add_opt(inst, prof, solution) + assert delta >= 0 or delta == float("inf") + + +# paper example +def test_addopt_finds_improvement(): + inst, prof, projects = _make_instance_profile( + {"p1": 2, "p2": 3.2, "p3": 6}, + 10, + [{"p1"}, {"p1", "p3"}, {"p2", "p3"}, {"p2", "p3"}, {"p3"}], + ) + solution = _make_solution( + ["p1", "p2"], + {0: {"p1": 1}, 1: {"p1": 1}, 2: {"p2": 1.6}, 3: {"p2": 1.6}, 4: {}}, + projects, + ) + delta = add_opt(inst, prof, solution) + assert delta == pytest.approx(0.5) + + +####### random tests + + +@pytest.mark.parametrize("num_voters, num_projects", [ + (3, 20), + (20, 2), + (20, 20), +]) +# random instances should stay valid after EES, GPC, and rerun EES +def test_random_ees_gpc_rerun(num_voters, num_projects, test_times=5, approval_prob=0.4, budget_factor=(0.4, 0.8)): + """ + Full random test: + 1. Generate random instance + 2. Run EES and validate result + 3. Choose unselected project and run GPC + 4. Run EES with bigger budget + 5. Validate new EES result + 6. Check GPC project now selected + """ + import random + rng = random.Random() + + for seed in range(test_times): + rng.seed(seed) + + project_names = [f"p{i}" for i in range(num_projects)] + costs = {name: rng.randint(0, 100) for name in project_names} + projects_map = {name: Project(name, c) for name, c in costs.items()} + all_projects = list(projects_map.values()) + + total_cost = sum(costs.values()) + budget = int(total_cost * rng.uniform(*budget_factor)) + + inst = Instance(all_projects, budget_limit=budget) + + # build approval ballots + ballots = [] + for _ in range(num_voters): + approved = [projects_map[name] for name in project_names if rng.random() < approval_prob] + ballots.append(ApprovalBallot(approved)) + prof = ApprovalProfile(ballots, instance=inst) + + # run EES + result = exact_equal_shares(inst, prof) + payments = _get_payments(result) + + # validate EES result + total = sum( + payments.get(i, {}).get(p, 0) + for i in range(num_voters) + for p in result + ) + assert total <= budget, f"seed={seed}: EES exceeded budget" + for p in result: + paid = sum(payments.get(i, {}).get(p, 0) for i in range(num_voters)) + assert paid == pytest.approx(p.cost), f"seed={seed}: project {p.name} not covered" + + # find unselected project that has support + selected_set = set(result) + unselected = [] + for proj in all_projects: + if proj in selected_set: + continue + has_supporter = any(proj in ballot for ballot in prof) + if has_supporter: + unselected.append(proj) + if not unselected: + continue + target_project = rng.choice(unselected) + + # run GPC + leftover = get_leftover_budgets(inst, prof, result) + leximax = {i: get_leximax_payment(result, i, inst) for i in range(num_voters)} + delta = greedy_project_change(inst, prof, result, target_project, leftover, leximax) + assert delta >= 0, f"seed={seed}: GPC returned negative delta" + + # run EES with new budget + new_budget = budget + num_voters * delta + new_inst = Instance(all_projects, budget_limit=new_budget) + new_result = exact_equal_shares(new_inst, prof) + new_payments = _get_payments(new_result) + + # validate new EES result + new_total = sum( + new_payments.get(i, {}).get(p, 0) + for i in range(num_voters) + for p in new_result + ) + assert new_total <= new_budget, f"seed={seed}: new EES exceeded budget" + for p in new_result: + paid = sum(new_payments.get(i, {}).get(p, 0) for i in range(num_voters)) + assert paid == pytest.approx(p.cost), f"seed={seed}: project {p.name} not covered after increase" + + # Per Remark 1 in the paper, GPC for a single project + # guarantees instability but not that the project is selected. + # Verify the EES outcome changed instead. + assert set(new_result) != set(result) or _get_payments(new_result) != _get_payments(result), ( + f"seed={seed}: GPC said delta={delta} for '{target_project.name}' " + f"but EES returned the same result with budget={new_budget}" + ) + + +if __name__ == "__main__": + pytest.main(["-v", __file__]) From 8ac4cb73a86ff023faf3975fb08bc9c1eb090f55 Mon Sep 17 00:00:00 2001 From: Yonatan Gabay Date: Thu, 4 Jun 2026 11:42:14 +0300 Subject: [PATCH 2/8] Rename variables, add tests, and fix code review issues in ees_addopt --- pabutools/rules/ees_addopt.py | 415 +++++++++++++++++++-------------- tests/rules/test_ees_addopt.py | 331 +++++++++++++++++++++----- 2 files changed, 514 insertions(+), 232 deletions(-) diff --git a/pabutools/rules/ees_addopt.py b/pabutools/rules/ees_addopt.py index 23bee82..d481ad3 100644 --- a/pabutools/rules/ees_addopt.py +++ b/pabutools/rules/ees_addopt.py @@ -29,7 +29,10 @@ class EESAllocationDetails(AllocationDetails): def __init__(self, payments: dict[int, dict[Project, Numeric]] | None = None): super().__init__() - self.payments: dict[int, dict[Project, Numeric]] = payments if payments is not None else {} + if payments is not None: + self.payments = payments + else: + self.payments = {} def __repr__(self): return f"EESAllocationDetails[payments={self.payments}]" @@ -85,95 +88,114 @@ def exact_equal_shares( b = instance.budget_limit - # Line 1: W = ∅, X = 0^{n·m}, r_i = b/n for all i ∈ N - W: list[Project] = [] - selected_set: set[Project] = set() - payments: dict[int, dict[Project, Numeric]] = {i: {} for i in range(n)} - r: list[Numeric] = [frac(b) / n] * n + # Line 1: Start with no selected projects and equal voter budgets. + selected_projects = [] + payments = {} + for i in range(n): + payments[i] = {} + initial_budget_per_voter = frac(b) / n + remaining_budgets = [] + for i in range(n): + remaining_budgets.append(initial_budget_per_voter) - # Maintain a globally sorted list of voters by remaining budget. - # Filtering this list to a project's supporters preserves sorted order - # in O(n), avoiding an O(n log n) sort per project per iteration. - sorted_voters: list[int] = list(range(n)) # all equal initially + # Keep voters sorted by remaining budget for fast supporter filtering. + voters_by_remaining_budget = list(range(n)) # all equal initially - # Line 2: while true do + # Line 2: Keep selecting projects until none are feasible. while True: - best_score: Numeric = -1 - best_candidates: list[tuple[Project, list[int]]] = [] + best_score = -1 + best_candidates = [] - # Line 3: Φ = {(p ∈ P\W, V ⊆ N_p) | r_i ≥ cost(p)/|V| ∀i ∈ V} + # Line 3: Consider each unselected project with supporters who can afford it. # For each project, find the largest feasible supporter subset V. - for p in instance: - if p in selected_set: + selected_set = set(selected_projects) + for project in instance: + if project in selected_set: continue - u_p = utilities[p] if utilities is not None else 1 + if utilities is not None: + project_utility = utilities[project] + else: + project_utility = 1 - # N_p: voters who approve p, filtered from sorted_voters (preserves order) - supporters = [i for i in sorted_voters if p in profile[i]] + # N_p: voters who approve project, preserving remaining-budget order. + supporters = [] + for i in voters_by_remaining_budget: + if project in profile[i]: + supporters.append(i) if not supporters: continue # Greedily remove the poorest voter while they can't afford # their equal share cost(p)/|V|. - while supporters and r[supporters[0]] < frac(p.cost) / len(supporters): + while supporters and remaining_budgets[supporters[0]] < frac(project.cost) / len(supporters): supporters.pop(0) if not supporters: continue - # Line 8: score = |V|·u(p) / cost(p) - if p.cost == 0: - score = float('inf') + # Line 8: Score the project by utility per unit of cost. + if project.cost == 0: + bang_per_buck = float('inf') else: - score = frac(len(supporters) * u_p) / p.cost - if score > best_score: - best_score = score - best_candidates = [(p, supporters)] - elif score == best_score: - best_candidates.append((p, supporters)) - - # Line 4-5: if Φ = ∅ then return (W, X) + bang_per_buck = frac(len(supporters) * project_utility) / project.cost + if bang_per_buck > best_score: + best_score = bang_per_buck + best_candidates = [(project, supporters)] + elif bang_per_buck == best_score: + best_candidates.append((project, supporters)) + + # Line 4-5: Return the current allocation if no feasible project remains. if not best_candidates: - return BudgetAllocation(W, details=EESAllocationDetails(payments)) + return BudgetAllocation(selected_projects, details=EESAllocationDetails(payments)) - # Line 9: Choose (p*, V*) from Φ* using tiebreaking (p* ◁ p) - # Use untie() (first/smallest name) so that unselected tied projects - # have larger names. The leximax (amount, selected_name) will then - # NOT exceed (amount, unselected_name) under Python's default tuple - # comparison, preventing spurious instability certificates. + # Line 9: Break ties among the best feasible projects. + # Choose the lexicographically first tied project to keep ties stable. if len(best_candidates) == 1: - p_star, V_star = best_candidates[0] + chosen_project, chosen_supporters = best_candidates[0] else: - tied_projects = [p for p, _ in best_candidates] - p_star = lexico_tie_breaking.untie(instance, profile, tied_projects) - V_star = next(V for p, V in best_candidates if p == p_star) - - # Line 10: W = W ∪ {p*} - W.append(p_star) - selected_set.add(p_star) - - # Line 11: x_{i,p*} = cost(p*)/|V*|, r_i = r_i − cost(p*)/|V*| ∀i ∈ V* - V_star_set = set(V_star) - payment = frac(p_star.cost) / len(V_star) - for i in V_star: - payments[i][p_star] = payment - r[i] -= payment - - # Update sorted_voters via O(n) merge. All V* voters decreased by + tied_projects = [] + for candidate_project, _ in best_candidates: + tied_projects.append(candidate_project) + chosen_project = lexico_tie_breaking.untie(instance, profile, tied_projects) + chosen_supporters = None + for candidate_project, candidate_supporters in best_candidates: + if candidate_project == chosen_project: + chosen_supporters = candidate_supporters + break + + # Line 10: Add the chosen project to the allocation. + selected_projects.append(chosen_project) + + # Line 11: Charge each chosen supporter an equal share of the project cost. + chosen_supporters_set = set(chosen_supporters) + payment = frac(chosen_project.cost) / len(chosen_supporters) + for i in chosen_supporters: + payments[i][chosen_project] = payment + remaining_budgets[i] -= payment + + # Update voters_by_remaining_budget via O(n) merge. All V* voters decreased by # the same amount so their relative order is preserved. - changed = [i for i in sorted_voters if i in V_star_set] - unchanged = [i for i in sorted_voters if i not in V_star_set] - merged: list[int] = [] - ci, ui = 0, 0 + changed = [] + unchanged = [] + for i in voters_by_remaining_budget: + if i in chosen_supporters_set: + changed.append(i) + else: + unchanged.append(i) + merged = [] + ci = 0 + ui = 0 while ci < len(changed) and ui < len(unchanged): - if r[changed[ci]] <= r[unchanged[ui]]: - merged.append(changed[ci]); ci += 1 + if remaining_budgets[changed[ci]] <= remaining_budgets[unchanged[ui]]: + merged.append(changed[ci]) + ci += 1 else: - merged.append(unchanged[ui]); ui += 1 + merged.append(unchanged[ui]) + ui += 1 merged.extend(changed[ci:]) merged.extend(unchanged[ui:]) - sorted_voters = merged + voters_by_remaining_budget = merged def get_leftover_budgets( @@ -186,39 +208,53 @@ def get_leftover_budgets( leftover[i] = b/n - sum of payments by voter i across all selected projects. """ - n = len(profile) - b = instance.budget_limit - details: EESAllocationDetails = current_solution.details - leftover = {} - for i in range(n): - paid = sum(details.payments.get(i, {}).values()) - leftover[i] = frac(b) / n - paid - return leftover + num_voters = len(profile) + budget_limit = instance.budget_limit + allocation_details = current_solution.details + leftover_budgets = {} + + for voter in range(num_voters): + total_paid = 0 + voter_payments = allocation_details.payments.get(voter, {}) + for payment_amount in voter_payments.values(): + total_paid += payment_amount + leftover_budgets[voter] = (frac(budget_limit) / num_voters) - total_paid + + return leftover_budgets def get_leximax_payment( current_solution: BudgetAllocation, - voter: int, + num_voters: int, instance: Instance, -) -> tuple[Numeric, str]: +) -> dict[int, list[tuple[Numeric, str]]]: """ - Return the leximax payment of a voter as ``(amount, project_name)``. + Return the leximax payment vectors for all voters as a dict mapping + voter index to a sorted list of ``(amount, project_name)`` tuples, + ordered descending by amount then ascending by project name for ties. - The leximax payment c_i = (x_i, p_i) where x_i is the maximum payment - and p_i is the project with that payment that comes first in the total - order ⊲ (alphabetical by name, i.e. smallest name). When the voter - made no payments, x_i = 0 and p_i is the first project in ⊲ - (smallest name), so that non-paying voters never certify instability. + When a voter made no payments, their entry is ``[(0, smallest_name)]`` + so that non-paying voters never certify instability. """ - details: EESAllocationDetails = current_solution.details - voter_payments = details.payments.get(voter, {}) - if not voter_payments: - min_project_name = min(p.name for p in instance) - return (0, min_project_name) - max_amount = max(voter_payments.values()) - max_projects = [p for p, v in voter_payments.items() if v == max_amount] - min_project = min(max_projects, key=lambda p: p.name) - return (max_amount, min_project.name) + allocation_details = current_solution.details + smallest_project_name = "" + for project in instance: + if smallest_project_name == "" or project.name < smallest_project_name: + smallest_project_name = project.name + leximax_payments = {} + + for voter in range(num_voters): + voter_payments = allocation_details.payments.get(voter, {}) + if not voter_payments: + leximax_payments[voter] = [(0, smallest_project_name)] + else: + payment_vector = [] + for project, payment_amount in voter_payments.items(): + payment_vector.append((payment_amount, project.name)) + payment_vector.sort(key=lambda payment: (-payment[0], payment[1])) + leximax_payments[voter] = payment_vector + + return leximax_payments def greedy_project_change( @@ -226,8 +262,8 @@ def greedy_project_change( profile: AbstractApprovalProfile, current_solution: BudgetAllocation, project: Project, - leftover: dict[int, Numeric], - leximax: dict[int, tuple[Numeric, str]], + leftover_budgets: dict[int, Numeric], + leximax_payments: dict[int, list[tuple[Numeric, str]]], voters_by_leftover: list[int] | None = None, voters_by_leximax: list[int] | None = None, ) -> Numeric: @@ -254,11 +290,11 @@ def greedy_project_change( must be an :py:class:`EESAllocationDetails` holding per-voter payments. project : :py:class:`~pabutools.election.instance.Project` The candidate project p to test instability for. - leftover : dict[int, Numeric] + leftover_budgets : dict[int, Numeric] Leftover budget per voter, as returned by :py:func:`get_leftover_budgets`. - leximax : dict[int, tuple[Numeric, str]] - Leximax payment per voter, as returned by + leximax_payments : dict[int, list[tuple[Numeric, str]]] + Leximax payment vector per voter, as returned by :py:func:`get_leximax_payment`. voters_by_leftover : list[int] or None All voters pre-sorted by leftover ascending. When provided the @@ -287,79 +323,103 @@ def greedy_project_change( >>> details = EESAllocationDetails({0: {p1: 1}, 1: {p1: 1}, 2: {p2: 1.6}, 3: {p2: 1.6}, 4: {}}) >>> solution = BudgetAllocation([p1, p2], details=details) >>> leftover = get_leftover_budgets(inst, prof, solution) - >>> leximax = {i: get_leximax_payment(solution, i, inst) for i in range(5)} + >>> leximax = get_leximax_payment(solution, 5, inst) >>> greedy_project_change(inst, prof, solution, p3, leftover, leximax) - 0.5 + mpq(1,2) """ n = len(profile) - p = project - # All voters who approve p - all_supporters = {i for i in range(n) if p in profile[i]} + # All voters who approve project. + project_supporters = set() + for voter in range(n): + if project in profile[voter]: + project_supporters.add(voter) + + # voters who already pay for project in the current solution. + allocation_details = current_solution.details + current_payers = set() + for voter in project_supporters: + if project in allocation_details.payments.get(voter, {}): + current_payers.add(voter) - # N_p(X): voters who pay for project p in the current solution - details: EESAllocationDetails = current_solution.details - N_p_X = {i for i in all_supporters if p in details.payments.get(i, {})} - # O_p(X) = N_p \ N_p(X): voters who approve p but don't pay for it - O_p_X = all_supporters - N_p_X + # O_p(X): supporters who approve project but do not currently pay for it. + outside_supporters = project_supporters - current_payers - # O_p(X) sorted by leftover budget ascending: v_1, ..., v_k + # Outside supporters sorted by leftover budget ascending. if voters_by_leftover is not None: - O_p = [i for i in voters_by_leftover if i in O_p_X] + outside_supporters_by_leftover = [] + for voter in voters_by_leftover: + if voter in outside_supporters: + outside_supporters_by_leftover.append(voter) else: - O_p = sorted(O_p_X, key=lambda i: leftover[i]) - k = len(O_p) + outside_supporters_by_leftover = sorted( + outside_supporters, key=lambda voter: leftover_budgets[voter] + ) + num_outside_supporters = len(outside_supporters_by_leftover) - # Leximax payments of O_p(X) voters, sorted ascending: w_1, ..., w_k + # Outside supporters sorted by leximax payment ascending. if voters_by_leximax is not None: - O_p_by_leximax = [i for i in voters_by_leximax if i in O_p_X] + outside_supporters_by_leximax = [] + for voter in voters_by_leximax: + if voter in outside_supporters: + outside_supporters_by_leximax.append(voter) else: - O_p_by_leximax = sorted(O_p_X, key=lambda i: leximax[i]) + outside_supporters_by_leximax = sorted( + outside_supporters, key=lambda voter: leximax_payments[voter]) - # Line 1: i, j ← 1, 1 (1-indexed in paper, 0-indexed here) - i = 0 - j = 0 + # Line 1: Start both scan positions at the beginning. + leftover_index = 0 + leximax_index = 0 - # Line 2-3: SL ← ∅, LQ ← O_p(X) - SL: set[int] = set() - LQ: set[int] = set(O_p) + # Line 2-3 + # SL (solvent list) — voters who can pay by deviating from their leximax project. + solvent_list = set() + # LQ (liquid queue) — voters expected to pay from their leftover budgets. + liquid_queue = set(outside_supporters_by_leftover) - # Line 4: d ← +∞ + # Line 4: Initialize the required budget increase as unbounded. d = float('inf') - # Line 5: while LQ ∪ SL ≠ ∅ - while LQ or SL: - # Line 6: PvP ← cost(p) / |N_p(X) ∪ LQ ∪ SL| - B = N_p_X | LQ | SL - PvP = frac(p.cost) / len(B) - - pvp_lex = (PvP, p.name) - - # Line 7: if j ≤ |O_p(X)| and c_{w_j} <_lex (PvP, p) - if j < k and leximax[O_p_by_leximax[j]] < pvp_lex: - # Line 8: SL ← SL \ {w_j} - SL.discard(O_p_by_leximax[j]) - # Line 9: j ← j + 1 - j += 1 - # Line 10: else if c_{v_i} >_lex (PvP, p) - elif i < k and leximax[O_p[i]] > pvp_lex: - # Line 11: LQ ← LQ \ {v_i} - LQ.discard(O_p[i]) - # Line 12: SL ← SL ∪ {v_i} - SL.add(O_p[i]) - # Line 13: i ← i + 1 - i += 1 + # Line 5: Continue until all queued and skipped voters have been processed. + while liquid_queue or solvent_list: + # Line 6: Compute the current equal payment needed for project. + paying_supporters = current_payers | liquid_queue | solvent_list + per_voter_price = frac(project.cost) / len(paying_supporters) + + per_voter_price_leximax = [(per_voter_price, project.name)] + + # Line 7: Advance past voters whose leximax payment is too small. + if (leximax_index < num_outside_supporters + and leximax_payments[outside_supporters_by_leximax[leximax_index]] + < per_voter_price_leximax): + # Line 8: Remove that voter from the skipped set if present. + solvent_list.discard(outside_supporters_by_leximax[leximax_index]) + # Line 9: Move to the next voter in leximax order. + leximax_index += 1 + + # Line 10: Otherwise, check whether the next leftover voter must be skipped. + elif (leftover_index < num_outside_supporters + and leximax_payments[outside_supporters_by_leftover[leftover_index]] + > per_voter_price_leximax): + # Line 11: Remove the voter from the leftover queue. + liquid_queue.discard(outside_supporters_by_leftover[leftover_index]) + # Line 12: Mark the voter as skipped for later processing. + solvent_list.add(outside_supporters_by_leftover[leftover_index]) + # Line 13: Move to the next voter in leftover order. + leftover_index += 1 + + # Line 14-15: Record the smallest increase that lets this voter pay. else: - # Line 14-15: d ← min{d, PvP - r_{v_i}} - if i < k: - d = min(d, PvP - leftover[O_p[i]]) - # Line 16: LQ ← LQ \ {v_i} - if i < k: - LQ.discard(O_p[i]) - # Line 17: i ← i + 1 - i += 1 - - # Line 20: return d + if leftover_index < num_outside_supporters: + next_voter = outside_supporters_by_leftover[leftover_index] + d = min(d, per_voter_price - leftover_budgets[next_voter]) + # Line 16: Remove the processed voter from the leftover queue. + if leftover_index < num_outside_supporters: + liquid_queue.discard(outside_supporters_by_leftover[leftover_index]) + # Line 17: Move to the next voter in leftover order. + leftover_index += 1 + + # Line 20: Return the best budget increase found. return max(0, d) @@ -409,34 +469,34 @@ def add_opt( >>> details = EESAllocationDetails({0: {p1: 1}, 1: {p1: 1}, 2: {p2: 1.6}, 3: {p2: 1.6}, 4: {}}) >>> solution = BudgetAllocation([p1, p2], details=details) >>> add_opt(inst, prof, solution) - 0.5 + mpq(1,2) """ n = len(profile) # Precompute leftover budgets and leximax payments for all voters - leftover = get_leftover_budgets(instance, profile, current_solution) - leximax = {i: get_leximax_payment(current_solution, i, instance) for i in range(n)} + leftover_budgets = get_leftover_budgets(instance, profile, current_solution) + leximax_payments = get_leximax_payment(current_solution, n, instance) # Pre-sort all voters once (Algorithm 3, lines A and B) - voters_by_leftover = sorted(range(n), key=lambda i: leftover[i]) - voters_by_leximax = sorted(range(n), key=lambda i: leximax[i]) + all_voters = list(range(n)) + voters_by_leftover = sorted(all_voters, key=lambda i: leftover_budgets[i]) + voters_by_leximax = sorted(all_voters, key=lambda i: leximax_payments[i]) - # Line 1: d ← +∞ + # Line 1: Initialize the best project change as unbounded. d = float('inf') - # Line 2: for p ∈ P do - for p in instance: - # Line 5: d ← min{d, GreedyProjectChange(E, (W, X), p, A', B')} - d = min(d, greedy_project_change( - instance, profile, current_solution, p, leftover, leximax, - voters_by_leftover, voters_by_leximax, - )) + # Line 2: Test every project as a possible instability certificate. + for project in instance: + # Line 5: Keep the smallest change found for any project. + gpc_result = greedy_project_change(instance, profile, current_solution, project, leftover_budgets, leximax_payments, + voters_by_leftover, voters_by_leximax,) + d = min(d, gpc_result) - # Line 7: return d + # Line 7: Return the minimum change over all projects. return d -def ees_completion( +def ees_add_opt_completion( instance: Instance, profile: AbstractApprovalProfile, utilities: dict[Project, Numeric] | None = None, @@ -476,7 +536,7 @@ def ees_completion( ... ApprovalBallot([p2, p3]), ... ApprovalBallot([p3]), ... ], instance=inst) - >>> result = ees_completion(inst, prof) + >>> result = ees_add_opt_completion(inst, prof) >>> sorted(p.name for p in result) ['p1', 'p3'] """ @@ -485,26 +545,29 @@ def ees_completion( return exact_equal_shares(instance, profile, utilities) original_budget = instance.budget_limit - budget = frac(original_budget) + virtual_budget = frac(original_budget) projects = list(instance) - best: BudgetAllocation | None = None - best_cost = frac(-1) + best_result = None + best_result_cost = frac(-1) while True: - virtual_inst = Instance(projects, budget_limit=budget) + virtual_inst = Instance(projects, budget_limit=virtual_budget) result = exact_equal_shares(virtual_inst, profile, utilities) - total_cost = sum(frac(p.cost) for p in result) - if total_cost <= original_budget and total_cost > best_cost: - best = result - best_cost = total_cost + total_cost = 0 + for project in result: + total_cost += frac(project.cost) + if total_cost <= original_budget and total_cost > best_result_cost: + best_result = result + best_result_cost = total_cost d = add_opt(virtual_inst, profile, result) if d == float('inf') or d <= 0: break - budget = budget + n * frac(d) + virtual_budget = virtual_budget + n * frac(d) - if best is None: - best = exact_equal_shares(instance, profile, utilities) - return best + if best_result is None: + best_result = exact_equal_shares(instance, profile, utilities) + + return best_result diff --git a/tests/rules/test_ees_addopt.py b/tests/rules/test_ees_addopt.py index c2b7777..b2c59f7 100644 --- a/tests/rules/test_ees_addopt.py +++ b/tests/rules/test_ees_addopt.py @@ -15,6 +15,7 @@ exact_equal_shares, greedy_project_change, add_opt, + ees_add_opt_completion, EESAllocationDetails, get_leftover_budgets, get_leximax_payment, @@ -41,19 +42,26 @@ def _make_instance_profile(project_costs, budget, approval_sets): tuple[Instance, ApprovalProfile, dict[str, Project]] The instance, profile, and a name→Project lookup dict. """ - projects = {name: Project(name, cost) for name, cost in project_costs.items()} + projects = {} + for name, cost in project_costs.items(): + projects[name] = Project(name, cost) inst = Instance(projects.values(), budget_limit=budget) - ballots = [ - ApprovalBallot([projects[pname] for pname in approved]) - for approved in approval_sets - ] + ballots = [] + for approved in approval_sets: + ballot_projects = [] + for pname in approved: + ballot_projects.append(projects[pname]) + ballots.append(ApprovalBallot(ballot_projects)) prof = ApprovalProfile(ballots, instance=inst) return inst, prof, projects def _selected_names(result): """Return project names from a BudgetAllocation.""" - return [p.name for p in result] + names = [] + for p in result: + names.append(p.name) + return names def _get_payments(result): @@ -61,6 +69,31 @@ def _get_payments(result): return result.details.payments +def _make_solution(selected_names, payments_by_voter, projects): + """ + Build a BudgetAllocation with EESAllocationDetails from simple descriptions. + + Parameters + ---------- + selected_names : list[str] + Names of selected projects. + payments_by_voter : dict[int, dict[str, float]] + payments_by_voter[voter_index][project_name] = payment. + projects : dict[str, Project] + Name→Project lookup. + """ + selected = [] + for name in selected_names: + selected.append(projects[name]) + pay = {} + for voter_idx, voter_payments in payments_by_voter.items(): + voter_pay = {} + for pname, amount in voter_payments.items(): + voter_pay[projects[pname]] = amount + pay[voter_idx] = voter_pay + return BudgetAllocation(selected, details=EESAllocationDetails(pay)) + + ####### EES tests @@ -132,43 +165,119 @@ def test_ees_budget_feasibility(): result = exact_equal_shares(inst, prof) payments = _get_payments(result) - total_paid = sum( - payments.get(i, {}).get(p, 0) - for i in range(len(prof)) - for p in result - ) + total_paid = 0 + for i in range(len(prof)): + for p in result: + total_paid += payments.get(i, {}).get(p, 0) assert total_paid <= inst.budget_limit # Each funded project is fully covered for proj in result: - paid_for_proj = sum( - payments.get(i, {}).get(proj, 0) - for i in range(len(prof)) - ) + paid_for_proj = 0 + for i in range(len(prof)): + paid_for_proj += payments.get(i, {}).get(proj, 0) assert paid_for_proj == pytest.approx(proj.cost) -####### GPC tests +####### get_leftover_budgets tests -def _make_solution(selected_names, payments_by_voter, projects): - """ - Build a BudgetAllocation with EESAllocationDetails from simple descriptions. +# no payments means full leftover for each voter +def test_leftover_no_payments(): + inst, prof, projects = _make_instance_profile({"p1": 10}, 20, [{"p1"}, {"p1"}]) + solution = _make_solution([], {0: {}, 1: {}}, projects) + leftover = get_leftover_budgets(inst, prof, solution) + # b/n = 20/2 = 10 per voter + assert leftover[0] == pytest.approx(10) + assert leftover[1] == pytest.approx(10) - Parameters - ---------- - selected_names : list[str] - Names of selected projects. - payments_by_voter : dict[int, dict[str, float]] - payments_by_voter[voter_index][project_name] = payment. - projects : dict[str, Project] - Name→Project lookup. - """ - selected = [projects[n] for n in selected_names] - pay = {} - for voter_idx, voter_payments in payments_by_voter.items(): - pay[voter_idx] = {projects[pname]: amount for pname, amount in voter_payments.items()} - return BudgetAllocation(selected, details=EESAllocationDetails(pay)) + +# leftover should equal b/n minus total payments +def test_leftover_after_payments(): + inst, prof, projects = _make_instance_profile({"p1": 2, "p2": 3.2}, 10, [{"p1", "p2"}, {"p1", "p2"}]) + solution = _make_solution(["p1", "p2"],{0: {"p1": 1, "p2": 1.6}, 1: {"p1": 1, "p2": 1.6}},projects,) + leftover = get_leftover_budgets(inst, prof, solution) + # b/n = 10/2 = 5, each voter paid 2.6 + assert leftover[0] == pytest.approx(2.4) + assert leftover[1] == pytest.approx(2.4) + + +# voter who paid nothing has full leftover; voter who paid has less +def test_leftover_uneven_payments(): + inst, prof, projects = _make_instance_profile({"p1": 5}, 10, [{"p1"}, {"p1"}]) + solution = _make_solution(["p1"],{0: {"p1": 5.0}, 1: {}},projects,) + leftover = get_leftover_budgets(inst, prof, solution) + # b/n = 5 + assert leftover[0] == pytest.approx(0) + assert leftover[1] == pytest.approx(5) + + +# paper example +def test_leftover_paper_example(): + inst, prof, projects = _make_instance_profile({"p1": 2, "p2": 3.2, "p3": 6},10,[{"p1"}, {"p1", "p3"}, {"p2", "p3"}, {"p2", "p3"}, {"p3"}],) + solution = _make_solution(["p1", "p2"],{0: {"p1": 1}, 1: {"p1": 1}, 2: {"p2": 1.6}, 3: {"p2": 1.6}, 4: {}},projects,) + leftover = get_leftover_budgets(inst, prof, solution) + # b/n = 10/5 = 2 + assert leftover[0] == pytest.approx(1) + assert leftover[1] == pytest.approx(1) + assert leftover[2] == pytest.approx(0.4) + assert leftover[3] == pytest.approx(0.4) + assert leftover[4] == pytest.approx(2) + + +####### get_leximax_payment tests + + +# non-paying voter gets [(0, smallest_project_name)] +def test_leximax_no_payments(): + inst, prof, projects = _make_instance_profile({"p1": 10, "p2": 5}, 20, [{"p1"}, {"p2"}]) + solution = _make_solution([], {0: {}, 1: {}}, projects) + leximax = get_leximax_payment(solution, len(prof), inst) + # smallest project name is "p1" + assert leximax[0] == [(0, "p1")] + assert leximax[1] == [(0, "p1")] + + +# single payment produces a one-element vector +def test_leximax_single_payment(): + inst, prof, projects = _make_instance_profile({"p1": 10}, 10, [{"p1"}, {"p1"}]) + solution = _make_solution(["p1"],{0: {"p1": 5}, 1: {"p1": 5}},projects,) + leximax = get_leximax_payment(solution, len(prof), inst) + assert leximax[0] == [(5, "p1")] + assert leximax[1] == [(5, "p1")] + + +# multiple payments sorted descending by amount, then ascending by name +def test_leximax_multiple_payments_sorted(): + inst, prof, projects = _make_instance_profile({"p1": 2, "p2": 6}, 10, [{"p1", "p2"}]) + solution = _make_solution(["p1", "p2"],{0: {"p1": 2, "p2": 6}},projects,) + leximax = get_leximax_payment(solution, len(prof), inst) + # descending by amount: 6 before 2 + assert leximax[0] == [(6, "p2"), (2, "p1")] + + +# equal amounts should be sorted ascending by project name +def test_leximax_tiebreak_by_name(): + inst, prof, projects = _make_instance_profile({"a": 4, "b": 4}, 10, [{"a", "b"}]) + solution = _make_solution(["a", "b"], {0: {"a": 4, "b": 4}}, projects,) + leximax = get_leximax_payment(solution, len(prof), inst) + # same amount, ascending by name: "a" before "b" + assert leximax[0] == [(4, "a"), (4, "b")] + + +# paper example +def test_leximax_paper_example(): + inst, prof, projects = _make_instance_profile({"p1": 2, "p2": 3.2, "p3": 6}, 10, [{"p1"}, {"p1", "p3"}, {"p2", "p3"}, {"p2", "p3"}, {"p3"}],) + solution = _make_solution(["p1", "p2"], {0: {"p1": 1}, 1: {"p1": 1}, 2: {"p2": 1.6}, 3: {"p2": 1.6}, 4: {}}, projects,) + leximax = get_leximax_payment(solution, len(prof), inst) + assert leximax[0] == [(1, "p1")] + assert leximax[1] == [(1, "p1")] + assert leximax[2] == [(1.6, "p2")] + assert leximax[3] == [(1.6, "p2")] + assert leximax[4] == [(0, "p1")] # non-payer gets smallest name + + +####### GPC tests # zero-cost project should return zero delta @@ -178,7 +287,7 @@ def test_gpc_free_project_needs_zero_increase(): ) solution = _make_solution([], {}, projects) leftover = get_leftover_budgets(inst, prof, solution) - leximax = {i: get_leximax_payment(solution, i, inst) for i in range(len(prof))} + leximax = get_leximax_payment(solution, len(prof), inst) delta = greedy_project_change(inst, prof, solution, projects["p1"], leftover, leximax) assert delta == pytest.approx(0) @@ -190,7 +299,7 @@ def test_gpc_leftover_covers_cost_exactly(): ) solution = _make_solution([], {}, projects) leftover = get_leftover_budgets(inst, prof, solution) - leximax = {i: get_leximax_payment(solution, i, inst) for i in range(len(prof))} + leximax = get_leximax_payment(solution, len(prof), inst) delta = greedy_project_change(inst, prof, solution, projects["p1"], leftover, leximax) assert delta == pytest.approx(0) @@ -202,7 +311,7 @@ def test_gpc_not_enough_leftover(): ) solution = _make_solution([], {}, projects) leftover = get_leftover_budgets(inst, prof, solution) - leximax = {i: get_leximax_payment(solution, i, inst) for i in range(len(prof))} + leximax = get_leximax_payment(solution, len(prof), inst) delta = greedy_project_change(inst, prof, solution, projects["p1"], leftover, leximax) assert delta > 0 @@ -220,7 +329,7 @@ def test_gpc_paper_example(): projects, ) leftover = get_leftover_budgets(inst, prof, solution) - leximax = {i: get_leximax_payment(solution, i, inst) for i in range(len(prof))} + leximax = get_leximax_payment(solution, len(prof), inst) delta = greedy_project_change(inst, prof, solution, projects["p3"], leftover, leximax) assert delta == pytest.approx(0.5) @@ -238,7 +347,7 @@ def test_gpc_with_existing_selection(): projects, ) leftover = get_leftover_budgets(inst, prof, solution) - leximax = {i: get_leximax_payment(solution, i, inst) for i in range(len(prof))} + leximax = get_leximax_payment(solution, len(prof), inst) delta = greedy_project_change(inst, prof, solution, projects["p2"], leftover, leximax) assert delta >= 0 @@ -287,7 +396,7 @@ def test_addopt_finds_improvement(): @pytest.mark.parametrize("num_voters, num_projects", [ (3, 20), - (20, 2), + (20, 3), (20, 20), ]) # random instances should stay valid after EES, GPC, and rerun EES @@ -307,9 +416,15 @@ def test_random_ees_gpc_rerun(num_voters, num_projects, test_times=5, approval_p for seed in range(test_times): rng.seed(seed) - project_names = [f"p{i}" for i in range(num_projects)] - costs = {name: rng.randint(0, 100) for name in project_names} - projects_map = {name: Project(name, c) for name, c in costs.items()} + project_names = [] + for i in range(num_projects): + project_names.append(f"p{i}") + costs = {} + for name in project_names: + costs[name] = rng.randint(0, 100) + projects_map = {} + for name, c in costs.items(): + projects_map[name] = Project(name, c) all_projects = list(projects_map.values()) total_cost = sum(costs.values()) @@ -320,7 +435,10 @@ def test_random_ees_gpc_rerun(num_voters, num_projects, test_times=5, approval_p # build approval ballots ballots = [] for _ in range(num_voters): - approved = [projects_map[name] for name in project_names if rng.random() < approval_prob] + approved = [] + for name in project_names: + if rng.random() < approval_prob: + approved.append(projects_map[name]) ballots.append(ApprovalBallot(approved)) prof = ApprovalProfile(ballots, instance=inst) @@ -329,14 +447,15 @@ def test_random_ees_gpc_rerun(num_voters, num_projects, test_times=5, approval_p payments = _get_payments(result) # validate EES result - total = sum( - payments.get(i, {}).get(p, 0) - for i in range(num_voters) - for p in result - ) + total = 0 + for i in range(num_voters): + for p in result: + total += payments.get(i, {}).get(p, 0) assert total <= budget, f"seed={seed}: EES exceeded budget" for p in result: - paid = sum(payments.get(i, {}).get(p, 0) for i in range(num_voters)) + paid = 0 + for i in range(num_voters): + paid += payments.get(i, {}).get(p, 0) assert paid == pytest.approx(p.cost), f"seed={seed}: project {p.name} not covered" # find unselected project that has support @@ -354,7 +473,7 @@ def test_random_ees_gpc_rerun(num_voters, num_projects, test_times=5, approval_p # run GPC leftover = get_leftover_budgets(inst, prof, result) - leximax = {i: get_leximax_payment(result, i, inst) for i in range(num_voters)} + leximax = get_leximax_payment(result, num_voters, inst) delta = greedy_project_change(inst, prof, result, target_project, leftover, leximax) assert delta >= 0, f"seed={seed}: GPC returned negative delta" @@ -365,14 +484,15 @@ def test_random_ees_gpc_rerun(num_voters, num_projects, test_times=5, approval_p new_payments = _get_payments(new_result) # validate new EES result - new_total = sum( - new_payments.get(i, {}).get(p, 0) - for i in range(num_voters) - for p in new_result - ) + new_total = 0 + for i in range(num_voters): + for p in new_result: + new_total += new_payments.get(i, {}).get(p, 0) assert new_total <= new_budget, f"seed={seed}: new EES exceeded budget" for p in new_result: - paid = sum(new_payments.get(i, {}).get(p, 0) for i in range(num_voters)) + paid = 0 + for i in range(num_voters): + paid += new_payments.get(i, {}).get(p, 0) assert paid == pytest.approx(p.cost), f"seed={seed}: project {p.name} not covered after increase" # Per Remark 1 in the paper, GPC for a single project @@ -384,5 +504,104 @@ def test_random_ees_gpc_rerun(num_voters, num_projects, test_times=5, approval_p ) +####### ees_add_opt_completion tests + + +# empty profile returns empty result +def test_completion_empty_profile(): + inst = Instance([], budget_limit=10) + prof = ApprovalProfile([], instance=inst) + result = ees_add_opt_completion(inst, prof) + assert len(result) == 0 + + +# paper example from §4.1 Example 4.3 +# 5 voters, 3 projects: p1(2), p2(3.2), p3(6), budget=10 +# EES alone picks {p1,p2} (cost 5.2), completion should pick {p1,p3} (cost 8) +def test_completion_paper_example(): + inst, prof, projects = _make_instance_profile({"p1": 2, "p2": 3.2, "p3": 6}, + 10, + [{"p1"}, {"p1", "p3"}, {"p2", "p3"}, {"p2", "p3"}, {"p3"}],) + result = ees_add_opt_completion(inst, prof) + names = sorted(_selected_names(result)) + assert names == ["p1", "p3"] + + +# result should always be budget-feasible +def test_completion_budget_feasible(): + inst, prof, projects = _make_instance_profile({"p1": 2, "p2": 3.2, "p3": 6}, + 10, + [{"p1"}, {"p1", "p3"}, {"p2", "p3"}, {"p2", "p3"}, {"p3"}],) + result = ees_add_opt_completion(inst, prof) + total = 0 + for p in result: + total += p.cost + assert total <= inst.budget_limit + + +# single voter, single affordable project +def test_completion_single_voter_single_project(): + inst, prof, projects = _make_instance_profile({"p1": 5}, + 10, + [{"p1"}],) + result = ees_add_opt_completion(inst, prof) + assert _selected_names(result) == ["p1"] + + +# all projects are affordable from the start +def test_completion_all_projects_selected(): + inst, prof, projects = _make_instance_profile({"p1": 2, "p2": 3}, + 10, + [{"p1", "p2"}, {"p1", "p2"}],) + result = ees_add_opt_completion(inst, prof) + names = sorted(_selected_names(result)) + assert names == ["p1", "p2"] + + +# no project is affordable (cost exceeds budget) +def test_completion_no_affordable_project(): + inst, prof, projects = _make_instance_profile({"p1": 100}, + 10, + [{"p1"}],) + result = ees_add_opt_completion(inst, prof) + assert len(result) == 0 + + +# Remark 1 example: p1(2),p2(98),p3(100),p4(51), budget=150, 3 voters +# A1={p1,p2}, A2={p2,p3}, A3={p3,p4}. EES selects {p1,p3}. +# Completion should produce a feasible result with total cost <= 150. +def test_completion_remark1_example(): + inst, prof, projects = _make_instance_profile({"p1": 2, "p2": 98, "p3": 100, "p4": 51}, + 150, + [{"p1", "p2"}, {"p2", "p3"}, {"p3", "p4"}],) + result = ees_add_opt_completion(inst, prof) + total = 0 + for p in result: + total += p.cost + assert total <= 150 + # should at least select the base EES result {p1, p3} + names = sorted(_selected_names(result)) + assert "p1" in names + assert "p3" in names + + +# completion should spend at least as much as base EES +def test_completion_spends_at_least_as_much_as_ees(): + inst, prof, projects = _make_instance_profile({"p1": 2, "p2": 3.2, "p3": 6}, + 10, + [{"p1"}, {"p1", "p3"}, {"p2", "p3"}, {"p2", "p3"}, {"p3"}],) + ees_result = exact_equal_shares(inst, prof) + ees_cost = 0 + for p in ees_result: + ees_cost += p.cost + + completion_result = ees_add_opt_completion(inst, prof) + completion_cost = 0 + for p in completion_result: + completion_cost += p.cost + + assert completion_cost >= ees_cost + + if __name__ == "__main__": pytest.main(["-v", __file__]) From 32a25849c5279fda02ce7a94270102496c334abf Mon Sep 17 00:00:00 2001 From: Yonatan Gabay Date: Sun, 7 Jun 2026 11:43:53 +0300 Subject: [PATCH 3/8] Add logging to EES/add-opt algorithms and running example --- examples/run_ees_addopt.py | 168 ++++++++++++++++++++++++++++++++++ pabutools/rules/ees_addopt.py | 31 ++++++- 2 files changed, 198 insertions(+), 1 deletion(-) create mode 100644 examples/run_ees_addopt.py diff --git a/examples/run_ees_addopt.py b/examples/run_ees_addopt.py new file mode 100644 index 0000000..adfced5 --- /dev/null +++ b/examples/run_ees_addopt.py @@ -0,0 +1,168 @@ +""" +Running example for all algorithms in pabutools.rules.ees_addopt. + +Demonstrates: + 1. exact_equal_shares (Algorithm 1 – EES) + 2. get_leftover_budgets (leftover budget helper) + 3. get_leximax_payment (leximax payment helper) + 4. greedy_project_change (Algorithm 2 – GPC) + 5. add_opt (Algorithm 3 – add-opt) + 6. ees_add_opt_completion (EES completion via add-opt) +""" + +import logging + +from pabutools.election import Instance, Project, ApprovalProfile, ApprovalBallot +from pabutools.fractions import frac +from pabutools.rules.budgetallocation import BudgetAllocation +from pabutools.rules.ees_addopt import ( + EESAllocationDetails, + exact_equal_shares, + get_leftover_budgets, + get_leximax_payment, + greedy_project_change, + add_opt, + ees_add_opt_completion, +) + +# Show all log messages from the module. +logging.basicConfig( + level=logging.DEBUG, + format="%(name)s %(levelname)s %(message)s", + stream=__import__("sys").stdout, +) + +SEPARATOR = "\n" + "=" * 70 + "\n" + + +# A small PB instance with 5 voters and 3 projects. +# Projects: p1 (cost 2), p2 (cost 3.2), p3 (cost 6) +# Budget: 10 +# Voter 0 approves {p1} +# Voter 1 approves {p1, p3} +# Voter 2 approves {p2, p3} +# Voter 3 approves {p2, p3} +# Voter 4 approves {p3} + +p1 = Project("p1", 2) +p2 = Project("p2", 3.2) +p3 = Project("p3", 6) +projects = [p1, p2, p3] +budget = 10 + +instance = Instance(projects, budget_limit=budget) +profile = ApprovalProfile( + [ + ApprovalBallot([p1]), + ApprovalBallot([p1, p3]), + ApprovalBallot([p2, p3]), + ApprovalBallot([p2, p3]), + ApprovalBallot([p3]), + ], + instance=instance, +) + +num_voters = len(profile) +print("Instance") +print(f" Budget : {budget}") +print(f" Projects : {[(p.name, p.cost) for p in projects]}") +print(f" Num voters : {num_voters}") +print(f" Approvals :") +for i, ballot in enumerate(profile): + print(f" Voter {i}: {sorted(p.name for p in ballot)}") + + +# 1. exact_equal_shares (Algorithm 1) +print(SEPARATOR) +print("1. exact_equal_shares (Algorithm 1 – EES)") +print("-" * 42) + +ees_result = exact_equal_shares(instance, profile) + +print(f"\n Selected projects : {[p.name for p in ees_result]}") +total_cost = sum(frac(p.cost) for p in ees_result) +print(f" Total cost : {total_cost}") + +payments = ees_result.details.payments +print(" Per-voter payments:") +for voter in range(num_voters): + voter_pay = payments.get(voter, {}) + items = [(p.name, float(v)) for p, v in voter_pay.items()] + print(f" Voter {voter}: {items if items else '(none)'}") + + +# 2. get_leftover_budgets +print(SEPARATOR) +print("2. get_leftover_budgets") +print("-" * 42) + +leftover = get_leftover_budgets(instance, profile, ees_result) + +print(" Leftover budget per voter:") +for voter in range(num_voters): + print(f" Voter {voter}: {float(leftover[voter]):.4f}") + + +# 3. get_leximax_payment +print(SEPARATOR) +print("3. get_leximax_payment") +print("-" * 42) + +leximax = get_leximax_payment(ees_result, num_voters, instance) + +print(" Leximax payment vectors:") +for voter in range(num_voters): + formatted = [(float(amt), name) for amt, name in leximax[voter]] + print(f" Voter {voter}: {formatted}") + + +# 4. greedy_project_change (Algorithm 2 – GPC) +print(SEPARATOR) +print("4. greedy_project_change (Algorithm 2 – GPC)") +print("-" * 42) + +print(" Testing each project as instability certificate:") +for proj in projects: + d = greedy_project_change( + instance, profile, ees_result, proj, leftover, leximax + ) + print(f" Project '{proj.name}' (cost={proj.cost}): d = {d} ({float(d):.4f})") + + +# 5. add_opt (Algorithm 3) +print(SEPARATOR) +print("5. add_opt (Algorithm 3)") +print("-" * 42) + +d_min = add_opt(instance, profile, ees_result) + +print(f"\n Minimum d over all projects: {d_min} ({float(d_min):.4f})") +print(f" Per-voter budget increase : {float(d_min):.4f}") +print(f" Total budget increase (n*d): {float(num_voters * d_min):.4f}") + + +# 6. ees_add_opt_completion (EES completion via add-opt) +print(SEPARATOR) +print("6. ees_add_opt_completion (EES completed via add-opt)") +print("-" * 42) + +completed = ees_add_opt_completion(instance, profile) + +print(f"\n Selected projects : {sorted(p.name for p in completed)}") +completed_cost = sum(frac(p.cost) for p in completed) +print(f" Total cost : {completed_cost} (budget = {budget})") + +if hasattr(completed.details, "payments"): + print(" Per-voter payments:") + for voter in range(num_voters): + voter_pay = completed.details.payments.get(voter, {}) + items = [(p.name, float(v)) for p, v in voter_pay.items()] + print(f" Voter {voter}: {items if items else '(none)'}") + + +# Comparison +print(SEPARATOR) +print("Summary comparison") +print("-" * 42) +print(f" EES alone : {str([p.name for p in ees_result]):30s} cost = {float(total_cost)}") +print(f" EES + add-opt : {str(sorted(p.name for p in completed)):30s} cost = {float(completed_cost)}") diff --git a/pabutools/rules/ees_addopt.py b/pabutools/rules/ees_addopt.py index d481ad3..31837f9 100644 --- a/pabutools/rules/ees_addopt.py +++ b/pabutools/rules/ees_addopt.py @@ -9,6 +9,8 @@ from __future__ import annotations +import logging + from pabutools.election.instance import Instance, Project from pabutools.election.profile import AbstractApprovalProfile from pabutools.fractions import frac @@ -16,6 +18,8 @@ from pabutools.tiebreaking import lexico_tie_breaking from pabutools.utils import Numeric +logger = logging.getLogger(__name__) + class EESAllocationDetails(AllocationDetails): """ @@ -82,8 +86,11 @@ def exact_equal_shares( >>> [p.name for p in result] ['p1', 'p2'] """ + logger.info("exact_equal_shares: starting with %d projects, budget_limit=%s, %d voters", + len(instance), instance.budget_limit, len(profile)) n = len(profile) if n == 0: + logger.info("exact_equal_shares: no voters, returning empty allocation") return BudgetAllocation(details=EESAllocationDetails()) b = instance.budget_limit @@ -147,6 +154,8 @@ def exact_equal_shares( # Line 4-5: Return the current allocation if no feasible project remains. if not best_candidates: + logger.info("exact_equal_shares: no feasible project remains, returning %d selected projects", + len(selected_projects)) return BudgetAllocation(selected_projects, details=EESAllocationDetails(payments)) # Line 9: Break ties among the best feasible projects. @@ -165,6 +174,8 @@ def exact_equal_shares( break # Line 10: Add the chosen project to the allocation. + logger.debug("exact_equal_shares: selected project '%s' (cost=%s, score=%s, supporters=%d)", + chosen_project.name, chosen_project.cost, best_score, len(chosen_supporters)) selected_projects.append(chosen_project) # Line 11: Charge each chosen supporter an equal share of the project cost. @@ -208,6 +219,7 @@ def get_leftover_budgets( leftover[i] = b/n - sum of payments by voter i across all selected projects. """ + logger.debug("get_leftover_budgets: computing for %d voters", len(profile)) num_voters = len(profile) budget_limit = instance.budget_limit allocation_details = current_solution.details @@ -236,6 +248,7 @@ def get_leximax_payment( When a voter made no payments, their entry is ``[(0, smallest_name)]`` so that non-paying voters never certify instability. """ + logger.debug("get_leximax_payment: computing for %d voters", num_voters) allocation_details = current_solution.details smallest_project_name = "" for project in instance: @@ -327,6 +340,8 @@ def greedy_project_change( >>> greedy_project_change(inst, prof, solution, p3, leftover, leximax) mpq(1,2) """ + logger.debug("greedy_project_change: computing d for project '%s' (cost=%s)", + project.name, project.cost) n = len(profile) # All voters who approve project. @@ -420,7 +435,9 @@ def greedy_project_change( leftover_index += 1 # Line 20: Return the best budget increase found. - return max(0, d) + result = max(0, d) + logger.debug("greedy_project_change: project '%s' => d=%s", project.name, result) + return result def add_opt( @@ -471,6 +488,8 @@ def add_opt( >>> add_opt(inst, prof, solution) mpq(1,2) """ + logger.info("add_opt: computing minimum d over %d projects, %d voters", + len(instance), len(profile)) n = len(profile) # Precompute leftover budgets and leximax payments for all voters @@ -493,6 +512,7 @@ def add_opt( d = min(d, gpc_result) # Line 7: Return the minimum change over all projects. + logger.info("add_opt: minimum d=%s", d) return d @@ -540,8 +560,11 @@ def ees_add_opt_completion( >>> sorted(p.name for p in result) ['p1', 'p3'] """ + logger.info("ees_add_opt_completion: starting with %d projects, budget_limit=%s, %d voters", + len(instance), instance.budget_limit, len(profile)) n = len(profile) if n == 0: + logger.info("ees_add_opt_completion: no voters, delegating to exact_equal_shares") return exact_equal_shares(instance, profile, utilities) original_budget = instance.budget_limit @@ -557,17 +580,23 @@ def ees_add_opt_completion( total_cost = 0 for project in result: total_cost += frac(project.cost) + logger.debug("ees_add_opt_completion: virtual_budget=%s, EES selected %d projects, total_cost=%s", + virtual_budget, len(result), total_cost) if total_cost <= original_budget and total_cost > best_result_cost: best_result = result best_result_cost = total_cost d = add_opt(virtual_inst, profile, result) if d == float('inf') or d <= 0: + logger.debug("ees_add_opt_completion: stopping (d=%s)", d) break virtual_budget = virtual_budget + n * frac(d) + logger.debug("ees_add_opt_completion: increasing virtual_budget to %s (d=%s)", virtual_budget, d) if best_result is None: best_result = exact_equal_shares(instance, profile, utilities) + logger.info("ees_add_opt_completion: returning %d projects, total_cost=%s", + len(best_result), best_result_cost) return best_result From c055dad5c71685707edbf2dad9cddd347c8eb452 Mon Sep 17 00:00:00 2001 From: Yonatan Gabay Date: Sun, 7 Jun 2026 12:17:04 +0300 Subject: [PATCH 4/8] delete examples --- examples/run_ees_addopt.py | 168 ------------------------------------- 1 file changed, 168 deletions(-) delete mode 100644 examples/run_ees_addopt.py diff --git a/examples/run_ees_addopt.py b/examples/run_ees_addopt.py deleted file mode 100644 index adfced5..0000000 --- a/examples/run_ees_addopt.py +++ /dev/null @@ -1,168 +0,0 @@ -""" -Running example for all algorithms in pabutools.rules.ees_addopt. - -Demonstrates: - 1. exact_equal_shares (Algorithm 1 – EES) - 2. get_leftover_budgets (leftover budget helper) - 3. get_leximax_payment (leximax payment helper) - 4. greedy_project_change (Algorithm 2 – GPC) - 5. add_opt (Algorithm 3 – add-opt) - 6. ees_add_opt_completion (EES completion via add-opt) -""" - -import logging - -from pabutools.election import Instance, Project, ApprovalProfile, ApprovalBallot -from pabutools.fractions import frac -from pabutools.rules.budgetallocation import BudgetAllocation -from pabutools.rules.ees_addopt import ( - EESAllocationDetails, - exact_equal_shares, - get_leftover_budgets, - get_leximax_payment, - greedy_project_change, - add_opt, - ees_add_opt_completion, -) - -# Show all log messages from the module. -logging.basicConfig( - level=logging.DEBUG, - format="%(name)s %(levelname)s %(message)s", - stream=__import__("sys").stdout, -) - -SEPARATOR = "\n" + "=" * 70 + "\n" - - -# A small PB instance with 5 voters and 3 projects. -# Projects: p1 (cost 2), p2 (cost 3.2), p3 (cost 6) -# Budget: 10 -# Voter 0 approves {p1} -# Voter 1 approves {p1, p3} -# Voter 2 approves {p2, p3} -# Voter 3 approves {p2, p3} -# Voter 4 approves {p3} - -p1 = Project("p1", 2) -p2 = Project("p2", 3.2) -p3 = Project("p3", 6) -projects = [p1, p2, p3] -budget = 10 - -instance = Instance(projects, budget_limit=budget) -profile = ApprovalProfile( - [ - ApprovalBallot([p1]), - ApprovalBallot([p1, p3]), - ApprovalBallot([p2, p3]), - ApprovalBallot([p2, p3]), - ApprovalBallot([p3]), - ], - instance=instance, -) - -num_voters = len(profile) -print("Instance") -print(f" Budget : {budget}") -print(f" Projects : {[(p.name, p.cost) for p in projects]}") -print(f" Num voters : {num_voters}") -print(f" Approvals :") -for i, ballot in enumerate(profile): - print(f" Voter {i}: {sorted(p.name for p in ballot)}") - - -# 1. exact_equal_shares (Algorithm 1) -print(SEPARATOR) -print("1. exact_equal_shares (Algorithm 1 – EES)") -print("-" * 42) - -ees_result = exact_equal_shares(instance, profile) - -print(f"\n Selected projects : {[p.name for p in ees_result]}") -total_cost = sum(frac(p.cost) for p in ees_result) -print(f" Total cost : {total_cost}") - -payments = ees_result.details.payments -print(" Per-voter payments:") -for voter in range(num_voters): - voter_pay = payments.get(voter, {}) - items = [(p.name, float(v)) for p, v in voter_pay.items()] - print(f" Voter {voter}: {items if items else '(none)'}") - - -# 2. get_leftover_budgets -print(SEPARATOR) -print("2. get_leftover_budgets") -print("-" * 42) - -leftover = get_leftover_budgets(instance, profile, ees_result) - -print(" Leftover budget per voter:") -for voter in range(num_voters): - print(f" Voter {voter}: {float(leftover[voter]):.4f}") - - -# 3. get_leximax_payment -print(SEPARATOR) -print("3. get_leximax_payment") -print("-" * 42) - -leximax = get_leximax_payment(ees_result, num_voters, instance) - -print(" Leximax payment vectors:") -for voter in range(num_voters): - formatted = [(float(amt), name) for amt, name in leximax[voter]] - print(f" Voter {voter}: {formatted}") - - -# 4. greedy_project_change (Algorithm 2 – GPC) -print(SEPARATOR) -print("4. greedy_project_change (Algorithm 2 – GPC)") -print("-" * 42) - -print(" Testing each project as instability certificate:") -for proj in projects: - d = greedy_project_change( - instance, profile, ees_result, proj, leftover, leximax - ) - print(f" Project '{proj.name}' (cost={proj.cost}): d = {d} ({float(d):.4f})") - - -# 5. add_opt (Algorithm 3) -print(SEPARATOR) -print("5. add_opt (Algorithm 3)") -print("-" * 42) - -d_min = add_opt(instance, profile, ees_result) - -print(f"\n Minimum d over all projects: {d_min} ({float(d_min):.4f})") -print(f" Per-voter budget increase : {float(d_min):.4f}") -print(f" Total budget increase (n*d): {float(num_voters * d_min):.4f}") - - -# 6. ees_add_opt_completion (EES completion via add-opt) -print(SEPARATOR) -print("6. ees_add_opt_completion (EES completed via add-opt)") -print("-" * 42) - -completed = ees_add_opt_completion(instance, profile) - -print(f"\n Selected projects : {sorted(p.name for p in completed)}") -completed_cost = sum(frac(p.cost) for p in completed) -print(f" Total cost : {completed_cost} (budget = {budget})") - -if hasattr(completed.details, "payments"): - print(" Per-voter payments:") - for voter in range(num_voters): - voter_pay = completed.details.payments.get(voter, {}) - items = [(p.name, float(v)) for p, v in voter_pay.items()] - print(f" Voter {voter}: {items if items else '(none)'}") - - -# Comparison -print(SEPARATOR) -print("Summary comparison") -print("-" * 42) -print(f" EES alone : {str([p.name for p in ees_result]):30s} cost = {float(total_cost)}") -print(f" EES + add-opt : {str(sorted(p.name for p in completed)):30s} cost = {float(completed_cost)}") From 79fae41acc516a0044219a7f6982508a3bb3bfd9 Mon Sep 17 00:00:00 2001 From: Yonatan Gabay Date: Sun, 7 Jun 2026 14:04:51 +0300 Subject: [PATCH 5/8] Add Flask web demo for the Method of Equal Shares (EES add-opt) Visual point-and-click election builder, plain-language step-by-step results with a log viewer, a sample-by-size generator, and an about page. Wraps pabutools.rules.ees_addopt without changing the algorithm. --- examples/ees_addopt_web/README.md | 32 + examples/ees_addopt_web/app.py | 448 +++++++++ examples/ees_addopt_web/requirements.txt | 1 + examples/ees_addopt_web/static/builder.js | 360 +++++++ examples/ees_addopt_web/static/styles.css | 935 ++++++++++++++++++ examples/ees_addopt_web/templates/about.html | 68 ++ examples/ees_addopt_web/templates/base.html | 30 + examples/ees_addopt_web/templates/index.html | 99 ++ examples/ees_addopt_web/templates/result.html | 268 +++++ 9 files changed, 2241 insertions(+) create mode 100644 examples/ees_addopt_web/README.md create mode 100644 examples/ees_addopt_web/app.py create mode 100644 examples/ees_addopt_web/requirements.txt create mode 100644 examples/ees_addopt_web/static/builder.js create mode 100644 examples/ees_addopt_web/static/styles.css create mode 100644 examples/ees_addopt_web/templates/about.html create mode 100644 examples/ees_addopt_web/templates/base.html create mode 100644 examples/ees_addopt_web/templates/index.html create mode 100644 examples/ees_addopt_web/templates/result.html diff --git a/examples/ees_addopt_web/README.md b/examples/ees_addopt_web/README.md new file mode 100644 index 0000000..c8ce53a --- /dev/null +++ b/examples/ees_addopt_web/README.md @@ -0,0 +1,32 @@ +# EES add-opt Flask demo + +This small Flask app demonstrates `exact_equal_shares`, `add_opt`, and `ees_add_opt_completion` from `pabutools.rules.ees_addopt`. + +## Run + +From the repository root: + +```powershell +python -m pip install -r examples/ees_addopt_web/requirements.txt +python examples/ees_addopt_web/app.py +``` + +Then open . + +## Input format + +```text +Budget: 10 + +Projects: +p1, 2 +p2, 3.2 +p3, 6 + +Ballots: +p1 +p1, p3 +p2, p3 +``` + +Use `-` for a voter who approves no projects. \ No newline at end of file diff --git a/examples/ees_addopt_web/app.py b/examples/ees_addopt_web/app.py new file mode 100644 index 0000000..d23985a --- /dev/null +++ b/examples/ees_addopt_web/app.py @@ -0,0 +1,448 @@ +"""A beginner-friendly web demo for the Method of Equal Shares (with add-opt completion). + +You do not need to know how the algorithm works to use this site. You describe a +simple situation - some money to share, a few projects, and who voted for what - +and the site shows which projects get funded and explains, with real numbers, why +the result is fair. + +The heavy lifting is done by the library function +``pabutools.rules.ees_addopt.ees_add_opt_completion``. This file only wraps it in +a friendly interface; it never changes the algorithm itself. +""" + +from __future__ import annotations + +import io +import json +import logging +import sys +from dataclasses import dataclass +from pathlib import Path +from typing import Any + +from flask import Flask, Response, render_template, request + +ROOT_DIR = Path(__file__).resolve().parents[2] +if str(ROOT_DIR) not in sys.path: + sys.path.insert(0, str(ROOT_DIR)) + +from pabutools.election.ballot import ApprovalBallot +from pabutools.election.instance import Instance, Project +from pabutools.election.profile import ApprovalProfile +from pabutools.fractions import frac, str_as_frac +from pabutools.rules.ees_addopt import ( + add_opt, + exact_equal_shares, + get_leftover_budgets, + get_leximax_payment, +) + +app = Flask(__name__) + +ALGORITHM_LOGGER = logging.getLogger("pabutools.rules.ees_addopt") + +# A ready-made, relatable example used for the "Load example" button and the +# first time the page is opened. Project indices in "voters" are 0-based and +# point into the "projects" list. +EXAMPLE: dict[str, Any] = { + "budget": "10", + "projects": [ + {"name": "New benches", "cost": "2"}, + {"name": "Bike lane", "cost": "3.2"}, + {"name": "Playground", "cost": "6"}, + ], + "voters": [ + [0], + [0, 2], + [1, 2], + [1, 2], + [2], + ], +} + + +@dataclass(frozen=True) +class ParsedElection: + instance: Instance + profile: ApprovalProfile + projects: list[Project] + project_names: list[str] + ballots: list[list[str]] + budget: Any + + +class InputError(ValueError): + """Raised when the submitted election cannot be understood.""" + + +def parse_number(raw_value: Any, field_name: str) -> Any: + """Turn user text into a non-negative number, with a friendly error if it is not one.""" + text = str(raw_value).strip() + if not text: + raise InputError(f"{field_name} is missing a value.") + try: + value = str_as_frac(text) + except Exception as exc: + raise InputError(f'"{text}" is not a valid number for {field_name.lower()}.') from exc + if value < 0: + raise InputError(f"{field_name} cannot be negative.") + return value + + +def parse_election_from_payload(payload: Any) -> ParsedElection: + """Build an election from the structured data sent by the visual builder.""" + if not isinstance(payload, dict): + raise InputError("The form could not be read. Please reload the page and try again.") + + budget = parse_number(payload.get("budget", ""), "The budget") + + raw_projects = payload.get("projects") + if not isinstance(raw_projects, list) or not raw_projects: + raise InputError("Add at least one project.") + + projects: list[Project] = [] + seen_names: set[str] = set() + for position, item in enumerate(raw_projects, start=1): + item = item or {} + name = str(item.get("name", "")).strip() + if not name: + raise InputError(f"Project {position} needs a name.") + if name in seen_names: + raise InputError(f'Two projects are both called "{name}". Please give each project a different name.') + cost = parse_number(item.get("cost", ""), f'The cost of "{name}"') + seen_names.add(name) + projects.append(Project(name, cost)) + + raw_voters = payload.get("voters") + if not isinstance(raw_voters, list) or not raw_voters: + raise InputError("Add at least one voter.") + + ballots: list[ApprovalBallot] = [] + ballot_names: list[list[str]] = [] + for voter_position, approvals in enumerate(raw_voters, start=1): + if approvals is None: + approvals = [] + if not isinstance(approvals, list): + raise InputError(f"Voter {voter_position}'s choices could not be read.") + chosen_indices: list[int] = [] + for raw_index in approvals: + try: + index = int(raw_index) + except (TypeError, ValueError): + raise InputError(f"Voter {voter_position} has an invalid project choice.") + if index < 0 or index >= len(projects): + raise InputError(f"Voter {voter_position} voted for a project that does not exist.") + chosen_indices.append(index) + chosen_indices = sorted(set(chosen_indices)) + ballot_names.append([projects[index].name for index in chosen_indices]) + ballots.append(ApprovalBallot(projects[index] for index in chosen_indices)) + + instance = Instance(projects, budget_limit=budget) + profile = ApprovalProfile(ballots, instance=instance) + return ParsedElection( + instance=instance, + profile=profile, + projects=projects, + project_names=[project.name for project in projects], + ballots=ballot_names, + budget=budget, + ) + + +def format_number(value: Any) -> str: + """Show a number in the friendliest readable form (whole number, decimal, or fraction).""" + if value == float("inf"): + return "infinity" + text = str(value) + if "/" in text: + try: + as_float = float(value) + except (TypeError, ValueError): + return text + if abs(as_float - round(as_float)) < 1e-10: + return str(round(as_float)) + return f"{as_float:.4g}" + return text + + +def total_cost(projects: list[Project]) -> Any: + total = frac(0) + for project in projects: + total += frac(project.cost) + return total + + +def supporters_by_project(parsed: ParsedElection) -> dict[str, int]: + counts = {project.name: 0 for project in parsed.projects} + for ballot in parsed.ballots: + for project_name in ballot: + counts[project_name] += 1 + return counts + + +def summarize_allocation(parsed: ParsedElection, allocation: list[Project]) -> dict[str, Any]: + """Describe one outcome: which projects, who paid, and how much each voter kept.""" + selected_projects = list(allocation) + selected_names = [project.name for project in selected_projects] + details = getattr(allocation, "details", None) + payments = getattr(details, "payments", {}) if details is not None else {} + number_of_voters = len(parsed.profile) + voter_budget = frac(parsed.instance.budget_limit) / number_of_voters if number_of_voters else frac(0) + cost_value = total_cost(selected_projects) + + project_payments = [] + for project in selected_projects: + paid = frac(0) + payers = [] + for voter_index in range(number_of_voters): + amount = payments.get(voter_index, {}).get(project, frac(0)) + if amount: + payers.append({"voter": voter_index + 1, "amount": format_number(amount)}) + paid += amount + project_payments.append( + { + "name": project.name, + "cost": format_number(project.cost), + "paid": format_number(paid), + "is_fully_paid": paid == frac(project.cost), + "payers": payers, + } + ) + + voter_rows = [] + for voter_index in range(number_of_voters): + paid_total = frac(0) + paid_entries = [] + for project in selected_projects: + amount = payments.get(voter_index, {}).get(project, frac(0)) + if amount: + paid_entries.append(f"{project.name}: {format_number(amount)}") + paid_total += amount + voter_rows.append( + { + "number": voter_index + 1, + "approvals": ", ".join(parsed.ballots[voter_index]) or "nothing", + "payments": ", ".join(paid_entries) or "-", + "paid_total": format_number(paid_total), + "leftover": format_number(voter_budget - paid_total), + "within_budget": paid_total <= voter_budget, + } + ) + + return { + "selected_names": selected_names, + "selected_display": ", ".join(selected_names) if selected_names else "no projects", + "count": len(selected_names), + "is_empty": len(selected_names) == 0, + "total_cost": format_number(cost_value), + "total_cost_num": cost_value, + "is_budget_feasible": cost_value <= parsed.instance.budget_limit, + "project_payments": project_payments, + "voter_rows": voter_rows, + } + + +def percent_of_budget(used: Any, budget: Any) -> float: + budget_value = frac(budget) + if budget_value <= 0: + return 0.0 + fraction = float(frac(used) / budget_value) * 100.0 + return max(0.0, min(100.0, round(fraction, 1))) + + +def run_completion_with_steps(parsed: ParsedElection) -> tuple[list[dict[str, Any]], list[Project], int]: + """Reproduce the add-opt completion loop, recording every round as a visible step. + + This mirrors ``ees_add_opt_completion`` exactly - it only calls the same public + functions - so the page can show each round without changing the algorithm. + """ + instance = parsed.instance + profile = parsed.profile + number_of_voters = len(profile) + original_budget = frac(instance.budget_limit) + projects = list(instance) + + rounds: list[dict[str, Any]] = [] + virtual_budget = original_budget + best_index = -1 + best_cost = frac(-1) + + while True: + virtual_instance = Instance(projects, budget_limit=virtual_budget) + allocation = exact_equal_shares(virtual_instance, profile) + cost = total_cost(list(allocation)) + fits = cost <= original_budget + delta = add_opt(virtual_instance, profile, allocation) + rounds.append( + { + "allocation": allocation, + "virtual_budget": virtual_budget, + "share": virtual_budget / number_of_voters if number_of_voters else frac(0), + "selected": [project.name for project in allocation], + "total_cost": cost, + "fits": fits, + "delta": delta, + } + ) + if fits and cost > best_cost: + best_cost = cost + best_index = len(rounds) - 1 + if delta == float("inf") or delta <= 0 or len(rounds) >= 60: + break + virtual_budget = virtual_budget + number_of_voters * frac(delta) + + if best_index < 0: + best_index = 0 + return rounds, rounds[best_index]["allocation"], best_index + + +def analyze(parsed: ParsedElection) -> dict[str, Any]: + """Run the algorithm and assemble everything the results page needs to explain it.""" + log_stream = io.StringIO() + handler = logging.StreamHandler(log_stream) + handler.setFormatter(logging.Formatter("%(levelname)s: %(message)s")) + previous_level = ALGORITHM_LOGGER.level + previous_propagate = ALGORITHM_LOGGER.propagate + ALGORITHM_LOGGER.setLevel(logging.DEBUG) + ALGORITHM_LOGGER.propagate = False + ALGORITHM_LOGGER.addHandler(handler) + try: + rounds, completed_allocation, best_index = run_completion_with_steps(parsed) + base_allocation = rounds[0]["allocation"] + leftover_budgets = get_leftover_budgets(parsed.instance, parsed.profile, base_allocation) + leximax_payments = get_leximax_payment(base_allocation, len(parsed.profile), parsed.instance) + next_delta = rounds[0]["delta"] + finally: + ALGORITHM_LOGGER.removeHandler(handler) + ALGORITHM_LOGGER.setLevel(previous_level) + ALGORITHM_LOGGER.propagate = previous_propagate + + number_of_voters = len(parsed.profile) + budget_value = frac(parsed.budget) + share_value = budget_value / number_of_voters if number_of_voters else frac(0) + + base = summarize_allocation(parsed, base_allocation) + completed = summarize_allocation(parsed, completed_allocation) + + supporter_counts = supporters_by_project(parsed) + base_selected_names = set(base["selected_names"]) + completed_selected_names = set(completed["selected_names"]) + project_rows = [ + { + "name": project.name, + "cost": format_number(project.cost), + "supporters": supporter_counts[project.name], + "in_base": project.name in base_selected_names, + "in_completed": project.name in completed_selected_names, + } + for project in parsed.projects + ] + + leftover_rows = [ + { + "voter": voter_index + 1, + "leftover": format_number(leftover_budgets[voter_index]), + "leximax": ", ".join( + f"{project_name}: {format_number(amount)}" + for amount, project_name in leximax_payments[voter_index] + ), + } + for voter_index in range(number_of_voters) + ] + + completion_rounds = [] + for index, round_data in enumerate(rounds): + delta_value = round_data["delta"] + if delta_value == float("inf") or delta_value <= 0: + delta_display = None + else: + delta_display = format_number(delta_value) + completion_rounds.append( + { + "number": index + 1, + "share": format_number(round_data["share"]), + "selected_display": ", ".join(round_data["selected"]) if round_data["selected"] else "no projects", + "total_cost": format_number(round_data["total_cost"]), + "fits": round_data["fits"], + "delta": delta_display, + "is_chosen": index == best_index, + } + ) + + return { + "budget": format_number(parsed.budget), + "voter_count": number_of_voters, + "share_per_voter": format_number(share_value), + "project_count": len(parsed.projects), + "project_rows": project_rows, + "base": base, + "completed": completed, + "base_leftover": format_number(budget_value - base["total_cost_num"]), + "completed_leftover": format_number(budget_value - completed["total_cost_num"]), + "completed_used_percent": percent_of_budget(completed["total_cost_num"], parsed.budget), + "same_as_base": base_selected_names == completed_selected_names, + "completion_rounds": completion_rounds, + "completion_multistep": len(completion_rounds) > 1, + "chosen_round": best_index + 1, + "next_delta": format_number(next_delta), + "leftover_rows": leftover_rows, + "logs": [line for line in log_stream.getvalue().splitlines() if line.strip()], + } + + +@app.get("/") +def index(): + return render_template("index.html", initial_data=EXAMPLE, example_data=EXAMPLE, error=None) + + +@app.post("/run") +def run_algorithm(): + raw_payload = request.form.get("payload", "") + try: + payload = json.loads(raw_payload) if raw_payload else {} + except json.JSONDecodeError: + payload = {} + + fallback = payload if isinstance(payload, dict) and payload else EXAMPLE + try: + parsed = parse_election_from_payload(payload) + result = analyze(parsed) + except InputError as exc: + return ( + render_template("index.html", initial_data=fallback, example_data=EXAMPLE, error=str(exc)), + 400, + ) + except Exception as exc: # noqa: BLE001 - surface any unexpected failure to the user. + return ( + render_template( + "index.html", + initial_data=fallback, + example_data=EXAMPLE, + error=f"Something went wrong while running the election: {exc}", + ), + 400, + ) + return render_template("result.html", result=result) + + +@app.get("/about") +def about(): + return render_template("about.html") + + +# A tiny inline icon so browsers do not get a 404 when they ask for /favicon.ico. +FAVICON_SVG = ( + "" + "" + "" +) + + +@app.get("/favicon.ico") +def favicon(): + return Response(FAVICON_SVG, mimetype="image/svg+xml") + + +if __name__ == "__main__": + app.run(debug=True) diff --git a/examples/ees_addopt_web/requirements.txt b/examples/ees_addopt_web/requirements.txt new file mode 100644 index 0000000..a9039a4 --- /dev/null +++ b/examples/ees_addopt_web/requirements.txt @@ -0,0 +1 @@ +Flask>=3.0 \ No newline at end of file diff --git a/examples/ees_addopt_web/static/builder.js b/examples/ees_addopt_web/static/builder.js new file mode 100644 index 0000000..cca78c4 --- /dev/null +++ b/examples/ees_addopt_web/static/builder.js @@ -0,0 +1,360 @@ +// Powers the visual election builder on the home page. +// No part of the algorithm lives here - this only collects the user's input +// (budget, projects, votes) and sends it to the server as simple JSON. +(function () { + "use strict"; + + const budgetEl = document.getElementById("budget"); + const projectsEl = document.getElementById("projects"); + const votersEl = document.getElementById("voters"); + const payloadEl = document.getElementById("payload"); + const form = document.getElementById("builder"); + const errorEl = document.getElementById("form-error"); + const runButton = document.getElementById("run-button"); + + let nextId = 1; + let projects = []; // [{ id, name, cost }] + let voters = []; // [{ id, approvals: Set }] + + function uid() { + return nextId++; + } + + // Load a data object (from the server) into the on-screen builder. + function loadData(data) { + data = data || {}; + const idByIndex = []; + projects = (data.projects || []).map(function (project, index) { + const id = uid(); + idByIndex[index] = id; + return { id: id, name: (project && project.name) || "", cost: project && project.cost != null ? String(project.cost) : "" }; + }); + voters = (data.voters || []).map(function (approvals) { + const set = new Set(); + (approvals || []).forEach(function (index) { + const id = idByIndex[index]; + if (id !== undefined) { + set.add(id); + } + }); + return { id: uid(), approvals: set }; + }); + budgetEl.value = data.budget != null ? String(data.budget) : ""; + render(); + } + + // Keep a typed size within sensible bounds. + function clampInt(value, min, max, fallback) { + const parsed = Math.floor(Number(value)); + if (Number.isNaN(parsed)) { + return fallback; + } + return Math.max(min, Math.min(max, parsed)); + } + + // Build a complete, ready-to-run example with the requested number of + // projects and voters, so the user can try the algorithm without typing + // every value by hand. + function generateSample(numProjects, numVoters) { + const generatedProjects = []; + let totalCost = 0; + let maxCost = 0; + for (let i = 0; i < numProjects; i++) { + const cost = 1 + Math.floor(Math.random() * 9); // 1..9 + totalCost += cost; + maxCost = Math.max(maxCost, cost); + generatedProjects.push({ name: "Project " + (i + 1), cost: String(cost) }); + } + const generatedVoters = []; + for (let v = 0; v < numVoters; v++) { + const approvals = []; + for (let i = 0; i < numProjects; i++) { + if (Math.random() < 0.5) { + approvals.push(i); + } + } + if (!approvals.length && numProjects > 0) { + approvals.push(Math.floor(Math.random() * numProjects)); // never leave a voter empty + } + generatedVoters.push(approvals); + } + // A budget big enough to fund some, but usually not all, projects. + const budget = Math.max(maxCost, Math.round(totalCost * 0.6)); + return { budget: String(budget), projects: generatedProjects, voters: generatedVoters }; + } + + function addProject() { + projects.push({ id: uid(), name: "", cost: "" }); + render(); + focusLastProjectName(); + } + + function removeProject(id) { + projects = projects.filter(function (project) { + return project.id !== id; + }); + voters.forEach(function (voter) { + voter.approvals.delete(id); + }); + render(); + } + + function addVoter() { + voters.push({ id: uid(), approvals: new Set() }); + render(); + } + + function removeVoter(id) { + voters = voters.filter(function (voter) { + return voter.id !== id; + }); + render(); + } + + function projectLabel(project, index) { + const name = (project.name || "").trim(); + return name || "Project " + (index + 1); + } + + function renderProjects() { + projectsEl.innerHTML = ""; + if (!projects.length) { + const empty = document.createElement("p"); + empty.className = "muted empty-note"; + empty.textContent = "No projects yet. Click \u201c+ Add project\u201d to begin."; + projectsEl.appendChild(empty); + return; + } + projects.forEach(function (project, index) { + const row = document.createElement("div"); + row.className = "project-row"; + + const number = document.createElement("span"); + number.className = "row-index"; + number.textContent = String(index + 1); + + const nameInput = document.createElement("input"); + nameInput.type = "text"; + nameInput.className = "p-name"; + nameInput.placeholder = "e.g. New playground"; + nameInput.value = project.name; + nameInput.addEventListener("input", function () { + project.name = nameInput.value; + renderVoters(); + }); + + const costInput = document.createElement("input"); + costInput.type = "number"; + costInput.className = "p-cost"; + costInput.min = "0"; + costInput.step = "any"; + costInput.inputMode = "decimal"; + costInput.placeholder = "Cost"; + costInput.value = project.cost; + costInput.addEventListener("input", function () { + project.cost = costInput.value; + }); + + const remove = document.createElement("button"); + remove.type = "button"; + remove.className = "icon-button"; + remove.setAttribute("aria-label", "Remove this project"); + remove.textContent = "\u2715"; + remove.addEventListener("click", function () { + removeProject(project.id); + }); + + row.appendChild(number); + row.appendChild(nameInput); + row.appendChild(costInput); + row.appendChild(remove); + projectsEl.appendChild(row); + }); + } + + function renderVoters() { + votersEl.innerHTML = ""; + if (!voters.length) { + const empty = document.createElement("p"); + empty.className = "muted empty-note"; + empty.textContent = "No voters yet. Click \u201c+ Add voter\u201d to begin."; + votersEl.appendChild(empty); + return; + } + voters.forEach(function (voter, voterIndex) { + const card = document.createElement("div"); + card.className = "voter-row"; + + const head = document.createElement("div"); + head.className = "voter-head"; + + const title = document.createElement("strong"); + title.textContent = "Voter " + (voterIndex + 1); + + const remove = document.createElement("button"); + remove.type = "button"; + remove.className = "icon-button"; + remove.setAttribute("aria-label", "Remove this voter"); + remove.textContent = "\u2715"; + remove.addEventListener("click", function () { + removeVoter(voter.id); + }); + + head.appendChild(title); + head.appendChild(remove); + card.appendChild(head); + + const choices = document.createElement("div"); + choices.className = "choices"; + if (!projects.length) { + const note = document.createElement("span"); + note.className = "muted"; + note.textContent = "Add some projects first."; + choices.appendChild(note); + } else { + projects.forEach(function (project, index) { + const label = document.createElement("label"); + label.className = "choice"; + + const checkbox = document.createElement("input"); + checkbox.type = "checkbox"; + checkbox.checked = voter.approvals.has(project.id); + checkbox.addEventListener("change", function () { + if (checkbox.checked) { + voter.approvals.add(project.id); + } else { + voter.approvals.delete(project.id); + } + label.classList.toggle("is-on", checkbox.checked); + }); + + const text = document.createElement("span"); + text.textContent = projectLabel(project, index); + + label.classList.toggle("is-on", checkbox.checked); + label.appendChild(checkbox); + label.appendChild(text); + choices.appendChild(label); + }); + } + card.appendChild(choices); + votersEl.appendChild(card); + }); + } + + function render() { + renderProjects(); + renderVoters(); + } + + function focusLastProjectName() { + const inputs = projectsEl.querySelectorAll(".p-name"); + if (inputs.length) { + inputs[inputs.length - 1].focus(); + } + } + + function buildPayload() { + return { + budget: budgetEl.value.trim(), + projects: projects.map(function (project) { + return { name: project.name.trim(), cost: project.cost.trim() }; + }), + voters: voters.map(function (voter) { + const indices = []; + projects.forEach(function (project, index) { + if (voter.approvals.has(project.id)) { + indices.push(index); + } + }); + return indices; + }), + }; + } + + function isValidNumber(text) { + if (text === "") { + return false; + } + const value = Number(text); + return !Number.isNaN(value) && value >= 0; + } + + function validate(payload) { + if (!isValidNumber(payload.budget)) { + return "Enter a budget of 0 or more."; + } + if (!payload.projects.length) { + return "Add at least one project."; + } + const seen = new Set(); + for (let i = 0; i < payload.projects.length; i++) { + const project = payload.projects[i]; + if (!project.name) { + return "Project " + (i + 1) + " needs a name."; + } + if (seen.has(project.name)) { + return 'Two projects are called "' + project.name + '". Use different names.'; + } + seen.add(project.name); + if (!isValidNumber(project.cost)) { + return 'Enter a valid cost for "' + project.name + '".'; + } + } + if (!payload.voters.length) { + return "Add at least one voter."; + } + return null; + } + + function showError(message) { + errorEl.textContent = message; + errorEl.hidden = false; + errorEl.scrollIntoView({ behavior: "smooth", block: "center" }); + } + + function hideError() { + errorEl.hidden = true; + errorEl.textContent = ""; + } + + form.addEventListener("submit", function (event) { + const payload = buildPayload(); + const message = validate(payload); + if (message) { + event.preventDefault(); + showError(message); + return; + } + hideError(); + payloadEl.value = JSON.stringify(payload); + runButton.disabled = true; + runButton.textContent = "Working\u2026"; + }); + + document.getElementById("generate").addEventListener("click", function () { + hideError(); + const projectsInput = document.getElementById("gen-projects"); + const votersInput = document.getElementById("gen-voters"); + const numProjects = clampInt(projectsInput.value, 1, 20, 4); + const numVoters = clampInt(votersInput.value, 1, 50, 6); + projectsInput.value = String(numProjects); + votersInput.value = String(numVoters); + loadData(generateSample(numProjects, numVoters)); + }); + document.getElementById("add-project").addEventListener("click", addProject); + document.getElementById("add-voter").addEventListener("click", addVoter); + document.getElementById("load-example").addEventListener("click", function () { + hideError(); + loadData(window.EXAMPLE_DATA); + }); + document.getElementById("clear-all").addEventListener("click", function () { + hideError(); + loadData({ budget: "", projects: [{ name: "", cost: "" }], voters: [[]] }); + }); + + const start = window.INITIAL_DATA && window.INITIAL_DATA.projects && window.INITIAL_DATA.projects.length + ? window.INITIAL_DATA + : window.EXAMPLE_DATA; + loadData(start); +})(); diff --git a/examples/ees_addopt_web/static/styles.css b/examples/ees_addopt_web/static/styles.css new file mode 100644 index 0000000..8e63e76 --- /dev/null +++ b/examples/ees_addopt_web/static/styles.css @@ -0,0 +1,935 @@ +:root { + color-scheme: light; + --bg: #f4f7fb; + --surface: #ffffff; + --surface-soft: #eef5f3; + --text: #1f2a33; + --muted: #5d6b77; + --line: #d8e1e8; + --brand: #1f7a70; + --brand-strong: #155d55; + --accent: #2f6df0; + --good: #1f7a45; + --good-soft: #e9f6ee; + --warn: #8a5a18; + --warn-soft: #fdf3e6; + --shadow: 0 10px 28px rgba(24, 45, 58, 0.08); + --radius: 12px; +} + +* { + box-sizing: border-box; +} + +html { + scroll-behavior: smooth; +} + +body { + margin: 0; + background: var(--bg); + color: var(--text); + font-family: "Segoe UI", Arial, sans-serif; + line-height: 1.55; +} + +a { + color: var(--brand-strong); +} + +/* ---------- Top bar ---------- */ +.topbar { + align-items: center; + background: var(--surface); + border-bottom: 1px solid var(--line); + display: flex; + gap: 20px; + justify-content: space-between; + padding: 14px clamp(16px, 4vw, 56px); + position: sticky; + top: 0; + z-index: 10; +} + +.brand { + align-items: center; + color: var(--brand); + display: flex; + font-size: 1.1rem; + font-weight: 800; + gap: 10px; + text-decoration: none; +} + +.brand-mark { + background: var(--brand); + border-radius: 8px; + color: #fff; + display: inline-grid; + font-size: 0.85rem; + height: 30px; + place-items: center; + width: 30px; +} + +.topbar nav { + display: flex; + flex-wrap: wrap; + gap: 8px 18px; +} + +.topbar nav a { + border-radius: 8px; + color: var(--text); + padding: 6px 10px; + text-decoration: none; +} + +.topbar nav a:hover { + background: var(--surface-soft); +} + +/* ---------- Layout ---------- */ +.page { + margin: 0 auto; + max-width: 1000px; + padding: 24px clamp(16px, 4vw, 40px) 56px; +} + +.band, +.panel { + background: var(--surface); + border: 1px solid var(--line); + border-radius: var(--radius); + box-shadow: var(--shadow); +} + +.band { + align-items: center; + display: grid; + gap: 28px; + grid-template-columns: minmax(0, 1.4fr) minmax(220px, 0.9fr); + margin-bottom: 22px; + padding: clamp(22px, 4vw, 38px); +} + +.panel { + margin-bottom: 18px; + padding: clamp(18px, 3vw, 26px); +} + +h1, +h2, +h3 { + line-height: 1.2; + margin: 0 0 12px; +} + +h1 { + color: var(--text); + font-size: clamp(1.8rem, 3.4vw, 2.5rem); +} + +h2 { + font-size: 1.3rem; +} + +h3 { + color: var(--brand-strong); + font-size: 1.02rem; + margin-top: 22px; +} + +.lead { + font-size: 1.08rem; +} + +.eyebrow { + color: var(--brand); + font-size: 0.8rem; + font-weight: 800; + letter-spacing: 0.04em; + margin: 0 0 8px; + text-transform: uppercase; +} + +.muted { + color: var(--muted); + margin-top: 0; +} + +/* ---------- Home hero steps ---------- */ +.steps { + display: grid; + gap: 10px; + list-style: none; + margin: 0; + padding: 0; +} + +.steps li { + align-items: center; + background: var(--surface-soft); + border: 1px solid #bfe0da; + border-radius: 10px; + color: var(--brand-strong); + display: flex; + font-weight: 700; + gap: 12px; + padding: 10px 14px; +} + +.steps li span { + background: var(--brand); + border-radius: 50%; + color: #fff; + display: inline-grid; + flex: none; + font-size: 0.85rem; + height: 26px; + place-items: center; + width: 26px; +} + +/* ---------- Forms ---------- */ +label { + color: var(--muted); + display: grid; + font-weight: 700; + gap: 8px; +} + +input, +textarea { + background: #fbfdfe; + border: 1px solid var(--line); + border-radius: 9px; + color: var(--text); + font: inherit; + padding: 11px 12px; + width: 100%; +} + +input:focus, +textarea:focus { + border-color: var(--brand); +} + +a:focus-visible, +button:focus-visible, +input:focus-visible, +textarea:focus-visible, +summary:focus-visible, +.choice:focus-within { + outline: 2px solid var(--accent); + outline-offset: 2px; +} + +button { + border-radius: 9px; + cursor: pointer; + font: inherit; + font-weight: 700; + padding: 11px 18px; +} + +button.primary-big, +button[type="submit"]:not(.secondary):not(.ghost) { + background: var(--brand); + border: 1px solid var(--brand); + color: #fff; + font-size: 1.05rem; + padding: 13px 24px; +} + +button.primary-big:hover { + background: var(--brand-strong); +} + +button.secondary { + background: var(--surface); + border: 1px solid var(--line); + color: var(--text); +} + +button.secondary:hover { + background: var(--surface-soft); +} + +button.ghost { + background: transparent; + border: 1px solid transparent; + color: var(--muted); +} + +button.ghost:hover { + color: var(--text); + text-decoration: underline; +} + +button:disabled { + cursor: progress; + opacity: 0.7; +} + +.actions { + display: flex; + flex-wrap: wrap; + gap: 12px; + margin-top: 6px; +} + +.step-number { + background: var(--brand); + border-radius: 50%; + color: #fff; + display: inline-grid; + font-size: 0.85rem; + height: 28px; + margin-right: 8px; + place-items: center; + vertical-align: middle; + width: 28px; +} + +.builder-step h2, +.run-panel h2 { + align-items: center; + display: flex; +} + +.budget-field { + max-width: 240px; +} + +.budget-field input { + font-size: 1.2rem; + font-weight: 700; +} + +/* ---------- Projects rows ---------- */ +.row-head { + color: var(--muted); + font-size: 0.78rem; + font-weight: 700; + letter-spacing: 0.03em; + text-transform: uppercase; +} + +.projects-head { + display: grid; + gap: 12px; + grid-template-columns: 34px 1fr 140px 40px; + margin-bottom: 8px; + padding: 0 2px; +} + +.project-row { + align-items: center; + display: grid; + gap: 12px; + grid-template-columns: 34px 1fr 140px 40px; + margin-bottom: 10px; +} + +.row-index { + color: var(--muted); + font-weight: 700; + text-align: center; +} + +.icon-button { + background: #fbeeee; + border: 1px solid #f0d2d2; + border-radius: 8px; + color: #a23b3b; + font-size: 0.9rem; + line-height: 1; + padding: 9px 0; + width: 100%; +} + +.icon-button:hover { + background: #f6dede; +} + +.add-button { + margin-top: 6px; +} + +.empty-note { + margin: 6px 0; +} + +/* ---------- Voters ---------- */ +.voter-row { + border: 1px solid var(--line); + border-radius: 10px; + margin-bottom: 12px; + padding: 12px 14px; +} + +.voter-head { + align-items: center; + display: flex; + justify-content: space-between; + margin-bottom: 10px; +} + +.voter-head .icon-button { + width: 36px; +} + +.choices { + display: flex; + flex-wrap: wrap; + gap: 8px 10px; +} + +.choice { + align-items: center; + background: #f7f9fb; + border: 1px solid var(--line); + border-radius: 999px; + color: var(--text); + cursor: pointer; + display: inline-flex; + font-weight: 600; + gap: 8px; + padding: 7px 14px 7px 10px; + user-select: none; +} + +.choice:hover { + border-color: var(--brand); +} + +.choice.is-on { + background: var(--surface-soft); + border-color: var(--brand); + color: var(--brand-strong); +} + +.choice input { + accent-color: var(--brand); + height: 16px; + margin: 0; + width: 16px; +} + +.run-panel { + border-color: #bfe0da; +} + +/* ---------- Alerts ---------- */ +.alert { + background: var(--warn-soft); + border: 1px solid #e7b87f; + border-radius: 10px; + color: var(--warn); + margin-bottom: 20px; + padding: 14px 16px; +} + +.field-error { + background: #fdecec; + border: 1px solid #efbcbc; + border-radius: 9px; + color: #9c2c2c; + font-weight: 600; + margin: 0 0 12px; + padding: 10px 14px; +} + +/* ---------- Result hero ---------- */ +.result-hero { + grid-template-columns: minmax(0, 1.3fr) minmax(240px, 1fr); +} + +.hero-side { + display: grid; + gap: 12px; +} + +.budget-meter { + background: #e6edf2; + border-radius: 999px; + height: 16px; + overflow: hidden; +} + +.budget-fill { + background: linear-gradient(90deg, var(--brand), #34a596); + height: 100%; +} + +.meter-legend { + color: var(--muted); + display: flex; + flex-wrap: wrap; + gap: 4px 16px; + font-size: 0.92rem; + justify-content: space-between; +} + +.meter-legend strong { + color: var(--text); +} + +/* ---------- Funded list ---------- */ +.funded-list { + display: grid; + gap: 10px; + list-style: none; + margin: 0; + padding: 0; +} + +.funded-list li { + align-items: center; + background: var(--good-soft); + border: 1px solid #bfe3cd; + border-radius: 10px; + display: flex; + gap: 12px; + padding: 12px 16px; +} + +.funded-list .check { + background: var(--good); + border-radius: 50%; + color: #fff; + display: inline-grid; + flex: none; + font-size: 0.85rem; + height: 24px; + place-items: center; + width: 24px; +} + +.funded-list .f-name { + font-weight: 700; +} + +.funded-list .f-cost { + color: var(--muted); + margin-left: auto; +} + +.explain p { + margin: 0 0 10px; +} + +.note { + border-radius: 9px; + font-weight: 600; + margin: 10px 0 0; + padding: 10px 14px; +} + +.note.good { + background: var(--good-soft); + border: 1px solid #bfe3cd; + color: var(--good); +} + +/* ---------- Tables ---------- */ +.table-wrap { + overflow-x: auto; + margin: 12px 0; +} + +table { + border-collapse: collapse; + min-width: 520px; + width: 100%; +} + +th, +td { + border-bottom: 1px solid var(--line); + padding: 10px 12px; + text-align: left; + vertical-align: top; +} + +th { + background: #eef2f5; + color: #36454f; + font-size: 0.9rem; +} + +tr.is-final td { + background: var(--good-soft); +} + +.pill { + background: #eef2f5; + border: 1px solid var(--line); + border-radius: 999px; + display: inline-block; + font-size: 0.85rem; + margin: 2px 3px 2px 0; + padding: 3px 10px; +} + +.tag { + border-radius: 999px; + display: inline-block; + font-size: 0.82rem; + font-weight: 700; + padding: 3px 11px; + white-space: nowrap; +} + +.tag.yes { + background: var(--good-soft); + border: 1px solid #bfe3cd; + color: var(--good); +} + +.tag.no { + background: #f3f5f6; + border: 1px solid #e2e8eb; + color: #8c99a2; +} + +.tag.muted-tag { + background: #eef2f5; + border: 1px solid var(--line); + color: var(--muted); +} + +/* ---------- Step-by-step ---------- */ +.steps-intro { + border-left: 4px solid var(--brand); +} + +.step-block { + position: relative; +} + +.step-head { + align-items: center; + display: flex; + gap: 12px; + margin-bottom: 8px; +} + +.step-head h2 { + margin: 0; +} + +.step-badge { + background: var(--brand); + border-radius: 50%; + color: #fff; + display: inline-grid; + flex: none; + font-size: 1rem; + font-weight: 800; + height: 36px; + place-items: center; + width: 36px; +} + +.pick-list { + counter-reset: pick; + display: grid; + gap: 10px; + list-style: none; + margin: 8px 0 14px; + padding: 0; +} + +.pick-list li { + align-items: baseline; + background: #f7f9fb; + border: 1px solid var(--line); + border-radius: 10px; + counter-increment: pick; + display: flex; + flex-wrap: wrap; + gap: 6px 12px; + padding: 12px 14px 12px 48px; + position: relative; +} + +.pick-list li::before { + background: var(--surface-soft); + border: 1px solid #bfe0da; + border-radius: 50%; + color: var(--brand-strong); + content: counter(pick); + display: grid; + font-size: 0.85rem; + font-weight: 800; + height: 26px; + left: 12px; + place-items: center; + position: absolute; + top: 12px; + width: 26px; +} + +.pick-name { + font-weight: 700; +} + +.pick-cost { + color: var(--muted); +} + +.pick-pay { + color: var(--muted); + flex-basis: 100%; + font-size: 0.92rem; +} + +.log-panel #toggle-logs { + margin-bottom: 6px; +} + +/* ---------- Quick start generator ---------- */ +.source-note { + margin-top: 14px; +} + +.source-note a { + white-space: nowrap; +} + +.quick-start { + background: var(--surface-soft); + border: 1px solid #bfe0da; +} + +.quick-grid { + align-items: end; + display: flex; + flex-wrap: wrap; + gap: 14px; + margin-top: 12px; +} + +.quick-grid label { + display: grid; + font-weight: 600; + gap: 6px; +} + +.quick-grid input { + width: 110px; +} + +.quick-grid #generate { + white-space: nowrap; +} + +/* ---------- About us ---------- */ +.team-list { + display: grid; + gap: 10px; + list-style: none; + margin: 8px 0 0; + padding: 0; +} + +.team-list li { + background: #f7f9fb; + border: 1px solid var(--line); + border-radius: 10px; + display: grid; + gap: 2px; + padding: 12px 14px; +} + +.team-name { + font-weight: 700; +} + +.team-role { + color: var(--muted); +} + +.team-links { + font-size: 0.92rem; +} + +/* ---------- Input recap ---------- */ +.recap-grid { + display: grid; + gap: 14px; + grid-template-columns: repeat(3, 1fr); + margin-top: 10px; +} + +.recap-card { + background: #f7f9fb; + border: 1px solid var(--line); + border-radius: 10px; + padding: 12px 14px; +} + +.recap-card h3 { + margin: 0 0 8px; +} + +.recap-budget { + font-size: 1.6rem; + font-weight: 800; + margin: 0; +} + +.recap-list { + display: grid; + gap: 6px; + list-style: none; + margin: 0; + padding: 0; +} + +.recap-list li { + display: flex; + flex-wrap: wrap; + gap: 4px 10px; + justify-content: space-between; +} + +.recap-item { + font-weight: 600; +} + +/* ---------- Advanced + lists ---------- */ +.advanced summary { + cursor: pointer; + font-size: 1.05rem; + font-weight: 700; +} + +.advanced-body { + margin-top: 12px; +} + +.logs-list { + background: #18232b; + border-radius: 9px; + color: #eaf3f1; + font-family: Consolas, "Courier New", monospace; + font-size: 0.88rem; + margin: 8px 0 0; + overflow-x: auto; + padding: 16px 18px 16px 36px; +} + +.explainer-list { + display: grid; + gap: 10px; + margin: 8px 0 14px; + padding-left: 20px; +} + +code { + background: var(--surface-soft); + border-radius: 6px; + font-family: Consolas, "Courier New", monospace; + font-size: 0.92em; + padding: 1px 6px; +} + +section[id] { + scroll-margin-top: 84px; +} + +/* ---------- Calls to action ---------- */ +.button-link { + background: var(--brand); + border-radius: 9px; + color: #fff; + display: inline-block; + font-weight: 700; + padding: 12px 20px; + text-align: center; + text-decoration: none; +} + +.button-link:hover { + background: var(--brand-strong); +} + +.cta { + align-items: center; + display: flex; + flex-wrap: wrap; + gap: 16px; + justify-content: space-between; +} + +.cta h2 { + margin-bottom: 4px; +} + +/* ---------- Footer ---------- */ +.sitefoot { + border-top: 1px solid var(--line); + color: var(--muted); + display: flex; + flex-wrap: wrap; + gap: 10px 18px; + justify-content: space-between; + margin-top: 30px; + padding-top: 18px; +} + +/* ---------- Responsive ---------- */ +@media (max-width: 760px) { + .band, + .result-hero { + grid-template-columns: 1fr; + } + + .projects-head { + display: none; + } + + .project-row { + grid-template-columns: 28px 1fr 40px; + grid-template-areas: + "num name remove" + "num cost remove"; + row-gap: 8px; + } + + .project-row .row-index { + grid-area: num; + } + + .project-row .p-name { + grid-area: name; + } + + .project-row .p-cost { + grid-area: cost; + } + + .project-row .icon-button { + align-self: center; + grid-area: remove; + } + + .recap-grid { + grid-template-columns: 1fr; + } + + .quick-grid { + align-items: stretch; + } + + .quick-grid #generate { + width: 100%; + } + + h1 { + font-size: 1.7rem; + } +} diff --git a/examples/ees_addopt_web/templates/about.html b/examples/ees_addopt_web/templates/about.html new file mode 100644 index 0000000..afcaf3e --- /dev/null +++ b/examples/ees_addopt_web/templates/about.html @@ -0,0 +1,68 @@ +{% extends "base.html" %} + +{% block title %}How it works{% endblock %} + +{% block content %} +
+
+

How it works

+

Sharing a budget so everyone is treated equally

+

+ When a community has money to spend on shared projects, how do you choose which projects win + without letting the majority decide everything? This demo shows one fair answer: + the Method of Equal Shares. +

+
+
+ +
+

The simple idea

+

Think of it as giving everyone an equal wallet:

+
    +
  1. Split the money equally. If there is a budget of 10 and 5 voters, each voter gets 2 to spend.
  2. +
  3. Vote for what you like. Each voter ticks the projects they support.
  4. +
  5. Projects pay for themselves. A project is funded when the people who voted for it can cover its cost from their own wallets, split as evenly as possible.
  6. +
  7. Use the leftover money. If money is left over, the tool adds more projects while staying within the budget.
  8. +
+

+ Because each voter has the same wallet, no group can be ignored: any large enough group of voters + can always fund a project they care about. That is what makes the outcome fair. +

+
+ +
+

What the results page shows

+
    +
  • Funded projects — the final list of projects the budget will pay for.
  • +
  • Why this is fair — a plain explanation of the equal-share idea.
  • +
  • The numbers — exactly what each voter started with, spent, and kept, so you can check the fairness yourself.
  • +
  • Technical details — the raw values and log, hidden away unless you want them.
  • +
+
+ +
+

About us

+

This demo was built by:

+ +

I built this project to make the Method of Equal Shares easy to see and understand.

+
+ +
+

Where this comes from

+

+ The method and the completion step are from the paper + Streamlining Equal Shares + by Sonja Kraiczy, Isaac Robinson, and Edith Elkind. This site is a small, friendly front end built on top of + the pabutools library; it does not change the algorithm in any way. +

+ Build an election +
+{% endblock %} diff --git a/examples/ees_addopt_web/templates/base.html b/examples/ees_addopt_web/templates/base.html new file mode 100644 index 0000000..dd77c6d --- /dev/null +++ b/examples/ees_addopt_web/templates/base.html @@ -0,0 +1,30 @@ + + + + + + {% block title %}Fair Budget Demo{% endblock %} + + + + +
+ + FB + Fair Budget + + +
+
+ {% block content %}{% endblock %} +
+ A friendly demo of the Method of Equal Shares. + How it works +
+
+ + diff --git a/examples/ees_addopt_web/templates/index.html b/examples/ees_addopt_web/templates/index.html new file mode 100644 index 0000000..9140a1e --- /dev/null +++ b/examples/ees_addopt_web/templates/index.html @@ -0,0 +1,99 @@ +{% extends "base.html" %} + +{% block title %}Build an election{% endblock %} + +{% block content %} +
+
+

Share a budget fairly

+

Which projects should the money pay for?

+

+ Imagine a community has some money to spend and a list of possible projects. + People vote for the projects they like. This tool decides which projects to fund + so that everyone's vote counts equally — and it shows you the numbers + that prove it is fair. +

+
+
    +
  1. 1 Set the budget
  2. +
  3. 2 List the projects
  4. +
  5. 3 Add the votes
  6. +
  7. 4 See the fair result
  8. +
+

+ Powered by the Method of Equal Shares from the paper + Streamlining Equal Shares. + Read how it works → +

+
+ +{% if error %} + +{% endif %} + +
+

Quick start

+

+ Don't want to type everything by hand? Choose how many projects and voters you want, and we'll + fill the form below with a ready-to-run example. You can change any value afterwards. +

+
+ + + +
+
+ +
+
+

1 Set the budget

+

How much money is there to share between all the projects?

+ +
+ +
+

2 List the projects

+

Give each project a name and how much it costs.

+
+ #Project nameCost +
+
+ +
+ +
+

3 Add the votes

+

For each voter, tick every project they support. Leave all boxes empty if they support none.

+
+ +
+ + + +
+

4 See the fair result

+

We will fund as many projects as the budget allows, keeping everyone's influence equal.

+ +
+ + + +
+
+
+ + + +{% endblock %} diff --git a/examples/ees_addopt_web/templates/result.html b/examples/ees_addopt_web/templates/result.html new file mode 100644 index 0000000..afea58a --- /dev/null +++ b/examples/ees_addopt_web/templates/result.html @@ -0,0 +1,268 @@ +{% extends "base.html" %} + +{% block title %}The fair result{% endblock %} + +{% block content %} +
+
+

The fair result

+ {% if result.completed.is_empty %} +

No projects could be funded

+

With this budget and these votes, no project could be fully paid for. Try a bigger budget or cheaper projects.

+ {% else %} +

{{ result.completed.count }} project{{ "" if result.completed.count == 1 else "s" }} funded

+

These are the projects the community will pay for. Below you can follow every step the tool took to get here.

+ {% endif %} +
+
+ +
+ {{ result.completed.total_cost }} spent + {{ result.completed_leftover }} left of {{ result.budget }} +
+ Try another election +
+
+ +{% if not result.completed.is_empty %} +
+

Funded projects

+
    + {% for project in result.completed.project_payments %} +
  • + + {{ project.name }} + costs {{ project.cost }} +
  • + {% endfor %} +
+
+{% endif %} + +
+

Your input

+

This is exactly what was entered, so you can check the result against it.

+
+
+

Budget

+

{{ result.budget }}

+
+
+

Projects ({{ result.project_count }})

+
    + {% for project in result.project_rows %} +
  • {{ project.name }}costs {{ project.cost }}
  • + {% endfor %} +
+
+
+

Votes ({{ result.voter_count }} voter{{ "" if result.voter_count == 1 else "s" }})

+
    + {% for voter in result.base.voter_rows %} +
  • Voter {{ voter.number }}{{ voter.approvals }}
  • + {% endfor %} +
+
+
+
+ +
+

How the result was reached, step by step

+

Nothing is hidden. Follow the four steps below, and open the log at the end to see every single decision.

+
+ + +
+
1

Give everyone an equal share

+

+ The budget of {{ result.budget }} is split equally among the + {{ result.voter_count }} voter{{ "" if result.voter_count == 1 else "s" }}. + So each voter gets {{ result.share_per_voter }} to spend on the projects they like. +

+

Because everyone gets the same amount, no group can be ignored — that is what keeps the result fair.

+
+ + +
+
2

Fund projects with the Method of Equal Shares

+

+ Using each voter's {{ result.share_per_voter }}, projects are picked one at a time, always choosing + the project that gives the most people the best value for money. Each chosen project is paid for by the voters who support it. +

+ + {% if result.base.project_payments %} +

Projects picked, in order

+
    + {% for project in result.base.project_payments %} +
  1. + {{ project.name }} + costs {{ project.cost }} + + paid by + {% for payer in project.payers %}Voter {{ payer.voter }} ({{ payer.amount }}){% if not loop.last %}, {% endif %}{% endfor %} + +
  2. + {% endfor %} +
+ {% else %} +

No project could be fully paid for in this first round.

+ {% endif %} + +

What each voter spent and kept

+
+ + + + {% for voter in result.base.voter_rows %} + + + + + + + + {% endfor %} + +
VoterVoted forEqual shareSpentKept
Voter {{ voter.number }}{{ voter.approvals }}{{ result.share_per_voter }}{{ voter.paid_total }}{{ voter.leftover }}
+
+

Everyone started with the same {{ result.share_per_voter }}, and nobody spent more than their share. This first round funded {{ result.base.selected_display }} and left {{ result.base_leftover }} unspent.

+
+ + +
+
3

Use the leftover money

+ {% if result.completion_multistep %} +

+ To make better use of the {{ result.base_leftover }} left over, the tool pretends each voter has a + slightly bigger share and checks what the Method of Equal Shares would fund. It tries larger and larger shares, + and keeps the most expensive result that still fits the real {{ result.budget }} budget. +

+
+ + + + + + {% for round in result.completion_rounds %} + + + + + + + + + {% endfor %} + +
RoundPretend share eachWould fundTotal costFits budget?Outcome
Round {{ round.number }}{{ round.share }}{{ round.selected_display }}{{ round.total_cost }}{{ "Yes" if round.fits else "No" }} + {% if round.is_chosen %} + ✓ Chosen + {% elif not round.fits %} + Too expensive + {% else %} + Tried + {% endif %} +
+
+

Round 1 is the first round from Step 2. The tool stops once a bigger share would only add projects that go over the budget.

+ {% else %} +

The first round already used the budget as well as possible, so no extra projects could be added. The final result is the same as Step 2.

+ {% endif %} +
+ + +
+
4

The final decision

+ {% if result.completed.is_empty %} +

No project could be funded within the budget.

+ {% else %} +

+ The funded projects are {{ result.completed.selected_display }}, costing + {{ result.completed.total_cost }} of the {{ result.budget }} budget, with + {{ result.completed_leftover }} left over. +

+ {% endif %} +
+ + + + {% for project in result.project_rows %} + + + + + + + {% endfor %} + +
ProjectCostVotesFunded
{{ project.name }}{{ project.cost }}{{ project.supporters }} + {% if project.in_completed %} + ✓ Funded + {% else %} + Not funded + {% endif %} +
+
+
+ + +
+

See every step in the log

+

This is the algorithm's own record of what it did, in order ({{ result.logs | length }} message{{ "" if result.logs | length == 1 else "s" }}).

+ + +
+ +
+ Extra technical values (for the curious) +
+

+ Raw values behind the algorithm from the paper + Streamlining Equal Shares. + The smallest share increase that would change the first-round result was {{ result.next_delta }}. +

+
+ + + + {% for row in result.leftover_rows %} + + {% endfor %} + +
VoterLeftover budgetLeximax payment vector
Voter {{ row.voter }}{{ row.leftover }}{{ row.leximax }}
+
+
+
+ +
+
+

Want to experiment?

+

Change the budget, projects, or votes and watch how the steps and the result change.

+
+ Build another election +
+ + +{% endblock %} From 72d1c824956d3728e0af706af700b93256120b34 Mon Sep 17 00:00:00 2001 From: Yonatan Gabay Date: Sun, 7 Jun 2026 14:05:58 +0300 Subject: [PATCH 6/8] add example --- examples/run_ees_addopt.py | 168 +++++++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 examples/run_ees_addopt.py diff --git a/examples/run_ees_addopt.py b/examples/run_ees_addopt.py new file mode 100644 index 0000000..adfced5 --- /dev/null +++ b/examples/run_ees_addopt.py @@ -0,0 +1,168 @@ +""" +Running example for all algorithms in pabutools.rules.ees_addopt. + +Demonstrates: + 1. exact_equal_shares (Algorithm 1 – EES) + 2. get_leftover_budgets (leftover budget helper) + 3. get_leximax_payment (leximax payment helper) + 4. greedy_project_change (Algorithm 2 – GPC) + 5. add_opt (Algorithm 3 – add-opt) + 6. ees_add_opt_completion (EES completion via add-opt) +""" + +import logging + +from pabutools.election import Instance, Project, ApprovalProfile, ApprovalBallot +from pabutools.fractions import frac +from pabutools.rules.budgetallocation import BudgetAllocation +from pabutools.rules.ees_addopt import ( + EESAllocationDetails, + exact_equal_shares, + get_leftover_budgets, + get_leximax_payment, + greedy_project_change, + add_opt, + ees_add_opt_completion, +) + +# Show all log messages from the module. +logging.basicConfig( + level=logging.DEBUG, + format="%(name)s %(levelname)s %(message)s", + stream=__import__("sys").stdout, +) + +SEPARATOR = "\n" + "=" * 70 + "\n" + + +# A small PB instance with 5 voters and 3 projects. +# Projects: p1 (cost 2), p2 (cost 3.2), p3 (cost 6) +# Budget: 10 +# Voter 0 approves {p1} +# Voter 1 approves {p1, p3} +# Voter 2 approves {p2, p3} +# Voter 3 approves {p2, p3} +# Voter 4 approves {p3} + +p1 = Project("p1", 2) +p2 = Project("p2", 3.2) +p3 = Project("p3", 6) +projects = [p1, p2, p3] +budget = 10 + +instance = Instance(projects, budget_limit=budget) +profile = ApprovalProfile( + [ + ApprovalBallot([p1]), + ApprovalBallot([p1, p3]), + ApprovalBallot([p2, p3]), + ApprovalBallot([p2, p3]), + ApprovalBallot([p3]), + ], + instance=instance, +) + +num_voters = len(profile) +print("Instance") +print(f" Budget : {budget}") +print(f" Projects : {[(p.name, p.cost) for p in projects]}") +print(f" Num voters : {num_voters}") +print(f" Approvals :") +for i, ballot in enumerate(profile): + print(f" Voter {i}: {sorted(p.name for p in ballot)}") + + +# 1. exact_equal_shares (Algorithm 1) +print(SEPARATOR) +print("1. exact_equal_shares (Algorithm 1 – EES)") +print("-" * 42) + +ees_result = exact_equal_shares(instance, profile) + +print(f"\n Selected projects : {[p.name for p in ees_result]}") +total_cost = sum(frac(p.cost) for p in ees_result) +print(f" Total cost : {total_cost}") + +payments = ees_result.details.payments +print(" Per-voter payments:") +for voter in range(num_voters): + voter_pay = payments.get(voter, {}) + items = [(p.name, float(v)) for p, v in voter_pay.items()] + print(f" Voter {voter}: {items if items else '(none)'}") + + +# 2. get_leftover_budgets +print(SEPARATOR) +print("2. get_leftover_budgets") +print("-" * 42) + +leftover = get_leftover_budgets(instance, profile, ees_result) + +print(" Leftover budget per voter:") +for voter in range(num_voters): + print(f" Voter {voter}: {float(leftover[voter]):.4f}") + + +# 3. get_leximax_payment +print(SEPARATOR) +print("3. get_leximax_payment") +print("-" * 42) + +leximax = get_leximax_payment(ees_result, num_voters, instance) + +print(" Leximax payment vectors:") +for voter in range(num_voters): + formatted = [(float(amt), name) for amt, name in leximax[voter]] + print(f" Voter {voter}: {formatted}") + + +# 4. greedy_project_change (Algorithm 2 – GPC) +print(SEPARATOR) +print("4. greedy_project_change (Algorithm 2 – GPC)") +print("-" * 42) + +print(" Testing each project as instability certificate:") +for proj in projects: + d = greedy_project_change( + instance, profile, ees_result, proj, leftover, leximax + ) + print(f" Project '{proj.name}' (cost={proj.cost}): d = {d} ({float(d):.4f})") + + +# 5. add_opt (Algorithm 3) +print(SEPARATOR) +print("5. add_opt (Algorithm 3)") +print("-" * 42) + +d_min = add_opt(instance, profile, ees_result) + +print(f"\n Minimum d over all projects: {d_min} ({float(d_min):.4f})") +print(f" Per-voter budget increase : {float(d_min):.4f}") +print(f" Total budget increase (n*d): {float(num_voters * d_min):.4f}") + + +# 6. ees_add_opt_completion (EES completion via add-opt) +print(SEPARATOR) +print("6. ees_add_opt_completion (EES completed via add-opt)") +print("-" * 42) + +completed = ees_add_opt_completion(instance, profile) + +print(f"\n Selected projects : {sorted(p.name for p in completed)}") +completed_cost = sum(frac(p.cost) for p in completed) +print(f" Total cost : {completed_cost} (budget = {budget})") + +if hasattr(completed.details, "payments"): + print(" Per-voter payments:") + for voter in range(num_voters): + voter_pay = completed.details.payments.get(voter, {}) + items = [(p.name, float(v)) for p, v in voter_pay.items()] + print(f" Voter {voter}: {items if items else '(none)'}") + + +# Comparison +print(SEPARATOR) +print("Summary comparison") +print("-" * 42) +print(f" EES alone : {str([p.name for p in ees_result]):30s} cost = {float(total_cost)}") +print(f" EES + add-opt : {str(sorted(p.name for p in completed)):30s} cost = {float(completed_cost)}") From 859e8731db7d242fb195e6e9d2400dcc8988ed4c Mon Sep 17 00:00:00 2001 From: Yonatan Gabay Date: Wed, 10 Jun 2026 12:54:55 +0300 Subject: [PATCH 7/8] remove website --- examples/ees_addopt_web/README.md | 32 - examples/ees_addopt_web/app.py | 448 --------- examples/ees_addopt_web/requirements.txt | 1 - examples/ees_addopt_web/static/builder.js | 360 ------- examples/ees_addopt_web/static/styles.css | 935 ------------------ examples/ees_addopt_web/templates/about.html | 68 -- examples/ees_addopt_web/templates/base.html | 30 - examples/ees_addopt_web/templates/index.html | 99 -- examples/ees_addopt_web/templates/result.html | 268 ----- 9 files changed, 2241 deletions(-) delete mode 100644 examples/ees_addopt_web/README.md delete mode 100644 examples/ees_addopt_web/app.py delete mode 100644 examples/ees_addopt_web/requirements.txt delete mode 100644 examples/ees_addopt_web/static/builder.js delete mode 100644 examples/ees_addopt_web/static/styles.css delete mode 100644 examples/ees_addopt_web/templates/about.html delete mode 100644 examples/ees_addopt_web/templates/base.html delete mode 100644 examples/ees_addopt_web/templates/index.html delete mode 100644 examples/ees_addopt_web/templates/result.html diff --git a/examples/ees_addopt_web/README.md b/examples/ees_addopt_web/README.md deleted file mode 100644 index c8ce53a..0000000 --- a/examples/ees_addopt_web/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# EES add-opt Flask demo - -This small Flask app demonstrates `exact_equal_shares`, `add_opt`, and `ees_add_opt_completion` from `pabutools.rules.ees_addopt`. - -## Run - -From the repository root: - -```powershell -python -m pip install -r examples/ees_addopt_web/requirements.txt -python examples/ees_addopt_web/app.py -``` - -Then open . - -## Input format - -```text -Budget: 10 - -Projects: -p1, 2 -p2, 3.2 -p3, 6 - -Ballots: -p1 -p1, p3 -p2, p3 -``` - -Use `-` for a voter who approves no projects. \ No newline at end of file diff --git a/examples/ees_addopt_web/app.py b/examples/ees_addopt_web/app.py deleted file mode 100644 index d23985a..0000000 --- a/examples/ees_addopt_web/app.py +++ /dev/null @@ -1,448 +0,0 @@ -"""A beginner-friendly web demo for the Method of Equal Shares (with add-opt completion). - -You do not need to know how the algorithm works to use this site. You describe a -simple situation - some money to share, a few projects, and who voted for what - -and the site shows which projects get funded and explains, with real numbers, why -the result is fair. - -The heavy lifting is done by the library function -``pabutools.rules.ees_addopt.ees_add_opt_completion``. This file only wraps it in -a friendly interface; it never changes the algorithm itself. -""" - -from __future__ import annotations - -import io -import json -import logging -import sys -from dataclasses import dataclass -from pathlib import Path -from typing import Any - -from flask import Flask, Response, render_template, request - -ROOT_DIR = Path(__file__).resolve().parents[2] -if str(ROOT_DIR) not in sys.path: - sys.path.insert(0, str(ROOT_DIR)) - -from pabutools.election.ballot import ApprovalBallot -from pabutools.election.instance import Instance, Project -from pabutools.election.profile import ApprovalProfile -from pabutools.fractions import frac, str_as_frac -from pabutools.rules.ees_addopt import ( - add_opt, - exact_equal_shares, - get_leftover_budgets, - get_leximax_payment, -) - -app = Flask(__name__) - -ALGORITHM_LOGGER = logging.getLogger("pabutools.rules.ees_addopt") - -# A ready-made, relatable example used for the "Load example" button and the -# first time the page is opened. Project indices in "voters" are 0-based and -# point into the "projects" list. -EXAMPLE: dict[str, Any] = { - "budget": "10", - "projects": [ - {"name": "New benches", "cost": "2"}, - {"name": "Bike lane", "cost": "3.2"}, - {"name": "Playground", "cost": "6"}, - ], - "voters": [ - [0], - [0, 2], - [1, 2], - [1, 2], - [2], - ], -} - - -@dataclass(frozen=True) -class ParsedElection: - instance: Instance - profile: ApprovalProfile - projects: list[Project] - project_names: list[str] - ballots: list[list[str]] - budget: Any - - -class InputError(ValueError): - """Raised when the submitted election cannot be understood.""" - - -def parse_number(raw_value: Any, field_name: str) -> Any: - """Turn user text into a non-negative number, with a friendly error if it is not one.""" - text = str(raw_value).strip() - if not text: - raise InputError(f"{field_name} is missing a value.") - try: - value = str_as_frac(text) - except Exception as exc: - raise InputError(f'"{text}" is not a valid number for {field_name.lower()}.') from exc - if value < 0: - raise InputError(f"{field_name} cannot be negative.") - return value - - -def parse_election_from_payload(payload: Any) -> ParsedElection: - """Build an election from the structured data sent by the visual builder.""" - if not isinstance(payload, dict): - raise InputError("The form could not be read. Please reload the page and try again.") - - budget = parse_number(payload.get("budget", ""), "The budget") - - raw_projects = payload.get("projects") - if not isinstance(raw_projects, list) or not raw_projects: - raise InputError("Add at least one project.") - - projects: list[Project] = [] - seen_names: set[str] = set() - for position, item in enumerate(raw_projects, start=1): - item = item or {} - name = str(item.get("name", "")).strip() - if not name: - raise InputError(f"Project {position} needs a name.") - if name in seen_names: - raise InputError(f'Two projects are both called "{name}". Please give each project a different name.') - cost = parse_number(item.get("cost", ""), f'The cost of "{name}"') - seen_names.add(name) - projects.append(Project(name, cost)) - - raw_voters = payload.get("voters") - if not isinstance(raw_voters, list) or not raw_voters: - raise InputError("Add at least one voter.") - - ballots: list[ApprovalBallot] = [] - ballot_names: list[list[str]] = [] - for voter_position, approvals in enumerate(raw_voters, start=1): - if approvals is None: - approvals = [] - if not isinstance(approvals, list): - raise InputError(f"Voter {voter_position}'s choices could not be read.") - chosen_indices: list[int] = [] - for raw_index in approvals: - try: - index = int(raw_index) - except (TypeError, ValueError): - raise InputError(f"Voter {voter_position} has an invalid project choice.") - if index < 0 or index >= len(projects): - raise InputError(f"Voter {voter_position} voted for a project that does not exist.") - chosen_indices.append(index) - chosen_indices = sorted(set(chosen_indices)) - ballot_names.append([projects[index].name for index in chosen_indices]) - ballots.append(ApprovalBallot(projects[index] for index in chosen_indices)) - - instance = Instance(projects, budget_limit=budget) - profile = ApprovalProfile(ballots, instance=instance) - return ParsedElection( - instance=instance, - profile=profile, - projects=projects, - project_names=[project.name for project in projects], - ballots=ballot_names, - budget=budget, - ) - - -def format_number(value: Any) -> str: - """Show a number in the friendliest readable form (whole number, decimal, or fraction).""" - if value == float("inf"): - return "infinity" - text = str(value) - if "/" in text: - try: - as_float = float(value) - except (TypeError, ValueError): - return text - if abs(as_float - round(as_float)) < 1e-10: - return str(round(as_float)) - return f"{as_float:.4g}" - return text - - -def total_cost(projects: list[Project]) -> Any: - total = frac(0) - for project in projects: - total += frac(project.cost) - return total - - -def supporters_by_project(parsed: ParsedElection) -> dict[str, int]: - counts = {project.name: 0 for project in parsed.projects} - for ballot in parsed.ballots: - for project_name in ballot: - counts[project_name] += 1 - return counts - - -def summarize_allocation(parsed: ParsedElection, allocation: list[Project]) -> dict[str, Any]: - """Describe one outcome: which projects, who paid, and how much each voter kept.""" - selected_projects = list(allocation) - selected_names = [project.name for project in selected_projects] - details = getattr(allocation, "details", None) - payments = getattr(details, "payments", {}) if details is not None else {} - number_of_voters = len(parsed.profile) - voter_budget = frac(parsed.instance.budget_limit) / number_of_voters if number_of_voters else frac(0) - cost_value = total_cost(selected_projects) - - project_payments = [] - for project in selected_projects: - paid = frac(0) - payers = [] - for voter_index in range(number_of_voters): - amount = payments.get(voter_index, {}).get(project, frac(0)) - if amount: - payers.append({"voter": voter_index + 1, "amount": format_number(amount)}) - paid += amount - project_payments.append( - { - "name": project.name, - "cost": format_number(project.cost), - "paid": format_number(paid), - "is_fully_paid": paid == frac(project.cost), - "payers": payers, - } - ) - - voter_rows = [] - for voter_index in range(number_of_voters): - paid_total = frac(0) - paid_entries = [] - for project in selected_projects: - amount = payments.get(voter_index, {}).get(project, frac(0)) - if amount: - paid_entries.append(f"{project.name}: {format_number(amount)}") - paid_total += amount - voter_rows.append( - { - "number": voter_index + 1, - "approvals": ", ".join(parsed.ballots[voter_index]) or "nothing", - "payments": ", ".join(paid_entries) or "-", - "paid_total": format_number(paid_total), - "leftover": format_number(voter_budget - paid_total), - "within_budget": paid_total <= voter_budget, - } - ) - - return { - "selected_names": selected_names, - "selected_display": ", ".join(selected_names) if selected_names else "no projects", - "count": len(selected_names), - "is_empty": len(selected_names) == 0, - "total_cost": format_number(cost_value), - "total_cost_num": cost_value, - "is_budget_feasible": cost_value <= parsed.instance.budget_limit, - "project_payments": project_payments, - "voter_rows": voter_rows, - } - - -def percent_of_budget(used: Any, budget: Any) -> float: - budget_value = frac(budget) - if budget_value <= 0: - return 0.0 - fraction = float(frac(used) / budget_value) * 100.0 - return max(0.0, min(100.0, round(fraction, 1))) - - -def run_completion_with_steps(parsed: ParsedElection) -> tuple[list[dict[str, Any]], list[Project], int]: - """Reproduce the add-opt completion loop, recording every round as a visible step. - - This mirrors ``ees_add_opt_completion`` exactly - it only calls the same public - functions - so the page can show each round without changing the algorithm. - """ - instance = parsed.instance - profile = parsed.profile - number_of_voters = len(profile) - original_budget = frac(instance.budget_limit) - projects = list(instance) - - rounds: list[dict[str, Any]] = [] - virtual_budget = original_budget - best_index = -1 - best_cost = frac(-1) - - while True: - virtual_instance = Instance(projects, budget_limit=virtual_budget) - allocation = exact_equal_shares(virtual_instance, profile) - cost = total_cost(list(allocation)) - fits = cost <= original_budget - delta = add_opt(virtual_instance, profile, allocation) - rounds.append( - { - "allocation": allocation, - "virtual_budget": virtual_budget, - "share": virtual_budget / number_of_voters if number_of_voters else frac(0), - "selected": [project.name for project in allocation], - "total_cost": cost, - "fits": fits, - "delta": delta, - } - ) - if fits and cost > best_cost: - best_cost = cost - best_index = len(rounds) - 1 - if delta == float("inf") or delta <= 0 or len(rounds) >= 60: - break - virtual_budget = virtual_budget + number_of_voters * frac(delta) - - if best_index < 0: - best_index = 0 - return rounds, rounds[best_index]["allocation"], best_index - - -def analyze(parsed: ParsedElection) -> dict[str, Any]: - """Run the algorithm and assemble everything the results page needs to explain it.""" - log_stream = io.StringIO() - handler = logging.StreamHandler(log_stream) - handler.setFormatter(logging.Formatter("%(levelname)s: %(message)s")) - previous_level = ALGORITHM_LOGGER.level - previous_propagate = ALGORITHM_LOGGER.propagate - ALGORITHM_LOGGER.setLevel(logging.DEBUG) - ALGORITHM_LOGGER.propagate = False - ALGORITHM_LOGGER.addHandler(handler) - try: - rounds, completed_allocation, best_index = run_completion_with_steps(parsed) - base_allocation = rounds[0]["allocation"] - leftover_budgets = get_leftover_budgets(parsed.instance, parsed.profile, base_allocation) - leximax_payments = get_leximax_payment(base_allocation, len(parsed.profile), parsed.instance) - next_delta = rounds[0]["delta"] - finally: - ALGORITHM_LOGGER.removeHandler(handler) - ALGORITHM_LOGGER.setLevel(previous_level) - ALGORITHM_LOGGER.propagate = previous_propagate - - number_of_voters = len(parsed.profile) - budget_value = frac(parsed.budget) - share_value = budget_value / number_of_voters if number_of_voters else frac(0) - - base = summarize_allocation(parsed, base_allocation) - completed = summarize_allocation(parsed, completed_allocation) - - supporter_counts = supporters_by_project(parsed) - base_selected_names = set(base["selected_names"]) - completed_selected_names = set(completed["selected_names"]) - project_rows = [ - { - "name": project.name, - "cost": format_number(project.cost), - "supporters": supporter_counts[project.name], - "in_base": project.name in base_selected_names, - "in_completed": project.name in completed_selected_names, - } - for project in parsed.projects - ] - - leftover_rows = [ - { - "voter": voter_index + 1, - "leftover": format_number(leftover_budgets[voter_index]), - "leximax": ", ".join( - f"{project_name}: {format_number(amount)}" - for amount, project_name in leximax_payments[voter_index] - ), - } - for voter_index in range(number_of_voters) - ] - - completion_rounds = [] - for index, round_data in enumerate(rounds): - delta_value = round_data["delta"] - if delta_value == float("inf") or delta_value <= 0: - delta_display = None - else: - delta_display = format_number(delta_value) - completion_rounds.append( - { - "number": index + 1, - "share": format_number(round_data["share"]), - "selected_display": ", ".join(round_data["selected"]) if round_data["selected"] else "no projects", - "total_cost": format_number(round_data["total_cost"]), - "fits": round_data["fits"], - "delta": delta_display, - "is_chosen": index == best_index, - } - ) - - return { - "budget": format_number(parsed.budget), - "voter_count": number_of_voters, - "share_per_voter": format_number(share_value), - "project_count": len(parsed.projects), - "project_rows": project_rows, - "base": base, - "completed": completed, - "base_leftover": format_number(budget_value - base["total_cost_num"]), - "completed_leftover": format_number(budget_value - completed["total_cost_num"]), - "completed_used_percent": percent_of_budget(completed["total_cost_num"], parsed.budget), - "same_as_base": base_selected_names == completed_selected_names, - "completion_rounds": completion_rounds, - "completion_multistep": len(completion_rounds) > 1, - "chosen_round": best_index + 1, - "next_delta": format_number(next_delta), - "leftover_rows": leftover_rows, - "logs": [line for line in log_stream.getvalue().splitlines() if line.strip()], - } - - -@app.get("/") -def index(): - return render_template("index.html", initial_data=EXAMPLE, example_data=EXAMPLE, error=None) - - -@app.post("/run") -def run_algorithm(): - raw_payload = request.form.get("payload", "") - try: - payload = json.loads(raw_payload) if raw_payload else {} - except json.JSONDecodeError: - payload = {} - - fallback = payload if isinstance(payload, dict) and payload else EXAMPLE - try: - parsed = parse_election_from_payload(payload) - result = analyze(parsed) - except InputError as exc: - return ( - render_template("index.html", initial_data=fallback, example_data=EXAMPLE, error=str(exc)), - 400, - ) - except Exception as exc: # noqa: BLE001 - surface any unexpected failure to the user. - return ( - render_template( - "index.html", - initial_data=fallback, - example_data=EXAMPLE, - error=f"Something went wrong while running the election: {exc}", - ), - 400, - ) - return render_template("result.html", result=result) - - -@app.get("/about") -def about(): - return render_template("about.html") - - -# A tiny inline icon so browsers do not get a 404 when they ask for /favicon.ico. -FAVICON_SVG = ( - "" - "" - "" -) - - -@app.get("/favicon.ico") -def favicon(): - return Response(FAVICON_SVG, mimetype="image/svg+xml") - - -if __name__ == "__main__": - app.run(debug=True) diff --git a/examples/ees_addopt_web/requirements.txt b/examples/ees_addopt_web/requirements.txt deleted file mode 100644 index a9039a4..0000000 --- a/examples/ees_addopt_web/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -Flask>=3.0 \ No newline at end of file diff --git a/examples/ees_addopt_web/static/builder.js b/examples/ees_addopt_web/static/builder.js deleted file mode 100644 index cca78c4..0000000 --- a/examples/ees_addopt_web/static/builder.js +++ /dev/null @@ -1,360 +0,0 @@ -// Powers the visual election builder on the home page. -// No part of the algorithm lives here - this only collects the user's input -// (budget, projects, votes) and sends it to the server as simple JSON. -(function () { - "use strict"; - - const budgetEl = document.getElementById("budget"); - const projectsEl = document.getElementById("projects"); - const votersEl = document.getElementById("voters"); - const payloadEl = document.getElementById("payload"); - const form = document.getElementById("builder"); - const errorEl = document.getElementById("form-error"); - const runButton = document.getElementById("run-button"); - - let nextId = 1; - let projects = []; // [{ id, name, cost }] - let voters = []; // [{ id, approvals: Set }] - - function uid() { - return nextId++; - } - - // Load a data object (from the server) into the on-screen builder. - function loadData(data) { - data = data || {}; - const idByIndex = []; - projects = (data.projects || []).map(function (project, index) { - const id = uid(); - idByIndex[index] = id; - return { id: id, name: (project && project.name) || "", cost: project && project.cost != null ? String(project.cost) : "" }; - }); - voters = (data.voters || []).map(function (approvals) { - const set = new Set(); - (approvals || []).forEach(function (index) { - const id = idByIndex[index]; - if (id !== undefined) { - set.add(id); - } - }); - return { id: uid(), approvals: set }; - }); - budgetEl.value = data.budget != null ? String(data.budget) : ""; - render(); - } - - // Keep a typed size within sensible bounds. - function clampInt(value, min, max, fallback) { - const parsed = Math.floor(Number(value)); - if (Number.isNaN(parsed)) { - return fallback; - } - return Math.max(min, Math.min(max, parsed)); - } - - // Build a complete, ready-to-run example with the requested number of - // projects and voters, so the user can try the algorithm without typing - // every value by hand. - function generateSample(numProjects, numVoters) { - const generatedProjects = []; - let totalCost = 0; - let maxCost = 0; - for (let i = 0; i < numProjects; i++) { - const cost = 1 + Math.floor(Math.random() * 9); // 1..9 - totalCost += cost; - maxCost = Math.max(maxCost, cost); - generatedProjects.push({ name: "Project " + (i + 1), cost: String(cost) }); - } - const generatedVoters = []; - for (let v = 0; v < numVoters; v++) { - const approvals = []; - for (let i = 0; i < numProjects; i++) { - if (Math.random() < 0.5) { - approvals.push(i); - } - } - if (!approvals.length && numProjects > 0) { - approvals.push(Math.floor(Math.random() * numProjects)); // never leave a voter empty - } - generatedVoters.push(approvals); - } - // A budget big enough to fund some, but usually not all, projects. - const budget = Math.max(maxCost, Math.round(totalCost * 0.6)); - return { budget: String(budget), projects: generatedProjects, voters: generatedVoters }; - } - - function addProject() { - projects.push({ id: uid(), name: "", cost: "" }); - render(); - focusLastProjectName(); - } - - function removeProject(id) { - projects = projects.filter(function (project) { - return project.id !== id; - }); - voters.forEach(function (voter) { - voter.approvals.delete(id); - }); - render(); - } - - function addVoter() { - voters.push({ id: uid(), approvals: new Set() }); - render(); - } - - function removeVoter(id) { - voters = voters.filter(function (voter) { - return voter.id !== id; - }); - render(); - } - - function projectLabel(project, index) { - const name = (project.name || "").trim(); - return name || "Project " + (index + 1); - } - - function renderProjects() { - projectsEl.innerHTML = ""; - if (!projects.length) { - const empty = document.createElement("p"); - empty.className = "muted empty-note"; - empty.textContent = "No projects yet. Click \u201c+ Add project\u201d to begin."; - projectsEl.appendChild(empty); - return; - } - projects.forEach(function (project, index) { - const row = document.createElement("div"); - row.className = "project-row"; - - const number = document.createElement("span"); - number.className = "row-index"; - number.textContent = String(index + 1); - - const nameInput = document.createElement("input"); - nameInput.type = "text"; - nameInput.className = "p-name"; - nameInput.placeholder = "e.g. New playground"; - nameInput.value = project.name; - nameInput.addEventListener("input", function () { - project.name = nameInput.value; - renderVoters(); - }); - - const costInput = document.createElement("input"); - costInput.type = "number"; - costInput.className = "p-cost"; - costInput.min = "0"; - costInput.step = "any"; - costInput.inputMode = "decimal"; - costInput.placeholder = "Cost"; - costInput.value = project.cost; - costInput.addEventListener("input", function () { - project.cost = costInput.value; - }); - - const remove = document.createElement("button"); - remove.type = "button"; - remove.className = "icon-button"; - remove.setAttribute("aria-label", "Remove this project"); - remove.textContent = "\u2715"; - remove.addEventListener("click", function () { - removeProject(project.id); - }); - - row.appendChild(number); - row.appendChild(nameInput); - row.appendChild(costInput); - row.appendChild(remove); - projectsEl.appendChild(row); - }); - } - - function renderVoters() { - votersEl.innerHTML = ""; - if (!voters.length) { - const empty = document.createElement("p"); - empty.className = "muted empty-note"; - empty.textContent = "No voters yet. Click \u201c+ Add voter\u201d to begin."; - votersEl.appendChild(empty); - return; - } - voters.forEach(function (voter, voterIndex) { - const card = document.createElement("div"); - card.className = "voter-row"; - - const head = document.createElement("div"); - head.className = "voter-head"; - - const title = document.createElement("strong"); - title.textContent = "Voter " + (voterIndex + 1); - - const remove = document.createElement("button"); - remove.type = "button"; - remove.className = "icon-button"; - remove.setAttribute("aria-label", "Remove this voter"); - remove.textContent = "\u2715"; - remove.addEventListener("click", function () { - removeVoter(voter.id); - }); - - head.appendChild(title); - head.appendChild(remove); - card.appendChild(head); - - const choices = document.createElement("div"); - choices.className = "choices"; - if (!projects.length) { - const note = document.createElement("span"); - note.className = "muted"; - note.textContent = "Add some projects first."; - choices.appendChild(note); - } else { - projects.forEach(function (project, index) { - const label = document.createElement("label"); - label.className = "choice"; - - const checkbox = document.createElement("input"); - checkbox.type = "checkbox"; - checkbox.checked = voter.approvals.has(project.id); - checkbox.addEventListener("change", function () { - if (checkbox.checked) { - voter.approvals.add(project.id); - } else { - voter.approvals.delete(project.id); - } - label.classList.toggle("is-on", checkbox.checked); - }); - - const text = document.createElement("span"); - text.textContent = projectLabel(project, index); - - label.classList.toggle("is-on", checkbox.checked); - label.appendChild(checkbox); - label.appendChild(text); - choices.appendChild(label); - }); - } - card.appendChild(choices); - votersEl.appendChild(card); - }); - } - - function render() { - renderProjects(); - renderVoters(); - } - - function focusLastProjectName() { - const inputs = projectsEl.querySelectorAll(".p-name"); - if (inputs.length) { - inputs[inputs.length - 1].focus(); - } - } - - function buildPayload() { - return { - budget: budgetEl.value.trim(), - projects: projects.map(function (project) { - return { name: project.name.trim(), cost: project.cost.trim() }; - }), - voters: voters.map(function (voter) { - const indices = []; - projects.forEach(function (project, index) { - if (voter.approvals.has(project.id)) { - indices.push(index); - } - }); - return indices; - }), - }; - } - - function isValidNumber(text) { - if (text === "") { - return false; - } - const value = Number(text); - return !Number.isNaN(value) && value >= 0; - } - - function validate(payload) { - if (!isValidNumber(payload.budget)) { - return "Enter a budget of 0 or more."; - } - if (!payload.projects.length) { - return "Add at least one project."; - } - const seen = new Set(); - for (let i = 0; i < payload.projects.length; i++) { - const project = payload.projects[i]; - if (!project.name) { - return "Project " + (i + 1) + " needs a name."; - } - if (seen.has(project.name)) { - return 'Two projects are called "' + project.name + '". Use different names.'; - } - seen.add(project.name); - if (!isValidNumber(project.cost)) { - return 'Enter a valid cost for "' + project.name + '".'; - } - } - if (!payload.voters.length) { - return "Add at least one voter."; - } - return null; - } - - function showError(message) { - errorEl.textContent = message; - errorEl.hidden = false; - errorEl.scrollIntoView({ behavior: "smooth", block: "center" }); - } - - function hideError() { - errorEl.hidden = true; - errorEl.textContent = ""; - } - - form.addEventListener("submit", function (event) { - const payload = buildPayload(); - const message = validate(payload); - if (message) { - event.preventDefault(); - showError(message); - return; - } - hideError(); - payloadEl.value = JSON.stringify(payload); - runButton.disabled = true; - runButton.textContent = "Working\u2026"; - }); - - document.getElementById("generate").addEventListener("click", function () { - hideError(); - const projectsInput = document.getElementById("gen-projects"); - const votersInput = document.getElementById("gen-voters"); - const numProjects = clampInt(projectsInput.value, 1, 20, 4); - const numVoters = clampInt(votersInput.value, 1, 50, 6); - projectsInput.value = String(numProjects); - votersInput.value = String(numVoters); - loadData(generateSample(numProjects, numVoters)); - }); - document.getElementById("add-project").addEventListener("click", addProject); - document.getElementById("add-voter").addEventListener("click", addVoter); - document.getElementById("load-example").addEventListener("click", function () { - hideError(); - loadData(window.EXAMPLE_DATA); - }); - document.getElementById("clear-all").addEventListener("click", function () { - hideError(); - loadData({ budget: "", projects: [{ name: "", cost: "" }], voters: [[]] }); - }); - - const start = window.INITIAL_DATA && window.INITIAL_DATA.projects && window.INITIAL_DATA.projects.length - ? window.INITIAL_DATA - : window.EXAMPLE_DATA; - loadData(start); -})(); diff --git a/examples/ees_addopt_web/static/styles.css b/examples/ees_addopt_web/static/styles.css deleted file mode 100644 index 8e63e76..0000000 --- a/examples/ees_addopt_web/static/styles.css +++ /dev/null @@ -1,935 +0,0 @@ -:root { - color-scheme: light; - --bg: #f4f7fb; - --surface: #ffffff; - --surface-soft: #eef5f3; - --text: #1f2a33; - --muted: #5d6b77; - --line: #d8e1e8; - --brand: #1f7a70; - --brand-strong: #155d55; - --accent: #2f6df0; - --good: #1f7a45; - --good-soft: #e9f6ee; - --warn: #8a5a18; - --warn-soft: #fdf3e6; - --shadow: 0 10px 28px rgba(24, 45, 58, 0.08); - --radius: 12px; -} - -* { - box-sizing: border-box; -} - -html { - scroll-behavior: smooth; -} - -body { - margin: 0; - background: var(--bg); - color: var(--text); - font-family: "Segoe UI", Arial, sans-serif; - line-height: 1.55; -} - -a { - color: var(--brand-strong); -} - -/* ---------- Top bar ---------- */ -.topbar { - align-items: center; - background: var(--surface); - border-bottom: 1px solid var(--line); - display: flex; - gap: 20px; - justify-content: space-between; - padding: 14px clamp(16px, 4vw, 56px); - position: sticky; - top: 0; - z-index: 10; -} - -.brand { - align-items: center; - color: var(--brand); - display: flex; - font-size: 1.1rem; - font-weight: 800; - gap: 10px; - text-decoration: none; -} - -.brand-mark { - background: var(--brand); - border-radius: 8px; - color: #fff; - display: inline-grid; - font-size: 0.85rem; - height: 30px; - place-items: center; - width: 30px; -} - -.topbar nav { - display: flex; - flex-wrap: wrap; - gap: 8px 18px; -} - -.topbar nav a { - border-radius: 8px; - color: var(--text); - padding: 6px 10px; - text-decoration: none; -} - -.topbar nav a:hover { - background: var(--surface-soft); -} - -/* ---------- Layout ---------- */ -.page { - margin: 0 auto; - max-width: 1000px; - padding: 24px clamp(16px, 4vw, 40px) 56px; -} - -.band, -.panel { - background: var(--surface); - border: 1px solid var(--line); - border-radius: var(--radius); - box-shadow: var(--shadow); -} - -.band { - align-items: center; - display: grid; - gap: 28px; - grid-template-columns: minmax(0, 1.4fr) minmax(220px, 0.9fr); - margin-bottom: 22px; - padding: clamp(22px, 4vw, 38px); -} - -.panel { - margin-bottom: 18px; - padding: clamp(18px, 3vw, 26px); -} - -h1, -h2, -h3 { - line-height: 1.2; - margin: 0 0 12px; -} - -h1 { - color: var(--text); - font-size: clamp(1.8rem, 3.4vw, 2.5rem); -} - -h2 { - font-size: 1.3rem; -} - -h3 { - color: var(--brand-strong); - font-size: 1.02rem; - margin-top: 22px; -} - -.lead { - font-size: 1.08rem; -} - -.eyebrow { - color: var(--brand); - font-size: 0.8rem; - font-weight: 800; - letter-spacing: 0.04em; - margin: 0 0 8px; - text-transform: uppercase; -} - -.muted { - color: var(--muted); - margin-top: 0; -} - -/* ---------- Home hero steps ---------- */ -.steps { - display: grid; - gap: 10px; - list-style: none; - margin: 0; - padding: 0; -} - -.steps li { - align-items: center; - background: var(--surface-soft); - border: 1px solid #bfe0da; - border-radius: 10px; - color: var(--brand-strong); - display: flex; - font-weight: 700; - gap: 12px; - padding: 10px 14px; -} - -.steps li span { - background: var(--brand); - border-radius: 50%; - color: #fff; - display: inline-grid; - flex: none; - font-size: 0.85rem; - height: 26px; - place-items: center; - width: 26px; -} - -/* ---------- Forms ---------- */ -label { - color: var(--muted); - display: grid; - font-weight: 700; - gap: 8px; -} - -input, -textarea { - background: #fbfdfe; - border: 1px solid var(--line); - border-radius: 9px; - color: var(--text); - font: inherit; - padding: 11px 12px; - width: 100%; -} - -input:focus, -textarea:focus { - border-color: var(--brand); -} - -a:focus-visible, -button:focus-visible, -input:focus-visible, -textarea:focus-visible, -summary:focus-visible, -.choice:focus-within { - outline: 2px solid var(--accent); - outline-offset: 2px; -} - -button { - border-radius: 9px; - cursor: pointer; - font: inherit; - font-weight: 700; - padding: 11px 18px; -} - -button.primary-big, -button[type="submit"]:not(.secondary):not(.ghost) { - background: var(--brand); - border: 1px solid var(--brand); - color: #fff; - font-size: 1.05rem; - padding: 13px 24px; -} - -button.primary-big:hover { - background: var(--brand-strong); -} - -button.secondary { - background: var(--surface); - border: 1px solid var(--line); - color: var(--text); -} - -button.secondary:hover { - background: var(--surface-soft); -} - -button.ghost { - background: transparent; - border: 1px solid transparent; - color: var(--muted); -} - -button.ghost:hover { - color: var(--text); - text-decoration: underline; -} - -button:disabled { - cursor: progress; - opacity: 0.7; -} - -.actions { - display: flex; - flex-wrap: wrap; - gap: 12px; - margin-top: 6px; -} - -.step-number { - background: var(--brand); - border-radius: 50%; - color: #fff; - display: inline-grid; - font-size: 0.85rem; - height: 28px; - margin-right: 8px; - place-items: center; - vertical-align: middle; - width: 28px; -} - -.builder-step h2, -.run-panel h2 { - align-items: center; - display: flex; -} - -.budget-field { - max-width: 240px; -} - -.budget-field input { - font-size: 1.2rem; - font-weight: 700; -} - -/* ---------- Projects rows ---------- */ -.row-head { - color: var(--muted); - font-size: 0.78rem; - font-weight: 700; - letter-spacing: 0.03em; - text-transform: uppercase; -} - -.projects-head { - display: grid; - gap: 12px; - grid-template-columns: 34px 1fr 140px 40px; - margin-bottom: 8px; - padding: 0 2px; -} - -.project-row { - align-items: center; - display: grid; - gap: 12px; - grid-template-columns: 34px 1fr 140px 40px; - margin-bottom: 10px; -} - -.row-index { - color: var(--muted); - font-weight: 700; - text-align: center; -} - -.icon-button { - background: #fbeeee; - border: 1px solid #f0d2d2; - border-radius: 8px; - color: #a23b3b; - font-size: 0.9rem; - line-height: 1; - padding: 9px 0; - width: 100%; -} - -.icon-button:hover { - background: #f6dede; -} - -.add-button { - margin-top: 6px; -} - -.empty-note { - margin: 6px 0; -} - -/* ---------- Voters ---------- */ -.voter-row { - border: 1px solid var(--line); - border-radius: 10px; - margin-bottom: 12px; - padding: 12px 14px; -} - -.voter-head { - align-items: center; - display: flex; - justify-content: space-between; - margin-bottom: 10px; -} - -.voter-head .icon-button { - width: 36px; -} - -.choices { - display: flex; - flex-wrap: wrap; - gap: 8px 10px; -} - -.choice { - align-items: center; - background: #f7f9fb; - border: 1px solid var(--line); - border-radius: 999px; - color: var(--text); - cursor: pointer; - display: inline-flex; - font-weight: 600; - gap: 8px; - padding: 7px 14px 7px 10px; - user-select: none; -} - -.choice:hover { - border-color: var(--brand); -} - -.choice.is-on { - background: var(--surface-soft); - border-color: var(--brand); - color: var(--brand-strong); -} - -.choice input { - accent-color: var(--brand); - height: 16px; - margin: 0; - width: 16px; -} - -.run-panel { - border-color: #bfe0da; -} - -/* ---------- Alerts ---------- */ -.alert { - background: var(--warn-soft); - border: 1px solid #e7b87f; - border-radius: 10px; - color: var(--warn); - margin-bottom: 20px; - padding: 14px 16px; -} - -.field-error { - background: #fdecec; - border: 1px solid #efbcbc; - border-radius: 9px; - color: #9c2c2c; - font-weight: 600; - margin: 0 0 12px; - padding: 10px 14px; -} - -/* ---------- Result hero ---------- */ -.result-hero { - grid-template-columns: minmax(0, 1.3fr) minmax(240px, 1fr); -} - -.hero-side { - display: grid; - gap: 12px; -} - -.budget-meter { - background: #e6edf2; - border-radius: 999px; - height: 16px; - overflow: hidden; -} - -.budget-fill { - background: linear-gradient(90deg, var(--brand), #34a596); - height: 100%; -} - -.meter-legend { - color: var(--muted); - display: flex; - flex-wrap: wrap; - gap: 4px 16px; - font-size: 0.92rem; - justify-content: space-between; -} - -.meter-legend strong { - color: var(--text); -} - -/* ---------- Funded list ---------- */ -.funded-list { - display: grid; - gap: 10px; - list-style: none; - margin: 0; - padding: 0; -} - -.funded-list li { - align-items: center; - background: var(--good-soft); - border: 1px solid #bfe3cd; - border-radius: 10px; - display: flex; - gap: 12px; - padding: 12px 16px; -} - -.funded-list .check { - background: var(--good); - border-radius: 50%; - color: #fff; - display: inline-grid; - flex: none; - font-size: 0.85rem; - height: 24px; - place-items: center; - width: 24px; -} - -.funded-list .f-name { - font-weight: 700; -} - -.funded-list .f-cost { - color: var(--muted); - margin-left: auto; -} - -.explain p { - margin: 0 0 10px; -} - -.note { - border-radius: 9px; - font-weight: 600; - margin: 10px 0 0; - padding: 10px 14px; -} - -.note.good { - background: var(--good-soft); - border: 1px solid #bfe3cd; - color: var(--good); -} - -/* ---------- Tables ---------- */ -.table-wrap { - overflow-x: auto; - margin: 12px 0; -} - -table { - border-collapse: collapse; - min-width: 520px; - width: 100%; -} - -th, -td { - border-bottom: 1px solid var(--line); - padding: 10px 12px; - text-align: left; - vertical-align: top; -} - -th { - background: #eef2f5; - color: #36454f; - font-size: 0.9rem; -} - -tr.is-final td { - background: var(--good-soft); -} - -.pill { - background: #eef2f5; - border: 1px solid var(--line); - border-radius: 999px; - display: inline-block; - font-size: 0.85rem; - margin: 2px 3px 2px 0; - padding: 3px 10px; -} - -.tag { - border-radius: 999px; - display: inline-block; - font-size: 0.82rem; - font-weight: 700; - padding: 3px 11px; - white-space: nowrap; -} - -.tag.yes { - background: var(--good-soft); - border: 1px solid #bfe3cd; - color: var(--good); -} - -.tag.no { - background: #f3f5f6; - border: 1px solid #e2e8eb; - color: #8c99a2; -} - -.tag.muted-tag { - background: #eef2f5; - border: 1px solid var(--line); - color: var(--muted); -} - -/* ---------- Step-by-step ---------- */ -.steps-intro { - border-left: 4px solid var(--brand); -} - -.step-block { - position: relative; -} - -.step-head { - align-items: center; - display: flex; - gap: 12px; - margin-bottom: 8px; -} - -.step-head h2 { - margin: 0; -} - -.step-badge { - background: var(--brand); - border-radius: 50%; - color: #fff; - display: inline-grid; - flex: none; - font-size: 1rem; - font-weight: 800; - height: 36px; - place-items: center; - width: 36px; -} - -.pick-list { - counter-reset: pick; - display: grid; - gap: 10px; - list-style: none; - margin: 8px 0 14px; - padding: 0; -} - -.pick-list li { - align-items: baseline; - background: #f7f9fb; - border: 1px solid var(--line); - border-radius: 10px; - counter-increment: pick; - display: flex; - flex-wrap: wrap; - gap: 6px 12px; - padding: 12px 14px 12px 48px; - position: relative; -} - -.pick-list li::before { - background: var(--surface-soft); - border: 1px solid #bfe0da; - border-radius: 50%; - color: var(--brand-strong); - content: counter(pick); - display: grid; - font-size: 0.85rem; - font-weight: 800; - height: 26px; - left: 12px; - place-items: center; - position: absolute; - top: 12px; - width: 26px; -} - -.pick-name { - font-weight: 700; -} - -.pick-cost { - color: var(--muted); -} - -.pick-pay { - color: var(--muted); - flex-basis: 100%; - font-size: 0.92rem; -} - -.log-panel #toggle-logs { - margin-bottom: 6px; -} - -/* ---------- Quick start generator ---------- */ -.source-note { - margin-top: 14px; -} - -.source-note a { - white-space: nowrap; -} - -.quick-start { - background: var(--surface-soft); - border: 1px solid #bfe0da; -} - -.quick-grid { - align-items: end; - display: flex; - flex-wrap: wrap; - gap: 14px; - margin-top: 12px; -} - -.quick-grid label { - display: grid; - font-weight: 600; - gap: 6px; -} - -.quick-grid input { - width: 110px; -} - -.quick-grid #generate { - white-space: nowrap; -} - -/* ---------- About us ---------- */ -.team-list { - display: grid; - gap: 10px; - list-style: none; - margin: 8px 0 0; - padding: 0; -} - -.team-list li { - background: #f7f9fb; - border: 1px solid var(--line); - border-radius: 10px; - display: grid; - gap: 2px; - padding: 12px 14px; -} - -.team-name { - font-weight: 700; -} - -.team-role { - color: var(--muted); -} - -.team-links { - font-size: 0.92rem; -} - -/* ---------- Input recap ---------- */ -.recap-grid { - display: grid; - gap: 14px; - grid-template-columns: repeat(3, 1fr); - margin-top: 10px; -} - -.recap-card { - background: #f7f9fb; - border: 1px solid var(--line); - border-radius: 10px; - padding: 12px 14px; -} - -.recap-card h3 { - margin: 0 0 8px; -} - -.recap-budget { - font-size: 1.6rem; - font-weight: 800; - margin: 0; -} - -.recap-list { - display: grid; - gap: 6px; - list-style: none; - margin: 0; - padding: 0; -} - -.recap-list li { - display: flex; - flex-wrap: wrap; - gap: 4px 10px; - justify-content: space-between; -} - -.recap-item { - font-weight: 600; -} - -/* ---------- Advanced + lists ---------- */ -.advanced summary { - cursor: pointer; - font-size: 1.05rem; - font-weight: 700; -} - -.advanced-body { - margin-top: 12px; -} - -.logs-list { - background: #18232b; - border-radius: 9px; - color: #eaf3f1; - font-family: Consolas, "Courier New", monospace; - font-size: 0.88rem; - margin: 8px 0 0; - overflow-x: auto; - padding: 16px 18px 16px 36px; -} - -.explainer-list { - display: grid; - gap: 10px; - margin: 8px 0 14px; - padding-left: 20px; -} - -code { - background: var(--surface-soft); - border-radius: 6px; - font-family: Consolas, "Courier New", monospace; - font-size: 0.92em; - padding: 1px 6px; -} - -section[id] { - scroll-margin-top: 84px; -} - -/* ---------- Calls to action ---------- */ -.button-link { - background: var(--brand); - border-radius: 9px; - color: #fff; - display: inline-block; - font-weight: 700; - padding: 12px 20px; - text-align: center; - text-decoration: none; -} - -.button-link:hover { - background: var(--brand-strong); -} - -.cta { - align-items: center; - display: flex; - flex-wrap: wrap; - gap: 16px; - justify-content: space-between; -} - -.cta h2 { - margin-bottom: 4px; -} - -/* ---------- Footer ---------- */ -.sitefoot { - border-top: 1px solid var(--line); - color: var(--muted); - display: flex; - flex-wrap: wrap; - gap: 10px 18px; - justify-content: space-between; - margin-top: 30px; - padding-top: 18px; -} - -/* ---------- Responsive ---------- */ -@media (max-width: 760px) { - .band, - .result-hero { - grid-template-columns: 1fr; - } - - .projects-head { - display: none; - } - - .project-row { - grid-template-columns: 28px 1fr 40px; - grid-template-areas: - "num name remove" - "num cost remove"; - row-gap: 8px; - } - - .project-row .row-index { - grid-area: num; - } - - .project-row .p-name { - grid-area: name; - } - - .project-row .p-cost { - grid-area: cost; - } - - .project-row .icon-button { - align-self: center; - grid-area: remove; - } - - .recap-grid { - grid-template-columns: 1fr; - } - - .quick-grid { - align-items: stretch; - } - - .quick-grid #generate { - width: 100%; - } - - h1 { - font-size: 1.7rem; - } -} diff --git a/examples/ees_addopt_web/templates/about.html b/examples/ees_addopt_web/templates/about.html deleted file mode 100644 index afcaf3e..0000000 --- a/examples/ees_addopt_web/templates/about.html +++ /dev/null @@ -1,68 +0,0 @@ -{% extends "base.html" %} - -{% block title %}How it works{% endblock %} - -{% block content %} -
-
-

How it works

-

Sharing a budget so everyone is treated equally

-

- When a community has money to spend on shared projects, how do you choose which projects win - without letting the majority decide everything? This demo shows one fair answer: - the Method of Equal Shares. -

-
-
- -
-

The simple idea

-

Think of it as giving everyone an equal wallet:

-
    -
  1. Split the money equally. If there is a budget of 10 and 5 voters, each voter gets 2 to spend.
  2. -
  3. Vote for what you like. Each voter ticks the projects they support.
  4. -
  5. Projects pay for themselves. A project is funded when the people who voted for it can cover its cost from their own wallets, split as evenly as possible.
  6. -
  7. Use the leftover money. If money is left over, the tool adds more projects while staying within the budget.
  8. -
-

- Because each voter has the same wallet, no group can be ignored: any large enough group of voters - can always fund a project they care about. That is what makes the outcome fair. -

-
- -
-

What the results page shows

-
    -
  • Funded projects — the final list of projects the budget will pay for.
  • -
  • Why this is fair — a plain explanation of the equal-share idea.
  • -
  • The numbers — exactly what each voter started with, spent, and kept, so you can check the fairness yourself.
  • -
  • Technical details — the raw values and log, hidden away unless you want them.
  • -
-
- -
-

About us

-

This demo was built by:

- -

I built this project to make the Method of Equal Shares easy to see and understand.

-
- -
-

Where this comes from

-

- The method and the completion step are from the paper - Streamlining Equal Shares - by Sonja Kraiczy, Isaac Robinson, and Edith Elkind. This site is a small, friendly front end built on top of - the pabutools library; it does not change the algorithm in any way. -

- Build an election -
-{% endblock %} diff --git a/examples/ees_addopt_web/templates/base.html b/examples/ees_addopt_web/templates/base.html deleted file mode 100644 index dd77c6d..0000000 --- a/examples/ees_addopt_web/templates/base.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - {% block title %}Fair Budget Demo{% endblock %} - - - - -
- - FB - Fair Budget - - -
-
- {% block content %}{% endblock %} -
- A friendly demo of the Method of Equal Shares. - How it works -
-
- - diff --git a/examples/ees_addopt_web/templates/index.html b/examples/ees_addopt_web/templates/index.html deleted file mode 100644 index 9140a1e..0000000 --- a/examples/ees_addopt_web/templates/index.html +++ /dev/null @@ -1,99 +0,0 @@ -{% extends "base.html" %} - -{% block title %}Build an election{% endblock %} - -{% block content %} -
-
-

Share a budget fairly

-

Which projects should the money pay for?

-

- Imagine a community has some money to spend and a list of possible projects. - People vote for the projects they like. This tool decides which projects to fund - so that everyone's vote counts equally — and it shows you the numbers - that prove it is fair. -

-
-
    -
  1. 1 Set the budget
  2. -
  3. 2 List the projects
  4. -
  5. 3 Add the votes
  6. -
  7. 4 See the fair result
  8. -
-

- Powered by the Method of Equal Shares from the paper - Streamlining Equal Shares. - Read how it works → -

-
- -{% if error %} - -{% endif %} - -
-

Quick start

-

- Don't want to type everything by hand? Choose how many projects and voters you want, and we'll - fill the form below with a ready-to-run example. You can change any value afterwards. -

-
- - - -
-
- -
-
-

1 Set the budget

-

How much money is there to share between all the projects?

- -
- -
-

2 List the projects

-

Give each project a name and how much it costs.

-
- #Project nameCost -
-
- -
- -
-

3 Add the votes

-

For each voter, tick every project they support. Leave all boxes empty if they support none.

-
- -
- - - -
-

4 See the fair result

-

We will fund as many projects as the budget allows, keeping everyone's influence equal.

- -
- - - -
-
-
- - - -{% endblock %} diff --git a/examples/ees_addopt_web/templates/result.html b/examples/ees_addopt_web/templates/result.html deleted file mode 100644 index afea58a..0000000 --- a/examples/ees_addopt_web/templates/result.html +++ /dev/null @@ -1,268 +0,0 @@ -{% extends "base.html" %} - -{% block title %}The fair result{% endblock %} - -{% block content %} -
-
-

The fair result

- {% if result.completed.is_empty %} -

No projects could be funded

-

With this budget and these votes, no project could be fully paid for. Try a bigger budget or cheaper projects.

- {% else %} -

{{ result.completed.count }} project{{ "" if result.completed.count == 1 else "s" }} funded

-

These are the projects the community will pay for. Below you can follow every step the tool took to get here.

- {% endif %} -
-
- -
- {{ result.completed.total_cost }} spent - {{ result.completed_leftover }} left of {{ result.budget }} -
- Try another election -
-
- -{% if not result.completed.is_empty %} -
-

Funded projects

-
    - {% for project in result.completed.project_payments %} -
  • - - {{ project.name }} - costs {{ project.cost }} -
  • - {% endfor %} -
-
-{% endif %} - -
-

Your input

-

This is exactly what was entered, so you can check the result against it.

-
-
-

Budget

-

{{ result.budget }}

-
-
-

Projects ({{ result.project_count }})

-
    - {% for project in result.project_rows %} -
  • {{ project.name }}costs {{ project.cost }}
  • - {% endfor %} -
-
-
-

Votes ({{ result.voter_count }} voter{{ "" if result.voter_count == 1 else "s" }})

-
    - {% for voter in result.base.voter_rows %} -
  • Voter {{ voter.number }}{{ voter.approvals }}
  • - {% endfor %} -
-
-
-
- -
-

How the result was reached, step by step

-

Nothing is hidden. Follow the four steps below, and open the log at the end to see every single decision.

-
- - -
-
1

Give everyone an equal share

-

- The budget of {{ result.budget }} is split equally among the - {{ result.voter_count }} voter{{ "" if result.voter_count == 1 else "s" }}. - So each voter gets {{ result.share_per_voter }} to spend on the projects they like. -

-

Because everyone gets the same amount, no group can be ignored — that is what keeps the result fair.

-
- - -
-
2

Fund projects with the Method of Equal Shares

-

- Using each voter's {{ result.share_per_voter }}, projects are picked one at a time, always choosing - the project that gives the most people the best value for money. Each chosen project is paid for by the voters who support it. -

- - {% if result.base.project_payments %} -

Projects picked, in order

-
    - {% for project in result.base.project_payments %} -
  1. - {{ project.name }} - costs {{ project.cost }} - - paid by - {% for payer in project.payers %}Voter {{ payer.voter }} ({{ payer.amount }}){% if not loop.last %}, {% endif %}{% endfor %} - -
  2. - {% endfor %} -
- {% else %} -

No project could be fully paid for in this first round.

- {% endif %} - -

What each voter spent and kept

-
- - - - {% for voter in result.base.voter_rows %} - - - - - - - - {% endfor %} - -
VoterVoted forEqual shareSpentKept
Voter {{ voter.number }}{{ voter.approvals }}{{ result.share_per_voter }}{{ voter.paid_total }}{{ voter.leftover }}
-
-

Everyone started with the same {{ result.share_per_voter }}, and nobody spent more than their share. This first round funded {{ result.base.selected_display }} and left {{ result.base_leftover }} unspent.

-
- - -
-
3

Use the leftover money

- {% if result.completion_multistep %} -

- To make better use of the {{ result.base_leftover }} left over, the tool pretends each voter has a - slightly bigger share and checks what the Method of Equal Shares would fund. It tries larger and larger shares, - and keeps the most expensive result that still fits the real {{ result.budget }} budget. -

-
- - - - - - {% for round in result.completion_rounds %} - - - - - - - - - {% endfor %} - -
RoundPretend share eachWould fundTotal costFits budget?Outcome
Round {{ round.number }}{{ round.share }}{{ round.selected_display }}{{ round.total_cost }}{{ "Yes" if round.fits else "No" }} - {% if round.is_chosen %} - ✓ Chosen - {% elif not round.fits %} - Too expensive - {% else %} - Tried - {% endif %} -
-
-

Round 1 is the first round from Step 2. The tool stops once a bigger share would only add projects that go over the budget.

- {% else %} -

The first round already used the budget as well as possible, so no extra projects could be added. The final result is the same as Step 2.

- {% endif %} -
- - -
-
4

The final decision

- {% if result.completed.is_empty %} -

No project could be funded within the budget.

- {% else %} -

- The funded projects are {{ result.completed.selected_display }}, costing - {{ result.completed.total_cost }} of the {{ result.budget }} budget, with - {{ result.completed_leftover }} left over. -

- {% endif %} -
- - - - {% for project in result.project_rows %} - - - - - - - {% endfor %} - -
ProjectCostVotesFunded
{{ project.name }}{{ project.cost }}{{ project.supporters }} - {% if project.in_completed %} - ✓ Funded - {% else %} - Not funded - {% endif %} -
-
-
- - -
-

See every step in the log

-

This is the algorithm's own record of what it did, in order ({{ result.logs | length }} message{{ "" if result.logs | length == 1 else "s" }}).

- - -
- -
- Extra technical values (for the curious) -
-

- Raw values behind the algorithm from the paper - Streamlining Equal Shares. - The smallest share increase that would change the first-round result was {{ result.next_delta }}. -

-
- - - - {% for row in result.leftover_rows %} - - {% endfor %} - -
VoterLeftover budgetLeximax payment vector
Voter {{ row.voter }}{{ row.leftover }}{{ row.leximax }}
-
-
-
- -
-
-

Want to experiment?

-

Change the budget, projects, or votes and watch how the steps and the result change.

-
- Build another election -
- - -{% endblock %} From c2d1629edc8511115ef7a788b82748f098e0d77f Mon Sep 17 00:00:00 2001 From: Yonatan Gabay Date: Wed, 10 Jun 2026 14:58:52 +0300 Subject: [PATCH 8/8] Add experiments directory with comparison experiment --- experiments/__init__.py | 0 experiments/experiment_comparison.py | 184 ++++++++++++++++++ experiments/results/comparison.csv | 49 +++++ experiments/results/comparison_report.md | 101 ++++++++++ .../results/num_selected_voters_50.png | Bin 0 -> 97391 bytes .../results/remaining_budget_voters_50.png | Bin 0 -> 73673 bytes experiments/results/runtime_voters_50.png | Bin 0 -> 53793 bytes .../results/social_welfare_voters_50.png | Bin 0 -> 103039 bytes experiments/results/total_cost_voters_50.png | Bin 0 -> 93761 bytes 9 files changed, 334 insertions(+) create mode 100644 experiments/__init__.py create mode 100644 experiments/experiment_comparison.py create mode 100644 experiments/results/comparison.csv create mode 100644 experiments/results/comparison_report.md create mode 100644 experiments/results/num_selected_voters_50.png create mode 100644 experiments/results/remaining_budget_voters_50.png create mode 100644 experiments/results/runtime_voters_50.png create mode 100644 experiments/results/social_welfare_voters_50.png create mode 100644 experiments/results/total_cost_voters_50.png diff --git a/experiments/__init__.py b/experiments/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/experiments/experiment_comparison.py b/experiments/experiment_comparison.py new file mode 100644 index 0000000..3cc29a5 --- /dev/null +++ b/experiments/experiment_comparison.py @@ -0,0 +1,184 @@ +""" +Section A – Performance comparison of EES algorithms vs. other PB rules. + +Compares: + - exact_equal_shares (EES, Algorithm 1) + - ees_add_opt_completion (EES + add-opt, Corollary 4.7) + - method_of_equal_shares (MES, the standard library implementation) + - greedy_utilitarian_welfare (Greedy welfare) + +Metrics: + - runtime (seconds) + - total_cost (budget utilisation) + - num_selected (number of selected projects) + - social_welfare (total approval score of selected projects) + +Uses the experiments-csv library. +""" + +import logging +import sys +import time + +import experiments_csv + +# ── make the repo root importable ────────────────────────────────────── +sys.path.insert(0, ".") + +from pabutools.election import ( + Instance, + Project, + ApprovalProfile, + ApprovalBallot, + Cost_Sat, +) +from pabutools.election.instance import get_random_instance +from pabutools.election.profile.approvalprofile import get_random_approval_profile +from pabutools.rules import greedy_utilitarian_welfare, method_of_equal_shares +from pabutools.rules.ees_addopt import exact_equal_shares, ees_add_opt_completion + +TIME_LIMIT = 60 # seconds per single run + +# ── algorithm registry ───────────────────────────────────────────────── +ALGORITHMS = { + "EES": lambda inst, prof: exact_equal_shares(inst, prof), + "EES_AddOpt": lambda inst, prof: ees_add_opt_completion(inst, prof), + "MES": lambda inst, prof: method_of_equal_shares( + inst, prof, sat_class=Cost_Sat, resoluteness=True + ), + "Greedy": lambda inst, prof: greedy_utilitarian_welfare( + inst, prof, sat_class=Cost_Sat, resoluteness=True + ), +} + + +# ── single experiment function ───────────────────────────────────────── +def run_single(num_projects: int, num_voters: int, algorithm: str, seed: int): + """Run a single experiment: generate a random instance, run the algorithm, + and return measured outputs.""" + import random as _random + + _random.seed(seed) + + # Generate random instance (same style as test_ees_addopt random tests) + approval_prob = 0.4 + budget_factor_low, budget_factor_high = 0.4, 0.8 + + projects = [] + for i in range(num_projects): + projects.append(Project(str(i), _random.randint(0, 100))) + total_project_cost = sum(p.cost for p in projects) + if total_project_cost == 0: + total_project_cost = 1 + budget = int(total_project_cost * _random.uniform(budget_factor_low, budget_factor_high)) + budget = max(budget, 1) + instance = Instance(projects, budget_limit=budget) + + ballots = [] + for v in range(num_voters): + approved = [p for p in projects if _random.random() < approval_prob] + ballots.append(ApprovalBallot(approved)) + profile = ApprovalProfile(ballots, instance=instance) + + algo_fn = ALGORITHMS[algorithm] + + start = time.perf_counter() + result = algo_fn(instance, profile) + elapsed = time.perf_counter() - start + + total_cost = sum(p.cost for p in result) + num_selected = len(result) + + # Social welfare: total number of approvals for the selected projects + social_welfare = 0 + for project in result: + social_welfare += profile.approval_score(project) + + return { + "runtime": round(elapsed, 4), + "total_cost": int(total_cost), + "num_selected": num_selected, + "social_welfare": social_welfare, + "budget_limit": int(instance.budget_limit), + "remaining_budget": int(instance.budget_limit) - int(total_cost), + } + + +# ── main ─────────────────────────────────────────────────────────────── +RESULTS_DIR = "experiments/results" +CSV_FILE = "comparison.csv" +BACKUPS_DIR = "experiments/results/backups" + + +def run_experiments(): + """Run the full comparison experiment.""" + ex = experiments_csv.Experiment(RESULTS_DIR, CSV_FILE, BACKUPS_DIR) + ex.logger.setLevel(logging.INFO) + + input_ranges = { + "num_projects": [10, 30, 60, 100], + "num_voters": [50], + "algorithm": list(ALGORITHMS.keys()), + "seed": [1, 2, 3], + } + + ex.run(run_single, input_ranges) + print(f"\nExperiment data saved to {RESULTS_DIR}/{CSV_FILE}") + + +def plot_results(): + """Generate comparison plots from the CSV results.""" + import pandas as pd + from matplotlib import pyplot as plt + + csv_path = f"{RESULTS_DIR}/{CSV_FILE}" + df = pd.read_csv(csv_path) + + # Compute remaining_budget if not already in CSV (backward compat) + if "remaining_budget" not in df.columns: + df["remaining_budget"] = df["budget_limit"] - df["total_cost"] + + VOTER_COUNTS = [50] + metrics = [ + ("runtime", "Runtime (seconds)"), + ("total_cost", "Total Cost"), + ("remaining_budget", "Remaining Budget (unused)"), + ("social_welfare", "Social Welfare (total approvals)"), + ("num_selected", "Number of Selected Projects"), + ] + + for metric, ylabel in metrics: + for n_voters in VOTER_COUNTS: + plt.figure(figsize=(8, 5)) + subset = df[df["num_voters"] == n_voters] + grouped = subset.groupby(["num_projects", "algorithm"])[metric].mean().reset_index() + + for algo in sorted(grouped["algorithm"].unique()): + algo_data = grouped[grouped["algorithm"] == algo] + plt.plot( + algo_data["num_projects"], + algo_data[metric], + marker="o", + label=algo, + ) + + plt.title(f"{ylabel} vs. Number of Projects (voters={n_voters})") + plt.xlabel("Number of Projects") + plt.ylabel(ylabel) + plt.legend() + plt.grid(True, alpha=0.3) + plt.tight_layout() + save_path = f"{RESULTS_DIR}/{metric}_voters_{n_voters}.png" + plt.savefig(save_path, dpi=150) + plt.close() + print(f"Saved {save_path}") + + print("\nAll plots saved.") + + +if __name__ == "__main__": + if len(sys.argv) > 1 and sys.argv[1] == "plot": + plot_results() + else: + run_experiments() + plot_results() diff --git a/experiments/results/comparison.csv b/experiments/results/comparison.csv new file mode 100644 index 0000000..283b1d9 --- /dev/null +++ b/experiments/results/comparison.csv @@ -0,0 +1,49 @@ +num_projects,num_voters,algorithm,seed,runtime,total_cost,num_selected,social_welfare,budget_limit,remaining_budget +10,50,EES,1,0.0025,135,5,115,342,207 +10,50,EES,2,0.002,120,6,122,204,84 +10,50,EES,3,0.0018,178,5,107,344,166 +10,50,EES_AddOpt,1,0.063,324,8,168,342,18 +10,50,EES_AddOpt,2,0.0735,166,7,141,204,38 +10,50,EES_AddOpt,3,0.2167,332,7,148,344,12 +10,50,MES,1,0.0043,207,6,136,342,135 +10,50,MES,2,0.003,120,6,122,204,84 +10,50,MES,3,0.0036,258,6,129,344,86 +10,50,Greedy,1,0.0011,304,7,157,342,38 +10,50,Greedy,2,0.0016,197,7,146,204,7 +10,50,Greedy,3,0.0014,332,7,148,344,12 +30,50,EES,1,0.0314,973,23,458,1229,256 +30,50,EES,2,0.0368,804,22,461,1109,305 +30,50,EES,3,0.0231,820,20,425,1096,276 +30,50,EES_AddOpt,1,1.4754,1168,25,504,1229,61 +30,50,EES_AddOpt,2,1.3436,1107,26,540,1109,2 +30,50,EES_AddOpt,3,1.6663,1096,24,497,1096,0 +30,50,MES,1,0.0064,1105,22,451,1229,124 +30,50,MES,2,0.0113,964,23,491,1109,145 +30,50,MES,3,0.0121,995,22,474,1096,101 +30,50,Greedy,1,0.0015,1224,24,497,1229,5 +30,50,Greedy,2,0.0015,1106,23,498,1109,3 +30,50,Greedy,3,0.0029,1082,22,476,1096,14 +60,50,EES,1,0.0673,1998,48,1009,2340,342 +60,50,EES,2,0.076,1937,48,940,2316,379 +60,50,EES,3,0.0626,1253,36,742,1550,297 +60,50,EES_AddOpt,1,7.2866,2324,52,1093,2340,16 +60,50,EES_AddOpt,2,7.5881,2313,53,1028,2316,3 +60,50,EES_AddOpt,3,14.6037,1526,40,817,1550,24 +60,50,MES,1,0.019,2205,47,1012,2340,135 +60,50,MES,2,0.0173,2203,50,987,2316,113 +60,50,MES,3,0.0175,1490,36,774,1550,60 +60,50,Greedy,1,0.0064,2338,49,1055,2340,2 +60,50,Greedy,2,0.0043,2305,48,969,2316,11 +60,50,Greedy,3,0.0066,1550,30,674,1550,0 +100,50,EES,1,0.1872,3351,77,1593,3591,240 +100,50,EES,2,0.1853,3026,70,1430,3299,273 +100,50,EES,3,0.1786,2992,71,1493,3217,225 +100,50,EES_AddOpt,1,41.6526,3544,79,1634,3591,47 +100,50,EES_AddOpt,2,52.6927,3288,74,1497,3299,11 +100,50,EES_AddOpt,3,55.2711,3158,73,1535,3217,59 +100,50,MES,1,0.0455,3494,73,1550,3591,97 +100,50,MES,2,0.0621,3192,66,1393,3299,107 +100,50,MES,3,0.0562,3175,64,1415,3217,42 +100,50,Greedy,1,0.0132,3590,68,1474,3591,1 +100,50,Greedy,2,0.0093,3284,64,1372,3299,15 +100,50,Greedy,3,0.0125,3217,61,1361,3217,0 diff --git a/experiments/results/comparison_report.md b/experiments/results/comparison_report.md new file mode 100644 index 0000000..469df9c --- /dev/null +++ b/experiments/results/comparison_report.md @@ -0,0 +1,101 @@ +# Section A – Performance Comparison + +### Algorithms Tested + +| Algorithm | Description | Source | +|-----------|-------------|--------| +| **EES** | Exact Equal Shares (Algorithm 1) – selects projects by bang-per-buck ratio, splitting costs equally among supporters | Paper, `ees_addopt.py` | +| **EES_AddOpt** | EES + Add-Opt Completion (Corollary 4.7) – repeatedly runs EES with increasing virtual budgets until the outcome exhausts the budget | Paper, `ees_addopt.py` | +| **MES** | Method of Equal Shares – the standard library implementation with Cost Satisfaction | `pabutools.rules.mes` | +| **Greedy** | Greedy Utilitarian Welfare – greedy algorithm selecting projects by approval score | `pabutools.rules.greedywelfare` | + +### Metrics Measured + +1. **runtime** – execution time in seconds +2. **remaining_budget** – unused budget (budget_limit − total_cost) +3. **total_cost** – total cost of selected projects +4. **social_welfare** – sum of approval scores for selected projects +5. **num_selected** – number of selected projects + +### Experiment Parameters + +All 4 algorithms run on **exactly the same inputs**: + +- **Number of projects**: 10, 30, 60, 100 +- **Number of voters**: 50 +- **Repetitions**: 3 runs (seeds: 1, 2, 3) – averages shown in plots +- **Input generation**: random costs between 0 and 100, budget = 40%–80% of total cost, approval probability = 0.4 + +--- + +## Results + +### Runtime + +![Runtime](runtime_voters_50.png) + +| Algorithm | 10 projects | 30 projects | 60 projects | 100 projects | +|-----------|------------|------------|------------|-------------| +| **EES** | 0.002s | 0.03s | 0.07s | 0.18s | +| **EES_AddOpt** | 0.12s | 1.50s | 9.83s | **49.87s** | +| **MES** | 0.004s | 0.01s | 0.02s | 0.05s | +| **Greedy** | 0.001s | 0.002s | 0.006s | 0.01s | + +**Findings:** +- **Greedy** is the fastest, followed by **MES** +- **EES** (Algorithm 1 alone) is relatively fast – 0.18s at 100 projects +- **EES_AddOpt** is significantly slower: ~50 seconds at 100 projects, because it runs EES + add_opt multiple times with increasing virtual budgets + +### Remaining Budget + +![Remaining Budget](remaining_budget_voters_50.png) + +| Algorithm | 10 projects | 30 projects | 60 projects | 100 projects | +|-----------|------------|------------|------------|-------------| +| **EES** | 152 | 279 | 339 | 246 | +| **EES_AddOpt** | **23** | **21** | **14** | **39** | +| **MES** | 102 | 123 | 103 | 82 | +| **Greedy** | 19 | 7 | 4 | 5 | + +**Findings:** +- **EES** leaves the most budget unused – it stops as soon as no project can be funded equally among supporters +- **EES_AddOpt** dramatically improves budget utilization: only 14–39 remaining, compared to 152–339 for plain EES +- **MES** is in between: 82–123 remaining +- **Greedy** has the best budget utilization (4–19) but does not guarantee fairness + +### Social Welfare + +![Social Welfare](social_welfare_voters_50.png) + +| Algorithm | 10 projects | 30 projects | 60 projects | 100 projects | +|-----------|------------|------------|------------|-------------| +| **EES** | 115 | 448 | 897 | 1505 | +| **EES_AddOpt** | **152** | **514** | **979** | **1555** | +| **MES** | 129 | 472 | 924 | 1453 | +| **Greedy** | 150 | 490 | 899 | 1402 | + +**Findings:** +- **EES_AddOpt** achieves the highest social welfare at every input size +- At 100 projects: EES_AddOpt (1555) > EES (1505) > MES (1453) > Greedy (1402) +- The gap between EES_AddOpt and MES grows with input size + +### Total Cost and Number of Selected Projects + +![Total Cost](total_cost_voters_50.png) +![Num Selected](num_selected_voters_50.png) + +--- + +## Conclusions + +| | Runtime | Budget Utilization | Social Welfare | Fairness | +|---|---|---|---|---| +| **EES** | Fast | Low | Medium | ✓ | +| **EES_AddOpt** | **Very slow** | **High** | **Highest** | ✓ | +| **MES** | Fast | Medium | Medium-High | ✓ | +| **Greedy** | **Fastest** | **Highest** | Relatively low | ✗ | + +1. **EES_AddOpt** achieves the best outcomes (social welfare + budget utilization) while maintaining fairness – but at a very high runtime cost (~50s at 100 projects) +2. **EES** alone is fast but does not exhaust the budget – suitable as an intermediate step +3. **MES** is a good compromise: fast, fair, and produces reasonable results +4. **Greedy** is the fastest and best at budget utilization, but does not guarantee fair allocation \ No newline at end of file diff --git a/experiments/results/num_selected_voters_50.png b/experiments/results/num_selected_voters_50.png new file mode 100644 index 0000000000000000000000000000000000000000..22d44558779cd814be6756afe1730ad0ffaac631 GIT binary patch literal 97391 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 literal 0 HcmV?d00001 diff --git a/experiments/results/remaining_budget_voters_50.png b/experiments/results/remaining_budget_voters_50.png new file mode 100644 index 0000000000000000000000000000000000000000..89d81104a2e467cd1796c4c237c2d65893bd614e GIT binary patch literal 73673 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%0An`uvvjLL+9n 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 L;z_RT%Xj||fF4Ur literal 0 HcmV?d00001