Skip to content

hasStyle replaced with SamplePopulations #552

@JohnLCaron

Description

@JohnLCaron

The most efficient audit has CVRs (that include undervotes) for all ballots.

Otherwise, we need to create "Population" card containers that know which contests are in it, and use these to set Npop and when choosing audit samples.

Each population sets "hasSingleCardStyle" = true if all cards in the population have one CardType (i.e all cards in the population have the same contests). This is set independently on each population, and replaces the global hasStyle (aka use_style) flag.

The population.hasSingleCardStyle field is used in the overstatementError() when an MVR is missing a contest, for all audits (including Polling?).

The use of populations is implicit in the "More styles, less work" paper. Setting hasStyle by population and using hasStyle in Polling audits is new, I think. These complexities arise in multi-contest audits and multi-card ballots.

https://github.com/JohnLCaron/rlauxe/blob/main/docs/SamplePopulations.md

Questions:

Does assigning 1/2 to missing mvrs create an opening for an attack?
When the contest is missing on the MVR, we assign 0 to mvr_assort when hasStyle=true, and 0.5 when hasStyle=false.

The first case tanks the audit, and the second may allow attacks(?)

Using population.hasSingleCardStyle instead of global hasStyles should be better.

But still, note that population.hasSingleCardStyle requires all cards to have the same CardStyle in a population.
So it is false even if theres only one card thats different.
That could have a big effect on the assort values, but it only increases the diluted count by 1. Seems fishy.

An attacker could falsely claim hasSingleCardStyle=false; could we detect that?

Should hasStyle also be used in Polling Audits? This is not in Shangrla.

Suppose each precinct has one CardStyle, and each precinct stores its own ballots, and we are doing a Polling audit.
You hand count the ballots, and keep all cards for a ballot in the same ballot envelope.
Then it doesnt matter how many cards are in the ballot. Since we know the exact contests on all cards, we
have hasSingleCardStyle = true. The contest audit can sample only from the populations that contain the contest, and Npop = Nc.

Suppose you audit a ballot that turns out not to have that contest? Seems like mvr_assort should be 0, not a 0.5, when hasSingleCardStyle = true.

 if (!cvr.hasContest(info.id)) return if (hasStyle) 0.0 else 0.5

is in the code for ClcaAssorter, but not for the primitive assorters,which have

 if (!cvr.hasContest(info.id)) return 0.5

If in the same scenario, but with the cards separated (the example of MoreStyle section 5):
Each ballot puts n seperate cards in the pile, and hasSingleCardStyle = false.
We expect to see (n-1)/n cards without the contest, and 1/n with the contest, so we cant tolerate setting
mvr_assort = 0 when mvr doesnt have the contest, since that will happen a lot. We need to set it to 0.5.

So we need to set mvr_assort based on hasSingleCardStyle, just as with CLCA and OneAudit.

???

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions