Description
List strict directed three-candidate majority-cycle witnesses once per rotation.
A ballot record is an explicit selection or ordered list of literal candidate IDs. A tally depends on its rule: first choice, approval, positional scores and pairwise comparisons use different evidence. Partial rankings do not by themselves define a preference for or against omitted candidates. Counts and weights describe supplied records, not certified voters.
List strict directed three-candidate majority-cycle witnesses once per rotation.
When to use this tool
Use three-candidate witnesses to inspect concrete cycles in strict pairwise majority preferences.
How to use the tool and how it works
- Enter candidates, ballotsJson using the definitions below. Serialize JSON text fields in the decoded shape shown below.
- Run the operation. Resolve input-format errors before interpreting an output.
- Read result.cycles, using the stated boundary, ordering, sign and absence conventions.
Build the strict pairwise majority relation. For each triple with its smallest candidate-bank index first, return an orientation [a,b,c] only when a beats b, b beats c and c beats a.1
| Input field | Meaning and units | Accepted input |
|---|---|---|
| candidates | Distinct literal candidate IDs in the output row/column order. | Dense list of at most 128 literal strings, each at most 8,192 UTF-16 units. |
| ballotsJson | JSON array of ballot arrays of literal candidate IDs. Each row is a selection or partial ranking according to this operation; empty ballots are allowed. | Text, at most 8,192 UTF-16 code units; narrower grammar/range rules also apply. |
These decoded structures show the examples inside JSON text fields. Supply their serialized JSON strings as input.
{
"ballotsJson": [
[
"a",
"b",
"c"
],
[
"b",
"c",
"a"
],
[
"c",
"a",
"b"
]
]
} | Output field | Interpretation |
|---|---|
| result | Object containing the fields below. |
| result.cycles | Directed [candidateA,candidateB,candidateC] strict majority witnesses, smallest bank index first. |
{
"input": {
"candidates": [
"a",
"b",
"c"
],
"ballotsJson": "[[\"a\",\"b\",\"c\"],[\"b\",\"c\",\"a\"],[\"c\",\"a\",\"b\"]]"
},
"output": {
"result": {
"cycles": [
[
"a",
"b",
"c"
]
]
}
}
} Limitations and assumptions
- The output lists directed three-candidate witnesses once per rotation. It does not enumerate all longer cycles or resolve a voting outcome.
- Candidate banks use distinct exact string IDs. Unless an audit explicitly accepts them for reporting, unknown IDs and repeated IDs within a ballot are rejected. Rankings may be partial. These operations do not authenticate records, infer voter intent or apply jurisdiction-specific election rules.
- Every declared outer field is required and unknown outer fields are rejected. Strings and JSON text have size limits, lists are bounded to 128 entries, and JSON nesting/node counts are bounded. Tighter operation-specific bounds stated above take precedence.
- Numeric outputs must remain finite and within safe-integer magnitude. Original record indexes and cell coordinates are zero-based; stated half-open ranges exclude their end.
Alternative or Complementary methods
Choose a tally rule before comparing outcomes. Audit candidate identity and repeated entries first, retain the treatment of empty and partial ballots, and apply any election-specific eligibility or tie-breaking procedure separately.
References
Similar or alternative tools
- Strict Pairwise Ballot Winner Check
Find candidates with a strict observed pairwise win against every other declared candidate.
- Pairwise Ballot Unbeaten Candidate Selector
Find candidates with no strict pairwise loss, including tied or unobserved comparisons.