abcvoting Benchmark Dashboard

## About the Benchmarks

### Instance Generation

1000 benchmark instances are generated using various probability models from the abcvoting library:

- IC (Impartial Culture): Each candidate is approved independently with probability p (p=0.3 or p=0.5)
- IC fixed-size: Each voter approves exactly k candidates uniformly at random (k=2, 3, or 4)
- Truncated Mallows: Voters have correlated preferences based on a central ranking with dispersion parameter
- Urn fixed-size: Polya-Eggenberger urn model with replacement parameter

### Instance Parameters

- Number of voters: Uniformly sampled from [5, 100]
- Number of candidates: Uniformly sampled from [5, 100]
- Committee size: Between `max(3, num_cand/10)` and `max(4, num_cand/3)`

### Instance Ordering

Instances are sorted by number of candidates, then by committee size, then by number of voters. This ordering prioritizes the parameters that most affect computational complexity for ABC voting rules.

### Benchmark Execution

- Each rule/algorithm combination runs through instances in order
- A cumulative timeout applies to all instances together (not per-instance)
- When the cumulative runtime exceeds the timeout, remaining instances are skipped
- The "Completed" column shows how many instances finished before timeout

#### Instance Distribution: Voters vs Candidates

#### Committee Size Distribution

Show all algorithms (default: fastest only)

## Resolute Mode

