Exemplo n.º 1
0
    def test_vector(self):
        """A network that represents sin(t), cos(t), arctan(t)."""
        N = 40

        m = nengo.Model('test_vector', seed=123)
        m.make_node('in', output=lambda t: [np.sin(t), np.cos(t), np.arctan(t)])
        m.make_ensemble('A', nengo.LIF(N * 3), 3, radius=2)
        m.connect('in', 'A')
        m.probe('in')
        m.probe('A', filter=0.02)

        sim = m.simulator(dt=0.001, sim_class=self.Simulator)
        sim.run(5)

        with Plotter(self.Simulator) as plt:
            t = sim.data(m.t)
            plt.plot(t, sim.data('in'), label='Input')
            plt.plot(t, sim.data('A'), label='Neuron approximation, pstc=0.02')
            plt.legend(loc='best', prop={'size': 10})
            plt.savefig('test_ensemble.test_vector.pdf')
            plt.close()

        target = np.vstack((np.sin(np.arange(5000) / 1000.),
                            np.cos(np.arange(5000) / 1000.),
                            np.arctan(np.arange(5000) / 1000.))).T
        logger.debug("In RMSE: %f", rmse(target, sim.data('in')))
        self.assertTrue(rmse(target, sim.data('in') < 0.001))
        self.assertTrue(rmse(target, sim.data('A')) < 0.1)
Exemplo n.º 2
0
def test_scalar(Simulator, nl):
    """A network that represents sin(t)."""
    N = 30

    m = nengo.Model('test_scalar', seed=123)
    input = nengo.Node(output=np.sin, label='input')
    A = nengo.Ensemble(nl(N), 1, label='A')
    nengo.Connection(input, A)
    in_p = nengo.Probe(input, 'output')
    A_p = nengo.Probe(A, 'decoded_output', filter=0.02)

    sim = Simulator(m)
    sim.run(5.0)

    with Plotter(Simulator, nl) as plt:
        t = sim.trange()
        plt.plot(t, sim.data(in_p), label='Input')
        plt.plot(t, sim.data(A_p), label='Neuron approximation, pstc=0.02')
        plt.legend(loc=0)
        plt.savefig('test_ensemble.test_scalar.pdf')
        plt.close()

    target = np.sin(np.arange(5000) / 1000.)
    target.shape = (-1, 1)
    logger.debug("[New API] input RMSE: %f", rmse(target, sim.data(in_p)))
    logger.debug("[New API] A RMSE: %f", rmse(target, sim.data(A_p)))
    assert rmse(target, sim.data(in_p)) < 0.001
    assert rmse(target, sim.data(A_p)) < 0.1
Exemplo n.º 3
0
def test_vector(Simulator, nl):
    """A network that represents sin(t), cos(t), arctan(t)."""
    N = 40

    m = nengo.Model('test_vector', seed=123)
    input = nengo.Node(output=lambda t: [np.sin(t), np.cos(t), np.arctan(t)])
    A = nengo.Ensemble(nl(N * 3), 3, radius=2)
    nengo.Connection(input, A)
    in_p = nengo.Probe(input, 'output')
    A_p = nengo.Probe(A, 'decoded_output', filter=0.02)

    sim = Simulator(m)
    sim.run(5)

    with Plotter(Simulator, nl) as plt:
        t = sim.trange()
        plt.plot(t, sim.data(in_p), label='Input')
        plt.plot(t, sim.data(A_p), label='Neuron approximation, pstc=0.02')
        plt.legend(loc='best', prop={'size': 10})
        plt.savefig('test_ensemble.test_vector.pdf')
        plt.close()

    target = np.vstack((np.sin(np.arange(5000) / 1000.),
                        np.cos(np.arange(5000) / 1000.),
                        np.arctan(np.arange(5000) / 1000.))).T
    logger.debug("In RMSE: %f", rmse(target, sim.data(in_p)))
    assert rmse(target, sim.data(in_p)) < 0.01
    assert rmse(target, sim.data(A_p)) < 0.1
