1 from datetime import datetime
6 import matplotlib.pyplot as plt
7 import matplotlib.ticker as mtick
13 exec(open("conf.py").read())
15 def fmt_num(num, width=18):
17 Format number to string.
20 return str(num)[:width].ljust(width)
23 def inputs_function(x):
27 def noise_decision_function(t):
28 return np.random.normal(0.0, noise_decision)
31 def noise_bias_function(t):
32 return np.random.normal(0.0, noise_wm)
36 return time_scale if t > t_cue else 0
39 def decision_function(x):
47 #return 1.0 if x[0] + x[1] > 0.0 else -1.0
52 Base class for alpha receptors. Not to be used directly.
57 self.y = 1 / (1 + (999 * np.exp(-0.1233 * (self.x / self.offset))))
62 for i in range(len(steps)):
63 self.gains.append(1 + self.gaind * self.y[i])
64 self.biass.append(1 + self.biasd * self.y[i])
67 out = f"./out/{self.__class__.__name__}"
69 title = "Norepinepherine Concentration vs Neuron Activity in " + \
71 logging.info("Plotting " + title)
73 plt.plot(self.x, self.y)
75 plt.xlabel("Norepinephrine concentration (nM)")
76 plt.ylabel("Activity (%)")
79 plt.vlines(self.ki, 0, 1, linestyles="dashed")
80 plt.text(1.1 * self.ki, 0.1, "Affinity")
82 plt.hlines(0.5, 0, 1000, linestyles="dashed")
83 plt.text(1, 0.51, "50%")
86 plt.gca().yaxis.set_major_formatter(mtick.PercentFormatter())
89 plt.savefig(f"{out}-norep-activity.png")
91 #######################################################################
93 title = "Concentration vs Gain Scalar in" + self.pretty
94 logging.info("Plotting " + title)
96 plt.plot(self.x, self.gains)
98 plt.xlabel("Norepinephrine concentration (nM)")
105 plt.savefig(f"{out}-concentration-gain.png")
107 #######################################################################
109 title = "Concentration vs Bias scalar in " + self.pretty
110 logging.info("Plotting " + title)
112 plt.plot(self.x, self.biass)
116 plt.xlabel("Norepinephrine concentration (nM)")
121 plt.savefig(f"{out}-concentration-bias.png")
126 Subclass of Alpha representing an alpha1 receptor.
132 self.pretty = "α1 Receptor"
140 Subclass of Alpha representing an alpha2 receptor.
146 self.pretty = "α2 Receptor"
156 self.num_spikes = np.ones(len(steps))
157 self.biass = np.ones(len(steps))
158 self.gains = np.ones(len(steps))
159 self.out = np.ones(3)
162 self.perceived = np.ones(3) # correctly perceived (not necessarily remembered) cues
163 rng=np.random.RandomState(seed=111)
164 self.cues=2 * rng.randint(2, size=3)-1 # whether the cues is on the left or right
165 for n in range(len(self.perceived)):
166 if rng.rand() < misperceive:
167 self.perceived[n] = 0
170 title = "Norepinephrine Concentration vs Spiking Rate"
171 logging.info("Plotting " + title)
173 plt.plot(steps, self.num_spikes)
177 plt.xlabel("Norepinephrine concentration (nM)")
178 plt.ylabel("Spiking rate (spikes/time step)")
182 plt.savefig("./out/concentration-spiking.png")
184 def cue_function(self, t):
185 if t < t_cue and self.perceived[self.trial] != 0:
186 return cue_scale * self.cues[self.trial]
191 with nengo.Network() as net:
193 cue_node = nengo.Node(output=self.cue_function)
194 time_node = nengo.Node(output=time_function)
195 noise_wm_node = nengo.Node(output=noise_bias_function)
196 noise_decision_node = nengo.Node(
197 output=noise_decision_function)
200 wm = nengo.Ensemble(neurons_wm, 2)
201 decision = nengo.Ensemble(neurons_decide, 2)
202 inputs = nengo.Ensemble(neurons_inputs, 2)
203 output = nengo.Ensemble(neurons_decide, 1)
206 nengo.Connection(cue_node, inputs[0], synapse=None)
207 nengo.Connection(time_node, inputs[1], synapse=None)
208 nengo.Connection(inputs, wm, synapse=tau_wm,
209 function=inputs_function)
210 wm_recurrent = nengo.Connection(wm, wm, synapse=tau_wm)
211 nengo.Connection(noise_wm_node, wm.neurons, synapse=tau_wm,
212 transform=np.ones((neurons_wm, 1)) * tau_wm)
213 wm_to_decision = nengo.Connection(
214 wm[0], decision[0], synapse=tau)
215 nengo.Connection(noise_decision_node,
216 decision[1], synapse=None)
217 nengo.Connection(decision, output, function=decision_function)
220 probes_wm = nengo.Probe(wm[0], synapse=0.01)
221 probe_spikes = nengo.Probe(wm.neurons)
222 probe_output = nengo.Probe(output, synapse=None)
225 with nengo.Simulator(net, dt=dt, progress_bar=False) as sim:
226 for i, _ in tqdm(enumerate(steps), total=len(steps)):
227 wm.gain = (self.a1.gains[i] + self.a2.gains[i]) * sim.data[wm].gain
228 wm.bias = (self.a1.biass[i] + self.a2.biass[i]) * sim.data[wm].gain
229 for self.trial in range(3):
230 logging.debug(f"Simulating: trial: {self.trial}, gain: {fmt_num(self.gains[i])}, bias: {fmt_num(self.biass[i])}")
231 sim.run(t_cue + t_delay)
232 self.out[self.trial] = np.count_nonzero(sim.data[probe_spikes])
233 self.num_spikes[i] = np.average(self.out)
235 with open(f"out/{datetime.now().isoformat()}-spikes.pkl", "wb") as pout:
236 pickle.dump(self.num_spikes, pout)
241 logging.info("Initializing simulation")
242 plt.style.use("ggplot") # Nice looking and familiar style
246 if __name__ == "__main__":
249 except FileExistsError:
252 logging.basicConfig(filename=f"out/{datetime.now().isoformat()}.log",