Skip to content

Commit 4d20801

Browse files
Merge pull request #52 from SciML/as/getu-current-time
fix: do not call current_time for time-independent systems
2 parents 8ebdf3f + 7f56f0d commit 4d20801

File tree

3 files changed

+40
-32
lines changed

3 files changed

+40
-32
lines changed

README.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,7 @@ eqs = [D(D(x)) ~ σ * (y - x),
4242
D(z) ~ x * y - β * z,
4343
w ~ x + y + z]
4444

45-
@named sys = ODESystem(eqs)
46-
sys = structural_simplify(sys)
45+
@mtkbuild sys = ODESystem(eqs)
4746

4847
u0 = [D(x) => 2.0,
4948
x => 1.0,

docs/src/usage.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,7 @@ eqs = [D(D(x)) ~ σ * (y - x),
3232
D(z) ~ x * y - β * z,
3333
w ~ x + y + z]
3434
35-
@named sys = ODESystem(eqs)
36-
sys = structural_simplify(sys)
35+
@mtkbuild sys = ODESystem(eqs, t)
3736
```
3837

3938
The system has 4 state variables, 3 parameters, and one observed variable:

src/state_indexing.jl

Lines changed: 38 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -216,39 +216,49 @@ for (t1, t2) in [
216216
end
217217
else
218218
obs = observed(sys, sym isa Tuple ? collect(sym) : sym)
219-
return let obs = obs, is_tuple = sym isa Tuple
220-
function _getter2(::NotTimeseries, prob)
221-
obs(state_values(prob), parameter_values(prob), current_time(prob))
219+
_getter2 = if is_time_dependent(sys)
220+
let obs = obs, is_tuple = sym isa Tuple
221+
function _getter2a(::NotTimeseries, prob)
222+
obs(state_values(prob), parameter_values(prob), current_time(prob))
223+
end
224+
function _getter2a(::Timeseries, prob)
225+
obs.(state_values(prob), (parameter_values(prob),),
226+
current_time(prob))
227+
end
228+
function _getter2a(::Timeseries, prob, i)
229+
obs(state_values(prob, i),
230+
parameter_values(prob),
231+
current_time(prob, i))
232+
end
233+
_getter2a
222234
end
223-
function _getter2(::Timeseries, prob)
224-
obs.(state_values(prob), (parameter_values(prob),), current_time(prob))
235+
else
236+
let obs = obs, is_tuple = sym isa Tuple
237+
function _getter2b(::NotTimeseries, prob)
238+
obs(state_values(prob), parameter_values(prob))
239+
end
240+
_getter2b
225241
end
226-
function _getter2(::Timeseries, prob, i)
227-
obs(state_values(prob, i),
228-
parameter_values(prob),
229-
current_time(prob, i))
242+
end
243+
return if sym isa Tuple
244+
let _getter2 = _getter2
245+
function getter2(prob)
246+
Tuple(_getter2(is_timeseries(prob), prob))
247+
end
248+
function getter2(prob, i)
249+
Tuple(_getter2(is_timeseries(prob), prob, i))
250+
end
251+
getter2
230252
end
231-
232-
if is_tuple
233-
let _getter2 = _getter2
234-
function getter2(prob)
235-
Tuple(_getter2(is_timeseries(prob), prob))
236-
end
237-
function getter2(prob, i)
238-
Tuple(_getter2(is_timeseries(prob), prob, i))
239-
end
240-
getter2
253+
else
254+
let _getter2 = _getter2
255+
function getter3(prob)
256+
_getter2(is_timeseries(prob), prob)
241257
end
242-
else
243-
let _getter2 = _getter2
244-
function getter3(prob)
245-
_getter2(is_timeseries(prob), prob)
246-
end
247-
function getter3(prob, i)
248-
_getter2(is_timeseries(prob), prob, i)
249-
end
250-
getter3
258+
function getter3(prob, i)
259+
_getter2(is_timeseries(prob), prob, i)
251260
end
261+
getter3
252262
end
253263
end
254264
end

0 commit comments

Comments
 (0)