Rule | Algorithm | Completed | Total Runtime
--- | --- | --- | ---
AV Approval Voting (AV) | standardfastest | 1000/1000 | 99ms
SAV Satisfaction Approval Voting (SAV) | standardfastest | 1000/1000 | 134ms
PAV Proportional Approval Voting (PAV) | gurobifastest | 1000/1000 | 21.10s
PAV Proportional Approval Voting (PAV) | branch-and-bound | 279/1000 | timeout
PAV Proportional Approval Voting (PAV) | brute-force | 243/1000 | timeout
PAV Proportional Approval Voting (PAV) | pulp-cbc | 1000/1000 | 1.7m
PAV Proportional Approval Voting (PAV) | pulp-highs | 1000/1000 | 3.3m
SLAV Sainte-Laguë Approval Voting (SLAV) | gurobifastest | 1000/1000 | 25.08s
SLAV Sainte-Laguë Approval Voting (SLAV) | branch-and-bound | 279/1000 | timeout
SLAV Sainte-Laguë Approval Voting (SLAV) | brute-force | 237/1000 | timeout
SLAV Sainte-Laguë Approval Voting (SLAV) | pulp-cbc | 1000/1000 | 2.3m
SLAV Sainte-Laguë Approval Voting (SLAV) | pulp-highs | 1000/1000 | 4.1m
CC Approval Chamberlin-Courant (CC) | gurobifastest | 1000/1000 | 13.87s
CC Approval Chamberlin-Courant (CC) | branch-and-bound | 258/1000 | timeout
CC Approval Chamberlin-Courant (CC) | brute-force | 246/1000 | timeout
CC Approval Chamberlin-Courant (CC) | ortools-cp | 1000/1000 | 27.61s
CC Approval Chamberlin-Courant (CC) | pulp-cbc | 1000/1000 | 1.1m
CC Approval Chamberlin-Courant (CC) | pulp-highs | 1000/1000 | 2.0m
lex-CC Lexicographic Chamberlin-Courant (lex-CC) | gurobifastest | 692/1000 | timeout
lex-CC Lexicographic Chamberlin-Courant (lex-CC) | brute-force | 205/1000 | timeout
lex-CC Lexicographic Chamberlin-Courant (lex-CC) | pulp-cbc | 259/1000 | timeout
lex-CC Lexicographic Chamberlin-Courant (lex-CC) | pulp-highs | 408/1000 | timeout
2-Geometric 2-Geometric Rule | gurobifastest | 1000/1000 | 3.0m
2-Geometric 2-Geometric Rule | branch-and-bound | 279/1000 | timeout
2-Geometric 2-Geometric Rule | brute-force | 237/1000 | timeout
2-Geometric 2-Geometric Rule | pulp-cbc | 673/1000 | timeout
2-Geometric 2-Geometric Rule | pulp-highs | 578/1000 | timeout
Adams-AV Adams Approval Voting | gurobifastest | 1000/1000 | 57.95s
Adams-AV Adams Approval Voting | brute-force | 244/1000 | timeout
Adams-AV Adams Approval Voting | pulp-cbc | 943/1000 | timeout
Adams-AV Adams Approval Voting | pulp-highs | 619/1000 | timeout
seq-PAV Sequential Proportional Approval Voting (seq-PAV) | standardfastest | 1000/1000 | 7.34s
revseq-PAV Reverse Sequential Proportional Approval Voting (revseq-PAV) | standardfastest | 1000/1000 | 47.45s
seq-SLAV Sequential Sainte-Laguë Approval Voting (seq-SLAV) | standardfastest | 1000/1000 | 7.47s
seq-CC Sequential Approval Chamberlin-Courant (seq-CC) | standardfastest | 1000/1000 | 5.07s
seq-Phragmén Phragmén's Sequential Rule (seq-Phragmén) | float-fractionsfastest | 1000/1000 | 5.25s
seq-Phragmén Phragmén's Sequential Rule (seq-Phragmén) | gmpy2-fractions | 1000/1000 | 7.14s
seq-Phragmén Phragmén's Sequential Rule (seq-Phragmén) | standard-fractions | 1000/1000 | 18.84s
minimax-Phragmén Phragmén's Minimax Rule (minimax-Phragmén) | gurobifastest | 1000/1000 | 4.3m
minimax-Phragmén Phragmén's Minimax Rule (minimax-Phragmén) | pulp-cbc | 368/1000 | timeout
minimax-Phragmén Phragmén's Minimax Rule (minimax-Phragmén) | pulp-highs | 576/1000 | timeout
leximax-Phragmén Phragmén's Leximax Rule (leximax-Phragmén) | gurobifastest | 1/1000 | timeout
Maximin-Support Maximin Support Method (MMS) | nx-max-flowfastest | 492/1000 | timeout
Maximin-Support Maximin Support Method (MMS) | gurobi | 324/1000 | timeout
Monroe Monroe's Approval Rule (Monroe) | gurobifastest | 576/1000 | timeout
Monroe Monroe's Approval Rule (Monroe) | brute-force | 118/1000 | timeout
Monroe Monroe's Approval Rule (Monroe) | ortools-cp | 345/1000 | timeout
Monroe Monroe's Approval Rule (Monroe) | pulp-cbc | 118/1000 | timeout
Monroe Monroe's Approval Rule (Monroe) | pulp-highs | 158/1000 | timeout
Greedy Monroe Greedy Monroe | standardfastest | 1000/1000 | 30.75s
minimaxav Minimax Approval Voting (MAV) | gurobifastest | 983/1000 | timeout
minimaxav Minimax Approval Voting (MAV) | brute-force | 244/1000 | timeout
minimaxav Minimax Approval Voting (MAV) | ortools-cp | 782/1000 | timeout
minimaxav Minimax Approval Voting (MAV) | pulp-cbc | 526/1000 | timeout
minimaxav Minimax Approval Voting (MAV) | pulp-highs | 878/1000 | timeout
lex-MAV Lexicographic Minimax Approval Voting (lex-MAV) | brute-forcefastest⚠ differs from "fastest"-default | 237/1000 | timeout
lex-MAV Lexicographic Minimax Approval Voting (lex-MAV) | gurobi | 162/1000 | timeout
lex-MAV Lexicographic Minimax Approval Voting (lex-MAV) | pulp-highs | 146/1000 | timeout
Equal Shares Method of Equal Shares (aka Rule X) with Phragmén phase | float-fractionsfastest | 1000/1000 | 7.63s
Equal Shares Method of Equal Shares (aka Rule X) with Phragmén phase | gmpy2-fractions | 1000/1000 | 9.57s
Equal Shares Method of Equal Shares (aka Rule X) with Phragmén phase | standard-fractions | 1000/1000 | 26.59s
Equal Shares with AV completion Method of Equal Shares (aka Rule X) with AV completion | float-fractionsfastest | 1000/1000 | 5.62s
Equal Shares with AV completion Method of Equal Shares (aka Rule X) with AV completion | gmpy2-fractions | 1000/1000 | 7.25s
Equal Shares with AV completion Method of Equal Shares (aka Rule X) with AV completion | standard-fractions | 1000/1000 | 21.86s
Equal Shares with increment completion Method of Equal Shares (aka Rule X) with increment completion | gmpy2-fractionsfastest⚠ differs from "fastest"-default | 1000/1000 | 1.1m
Equal Shares with increment completion Method of Equal Shares (aka Rule X) with increment completion | float-fractions | 1000/1000 | 1.2m
Equal Shares with increment completion Method of Equal Shares (aka Rule X) with increment completion | standard-fractions | 1000/1000 | 1.9m
Phragmén-Eneström Method of Phragmén-Eneström | float-fractionsfastest | 1000/1000 | 3.33s
Phragmén-Eneström Method of Phragmén-Eneström | gmpy2-fractions | 696/1000 | timeout
Phragmén-Eneström Method of Phragmén-Eneström | standard-fractions | 575/1000 | timeout
Consensus Rule Consensus Rule | float-fractionsfastest | 1000/1000 | 3.76s
Consensus Rule Consensus Rule | gmpy2-fractions | 1000/1000 | 4.41s
Consensus Rule Consensus Rule | standard-fractions | 1000/1000 | 8.09s
Trivial Rule Trivial Rule | standardfastest | 1000/1000 | 27ms
E Pluribus Hugo E Pluribus Hugo (EPH) | float-fractionsfastest | 1000/1000 | 3.41s
E Pluribus Hugo E Pluribus Hugo (EPH) | gmpy2-fractions | 1000/1000 | 6.17s
E Pluribus Hugo E Pluribus Hugo (EPH) | standard-fractions | 1000/1000 | 14.77s