Exemplo n.º 4
0
    def test_scalar(self):
        """A network that represents sin(t)."""
        simulator = self.Simulator
        params = dict(simulator=simulator, seed=123, dt=0.001)
        N = 30
        target = np.sin(np.arange(4999) / 1000.)
        target.shape = (4999, 1)

        # Old API
        net = nef.Network('test_scalar', **params)
        net.make_input('in', value=np.sin)
        net.make('A', N, 1)
        net.connect('in', 'A')

        in_p = net.make_probe('in', dt_sample=0.001, pstc=0.0)
        a_p = net.make_probe('A', dt_sample=0.001, pstc=0.02)
        net.run(5)

        in_data = in_p.get_data()
        a_data = a_p.get_data()

        with Plotter(simulator) as plt:
            t = net.model.data[net.model.simtime]
            plt.plot(t, in_data, label='Input')
            plt.plot(t, a_data, label='Neuron approximation, pstc=0.02')
            plt.legend(loc=0)
            plt.savefig('test_ensemble.test_scalar-old.pdf')
            plt.close()

        logger.debug("[Old API] input RMSE: %f", rmse(target, in_data))
        logger.debug("[Old API] A RMSE: %f", rmse(target, a_data))
        self.assertTrue(rmse(target, in_data) < 0.001)
        self.assertTrue(rmse(target, a_data) < 0.1)

        # New API
        m = nengo.Model('test_scalar', **params)
        m.make_node('in', output=np.sin)
        m.make_ensemble('A', nengo.LIF(N), 1)
        m.connect('in', 'A')

        m.probe('in')
        m.probe('A', filter=0.02)
        m.run(5)

        with Plotter(simulator) as plt:
            t = m.data[m.simtime]
            plt.plot(t, m.data['in'], label='Input')
            plt.plot(t, m.data['A'], label='Neuron approximation, pstc=0.02')
            plt.legend(loc=0)
            plt.savefig('test_ensemble.test_scalar-new.pdf')
            plt.close()

        logger.debug("[New API] input RMSE: %f", rmse(target, m.data['in']))
        logger.debug("[New API] A RMSE: %f", rmse(target, m.data['A']))
        self.assertTrue(rmse(target, m.data['in']) < 0.001)
        self.assertTrue(rmse(target, m.data['A']) < 0.1)

        # Check old/new API similarity
        logger.debug("Old/New API RMSE: %f", rmse(a_data, m.data['A']))
        self.assertTrue(rmse(a_data, m.data['A']) < 0.1)
Exemplo n.º 5
0
    def test_scalar(self):
        """A network that represents sin(t)."""
        simulator = self.Simulator
        params = dict(simulator=simulator, seed=123, dt=0.001)
        N = 30
        target = np.sin(np.arange(4999) / 1000.)
        target.shape = (4999, 1)

        # Old API
        net = nef.Network('test_scalar', **params)
        net.make_input('in', value=np.sin)
        net.make('A', N, 1)
        net.connect('in', 'A')

        in_p = net.make_probe('in', dt_sample=0.001, pstc=0.0)
        a_p = net.make_probe('A', dt_sample=0.001, pstc=0.02)
        net.run(5)

        in_data = in_p.get_data()
        a_data = a_p.get_data()

        with Plotter(simulator) as plt:
            t = net.model.data[net.model.simtime]
            plt.plot(t, in_data, label='Input')
            plt.plot(t, a_data, label='Neuron approximation, pstc=0.02')
            plt.legend(loc=0)
            plt.savefig('test_ensemble.test_scalar-old.pdf')
            plt.close()

        logger.debug("[Old API] input RMSE: %f", rmse(target, in_data))
        logger.debug("[Old API] A RMSE: %f", rmse(target, a_data))
        self.assertTrue(rmse(target, in_data) < 0.001)
        self.assertTrue(rmse(target, a_data) < 0.1)

        # New API
        m = nengo.Model('test_scalar', **params)
        m.make_node('in', output=np.sin)
        m.make_ensemble('A', nengo.LIF(N), 1)
        m.connect('in', 'A')

        m.probe('in')
        m.probe('A', filter=0.02)
        m.run(5)

        with Plotter(simulator) as plt:
            t = m.data[m.simtime]
            plt.plot(t, m.data['in'], label='Input')
            plt.plot(t, m.data['A'], label='Neuron approximation, pstc=0.02')
            plt.legend(loc=0)
            plt.savefig('test_ensemble.test_scalar-new.pdf')
            plt.close()

        logger.debug("[New API] input RMSE: %f", rmse(target, m.data['in']))
        logger.debug("[New API] A RMSE: %f", rmse(target, m.data['A']))
        self.assertTrue(rmse(target, m.data['in']) < 0.001)
        self.assertTrue(rmse(target, m.data['A']) < 0.1)

        # Check old/new API similarity
        logger.debug("Old/New API RMSE: %f", rmse(a_data, m.data['A']))
        self.assertTrue(rmse(a_data, m.data['A']) < 0.1)
Exemplo n.º 6
0
    def test_scalar(self):
        """A network that represents sin(t)."""
        N = 30

        m = nengo.Model('test_scalar', seed=123)
        m.make_node('in', output=np.sin)
        m.make_ensemble('A', nengo.LIF(N), 1)
        m.connect('in', 'A')
        m.probe('in')
        m.probe('A', filter=0.02)

        sim = m.simulator(dt=0.001, sim_class=self.Simulator)
        sim.run(5.0)

        with Plotter(self.Simulator) as plt:
            t = sim.data(m.t)
            plt.plot(t, sim.data('in'), label='Input')
            plt.plot(t, sim.data('A'), label='Neuron approximation, pstc=0.02')
            plt.legend(loc=0)
            plt.savefig('test_ensemble.test_scalar.pdf')
            plt.close()

        target = np.sin(np.arange(5000) / 1000.)
        target.shape = (-1, 1)
        logger.debug("[New API] input RMSE: %f", rmse(target, sim.data('in')))
        logger.debug("[New API] A RMSE: %f", rmse(target, sim.data('A')))
        self.assertTrue(rmse(target, sim.data('in')) < 0.001)
        self.assertTrue(rmse(target, sim.data('A')) < 0.1)
