def processResults(experiment): import os import shutil import numpy as np import pbsGridWalker.tools.plotutils as tplt tfs.makeDirCarefully('results', maxBackups=100) def fitnessFileName(gp): return 'NI' + str(gp['newIndividualsPerGeneration']) + '_IP' + gp['initialPopulationType'] + '_fitness' def columnExtractor(gp): outFile = fitnessFileName(gp) subprocess.call('cut -d \' \' -f 2 bestIndividual*.log | tail -n +4 | tr \'\n\' \' \' >> ../results/' + outFile, shell=True) subprocess.call('echo >> ../results/' + outFile, shell=True) experiment.executeAtEveryGridPointDir(columnExtractor) os.chdir('results') xlabel = 'Generations' ylimit = None yscale = 'lin' xscale = 'lin' margins = 0.5 xlimit = None alpha = 0.3 title = None def robustLoadTxt(ffn): arr0 = [] with open(ffn, 'r') as ff: for line in ff: vals = map(float, line.split()) arr0.append(vals) minlen = min([ len(vs) for vs in arr0 ]) arr1 = [] for vs in arr0: arr1.append(vs[:minlen]) arr1 = np.array(arr1) return arr1 # dataDict = { str(mg): np.loadtxt(fitnessFileName(mg)) for mg in [0.1, 0.3, 0.5, 0.7, 0.9] } # dataDict = { str(mg): robustLoadTxt(fitnessFileName(mg)) for mg in [0.1, 0.3, 0.5, 0.7, 0.9] } # tplt.plotAverageTimeSeries(dataDict, 'Error', 'mg.png', # title=title, legendLocation=None, xlabel=xlabel, # xlimit=xlimit, ylimit=ylimit, figsize=(2.5,4), xscale=xscale, yscale=yscale, margins=margins) for ip in ['sparse', 'random']: dataDict = { ('NI='+str(ni)): robustLoadTxt(fitnessFileName({'initialPopulationType': ip, 'newIndividualsPerGeneration': ni})) for ni in [1,4,16] } tplt.plotAllTimeSeries(dataDict, 'Fitness', 'tu_IP' + ip + '.png', title=title, legendLocation=1, xlabel=xlabel, xlimit=xlimit, ylimit=ylimit, xscale=xscale, yscale=yscale, margins=margins, alpha=alpha) # def plotAllTSForInitalPopulationType(initPopType): # title = None # dataDict = {attachments[x]: -1.*np.loadtxt(fitnessFileName(x, initPopType)) for x in attachments.keys()} # tplt.plotAverageTimeSeries(dataDict, 'Error', 'errorComparison_GENS50_IP' + initPopType + '.png', title=title, legendLocation=None, xlabel=xlabel, xlimit=50, ylimit=ylimit, figsize=(2.5,4), xscale=xscale, yscale=yscale, margins=margins) # tplt.plotAllTimeSeries(dataDict, 'Error', 'errorAllTrajectories_GEN50_IP' + initPopType + '.png', title=title, legendLocation=None, xlabel=xlabel, xlimit=50, ylimit=ylimit, figsize=(2.5,4), xscale=xscale, yscale=yscale, margins=margins, alpha=alpha) # tplt.plotAverageTimeSeries(dataDict, 'Error', 'errorComparison_IP' + initPopType + '.png', title=title, legendLocation=1, xlabel=xlabel, xlimit=500, ylimit=ylimit, xscale=xscale, yscale=yscale, margins=margins) # tplt.plotAllTimeSeries(dataDict, 'Error', 'errorAllTrajectories_IP' + initPopType + '.png', title=title, legendLocation=1, xlabel=xlabel, xlimit=500, ylimit=ylimit, xscale=xscale, yscale=yscale, margins=margins, alpha=alpha) # for ip in initialPopulationTypes: # plotAllTSForNew(ip) os.chdir('..')
def processResults(experiment): import os import numpy as np import pbsGridWalker.tools.plotutils as tplt tfs.makeDirCarefully('results', maxBackups=100) # We'll take a look at some parameters vs relative mutation rate at several stages (generation counts) along the evolutionary process # Linear stages stagesToConsider = 5 stages = tal.splitIntegerRangeIntoStages(0, evsAdditionalParams['genStopAfter'], stagesToConsider) ##### Extracting and plotting the distance to the maximally modular morphology (MMM) for various values relative mutation rate ##### # mmmmdist and similar abbreviations stand for "minimal distance to the maximally modular morphology" (across the Pareto front) xlabel = r'$P_{mm}$' fieldNames = [ 'gen {}'.format(st) for st in stages ] def generateMinMMMDistTimeSlices(gridPoint): return [ gctools.minParetoFrontHammingDistanceToMMM(gen) for gen in stages ] tplt.plotComputationVariableAgainstParameter(experiment, 'mmmmd', generateMinMMMDistTimeSlices, 'probabilityOfMutatingClass0', fieldNames=fieldNames, xlabel=xlabel, ylabel=r'$\mu$') def generateFitnessTimeSlices(gridPoint): bestIndividualData = np.loadtxt('bestIndividual{}.log'.format(gridPoint['randomSeed'])) fitnessData = [] for genRec in range(bestIndividualData.shape[0]): gen = int(bestIndividualData[genRec,0]) if gen in stages: fitnessData.append(bestIndividualData[genRec,1]) # WILL break if the best individual records are not in the order of increasing generation return fitnessData tplt.plotComputationVariableAgainstParameter(experiment, 'error', generateFitnessTimeSlices, 'probabilityOfMutatingClass0', fieldNames=fieldNames, transform=lambda x: x, yscale='lin', xlabel=xlabel, ylabel=r'$\log_10 E$', strips='conf95', forcedYLabelPos=[0.05,1])
def processResults(experiment): import os import shutil import numpy as np import pbsGridWalker.tools.plotutils as tplt tfs.makeDirCarefully('results', maxBackups=100) def fitnessFileName(sensAttType, initPopType): return 'SA' + sensAttType + '_IP' + initPopType + '_fitness' def columnExtractor(gp): outFile = fitnessFileName(gp['sensorAttachmentType'], gp['initialPopulationType']) subprocess.call('cut -d \' \' -f 2 bestIndividual*.log | tail -n +4 | tr \'\n\' \' \' >> ../results/' + outFile, shell=True) subprocess.call('echo >> ../results/' + outFile, shell=True) experiment.executeAtEveryGridPointDir(columnExtractor) os.chdir('results') xlabel = 'Generations' ylimit = None yscale = 'log' xscale = 'log' margins = 0.5 xlimit = 500 alpha=0.3 def plotAllTSForInitalPopulationType(initPopType): title = None # 'Fitness time series for the two types of sensors attachment' dataDict = {attachments[x]: -1.*np.loadtxt(fitnessFileName(x, initPopType)) for x in attachments.keys()} tplt.plotAverageTimeSeries(dataDict, 'Error', 'errorComparison_GENS50_IP' + initPopType + '.png', title=title, legendLocation=None, xlabel=xlabel, xlimit=50, ylimit=ylimit, figsize=(2.5,4), xscale=xscale, yscale=yscale, margins=margins) tplt.plotAllTimeSeries(dataDict, 'Error', 'errorAllTrajectories_GEN50_IP' + initPopType + '.png', title=title, legendLocation=None, xlabel=xlabel, xlimit=50, ylimit=ylimit, figsize=(2.5,4), xscale=xscale, yscale=yscale, margins=margins, alpha=alpha) tplt.plotAverageTimeSeries(dataDict, 'Error', 'errorComparison_IP' + initPopType + '.png', title=title, legendLocation=1, xlabel=xlabel, xlimit=500, ylimit=ylimit, xscale=xscale, yscale=yscale, margins=margins) tplt.plotAllTimeSeries(dataDict, 'Error', 'errorAllTrajectories_IP' + initPopType + '.png', title=title, legendLocation=1, xlabel=xlabel, xlimit=500, ylimit=ylimit, xscale=xscale, yscale=yscale, margins=margins, alpha=alpha) for ip in initialPopulationTypes: plotAllTSForInitalPopulationType(ip) os.chdir('..')
def processResults(experiment): tfs.makeDirCarefully('results', maxBackups=100) plotTTCvsMMMD(experiment) def gridFileNamePrefix(gridPoint): if gridPoint['probabilityOfMutatingClass0'] == 0.2: if gridPoint['compositeClass0'] == 'integerVectorSymmetricRangeMutations': return 'move_sensor_by_1_segment' elif gridPoint['compositeClass0'] == 'integerVectorRandomJumps': return 're-generate_morphology' elif gridPoint['probabilityOfMutatingClass0'] == 0 and gridPoint['compositeClass0'] == 'integerVectorSymmetricRangeMutations': return 'no_morphological_mutation' raise ValueError('Wrong point {} in the non-RS grid'.format(gridPoint)) plotErrorTSs(experiment, gridFileNamePrefix) plotMinMMMDistTSs(experiment, gridFileNamePrefix)
def processResults(experiment): import os import shutil import numpy as np import pbsGridWalker.tools.plotutils as tplt tfs.makeDirCarefully('results', maxBackups=100) def fitnessFileName(paramsDict): gid = 'NOGID' if paramsDict['lineageInjectionPeriod'] == 30000: if paramsDict['individual'] == 'ctrnnDiscreteWeightsFleetOfIdenticalsFixedFitness': gid = '1' elif paramsDict['individual'] == 'ctrnnDiscreteWeightsFleetOfIdenticalsEvolvableFitness': gid = '2' elif paramsDict['lineageInjectionPeriod'] == 50: if paramsDict['mutatedLineagesRatio'] == 0.: if paramsDict['evolver'] == 'ageFunction': if paramsDict['initialPopulationType'] == 'random': gid = '3' elif paramsDict['initialPopulationType'] == 'sparse': gid = '6' elif paramsDict['evolver'] == 'ageFunctionSparsityBiased': if paramsDict['initialPopulationType'] == 'random': gid = '4' elif paramsDict['initialPopulationType'] == 'sparse': gid = '5' elif paramsDict['mutatedLineagesRatio'] == 1.0: if paramsDict['lineageMutationType'] == 'individualClassDefault': gid = '7' elif paramsDict['lineageMutationType'] == 'randomJump': gid = '8' if gid == 'NOGID': raise ValueError('Unclassified parameter dictionary {}'.format(paramsDict)) return 'gid{}'.format(gid) def columnExtractor(gp): print('Extracting fitness times series to {}...'.format(fitnessFileName(gp))) outFile = fitnessFileName(gp) subprocess.call('cut -d \' \' -f 2 bestIndividual*.log | tail -n +4 | tr \'\n\' \' \' >> ../results/' + outFile, shell=True) subprocess.call('echo >> ../results/' + outFile, shell=True) experiment.executeAtEveryGridPointDir(columnExtractor) def plotAll(): os.chdir('results') xlabel = 'Generations' ylimit = None yscale = 'lin' xscale = 'lin' margins = 0.5 xlimit = 6000 alpha = 0.3 title = None # figsize = (2.5,4) figsize = None striptype = 'conf95' filenames = [ 'gid{}'.format(x) for x in range(1,9) ] dataDict = { fn: np.loadtxt(fn) for fn in filenames } comp3 = { tsn: dataDict[fn] for tsn,fn in {'no turning': 'gid3', 'smooth turning': 'gid7', 'abrupt turning': 'gid8'}.items() } comparisons = { 'comp3': comp3 } for e,d in comparisons.items(): tplt.plotAverageTimeSeries(d, 'Fitness', e + '-avg.png', title=title, legendLocation=4, xlabel=xlabel, xlimit=xlimit, ylimit=ylimit, figsize=figsize, xscale=xscale, yscale=yscale, margins=margins, strips=striptype) tplt.plotAllTimeSeries(d, 'Fitness', e + '-all.png', alpha=alpha, title=title, legendLocation=4, xlabel=xlabel, xlimit=xlimit, ylimit=ylimit, figsize=figsize, xscale=xscale, yscale=yscale, margins=margins) os.chdir('..') plotAll()