Skip to content

Commit 2a1024a

Browse files
Merge pull request #3169 from AayushSabharwal/as/dde-non-tunables
fix: support non-tunable parameters with DDEs
2 parents 2c694b5 + d128997 commit 2a1024a

File tree

3 files changed

+43
-11
lines changed

3 files changed

+43
-11
lines changed

src/systems/diffeqs/abstractodesystem.jl

+10-10
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,9 @@ function generate_function(sys::AbstractODESystem, dvs = unknowns(sys),
189189
wrap_code = identity,
190190
kwargs...)
191191
if isdde
192-
eqs = delay_to_function(sys)
192+
issplit = has_index_cache(sys) && get_index_cache(sys) !== nothing
193+
eqs = delay_to_function(
194+
sys; history_arg = issplit ? MTKPARAMETERS_ARG : DEFAULT_PARAMS_ARG)
193195
else
194196
eqs = [eq for eq in equations(sys)]
195197
end
@@ -211,7 +213,10 @@ function generate_function(sys::AbstractODESystem, dvs = unknowns(sys),
211213
t = get_iv(sys)
212214

213215
if isdde
214-
build_function(rhss, u, DDE_HISTORY_FUN, p..., t; kwargs...)
216+
build_function(rhss, u, DDE_HISTORY_FUN, p..., t; kwargs...,
217+
wrap_code = wrap_code .∘ wrap_mtkparameters(sys, false, 3) .∘
218+
wrap_array_vars(sys, rhss; dvs, ps, history = true) .∘
219+
wrap_parameter_dependencies(sys, false))
215220
else
216221
pre, sol_states = get_substitutions_and_solved_unknowns(sys)
217222

@@ -570,9 +575,7 @@ function DiffEqBase.DDEFunction{iip}(sys::AbstractODESystem, dvs = unknowns(sys)
570575
kwargs...)
571576
f_oop, f_iip = eval_or_rgf.(f_gen; eval_expression, eval_module)
572577
f(u, h, p, t) = f_oop(u, h, p, t)
573-
f(u, h, p::MTKParameters, t) = f_oop(u, h, p..., t)
574578
f(du, u, h, p, t) = f_iip(du, u, h, p, t)
575-
f(du, u, h, p::MTKParameters, t) = f_iip(du, u, h, p..., t)
576579

577580
DDEFunction{iip}(f, sys = sys)
578581
end
@@ -595,17 +598,14 @@ function DiffEqBase.SDDEFunction{iip}(sys::AbstractODESystem, dvs = unknowns(sys
595598
expression_module = eval_module, checkbounds = checkbounds,
596599
kwargs...)
597600
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+
598604
g_gen = generate_diffusion_function(sys, dvs, ps; expression = Val{true},
599605
isdde = true, kwargs...)
600606
g_oop, g_iip = eval_or_rgf.(g_gen; eval_expression, eval_module)
601-
f(u, h, p, t) = f_oop(u, h, p, t)
602-
f(u, h, p::MTKParameters, t) = f_oop(u, h, p..., t)
603-
f(du, u, h, p, t) = f_iip(du, u, h, p, t)
604-
f(du, u, h, p::MTKParameters, t) = f_iip(du, u, h, p..., t)
605607
g(u, h, p, t) = g_oop(u, h, p, t)
606-
g(u, h, p::MTKParameters, t) = g_oop(u, h, p..., t)
607608
g(du, u, h, p, t) = g_iip(du, u, h, p, t)
608-
g(du, u, h, p::MTKParameters, t) = g_iip(du, u, h, p..., t)
609609

610610
SDDEFunction{iip}(f, g, sys = sys)
611611
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

+28
Original file line numberDiff line numberDiff line change
@@ -170,3 +170,31 @@ prob_sa = DDEProblem(sys, [], (0.0, 10.0); constant_lags = [sys.osc1.τ, sys.osc
170170
sol(sol.t .- prob.ps[ssys.valve.τ]; idxs = ssys.valve.opening).u .+
171171
sum.(sol[ssys.vvecs.x])
172172
end
173+
174+
@testset "Issue#3165 DDEs with non-tunables" begin
175+
@variables x(..) = 1.0
176+
@parameters w=1.0 [tunable = false] τ=0.5
177+
eqs = [D(x(t)) ~ -w * x(t - τ)]
178+
179+
@named sys = System(eqs, t)
180+
sys = structural_simplify(sys)
181+
182+
prob = DDEProblem(sys,
183+
[],
184+
(0.0, 10.0),
185+
constant_lags = [τ])
186+
187+
alg = MethodOfSteps(Vern7())
188+
@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())
200+
end

0 commit comments

Comments
 (0)