Skip to content

Commit 4000faf

Browse files
committed
Merge branch 'master' into check_iv_is_par
2 parents 21731de + 421e41e commit 4000faf

File tree

3 files changed

+28
-5
lines changed

3 files changed

+28
-5
lines changed

src/systems/abstractsystem.jl

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2519,18 +2519,16 @@ function extend(sys::AbstractSystem, basesys::AbstractSystem; name::Symbol = nam
25192519
eqs = union(get_eqs(basesys), get_eqs(sys))
25202520
sts = union(get_unknowns(basesys), get_unknowns(sys))
25212521
ps = union(get_ps(basesys), get_ps(sys))
2522-
base_deps = parameter_dependencies(basesys)
2523-
deps = parameter_dependencies(sys)
2524-
dep_ps = isnothing(base_deps) ? deps :
2525-
isnothing(deps) ? base_deps : union(base_deps, deps)
2522+
dep_ps = union_nothing(parameter_dependencies(basesys), parameter_dependencies(sys))
25262523
obs = union(get_observed(basesys), get_observed(sys))
25272524
cevs = union(get_continuous_events(basesys), get_continuous_events(sys))
25282525
devs = union(get_discrete_events(basesys), get_discrete_events(sys))
25292526
defs = merge(get_defaults(basesys), get_defaults(sys)) # prefer `sys`
2527+
meta = union_nothing(get_metadata(basesys), get_metadata(sys))
25302528
syss = union(get_systems(basesys), get_systems(sys))
25312529
args = length(ivs) == 0 ? (eqs, sts, ps) : (eqs, ivs[1], sts, ps)
25322530
kwargs = (parameter_dependencies = dep_ps, observed = obs, continuous_events = cevs,
2533-
discrete_events = devs, defaults = defs, systems = syss,
2531+
discrete_events = devs, defaults = defs, systems = syss, metadata = meta,
25342532
name = name, gui_metadata = gui_metadata)
25352533

25362534
# collect fields specific to some system types

src/utils.jl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
1+
"""
2+
union_nothing(x::Union{T1, Nothing}, y::Union{T2, Nothing}) where {T1, T2}
3+
4+
Unite x and y gracefully when they could be nothing. If neither is nothing, x and y are united normally. If one is nothing, the other is returned unmodified. If both are nothing, nothing is returned.
5+
"""
6+
function union_nothing(x::Union{T1, Nothing}, y::Union{T2, Nothing}) where {T1, T2}
7+
isnothing(x) && return y # y can be nothing or something
8+
isnothing(y) && return x # x can be nothing or something
9+
return union(x, y) # both x and y are something and can be united normally
10+
end
11+
112
get_iv(D::Differential) = D.x
213

314
function make_operation(@nospecialize(op), args)

test/odesystem.jl

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1216,6 +1216,20 @@ end
12161216
@test all(sol2[x] .== 1.0)
12171217
end
12181218

1219+
# https://github.com/SciML/ModelingToolkit.jl/issues/2502
1220+
@testset "Extend systems with a field that can be nothing" begin
1221+
A = Dict(:a => 1)
1222+
B = Dict(:b => 2)
1223+
@named A1 = ODESystem(Equation[], t, [], [])
1224+
@named B1 = ODESystem(Equation[], t, [], [])
1225+
@named A2 = ODESystem(Equation[], t, [], []; metadata = A)
1226+
@named B2 = ODESystem(Equation[], t, [], []; metadata = B)
1227+
@test ModelingToolkit.get_metadata(extend(A1, B1)) == nothing
1228+
@test ModelingToolkit.get_metadata(extend(A1, B2)) == B
1229+
@test ModelingToolkit.get_metadata(extend(A2, B1)) == A
1230+
@test Set(ModelingToolkit.get_metadata(extend(A2, B2))) == Set(A B)
1231+
end
1232+
12191233
# https://github.com/SciML/ModelingToolkit.jl/issues/2859
12201234
@testset "Initialization with defaults from observed equations (edge case)" begin
12211235
@variables x(t) y(t) z(t)

0 commit comments

Comments
 (0)