Skip to content

Commit d128997

Browse files
fix: support non-tunable parameters with SDDEs
1 parent 2d1554a commit d128997

File tree

3 files changed

+20
-8
lines changed

3 files changed

+20
-8
lines changed

src/systems/diffeqs/abstractodesystem.jl

+4-7
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ function generate_function(sys::AbstractODESystem, dvs = unknowns(sys),
215215
if isdde
216216
build_function(rhss, u, DDE_HISTORY_FUN, p..., t; kwargs...,
217217
wrap_code = wrap_code .∘ wrap_mtkparameters(sys, false, 3) .∘
218-
wrap_array_vars(sys, rhss; dvs, ps) .∘
218+
wrap_array_vars(sys, rhss; dvs, ps, history = true) .∘
219219
wrap_parameter_dependencies(sys, false))
220220
else
221221
pre, sol_states = get_substitutions_and_solved_unknowns(sys)
@@ -598,17 +598,14 @@ function DiffEqBase.SDDEFunction{iip}(sys::AbstractODESystem, dvs = unknowns(sys
598598
expression_module = eval_module, checkbounds = checkbounds,
599599
kwargs...)
600600
f_oop, f_iip = eval_or_rgf.(f_gen; eval_expression, eval_module)
601+
f(u, h, p, t) = f_oop(u, h, p, t)
602+
f(du, u, h, p, t) = f_iip(du, u, h, p, t)
603+
601604
g_gen = generate_diffusion_function(sys, dvs, ps; expression = Val{true},
602605
isdde = true, kwargs...)
603606
g_oop, g_iip = eval_or_rgf.(g_gen; eval_expression, eval_module)
604-
f(u, h, p, t) = f_oop(u, h, p, t)
605-
f(u, h, p::MTKParameters, t) = f_oop(u, h, p..., t)
606-
f(du, u, h, p, t) = f_iip(du, u, h, p, t)
607-
f(du, u, h, p::MTKParameters, t) = f_iip(du, u, h, p..., t)
608607
g(u, h, p, t) = g_oop(u, h, p, t)
609-
g(u, h, p::MTKParameters, t) = g_oop(u, h, p..., t)
610608
g(du, u, h, p, t) = g_iip(du, u, h, p, t)
611-
g(du, u, h, p::MTKParameters, t) = g_iip(du, u, h, p..., t)
612609

613610
SDDEFunction{iip}(f, g, sys = sys)
614611
end

src/systems/diffeqs/sdesystem.jl

+5-1
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,11 @@ function generate_diffusion_function(sys::SDESystem, dvs = unknowns(sys),
302302
(map(x -> time_varying_as_func(value(x), sys), ps),)
303303
end
304304
if isdde
305-
return build_function(eqs, u, DDE_HISTORY_FUN, p..., get_iv(sys); kwargs...)
305+
return build_function(eqs, u, DDE_HISTORY_FUN, p..., get_iv(sys); kwargs...,
306+
wrap_code = get(kwargs, :wrap_code, identity) .∘
307+
wrap_mtkparameters(sys, false, 3) .∘
308+
wrap_array_vars(sys, eqs; dvs, ps, history = true) .∘
309+
wrap_parameter_dependencies(sys, false))
306310
else
307311
return build_function(eqs, u, p..., get_iv(sys); kwargs...)
308312
end

test/dde.jl

+11
Original file line numberDiff line numberDiff line change
@@ -186,4 +186,15 @@ end
186186

187187
alg = MethodOfSteps(Vern7())
188188
@test_nowarn solve(prob, alg)
189+
190+
@brownian r
191+
eqs = [D(x(t)) ~ -w * x(t - τ) + r]
192+
@named sys = System(eqs, t)
193+
sys = structural_simplify(sys)
194+
prob = SDDEProblem(sys,
195+
[],
196+
(0.0, 10.0),
197+
constant_lags = [τ])
198+
199+
@test_nowarn solve(prob, RKMil())
189200
end

0 commit comments

Comments
 (0)