def test_connection(self): n1=nef.ScalarNode(noise=0) n2=nef.ScalarNode(noise=0) n1.connect(n2) n1.set(0.3) n1.tick() n1.tick() self.assertEqual(n2.value(),0.3) n1.set(-0.7) n1.tick() n1.tick() self.assertEqual(n2.value(),-0.7) n1=nef.VectorNode(2,noise=0) n2=nef.VectorNode(2,noise=0) n1.connect(n2,weight=0.1) n1.set([0.3,-0.7]) n1.tick() n1.tick() self.assertAlmostEqual(n2.value()[0],0.03) self.assertAlmostEqual(n2.value()[1],-0.07) n1=nef.VectorNode(2,noise=0) n2=nef.VectorNode(2,noise=0) n1.connect(n2,weight=numpy.array([[0,1],[1,0]])) n1.set([0.3,-0.7]) n1.tick() n1.tick() self.assertEqual(n2.value()[0],-0.7) self.assertEqual(n2.value()[1],0.3)
def test_connection(self): modes = ['direct', 'rate'] for m1 in modes: for m2 in modes: #print m1,m2 n1 = nef.ScalarNode() if m1 == 'rate': n1.configure(neurons=150, activation_noise=0.01) n2 = nef.ScalarNode() if m2 == 'rate': n2.configure(neurons=150, activation_noise=0.01) n1.connect(n2) n1.set(0.3) n1.tick() n1.tick() #print 0.3,n2.value() self.assertAlmostEqual(n2.value(), 0.3, 1) n1.set(-0.7) n2.tick() n2.tick() #print -0.7,n2.value() self.assertAlmostEqual(n2.value(), -0.7, 1) n1 = nef.VectorNode(2, noise=0) if m1 == 'rate': n1.configure(neurons=300, activation_noise=0.01, basis_style='Aligned') n2 = nef.VectorNode(2, noise=0, min=-0.5, max=0.5) if m2 == 'rate': n2.configure(neurons=300, activation_noise=0.01, basis_style='Aligned') n1.connect(n2, weight=0.5) n1.set([0.3, -0.7]) n2.tick() n2.tick() #print [0.15,-0.35],n2.value() self.assertAlmostEqual(n2.value()[0], 0.15, 2) self.assertAlmostEqual(n2.value()[1], -0.35, 2) n1 = nef.VectorNode(2, noise=0) if m1 == 'rate': n1.configure(neurons=300, activation_noise=0.01, basis_style='Aligned') n2 = nef.VectorNode(2, noise=0) if m2 == 'rate': n2.configure(neurons=300, activation_noise=0.01, basis_style='Aligned') n1.connect(n2, weight=numpy.array([[0, 1], [1, 0]])) n1.set([0.3, -0.7]) n1.tick() n1.tick() #print [-0.7,0.3],n2.value() self.assertAlmostEqual(n2.value()[0], -0.7, 1) self.assertAlmostEqual(n2.value()[1], 0.3, 1)
def test_aligned(self): n = nef.VectorNode(10) n.configure(neurons=20, basis_style='Aligned') for b in n.basis: self.assertEqual(numpy.abs(b).max(), 1) self.assertAlmostEqual(numpy.linalg.norm(b), 1, 5) n = nef.VectorNode(10) n.configure(neurons=20, basis_style='Sphere') for b in n.basis: self.assertNotEqual(numpy.abs(b).max(), 1) self.assertAlmostEqual(numpy.linalg.norm(b), 1, 5)
def _test_spike_connect_s_d(self): n=nef.VectorNode(2) n.configure(neurons=20,apply_noise=False) n.configure_spikes(pstc=0.06) n2=nef.VectorNode(2) n.set([-0.9,0.2]) n.connect(n2) N=2000 v=0 for i in range(N): n.tick() v+=n.value() #if i%100==99: print (i+1),v/(i+1),n2.value() self.assertAlmostEqual(v[0]/N,n2.value()[0],1) self.assertAlmostEqual(v[1]/N,n2.value()[1],1)
def _test_spike_represent(self): n=nef.VectorNode(2) n.configure(neurons=20,apply_noise=False) n.configure_spikes() n2=nef.VectorNode(2) n2.configure(neurons=20,apply_noise=False) n.set([-0.1,0.8]) n2.set([-0.1,0.8]) v=0 for i in range(1000): n.tick() n2.tick() v+=n.value() #if i%100==99: print (i+1),v/(i+1),n2.value() self.assertAlmostEqual(v[0]/1000,n2.value()[0],1) self.assertAlmostEqual(v[1]/1000,n2.value()[1],1)
def test_highdim(self): D = 50 N = 100 n1 = nef.VectorNode(D) n1.configure(neurons=N, code='n1', use_hd=True, apply_noise=False) n2 = nef.VectorNode(D) n2.configure(neurons=N, code='n2', use_hd=False, apply_noise=False) for x in [[0, 0, 0], [0, 0, 1], [0.5, 0.5, 0.5]]: if len(x) < D: x.extend([0.0] * (D - len(x))) print(x) n1.set(x) n1.tick() print((1, n1.value())) n2.set(x) n2.tick() print((2, n2.value()))
def test_collection(self): n=nef.CollectionNode(nef.ScalarNode(),nef.VectorNode(3),nef.ScalarNode(),noise=0) v1=[0.3,[0.2,0.1,-0.5],-1.0] n.set(v1) n.tick() v2=n.value() self.assertEqual(v1[0],v2[0]) self.assertEqual(v1[1][0],v2[1][0]) self.assertEqual(v1[1][1],v2[1][1]) self.assertEqual(v1[1][2],v2[1][2]) self.assertEqual(v1[2],v2[2])
def test_representation(self): n1 = nef.ScalarNode() n1.configure(neurons=150, activation_noise=0.01) n1.set(0.3) n1.tick() self.assertAlmostEqual(n1.value(), 0.3, 2) n2 = nef.VectorNode(2) n2.configure(neurons=200, activation_noise=0) n2.set([0.3, -0.5]) n2.tick() self.assertAlmostEqual(n2.value()[0], 0.3, 1) self.assertAlmostEqual(n2.value()[1], -0.5, 1)
def test_add(self): samples = None a = nef.ScalarNode() b = nef.ScalarNode() c = nef.ScalarNode() a.configure(neurons=150, activation_noise=0.1, apply_noise=False, sample_count=samples) b.configure(neurons=150, activation_noise=0.1, apply_noise=False, sample_count=samples) c.configure(neurons=150, activation_noise=0.1, apply_noise=False, sample_count=samples) a.connect(c) b.connect(c) ab = nef.VectorNode(2) a.connect(ab, weight=numpy.array([1, 0])) b.connect(ab, weight=numpy.array([0, 1])) ab.configure(neurons=300, activation_noise=0.1, apply_noise=False, sample_count=samples) c2 = nef.ScalarNode() c2.configure(neurons=150, activation_noise=0.1, apply_noise=False, sample_count=samples) ab.connect(c2, func=lambda x: x[0] + x[1]) n = [-0.4, -0.3, -0.1, 0, 0.1, 0.3, 0.4] for x in n: for y in n: a.set(x) b.set(y) c.tick() c.tick() c.tick() self.assertAlmostEqual(x + y, c.value(), 1) self.assertAlmostEqual(x + y, c2.value(), 1)
D1 = 5 D2 = 5 D3 = 5 pstc = 0.01 dt = 0.001 A = [nef.ScalarNode() for i in range(D1 * D2)] B = [nef.ScalarNode() for i in range(D2 * D3)] for n in A + B: n.configure(neurons=50) n.configure_spikes(pstc=pstc, dt=dt) # the C matrix holds the intermediate product calculations # need to compute D1*D2*D3 products to multiply 2 matrices together C = [nef.VectorNode(2) for i in range(D1 * D2 * D3)] for n in C: n.configure(neurons=200) n.configure_spikes(pstc=pstc, dt=dt) # determine the transformation matrices to get the correct pairwise # products computed. This looks a bit like black magic but if # you manually try multiplying two matrices together, you can see # the underlying pattern. Basically, we need to build up D1*D2*D3 # pairs of numbers in C to compute the product of. If i,j,k are the # indexes into the D1*D2*D3 products, we want to compute the product # of element (i,j) in A with the element (j,k) in B. The index in # A of (i,j) is j+i*D2 and the index in B of (j,k) is k+j*D3. for i in range(D1): for j in range(D2): for k in range(D3):