In [42]:
import numpy as np

N = 2000

v = np.linspace(-1, 1, 1000)
dv = 2.0/len(v)
def make_gaussian(centre, sigma):
    return np.exp(-(v-centre)**2/(2*sigma**2))

encoders = [make_gaussian(centre=np.random.uniform(-1, 1),
                          sigma=np.random.uniform(0.03, 0.07)) for i in range(N)]
encoders = np.array(encoders)

plot(v,encoders[:30].T)
show()



In [47]:
U, S, V = np.linalg.svd(encoders.T)
basis = U/(np.sqrt(dv))

bases = 40
basis = U[:,:bases]/(np.sqrt(dv))

def func_to_vector(f):
    return np.dot(f, basis)*dv
def vector_to_func(v):
    return np.dot(basis, v.T)

plot(v, basis[:,:5])
#plot(S)
show()



In [16]:
e_vector = func_to_vector(encoders)

for i in range(N):
    norm = np.linalg.norm(e_vector[i])
    e_vector[i]/=norm

In [23]:
import nengo.utils.functions
xx = nengo.utils.functions.whitenoise(0.1, 3)
plot(v, xx(v))


Out[23]:
[<matplotlib.lines.Line2D at 0x250551d0>]

In [24]:
#x = [make_gaussian(centre=np.random.uniform(-1, 1),
#                         sigma=np.random.uniform(0.1, 0.15)) for i in range(1000)]
x = [nengo.utils.functions.whitenoise(0.1, 3)(v) for i in range(1000)]


x = np.array(x)
x_vector = func_to_vector(x)

plot(v,x[:30].T)
show()



In [40]:
def pulse_in(t):
    if 0.05 < t < 0.15:
        return func_to_vector(xx(v))
    else:
        return [0]*bases


import nengo
model = nengo.Network()
with model:
    input = nengo.Node(pulse_in)
    a = nengo.Ensemble(N, bases, encoders=e_vector, eval_points=x_vector)
    nengo.Connection(input, a)
    nengo.Connection(a, a, synapse=0.1)
    probe = nengo.Probe(a, synapse=0.1)

sim = nengo.Simulator(model)

sim.run(5)

data = vector_to_func(sim.data[probe])

import pylab
pylab.imshow(data, aspect='auto')
#pylab.plot(v, data[:,-1])
pylab.show()



In [41]:
pylab.plot(v, data[:,150], label='150ms')
pylab.plot(v, data[:,500], label='500ms')
pylab.plot(v, data[:,2000], label='2000ms')
pylab.plot(v, data[:,4999], label='5000ms')
pylab.legend(loc='best')
pylab.show()



In [ ]: