forked from electionscience/vse-sim
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpollPerturb.py
44 lines (43 loc) · 2.36 KB
/
pollPerturb.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from methods import *
from voterModels import *
def pollPert(model, methodsAndStrats, nvot, ncand, niter, nwinners=1, perturbations=[-.2, -.02, .02, .2],
pollingMethod=Approval, pollingStrat=Approval.zeroInfoBallot,
pollingStratArgs={'pickiness':0.7}):
ms = []
for m in methodsAndStrats:
if isinstance(m, type):
ms.append((m, m.vaBallot, {}))
elif len(m) == 2:
ms.append((m[0], m[1], {}))
else: ms.append(m)
totalResults = {p:{m[0].__name__: [0,0,0] for m in ms} for p in perturbations}
condResults = {p:{m[0].__name__: [0,0,0] for m in ms} for p in perturbations}
nonCondResults = {p:{m[0].__name__: [0,0,0] for m in ms} for p in perturbations}
for i in range(niter):
electorate = model(nvot, ncand)
basePolls = pollingMethod.results([pollingStrat(v) for v in electorate])
if Condorcet.scenarioType(electorate) == 'cycle':
condWinner = None
else:
condWinner = Condorcet.winnerSet([Condorcet.honBallot(v) for v in electorate])[0]
for method, strat, stratArgs in ms:
baseWinners = set(method.winnerSet([strat(v, polls=basePolls, electabilities=basePolls, **stratArgs)
for v in electorate], numWinners=nwinners))
for pert in perturbations:
for cand in range(ncand):
newPolls = basePolls.copy()
newPolls[cand] = min(1, max(0, newPolls[cand] + pert))
newWinners = set(method.winnerSet([strat(v, polls=newPolls, electabilities=newPolls, **stratArgs)
for v in electorate], numWinners=nwinners))
if newWinners != baseWinners:
if cand in newWinners and cand not in baseWinners:
changeType = 0
elif cand not in newWinners and cand in baseWinners:
changeType = 1
else: changeType = 2
totalResults[pert][method.__name__][changeType] += 1
if cand == condWinner:
condResults[pert][method.__name__][changeType] += 1
else:
nonCondResults[pert][method.__name__][changeType] += 1
return totalResults, condResults, nonCondResults