| Crates.io | kingmaker |
| lib.rs | kingmaker |
| version | 0.1.0 |
| created_at | 2025-05-12 04:05:37.166242+00 |
| updated_at | 2025-05-12 04:05:37.166242+00 |
| description | A modular, performant, social choice framework for the simulation, computation, and analysis of strategic voting. |
| homepage | |
| repository | https://github.com/Approximately-Equal/kingmaker |
| max_upload_size | |
| id | 1669994 |
| size | 103,140 |
Kingmaker is a modular, performant, social choice framework for the simulation, computation, and analysis of strategic voting. It has a focus on the study of strategic or tactical voting, which is concerned with questions such as:
and much more.
To get started with Kingmaker, just configure the election parameters and run the simulation. Here's an example:
use kingmaker::prelude::*;
fn main() {
// configure election
let candidates = [
Candidate::new(0, "Alice", Some("DEM"), Default::default()),
Candidate::new(1, "Bliar", Some("REP"), Default::default()),
Candidate::new(2, "Cybil", None, Default::default()),
];
let voting_blocks = [
VotingBloc::builder(preferences::Mallows::new(vec![0, 2, 1], 1.4), 40)
.add_tactic(tactics::Burial::new(vec![1]), 0.8) // Do not vote for the opposition!
.add_tactic(tactics::Identity, 0.2)
.build(),
VotingBloc::builder(preferences::Mallows::new(vec![1, 2, 0], 1.0), 45)
.add_tactic(tactics::Burial::new(vec![0]), 0.8) // Do not vote for the opposition!
.add_tactic(tactics::Identity, 0.2)
.build(),
VotingBloc::builder(preferences::Mallows::new(vec![2, 0, 1], 1.2), 15)
.add_tactic(tactics::Identity, 0.8)
.add_tactic(tactics::Compromise::new(vec![0]), 0.2) // Compromise for A (DEM) instead
.build(),
];
let election = Election::new(candidates, voting_blocks, methods::IRV);
// run election
let outcomes = election.run_many(1_000, 0);
election.display(&outcomes);
}