## Irresolute Mode (max_num_of_committees=10)

Rule | Algorithm | Completed | Total Runtime
--- | --- | --- | ---
AV Approval Voting (AV) | standardfastest | 1000/1000 | 170ms
SAV Satisfaction Approval Voting (SAV) | standardfastest | 1000/1000 | 180ms
PAV Proportional Approval Voting (PAV) | gurobifastest | 1000/1000 | 54.86s
PAV Proportional Approval Voting (PAV) | branch-and-bound | 279/1000 | timeout
PAV Proportional Approval Voting (PAV) | brute-force | 244/1000 | timeout
PAV Proportional Approval Voting (PAV) | pulp-cbc | 998/1000 | timeout
PAV Proportional Approval Voting (PAV) | pulp-highs | 673/1000 | timeout
SLAV Sainte-Laguë Approval Voting (SLAV) | gurobifastest | 1000/1000 | 1.0m
SLAV Sainte-Laguë Approval Voting (SLAV) | branch-and-bound | 279/1000 | timeout
SLAV Sainte-Laguë Approval Voting (SLAV) | brute-force | 242/1000 | timeout
SLAV Sainte-Laguë Approval Voting (SLAV) | pulp-cbc | 843/1000 | timeout
SLAV Sainte-Laguë Approval Voting (SLAV) | pulp-highs | 578/1000 | timeout
CC Approval Chamberlin-Courant (CC) | gurobifastest | 1000/1000 | 1.3m
CC Approval Chamberlin-Courant (CC) | branch-and-bound | 258/1000 | timeout
CC Approval Chamberlin-Courant (CC) | brute-force | 245/1000 | timeout
CC Approval Chamberlin-Courant (CC) | ortools-cp | 1000/1000 | 3.3m
CC Approval Chamberlin-Courant (CC) | pulp-cbc | 619/1000 | timeout
CC Approval Chamberlin-Courant (CC) | pulp-highs | 403/1000 | timeout
lex-CC Lexicographic Chamberlin-Courant (lex-CC) | gurobifastest | 665/1000 | timeout
lex-CC Lexicographic Chamberlin-Courant (lex-CC) | brute-force | 205/1000 | timeout
lex-CC Lexicographic Chamberlin-Courant (lex-CC) | pulp-cbc | 245/1000 | timeout
lex-CC Lexicographic Chamberlin-Courant (lex-CC) | pulp-highs | 371/1000 | timeout
2-Geometric 2-Geometric Rule | gurobifastest | 934/1000 | timeout
2-Geometric 2-Geometric Rule | branch-and-bound | 279/1000 | timeout
2-Geometric 2-Geometric Rule | brute-force | 237/1000 | timeout
2-Geometric 2-Geometric Rule | pulp-cbc | 522/1000 | timeout
2-Geometric 2-Geometric Rule | pulp-highs | 454/1000 | timeout
Adams-AV Adams Approval Voting | gurobifastest | 1000/1000 | 2.4m
Adams-AV Adams Approval Voting | brute-force | 244/1000 | timeout
Adams-AV Adams Approval Voting | pulp-cbc | 483/1000 | timeout
Adams-AV Adams Approval Voting | pulp-highs | 232/1000 | timeout
seq-PAV Sequential Proportional Approval Voting (seq-PAV) | standardfastest | 555/1000 | timeout
revseq-PAV Reverse Sequential Proportional Approval Voting (revseq-PAV) | standardfastest | 224/1000 | timeout
seq-SLAV Sequential Sainte-Laguë Approval Voting (seq-SLAV) | standardfastest | 724/1000 | timeout
seq-CC Sequential Approval Chamberlin-Courant (seq-CC) | standardfastest | 970/1000 | timeout
seq-Phragmén Phragmén's Sequential Rule (seq-Phragmén) | float-fractionsfastest | 643/1000 | timeout
seq-Phragmén Phragmén's Sequential Rule (seq-Phragmén) | gmpy2-fractions | 643/1000 | timeout
seq-Phragmén Phragmén's Sequential Rule (seq-Phragmén) | standard-fractions | 543/1000 | timeout
minimax-Phragmén Phragmén's Minimax Rule (minimax-Phragmén) | gurobifastest | 400/1000 | timeout
minimax-Phragmén Phragmén's Minimax Rule (minimax-Phragmén) | pulp-cbc | 212/1000 | timeout
minimax-Phragmén Phragmén's Minimax Rule (minimax-Phragmén) | pulp-highs | 251/1000 | timeout
leximax-Phragmén Phragmén's Leximax Rule (leximax-Phragmén) | gurobifastest | 1/1000 | timeout
Maximin-Support Maximin Support Method (MMS) | nx-max-flowfastest | 314/1000 | timeout
Maximin-Support Maximin Support Method (MMS) | gurobi | 249/1000 | timeout
Monroe Monroe's Approval Rule (Monroe) | gurobifastest | 257/1000 | timeout
Monroe Monroe's Approval Rule (Monroe) | brute-force | 118/1000 | timeout
Monroe Monroe's Approval Rule (Monroe) | ortools-cp | 166/1000 | timeout
Monroe Monroe's Approval Rule (Monroe) | pulp-cbc | 58/1000 | timeout
Monroe Monroe's Approval Rule (Monroe) | pulp-highs | 76/1000 | timeout
minimaxav Minimax Approval Voting (MAV) | pulp-highsfastest | 526/1000 | timeout
minimaxav Minimax Approval Voting (MAV) | brute-force | 244/1000 | timeout
minimaxav Minimax Approval Voting (MAV) | gurobi | 526/1000 | timeout
minimaxav Minimax Approval Voting (MAV) | ortools-cp | 526/1000 | timeout
minimaxav Minimax Approval Voting (MAV) | pulp-cbc | 302/1000 | timeout
lex-MAV Lexicographic Minimax Approval Voting (lex-MAV) | brute-forcefastest⚠ differs from "fastest"-default | 237/1000 | timeout
lex-MAV Lexicographic Minimax Approval Voting (lex-MAV) | gurobi | 145/1000 | timeout
lex-MAV Lexicographic Minimax Approval Voting (lex-MAV) | pulp-highs | 127/1000 | timeout
Equal Shares Method of Equal Shares (aka Rule X) with Phragmén phase | float-fractionsfastest | 317/1000 | timeout
Equal Shares Method of Equal Shares (aka Rule X) with Phragmén phase | gmpy2-fractions | 317/1000 | timeout
Equal Shares Method of Equal Shares (aka Rule X) with Phragmén phase | standard-fractions | 317/1000 | timeout
Equal Shares with AV completion Method of Equal Shares (aka Rule X) with AV completion | float-fractionsfastest | 696/1000 | timeout
Equal Shares with AV completion Method of Equal Shares (aka Rule X) with AV completion | gmpy2-fractions | 603/1000 | timeout
Equal Shares with AV completion Method of Equal Shares (aka Rule X) with AV completion | standard-fractions | 575/1000 | timeout
Phragmén-Eneström Method of Phragmén-Eneström | float-fractionsfastest | 847/1000 | timeout
Phragmén-Eneström Method of Phragmén-Eneström | gmpy2-fractions | 612/1000 | timeout
Phragmén-Eneström Method of Phragmén-Eneström | standard-fractions | 575/1000 | timeout
Consensus Rule Consensus Rule | float-fractionsfastest | 970/1000 | timeout
Consensus Rule Consensus Rule | gmpy2-fractions | 970/1000 | timeout
Consensus Rule Consensus Rule | standard-fractions | 970/1000 | timeout
Trivial Rule Trivial Rule | standardfastest | 1000/1000 | 137ms
E Pluribus Hugo E Pluribus Hugo (EPH) | float-fractionsfastest | 1000/1000 | 3.44s
E Pluribus Hugo E Pluribus Hugo (EPH) | gmpy2-fractions | 1000/1000 | 6.21s
E Pluribus Hugo E Pluribus Hugo (EPH) | standard-fractions | 1000/1000 | 14.88s