def test_eval_points_scaling(Simulator, sample, radius, seed, rng, scale): eval_points = UniformHypersphere() if sample: eval_points = eval_points.sample(500, 3, rng=rng) model = nengo.Network(seed=seed) with model: a = nengo.Ensemble( 1, 3, encoders=np.ones((1, 3)), intercepts=nengo.dists.Choice([-1]), radius=radius, ) b = nengo.Ensemble(1, 3) con = nengo.Connection(a, b, eval_points=eval_points, scale_eval_points=scale) with Simulator(model) as sim: dists = npext.norm(sim.data[con].eval_points, axis=1) limit = radius if scale else 1.0 assert np.all(dists <= limit) assert np.any(dists >= 0.9 * limit)
def test_hypersphere_surface(dimensions, rng): n = 150 * dimensions dist = UniformHypersphere(surface=True) samples = dist.sample(n, dimensions, rng=rng) assert samples.shape == (n, dimensions) assert np.allclose(npext.norm(samples, axis=1), 1) assert np.allclose(np.mean(samples, axis=0), 0, atol=0.25 / dimensions)
def test_hypersphere_volume(min_magnitude, d, rng): n = 150 * d dist = UniformHypersphere(min_magnitude=min_magnitude) samples = dist.sample(n, d, rng=rng) assert samples.shape == (n, d) assert np.allclose(np.mean(samples, axis=0), 0, atol=0.1) assert np.all(npext.norm(samples, axis=1) >= min_magnitude)
def sample(self): unif_dist = UniformHypersphere() pt = unif_dist.sample(1, self.nbasis) * ( self.bounds[:, 1] - self.bounds[:, 0]) + self.bounds[:, 0] sample = spa.SemanticPointer(data=np.fft.ifft( np.fft.fft(self.basis[0], axis=0)**pt[0, 0], axis=0).real) for i in np.arange(1, self.nbasis): nextS = spa.SemanticPointer(data=np.fft.ifft( np.fft.fft(self.basis[i], axis=0)**pt[0, i], axis=0).real) sample = sample * nextS return sample.v
def test_eval_points_scaling(Simulator, sample, radius, seed, rng): eval_points = UniformHypersphere() if sample: eval_points = eval_points.sample(500, 3, rng=rng) model = nengo.Network(seed=seed) with model: a = nengo.Ensemble(1, 3, eval_points=eval_points, radius=radius) sim = Simulator(model) dists = np.linalg.norm(sim.data[a].eval_points, axis=1) assert np.all(dists <= radius) assert np.any(dists >= 0.9 * radius)
def test_eval_points_scaling(Simulator, sample, radius, seed, rng): eval_points = UniformHypersphere() if sample: eval_points = eval_points.sample(500, 3, rng=rng) model = nengo.Network(seed=seed) with model: a = nengo.Ensemble(1, 3, eval_points=eval_points, radius=radius) with Simulator(model) as sim: dists = npext.norm(sim.data[a].eval_points, axis=1) assert np.all(dists <= radius) assert np.any(dists >= 0.9 * radius)
def test_cosine_intercept(d, p, rng, allclose): """Tests CosineSimilarity inverse cdf for finding intercepts.""" pytest.importorskip("scipy") # betaincinv num_samples = 500 exp_dist = UniformHypersphere(surface=True) act_dist = CosineSimilarity(d) dots = exp_dist.sample(num_samples, d, rng=rng)[:, 0] # Find the desired intercept so that dots >= c with probability p c = act_dist.ppf(1 - p) assert allclose(np.sum(dots >= c) / float(num_samples), p, atol=0.05)
def samples(self, n): unif_dist = UniformHypersphere() pt = unif_dist.sample(n, self.nbasis) * ( self.bounds[:, 1] - self.bounds[:, 0]) + self.bounds[:, 0] samples = np.zeros((n, self.dim)) for j in np.arange(n): sample = spa.SemanticPointer(data=np.fft.ifft( np.fft.fft(self.basis[0], axis=0)**pt[j, 0], axis=0).real) for i in np.arange(1, self.nbasis): nextS = spa.SemanticPointer(data=np.fft.ifft( np.fft.fft(self.basis[i], axis=0)**pt[j, i], axis=0).real) sample = sample * nextS samples[j, :] = sample.v return samples
def sample(self, n, d=None, rng=np.random): unif_dist = UniformHypersphere() xy = unif_dist.sample(n, 2) samples = np.zeros((n, d)) for i in np.arange(n): samples[i, :] = ssp(self.X, self.Y, xy[i, 0], xy[i, 1], alg=self.alg).v.real return samples.real * self.radius
def test_cosine_similarity(d, rng): """Tests CosineSimilarity sampling.""" num_samples = 2500 num_bins = 8 # Check that it gives a single dimension from UniformHypersphere exp_dist = UniformHypersphere(surface=True) act_dist = CosineSimilarity(d) exp = exp_dist.sample(num_samples, d, rng=rng)[:, 0] act = act_dist.sample(num_samples, rng=rng) exp_hist, _ = np.histogram(exp, bins=num_bins) act_hist, _ = np.histogram(act, bins=num_bins) assert np.all(np.abs(np.asfarray(exp_hist - act_hist) / num_samples) < 0.15)
def test_eval_points_scaling(Simulator, sample, radius, seed, rng, scale): eval_points = UniformHypersphere() if sample: eval_points = eval_points.sample(500, 3, rng=rng) model = nengo.Network(seed=seed) with model: a = nengo.Ensemble(1, 3, radius=radius) b = nengo.Ensemble(1, 3) con = nengo.Connection(a, b, eval_points=eval_points, scale_eval_points=scale) sim = Simulator(model) dists = npext.norm(sim.data[con].eval_points, axis=1) limit = radius if scale else 1.0 assert np.all(dists <= limit) assert np.any(dists >= 0.9 * limit)
def test_eval_points_scaling(Simulator, sample, radius, seed, rng, scale): eval_points = UniformHypersphere() if sample: eval_points = eval_points.sample(500, 3, rng=rng) model = nengo.Network(seed=seed) with model: a = nengo.Ensemble(1, 3, radius=radius) b = nengo.Ensemble(1, 3) con = nengo.Connection(a, b, eval_points=eval_points, scale_eval_points=scale) sim = Simulator(model) dists = np.linalg.norm(sim.data[con].eval_points, axis=1) limit = radius if scale else 1.0 assert np.all(dists <= limit) assert np.any(dists >= 0.9 * limit)