Skip to content

Commit 6d418db

Browse files
new folder for saving the experimental data
experiments/{my_experiment}/data/{experiment_name}/{run}/
1 parent a5427a3 commit 6d418db

File tree

6 files changed

+62
-55
lines changed

6 files changed

+62
-55
lines changed

experiments/examples/consolidate_experiments.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import os
22

33
# set these variables according to your experiments #
4-
dirpath = '../'
4+
dirpath = 'data'
55
experiments_type = [
66
'default_experiment'
77
]
88
runs = 1
99
# set these variables according to your experiments #
1010

11+
1112
def build_headers(path):
1213

1314
print(path + "/all_measures.txt")
@@ -36,11 +37,12 @@ def build_headers(path):
3637

3738
return behavior_headers, phenotype_headers
3839

40+
3941
for exp in experiments_type:
4042
for run in range(1, runs+1):
4143

4244
print(exp, run)
43-
path = dirpath + str(exp) + '_' + str(run)
45+
path = os.path.join(dirpath, str(exp), str(run))
4446
behavior_headers, phenotype_headers = build_headers(path)
4547

4648
file_summary = open(path + "/all_measures.tsv", "a")

experiments/karines_experiments/consolidate_experiments.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@
22

33

44
# set these variables according to your experiments #
5-
dirpath = 'data/'
5+
dirpath = 'data'
66
experiments_type = [
77
'plane',
88
'lava'
99
]
1010
runs = 10
1111
# set these variables according to your experiments #
1212

13+
1314
def build_headers(path):
1415

1516
print(path + "/all_measures.txt")
@@ -38,11 +39,12 @@ def build_headers(path):
3839

3940
return behavior_headers, phenotype_headers
4041

42+
4143
for exp in experiments_type:
4244
for run in range(1, runs+1):
4345

4446
print(exp, run)
45-
path = dirpath + str(exp) + '_' + str(run)
47+
path = os.path.join(dirpath, str(exp), str(run))
4648
behavior_headers, phenotype_headers = build_headers(path)
4749

4850
file_summary = open(path + "/all_measures.tsv", "a")

experiments/karines_experiments/stuck-experiments_watchman.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
for exp in experiments_names:
2222
for run in range(0, runs):
2323

24-
path = dir_path + "/" + exp +'_'+str(run+1) + "/data_fullevolution/fitness"
24+
path = os.path.join(dir_path, exp, str(run+1), 'data_fullevolution', 'fitness')
2525
time_now = datetime.now()
2626
time_ago = time_now - timedelta(minutes=limit_of_minutes)
2727

pyrevolve/evolution/population.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -89,26 +89,26 @@ def _new_individual(self, genotype):
8989
individual.develop()
9090
self.conf.experiment_management.export_genotype(individual)
9191
self.conf.experiment_management.export_phenotype(individual)
92-
self.conf.experiment_management.export_phenotype_images('data_fullevolution/phenotype_images', individual)
93-
individual.phenotype.measure_phenotype(self.conf.experiment_name)
94-
individual.phenotype.export_phenotype_measurements(self.conf.experiment_name)
92+
self.conf.experiment_management.export_phenotype_images(os.path.join('data_fullevolution', 'phenotype_images'), individual)
93+
individual.phenotype.measure_phenotype()
94+
individual.phenotype.export_phenotype_measurements(self.conf.experiment_management.data_folder)
9595

9696
return individual
9797

9898
async def load_individual(self, id):
99-
path = 'experiments/'+self.conf.experiment_name
99+
data_path = self.conf.experiment_management.data_folder
100100
genotype = self.conf.genotype_constructor(self.conf.genotype_conf, id)
101-
genotype.load_genotype(f'{path}/data_fullevolution/genotypes/genotype_{id}.txt')
101+
genotype.load_genotype(os.path.join(data_path, 'genotypes', f'genotype_{id}.txt'))
102102

103103
individual = Individual(genotype)
104104
individual.develop()
105-
individual.phenotype.measure_phenotype(self.conf.experiment_name)
105+
individual.phenotype.measure_phenotype()
106106

107-
with open(os.path.join(path, 'data_fullevolution', 'fitness', f'fitness_{id}.txt')) as f:
107+
with open(os.path.join(data_path, 'fitness', f'fitness_{id}.txt')) as f:
108108
data = f.readlines()[0]
109109
individual.fitness = None if data == 'None' else float(data)
110110

