Skip to content

Commit 421e41e

Browse files
Merge pull request #2867 from hersle/extend_metadata
Extend metadata
2 parents 2f5c718 + e6be2a7 commit 421e41e

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
@@ -2521,18 +2521,16 @@ function extend(sys::AbstractSystem, basesys::AbstractSystem; name::Symbol = nam
25212521
eqs = union(get_eqs(basesys), get_eqs(sys))
25222522
sts = union(get_unknowns(basesys), get_unknowns(sys))
25232523
ps = union(get_ps(basesys), get_ps(sys))
2524-
base_deps = parameter_dependencies(basesys)
2525-
deps = parameter_dependencies(sys)
2526-
dep_ps = isnothing(base_deps) ? deps :
2527-
isnothing(deps) ? base_deps : union(base_deps, deps)
2524+
dep_ps = union_nothing(parameter_dependencies(basesys), parameter_dependencies(sys))
25282525
obs = union(get_observed(basesys), get_observed(sys))
25292526
cevs = union(get_continuous_events(basesys), get_continuous_events(sys))
25302527
devs = union(get_discrete_events(basesys), get_discrete_events(sys))
25312528
defs = merge(get_defaults(basesys), get_defaults(sys)) # prefer `sys`
2529+
meta = union_nothing(get_metadata(basesys), get_metadata(sys))
25322530
syss = union(get_systems(basesys), get_systems(sys))
25332531
args = length(ivs) == 0 ? (eqs, sts, ps) : (eqs, ivs[1], sts, ps)
25342532
kwargs = (parameter_dependencies = dep_ps, observed = obs, continuous_events = cevs,
2535-
discrete_events = devs, defaults = defs, systems = syss,
2533+
discrete_events = devs, defaults = defs, systems = syss, metadata = meta,
25362534
name = name, gui_metadata = gui_metadata)
25372535

25382536
# 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
@@ -1195,6 +1195,20 @@ end
11951195
@test buffer [2.0, 3.0, 4.0]
11961196
end
11971197

1198+
# https://github.com/SciML/ModelingToolkit.jl/issues/2502
1199+
@testset "Extend systems with a field that can be nothing" begin
1200+
A = Dict(:a => 1)
1201+
B = Dict(:b => 2)
1202+
@named A1 = ODESystem(Equation[], t, [], [])
1203+
@named B1 = ODESystem(Equation[], t, [], [])
1204+
@named A2 = ODESystem(Equation[], t, [], []; metadata = A)
1205+
@named B2 = ODESystem(Equation[], t, [], []; metadata = B)
1206+
@test ModelingToolkit.get_metadata(extend(A1, B1)) == nothing
1207+
@test ModelingToolkit.get_metadata(extend(A1, B2)) == B
1208+
@test ModelingToolkit.get_metadata(extend(A2, B1)) == A
1209+
@test Set(ModelingToolkit.get_metadata(extend(A2, B2))) == Set(A B)
1210+
end
1211+
11981212
# https://github.com/SciML/ModelingToolkit.jl/issues/2859
11991213
@testset "Initialization with defaults from observed equations (edge case)" begin
12001214
@variables x(t) y(t) z(t)

0 commit comments

Comments
 (0)