Skip to content

Commit 675fbe7

Browse files
authored
Merge pull request #1275 from SciML/myb/compose
Fix preference of defaults for composed models
2 parents a207913 + 8bb535f commit 675fbe7

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

src/systems/abstractsystem.jl

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,13 @@ Base.@deprecate default_p(x) defaults(x) false
420420
function defaults(sys::AbstractSystem)
421421
systems = get_systems(sys)
422422
defs = get_defaults(sys)
423-
isempty(systems) ? defs : mapreduce(namespace_defaults, merge, systems; init=defs)
423+
# `mapfoldr` is really important!!! We should prefer the base model for
424+
# defaults, because people write:
425+
#
426+
# `compose(ODESystem(...; defaults=defs), ...)`
427+
#
428+
# Thus, right associativity is required and crucial for correctness.
429+
isempty(systems) ? defs : mapfoldr(namespace_defaults, merge, systems; init=defs)
424430
end
425431

426432
states(sys::AbstractSystem, v) = renamespace(sys, v)

test/components.jl

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,26 @@ D = Differential(t)
5555
@named sys1 = extend(ODESystem([D(x3) ~ x3], t; name=:foo), sys1_partial)
5656
@named sys2 = compose(ODESystem([D(x4) ~ x4], t; name=:foo), sys1)
5757
@test_nowarn sys2.sys1.sys1_inner.x1 # test the correct nesting
58+
59+
60+
# compose tests
61+
@parameters t
62+
63+
function record_fun(;name)
64+
pars = @parameters a=10 b=100
65+
ODESystem(Equation[], t, [], pars; name)
66+
end
67+
68+
function first_model(;name)
69+
@named foo=record_fun()
70+
71+
defs = Dict()
72+
defs[foo.a] = 3
73+
defs[foo.b] = 300
74+
pars = @parameters x=2 y=20
75+
compose(ODESystem(Equation[], t, [], pars; name, defaults=defs), foo)
76+
end
77+
@named goo = first_model()
78+
@unpack foo = goo
79+
@test ModelingToolkit.defaults(goo)[foo.a] == 3
80+
@test ModelingToolkit.defaults(goo)[foo.b] == 300

0 commit comments

Comments
 (0)