def test_circularconv_transforms(invert_a, invert_b, rng): """Test the circular convolution transforms""" dims = 100 x = rng.randn(dims) y = rng.randn(dims) z0 = circconv(x, y, invert_a=invert_a, invert_b=invert_b) tr_a = transform_in(dims, 'A', invert_a) tr_b = transform_in(dims, 'B', invert_b) tr_out = transform_out(dims) XY = np.dot(tr_a, x) * np.dot(tr_b, y) z1 = np.dot(tr_out, XY) assert np.allclose(z0, z1)
dim = 16 # dim = 256 neurons_per_product = 64 # neurons_per_product = 256 radius = 1 rng = np.random.RandomState(129) a = rng.normal(scale=np.sqrt(1./dim), size=dim) b = rng.normal(scale=np.sqrt(1./dim), size=dim) c = circconv(a, b) assert np.abs(a).max() < radius assert np.abs(b).max() < radius assert np.abs(c).max() < radius # check FFT magnitude tr_A = transform_in(dim, 'A', invert=False) tr_B = transform_in(dim, 'B', invert=False) d = np.dot(tr_A, a) * np.dot(tr_B, b) assert np.abs(d).max() < (4 * radius) # ^ TODO: 4 * radius just seems to work from looking at Nengo code. Why? # --- model with nengo.Network(label="ProfileConv", seed=3) as model: inputA = nengo.Node(a, label="inputA") inputB = nengo.Node(b, label="inputB") A = nengo.networks.EnsembleArray( neurons_per_product, dim, radius=radius, label='A') B = nengo.networks.EnsembleArray( neurons_per_product, dim, radius=radius, label='B') C = nengo.networks.EnsembleArray( neurons_per_product, dim, radius=radius, label='C')
def test_transform_in_align_error(): with pytest.raises(ValidationError, match="'align' must be either"): transform_in(dims=3, align="badval", invert=False)
dim = 16 # dim = 256 neurons_per_product = 64 # neurons_per_product = 256 radius = 1 rng = np.random.RandomState(129) a = rng.normal(scale=np.sqrt(1. / dim), size=dim) b = rng.normal(scale=np.sqrt(1. / dim), size=dim) c = circconv(a, b) assert np.abs(a).max() < radius assert np.abs(b).max() < radius assert np.abs(c).max() < radius # check FFT magnitude tr_A = transform_in(dim, 'A', invert=False) tr_B = transform_in(dim, 'B', invert=False) d = np.dot(tr_A, a) * np.dot(tr_B, b) assert np.abs(d).max() < (4 * radius) # ^ TODO: 4 * radius just seems to work from looking at Nengo code. Why? # --- model with nengo.Network(label="ProfileConv", seed=3) as model: inputA = nengo.Node(a, label="inputA") inputB = nengo.Node(b, label="inputB") A = nengo.networks.EnsembleArray(neurons_per_product, dim, radius=radius, label='A') B = nengo.networks.EnsembleArray(neurons_per_product, dim,
dim = 16 # dim = 256 neurons_per_product = 64 # neurons_per_product = 256 radius = 1 rng = np.random.RandomState(129) a = rng.normal(scale=np.sqrt(1.0 / dim), size=dim) b = rng.normal(scale=np.sqrt(1.0 / dim), size=dim) c = circconv(a, b) assert np.abs(a).max() < radius assert np.abs(b).max() < radius assert np.abs(c).max() < radius # check FFT magnitude tr_A = transform_in(dim, "A", invert=False) tr_B = transform_in(dim, "B", invert=False) d = np.dot(tr_A, a) * np.dot(tr_B, b) assert np.abs(d).max() < (4 * radius) # ^ TODO: 4 * radius just seems to work from looking at Nengo code. Why? # --- model with nengo.Network(label="ProfileConv", seed=3) as model: inputA = nengo.Node(a, label="inputA") inputB = nengo.Node(b, label="inputB") A = nengo.networks.EnsembleArray(neurons_per_product, dim, radius=radius, label="A") B = nengo.networks.EnsembleArray(neurons_per_product, dim,