def scalar_blend(sig_a, sig_b, seed=0): with nengo.Network() as dd_model: osc = nengo.Network() osc.config[nengo.Ensemble].neuron_type = nengo.LIFRate() osc.config[nengo.Ensemble].seed = seed nengo.networks.Oscillator(0.1, 2 * np.pi / period, 300, net=osc) n_prod = 250 prod_dim = 2 mult_config = nengo.Config(nengo.Ensemble) mult_config[nengo.Ensemble].encoders = nengo.dists.Choice([[1, 1], [1, -1], [-1, -1], [-1, 1]]) mult_config[nengo.Ensemble].neuron_type = nengo.LIFRate() mult_config[nengo.Ensemble].radius = np.sqrt(2) with mult_config: prod_a = nengo.Ensemble(n_prod, prod_dim) prod_b = nengo.Ensemble(n_prod, prod_dim) scale_control = nengo.Node(sw.step) in_start = nengo.Node(lambda t, x: 1 - x, size_in=1) # start at 0 and go to 1 nengo.Connection(scale_control, in_start, synapse=None) output = nengo.Node(size_in=1) dda = get_direct_decoders(sig_a, period, osc, bump_func) ddb = get_direct_decoders(sig_b, period, osc, bump_func) bump = nengo.Node(bump_func) nengo.Connection(bump, osc.ensemble[0]) nengo.Connection(osc.ensemble.neurons, prod_a[0], transform=dda.T) nengo.Connection(osc.ensemble.neurons, prod_b[0], transform=ddb.T) nengo.Connection(in_start, prod_a[1]) nengo.Connection(scale_control, prod_b[1]) conn_a = nengo.Connection(prod_a, output, function=lambda x: x[0] * x[1]) conn_b = nengo.Connection(prod_b, output, function=lambda x: x[0] * x[1]) p_in_start = nengo.Probe(in_start) p_inhib = nengo.Probe(scale_control) p_a = nengo.Probe(conn_a, synapse=0.01) p_b = nengo.Probe(conn_b, synapse=0.01) p_out = nengo.Probe(output) with nengo.Simulator(dd_model) as dd_sim: dd_sim.run((t_start + t_blend + 2 * period)) return dd_sim.data[p_a], dd_sim.data[p_b], dd_sim.data[p_out], dd_sim.data[p_inhib], dd_sim.data[p_in_start]
def scalar_blend(sig_a, sig_b, seed=0): with nengo.Network() as dd_model: osc = nengo.Network() osc.config[nengo.Ensemble].neuron_type = nengo.LIFRate() osc.config[nengo.Ensemble].seed = seed nengo.networks.Oscillator(0.1, 2*np.pi/period, 300, net=osc) n_out = 100 with osc.config: out_a = nengo.Ensemble(n_out, 1) out_b = nengo.Ensemble(n_out, 1) inhib_control = nengo.Node(sw.step) in_start = nengo.Node(lambda t, x: x-1, size_in=1) # start at 0 and go to -1 nengo.Connection(inhib_control, in_start, synapse=None) output = nengo.Node(size_in=1) dda = get_direct_decoders(sig_a, period, osc, bump_func) ddb = get_direct_decoders(sig_b, period, osc, bump_func) bump = nengo.Node(bump_func) nengo.Connection(bump, osc.ensemble[0]) nengo.Connection(osc.ensemble.neurons, out_a, transform=dda.T) nengo.Connection(osc.ensemble.neurons, out_b, transform=ddb.T) nengo.Connection(in_start, out_a.neurons, transform=3*np.ones((n_out, 1))) nengo.Connection(inhib_control, out_b.neurons, transform=-3*np.ones((n_out, 1))) nengo.Connection(out_a, output) nengo.Connection(out_b, output) p_in_start = nengo.Probe(in_start) p_inhib = nengo.Probe(inhib_control) p_a = nengo.Probe(out_a, synapse=0.01) p_b = nengo.Probe(out_b, synapse=0.01) p_out = nengo.Probe(output) with nengo.Simulator(dd_model) as dd_sim: dd_sim.run((t_start + t_blend + 2*period)) return dd_sim.data[p_a], dd_sim.data[p_b], dd_sim.data[p_out], dd_sim.data[p_inhib], dd_sim.data[p_in_start]
xv = np.linspace(0, 2 * np.pi, 100) inter_arc = interpolate.interp1d(xv, np.arctan2(np.cos(xv), np.sin(xv))) def arc_func(x): return inter_arc(2 * np.pi * x / period % (2 * np.pi)) with nengo.Network() as ad_model: bump = nengo.Node(bump_func) osc = nengo.Network() osc.config[nengo.Ensemble].neuron_type = nengo.LIFRate() osc.config[nengo.Ensemble].seed = seed nengo.networks.Oscillator(0.1, 2 * np.pi / period, 300, net=osc) dd = get_direct_decoders(arc_func, period, osc, bump_func) dmp, conn_func = make_attrac_net(proc_func, 300, dd=dd, seed=seed) nengo.Connection(bump, osc.ensemble[0]) nengo.Connection(osc.ensemble.neurons, dmp.input, function=conn_func) p_arc = nengo.Probe(arctan, synapse=0.01) p_out = nengo.Probe(dmp.output, synapse=0.01) with nengo.Simulator(ad_model) as ad_sim: ad_sim.run(4 * period) plt.plot(ad_sim.data[p_out][int(2 * period / dt) :]) plt.show()
def target_func(t): return np.sin(sin_per*t) def bump_func(t): return 1 if t < 0.1 else 0 with nengo.Network() as dd_model: osc = nengo.Network() osc.config[nengo.Ensemble].neuron_type = nengo.LIFRate() osc.config[nengo.Ensemble].seed = 0 nengo.networks.Oscillator(0.1, 2*np.pi, 300, net=osc) output = nengo.Node(size_in=1) dd = get_direct_decoders(target_func, period, osc, bump_func) bump = nengo.Node(bump_func) nengo.Connection(bump, osc.ensemble[0]) nengo.Connection(osc.ensemble.neurons, output, transform=dd.T) p_out = nengo.Probe(output) with nengo.Simulator(dd_model) as dd_sim: dd_sim.run(3*period) plt.plot(dd_sim.data[p_out][int(2*period/dt):]) plt.show()