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
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 _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