111-
with open(os.path.join(path, 'data_fullevolution', 'descriptors', f'behavior_desc_{id}.txt')) as f:
111+
with open(os.path.join(data_path, 'descriptors', f'behavior_desc_{id}.txt')) as f:
112112
lines = f.readlines()
113113
if lines[0] == 'None':
114114
individual.phenotype._behavioural_measurements = None
@@ -135,8 +135,8 @@ async def load_snapshot(self, gen_num):
135135
Recovers all genotypes and fitnesses of robots in the lastest selected population
136136
:param gen_num: number of the generation snapshot to recover
137137
"""
138-
path = 'experiments/'+self.conf.experiment_name
139-
for r, d, f in os.walk(path +'/selectedpop_'+str(gen_num)):
138+
data_path = self.conf.experiment_management.experiment_folder
139+
for r, d, f in os.walk(data_path +'/selectedpop_'+str(gen_num)):
140140
for file in f:
141141
if 'body' in file:
142142
id = file.split('.')[0].split('_')[-2]+'_'+file.split('.')[0].split('_')[-1]

pyrevolve/experiment_management.py

Lines changed: 37 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -10,45 +10,49 @@ class ExperimentManagement:
1010

1111
def __init__(self, settings):
1212
self.settings = settings
13-
self.dirpath = os.path.join('experiments', self.settings.experiment_name)
13+
manager_folder = os.path.dirname(self.settings.manager)
14+
self._experiment_folder = os.path.join(manager_folder, 'data', self.settings.experiment_name, self.settings.run)
15+
self._data_folder = os.path.join(self._experiment_folder, 'data_fullevolution')
1416

1517
def create_exp_folders(self):
16-
if os.path.exists(self.dirpath):
17-
shutil.rmtree(self.dirpath)
18-
os.mkdir(self.dirpath)
19-
os.mkdir(self.dirpath+'/data_fullevolution')
20-
os.mkdir(self.dirpath+'/data_fullevolution/genotypes')
21-
os.mkdir(self.dirpath+'/data_fullevolution/phenotypes')
22-
os.mkdir(self.dirpath+'/data_fullevolution/descriptors')
23-
os.mkdir(self.dirpath+'/data_fullevolution/fitness')
24-
os.mkdir(self.dirpath+'/data_fullevolution/phenotype_images')
25-
os.mkdir(self.dirpath+'/data_fullevolution/failed_eval_robots')
26-
27-
def _experiment_folder(self):
28-
return self.dirpath
29-
30-
def _data_folder(self):
31-
return os.path.join(self.dirpath, 'data_fullevolution')
18+
if os.path.exists(self.experiment_folder):
19+
shutil.rmtree(self.experiment_folder)
20+
os.makedirs(self.experiment_folder)
21+
os.mkdir(self.data_folder)
22+
os.mkdir(os.path.join(self.data_folder, 'genotypes'))
23+
os.mkdir(os.path.join(self.data_folder, 'phenotypes'))
24+
os.mkdir(os.path.join(self.data_folder, 'descriptors'))
25+
os.mkdir(os.path.join(self.data_folder, 'fitness'))
26+
os.mkdir(os.path.join(self.data_folder, 'phenotype_images'))
27+
os.mkdir(os.path.join(self.data_folder, 'failed_eval_robots'))
28+
29+
@property
30+
def experiment_folder(self):
31+
return self._experiment_folder
32+
33+
@property
34+
def data_folder(self):
35+
return self._data_folder
3236

3337
def export_genotype(self, individual):
3438
if self.settings.recovery_enabled:
35-
individual.export_genotype(self._data_folder())
39+
individual.export_genotype(self.data_folder)
3640

3741
def export_phenotype(self, individual):
3842
if self.settings.export_phenotype:
39-
individual.export_phenotype(self._data_folder())
43+
individual.export_phenotype(self.data_folder)
4044

4145
def export_fitnesses(self, individuals):
42-
folder = self._data_folder()
46+
folder = self.data_folder
4347
for individual in individuals:
4448
individual.export_fitness(folder)
4549

4650
def export_fitness(self, individual):
47-
folder = os.path.join(self._data_folder(),'fitness')
51+
folder = os.path.join(self.data_folder, 'fitness')
4852
individual.export_fitness(folder)
4953

5054
def export_behavior_measures(self, _id, measures):
51-
filename = os.path.join(self._data_folder(), 'descriptors', f'behavior_desc_{_id}.txt')
55+
filename = os.path.join(self.data_folder, 'descriptors', f'behavior_desc_{_id}.txt')
5256
with open(filename, "w") as f:
5357
if measures is None:
5458
f.write(str(None))
@@ -57,17 +61,17 @@ def export_behavior_measures(self, _id, measures):
5761
f.write(f"{key} {val}\n")
5862

5963
def export_phenotype_images(self, dirpath, individual):
60-
individual.phenotype.render_body(self._experiment_folder() +'/'+dirpath+f'/body_{individual.phenotype.id}.png')
61-
individual.phenotype.render_brain(self._experiment_folder() +'/'+dirpath+f'/brain_{individual.phenotype.id}')
64+
individual.phenotype.render_body(os.path.join(self.experiment_folder, dirpath, f'body_{individual.phenotype.id}.png'))
65+
individual.phenotype.render_brain(os.path.join(self.experiment_folder, dirpath, f'brain_{individual.phenotype.id}.png'))
6266

6367
def export_failed_eval_robot(self, individual):
64-
individual.genotype.export_genotype(f'{self._data_folder()}/failed_eval_robots/genotype_{str(individual.phenotype.id)}.txt')
65-
individual.phenotype.save_file(f'{self._data_folder()}/failed_eval_robots/phenotype_{str(individual.phenotype.id)}.yaml')
66-
individual.phenotype.save_file(f'{self._data_folder()}/failed_eval_robots/phenotype_{str(individual.phenotype.id)}.sdf', conf_type='sdf')
68+
individual.genotype.export_genotype(os.path.join(self.data_folder, 'failed_eval_robots', f'genotype_{individual.phenotype.id}.txt'))
69+
individual.phenotype.save_file(os.path.join(self.data_folder, 'failed_eval_robots', f'phenotype_{individual.phenotype.id}.yaml'))
70+
individual.phenotype.save_file(os.path.join(self.data_folder, 'failed_eval_robots', f'phenotype_{individual.phenotype.id}.sdf'), conf_type='sdf')
6771

6872
def export_snapshots(self, individuals, gen_num):
6973
if self.settings.recovery_enabled:
70-
path = os.path.join(self._experiment_folder(), f'selectedpop_{gen_num}')
74+
path = os.path.join(self.experiment_folder, f'selectedpop_{gen_num}')
7175
if os.path.exists(path):
7276
shutil.rmtree(path)
7377
os.mkdir(path)
@@ -76,9 +80,9 @@ def export_snapshots(self, individuals, gen_num):
7680
logger.info(f'Exported snapshot {str(gen_num)} with {str(len(individuals))} individuals')
7781

7882
def experiment_is_new(self):
79-
if not os.path.exists(self._experiment_folder()):
83+
if not os.path.exists(self.experiment_folder):
8084
return True
81-
path, dirs, files = next(os.walk(os.path.join(self._data_folder(), 'fitness')))
85+
path, dirs, files = next(os.walk(os.path.join(self.data_folder, 'fitness')))
8286
if len(files) == 0:
8387
return True
8488
else:
@@ -87,10 +91,10 @@ def experiment_is_new(self):
8791
def read_recovery_state(self, population_size, offspring_size):
8892
snapshots = []
8993

90-
for r, d, f in os.walk(self._experiment_folder()):
94+
for r, d, f in os.walk(self.experiment_folder):
9195
for dir in d:
9296
if 'selectedpop' in dir:
93-
exported_files = len([name for name in os.listdir(os.path.join(self._experiment_folder(), dir)) if os.path.isfile(os.path.join(self._experiment_folder(), dir, name))])
97+
exported_files = len([name for name in os.listdir(os.path.join(self.experiment_folder, dir)) if os.path.isfile(os.path.join(self.experiment_folder, dir, name))])
9498
if exported_files == (population_size * 2): # body and brain files
9599
snapshots.append(int(dir.split('_')[1]))
96100

@@ -104,7 +108,7 @@ def read_recovery_state(self, population_size, offspring_size):
104108
n_robots = 0
105109

106110
robot_ids = []
107-
for r, d, f in os.walk(os.path.join(self._data_folder(), 'fitness')):
111+
for r, d, f in os.walk(os.path.join(self.data_folder, 'fitness')):
108112
for file in f:
109113
robot_ids.append(int(file.split('.')[0].split('_')[-1]))
110114
last_id = np.sort(robot_ids)[-1]

pyrevolve/revolve_bot/revolve_bot.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def measure_behaviour(self):
6868
"""
6969
pass
7070