Exemplo n.º 7
0
    def test_integrator(self):
        model = nengo.Model('Integrator')
        with model:
            inputs = {0: 0, 0.2: 1, 1: 0, 2: -2, 3: 0, 4: 1, 5: 0}
            input = nengo.Node(nengo.helpers.piecewise(inputs))

            tau = 0.1
            T = nengo.networks.Integrator(
                tau, neurons=nengo.LIF(100), dimensions=1)
            nengo.Connection(input, T.input, filter=tau)

            A = nengo.Ensemble(nengo.LIF(100), dimensions=1)
            nengo.Connection(A, A, transform=[[1]], filter=tau)
            nengo.Connection(input, A, transform=[[tau]], filter=tau)

            input_p = nengo.Probe(input, 'output')
            A_p = nengo.Probe(A, 'decoded_output', filter=0.01)
            T_p = nengo.Probe(T.ensemble, 'decoded_output', filter=0.01)

        sim = self.Simulator(model, dt=0.001)
        sim.run(6.0)

        with Plotter(self.Simulator) as plt:
            t = sim.trange()
            plt.plot(t, sim.data(A_p), label='Manual')
            plt.plot(t, sim.data(T_p), label='Template')
            plt.plot(t, sim.data(input_p), 'k', label='Input')
            plt.legend(loc=0)
            plt.savefig('test_integrator.test_integrator.pdf')
            plt.close()

        self.assertTrue(rmse(sim.data(A_p), sim.data(T_p)) < 0.2)
Exemplo n.º 8
0
    def test_oscillator(self):
        model = nengo.Model('Oscillator')
        inputs = {0: [1, 0], 0.5: [0, 0]}
        model.make_node('Input', nengo.helpers.piecewise(inputs))

        tau = 0.1
        freq = 5
        model.add(Oscillator('T', tau, freq, neurons=nengo.LIF(100)))
        model.connect('Input', 'T.In')

        model.make_ensemble('A', nengo.LIF(100), dimensions=2)
        model.connect('A',
                      'A',
                      filter=tau,
                      transform=[[1, -freq * tau], [freq * tau, 1]])
        model.connect('Input', 'A')

        model.probe('Input')
        model.probe('A', filter=0.01)
        model.probe('T.Oscillator', filter=0.01)
        sim = model.simulator(dt=0.001, sim_class=self.Simulator)
        sim.run(3.0)

        with Plotter(self.Simulator) as plt:
            t = sim.data(model.t)
            plt.plot(t, sim.data('A'), label='Manual')
            plt.plot(t, sim.data('T.Oscillator'), label='Template')
            plt.plot(t, sim.data('Input'), 'k', label='Input')
            plt.legend(loc=0)
            plt.savefig('test_oscillator.test_oscillator.pdf')
            plt.close()

        self.assertTrue(rmse(sim.data('A'), sim.data('T.Oscillator')) < 0.3)
def test_oscillator(Simulator, nl):
    model = nengo.Model('Oscillator')

    inputs = {0: [1, 0], 0.5: [0, 0]}
    input = nengo.Node(nengo.helpers.piecewise(inputs), label='Input')

    tau = 0.1
    freq = 5
    T = nengo.networks.Oscillator(
        tau, freq, label="Oscillator", neurons=nl(100))
    nengo.Connection(input, T.input)

    A = nengo.Ensemble(nl(100), label='A', dimensions=2)
    nengo.Connection(A, A, filter=tau,
                     transform=[[1, -freq*tau], [freq*tau, 1]])
    nengo.Connection(input, A)

    in_probe = nengo.Probe(input, "output")
    A_probe = nengo.Probe(A, "decoded_output", filter=0.01)
    T_probe = nengo.Probe(T.ensemble, "decoded_output", filter=0.01)

    sim = Simulator(model)
    sim.run(3.0)

    with Plotter(Simulator, nl) as plt:
        t = sim.trange()
        plt.plot(t, sim.data(A_probe), label='Manual')
        plt.plot(t, sim.data(T_probe), label='Template')
        plt.plot(t, sim.data(in_probe), 'k', label='Input')
        plt.legend(loc=0)
        plt.savefig('test_oscillator.test_oscillator.pdf')
        plt.close()

    assert rmse(sim.data(A_probe), sim.data(T_probe)) < 0.3
Exemplo n.º 10
0
    def test_oscillator(self):
        model = nengo.Model('Oscillator')
        inputs = {0:[1,0],0.5:[0,0]}
        model.make_node('Input', nengo.helpers.piecewise(inputs))

        tau = 0.1
        freq = 5
        model.add(Oscillator('T', tau, freq, neurons=nengo.LIF(100)))
        model.connect('Input', 'T.In')

        model.make_ensemble('A', nengo.LIF(100), dimensions=2)
        model.connect('A', 'A', filter=tau,
                      transform=[[1, -freq*tau], [freq*tau, 1]])
        model.connect('Input', 'A')

        model.probe('Input')
        model.probe('A', filter=0.01)
        model.probe('T.Oscillator', filter=0.01)
        sim = model.simulator(dt=0.001, sim_class=self.Simulator)
        sim.run(3.0)

        with Plotter(self.Simulator) as plt:
            t = sim.data(model.t)
            plt.plot(t, sim.data('A'), label='Manual')
            plt.plot(t, sim.data('T.Oscillator'), label='Template')
            plt.plot(t, sim.data('Input'), 'k', label='Input')
            plt.legend(loc=0)
            plt.savefig('test_oscillator.test_oscillator.pdf')
            plt.close()

        self.assertTrue(rmse(sim.data('A'), sim.data('T.Oscillator')) < 0.3)
