Source code for neuronunit.optimization.results_analysis
import numpy as np
import pickle
[docs]def param_distance(dtc_ga_attrs,dtc_grid_attrs,td):
distances = {}
# These imports are defined here to avoid cyclic importing, as the function provides a limited scope of the imports.
#
from neuronunit.optimization.optimization_management import model_params
from neuronunit.optimization.exhaustive_search import reduce_params
ranges = { k:model_params[k] for k,v in dtc_ga_attrs.items() }
for k,v in dtc_ga_attrs.items():
dimension_length = np.max(ranges[k]) - np.min(ranges[k])
solution_distance_in_1D = np.abs(float(dtc_grid_attrs[k]))-np.abs(float(v))
try:
relative_distance = np.abs(solution_distance_in_1D/dimension_length)
except:
relative_distance = None
distances.get(k, relative_distance)
distances[k] = (relative_distance)
print('the difference between brute force candidates model parameters and the GA\'s model parameters:')
print(float(dtc_grid_attrs[k])-float(v),dtc_grid_attrs[k],v,k)
print('the relative distance scaled by the length of the parameter dimension of interest:')
print(relative_distance)
return distances
[docs]def min_max(pop):
garanked = [ (r.dtc.attrs , sum(r.dtc.scores.values()), r.dtc) for r in pop ]
garanked = sorted(garanked, key=lambda w: w[1])
miniga = garanked[0]
maxiga = garanked[-1]
return miniga, maxiga
[docs]def error_domination(dtc_ga,dtc_grid):
distances = {}
errors_ga = list(dtc_ga.scores.values())
print(errors_ga)
me_ga = np.mean(errors_ga)
std_ga = np.std(errors_ga)
errors_grid = list(dtc_grid.scores.values())
print(errors_grid)
me_grid = np.mean(errors_grid)
std_grid = np.std(errors_grid)
dom_grid = False
dom_ga = False
for e in errors_ga:
if e <= me_ga + std_ga:
dom_ga = True
for e in errors_grid:
if e <= me_grid + std_grid:
dom_grid= True
return dom_grid, dom_ga
[docs]def make_report(grid_results, ga_out, nparams, pop = None):
from neuronunit.optimization.exhaustive_search import create_grid
grid_points = create_grid(npoints = 2,nparams = nparams)
td = list(grid_points[0][0].keys())
reports = {}
reports[nparams] = {}
mini = min_max(grid_results)[0][1]
maxi = min_max(grid_results)[1][1]
if type(pop) is not type(None):
miniga = min_max(pop)[0][1]
else:
miniga = min_max(ga_out)[0][1]
reports[nparams]['miniga'] = miniga
reports[nparams]['minigrid'] = mini
quantize_distance = list(np.linspace(mini,maxi,21))
success = bool(miniga < quantize_distance[2])
better = bool(miniga < quantize_distance[0])
print('Report: ')
print('did it work? {0} was it better {1}'.format(success,better))
reports[nparams]['success'] = success
reports[nparams]['better'] = better
dtc_ga = min_max(ga_out)[0][0]
attrs_grid = min_max(grid_results)[0][0]
attrs_ga = min_max(ga_out)[0][0]
reports[nparams]['attrs_ga'] = attrs_ga
reports[nparams]['attrs_grid'] = attrs_grid
reports[nparams]['p_dist'] = param_distance(attrs_ga,attrs_grid,td)
##
# mistake here
##
dtc_grid = dtc_ga = min_max(ga_out)[0][2]
dom_grid, dom_ga = error_domination(dtc_ga,dtc_grid)
reports[nparams]['vind_domination'] = False
# Was there vindicating domination in grid search but not GA?
if dom_grid == True and dom_ga == False:
reports[nparams]['vind_domination'] = True
elif dom_grid == False and dom_ga == False:
reports[nparams]['vind_domination'] = True
# Was there incriminating domination in GA but not the grid, or in GA and Grid
elif dom_grid == True and dom_ga == True:
reports[nparams]['inc_domination'] = False
elif dom_grid == False and dom_ga == True:
reports[nparams]['inc_domination'] = False
#reports[nparams]['success'] = bool(miniga < quantize_distance[2])
dtc_ga = min_max(ga_out)[0][0]
attrs_grid = min_max(grid_results)[0][0]
attrs_ga = min_max(ga_out)[0][0]
grid_points = create_grid(npoints = 1,nparams = nparams)#td = list(grid_points[0].keys())
td = list(grid_points[0][0].keys())
reports[nparams]['p_dist'] = param_distance(attrs_ga,attrs_grid,td)
dtc_grid = dtc_ga = min_max(ga_out)[0][2]
dom_grid, dom_ga = error_domination(dtc_ga,dtc_grid)
reports[nparams]['vind_domination'] = False
# Was there vindicating domination in grid search but not GA?
if dom_grid == True and dom_ga == False:
reports[nparams]['vind_domination'] = True
elif dom_grid == False and dom_ga == False:
reports[nparams]['vind_domination'] = True
# Was there incriminating domination in GA but not the grid, or in GA and Grid
elif dom_grid == True and dom_ga == True:
reports[nparams]['inc_domination'] = False
elif dom_grid == False and dom_ga == True:
reports[nparams]['inc_domination'] = False
with open('reports.p','wb') as f:
pickle.dump(reports,f)
return reports