71-
def measure_phenotype(self, experiment_name):
71+
def measure_phenotype(self):
7272
self._morphological_measurements = self.measure_body()
7373
self._brain_measurements = self.measure_brain()
7474
logger.info('Robot ' + str(self.id) + ' was measured.')
@@ -86,14 +86,13 @@ def measure_body(self):
8686
except Exception as e:
8787
logger.exception('Failed measuring body')
8888

89-
def export_phenotype_measurements(self, path):
90-
with open('experiments/' + path + '/data_fullevolution/descriptors/'
91-
+ 'phenotype_desc_' + str(self.id) + '.txt', 'w+') as file:
92-
# TODO this crashes
89+
def export_phenotype_measurements(self, data_path):
90+
filepath = os.path.join(data_path, 'descriptors', f'phenotype_desc_{self.id}.txt')
91+
with open(filepath, 'w+') as file:
9392
for key, value in self._morphological_measurements.measurements_to_dict().items():
94-
file.write('{} {}\n'.format(key, value))
93+
file.write(f'{key} {value}\n')
9594
for key, value in self._brain_measurements.measurements_to_dict().items():
96-
file.write('{} {}\n'.format(key, value))
95+
file.write(f'{key} {value}\n')
9796

9897
def measure_brain(self):
9998
"""

0 commit comments

Comments
 (0)