Skip to content

Commit 4ae195b

Browse files
fix: fix namespacing of defaults and equations (#2594)
1 parent ab61554 commit 4ae195b

File tree

2 files changed

+72
-8
lines changed

2 files changed

+72
-8
lines changed

src/systems/abstractsystem.jl

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -819,22 +819,24 @@ namespace_controls(sys::AbstractSystem) = controls(sys, controls(sys))
819819

820820
function namespace_defaults(sys)
821821
defs = defaults(sys)
822-
Dict((isparameter(k) ? parameters(sys, k) : unknowns(sys, k)) => namespace_expr(v, sys)
822+
Dict((isparameter(k) ? parameters(sys, k) : unknowns(sys, k)) => namespace_expr(
823+
v, sys; check = true)
823824
for (k, v) in pairs(defs))
824825
end
825826

826827
function namespace_equations(sys::AbstractSystem, ivs = independent_variables(sys))
827828
eqs = equations(sys)
828829
isempty(eqs) && return Equation[]
829-
map(eq -> namespace_equation(eq, sys; ivs), eqs)
830+
map(eq -> namespace_equation(eq, sys; ivs, check = true), eqs)
830831
end
831832

832833
function namespace_equation(eq::Equation,
833834
sys,
834835
n = nameof(sys);
835-
ivs = independent_variables(sys))
836-
_lhs = namespace_expr(eq.lhs, sys, n; ivs)
837-
_rhs = namespace_expr(eq.rhs, sys, n; ivs)
836+
ivs = independent_variables(sys),
837+
check = false)
838+
_lhs = namespace_expr(eq.lhs, sys, n; ivs, check)
839+
_rhs = namespace_expr(eq.rhs, sys, n; ivs, check)
838840
_lhs ~ _rhs
839841
end
840842

@@ -844,32 +846,36 @@ function namespace_assignment(eq::Assignment, sys)
844846
Assignment(_lhs, _rhs)
845847
end
846848

847-
function namespace_expr(O, sys, n = nameof(sys); ivs = independent_variables(sys))
849+
function namespace_expr(
850+
O, sys, n = nameof(sys); ivs = independent_variables(sys), check = false)
848851
O = unwrap(O)
849852
if any(isequal(O), ivs)
850853
return O
851854
elseif istree(O)
852855
T = typeof(O)
853856
renamed = let sys = sys, n = n, T = T
854-
map(a -> namespace_expr(a, sys, n; ivs)::Any, arguments(O))
857+
map(a -> namespace_expr(a, sys, n; ivs, check)::Any, arguments(O))
855858
end
856859
if isvariable(O)
860+
check && !is_variable(sys, O) && !is_parameter(sys, O) && return O
857861
# Use renamespace so the scope is correct, and make sure to use the
858862
# metadata from the rescoped variable
859863
rescoped = renamespace(n, O)
860864
similarterm(O, operation(rescoped), renamed,
861865
metadata = metadata(rescoped))
862866
elseif Symbolics.isarraysymbolic(O)
867+
check && !is_variable(sys, O) && !is_parameter(sys, O) && return O
863868
# promote_symtype doesn't work for array symbolics
864869
similarterm(O, operation(O), renamed, symtype(O), metadata = metadata(O))
865870
else
866871
similarterm(O, operation(O), renamed, metadata = metadata(O))
867872
end
868873
elseif isvariable(O)
874+
check && !is_variable(sys, O) && !is_parameter(sys, O) && return O
869875
renamespace(n, O)
870876
elseif O isa Array
871877
let sys = sys, n = n
872-
map(o -> namespace_expr(o, sys, n; ivs), O)
878+
map(o -> namespace_expr(o, sys, n; ivs, check), O)
873879
end
874880
else
875881
O

test/odesystem.jl

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -995,3 +995,61 @@ let # Issue https://github.com/SciML/ModelingToolkit.jl/issues/2322
995995
sol = solve(prob, Rodas4())
996996
@test sol(1)[]0.6065307685451087 rtol=1e-4
997997
end
998+
999+
# Issue#2344
1000+
function FML2(; name)
1001+
@parameters begin
1002+
k2[1:1] = [1.0]
1003+
end
1004+
systems = @named begin
1005+
constant = Constant(k = k2[1])
1006+
end
1007+
@variables begin
1008+
x(t) = 0
1009+
end
1010+
eqs = [
1011+
D(x) ~ constant.output.u + k2[1]
1012+
]
1013+
ODESystem(eqs, t; systems, name)
1014+
end
1015+
1016+
@mtkbuild model = FML2()
1017+
1018+
@test isequal(ModelingToolkit.defaults(model)[model.constant.k], model.k2[1])
1019+
@test_nowarn ODEProblem(model, [], (0.0, 10.0))
1020+
1021+
# Issue#2477
1022+
function RealExpression(; name, y)
1023+
vars = @variables begin
1024+
u(t)
1025+
end
1026+
eqns = [
1027+
u ~ y
1028+
]
1029+
sys = ODESystem(eqns, t, vars, []; name)
1030+
end
1031+
1032+
function sys1(; name)
1033+
vars = @variables begin
1034+
x(t)
1035+
z(t)[1:1]
1036+
end # doing a collect on z doesn't work either.
1037+
@named e1 = RealExpression(y = x) # This works perfectly.
1038+
@named e2 = RealExpression(y = z[1]) # This bugs. However, `full_equations(e2)` works as expected.
1039+
systems = [e1, e2]
1040+
ODESystem(Equation[], t, Iterators.flatten(vars), []; systems, name)
1041+
end
1042+
1043+
@named sys = sys1()
1044+
sys = complete(sys)
1045+
@test Set(equations(sys)) == Set([sys.e1.u ~ sys.x, sys.e2.u ~ sys.z[1]])
1046+
1047+
# Issue#2522
1048+
@parameters a[1:2]=[1, 2] b=4 c=1
1049+
@variables x(t)=ParentScope(a[1]) y(t)=ParentScope(b)
1050+
@named level0 = ODESystem([D(x) ~ ParentScope(a[2]),
1051+
D(y) ~ ParentScope(c)], t, [x, y], [])
1052+
level1 = ODESystem(Equation[], t, [], [a..., b, c]; name = :level1) level0
1053+
level1 = structural_simplify(level1)
1054+
@test isequal(ModelingToolkit.defaults(level1)[level1.level0.x], level1.a[1])
1055+
@test_nowarn ODEProblem(level1, [], (0, 1))

0 commit comments

Comments
 (0)