Skip to content

Commit d211679

Browse files
committed
Merge pull request #80 from clarencecastillo/master
Fixed unpredictable exec lines in database_calls when run on py3 and optimised file writing in analytics
2 parents ac3e4ab + dfe88f3 commit d211679

2 files changed

Lines changed: 56 additions & 49 deletions

File tree

dose/analytics.py

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -112,27 +112,28 @@ def analyze_individual_status_by_generation(self, csv_output, status,
112112
aggregate_functions = None,
113113
generations = 'all'):
114114
print('\n[INDIVIDUAL ' + status.upper() + ' STATUS ANALYSIS]')
115-
print('Opening outputfile: ' + csv_output + '...')
116-
outputfile = open(csv_output, 'w')
117115
print('Getting population size...')
118116
pop_size = \
119117
database_calls.db_reconstruct_simulation_parameters(self.cur,
120118
self.starting_time)['population_size']
119+
print('Constructing generations list...')
120+
if generations == 'all':
121+
generation_list = database_calls.db_list_generations(self.cur,
122+
self.starting_time)
123+
else:
124+
generation_list = [str(gen) for gen in generations]
125+
print('Preparing outputfile: ' + csv_output + '...')
126+
outputfile = open(csv_output, 'w')
121127
print('Writing outputfile header...')
122128
header = ['Generation'] + [str(i) for i in range(1, pop_size + 1)]
123129
if aggregate_functions != None:
124130
header = header + \
125131
[key for key in list(aggregate_functions.keys())]
126132
outputfile.write(','.join(header) + '\n')
133+
outputfile.close()
127134
print('Starting main analysis...')
128-
if generations == 'all':
129-
generation_list = database_calls.db_list_generations(self.cur,
130-
self.starting_time)
131-
else:
132-
generation_list = [str(gen) for gen in generations]
133135
for generation in generation_list:
134136
print('Analyzing generation ' + str(generation) + '...')
135-
print()
136137
status_list = \
137138
[status_analysis(stat)
138139
for stat in self.get_individual_status_list_by_generation(status, generation)]
@@ -141,22 +142,25 @@ def analyze_individual_status_by_generation(self, csv_output, status,
141142
if aggregate_functions != None:
142143
for key in list(aggregate_functions.keys()):
143144
status_row.append(str(aggregate_functions[key](status_list)))
145+
outputfile = open(csv_output, 'a')
144146
outputfile.write(','.join(status_row) + '\n')
147+
outputfile.close()
148+
145149
print('\nIndividual [' + status + '] analysis complete!')
146150

147151
def analyze_status_group_count_by_generation(self, csv_output, status,
148152
stats,
149153
aggregate_functions = None,
150154
generations = 'all'):
151155
print('\n[' + status.upper() + ' STATUS GROUP COUNT ANALYSIS]')
152-
print('Opening outputfile: ' + csv_output + '...')
153-
outputfile = open(csv_output, 'w')
154156
print('Constructing generations list...')
155157
if generations == 'all':
156158
generation_list = database_calls.db_list_generations(self.cur,
157159
self.starting_time)
158160
else:
159161
generation_list = generations
162+
print('Preparing outputfile: ' + csv_output + '...')
163+
outputfile = open(csv_output, 'w')
160164
print('Writing outputfile header...')
161165
header = [str(stat).replace(", ","-") for stat in stats]
162166
if aggregate_functions == None:
@@ -165,10 +169,10 @@ def analyze_status_group_count_by_generation(self, csv_output, status,
165169
header = ['Generation'] + header + \
166170
[key for key in list(aggregate_functions.keys())]
167171
outputfile.write(','.join(header) + '\n')
172+
outputfile.close()
168173
print('Starting main analysis...')
169174
for generation in generation_list:
170175
print('Analyzing generation ' + str(generation) + '...')
171-
print()
172176
status_list = \
173177
self.get_individual_status_list_by_generation(status,
174178
generation)
@@ -178,31 +182,34 @@ def analyze_status_group_count_by_generation(self, csv_output, status,
178182
if aggregate_functions != None:
179183
for key in list(aggregate_functions.keys()):
180184
status_row.append(str(aggregate_functions[key]([status_list.count(target_stat) for target_stat in stats])))
181-
outputfile.write(','.join(status_row) + '\n')
185+
outputfile = open(csv_output, 'a')
186+
outputfile.write(','.join(status_row) + '\n')
187+
outputfile.close()
182188
print('\nGrouped [' + status + '] count analysis complete!')
183189

184190
def analyze_individual_genomes_by_generation(self, csv_output,
185191
genome_analysis,
186192
aggregate_functions = None,
187193
generations = 'all'):
188194
print('\n[INDIVIDUAL GENOME ANALYSIS]')
189-
print('Opening outputfile: ' + csv_output + '...')
190-
outputfile = open(csv_output, 'w')
191195
print('Getting population size...')
192196
pop_size = database_calls.db_reconstruct_simulation_parameters(self.cur, self.starting_time)['population_size']
197+
print('Constructing generations list...')
198+
if generations == 'all':
199+
generation_list = database_calls.db_list_generations(self.cur, self.starting_time)
200+
else:
201+
generation_list = generations
202+
print('Preparing outputfile: ' + csv_output + '...')
203+
outputfile = open(csv_output, 'w')
193204
print('Writing outputfile header...')
194205
header = ['Generation'] + [str(i) for i in range(1, pop_size + 1)]
195206
if aggregate_functions != None:
196207
header = header + [key for key in list(aggregate_functions.keys())]
197208
outputfile.write(','.join(header) + '\n')
209+
outputfile.close()
198210
print('Starting main analysis...')
199-
if generations == 'all':
200-
generation_list = database_calls.db_list_generations(self.cur, self.starting_time)
201-
else:
202-
generation_list = generations
203211
for generation in generation_list:
204212
print('Analyzing generation ' + str(generation) + '...')
205-
print()
206213
genome_list = [genome_analysis(genome)
207214
for genome in self.get_individual_genome_list_by_generation(generation)]
208215
status_row = [str(generation)] + \
@@ -211,7 +218,9 @@ def analyze_individual_genomes_by_generation(self, csv_output,
211218
if aggregate_functions != None:
212219
for key in list(aggregate_functions.keys()):
213220
status_row.append(str(aggregate_functions[key](genome_list)))
221+
outputfile = open(csv_output, 'a')
214222
outputfile.write(','.join(status_row) + '\n')
223+
outputfile.close()
215224
print('\nIndividual genome analysis complete!')
216225

217226
def analyze_status_group_genome_by_generation(self, csv_output,
@@ -220,13 +229,13 @@ def analyze_status_group_genome_by_generation(self, csv_output,
220229
aggregate_functions = None,
221230
generations = 'all'):
222231
print('\n[' + status.upper() + ' STATUS GROUP GENOME ANALYSIS]')
223-
print('Opening outputfile: ' + csv_output + '...')
224-
outputfile = open(csv_output, 'w')
225232
print('Constructing generations list...')
226233
if generations == 'all':
227234
generation_list = database_calls.db_list_generations(self.cur, self.starting_time)
228235
else:
229236
generation_list = generations
237+
print('Preparing outputfile: ' + csv_output + '...')
238+
outputfile = open(csv_output, 'w')
230239
print('Writing outputfile header...')
231240
header = [str(stat).replace(", ","-") for stat in stats]
232241
if aggregate_functions == None:
@@ -235,10 +244,10 @@ def analyze_status_group_genome_by_generation(self, csv_output,
235244
header = ['Generation'] + header + \
236245
[key for key in list(aggregate_functions.keys())]
237246
outputfile.write(','.join(header) + '\n')
247+
outputfile.close()
238248
print('Starting main analysis...')
239249
for generation in generation_list:
240250
print('Analyzing generation ' + str(generation) + '...')
241-
print()
242251
analyzed_genome_list = \
243252
[genome_analysis(self.get_status_group_genome_by_generation(status,
244253
target_status, generation))
@@ -249,5 +258,7 @@ def analyze_status_group_genome_by_generation(self, csv_output,
249258
if aggregate_functions != None:
250259
for key in list(aggregate_functions.keys()):
251260
status_row.append(str(aggregate_functions[key](analyzed_genome_list)))
252-
outputfile.write(','.join(status_row) + '\n')
261+
outputfile = open(csv_output, 'a')
262+
outputfile.write(','.join(status_row) + '\n')
263+
outputfile.close()
253264
print('\nGrouped [' + status + '] genome analysis complete!')

dose/database_calls.py

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
44
Date created: 10th October 2013
55
'''
6-
import os, copy
6+
import os, copy, ast
77
import sqlite3 as s
88

99
def connect_database(dbpath, sim_parameters=None):
@@ -434,15 +434,13 @@ def db_reconstruct_simulation_parameters(cur, start_time):
434434
start_time = '%s'" % start_time)
435435
for r in cur.fetchall():
436436
if str(r[0]) == 'population_names':
437-
value = str(r[1]).split('|')
438-
exec("parameters['population_names'] = %s" % str(value))
437+
parameters['population_names'] = str(r[1]).split('|')
439438
elif str(r[0]) == 'population_locations':
440-
exec("parameters['population_locations'] = %s" % str(r[1]))
439+
parameters['population_locations'] = r[1]
441440
elif str(r[0]) == 'deployment_code':
442441
parameters['deployment_code'] = int(r[1])
443442
elif str(r[0]) == 'chromosome_bases':
444-
value = str(r[1]).split('|')
445-
exec("parameters['chromosome_bases'] = %s" % str(value))
443+
parameters['chromosome_bases'] = str(r[1]).split('|')
446444
elif str(r[0]) == 'background_mutation':
447445
parameters['background_mutation'] = float(r[1])
448446
elif str(r[0]) == 'additional_mutation':
@@ -456,9 +454,9 @@ def db_reconstruct_simulation_parameters(cur, start_time):
456454
elif str(r[0]) == 'max_tape_length':
457455
parameters['max_tape_length'] = int(r[1])
458456
elif str(r[0]) == 'clean_cell':
459-
exec("parameters['clean_cell'] = %s" % str(r[1]))
457+
parameters['clean_cell'] = r[1]
460458
elif str(r[0]) == 'interpret_chromosome':
461-
exec("parameters['interpret_chromosome'] = %s" % str(r[1]))
459+
parameters['interpret_chromosome'] = r[1]
462460
elif str(r[0]) == 'max_codon':
463461
parameters['max_codon'] = int(r[1])
464462
elif str(r[0]) == 'population_size':
@@ -473,7 +471,7 @@ def db_reconstruct_simulation_parameters(cur, start_time):
473471
parameters['world_z'] = int(r[1])
474472
elif str(r[0]) == 'goal':
475473
try: parameters['goal'] = float(r[1])
476-
except ValueError: exec("parameters['goal'] = %s" % str(r[1]))
474+
except: parameters['goal'] = r[1]
477475
elif str(r[0]) == 'maximum_generations':
478476
parameters['maximum_generations'] = int(r[1])
479477
elif str(r[0]) == 'fossilized_ratio':
@@ -487,8 +485,7 @@ def db_reconstruct_simulation_parameters(cur, start_time):
487485
if version == '0.1': parameters['ragaraja_version'] = 0.1
488486
else: parameters['ragaraja_version'] = int(r[1])
489487
elif str(r[0]) == 'ragaraja_instructions':
490-
value = str(r[1]).split('|')
491-
exec("parameters['ragaraja_instructions'] = %s" % str(value))
488+
parameters['ragaraja_instructions'] = str(r[1]).split('|')
492489
elif str(r[0]) == 'eco_buried_frequency':
493490
parameters['eco_buried_frequency'] = int(r[1])
494491
elif str(r[0]) == 'database_file':
@@ -540,7 +537,7 @@ def db_reconstruct_world(cur, start_time, generation):
540537
z = int(r[2])
541538
key = str(r[3])
542539
value = str(r[4])
543-
exec("ecosystem[%i][%i][%i]['%s'] = %s" % (x, y, z, key, value))
540+
ecosystem[x][y][z][key] = value
544541
World = dose_world.World(1, 1, 1)
545542
World.ecosystem = ecosystem
546543
return World
@@ -584,36 +581,33 @@ def db_reconstruct_organisms(cur, start_time, population_name, generation):
584581
key = str(r[0])
585582
value = str(r[1])
586583
if key == 'alive':
587-
exec("org.status['alive'] = %s" % str(value))
584+
org.status['alive'] = value
588585
elif key == 'vitality':
589586
org.status['vitality'] = float(value)
590587
elif key == 'parents':
591588
if value == '': value = '[]'
592589
else: value = value.split('|')
593-
exec("org.status['parents'] = %s" % str(value))
590+
org.status['parents'] = value
594591
elif key == 'age':
595592
org.status['age'] = float(value)
596593
elif key == 'gender':
597-
exec("org.status['gender'] = %s" % str(value))
594+
org.status['gender'] = value
598595
elif key == 'lifespan':
599596
org.status['lifespan'] = float(value)
600597
elif key == 'fitness':
601-
exec("f = '%s'" % str(value))
602-
if type(f) == type(1) or type(f) == type(1.0):
603-
org.status['fitness'] = float(value)
604-
else:
605-
exec("org.status['fitness'] = %s" % str(value))
598+
try: org.status['fitness'] = ast.literal_eval(value)
599+
except: org.status['fitness'] = value
606600
elif key == 'blood':
607601
if value == '': value = '[]'
608602
else: value = value.split('|')
609-
exec("org.status['blood'] = %s" % str(value))
603+
org.status['blood'] = value
610604
elif key == 'deme':
611605
org.status['deme'] = str(value)
612606
elif key == 'location':
613607
value = tuple([int(x) for x in value.split('|')])
614-
exec("org.status['location'] = %s" % str(value))
608+
org.status['location'] = value
615609
elif key == 'death':
616-
exec("org.status['death'] = %s" % str(value))
610+
org.status['death'] = value
617611
elif key.startswith('chromosome'):
618612
chr_position = key.split('_')[1]
619613
sequence = [str(x) for x in str(value)]
@@ -625,12 +619,13 @@ def db_reconstruct_organisms(cur, start_time, population_name, generation):
625619
key='chromosome_bases' and start_time='%s'" %
626620
start_time)
627621
bases = str(cur.fetchone()[0]).split('|')
628-
exec("chromosome_bases = %s" % bases)
622+
chromosome_bases = bases
629623
chromosome = g.Chromosome(sequence, chromosome_bases,
630624
background_mutation)
631625
org.genome.append(chromosome)
632626
else:
633-
exec("org.status['%s'] = %s" % (str(key), str(value)))
627+
try: org.status[key] = ast.literal_eval(value)
628+
except: org.status[key] = value
634629
agents[i] = org
635630
return agents
636631

@@ -653,7 +648,8 @@ def db_reconstruct_population(cur, start_time,
653648
cur.execute("select value from parameters where \
654649
key='goal' and start_time='%s'" % start_time)
655650
g = cur.fetchone()[0]
651+
656652
try: goal = float(g)
657-
except ValueError: exec("goal = %s" % str(g))
653+
except: goal = str(g)
658654
return genetic.Population(goal, 1e24, agents)
659655

0 commit comments

Comments
 (0)