Exemplo n.º 1
0
def test_linearfilter(ctx, n_per_kind, rng):
    kinds = (
        nengo.synapses.LinearFilter((2.,), (1.,), analog=False),
        nengo.synapses.Lowpass(0.005),
        nengo.synapses.Alpha(0.005),
        )
    assert len(n_per_kind) == len(kinds)
    kinds_n = [(kind, n) for kind, n in zip(kinds, n_per_kind) if n > 0]

    dt = 0.001
    steps = [kind.make_step((n,), (n,), dt, None, dtype=np.float32)
             for kind, n in kinds_n]
    A = RA([step.den for step in steps])
    B = RA([step.num for step in steps])

    X = RA([rng.normal(size=n) for kind, n in kinds_n])
    Y = RA([np.zeros(n) for kind, n in kinds_n])
    Xbuf = RA([np.zeros(shape) for shape in zip(B.sizes, X.sizes)])
    Ybuf = RA([np.zeros(shape) for shape in zip(A.sizes, Y.sizes)])

    queue = cl.CommandQueue(ctx)
    clA = CLRA(queue, A)
    clB = CLRA(queue, B)
    clX = CLRA(queue, X)
    clY = CLRA(queue, Y)
    clXbuf = CLRA(queue, Xbuf)
    clYbuf = CLRA(queue, Ybuf)

    n_calls = 3
    plans = plan_linearfilter(queue, clX, clY, clA, clB, clXbuf, clYbuf)
    with Timer() as timer:
        for _ in range(n_calls):
            [plan() for plan in plans]

    print(timer.duration)

    for i, [kind, n] in enumerate(kinds_n):
        n = min(n, 100)
        step = kind.make_step((n, 1), (n, 1), dt, None, dtype=np.float32)

        x = X[i][:n]
        y = np.zeros_like(x)
        for _ in range(n_calls):
            y[:] = step(0, x)

        z = clY[i][:n]
        assert np.allclose(z, y, atol=1e-7, rtol=1e-5), kind
def test_linearfilter(n_per_kind, rng):
    kinds = (
        nengo.synapses.LinearFilter((2.,), (1.,), analog=False),
        nengo.synapses.Lowpass(0.005),
        nengo.synapses.Alpha(0.005),
        )
    assert len(n_per_kind) == len(kinds)
    kinds_n = [(kind, n) for kind, n in zip(kinds, n_per_kind) if n > 0]

    dt = 0.001
    steps = [kind.make_step((n,), (n,), dt, None, dtype=np.float32)
             for kind, n in kinds_n]
    A = RA([step.den for step in steps])
    B = RA([step.num for step in steps])

    X = RA([rng.normal(size=n) for kind, n in kinds_n])
    Y = RA([np.zeros(n) for kind, n in kinds_n])
    Xbuf = RA([np.zeros(shape) for shape in zip(B.sizes, X.sizes)])
    Ybuf = RA([np.zeros(shape) for shape in zip(A.sizes, Y.sizes)])

    queue = cl.CommandQueue(ctx)
    clA = CLRA(queue, A)
    clB = CLRA(queue, B)
    clX = CLRA(queue, X)
    clY = CLRA(queue, Y)
    clXbuf = CLRA(queue, Xbuf)
    clYbuf = CLRA(queue, Ybuf)

    n_calls = 3
    plan = plan_linearfilter(queue, clX, clY, clA, clB, clXbuf, clYbuf)
    with Timer() as timer:
        for _ in range(n_calls):
            plan()

    print(timer.duration)

    for i, [kind, n] in enumerate(kinds_n):
        n = min(n, 100)
        step = kind.make_step((n, 1), (n, 1), dt, None, dtype=np.float32)

        x = X[i][:n]
        y = np.zeros_like(x)
        for _ in range(n_calls):
            y[:] = step(0, x)

        z = clY[i][:n]
        assert np.allclose(z, y, atol=1e-7, rtol=1e-5), kind
Exemplo n.º 3
0
 def _plan_LinearFilter(self, ops):
     steps = [op.process.make_step(op.input.shape, op.output.shape,
                                   self.model.dt, rng=None) for op in ops]
     A = self.RaggedArray([f.den for f in steps], dtype=np.float32)
     B = self.RaggedArray([f.num for f in steps], dtype=np.float32)
     X = self.all_data[[self.sidx[op.input] for op in ops]]
     Y = self.all_data[[self.sidx[op.output] for op in ops]]
     Xbuf0 = RaggedArray(
         [np.zeros(shape) for shape in zip(B.sizes, X.sizes)],
         dtype=np.float32)
     Ybuf0 = RaggedArray(
         [np.zeros(shape) for shape in zip(A.sizes, Y.sizes)],
         dtype=np.float32)
     Xbuf = CLRaggedArray(self.queue, Xbuf0)
     Ybuf = CLRaggedArray(self.queue, Ybuf0)
     self._raggedarrays_to_reset[Xbuf] = Xbuf0
     self._raggedarrays_to_reset[Ybuf] = Ybuf0
     return plan_linearfilter(self.queue, X, Y, A, B, Xbuf, Ybuf)
