Skip to content

Commit cd532ec

Browse files
committed
add support for DDEAliasSpecifier
1 parent db02d7c commit cd532ec

File tree

4 files changed

+63
-2
lines changed

4 files changed

+63
-2
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ OrdinaryDiffEqNonlinearSolve = "1.2.2"
3535
OrdinaryDiffEqRosenbrock = "1.2.0"
3636
RecursiveArrayTools = "2, 3"
3737
Reexport = "0.2, 1.0"
38-
SciMLBase = "2.68"
38+
SciMLBase = "2.69"
3939
SimpleNonlinearSolve = "0.1, 1, 2"
4040
SimpleUnPack = "1"
4141
SymbolicIndexingInterface = "0.3.36"

src/DelayDiffEq.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ using OrdinaryDiffEqNonlinearSolve: NLNewton, NLAnderson, NLFunctional, Abstract
2525
using OrdinaryDiffEqRosenbrock: RosenbrockMutableCache
2626

2727
import SciMLBase
28+
using SciMLBase: DDEAliasSpecifier
2829

2930
export Discontinuity, MethodOfSteps
3031

src/solve.jl

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ function DiffEqBase.__init(prob::DiffEqBase.AbstractDDEProblem,
6262
allow_extrapolation = OrdinaryDiffEqCore.alg_extrapolates(alg),
6363
initialize_integrator = true,
6464
alias_u0 = false,
65+
alias = DDEAliasSpecifier(),
6566
# keyword arguments for DDEs
6667
discontinuity_interp_points::Int = 10,
6768
discontinuity_abstol = eltype(prob.tspan)(1 // Int64(10)^12),
@@ -107,6 +108,42 @@ function DiffEqBase.__init(prob::DiffEqBase.AbstractDDEProblem,
107108
# unpack problem
108109
@unpack f, u0, h, tspan, p, neutral, constant_lags, dependent_lags = prob
109110

111+
use_old_kwargs = haskey(kwargs, :alias_u0)
112+
113+
if haskey(kwargs, :alias_u0)
114+
aliases = DDEAliasSpecifier()
115+
message = "`alias_u0` keyword argument is deprecated, to set `alias_u0`,
116+
please use an ODEAliasSpecifier, e.g. `solve(prob, alias = ODEAliasSpecifier(alias_u0 = true))"
117+
Base.depwarn(message, :init)
118+
Base.depwarn(message, :solve)
119+
aliases = DDEAliasSpecifier(alias_u0 = values(kwargs).alias_u0)
120+
else
121+
# If alias isa Bool, all fields of ODEAliases set to alias
122+
if alias isa Bool
123+
aliases = DDEAliasSpecifier(alias = alias)
124+
elseif alias isa DDEAliasSpecifier
125+
aliases = alias
126+
end
127+
end
128+
129+
if isnothing(aliases.alias_f) || aliases.alias_f
130+
f = f
131+
else
132+
f = deepcopy(f)
133+
end
134+
135+
if isnothing(aliases.alias_p) || aliases.alias_p
136+
p = p
137+
else
138+
p = recursivecopy(p)
139+
end
140+
141+
if !isnothing(aliases.alias_u0) && aliases.alias_u0
142+
u = prob.u0
143+
else
144+
u = recursivecopy(prob.u0)
145+
end
146+
110147
# determine type and direction of time
111148
tType = eltype(tspan)
112149
t0 = first(tspan)
@@ -131,7 +168,7 @@ function DiffEqBase.__init(prob::DiffEqBase.AbstractDDEProblem,
131168

132169
# get states (possibly different from the ODE integrator!)
133170
u, uprev, uprev2 = u_uprev_uprev2(u0, alg;
134-
alias_u0 = alias_u0,
171+
alias_u0 = aliases.alias_u0,
135172
adaptive = adaptive,
136173
allow_extrapolation = allow_extrapolation,
137174
calck = calck)

test/interface/aliasing.jl

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using DelayDiffEq, DDEProblemLibrary
2+
3+
# For now, testing if the old keyword works the same as the new alias keyword
4+
prob_ip = prob_dde_constant_1delay_ip
5+
prob_scalar = prob_dde_constant_1delay_scalar
6+
ts = 0:0.1:10
7+
8+
noreuse = NLNewton(fast_convergence_cutoff = 0)
9+
10+
const working_algs = [ImplicitMidpoint(), SSPSDIRK2(), KenCarp5(nlsolve = noreuse),
11+
ImplicitEuler(nlsolve = noreuse), Trapezoid(nlsolve = noreuse),
12+
TRBDF2(nlsolve = noreuse)]
13+
14+
@testset "Algorithm $(nameof(typeof(alg)))" for alg in working_algs
15+
println(nameof(typeof(alg)))
16+
17+
stepsalg = MethodOfSteps(alg)
18+
sol_new_alias = solve(prob_ip, stepsalg; dt = 0.1, alias = DDEAliasSpecifier(alias_u0 = true))
19+
sol_old_alias = solve(
20+
prob_ip, stepsalg; dt = 0.1, alias = alias_u0 = true)
21+
22+
@test sol_new_alias == sol_old_alias
23+
end

0 commit comments

Comments
 (0)