Skip to main content

Counting Algorithms

Velvet supports multiple counting algorithms to accommodate different electoral systems.

Overview​

Each counting algorithm implements the CountingAlgorithm trait, which defines:

pub trait CountingAlgorithm {
fn tally(&self) -> Result<ContestResult>;
}

This trait-based design allows Velvet to support any electoral system by implementing the appropriate counting logic.

Available Algorithms​

Plurality at Large​

Simple majority voting where candidates with the most votes win. Commonly used for multi-seat elections where voters can select multiple candidates.

Location: /packages/velvet/src/pipes/do_tally/counting_algorithm/plurality_at_large.rs

Documentation to be added.

Instant Runoff Voting (IRV)​

Ranked-choice voting system where voters rank candidates in order of preference. If no candidate has a majority, the candidate with the fewest votes is eliminated and their votes are redistributed until a winner emerges.

Location: /packages/velvet/src/pipes/do_tally/counting_algorithm/instant_runoff.rs

See: Instant Runoff Algorithm Documentation

Common Utilities​

All algorithms share common utilities for:

  • Ballot validation
  • Vote counting
  • Metric calculation
  • Result formatting

Location: /packages/velvet/src/pipes/do_tally/counting_algorithm/common.rs

Adding New Algorithms​

To add a new counting algorithm:

  1. Create a new file in /packages/velvet/src/pipes/do_tally/counting_algorithm/
  2. Implement the CountingAlgorithm trait
  3. Add the algorithm to mod.rs
  4. Configure the algorithm in the election configuration

The trait-based design ensures your algorithm will integrate seamlessly with the rest of Velvet.