Exemplo n.º 4
0
 def _plan_LinearFilter(self, ops):
     steps = [
         op.process.make_step(op.input.shape,
                              op.output.shape,
                              self.model.dt,
                              rng=None) for op in ops
     ]
     A = self.RaggedArray([f.den for f in steps], dtype=np.float32)
     B = self.RaggedArray([f.num for f in steps], dtype=np.float32)
     X = self.all_data[[self.sidx[op.input] for op in ops]]
     Y = self.all_data[[self.sidx[op.output] for op in ops]]
     Xbuf0 = RaggedArray(
         [np.zeros(shape) for shape in zip(B.sizes, X.sizes)],
         dtype=np.float32)
     Ybuf0 = RaggedArray(
         [np.zeros(shape) for shape in zip(A.sizes, Y.sizes)],
         dtype=np.float32)
     Xbuf = CLRaggedArray(self.queue, Xbuf0)
     Ybuf = CLRaggedArray(self.queue, Ybuf0)
     self._raggedarrays_to_reset[Xbuf] = Xbuf0
     self._raggedarrays_to_reset[Ybuf] = Ybuf0
     return plan_linearfilter(self.queue, X, Y, A, B, Xbuf, Ybuf)
def test_linearfilter(ctx, n_per_kind, rng):
    kinds = (
        nengo.synapses.LinearFilter((2.0, ), (1.0, ), analog=False),
        nengo.synapses.Lowpass(0.005),
        nengo.synapses.Alpha(0.005),
    )
    assert len(n_per_kind) == len(kinds)
    kinds_n = [(kind, n) for kind, n in zip(kinds, n_per_kind) if n > 0]

    dt = 0.001
    steps = list()
    for kind, n in kinds_n:
        state = kind.make_state((n, ), (n, ), dt, dtype=np.float32)
        step = kind.make_step((n, ), (n, ), dt, rng=None, state=state)
        steps.append(step)

    # Nengo 3 uses state space filters. For now, convert back to transfer function.
    # Getting rid of this conversion would require a new plan_linearfilter.
    dens = list()
    nums = list()
    for f in steps:
        if type(f).__name__ == "NoX":  # special case for a feedthrough
            den = np.array([1.0])
            num = f.D
        else:
            num, den = ss2tf(f.A, f.B, f.C, f.D)

        # This preprocessing copied out of nengo2.8/synapses.LinearFilter.make_step
        num = num.flatten()

        assert den[0] == 1.0
        num = num[1:] if num[0] == 0 else num
        den = den[1:]  # drop first element (equal to 1)
        num, den = num.astype(np.float32), den.astype(np.float32)
        dens.append(den)
        nums.append(num)

    A = RA(dens)
    B = RA(nums)

    X = RA([rng.normal(size=n) for kind, n in kinds_n])
    Y = RA([np.zeros(n) for kind, n in kinds_n])
    Xbuf = RA([np.zeros(shape) for shape in zip(B.sizes, X.sizes)])
    Ybuf = RA([np.zeros(shape) for shape in zip(A.sizes, Y.sizes)])

    queue = cl.CommandQueue(ctx)
    clA = CLRA(queue, A)
    clB = CLRA(queue, B)
    clX = CLRA(queue, X)
    clY = CLRA(queue, Y)
    clXbuf = CLRA(queue, Xbuf)
    clYbuf = CLRA(queue, Ybuf)

    n_calls = 3
    plans = plan_linearfilter(queue, clX, clY, clA, clB, clXbuf, clYbuf)
    with Timer() as timer:
        for _ in range(n_calls):
            for plan in plans:
                plan()

    print(timer.duration)

    for i, [kind, n] in enumerate(kinds_n):
        n = min(n, 100)
        state = kind.make_state((n, ), (n, ), dt, dtype=np.float32)
        step = kind.make_step((n, ), (n, ), dt, rng=None, state=state)

        x = X[i][:n].T
        y = np.zeros_like(x)
        for _ in range(n_calls):
            y[:] = step(0, x)

        z = clY[i][:n].T
        assert np.allclose(z, y, atol=1e-7, rtol=1e-5), kind