Exemplo n.º 11
0
    def test_integrator(self):
        model = nengo.Model('Integrator')
        inputs = {0:0, 0.2:1, 1:0, 2:-2, 3:0, 4:1, 5:0}
        model.make_node('Input', nengo.helpers.piecewise(inputs))

        tau = 0.1
        model.add(Integrator('T', tau, neurons=nengo.LIF(100), dimensions=1))
        model.connect('Input', 'T.In', filter=tau)

        model.make_ensemble('A', nengo.LIF(100), dimensions=1)
        model.connect('A', 'A', transform=[[1]], filter=tau)
        model.connect('Input', 'A', transform=[[tau]], filter=tau)

        model.probe('Input')
        model.probe('A', filter=0.01)
        model.probe('T.Integrator', filter=0.01)
        sim = model.simulator(dt=0.001, sim_class=self.Simulator)
        sim.run(6.0)

        with Plotter(self.Simulator) as plt:
            t = sim.data(model.t)
            plt.plot(t, sim.data('A'), label='Manual')
            plt.plot(t, sim.data('T.Integrator'), label='Template')
            plt.plot(t, sim.data('Input'), 'k', label='Input')
            plt.legend(loc=0)
            plt.savefig('test_integrator.test_integrator.pdf')
            plt.close()

        self.assertTrue(rmse(sim.data('A'), sim.data('T.Integrator')) < 0.2)
