migrate scripts on macOS
This commit is contained in:
parent
9fd025d3a7
commit
da43bcc09a
34
calc_survivals.py
Normal file
34
calc_survivals.py
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
from island.match import Match
|
||||||
|
|
||||||
|
result = {}
|
||||||
|
|
||||||
|
for file in Path('wos-data-new').iterdir():
|
||||||
|
p = Path(file)
|
||||||
|
if p.suffix == '.json':
|
||||||
|
name = p.stem
|
||||||
|
m = Match.read_from_json(str(file))
|
||||||
|
info = m.query('game', 'created').select('info').first()['info']
|
||||||
|
conf = json.loads(info['config'])
|
||||||
|
game_end_at = int(info['game_end_at'])
|
||||||
|
survivals = {}
|
||||||
|
foods = {}
|
||||||
|
survivals[0] = []
|
||||||
|
for p in m.query('player', 'join').select('pid').raw_data:
|
||||||
|
foods[p['pid']] = conf['start_resource']
|
||||||
|
survivals[0].append(p['pid'])
|
||||||
|
|
||||||
|
for i in range(1, game_end_at+1):
|
||||||
|
survivals[i] = []
|
||||||
|
for a in m.query('action', 'done').where(lambda x: x['rno'] == i).raw_data:
|
||||||
|
foods[a['a']] += conf['payoffs']["%s%s"%(a['act_a'], a['act_b'])][0] * a['tr'] / 1440.0
|
||||||
|
foods[a['b']] += conf['payoffs']["%s%s"%(a['act_a'], a['act_b'])][1] * a['tr'] / 1440.0
|
||||||
|
for j in foods.keys():
|
||||||
|
foods[j] -= conf['rounds']['consumption']
|
||||||
|
if foods[j] > 0:
|
||||||
|
survivals[i].append(j)
|
||||||
|
|
||||||
|
result[name] = survivals
|
||||||
|
|
||||||
|
print(json.dumps(result))
|
||||||
52
comp_co_per_match.py
Normal file
52
comp_co_per_match.py
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
import json
|
||||||
|
from matplotlib import pyplot as plt
|
||||||
|
from island.match import Match
|
||||||
|
from island.matches import Matches
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
def calc_co(matches):
|
||||||
|
x = [0,0,0,0,0,0]
|
||||||
|
for j in range(len(matches.data)):
|
||||||
|
if len(matches.data[j].query('action', 'done').raw_data) < 5:
|
||||||
|
continue
|
||||||
|
coop = 0
|
||||||
|
rows = matches.data[j].query('action', 'done').raw_data
|
||||||
|
for row in rows:
|
||||||
|
if row['act_a'] == 'C' and row['act_b'] == 'C':
|
||||||
|
coop += 1
|
||||||
|
|
||||||
|
if rows:
|
||||||
|
per = float(coop) / len(rows)
|
||||||
|
x[int(per*100)//20] += 1
|
||||||
|
x[4] += x[5]
|
||||||
|
x.pop()
|
||||||
|
s = sum(x)
|
||||||
|
for i in range(5):
|
||||||
|
x[i] /= s
|
||||||
|
return x
|
||||||
|
|
||||||
|
casual = Matches('wos-data-casual')
|
||||||
|
compete = Matches('wos-data-new')
|
||||||
|
|
||||||
|
ca = calc_co(casual)
|
||||||
|
co = calc_co(compete)
|
||||||
|
|
||||||
|
fig = plt.figure(figsize=(5,4))
|
||||||
|
ax = fig.gca()
|
||||||
|
index = np.arange(5)
|
||||||
|
bar_width = 0.35
|
||||||
|
rects1 = ax.bar(index, ca, bar_width, color='#00b894', label='Casual games')
|
||||||
|
# rects2 = ax.bar(index + bar_width, co, bar_width, color='#005CAF', label='Competition')
|
||||||
|
rects2 = ax.bar(index + bar_width, co, bar_width, color='#6c5ce7', label='Competition')
|
||||||
|
|
||||||
|
ax.set_xticks(index + bar_width / 2)
|
||||||
|
ax.set_xticklabels(['0~0.2','0.2~0.4','0.4~0.6','0.6~0.8','0.8~1'])
|
||||||
|
ax.legend()
|
||||||
|
# fig.autofmt_xdate()
|
||||||
|
fig.set_size_inches(5, 4)
|
||||||
|
plt.xlabel('Frequency of Cooperation Actions per Match')
|
||||||
|
plt.ylabel('Fraction of Matches')
|
||||||
|
fig.tight_layout()
|
||||||
|
|
||||||
|
# plt.show()
|
||||||
|
plt.savefig('graph/comp_co_per_match.eps')
|
||||||
58
fail_reason.py
Normal file
58
fail_reason.py
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
import json
|
||||||
|
from matplotlib import pyplot as plt
|
||||||
|
from island.match import Match
|
||||||
|
from island.matches import Matches
|
||||||
|
|
||||||
|
matches = Matches('wos-data-casual')
|
||||||
|
|
||||||
|
labels = ['not enough tr', 'other reason']
|
||||||
|
percents = [0.0, 0.0]
|
||||||
|
|
||||||
|
op = 'D'
|
||||||
|
|
||||||
|
def get_reason(m, i, target):
|
||||||
|
r = m.query('action', 'request').where(lambda x: x['rno'] == i+1 and x['from'] == target).raw_data
|
||||||
|
rs = m.query('action', 'approve').where(lambda x: x['rno'] == i+1 and x['to'] == target).raw_data
|
||||||
|
rsn = [n['from'] for n in rs]
|
||||||
|
for j in r:
|
||||||
|
if j['to'] not in rsn:
|
||||||
|
tr = 1440
|
||||||
|
for k in m.query('action', 'request').where(lambda x: x['rno'] == i+1 and x['from'] == j['to']).raw_data:
|
||||||
|
tr -= k['tr']
|
||||||
|
for k in m.query('action', 'cancel').where(lambda x: x['rno'] == i+1 and x['from'] == j['to']).raw_data:
|
||||||
|
tr += m.query('action', 'request').where(lambda x: x['rno'] == i+1 and x['from'] == j['to'] and x['to'] == k['to'] and x['log_id'] < k['log_id']).orderby('log_id').raw_data[-1]['tr']
|
||||||
|
for k in m.query('action', 'deny').where(lambda x: x['rno'] == i+1 and x['to'] == j['to']).raw_data:
|
||||||
|
tr += m.query('action', 'request').where(lambda x: x['rno'] == i+1 and x['from'] == j['to'] and x['to'] == k['from'] and x['log_id'] < k['log_id']).orderby('log_id').raw_data[-1]['tr']
|
||||||
|
for k in m.query('action', 'approve').where(lambda x: x['rno'] == i+1 and x['from'] == j['to']).raw_data:
|
||||||
|
tr -= k['tr']
|
||||||
|
print(tr)
|
||||||
|
if tr >= j['tr']:
|
||||||
|
percents[1] += 1
|
||||||
|
else:
|
||||||
|
percents[0] += 1
|
||||||
|
|
||||||
|
|
||||||
|
for m in matches.data:
|
||||||
|
info = m.query('game', 'created').select('info').first()['info']
|
||||||
|
conf = json.loads(info['config'])
|
||||||
|
game_end_at = int(info['game_end_at'])
|
||||||
|
|
||||||
|
for i in range(1, game_end_at):
|
||||||
|
calced = set()
|
||||||
|
for row in m.query('action', 'done').where(lambda x: (x['act_a'] == op or x['act_b'] == op) and x['rno'] == i).raw_data:
|
||||||
|
if row['act_a'] == op and row['a'] not in calced:
|
||||||
|
get_reason(m, i, row['a'])
|
||||||
|
calced.add(row['a'])
|
||||||
|
if row['act_b'] == op and row['b'] not in calced:
|
||||||
|
get_reason(m, i, row['b'])
|
||||||
|
calced.add(row['b'])
|
||||||
|
|
||||||
|
_all = sum(percents) / 100
|
||||||
|
percents[0] /= _all
|
||||||
|
percents[1] /= _all
|
||||||
|
|
||||||
|
plt.figure()
|
||||||
|
plt.pie(percents, labels=labels, autopct='%1.2f%%', startangle=90)
|
||||||
|
plt.axis('equal') # Equal aspect ratio ensures that pie is drawn as a circle.
|
||||||
|
plt.show()
|
||||||
|
# plt.savefig('graph/unlink_has_neighbor.png')
|
||||||
110
neighbor_per_round.py
Normal file
110
neighbor_per_round.py
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
import json
|
||||||
|
from matplotlib import pyplot as plt
|
||||||
|
from island.match import Match
|
||||||
|
from island.matches import Matches
|
||||||
|
from numpy import mean, std
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
|
||||||
|
matches = Matches('wos-data-new')
|
||||||
|
max_round = 17
|
||||||
|
|
||||||
|
survivals = {}
|
||||||
|
with open('survivals.json', 'r') as f:
|
||||||
|
survivals = json.load(f)
|
||||||
|
|
||||||
|
neighbors = {}
|
||||||
|
|
||||||
|
cmean = []
|
||||||
|
dmean = []
|
||||||
|
cstd = []
|
||||||
|
dstd = []
|
||||||
|
|
||||||
|
|
||||||
|
for i in range(len(matches.data)):
|
||||||
|
m = matches.data[i]
|
||||||
|
n = {}
|
||||||
|
for r in m.query('neighbor', 'create').raw_data:
|
||||||
|
if r['a'] in n:
|
||||||
|
n[r['a']].append(r['b'])
|
||||||
|
else:
|
||||||
|
n[r['a']] = [r['b']]
|
||||||
|
|
||||||
|
if r['b'] in n:
|
||||||
|
n[r['b']].append(r['a'])
|
||||||
|
else:
|
||||||
|
n[r['b']] = [r['a']]
|
||||||
|
neighbors[matches.names[i]] = n
|
||||||
|
|
||||||
|
|
||||||
|
for i in range(max_round):
|
||||||
|
cneigh = []
|
||||||
|
dneigh = []
|
||||||
|
for j in range(len(matches.data)):
|
||||||
|
rows = matches.data[j].query('action', 'done').where(lambda x: x['rno']==i+1).raw_data
|
||||||
|
calced = set()
|
||||||
|
for row in rows:
|
||||||
|
if row['a'] not in calced:
|
||||||
|
nn = 0
|
||||||
|
for k in neighbors[matches.names[j]][row['a']]:
|
||||||
|
if k in survivals[matches.names[j]][str(i+1)]:
|
||||||
|
nn += 1
|
||||||
|
|
||||||
|
if row['act_a'] == 'C':
|
||||||
|
cneigh.append(nn)
|
||||||
|
else:
|
||||||
|
dneigh.append(nn)
|
||||||
|
|
||||||
|
calced.add(row['a'])
|
||||||
|
if row['b'] not in calced:
|
||||||
|
nn = 0
|
||||||
|
for k in neighbors[matches.names[j]][row['b']]:
|
||||||
|
if k in survivals[matches.names[j]][str(i+1)]:
|
||||||
|
nn += 1
|
||||||
|
|
||||||
|
if row['act_b'] == 'C':
|
||||||
|
cneigh.append(nn)
|
||||||
|
else:
|
||||||
|
dneigh.append(nn)
|
||||||
|
|
||||||
|
calced.add(row['b'])
|
||||||
|
|
||||||
|
if cneigh:
|
||||||
|
cm = mean(cneigh)
|
||||||
|
cs = std(cneigh)
|
||||||
|
else:
|
||||||
|
cm = 0
|
||||||
|
cs = 0
|
||||||
|
cmean.append(cm)
|
||||||
|
cstd.append(cs)
|
||||||
|
if dneigh:
|
||||||
|
dm = mean(dneigh)
|
||||||
|
ds = std(dneigh)
|
||||||
|
else:
|
||||||
|
dm = 0
|
||||||
|
ds = 0
|
||||||
|
dmean.append(dm)
|
||||||
|
dstd.append(ds)
|
||||||
|
|
||||||
|
|
||||||
|
fig, ax = plt.subplots()
|
||||||
|
index = np.arange(17)
|
||||||
|
bar_width = 0.35
|
||||||
|
opacity = 0.4
|
||||||
|
error_config = {'ecolor': '0.3', 'capsize': 4}
|
||||||
|
rects1 = ax.bar(index, cmean, bar_width,
|
||||||
|
alpha=opacity, color='b',
|
||||||
|
yerr=cstd, error_kw=error_config,
|
||||||
|
label='C')
|
||||||
|
rects2 = ax.bar(index + bar_width, dmean, bar_width,
|
||||||
|
alpha=opacity, color='r',
|
||||||
|
yerr=dstd, error_kw=error_config,
|
||||||
|
label='D')
|
||||||
|
# ax.set_xlabel('Group')
|
||||||
|
# ax.set_ylabel('Scores')
|
||||||
|
# ax.set_title('Scores by group and gender')
|
||||||
|
ax.set_xticks(index + bar_width / 2)
|
||||||
|
ax.set_xticklabels(index+1)
|
||||||
|
ax.legend()
|
||||||
|
fig.tight_layout()
|
||||||
|
plt.show()
|
||||||
121
request_success.py
Normal file
121
request_success.py
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
import json
|
||||||
|
from matplotlib import pyplot as plt
|
||||||
|
from island.match import Match
|
||||||
|
from island.matches import Matches
|
||||||
|
from numpy import mean, std
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
|
||||||
|
matches = Matches('wos-data-casual')
|
||||||
|
max_round = 17
|
||||||
|
|
||||||
|
c_req_suc_mean = []
|
||||||
|
d_req_suc_mean = []
|
||||||
|
c_req_suc_std = []
|
||||||
|
d_req_suc_std = []
|
||||||
|
|
||||||
|
c_req_fail_mean = []
|
||||||
|
d_req_fail_mean = []
|
||||||
|
c_req_fail_std = []
|
||||||
|
d_req_fail_std = []
|
||||||
|
|
||||||
|
for i in range(max_round):
|
||||||
|
cReSu = []
|
||||||
|
cReFa = []
|
||||||
|
dReSu = []
|
||||||
|
dReFa = []
|
||||||
|
for j in range(len(matches.data)):
|
||||||
|
rows = matches.data[j].query('action', 'done').where(lambda x: x['rno'] == i+1).raw_data
|
||||||
|
calced = set()
|
||||||
|
for row in rows:
|
||||||
|
if row['a'] not in calced:
|
||||||
|
r = matches.data[j].query('action', 'request').where(lambda x: x['rno'] == i+2 and x['from'] == row['a']).raw_data
|
||||||
|
rs = matches.data[j].query('action', 'approve').where(lambda x: x['rno'] == i+2 and x['to'] == row['a']).raw_data
|
||||||
|
if row['act_a'] == 'C':
|
||||||
|
cReSu.append(len(rs))
|
||||||
|
cReFa.append(len(r) - len(rs))
|
||||||
|
else:
|
||||||
|
dReSu.append(len(rs))
|
||||||
|
dReFa.append(len(r) - len(rs))
|
||||||
|
calced.add(row['a'])
|
||||||
|
|
||||||
|
if row['b'] not in calced:
|
||||||
|
r = matches.data[j].query('action', 'request').where(lambda x: x['rno'] == i+2 and x['from'] == row['b']).raw_data
|
||||||
|
rs = matches.data[j].query('action', 'approve').where(lambda x: x['rno'] == i+2 and x['to'] == row['b']).raw_data
|
||||||
|
if row['act_b'] == 'C':
|
||||||
|
cReSu.append(len(rs))
|
||||||
|
cReFa.append(len(r) - len(rs))
|
||||||
|
else:
|
||||||
|
dReSu.append(len(rs))
|
||||||
|
dReFa.append(len(r) - len(rs))
|
||||||
|
calced.add(row['b'])
|
||||||
|
|
||||||
|
if cReSu:
|
||||||
|
cm = mean(cReSu)
|
||||||
|
cs = std(cReSu)
|
||||||
|
else:
|
||||||
|
cm = 0
|
||||||
|
cs = 0
|
||||||
|
c_req_suc_mean.append(cm)
|
||||||
|
c_req_suc_std.append(cs)
|
||||||
|
|
||||||
|
if cReFa:
|
||||||
|
cm = mean(cReFa)
|
||||||
|
cs = std(cReFa)
|
||||||
|
else:
|
||||||
|
cm = 0
|
||||||
|
cs = 0
|
||||||
|
c_req_fail_mean.append(cm)
|
||||||
|
c_req_fail_std.append(cs)
|
||||||
|
|
||||||
|
if dReSu:
|
||||||
|
dm = mean(dReSu)
|
||||||
|
ds = std(dReSu)
|
||||||
|
else:
|
||||||
|
dm = 0
|
||||||
|
ds = 0
|
||||||
|
d_req_suc_mean.append(dm)
|
||||||
|
d_req_suc_std.append(ds)
|
||||||
|
|
||||||
|
if dReFa:
|
||||||
|
dm = mean(dReFa)
|
||||||
|
ds = std(dReFa)
|
||||||
|
else:
|
||||||
|
dm = 0
|
||||||
|
ds = 0
|
||||||
|
d_req_fail_mean.append(dm)
|
||||||
|
d_req_fail_std.append(ds)
|
||||||
|
|
||||||
|
fig, ax = plt.subplots()
|
||||||
|
index = np.arange(17)
|
||||||
|
bar_width = 0.35
|
||||||
|
opacity = 0.6
|
||||||
|
error_config = {'ecolor': '0.3', 'capsize': 4}
|
||||||
|
rects1 = ax.bar(index, c_req_suc_mean, bar_width,
|
||||||
|
alpha=opacity, color='g',
|
||||||
|
# yerr=c_req_suc_std, error_kw=error_config,
|
||||||
|
label='C-Req-Success')
|
||||||
|
rects2 = ax.bar(index, c_req_fail_mean, bar_width,
|
||||||
|
alpha=opacity, color='b',
|
||||||
|
# yerr=c_req_fail_std, error_kw=error_config,
|
||||||
|
bottom=c_req_suc_mean,
|
||||||
|
label='C-Req-Fail')
|
||||||
|
|
||||||
|
rects3 = ax.bar(index + bar_width, d_req_suc_mean, bar_width,
|
||||||
|
alpha=opacity, color='y',
|
||||||
|
# yerr=d_req_suc_mean, error_kw=error_config,
|
||||||
|
label='D-Req-Success')
|
||||||
|
|
||||||
|
rects4 = ax.bar(index + bar_width, d_req_fail_mean, bar_width,
|
||||||
|
alpha=opacity, color='r',
|
||||||
|
# yerr=d_req_fail_mean, error_kw=error_config,
|
||||||
|
bottom=d_req_suc_mean,
|
||||||
|
label='D-Req-Fail')
|
||||||
|
# ax.set_xlabel('Group')
|
||||||
|
# ax.set_ylabel('Scores')
|
||||||
|
# ax.set_title('Scores by group and gender')
|
||||||
|
ax.set_xticks(index + bar_width / 2)
|
||||||
|
ax.set_xticklabels(index+1)
|
||||||
|
ax.legend()
|
||||||
|
fig.tight_layout()
|
||||||
|
plt.show()
|
||||||
1
survivals.json
Normal file
1
survivals.json
Normal file
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user