@@ -139,15 +139,15 @@ def influentialBlocs(voters, method, numWinners=1, utilChange=0.1, numBuckets=5,
139
139
pollingMethod = method
140
140
pollingStrat = method .honBallot
141
141
basePollBallots = [pollingStrat (v , numWinners = numWinners , ** pollingStratArgs ) for v in voters ]
142
- pollErrors = [random .gauss (0 , pollingError / 2 ) for i in range (numCands )]
142
+ pollErrors = [random .gauss (0 , pollingError / 2 ) for _ in range (numCands )]
143
143
polls = [min (1 , max (0 , r + e )) for r , e in zip (pollingMethod .results (basePollBallots ), pollErrors )]
144
144
#polls = media(pollingMethod.results(pollBallots), pollingError) #method.results can't depend on numWinners; this may need to be changed
145
145
baseBallots = [strat (v , polls = polls , electabilities = polls , numWinners = numWinners , ** stratArgs ) for v in voters ]
146
146
if isinstance (sorter , type ):
147
147
sorter = sorter (voters )
148
148
baseWinners = method .winnerSet (baseBallots , numWinners )
149
149
baseResults = method .results (baseBallots )
150
- isIncentive = [[] for i in range (numCands )]
150
+ isIncentive = [[] for _ in range (numCands )]
151
151
#isIncentive[c][b] is 1 if candidate c is incentivized to appeal to the bth bucket of voters, 0 otherwise
152
152
for cand in range (numCands ):
153
153
utilShifts = [0 ]* numCands
@@ -205,7 +205,7 @@ def __init__(self, model, methodsAndStrats, nvot, ncand, niter, nwinners=1,
205
205
elif len (m ) == 2 :
206
206
ms .append ((m [0 ], m [1 ], {}))
207
207
else : ms .append (m )
208
- self .mNames = [m [0 ].__name__ + ':' + m [1 ].__name__ + str (m [2 ]) for m in ms ]
208
+ self .mNames = [f' { m [0 ].__name__ } : { m [1 ].__name__ } { str (m [2 ])} ' for m in ms ]
209
209
self .rows = []
210
210
args = (model , nvot , ncand , ms , nwinners , utilChange , numBuckets , sorter , pollingMethod , pollingError , pollAfterPert )
211
211
with multiprocessing .Pool (processes = 7 ) as pool :
@@ -233,7 +233,10 @@ def chart(self, methodOnly=True):
233
233
fig , ax = plt .subplots ()
234
234
incentFracts = self .summarize ()[0 ]
235
235
if methodOnly :
236
- incentFracts = {re .match (".*(?=:)" , name ).group (0 ): data for name , data in incentFracts .items ()}
236
+ incentFracts = {
237
+ re .match (".*(?=:)" , name )[0 ]: data
238
+ for name , data in incentFracts .items ()
239
+ }
237
240
for name , data in incentFracts .items ():
238
241
ax .plot ([i / self .numBuckets for i in range (1 , self .numBuckets + 1 )], data , label = name )
239
242
#ax.set_xlim(1, self.numBuckets)
@@ -258,16 +261,17 @@ def saveFile(self, baseName="cidResults", newFile=True):
258
261
fields = ['name' , 'baseResult' ] + list (range (self .numBuckets )) + list (universalInfo .keys ())
259
262
resultTypeIndices = {'all' : 1 , 'loss' : 2 , 'win' : 3 }
260
263
261
- myFile = open (baseName + (str (i ) if newFile else "" ) + ".csv" , "w" )
262
- dw = csv .DictWriter (myFile , fields , restval = "data missing" )
263
- dw .writeheader ()
264
- for outcome , index in resultTypeIndices .items ():
265
- for name , results in self .summarize ()[index ].items ():
266
- row = {'name' : name , 'baseResult' : outcome }
267
- row .update ({i : result for i , result in enumerate (results )})
268
- row .update (universalInfo )
269
- dw .writerow (row )
270
- myFile .close ()
264
+ with open (baseName + (str (i ) if newFile else "" ) + ".csv" , "w" ) as myFile :
265
+ dw = csv .DictWriter (myFile , fields , restval = "data missing" )
266
+ dw .writeheader ()
267
+ for outcome , index in resultTypeIndices .items ():
268
+ for name , results in self .summarize ()[index ].items ():
269
+ row = (
270
+ {'name' : name , 'baseResult' : outcome }
271
+ | enumerate (results )
272
+ | universalInfo
273
+ )
274
+ dw .writerow (row )
271
275
272
276
def simOneElectorate (model , nvot , ncand , ms , nwinners , utilChange , numBuckets , sorter ,
273
277
pollingMethod , pollingError , pollAfterPert , baseSeed = None , i = 0 ):
@@ -280,9 +284,17 @@ def simOneElectorate(model, nvot, ncand, ms, nwinners, utilChange, numBuckets, s
280
284
for method , strat , stratArgs in ms :
281
285
allIncentives , baseWinners , baseResults = influentialBlocs (electorate , method , nwinners , utilChange , numBuckets ,
282
286
sorter , strat , stratArgs , pollingMethod , pollAfterPert = pollAfterPert , pollingError = pollingError )
283
- for i , candIncentives in enumerate (allIncentives ):
284
- results .append (dict (incentives = candIncentives , isWinner = i in baseWinners ,
285
- method = method .__name__ , strat = strat .__name__ , stratArgs = stratArgs , voterModel = str (model )))
287
+ results .extend (
288
+ dict (
289
+ incentives = candIncentives ,
290
+ isWinner = i in baseWinners ,
291
+ method = method .__name__ ,
292
+ strat = strat .__name__ ,
293
+ stratArgs = stratArgs ,
294
+ voterModel = str (model ),
295
+ )
296
+ for i , candIncentives in enumerate (allIncentives )
297
+ )
286
298
return results
287
299
288
300
def showChart (fileName , norm = 1 , methodOnly = True , forResult = 'all' , percentages = True , wholeOnly = True ):
@@ -298,7 +310,7 @@ def showChart(fileName, norm=1, methodOnly=True, forResult='all', percentages=Tr
298
310
elif norm == 'max' :
299
311
normFactor = max (rawData )
300
312
data = [d / normFactor for d in rawData ]
301
- name = re .match (".*(?=:)" , row ['name' ]). group ( 0 ) if methodOnly else row ['name' ]
313
+ name = re .match (".*(?=:)" , row ['name' ])[ 0 ] if methodOnly else row ['name' ]
302
314
ax .plot ([(i + .5 )* 100 / buckets for i in range (buckets )], data , label = name )
303
315
ax .set_xlabel ("Voter's support for candidate" )
304
316
ax .set_ylabel ("Candidate's incentive to appeal to voter" )
@@ -308,9 +320,9 @@ def yFormatFunc(value, position):
308
320
if value == 1 : return "Average"
309
321
if value == 0 : return "0"
310
322
if wholeOnly :
311
- if value % 1 != 0 : return ""
312
- return f'{ int (value )} x Avg'
323
+ return "" if value % 1 != 0 else f'{ int (value )} x Avg'
313
324
return f'{ value :1.1f} x Avg'
325
+
314
326
ax .yaxis .set_major_formatter (mtick .FuncFormatter (yFormatFunc ))
315
327
ax .grid (True )
316
328
ax .legend ()
0 commit comments