Exemplo n.º 12
0
def test_product(Simulator, nl):
    N = 80

    m = nengo.Model('test_product', seed=124)
    sin = nengo.Node(output=np.sin)
    cons = nengo.Node(output=-.5)
    factors = nengo.Ensemble(nl(2 * N), dimensions=2, radius=1.5)
    if nl != nengo.Direct:
        factors.encoders = np.tile(
            [[1, 1], [-1, 1], [1, -1], [-1, -1]],
            (factors.n_neurons // 4, 1))
    product = nengo.Ensemble(nl(N), dimensions=1)
    nengo.Connection(sin, factors, transform=[[1], [0]])
    nengo.Connection(cons, factors, transform=[[0], [1]])
    nengo.Connection(
        factors, product, function=lambda x: x[0] * x[1], filter=0.01)

    sin_p = nengo.Probe(sin, 'output', sample_every=.01)
    # TODO
    # m.probe(conn, sample_every=.01)
    factors_p = nengo.Probe(
        factors, 'decoded_output', sample_every=.01, filter=.01)
    product_p = nengo.Probe(
        product, 'decoded_output', sample_every=.01, filter=.01)

    sim = Simulator(m)
    sim.run(6)

    with Plotter(Simulator, nl) as plt:
        t = sim.trange(dt=.01)
        plt.subplot(211)
        plt.plot(t, sim.data(factors_p))
        plt.plot(t, np.sin(np.arange(0, 6, .01)))
        plt.plot(t, sim.data(sin_p))
        plt.subplot(212)
        plt.plot(t, sim.data(product_p))
        # TODO
        # plt.plot(sim.data(conn))
        plt.plot(t, -.5 * np.sin(np.arange(0, 6, .01)))
        plt.savefig('test_ensemble.test_prod.pdf')
        plt.close()

    sin = np.sin(np.arange(0, 6, .01))
    assert rmse(sim.data(factors_p)[:, 0], sin) < 0.1
    assert rmse(sim.data(factors_p)[20:, 1], -0.5) < 0.1

    assert rmse(sim.data(product_p)[:, 0], -0.5 * sin) < 0.1
Exemplo n.º 13
0
    def test_product(self):
        def product(x):
            return x[0] * x[1]

        m = nengo.Model('test_product', seed=124)

        N = 80
        m.make_node('sin', output=np.sin)
        m.make_node('-0.5', output=-.5)
        factors = m.make_ensemble(
            'factors', nengo.LIF(2 * N), dimensions=2, radius=1.5)
        factors.encoders = np.tile([[1, 1],[-1, 1],[1, -1],[-1, -1]],
                                   (factors.n_neurons / 4, 1))
        m.make_ensemble('product', nengo.LIF(N), dimensions=1)
        m.connect('sin', 'factors', transform=[[1], [0]])
        m.connect('-0.5', 'factors', transform=[[0], [1]])
        conn = m.connect('factors', 'product', function=product, filter=0.01)

        m.probe('sin', sample_every=.01)
        # m.probe(conn, sample_every=.01)  # FIXME
        m.probe('factors', sample_every=.01, filter=.01)
        m.probe('product', sample_every=.01, filter=.01)

        sim = m.simulator(dt=0.001, sim_class=self.Simulator)
        sim.run(6)

        with Plotter(self.Simulator) as plt:
            plt.subplot(211)
            plt.plot(sim.data('factors'))
            plt.plot(np.sin(np.arange(0, 6, .01)))
            plt.plot(sim.data('sin'))
            plt.subplot(212)
            plt.plot(sim.data('product'))
            #plt.plot(sim.data(conn))
            plt.plot(-.5 * np.sin(np.arange(0, 6, .01)))
            plt.savefig('test_ensemble.test_prod.pdf')
            plt.close()

        self.assertTrue(rmse(sim.data('factors')[:, 0],
                             np.sin(np.arange(0, 6, .01))) < 0.1)
        self.assertTrue(rmse(sim.data('factors')[20:, 1], -0.5) < 0.1)

        def match(a, b):
            self.assertTrue(rmse(a, b) < 0.1)

        match(sim.data('product')[:, 0], -0.5 * np.sin(np.arange(0, 6, .01)))
Exemplo n.º 14
0
    def test_vector(self):
        """A network that represents sin(t), cos(t), arctan(t)."""
        simulator = self.Simulator
        params = dict(simulator=simulator, seed=123, dt=0.001)
        N = 40
        target = np.vstack(
            (np.sin(np.arange(4999) / 1000.), np.cos(np.arange(4999) / 1000.),
             np.arctan(np.arange(4999) / 1000.))).T

        # Old API
        net = nef.Network('test_vector', **params)
        net.make_input('sin', value=np.sin)
        net.make_input('cos', value=np.cos)
        net.make_input('arctan', value=np.arctan)
        net.make('A', N * 3, 3, radius=2)
        net.connect('sin', 'A', transform=[[1], [0], [0]])
        net.connect('cos', 'A', transform=[[0], [1], [0]])
        net.connect('arctan', 'A', transform=[[0], [0], [1]])

        sin_p = net.make_probe('sin', dt_sample=0.001, pstc=0.0)
        cos_p = net.make_probe('cos', dt_sample=0.001, pstc=0.0)
        arctan_p = net.make_probe('arctan', dt_sample=0.001, pstc=0.0)
        a_p = net.make_probe('A', dt_sample=0.001, pstc=0.02)
        net.run(5)

        sin_data = sin_p.get_data()
        cos_data = cos_p.get_data()
        arctan_data = arctan_p.get_data()
        a_data = a_p.get_data()

        with Plotter(simulator) as plt:
            t = net.model.data[net.model.simtime]
            plt.plot(t, sin_data, label='sin')
            plt.plot(t, cos_data, label='cos')
            plt.plot(t, arctan_data, label='arctan')
            plt.plot(t, a_data, label='Neuron approximation, pstc=0.02')
            plt.legend(loc=0, prop={'size': 10})
            plt.savefig('test_ensemble.test_vector-old.pdf')
            plt.close()

        logger.debug("[Old API] sin RMSE: %f", rmse(target[:, 0], sin_data))
        logger.debug("[Old API] cos RMSE: %f", rmse(target[:, 1], cos_data))
        logger.debug("[Old API] atan RMSE: %f", rmse(target[:, 2],
                                                     arctan_data))
        logger.debug("[Old API] A RMSE: %f", rmse(target, a_data))
        self.assertTrue(rmse(target, a_data) < 0.1)

        # New API
        m = nengo.Model('test_vector', **params)
        m.make_node('sin', output=np.sin)
        m.make_node('cos', output=np.cos)
        m.make_node('arctan', output=np.arctan)
        m.make_ensemble('A', nengo.LIF(N * 3), 3, radius=2)
        m.connect('sin', 'A', transform=[[1], [0], [0]])
        m.connect('cos', 'A', transform=[[0], [1], [0]])
        m.connect('arctan', 'A', transform=[[0], [0], [1]])

        m.probe('sin')
        m.probe('cos')
        m.probe('arctan')
        m.probe('A', filter=0.02)
        m.run(5)

        with Plotter(simulator) as plt:
            t = m.data[m.simtime]
            plt.plot(t, m.data['sin'], label='sin')
            plt.plot(t, m.data['cos'], label='cos')
            plt.plot(t, m.data['arctan'], label='arctan')
            plt.plot(t, m.data['A'], label='Neuron approximation, pstc=0.02')
            plt.legend(loc=0, prop={'size': 10})
            plt.savefig('test_ensemble.test_vector-new.pdf')
            plt.close()

        # Not sure why, but this isn't working...
        logger.debug("[New API] sin RMSE: %f", rmse(target[:, 0],
                                                    m.data['sin']))
        logger.debug("[New API] cos RMSE: %f", rmse(target[:, 1],
                                                    m.data['cos']))
        logger.debug("[New API] atan RMSE: %f",
                     rmse(target[:, 2], m.data['arctan']))
        logger.debug("[New API] A RMSE: %f", rmse(target, m.data['A']))
        self.assertTrue(rmse(target, m.data['A']) < 0.1)

        # Check old/new API similarity
        logger.debug("Old/New API RMSE: %f", rmse(a_data, m.data['A']))
        self.assertTrue(rmse(a_data, m.data['A']) < 0.1)
Exemplo n.º 15
0
    def _test_circularconv(self, dims=5, neurons_per_product=128):
        rng = np.random.RandomState(42342)

        n_neurons = neurons_per_product * dims
        n_neurons_d = 2 * neurons_per_product * (2 * dims -
                                                 (2 if dims % 2 == 0 else 1))
        radius = 1

        a = rng.normal(scale=np.sqrt(1. / dims), size=dims)
        b = rng.normal(scale=np.sqrt(1. / dims), size=dims)
        c = circconv(a, b)
        self.assertTrue(np.abs(a).max() < radius)
        self.assertTrue(np.abs(b).max() < radius)
        self.assertTrue(np.abs(c).max() < radius)

        ### model
        model = nengo.Model("circular convolution")
        inputA = model.make_node("inputA", output=a)
        inputB = model.make_node("inputB", output=b)
        A = model.add(
            EnsembleArray('A', nengo.LIF(n_neurons), dims, radius=radius))
        B = model.add(
            EnsembleArray('B', nengo.LIF(n_neurons), dims, radius=radius))
        C = model.add(
            EnsembleArray('C', nengo.LIF(n_neurons), dims, radius=radius))
        D = model.add(
            CircularConvolution('D',
                                neurons=nengo.LIF(n_neurons_d),
                                dimensions=A.dimensions,
                                radius=radius))

        inputA.connect_to(A)
        inputB.connect_to(B)
        A.connect_to(D.A)
        B.connect_to(D.B)
        D.output.connect_to(C)

        model.probe(A, filter=0.03)
        model.probe(B, filter=0.03)
        model.probe(C, filter=0.03)
        model.probe(D.ensemble, filter=0.03)

        # check FFT magnitude
        d = np.dot(D.transformA, a) + np.dot(D.transformB, b)
        self.assertTrue(np.abs(d).max() < radius)

        ### simulation
        sim = model.simulator(sim_class=self.Simulator)
        sim.run(1.0)

        t = sim.data(model.t).flatten()

        with Plotter(self.Simulator) as plt:

            def plot(sim, a, A, title=""):
                a_ref = np.tile(a, (len(t), 1))
                a_sim = sim.data(A)
                colors = ['b', 'g', 'r', 'c', 'm', 'y']
                for i in xrange(min(dims, len(colors))):
                    plt.plot(t, a_ref[:, i], '--', color=colors[i])
                    plt.plot(t, a_sim[:, i], '-', color=colors[i])
                    plt.title(title)

            plt.subplot(221)
            plot(sim, a, A, title="A")
            plt.subplot(222)
            plot(sim, b, B, title="B")
            plt.subplot(223)
            plot(sim, c, C, title="C")
            plt.subplot(224)
            plot(sim, d, D.ensemble, title="D")
            plt.savefig('test_circularconv.test_circularconv_%d.pdf' % dims)
            plt.close()

        ### results
        tmask = t > (0.5 + sim.model.dt / 2)
        self.assertEqual(sim.data(A)[tmask].shape, (499, dims))
        a_sim = sim.data(A)[tmask].mean(axis=0)
        b_sim = sim.data(B)[tmask].mean(axis=0)
        c_sim = sim.data(C)[tmask].mean(axis=0)
        d_sim = sim.data(D.ensemble)[tmask].mean(axis=0)

        rtol, atol = 0.1, 0.05
        self.assertTrue(np.allclose(a, a_sim, rtol=rtol, atol=atol))
        self.assertTrue(np.allclose(b, b_sim, rtol=rtol, atol=atol))
        self.assertTrue(np.allclose(d, d_sim, rtol=rtol, atol=atol))
        self.assertTrue(rmse(c, c_sim) < 0.075)
Exemplo n.º 16
0
    def test_vector(self):
        """A network that represents sin(t), cos(t), arctan(t)."""
        simulator = self.Simulator
        params = dict(simulator=simulator, seed=123, dt=0.001)
        N = 40
        target = np.vstack((np.sin(np.arange(4999) / 1000.),
                            np.cos(np.arange(4999) / 1000.),
                            np.arctan(np.arange(4999) / 1000.))).T

        # Old API
        net = nef.Network('test_vector', **params)
        net.make_input('sin', value=np.sin)
        net.make_input('cos', value=np.cos)
        net.make_input('arctan', value=np.arctan)
        net.make('A', N * 3, 3, radius=2)
        net.connect('sin', 'A', transform=[[1], [0], [0]])
        net.connect('cos', 'A', transform=[[0], [1], [0]])
        net.connect('arctan', 'A', transform=[[0], [0], [1]])

        sin_p = net.make_probe('sin', dt_sample=0.001, pstc=0.0)
        cos_p = net.make_probe('cos', dt_sample=0.001, pstc=0.0)
        arctan_p = net.make_probe('arctan', dt_sample=0.001, pstc=0.0)
        a_p = net.make_probe('A', dt_sample=0.001, pstc=0.02)
        net.run(5)

        sin_data = sin_p.get_data()
        cos_data = cos_p.get_data()
        arctan_data = arctan_p.get_data()
        a_data = a_p.get_data()

        with Plotter(simulator) as plt:
            t = net.model.data[net.model.simtime]
            plt.plot(t, sin_data, label='sin')
            plt.plot(t, cos_data, label='cos')
            plt.plot(t, arctan_data, label='arctan')
            plt.plot(t, a_data, label='Neuron approximation, pstc=0.02')
            plt.legend(loc=0, prop={'size': 10})
            plt.savefig('test_ensemble.test_vector-old.pdf')
            plt.close()

        logger.debug("[Old API] sin RMSE: %f", rmse(target[:,0], sin_data))
        logger.debug("[Old API] cos RMSE: %f", rmse(target[:,1], cos_data))
        logger.debug("[Old API] atan RMSE: %f", rmse(target[:,2], arctan_data))
        logger.debug("[Old API] A RMSE: %f", rmse(target, a_data))
        self.assertTrue(rmse(target, a_data) < 0.1)

        # New API
        m = nengo.Model('test_vector', **params)
        m.make_node('sin', output=np.sin)
        m.make_node('cos', output=np.cos)
        m.make_node('arctan', output=np.arctan)
        m.make_ensemble('A', nengo.LIF(N * 3), 3, radius=2)
        m.connect('sin', 'A', transform=[[1], [0], [0]])
        m.connect('cos', 'A', transform=[[0], [1], [0]])
        m.connect('arctan', 'A', transform=[[0], [0], [1]])

        m.probe('sin')
        m.probe('cos')
        m.probe('arctan')
        m.probe('A', filter=0.02)
        m.run(5)

        with Plotter(simulator) as plt:
            t = m.data[m.simtime]
            plt.plot(t, m.data['sin'], label='sin')
            plt.plot(t, m.data['cos'], label='cos')
            plt.plot(t, m.data['arctan'], label='arctan')
            plt.plot(t, m.data['A'], label='Neuron approximation, pstc=0.02')
            plt.legend(loc=0, prop={'size': 10})
            plt.savefig('test_ensemble.test_vector-new.pdf')
            plt.close()

        # Not sure why, but this isn't working...
        logger.debug("[New API] sin RMSE: %f", rmse(target[:,0], m.data['sin']))
        logger.debug("[New API] cos RMSE: %f", rmse(target[:,1], m.data['cos']))
        logger.debug("[New API] atan RMSE: %f",
                     rmse(target[:,2], m.data['arctan']))
        logger.debug("[New API] A RMSE: %f", rmse(target, m.data['A']))
        self.assertTrue(rmse(target, m.data['A']) < 0.1)

        # Check old/new API similarity
        logger.debug("Old/New API RMSE: %f", rmse(a_data, m.data['A']))
        self.assertTrue(rmse(a_data, m.data['A']) < 0.1)
Exemplo n.º 17
0
 def match(a, b):
     self.assertTrue(rmse(a, b) < 0.1)
Exemplo n.º 18
0
    def _test_circularconv(self, dims=5, neurons_per_product=128):
        rng = np.random.RandomState(42342)

        n_neurons = neurons_per_product * dims
        n_neurons_d = 2 * neurons_per_product * (
            2*dims - (2 if dims % 2 == 0 else 1))
        radius = 1

        a = rng.normal(scale=np.sqrt(1./dims), size=dims)
        b = rng.normal(scale=np.sqrt(1./dims), size=dims)
        c = circconv(a, b)
        self.assertTrue(np.abs(a).max() < radius)
        self.assertTrue(np.abs(b).max() < radius)
        self.assertTrue(np.abs(c).max() < radius)

        ### model
        model = nengo.Model("circular convolution")
        inputA = model.make_node("inputA", output=a)
        inputB = model.make_node("inputB", output=b)
        A = model.add(EnsembleArray(
            'A', nengo.LIF(n_neurons), dims, radius=radius))
        B = model.add(EnsembleArray(
            'B', nengo.LIF(n_neurons), dims, radius=radius))
        C = model.add(EnsembleArray(
            'C', nengo.LIF(n_neurons), dims, radius=radius))
        D = model.add(CircularConvolution(
            'D', neurons=nengo.LIF(n_neurons_d),
            dimensions=A.dimensions, radius=radius))

        inputA.connect_to(A)
        inputB.connect_to(B)
        A.connect_to(D.A)
        B.connect_to(D.B)
        D.output.connect_to(C)

        model.probe(A, filter=0.03)
        model.probe(B, filter=0.03)
        model.probe(C, filter=0.03)
        model.probe(D.ensemble, filter=0.03)

        # check FFT magnitude
        d = np.dot(D.transformA, a) + np.dot(D.transformB, b)
        self.assertTrue(np.abs(d).max() < radius)

        ### simulation
        sim = model.simulator(sim_class=self.Simulator)
        sim.run(1.0)

        t = sim.data(model.t).flatten()

        with Plotter(self.Simulator) as plt:
            def plot(sim, a, A, title=""):
                a_ref = np.tile(a, (len(t), 1))
                a_sim = sim.data(A)
                colors = ['b', 'g', 'r', 'c', 'm', 'y']
                for i in xrange(min(dims, len(colors))):
                    plt.plot(t, a_ref[:,i], '--', color=colors[i])
                    plt.plot(t, a_sim[:,i], '-', color=colors[i])
                    plt.title(title)

            plt.subplot(221)
            plot(sim, a, A, title="A")
            plt.subplot(222)
            plot(sim, b, B, title="B")
            plt.subplot(223)
            plot(sim, c, C, title="C")
            plt.subplot(224)
            plot(sim, d, D.ensemble, title="D")
            plt.savefig('test_circularconv.test_circularconv_%d.pdf' % dims)
            plt.close()

        ### results
        tmask = t > (0.5 + sim.model.dt/2)
        self.assertEqual(sim.data(A)[tmask].shape, (499, dims))
        a_sim = sim.data(A)[tmask].mean(axis=0)
        b_sim = sim.data(B)[tmask].mean(axis=0)
        c_sim = sim.data(C)[tmask].mean(axis=0)
        d_sim = sim.data(D.ensemble)[tmask].mean(axis=0)

        rtol, atol = 0.1, 0.05
        self.assertTrue(np.allclose(a, a_sim, rtol=rtol, atol=atol))
        self.assertTrue(np.allclose(b, b_sim, rtol=rtol, atol=atol))
        self.assertTrue(np.allclose(d, d_sim, rtol=rtol, atol=atol))
        self.assertTrue(rmse(c, c_sim) < 0.075)
def test_circularconv(Simulator, nl, dims=4, neurons_per_product=128):
    rng = np.random.RandomState(42342)

    n_neurons = neurons_per_product
    n_neurons_d = 2 * neurons_per_product
    radius = 1

    a = rng.normal(scale=np.sqrt(1./dims), size=dims)
    b = rng.normal(scale=np.sqrt(1./dims), size=dims)
    c = circconv(a, b)
    assert np.abs(a).max() < radius
    assert np.abs(b).max() < radius
    assert np.abs(c).max() < radius

    ### model
    model = nengo.Model("circular convolution")

    inputA = nengo.Node(output=a)
    inputB = nengo.Node(output=b)
    A = EnsembleArray(nl(n_neurons), dims, radius=radius)
    B = EnsembleArray(nl(n_neurons), dims, radius=radius)
    C = EnsembleArray(nl(n_neurons), dims, radius=radius)
    D = nengo.networks.CircularConvolution(
        neurons=nl(n_neurons_d),
        dimensions=A.dimensions, radius=radius)

    nengo.Connection(inputA, A.input)
    nengo.Connection(inputB, B.input)
    nengo.Connection(A.output, D.A)
    nengo.Connection(B.output, D.B)
    nengo.Connection(D.output, C.input)

    A_p = nengo.Probe(A.output, 'output', filter=0.03)
    B_p = nengo.Probe(B.output, 'output', filter=0.03)
    C_p = nengo.Probe(C.output, 'output', filter=0.03)
    D_p = nengo.Probe(D.ensemble.output, 'output', filter=0.03)

    # check FFT magnitude
    d = np.dot(D.transformA, a) + np.dot(D.transformB, b)
    assert np.abs(d).max() < radius

    ### simulation
    sim = Simulator(model)
    sim.run(1.0)

    t = sim.trange()

    with Plotter(Simulator, nl) as plt:
        def plot(sim, a, A, title=""):
            a_ref = np.tile(a, (len(t), 1))
            a_sim = sim.data(A_p)
            colors = ['b', 'g', 'r', 'c', 'm', 'y']
            for i in range(min(dims, len(colors))):
                plt.plot(t, a_ref[:, i], '--', color=colors[i])
                plt.plot(t, a_sim[:, i], '-', color=colors[i])
                plt.title(title)

        plt.subplot(221)
        plot(sim, a, A, title="A")
        plt.subplot(222)
        plot(sim, b, B, title="B")
        plt.subplot(223)
        plot(sim, c, C, title="C")
        plt.subplot(224)
        plot(sim, d, D.ensemble, title="D")
        plt.savefig('test_circularconv.test_circularconv_%d.pdf' % dims)
        plt.close()

    ### results
    tmask = t > (0.5 + sim.model.dt/2)
    assert sim.data(A_p)[tmask].shape == (499, dims)
    a_sim = sim.data(A_p)[tmask].mean(axis=0)
    b_sim = sim.data(B_p)[tmask].mean(axis=0)
    c_sim = sim.data(C_p)[tmask].mean(axis=0)
    d_sim = sim.data(D_p)[tmask].mean(axis=0)

    rtol, atol = 0.1, 0.05
    assert np.allclose(a, a_sim, rtol=rtol, atol=atol)
    assert np.allclose(b, b_sim, rtol=rtol, atol=atol)
    assert np.allclose(d, d_sim, rtol=rtol, atol=atol)
    assert rmse(c, c_sim) < 0.075