|
| 1 | +import numpy as np |
| 2 | +import test_simulator |
| 3 | +from Simulator import Simulator |
| 4 | +import os |
| 5 | +from tqdm.contrib.concurrent import process_map |
| 6 | + |
| 7 | +def read_file(file_name): |
| 8 | + experiments = [] |
| 9 | + nr_experiments = 0 |
| 10 | + with open(file_name, mode='r') as csv_file: |
| 11 | + lines = csv_file.read().splitlines() |
| 12 | + for line in lines: |
| 13 | + if len(line) == 0: |
| 14 | + continue |
| 15 | + elif line[0] == '#': |
| 16 | + experiments.append({'name': line[1:], 'params': {}, 'players': [], 'changed_keys': {}}) |
| 17 | + read_ind = 1 |
| 18 | + nr_experiments = nr_experiments + 1 |
| 19 | + nr_players = 0 |
| 20 | + elif read_ind == 1: |
| 21 | + param_keys = line.split(', ') |
| 22 | + read_ind = read_ind + 1 |
| 23 | + elif read_ind == 2: |
| 24 | + param_values = line.split(', ') |
| 25 | + assert len(param_keys)==len(param_values), f"Missing values in parameters of experiment {nr_experiments}" |
| 26 | + for key_i in range(len(param_keys)): |
| 27 | + experiments[-1]['params'][param_keys[key_i]] = param_values[key_i] |
| 28 | + read_ind = read_ind + 1 |
| 29 | + elif read_ind == 3: |
| 30 | + read_ind = 0 |
| 31 | + keys = line.split(', ') |
| 32 | + nr_keys = len(keys) |
| 33 | + else: |
| 34 | + values = line.split(', ') |
| 35 | + assert len(values)==nr_keys, f"Missing values in player {nr_players} of experiment {nr_experiments}" |
| 36 | + params = {} |
| 37 | + for i in range(nr_keys): |
| 38 | + params[keys[i]] = values[i] |
| 39 | + params['id'] = nr_players |
| 40 | + experiments[-1]['players'].append(params) |
| 41 | + nr_players = nr_players + 1 |
| 42 | + return experiments |
| 43 | + |
| 44 | +def expand_players(experiments): |
| 45 | + for exp_i in range(len(experiments)): |
| 46 | + keys = list(experiments[exp_i]['players'][0].keys()) |
| 47 | + for pl_i in range(len(experiments[exp_i]['players'])): |
| 48 | + for key_i in range(len(keys)): |
| 49 | + param = experiments[exp_i]['players'][pl_i][keys[key_i]] |
| 50 | + if isinstance(param, str) and (';' in param or ':' in param): |
| 51 | + expanded_exp = [] |
| 52 | + if ':' in param: |
| 53 | + values = param.split(':') |
| 54 | + else: |
| 55 | + start, end, step = param.split(';') |
| 56 | + values = np.arange(float(start), float(end)+float(step), float(step)) |
| 57 | + for value in values: |
| 58 | + temp_exp = experiments[exp_i].copy() |
| 59 | + temp_exp['players'] = experiments[exp_i]['players'].copy() |
| 60 | + temp_exp['players'][pl_i] = experiments[exp_i]['players'][pl_i].copy() |
| 61 | + if not pl_i in temp_exp['changed_keys']: |
| 62 | + temp_exp['changed_keys'][pl_i] = [] |
| 63 | + if not keys[key_i] in temp_exp['changed_keys'][pl_i]: |
| 64 | + temp_exp['changed_keys'][pl_i].append(keys[key_i]) |
| 65 | + temp_exp['players'][pl_i][keys[key_i]] = value |
| 66 | + expanded_exp.append(temp_exp) |
| 67 | + if exp_i != 0: |
| 68 | + expanded_exp = experiments[:exp_i] + expanded_exp |
| 69 | + if exp_i != len(experiments)-1: |
| 70 | + expanded_exp = expanded_exp + experiments[exp_i+1:] |
| 71 | + return expand_players(expanded_exp) |
| 72 | + return experiments |
| 73 | + |
| 74 | +def convert_values(experiments): |
| 75 | + for exp in experiments: |
| 76 | + for param in exp['params']: |
| 77 | + if param in ['T', 'R', 'S', 'P']: |
| 78 | + exp['params'][param] = float(exp['params'][param]) |
| 79 | + elif param in ['grid_x', 'grid_y', 'epochs', 'runs']: |
| 80 | + exp['params'][param] = int(float(exp['params'][param])) |
| 81 | + else: |
| 82 | + assert False, f"Parameter {key} not implemented for experiments" |
| 83 | + for player in exp['players']: |
| 84 | + for key in player.keys(): |
| 85 | + if key in ['strat']: |
| 86 | + continue |
| 87 | + elif key in ['id', 'nr']: |
| 88 | + player[key] = int(float(player[key])) |
| 89 | + elif key in ['imit_prob', 'migrate_prob', 'omega']: |
| 90 | + player[key] = float(player[key]) |
| 91 | + else: |
| 92 | + assert False, f"Key {key} not implemented for experiments" |
| 93 | + #add changed keys to name |
| 94 | + player_changes = [] |
| 95 | + for p_i in range(len(exp['players'])): |
| 96 | + changes = [] |
| 97 | + if p_i in exp['changed_keys']: |
| 98 | + for key in exp['changed_keys'][p_i]: |
| 99 | + changes.append(f'{key}-{exp["players"][p_i][key]}') |
| 100 | + player_changes.append(f"{p_i}:{'_'.join(changes)}") |
| 101 | + exp['name'] = exp['name'] + ''.join([f'_({change})' for change in player_changes]) |
| 102 | + |
| 103 | + return experiments |
| 104 | + |
| 105 | +def class_name(player): |
| 106 | + return f"{player['strat']}_imitP-{player['imit_prob']}_migrateP-{player['migrate_prob']}_omega-{player['omega']}" |
| 107 | + |
| 108 | +def run_experiment(experiment): |
| 109 | + player_cfgs = [] |
| 110 | + classes = [] |
| 111 | + num_players = 0 |
| 112 | + for player in experiment['players']: |
| 113 | + player_class = class_name(player) |
| 114 | + for i in range(player['nr']): |
| 115 | + player_cfgs.append(test_simulator.generate_player(player['strat'], player_class, 1, 3, player['imit_prob'], player['migrate_prob'], player['omega'])) |
| 116 | + num_players = num_players + player['nr'] |
| 117 | + if player_class not in classes: |
| 118 | + classes.append(player_class) |
| 119 | + |
| 120 | + results = {''} |
| 121 | + for r in range(experiment['params']['runs']): |
| 122 | + sim = Simulator(experiment['params']['grid_x'], experiment['params']['grid_y'], num_players, 1, 3, player_cfgs, experiment['params']['T'], experiment['params']['R'], experiment['params']['S'], experiment['params']['P']) |
| 123 | + sim.simulate(experiment['params']['epochs'], visualize=False) |
| 124 | + state = sim.get_state() |
| 125 | + |
| 126 | + |
| 127 | + if not os.path.exists('data'): |
| 128 | + os.makedirs('data') |
| 129 | + with open(f"data/{experiment['name']}.csv", "w") as file: |
| 130 | + #Waiting for analysis rework --> no results saved yet |
| 131 | + file.write("Done\n") |
| 132 | + |
| 133 | + |
| 134 | +if __name__ == "__main__": |
| 135 | + experiments = read_file('experiments.csv') |
| 136 | + experiments = expand_players(experiments) |
| 137 | + experiments = convert_values(experiments) |
| 138 | + if False: |
| 139 | + for exp in experiments: |
| 140 | + print(exp) |
| 141 | + |
| 142 | + process_map(run_experiment, experiments) #max_workers=8 |
| 143 | + |
| 144 | + |
0 commit comments