entropy_over_noise_scale.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import matplotlib.pyplot as plt
  2. import noise
  3. import numpy as np
  4. from brian2.units import *
  5. from scripts.spatial_maps.orientation_maps.orientation_map import OrientationMap
  6. from scripts.interneuron_placement import create_interneuron_sheet_entropy_max_orientation
  7. from tqdm import tqdm
  8. from scripts.interneuron_placement import create_grid_of_excitatory_neurons, \
  9. create_interneuron_sheet_by_repulsive_force
  10. use_saved_array = False
  11. trials_per_scale = 1
  12. N_E = 900
  13. N_I = 90
  14. sheet_x = 450 * um
  15. sheet_y = 450 * um
  16. inhibitory_axon_long_axis = 100 * um
  17. inhibitory_axon_short_axis = 25 * um
  18. number_of_excitatory_neurons_per_row = int(np.sqrt(N_E))
  19. '''
  20. Tuning Maps
  21. '''
  22. # tuning_label = "Perlin"
  23. tuning_label = "Orientation map"
  24. # optimization_label = "Repulsive"
  25. optimization_label = "Entropy Optimization"
  26. corr_len_list = range(0,451,15) #For these values maps exist
  27. ellipse_trial_entropy_list = []
  28. circle_trial_entropy_list = []
  29. if not use_saved_array:
  30. for corr_len in tqdm(corr_len_list, desc="Calculating entropy over scale"): #TODO: Add trials, since the maps are random
  31. ellipse_single_trial_entropy_list = []
  32. circle_single_trial_entropy_list = []
  33. for seed in range(10):
  34. print(corr_len,seed)
  35. if tuning_label == "Perlin": #TODO: How to handle scale in Perlin
  36. tuning_map = lambda x, y: noise.pnoise2(x / 100.0, y / 100.0, octaves=2)*np.pi
  37. elif tuning_label == "Orientation map":
  38. map = OrientationMap(number_of_excitatory_neurons_per_row + 1,number_of_excitatory_neurons_per_row + 1,
  39. corr_len,sheet_x/um,sheet_y/um,seed)
  40. # map.improve(10)
  41. try:
  42. map.load_orientation_map()
  43. except:
  44. print('No map yet with {}x{} pixels and {} pixel correllation length and {} seed'.format(map.x_dim, map.y_dim, map.corr_len, map.rnd_seed))
  45. continue
  46. tuning_map = lambda x, y: map.tuning(x, y)
  47. ex_positions, ex_tunings = create_grid_of_excitatory_neurons(sheet_x / um, sheet_y / um,
  48. number_of_excitatory_neurons_per_row, tuning_map)
  49. inhibitory_radial_axis = np.sqrt(inhibitory_axon_long_axis * inhibitory_axon_short_axis)
  50. if optimization_label == "Repulsive":
  51. inhibitory_axonal_clouds = create_interneuron_sheet_by_repulsive_force(N_I, inhibitory_axon_long_axis / um,
  52. inhibitory_axon_short_axis / um, sheet_x / um,
  53. sheet_y / um, random_seed=2, n_iterations=1000)
  54. inhibitory_axonal_circles = create_interneuron_sheet_by_repulsive_force(N_I, inhibitory_radial_axis / um,
  55. inhibitory_radial_axis / um, sheet_x / um,
  56. sheet_y / um, random_seed=2, n_iterations=1000)
  57. elif optimization_label == "Entropy Optimization":
  58. inhibitory_axonal_clouds, ellipse_single_trial_entropy = create_interneuron_sheet_entropy_max_orientation(ex_positions, ex_tunings, N_I, inhibitory_axon_long_axis / um,
  59. inhibitory_axon_short_axis / um, sheet_x / um,
  60. sheet_y / um, trial_orientations=30)
  61. inhibitory_axonal_circles, circle_single_trial_entropy = create_interneuron_sheet_entropy_max_orientation(ex_positions, ex_tunings, N_I, inhibitory_radial_axis / um,
  62. inhibitory_radial_axis / um, sheet_x / um,
  63. sheet_y / um, trial_orientations=1)
  64. ellipse_single_trial_entropy_list.append(ellipse_single_trial_entropy)
  65. circle_single_trial_entropy_list.append(circle_single_trial_entropy)
  66. ellipse_trial_entropy_list.append(ellipse_single_trial_entropy_list)
  67. circle_trial_entropy_list.append(circle_single_trial_entropy_list)
  68. # interneuron_tunings = [inhibitory_axonal_clouds, inhibitory_axonal_circles]
  69. # plot_neural_sheet(ex_positions, ex_tunings, inhibitory_axonal_clouds)
  70. np.save('../../simulations/2020_02_27_entropy_over_noise_scale/circle_trial_entropy_list.npy', circle_trial_entropy_list)
  71. np.save('../../simulations/2020_02_27_entropy_over_noise_scale/ellipse_trial_entropy_list.npy', ellipse_trial_entropy_list)
  72. else:
  73. circle_trial_entropy_list = np.load(
  74. '../../simulations/2020_02_27_entropy_over_noise_scale/circle_trial_entropy_list.npy')
  75. ellipse_trial_entropy_list = np.load(
  76. '../../simulations/2020_02_27_entropy_over_noise_scale/ellipse_trial_entropy_list.npy')
  77. ellipse_entropy_mean = np.array([np.mean(i) for i in ellipse_trial_entropy_list])
  78. circle_entropy_mean = np.array([np.mean(i) for i in circle_trial_entropy_list])
  79. ellipse_entropy_std_dev = np.array([np.std(i) for i in ellipse_trial_entropy_list])
  80. circle_entropy_std_dev = np.array([np.std(i) for i in circle_trial_entropy_list])
  81. print(ellipse_trial_entropy_list)
  82. print(ellipse_entropy_std_dev)
  83. plt.figure()
  84. plt.plot(corr_len_list,circle_entropy_mean, label='Circle', marker='o',color='C1')
  85. plt.fill_between(corr_len_list,circle_entropy_mean-circle_entropy_std_dev,circle_entropy_mean+circle_entropy_std_dev,color='C1',alpha=0.4)
  86. plt.plot(corr_len_list,ellipse_entropy_mean, label='Ellipse', marker='o',color='C2')
  87. plt.fill_between(corr_len_list,ellipse_entropy_mean-ellipse_entropy_std_dev,ellipse_entropy_mean+ellipse_entropy_std_dev,color='C2',alpha=0.4)
  88. plt.xlabel('Correlation length')
  89. plt.ylabel('Entropy')
  90. plt.legend()
  91. plt.show()