diff --git a/br_plot.py b/br_plot.py new file mode 100644 index 0000000..4d64978 --- /dev/null +++ b/br_plot.py @@ -0,0 +1,75 @@ +import numpy as np +from matplotlib import pyplot as plt +import scipy as sp +from scipy.stats import pearsonr +from matplotlib import markers +from sys import argv +blue = '#0984e3' +red = '#d63031' + +def error(f,x,y): + return sp.sum((f(x)-y)**2) + +def p2(e, rw, postfix, show=True, showline=True): + # p2散点图 + fig = plt.figure(figsize=(4, 3)) + ax = fig.gca() + if showline: + fp1,residuals,rank,sv,rcond = sp.polyfit(e, rw, 1, full=True) + print("残差:",residuals) + print('Model parameter:',fp1) + print("Other parameters: rank=%s, sv=%s, rcond=%s"%(str(rank), str(sv), str(rcond))) + f1 = sp.poly1d(fp1) + print("error= %f" % error(f1, e, rw)) + fx = sp.linspace(np.min(e), np.max(e), 2) + plt.plot(fx,f1(fx),linewidth=2,color=red, ls='--', zorder=0) + + plt.scatter(e, rw, color='white', edgecolors=blue, linewidths=2, zorder=101) + ax.set_xlabel(r'$TtD$', family='sans-serif', size=20) + ax.set_ylabel(r'Breaking Rate', family='sans-serif', size=20) + # ax.set_xlim(0, 1440) + # ax.set_xticks(sp.linspace(int(min(e)*0.9), int(max(e)*1.1), 4)) + ax.tick_params(labelsize=14) + ax.set_ylim(0, 0.6) + ax.set_yticks(sp.linspace(0, 0.6, 5)) + plt.tight_layout() + if show: + plt.show() + else: + plt.savefig("graph/eid_co_sca_%s.eps" % postfix) + + # 皮尔逊相关系数 + print("pearson: %f, p-value: %f" % pearsonr(e, rw)) + +def p2c(e,c,m,s): + p2(e,c,m,s,False) + +def plot(mode, show): + rw = np.loadtxt("outputs/BR_%s.csv" % mode, delimiter=',') + e = np.loadtxt("outputs/EID_%s.csv" % mode, delimiter=',') + + p2(e[:-1], rw[1:], mode, show) + + # if mode == 'SURVIVE': + # p2(e[:-1], rw[1:], mode, show) + # else: + # p2c(e[:-1], rw[1:], mode, show) + +if __name__ == '__main__': + # eid_plot c/s 1/2 t/f + mode = 'CLASSIC' if argv[1] == 'c' else 'SURVIVE' + show = argv[2] == 't' + plot(mode, show) + + """ +SURVIVE +残差: [ 0.06081364] +Model parameter: [ -3.54739130e-04 4.41956696e-01] +Other parameters: rank=2, sv=[ 1.40523958 0.15906514], rcond=3.10862446895e-15 +error= 0.060814 +pearson: -0.837958, p-value: 0.000183 + + +CLASSIC +pearson: 0.384519, p-value: 0.174626 + """ diff --git a/breaking_rate.py b/breaking_rate.py new file mode 100644 index 0000000..028e683 --- /dev/null +++ b/breaking_rate.py @@ -0,0 +1,27 @@ +import csv +import numpy as np +from island.match import Match +from island.matches import Matches + +def calc_and_save(mode): + matches = Matches.from_profile(mode) + ans = np.zeros(15) + div = np.zeros(15) + for m in matches.data: + maxr = int(m.query('game', 'created').first()['info']['game_end_at']) + for i in range(1, maxr): + rows = m.query('action', 'done').where(lambda x: x['rno']==i).raw_data + br = 0 + for r in rows: + if m.query('action', 'done').where(lambda x: x['rno']==i+1 and ((x['a']==r['a'] and x['b']==r['b']) or (x['a']==r['b'] and x['b']==r['a']))).count() == 0: + br += 1 + ans[i] += br + div[i] += len(rows) + div[np.where(div==0)[0]] = 1 + ans /= div + with open("outputs/BR_%s.csv"%mode, 'w') as f: + csv.writer(f).writerow(ans) + +if __name__ == '__main__': + calc_and_save('CLASSIC') + calc_and_save('SURVIVE') diff --git a/outputs/BR_CLASSIC.csv b/outputs/BR_CLASSIC.csv new file mode 100644 index 0000000..9efa6ec --- /dev/null +++ b/outputs/BR_CLASSIC.csv @@ -0,0 +1 @@ +0.0,0.268817204301,0.194871794872,0.161764705882,0.144278606965,0.147058823529,0.127962085308,0.148325358852,0.0873786407767,0.111111111111,0.0903225806452,0.120967741935,0.102803738318,0.0833333333333,0.0 diff --git a/outputs/BR_SURVIVE.csv b/outputs/BR_SURVIVE.csv new file mode 100644 index 0000000..bb47e25 --- /dev/null +++ b/outputs/BR_SURVIVE.csv @@ -0,0 +1 @@ +0.0,0.378205128205,0.40625,0.237442922374,0.167539267016,0.121951219512,0.148648648649,0.0625,0.0166666666667,0.0508474576271,0.0779220779221,0.0740740740741,0.25,0.9,0.25 diff --git a/outputs/EID_CLASSIC.csv b/outputs/EID_CLASSIC.csv index 4f27f55..96f96c1 100644 --- a/outputs/EID_CLASSIC.csv +++ b/outputs/EID_CLASSIC.csv @@ -1 +1 @@ -108.837209302,-33.488372093,-66.976744186,8.37209302326,-64.1860465116,-78.1395348837,-61.3953488372,-29.3023255814,-118.604651163,-127.741935484,-198.445229682,-110.769230769,-176.115107914,-564.705882353,0.0 +108.837209302,-33.488372093,-66.976744186,8.37209302326,-64.1860465116,-78.1395348837,-61.3953488372,-29.3023255814,-118.604651163,-127.741935484,-198.445229682,-110.769230769,-176.115107914,-564.705882353,0.0 diff --git a/outputs/EID_SURVIVE.csv b/outputs/EID_SURVIVE.csv index b7f7252..65d5bfe 100644 --- a/outputs/EID_SURVIVE.csv +++ b/outputs/EID_SURVIVE.csv @@ -1 +1 @@ --737.628803245,-800.8735363,-1231.79775281,-1322.91139241,-1377.45454545,-1382.1686747,-1373.72384937,-1433.71179039,-1426.54205607,-1408.92086331,-1440.0,-1440.0,-600.0,-1440.0,0.0 +-737.628803245,-800.8735363,-1231.79775281,-1322.91139241,-1377.45454545,-1382.1686747,-1373.72384937,-1433.71179039,-1426.54205607,-1408.92086331,-1440.0,-1440.0,-600.0,-1440.0,0.0 diff --git a/rewiring_rate.py b/rewiring_rate.py deleted file mode 100644 index 1f6fc5a..0000000 --- a/rewiring_rate.py +++ /dev/null @@ -1,196 +0,0 @@ -import json -from matplotlib import pyplot as plt -from island.match import Match -from island.matches import Matches -import numpy as np -import scipy as sp -from scipy.stats import pearsonr -from matplotlib import markers - -def error(f,x,y): - return sp.sum((f(x)-y)**2) - -def p1(x, rewires, tau, postfix, show): - fig = plt.figure(figsize=(6.4, 3.6)) - ax = fig.gca() - ax.plot(x, rewires, color=green, linewidth=3) - ax.set_ylim(0, 0.5) - ax2 = ax.twinx() - ax2.plot(x, tau, color=red, linewidth=3) - ax2.set_ylim(0, 1440) - ax.set_xlim(2, 15) - ax.set_xlabel("Rounds") - ax.set_ylabel("Rewiring Rate", color=green) - ax.tick_params(axis='y', labelcolor=green) - ax2.set_ylabel("$\\tau_{p}$", family='sans-serif', color=red) - ax2.tick_params(axis='y', labelcolor=red) - - plt.tight_layout() - if show: - plt.show() - else: - plt.savefig("graph/tau_p_rewire_plot_%s.eps" % postfix) - - -def p2c(tau, rewires, show): - # # p2散点图 - fig = plt.figure(figsize=(4, 3)) - ax = fig.gca() - - plt.scatter(tau, rewires, color=green, linewidths=2, zorder=100) - ax.set_xlabel('$\\tau_{f}$', family='sans-serif', size=20) - ax.set_ylabel('Rewiring Rate', size=20) - ax.set_xlim(0, 1440) - ax.set_ylim(0, 0.6) - ax.set_xticks(sp.linspace(0, 1440, 5)) - ax.tick_params(labelsize=14) - ax.set_ylim(0, 0.6) - ax.set_yticks(sp.linspace(0, 0.6, 5)) - plt.tight_layout() - if show: - plt.show() - else: - plt.savefig("graph/tau_f_rewire_sca_c.eps") - - # 皮尔逊相关系数 - print("pearson: %f, p-value: %f" % pearsonr(tau, rewires)) - -def p2(tau, rewires, postfix, show): - # # p2散点图 - fig = plt.figure(figsize=(4, 3)) - ax = fig.gca() - fp1,residuals,rank,sv,rcond = sp.polyfit(tau, rewires, 1, full=True) - print("残差:",residuals) - print('Model parameter:',fp1) - f1 = sp.poly1d(fp1) - print("error= %f" % error(f1, tau, rewires)) - print("Other parameters: rank=%s, sv=%s, rcond=%s" % (str(rank), str(sv), str(rcond))) - # fx = sp.linspace(0,max(tau2),1000) - fx = sp.linspace(0,1440,2) - - plt.plot(fx,f1(fx),linewidth=2,color=red, ls='--', zorder=0) - plt.scatter(tau, rewires, color=green, linewidths=2, zorder=100) - # plt.scatter(tau_r, coopr_r, color='white', edgecolors=green, linewidths=2, zorder=101) - ax.set_xlabel('$\\tau_{f}$', family='sans-serif', size=20) - ax.set_ylabel('Rewiring Rate', size=20) - ax.set_xlim(0, 1440) - ax.set_ylim(0, 0.6) - ax.set_xticks(sp.linspace(0, 1440, 5)) - ax.tick_params(labelsize=14) - ax.set_ylim(0, 0.6) - ax.set_yticks(sp.linspace(0, 0.6, 5)) - plt.tight_layout() - if show: - plt.show() - else: - plt.savefig("graph/tau_f_rewire_sca_%s.eps" % postfix) - - # 皮尔逊相关系数 - print("pearson: %f, p-value: %f" % pearsonr(tau, rewires)) - - -if __name__ == '__main__': - mode = 'CLASSIC' - matches = Matches.from_profile_expr(lambda r: mode in r) - max_round = 15 - - survivals = {} - with open('survivals.json', 'r') as f: - survivals = json.load(f) - - neighbors = {} - rewires = [] - x = np.arange(2, max_round+1) - mwRe = {} # Match-wise frequency of rewiring - mwTau = {} # Match-wise Tau - tau = [] - - 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(1, max_round): - re = [] - for j in range(len(matches.data)): - rewire = 0 - rows = matches.data[j].query('action', 'done').where(lambda x: x['rno']==i+1).raw_data - for r in rows: - if matches.data[j].query('action', 'done').where(lambda x: x['rno']==i and ((x['a']==r['a'] and x['b']==r['b']) or (x['a']==r['b'] and x['b']==r['a']))).count() == 0: - rewire += 1 - - if rows: - re.append(float(rewire) / float(len(rows)*2)) - mwRe["%s-%d"%(j,i)] = re[-1] - if re: - rewires.append(np.average(re)) - - - for i in range(1, max_round): - tp = [] - for j in range(len(matches.data)): - if i == 0: - for r in matches.data[j].query('player', 'join').raw_data: - t = 0 - k = r['pid'] - if k not in neighbors[matches.names[j]]: - print("[%s(%d)] alone: %d" % (matches.names[j], i+1, k)) - else: - t = 1440 * len(neighbors[matches.names[j]][k]) - tp.append(t if t < 1440 else 1440) - mwTau["%s-%d"%(j,i)] = tp[-1] - else: - if str(i) not in survivals[matches.names[j]]: - continue - for k in survivals[matches.names[j]][str(i)]: - t = 0 - if k not in neighbors[matches.names[j]]: - print("[%s(%d)] alone: %d" % (matches.names[j], i+1, k)) - else: - trs = matches.data[j].get_tr(i, k, neighbors[matches.names[j]][k], survivals[matches.names[j]][str(i)]) - for l in neighbors[matches.names[j]][k]: - if l in trs and trs[l] > 0: - t += trs[l] - tp.append(t if t < 1440 else 1440) - mwTau["%s-%d"%(j,i)] = tp[-1] - - if tp: - tau.append(np.average(tp)) - else: - tau.append(0) - - - green = '#00b894' - red = '#d63031' - - # p1折线图 - # p1(x, rewires, tau, mode, True) - p2c(tau, rewires, False) - # p2(tau[:12], rewires[:12], mode, False) - - -''' -classic -残差: [ 0.05873797] -Model parameter: [ 9.81549075e-04 -9.87729952e-01] -error= 0.058738 -Other parameters: rank=2, sv=[ 1.41291267 0.06064473], rcond=3.10862446895e-15 -pearson: -0.507660, p-value: 0.063859 - -survive -残差: [ 0.00291864] -Model parameter: [ 0.0001647 -0.02264606] -error= 0.002919 -Other parameters: rank=2, sv=[ 1.33444456 0.46824962], rcond=2.6645352591e-15 -pearson: 0.947474, p-value: 0.000003 -'''