Skip to content

Commit 3d6b84f

Browse files
authored
Merge pull request #126 from PKU-NIP-Lab/changes
fix bugs
2 parents e871ed8 + 74cbfd1 commit 3d6b84f

File tree

6 files changed

+186
-14
lines changed

6 files changed

+186
-14
lines changed

brainpy/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# -*- coding: utf-8 -*-
22

3-
__version__ = "2.1.2"
3+
__version__ = "2.1.3"
44

55

66
try:

brainpy/datasets/chaotic_systems.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,9 @@ def modified_lu_chen_series(duration, dt=0.001, a=36, c=20, b=3, d1=1, d2=0., ta
112112
eq.x[:] = inits['x']
113113
eq.y[:] = inits['y']
114114
eq.z[:] = inits['z']
115-
runner = dyn.DSRunner(eq, monitors=['x', 'y', 'z'], dt=dt, progress_bar=False,
115+
runner = dyn.DSRunner(eq,
116+
monitors=['x', 'y', 'z'],
117+
dt=dt, progress_bar=False,
116118
numpy_mon_after_run=numpy_mon)
117119
runner.run(duration)
118120
return {'ts': runner.mon.ts,
@@ -167,19 +169,20 @@ def mackey_glass_series(duration, dt=0.1, beta=2., gamma=1., tau=2., n=9.65,
167169
assert isinstance(inits, (bm.ndarray, jnp.ndarray))
168170

169171
rng = bm.random.RandomState(seed)
170-
xdelay = bm.TimeDelay(inits, tau, dt=dt)
171-
xdelay.data = inits + 0.2 * (rng.random((xdelay.num_delay_step,) + inits.shape) - 0.5)
172+
xdelay = bm.TimeDelay(inits, tau, dt=dt, interp_method='round')
173+
xdelay.data.value = inits + 0.2 * (rng.random((xdelay.num_delay_step,) + inits.shape) - 0.5)
172174

173-
@ddeint(method=method, state_delays={'x': xdelay})
175+
@ddeint(method=method,
176+
state_delays={'x': xdelay})
174177
def mg_eq(x, t):
175-
return beta * xdelay(t - tau) / (1 + xdelay(t - tau) ** n) - gamma * x
178+
xtau = xdelay(t - tau)
179+
return beta * xtau / (1 + xtau ** n) - gamma * x
176180

177181
runner = IntegratorRunner(mg_eq,
178182
inits={'x': inits},
179183
monitors=['x'],
180-
fun_monitors={'x(tau)': lambda t, dt: xdelay(t - tau)},
181-
progress_bar=progress_bar,
182-
dt=dt,
184+
fun_monitors={'x(tau)': lambda t, _: xdelay(t - tau)},
185+
progress_bar=progress_bar, dt=dt,
183186
numpy_mon_after_run=numpy_mon)
184187
runner.run(duration)
185188
return {'ts': runner.mon.ts,

brainpy/integrators/dde/base.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,15 +119,23 @@ def __call__(self, *args, **kwargs):
119119
delay.update(new_dvars[key])
120120
elif isinstance(delay, bm.TimeDelay):
121121
delay.update(kwargs['t'] + dt, new_dvars[key])
122-
raise ValueError('Unknown delay variable.')
122+
else:
123+
raise ValueError('Unknown delay variable. We only supports '
124+
'brainpy.math.LengthDelay, brainpy.math.TimeDelay, '
125+
'brainpy.math.NeutralDelay. '
126+
f'While we got {delay}')
123127

124128
# update state delay variables
125129
for key, delay in self.state_delays.items():
126130
if isinstance(delay, bm.LengthDelay):
127131
delay.update(dict_vars[key])
128132
elif isinstance(delay, bm.TimeDelay):
129133
delay.update(kwargs['t'] + dt, dict_vars[key])
130-
raise ValueError('Unknown delay variable.')
134+
else:
135+
raise ValueError('Unknown delay variable. We only supports '
136+
'brainpy.math.LengthDelay, brainpy.math.TimeDelay, '
137+
'brainpy.math.NeutralDelay. '
138+
f'While we got {delay}')
131139

132140
return new_vars
133141

brainpy/integrators/dde/explicit_rk.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# -*- coding: utf-8 -*-
22

3+
from typing import Dict
4+
import brainpy.math as bm
5+
36
from brainpy.integrators.constants import F, DT
47
from brainpy.integrators.dde.base import DDEIntegrator
58
from brainpy.integrators.ode import common
@@ -102,11 +105,14 @@ class Ralston2(ExplicitRKIntegrator):
102105

103106

104107
class RK2(ExplicitRKIntegrator):
105-
def __init__(self, f, beta=2 / 3, var_type=None, dt=None, name=None, show_code=False):
108+
def __init__(self, f, beta=2 / 3, var_type=None, dt=None, name=None,
109+
state_delays: Dict[str, bm.TimeDelay] = None,
110+
neutral_delays: Dict[str, bm.NeutralDelay] = None):
106111
self.A = [(), (beta,)]
107112
self.B = [1 - 1 / (2 * beta), 1 / (2 * beta)]
108113
self.C = [0, beta]
109-
super(RK2, self).__init__(f=f, var_type=var_type, dt=dt, name=name, show_code=show_code)
114+
super(RK2, self).__init__(f=f, var_type=var_type, dt=dt, name=name,
115+
state_delays=state_delays, neutral_delays=neutral_delays)
110116

111117

112118
register_dde_integrator('rk2', RK2)
Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
# -*- coding: utf-8 -*-
2+
3+
4+
import unittest
5+
6+
import brainpy as bp
7+
import brainpy.math as bm
8+
9+
10+
class TestExplicitRKStateDelay(unittest.TestCase):
11+
def test_euler(self):
12+
xdelay = bm.TimeDelay(bm.zeros((1,)), 1., before_t0=-1., interp_method='round')
13+
14+
@bp.ddeint(method='euler', state_delays={'x': xdelay})
15+
def equation(x, t, ):
16+
return -xdelay(t - 1)
17+
18+
runner = bp.integrators.IntegratorRunner(equation, monitors=['x'])
19+
runner.run(20.)
20+
21+
bp.visualize.line_plot(runner.mon.ts, runner.mon['x'], show=True)
22+
23+
def test_midpoint(self):
24+
xdelay = bm.TimeDelay(bm.zeros((1,)), 1., before_t0=-1., interp_method='round')
25+
26+
@bp.ddeint(method='midpoint', state_delays={'x': xdelay})
27+
def equation(x, t, ):
28+
return -xdelay(t - 1)
29+
30+
runner = bp.integrators.IntegratorRunner(equation, monitors=['x'])
31+
runner.run(20.)
32+
33+
bp.visualize.line_plot(runner.mon.ts, runner.mon['x'], show=True)
34+
35+
def test_heun2(self):
36+
xdelay = bm.TimeDelay(bm.zeros((1,)), 1., before_t0=-1., interp_method='round')
37+
38+
@bp.ddeint(method='heun2', state_delays={'x': xdelay})
39+
def equation(x, t, ):
40+
return -xdelay(t - 1)
41+
42+
runner = bp.integrators.IntegratorRunner(equation, monitors=['x'])
43+
runner.run(20.)
44+
45+
bp.visualize.line_plot(runner.mon.ts, runner.mon['x'], show=True)
46+
47+
def test_ralston2(self):
48+
xdelay = bm.TimeDelay(bm.zeros((1,)), 1., before_t0=-1., interp_method='round')
49+
50+
@bp.ddeint(method='ralston2', state_delays={'x': xdelay})
51+
def equation(x, t, ):
52+
return -xdelay(t - 1)
53+
54+
runner = bp.integrators.IntegratorRunner(equation, monitors=['x'])
55+
runner.run(20.)
56+
57+
bp.visualize.line_plot(runner.mon.ts, runner.mon['x'], show=True)
58+
59+
def test_rk2(self):
60+
xdelay = bm.TimeDelay(bm.zeros((1,)), 1., before_t0=-1., interp_method='round')
61+
62+
@bp.ddeint(method='rk2',
63+
state_delays={'x': xdelay})
64+
def equation(x, t, ):
65+
return -xdelay(t - 1)
66+
67+
runner = bp.integrators.IntegratorRunner(equation, monitors=['x'])
68+
runner.run(20.)
69+
70+
bp.visualize.line_plot(runner.mon.ts, runner.mon['x'], show=True)
71+
72+
def test_rk3(self):
73+
xdelay = bm.TimeDelay(bm.zeros((1,)), 1., before_t0=-1., interp_method='round')
74+
75+
@bp.ddeint(method='rk3', state_delays={'x': xdelay})
76+
def equation(x, t, ):
77+
return -xdelay(t - 1)
78+
79+
runner = bp.integrators.IntegratorRunner(equation, monitors=['x'])
80+
runner.run(20.)
81+
82+
bp.visualize.line_plot(runner.mon.ts, runner.mon['x'], show=True)
83+
84+
def test_heun3(self):
85+
xdelay = bm.TimeDelay(bm.zeros((1,)), 1., before_t0=-1., interp_method='round')
86+
87+
@bp.ddeint(method='heun3', state_delays={'x': xdelay})
88+
def equation(x, t, ):
89+
return -xdelay(t - 1)
90+
91+
runner = bp.integrators.IntegratorRunner(equation, monitors=['x'])
92+
runner.run(20.)
93+
94+
bp.visualize.line_plot(runner.mon.ts, runner.mon['x'], show=True)
95+
96+
def test_ralston3(self):
97+
xdelay = bm.TimeDelay(bm.zeros((1,)), 1., before_t0=-1., interp_method='round')
98+
99+
@bp.ddeint(method='ralston3', state_delays={'x': xdelay})
100+
def equation(x, t, ):
101+
return -xdelay(t - 1)
102+
103+
runner = bp.integrators.IntegratorRunner(equation, monitors=['x'])
104+
runner.run(20.)
105+
106+
bp.visualize.line_plot(runner.mon.ts, runner.mon['x'], show=True)
107+
108+
def test_ssprk3(self):
109+
xdelay = bm.TimeDelay(bm.zeros((1,)), 1., before_t0=-1., interp_method='round')
110+
111+
@bp.ddeint(method='ssprk3', state_delays={'x': xdelay})
112+
def equation(x, t, ):
113+
return -xdelay(t - 1)
114+
115+
runner = bp.integrators.IntegratorRunner(equation, monitors=['x'])
116+
runner.run(20.)
117+
118+
bp.visualize.line_plot(runner.mon.ts, runner.mon['x'], show=True)
119+
120+
def test_rk4(self):
121+
xdelay = bm.TimeDelay(bm.zeros((1,)), 1., before_t0=-1., interp_method='round')
122+
123+
@bp.ddeint(method='rk4', state_delays={'x': xdelay})
124+
def equation(x, t, ):
125+
return -xdelay(t - 1)
126+
127+
runner = bp.integrators.IntegratorRunner(equation, monitors=['x'])
128+
runner.run(20.)
129+
130+
bp.visualize.line_plot(runner.mon.ts, runner.mon['x'], show=True)
131+
132+
def test_ralston4(self):
133+
xdelay = bm.TimeDelay(bm.zeros((1,)), 1., before_t0=-1., interp_method='round')
134+
135+
@bp.ddeint(method='ralston4', state_delays={'x': xdelay})
136+
def equation(x, t, ):
137+
return -xdelay(t - 1)
138+
139+
runner = bp.integrators.IntegratorRunner(equation, monitors=['x'])
140+
runner.run(20.)
141+
142+
bp.visualize.line_plot(runner.mon.ts, runner.mon['x'], show=True)
143+
144+
def test_rk4_38rule(self):
145+
xdelay = bm.TimeDelay(bm.zeros((1,)), 1., before_t0=-1., interp_method='round')
146+
147+
@bp.ddeint(method='rk4_38rule', state_delays={'x': xdelay})
148+
def equation(x, t, ):
149+
return -xdelay(t - 1)
150+
151+
runner = bp.integrators.IntegratorRunner(equation, monitors=['x'])
152+
runner.run(20.)
153+
154+
bp.visualize.line_plot(runner.mon.ts, runner.mon['x'], show=True)
155+

brainpy/nn/nodes/RC/nvar.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ def init_state(self, num_batch=1):
133133
if self.store is None:
134134
self.store = bm.Variable(state)
135135
else:
136-
self.store._value = state
136+
self.store._value = state.value
137137

138138
def forward(self, ff, fb=None, **shared_kwargs):
139139
all_parts = []

0 commit comments

Comments
 (0)