def age_vs_plot(track, infile, ycol='logl', ax=None, annotate=True, xlabels=True, save_plot=True, ylabels=True): agb_mix = infile.agb_mix set_name = infile.set_name if ycol == 'logl': ydata= track.get_col('L_star') majL = MultipleLocator(.2) minL = MultipleLocator(.1) ylab = '$\log\ L_{\odot}$' elif ycol == 'logt': ydata = track.get_col('T_star') majL = MultipleLocator(.1) minL = MultipleLocator(.05) ylab = '$\log\ Te$' elif ycol == 'C/O': ydata = track.get_col('CO') majL = MaxNLocator(4) minL = MaxNLocator(2) ylab = '$C/O$' else: print 'logl, logt, C/O only choices for y.' return age = track.get_col('ageyr') addpt = track.addpt Qs = list(track.Qs) if ax is None: fig, ax = plt.subplots() ax.plot(age, ydata, color='black') ax.plot(age[Qs], ydata[Qs], 'o', color='green') if len(addpt) > 0: ax.plot(age[addpt], ydata[addpt], 'o', color='purple') ax.yaxis.set_major_locator(majL) ax.yaxis.set_minor_locator(minL) majorFormatter = ScalarFormatter() majorFormatter.set_powerlimits((-3, 4)) ax.xaxis.set_major_formatter(majorFormatter) if annotate is True: ax.text(0.06, 0.87, '${\\rm %s}$' % agb_mix.replace('_', '\ '), transform=ax.transAxes) ax.text(0.06, 0.77,'${\\rm %s}$' % set_name.replace('_', '\ '), transform=ax.transAxes) ax.text(0.06, 0.67, '$M=%.2f$' % track.mass, transform=ax.transAxes) if ylabels is True: ax.set_ylabel('$%s$' % ylab, fontsize=20) if xlabels is True: ax.set_xlabel('$\rm{Age (yr)}$', fontsize=20) if save_plot is True: plotpath = os.path.join(infile.diagnostic_dir, 'age_v/') fileIO.ensure_dir(plotpath) fname = os.path.split(track.name)[1].replace('.dat', '') fig_name = os.path.join(plotpath, '_'.join(('diag', fname))) plt.savefig('%s_age_v.png' % fig_name, dpi=300) plt.close() return
def diag_plots(track, infile): agb_mix = infile.agb_mix set_name = infile.set_name ext = '.png' logt_lim = (3.75, 3.35) logl_lim = (2.4, 4.8) lage_lim = (1., 1e7) co_lim = (0, 5) logl = track.get_col('L_star') logt = track.get_col('T_star') addpt = track.addpt Qs = list(track.Qs) # HRD fig = plt.figure() ax = plt.axes() plotpath = os.path.join(infile.diagnostic_dir, 'HRD/') fileIO.ensure_dir(plotpath) ax.annotate(r'$%s$' % agb_mix.replace('_', '\ '), xy=(3.43, 2.8)) ax.annotate(r'$%s$' % set_name, xy=(3.43, 2.7)) ax.annotate(r'$M=%.2f$' % track.mass, xy=(3.43, 2.6)) ax.plot(logt, logl, color='black') ax.plot(logt[Qs], logl[Qs], color='green', lw=2) ax.plot(logt[Qs], logl[Qs], 'o', color='green') if len(addpt) > 0: ax.plot(logt[addpt], logl[addpt], 'o', color='purple') ax.set_xlim(logt_lim) ax.set_ylim(logl_lim) ax.set_xlabel(r'$\log\ Te$') ax.set_ylabel(r'$\log\ L_{\odot}$') fname = os.path.split(track.name)[1].replace('.dat', '') fig_name = os.path.join(plotpath, '_'.join(('diag', fname))) plt.savefig('%s%s' % (fig_name, ext)) plt.close() fig, (axs) = plt.subplots(nrows=3) ycols = ['logl', 'logt', 'C/O'] annotate = [False, False, True] save_plot = [False, False, True] xlabels = [False, False, True] for i in range(len(ycols)): age_vs_plot(track, infile, ycol=ycols[i], ax=axs[i], annotate=annotate[i], xlabels=xlabels[i], ylabels=True, save_plot=save_plot[i])
def attach_experiment(self,experiment_dir,error_key='dev_mae',verbose=True): """ Overide this to suit your purposes! The purpose of this function is to go over each experiment in the supplied experiment_dir and aggregate the best results. the results into a nice dictionary object. I encourage this to be overidden in ones own implementation if their experiment structure is different. Alternativley, if an aggregation can be supplied to attach_aggregation, your life will be easier. :param experiment_dir: String pointing to valid experiment directory as defined by experimentGenerator :returns: 0 on success, <0 for any error. .. side-effects:: Upon success, the class variable results will be populated. .. note:: A valid experiment directory (if using this as is) should have sufficient permissions set and contain a var directory. The var directory should contain sub folders for each experiment, labeled like: alpha_1__gamma_2/. Underneath each sub directory there should be the folder logs underwhich there should be a file runtime.txt like this logs/runtime.txt. """ dirs = [] results_dir = '%s/%s' %(experiment_dir,'results') var_dir = '%s/%s' %(experiment_dir,'var') if not os.path.isdir(var_dir): print('There is no var directory. This directory should have all of the sub experiments beneath it.') return -1 if not os.path.isdir(results_dir): if ensure_dir(results_dir) < 0: print('There is no results directory. Failed attempt to create directory here: %s.' % (results_dir)) return -2 print('Building list of directories...') dirs = list() num_sep = var_dir.count(os.path.sep) level = 1 for root, ds, fs in os.walk(var_dir): num_sep_this = root.count(os.path.sep) if num_sep + level <= num_sep_this: del ds[:] continue dirs = ds num_experiments = len(dirs) results = {} # --------------------------------- # Go over each experiment directory # ----------------------- print('Aggregating results.') num_dirs = len(dirs) param_count = None last_params = None for p,d in enumerate(dirs): runtime_fn = '%s/var/%s/logs/runtime.txt' % (experiment_dir,d) if not os.path.isfile(runtime_fn): continue d_end = d.split('/')[-1] # Hyper parameters are in the name of a directory hyper_params = self.parse_key_values(d_end,assignment='_',delimeter='__') runtime = open(runtime_fn,'r').read().split('\n') min_error = float('inf') min_error_exp= None # ----------------------------------------- # Gather the results for a given experiment # ------------------- for line in runtime: if not line: continue rt = self.parse_key_values(line) # ---- # See if this current line in the runtime log had the best error. try: error = float(rt[error_key]) if error < min_error: min_error = error min_error_exp = copy.deepcopy(rt) except ValueError: raise ValueError('Expecting error key %s to evaluate to a float.' % (error_key)) except KeyError: print('ERROR: Parsing file:',runtime_fn) print('- Error key %s does not apear on all lines.' % error_key) break # ------- # ------- if not min_error_exp: if verbose: print('WARNING: Unable to find best result in experiment %s.' % (runtime_fn)) continue # Add all the hyper params to the best experiment found for key in hyper_params: min_error_exp[key] = float(hyper_params[key]) # Update the values pointed to by every key in min_error_exp if not param_count: param_count = len(min_error_exp) last_params = min_error_exp elif len(min_error_exp) != param_count: print("Error in file:",runtime_fn) print("Irregular number of outputs per line.") continue else: param_count = len(min_error_exp) last_params = min_error_exp for key in min_error_exp: if not key in results: results[key] = dict() results[key]['values'] = list() results[key]['__longest_sequence__'] = -1 val = min_error_exp[key] try: val = float(val) except: pass max_ = max(len(str(val)),len(key),results[key]['__longest_sequence__']) results[key]['__longest_sequence__'] = max_ results[key]['values'].append(val) if( p % 200 == 0): progress(p,num_experiments) # ------- progress(num_experiments,num_experiments) print('(%d) results' % (len(results))) self.results = results return 0