diff --git a/calc_survivals.py b/calc_survivals.py new file mode 100644 index 0000000..59679ad --- /dev/null +++ b/calc_survivals.py @@ -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)) \ No newline at end of file diff --git a/comp_co_per_match.py b/comp_co_per_match.py new file mode 100644 index 0000000..49d8ecf --- /dev/null +++ b/comp_co_per_match.py @@ -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') \ No newline at end of file diff --git a/fail_reason.py b/fail_reason.py new file mode 100644 index 0000000..2eb85ef --- /dev/null +++ b/fail_reason.py @@ -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') \ No newline at end of file diff --git a/neighbor_per_round.py b/neighbor_per_round.py new file mode 100644 index 0000000..1171522 --- /dev/null +++ b/neighbor_per_round.py @@ -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() \ No newline at end of file diff --git a/request_success.py b/request_success.py new file mode 100644 index 0000000..343aff0 --- /dev/null +++ b/request_success.py @@ -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() \ No newline at end of file diff --git a/survivals.json b/survivals.json new file mode 100644 index 0000000..e5b9ed1 --- /dev/null +++ b/survivals.json @@ -0,0 +1 @@ +{"G349": {"0": [4558, 4559, 4560, 4561, 4562, 4563, 4564, 4565, 4566, 4567, 4568, 4569, 4570, 4571, 4572, 4573], "1": [4558, 4559, 4560, 4561, 4562, 4563, 4564, 4565, 4566, 4567, 4568, 4569, 4570, 4571, 4572, 4573], "2": [4558, 4559, 4562, 4565, 4566, 4567, 4568, 4569, 4570, 4572], "3": [4558, 4559, 4562, 4565, 4566, 4567, 4568, 4569, 4570, 4572], "4": [4558, 4559, 4562, 4565, 4566, 4567, 4568, 4570, 4572], "5": [4558, 4559, 4562, 4565, 4566, 4567, 4568, 4570, 4572], "6": [4558, 4559, 4562, 4565, 4570], "7": [4558, 4559, 4562], "8": [4558, 4559, 4562], "9": [4558, 4559], "10": [4558, 4559]}, "G86": {"0": [854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867], "1": [854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867], "2": [855, 856, 858, 859, 860, 861, 862, 863, 864], "3": [855, 856, 860], "4": [860], "5": [], "6": [], "7": [], "8": [], "9": [], "10": []}, "G295": {"0": [3481, 3482, 3483, 3484, 3485, 3486, 3487, 3488, 3489, 3490, 3491, 3492, 3493, 3494, 3495, 3497], "1": [3481, 3482, 3483, 3484, 3485, 3486, 3487, 3488, 3489, 3490, 3491, 3492, 3493, 3494, 3495, 3497], "2": [3481, 3482, 3483, 3484, 3487, 3488, 3490, 3491, 3492, 3494, 3495, 3497], "3": [3483, 3484, 3490, 3495], "4": [3483, 3495], "5": [3483, 3495], "6": [], "7": [], "8": [], "9": [], "10": [], "11": [], "12": [], "13": [], "14": []}, "G153": {"0": [1598, 1599, 1600], "1": [1598, 1599, 1600], "2": [], "3": [], "4": [], "5": [], "6": [], "7": [], "8": [], "9": [], "10": [], "11": [], "12": [], "13": [], "14": [], "15": []}, "G68": {"0": [685, 686, 687, 688, 689, 690], "1": [685, 686, 687, 688, 689, 690], "2": [], "3": [], "4": [], "5": [], "6": [], "7": [], "8": [], "9": [], "10": [], "11": [], "12": [], "13": [], "14": [], "15": [], "16": [], "17": []}, "G299": {"0": [3557, 3558, 3559, 3560, 3561, 3562, 3563, 3564, 3565, 3566, 3567, 3568, 3569, 3570, 3571, 3572, 3573, 3574, 3575], "1": [3557, 3558, 3559, 3560, 3561, 3562, 3563, 3564, 3565, 3566, 3567, 3568, 3569, 3570, 3571, 3572, 3573, 3574, 3575], "2": [3557, 3558, 3559, 3561, 3562, 3563, 3564, 3565, 3568, 3569, 3571, 3574, 3575], "3": [3557, 3558, 3559, 3562, 3563, 3564, 3565, 3568, 3569, 3574, 3575], "4": [3557, 3558, 3559, 3562, 3563, 3565, 3568, 3569, 3574, 3575], "5": [3557, 3558, 3559, 3562, 3563, 3574, 3575], "6": [3558, 3559, 3563, 3574, 3575], "7": [3558, 3559, 3563, 3575], "8": [3558, 3559, 3563, 3575], "9": [3558, 3559, 3563, 3575], "10": [3558, 3559, 3563, 3575], "11": [3558, 3559, 3563, 3575], "12": [3558, 3559, 3563, 3575]}, "G72": {"0": [721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731], "1": [721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731], "2": [726, 727], "3": [], "4": [], "5": [], "6": [], "7": [], "8": [], "9": [], "10": [], "11": [], "12": [], "13": [], "14": [], "15": []}, "G302": {"0": [3636, 3637, 3638, 3639, 3640, 3641, 3642, 3643, 3644, 3645, 3646, 3647, 3648, 3649, 3650, 3651], "1": [3636, 3637, 3638, 3639, 3640, 3641, 3642, 3643, 3644, 3645, 3646, 3647, 3648, 3649, 3650, 3651], "2": [3636, 3637, 3638, 3639, 3640, 3641, 3642, 3643, 3644, 3645, 3646, 3647, 3648, 3649, 3650, 3651], "3": [3636, 3638, 3639, 3640, 3641, 3642, 3644, 3645, 3647, 3649, 3650, 3651], "4": [3638, 3639, 3640, 3641, 3642, 3644, 3647, 3649, 3650, 3651], "5": [3638, 3639, 3640, 3641, 3642, 3647, 3649, 3650, 3651], "6": [3638, 3640, 3641, 3642, 3647, 3649, 3651], "7": [3638, 3640, 3641, 3642, 3647, 3649, 3651], "8": [3638, 3640, 3642, 3647, 3649, 3651], "9": [3638, 3640, 3642, 3647, 3649, 3651], "10": [3638, 3640, 3642, 3649, 3651], "11": [3638, 3642, 3649, 3651], "12": [3638, 3642, 3649, 3651], "13": [3638, 3649], "14": [3649], "15": [3649]}, "G75": {"0": [733, 734, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753], "1": [733, 734, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753], "2": [747, 750], "3": [747, 750], "4": [750], "5": [], "6": [], "7": [], "8": [], "9": [], "10": [], "11": [], "12": [], "13": [], "14": [], "15": []}, "G318": {"0": [3965, 3966, 3967, 3968, 3969, 3970, 3971, 3972, 3973, 3974, 3975, 3976, 3977, 3978, 3979], "1": [3965, 3966, 3967, 3968, 3969, 3970, 3971, 3972, 3973, 3974, 3975, 3976, 3977, 3978, 3979], "2": [3965, 3967, 3970, 3971, 3972, 3973, 3974, 3975, 3976, 3977, 3978], "3": [3965, 3967, 3970, 3971, 3972, 3973, 3974, 3975, 3976, 3977, 3978], "4": [3965, 3967, 3970, 3971, 3972, 3973, 3974, 3976, 3977, 3978], "5": [3965, 3967, 3970, 3971, 3973, 3974, 3976, 3978], "6": [3965, 3967, 3970, 3971, 3973, 3974, 3976], "7": [3965, 3967, 3970, 3971, 3973, 3974], "8": [3965, 3967, 3970, 3971, 3973, 3974], "9": [3965, 3967, 3970, 3971, 3973, 3974], "10": [3965, 3967, 3970, 3973], "11": [3965, 3967, 3970, 3973], "12": [3965, 3967, 3970, 3973]}, "G54": {"0": [551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564], "1": [551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564], "2": [], "3": [], "4": [], "5": [], "6": [], "7": [], "8": [], "9": [], "10": [], "11": [], "12": [], "13": [], "14": []}, "G285": {"0": [3397, 3398, 3399, 3400, 3401, 3402, 3403, 3404, 3405, 3406, 3407, 3408, 3409, 3410, 3411, 3413, 3414, 3415, 3416, 3417, 3437, 3438, 3439, 3440], "1": [3397, 3398, 3399, 3400, 3401, 3402, 3403, 3404, 3405, 3406, 3407, 3408, 3409, 3410, 3411, 3413, 3414, 3415, 3416, 3417, 3437, 3438, 3439, 3440], "2": [3397, 3398, 3399, 3400, 3401, 3402, 3404, 3406, 3407, 3408, 3409, 3411, 3414, 3415, 3416, 3437, 3439, 3440], "3": [3397, 3398, 3400, 3402, 3409, 3411, 3416], "4": [3397, 3398, 3409, 3411], "5": [3397, 3409, 3411], "6": [3409, 3411], "7": [3409, 3411], "8": [3409, 3411], "9": [3409, 3411], "10": [3409, 3411], "11": [3409, 3411], "12": [3409, 3411], "13": [3411], "14": []}, "G354": {"0": [4614, 4615, 4616, 4617, 4618, 4619, 4620, 4621, 4622, 4623, 4624, 4625, 4626, 4627, 4628, 4629, 4630], "1": [4614, 4615, 4616, 4617, 4618, 4619, 4620, 4621, 4622, 4623, 4624, 4625, 4626, 4627, 4628, 4629, 4630], "2": [4614, 4615, 4616, 4618, 4623, 4624, 4625, 4627, 4630], "3": [4614, 4615, 4616, 4618, 4623, 4624, 4625, 4627, 4630], "4": [4614, 4615, 4616, 4618, 4623, 4624, 4625, 4627], "5": [4614, 4615, 4616, 4618, 4623, 4624, 4625], "6": [4614, 4615, 4616, 4618, 4623, 4624], "7": [4614, 4615, 4616, 4618, 4623, 4624], "8": [4614, 4615, 4616, 4618, 4623, 4624], "9": [4614, 4615, 4616, 4618, 4623, 4624], "10": [4614, 4615, 4616, 4618, 4623, 4624], "11": [4614, 4615, 4616, 4618, 4623, 4624], "12": [4614, 4615, 4616, 4618, 4623, 4624]}, "G341": {"0": [4460, 4461, 4462, 4463, 4464, 4465, 4466, 4467, 4468, 4469, 4470, 4471, 4472, 4473, 4474, 4475, 4476, 4477], "1": [4460, 4461, 4462, 4463, 4464, 4465, 4466, 4467, 4468, 4469, 4470, 4471, 4472, 4473, 4474, 4475, 4476, 4477], "2": [4460, 4462, 4463, 4464, 4468, 4469, 4471, 4472, 4474, 4476], "3": [4460, 4462, 4463, 4464, 4468, 4471, 4472, 4474, 4476], "4": [4460, 4462, 4463, 4464, 4468, 4472, 4474, 4476], "5": [4462, 4463, 4464, 4468, 4472, 4474, 4476], "6": [4462, 4463, 4464, 4468, 4472, 4474, 4476], "7": [4462, 4463, 4464, 4468, 4472, 4474, 4476], "8": [4462, 4463, 4464, 4472, 4474, 4476], "9": [4462, 4463, 4464, 4472, 4474, 4476], "10": [4462, 4463, 4464, 4476]}, "G337": {"0": [4320, 4321, 4322, 4323, 4324, 4325, 4326, 4327, 4328, 4329, 4330, 4331, 4332, 4333, 4334, 4335, 4336, 4337, 4338, 4339], "1": [4320, 4321, 4322, 4323, 4324, 4325, 4326, 4327, 4328, 4329, 4330, 4331, 4332, 4333, 4334, 4335, 4336, 4337, 4338, 4339], "2": [4320, 4321, 4323, 4326, 4328, 4335, 4336, 4337, 4338, 4339], "3": [4320, 4321, 4323, 4326, 4335, 4336, 4337, 4338, 4339], "4": [4320, 4321, 4323, 4335, 4336, 4338, 4339], "5": [4320, 4321, 4323, 4335, 4336, 4338, 4339], "6": [4335, 4338, 4339], "7": [4338, 4339], "8": [4338, 4339], "9": [4338, 4339], "10": [4339], "11": [], "12": []}, "G272": {"0": [3156, 3157, 3158, 3159, 3160, 3161, 3162, 3163, 3164, 3165, 3166, 3167, 3168, 3169, 3170, 3171, 3172, 3173, 3174, 3175, 3176], "1": [3156, 3157, 3158, 3159, 3160, 3161, 3162, 3163, 3164, 3165, 3166, 3167, 3168, 3169, 3170, 3171, 3172, 3173, 3174, 3175, 3176], "2": [3156, 3157, 3158, 3160, 3161, 3162, 3163, 3166, 3167, 3168, 3170, 3171], "3": [3158, 3160, 3161, 3162, 3166, 3167, 3170], "4": [3158, 3160, 3166, 3167, 3170], "5": [3160, 3166, 3170], "6": [3160, 3166, 3170], "7": [3160, 3170], "8": [3160, 3170], "9": [3160, 3170], "10": [3160, 3170], "11": [3160, 3170], "12": [3160, 3170], "13": [3170]}, "G203": {"0": [2021, 2022, 2023, 2024, 2025], "1": [2021, 2022, 2023, 2024, 2025], "2": [2021, 2022, 2023, 2024], "3": [2021, 2022, 2023, 2024], "4": [2022, 2024], "5": [2022, 2024], "6": [2022, 2024], "7": [2022, 2024], "8": [], "9": [], "10": [], "11": [], "12": [], "13": [], "14": [], "15": []}, "G254": {"0": [2906, 2907, 2908, 2909, 2910, 2911, 2912, 2913, 2914, 2915], "1": [2906, 2907, 2908, 2909, 2910, 2911, 2912, 2913, 2914, 2915], "2": [2906, 2907, 2908, 2910, 2911, 2914, 2915], "3": [2906, 2910, 2911, 2914], "4": [2906, 2910, 2911, 2914], "5": [2906, 2910, 2911, 2914], "6": [2906, 2910, 2911, 2914], "7": [2906, 2910, 2911, 2914], "8": [2906, 2910, 2911, 2914], "9": [2906, 2910, 2911, 2914], "10": [2906, 2910, 2911, 2914], "11": [2910, 2911, 2914], "12": [2914], "13": [], "14": [], "15": []}, "G307": {"0": [3892, 3893, 3894, 3895, 3896, 3897, 3898, 3899, 3900, 3901, 3902, 3903, 3904], "1": [3892, 3893, 3894, 3895, 3896, 3897, 3898, 3899, 3900, 3901, 3902, 3903, 3904], "2": [3892, 3893, 3894, 3895, 3896, 3897, 3899, 3900, 3901, 3902, 3904], "3": [3892, 3893, 3894, 3896, 3897, 3899, 3900, 3901, 3902, 3904], "4": [3892, 3893, 3894, 3896, 3897, 3899, 3900, 3901, 3902, 3904], "5": [3892, 3893, 3894, 3896, 3899, 3901, 3902, 3904], "6": [3893, 3894, 3896, 3901, 3904], "7": [3893, 3894, 3896, 3901], "8": [3893, 3894, 3896, 3901], "9": [3893, 3894, 3896, 3901], "10": [3894, 3896, 3901], "11": [3894, 3896, 3901], "12": [3896, 3901], "13": [3896, 3901], "14": [3896, 3901]}}