1 from datetime import datetime
5 import matplotlib.pyplot as plt
6 import matplotlib.ticker as mtick
10 exec(open("conf.py").read())
13 def fmt_num(num, width=18):
15 Format number to string.
18 return str(num)[:width].ljust(width)
21 def inputs_function(x):
25 def noise_decision_function(t):
26 return np.random.normal(0.0, noise_decision)
29 def noise_bias_function(t):
30 return np.random.normal(0.0, noise_wm)
34 return time_scale if t > t_cue else 0
37 def decision_function(x):
38 return 1.0 if x[0] + x[1] > 0.0 else -1.0
43 Base class for alpha receptors. Not to be used directly.
47 self.x = np.logspace(0, 3, steps)
48 self.y = 1 / (1 + (999 * np.exp(-0.1233 * (self.x / self.offset))))
53 for i in range(steps):
55 self.gains.append(1 + self.gaind * y)
56 self.biass.append(1 + self.biasd * y)
59 out = f"./out/{self.__class__.__name__}"
61 title = "Norepinepherine Concentration vs Neuron Activity in " + \
63 logging.info("Plotting " + title)
65 plt.plot(self.x, self.y)
67 plt.xlabel("Norepinephrine concentration (nM)")
68 plt.ylabel("Activity (%)")
71 plt.vlines(self.ki, 0, 1, linestyles="dashed")
72 plt.text(1.1 * self.ki, 0.1, "Affinity")
74 plt.hlines(0.5, 0, 1000, linestyles="dashed")
75 plt.text(1, 0.51, "50%")
78 plt.gca().yaxis.set_major_formatter(mtick.PercentFormatter())
81 plt.savefig(f"{out}-norep-activity.png")
83 #######################################################################
85 title = "Concentration vs Gain Scalar in" + self.pretty
86 logging.info("Plotting " + title)
88 plt.plot(self.x, self.gains)
90 plt.xlabel("Norepinephrine concentration (nM)")
97 plt.savefig(f"{out}-concentration-gain.png")
99 #######################################################################
101 title = "Concentration vs Bias scalar in " + self.pretty
102 logging.info("Plotting " + title)
104 plt.plot(self.x, self.biass)
108 plt.xlabel("Norepinephrine concentration (nM)")
113 plt.savefig(f"{out}-concentration-bias.png")
118 Subclass of Alpha representing an alpha1 receptor.
124 self.pretty = "α1 Receptor"
132 Subclass of Alpha representing an alpha2 receptor.
138 self.pretty = "α2 Receptor"
150 for i in range(steps):
151 gain = self.a1.gains[i] + self.a2.gains[i] - 1
152 bias = self.a1.biass[i] + self.a2.biass[i] - 1
153 logging.info(f"gain: {fmt_num(gain)}, bias: {fmt_num(bias)}")
155 with nengo.Network() as net:
157 time_node = nengo.Node(output=time_function)
158 noise_wm_node = nengo.Node(output=noise_bias_function)
159 noise_decision_node = nengo.Node(
160 output=noise_decision_function)
163 wm = nengo.Ensemble(neurons_wm, 2)
164 wm.gain = np.full(wm.n_neurons, gain)
165 wm.bias = np.full(wm.n_neurons, bias)
166 decision = nengo.Ensemble(neurons_decide, 2)
167 inputs = nengo.Ensemble(neurons_inputs, 2)
168 output = nengo.Ensemble(neurons_decide, 1)
171 nengo.Connection(time_node, inputs[1], synapse=None)
172 nengo.Connection(inputs, wm, synapse=tau_wm,
173 function=inputs_function)
174 wm_recurrent = nengo.Connection(wm, wm, synapse=tau_wm)
175 nengo.Connection(noise_wm_node, wm.neurons, synapse=tau_wm,
176 transform=np.ones((neurons_wm, 1)) * tau_wm)
177 wm_to_decision = nengo.Connection(
178 wm[0], decision[0], synapse=tau)
179 nengo.Connection(noise_decision_node,
180 decision[1], synapse=None)
181 nengo.Connection(decision, output, function=decision_function)
184 probes_wm = nengo.Probe(wm[0], synapse=0.01)
185 probe_output = nengo.Probe(output, synapse=None)
188 with nengo.Simulator(net, dt=dt, progress_bar=False) as sim:
189 sim.run(t_cue + t_delay)
193 logging.info("Initializing simulation")
194 plt.style.use("ggplot") # Nice looking and familiar style
198 if __name__ == "__main__":
201 except FileExistsError:
204 logging.basicConfig(filename=f"out/{datetime.now().isoformat()}.log",
206 console = logging.StreamHandler()
207 console.setLevel(logging.INFO)
208 logging.getLogger("").addHandler(console)