def test_scalar_parameter_access(): for codeobj_class in codeobj_classes: G = NeuronGroup(10, '''dv/dt = freq : 1 freq : Hz (shared) number : 1 (shared) array : 1''', codeobj_class=codeobj_class) # Try setting a scalar variable G.freq = 100*Hz assert_equal(G.freq[:], 100*Hz) G.freq[:] = 200*Hz assert_equal(G.freq[:], 200*Hz) G.freq = 'freq - 50*Hz + number*Hz' assert_equal(G.freq[:], 150*Hz) G.freq[:] = '50*Hz' assert_equal(G.freq[:], 50*Hz) # Check the second method of accessing that works assert_equal(np.asanyarray(G.freq), 50*Hz) # Check error messages assert_raises(IndexError, lambda: G.freq[0]) assert_raises(IndexError, lambda: G.freq[1]) assert_raises(IndexError, lambda: G.freq[0:1]) assert_raises(IndexError, lambda: G.freq['i>5']) assert_raises(ValueError, lambda: G.freq.set_item(slice(None), [0, 1]*Hz)) assert_raises(IndexError, lambda: G.freq.set_item(0, 100*Hz)) assert_raises(IndexError, lambda: G.freq.set_item(1, 100*Hz)) assert_raises(IndexError, lambda: G.freq.set_item('i>5', 100*Hz))
def test_subexpression(): G = NeuronGroup(10, '''dv/dt = freq : 1 freq : Hz array : 1 expr = 2*freq + array*Hz : Hz''') G.freq = '10*i*Hz' G.array = 5 assert_equal(G.expr[:], 2*10*np.arange(10)*Hz + 5*Hz)
def test_referred_scalar_variable(): ''' Test the correct handling of referred scalar variables in subexpressions ''' G = NeuronGroup(10, '''out = sin(2*pi*t*freq) + x: 1 x : 1 freq : Hz (shared)''') G.freq = 1*Hz G.x = np.arange(10) G2 = NeuronGroup(10, '') G2.variables.add_reference('out', G) run(.25*second) assert_allclose(G2.out[:], np.arange(10)+1)
def test_scalar_subexpression(): G = NeuronGroup(10, '''dv/dt = freq : 1 freq : Hz (shared) number : 1 (shared) array : 1 sub = freq + number*Hz : Hz (shared)''') G.freq = 100*Hz G.number = 50 assert G.sub[:] == 150*Hz assert_raises(SyntaxError, lambda: NeuronGroup(10, '''dv/dt = freq : 1 freq : Hz (shared) array : 1 sub = freq + array*Hz : Hz (shared)''')) # A scalar subexpresion cannot refer to implicitly vectorized functions assert_raises(SyntaxError, lambda: NeuronGroup(10, 'sub = rand() : 1 (shared)'))