def test_sentinel(): contest = Contest(100000, { 'A': 60000, 'B': 40000 }, 1, ['A'], ContestType.MAJORITY) minerva = Minerva(.1, .1, contest) minerva.compute_min_winner_ballots(minerva.sub_audits['A-B'], [13, 14, 15]) assert minerva.sub_audits['A-B'].min_winner_ballots == [13, None, 14]
def test_minerva_kmins(): contest = Contest(100000, { 'A': 60000, 'B': 40000 }, 1, ['A'], ContestType.MAJORITY) minerva = Minerva(.1, .1, contest) minerva.compute_min_winner_ballots(minerva.sub_audits['A-B'], [100, 200, 400]) # From existing software assert minerva.sub_audits['A-B'].min_winner_ballots == [58, 113, 221]
def test_athena_minerva_paper(): contest = Contest(100000, { 'A': 75000, 'B': 25000 }, 1, ['A'], ContestType.MAJORITY) athena = Athena(.1, 1, .1, contest) minerva = Minerva(.1, .1, contest) athena.compute_min_winner_ballots(athena.sub_audits['A-B'], [50]) minerva.compute_min_winner_ballots(minerva.sub_audits['A-B'], [50]) # From Athena paper assert athena.sub_audits['A-B'].min_winner_ballots == [32] assert minerva.sub_audits['A-B'].min_winner_ballots == [31]
def test_minerva_second_round_estimate(): contest1 = Contest(100000, { 'A': 60000, 'B': 40000 }, 1, ['A'], ContestType.MAJORITY) minerva1 = Minerva(.1, .1, contest1) minerva1.compute_min_winner_ballots(minerva1.sub_audits['A-B'], [100]) minerva1.sample_ballots['A'].append(54) minerva1.sample_ballots['B'].append(100 - 54) contest2 = Contest(4504975 + 4617886, { 'Trump': 4617886, 'Clinton': 4504975 }, 1, ['Trump'], ContestType.PLURALITY) minerva2 = Minerva(.1, 1.0, contest2) minerva2.compute_min_winner_ballots(minerva2.sub_audits['Trump-Clinton'], [45081]) minerva2.sample_ballots['Trump'].append(22634) minerva2.sample_ballots['Clinton'].append(45081 - 22634) assert minerva1.next_sample_size() == 305 assert minerva2.next_sample_size() == 111257
def test_exceptions(): contest = Contest(100000, { 'A': 60000, 'B': 40000 }, 1, ['A'], ContestType.MAJORITY) minerva = Minerva(.1, .1, contest) with pytest.raises(ValueError): minerva.compute_min_winner_ballots(minerva.sub_audits['A-B'], []) with pytest.raises(ValueError): minerva.compute_min_winner_ballots(minerva.sub_audits['A-B'], [0]) with pytest.raises(ValueError): minerva.compute_min_winner_ballots(minerva.sub_audits['A-B'], [1, 2]) with pytest.raises(ValueError): minerva.compute_min_winner_ballots(minerva.sub_audits['A-B'], [20, 20]) with pytest.raises(ValueError): minerva.compute_min_winner_ballots(minerva.sub_audits['A-B'], [20, 19]) with pytest.raises(ValueError): minerva.compute_min_winner_ballots(minerva.sub_audits['A-B'], [10001]) minerva.compute_min_winner_ballots(minerva.sub_audits['A-B'], [20]) with pytest.raises(ValueError): minerva.compute_min_winner_ballots(minerva.sub_audits['A-B'], [20]) with pytest.raises(ValueError): minerva.compute_min_winner_ballots(minerva.sub_audits['A-B'], [19]) with pytest.raises(ValueError): minerva.compute_min_winner_ballots(minerva.sub_audits['A-B'], [10001]) contest2 = Contest(100, {'A': 60, 'B': 30}, 1, ['A'], ContestType.MAJORITY) minerva2 = Minerva(.1, 1.0, contest2) with pytest.raises(ValueError): minerva2.compute_min_winner_ballots(minerva2.sub_audits['A-B'], [91]) minerva2.rounds = [10] with pytest.raises(Exception): minerva2.compute_all_min_winner_ballots(minerva2.sub_audits['A-B']) minerva2.rounds = [] with pytest.raises(Exception): minerva.compute_all_min_winner_ballots(minerva2.sub_audits['A-B'], 200) minerva = Minerva(.1, .1, contest) with pytest.raises(Exception): minerva.stopping_condition_pairwise('A-B') minerva.rounds.append(10) with pytest.raises(ValueError): minerva.stopping_condition_pairwise('x')