Skip to content

Commit ab5f279

Browse files
fix: fix getproperty, hasproperty for simplified hierarchical systems
1 parent c8ac522 commit ab5f279

File tree

2 files changed

+48
-15
lines changed

2 files changed

+48
-15
lines changed

src/systems/abstractsystem.jl

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -933,7 +933,7 @@ function complete(sys::AbstractSystem; split = true)
933933
end
934934
if split && has_index_cache(sys)
935935
@set! sys.index_cache = IndexCache(sys)
936-
all_ps = parameters(sys)
936+
all_ps = get_ps(sys)
937937
if !isempty(all_ps)
938938
# reorder parameters by portions
939939
ps_split = reorder_parameters(sys, all_ps)
@@ -1102,6 +1102,9 @@ function Base.propertynames(sys::AbstractSystem; private = false)
11021102
if private
11031103
return fieldnames(typeof(sys))
11041104
else
1105+
if has_parent(sys) && (parent = get_parent(sys); parent !== nothing)
1106+
sys = parent
1107+
end
11051108
names = Symbol[]
11061109
for s in get_systems(sys)
11071110
push!(names, getname(s))
@@ -1144,20 +1147,6 @@ function getvar(sys::AbstractSystem, name::Symbol; namespace = !iscomplete(sys))
11441147
avs = get_var_to_name(sys)
11451148
v = get(avs, name, nothing)
11461149
v === nothing || return namespace ? renamespace(sys, v) : v
1147-
else
1148-
sts = get_unknowns(sys)
1149-
i = findfirst(x -> getname(x) == name, sts)
1150-
if i !== nothing
1151-
return namespace ? renamespace(sys, sts[i]) : sts[i]
1152-
end
1153-
1154-
if has_ps(sys)
1155-
ps = get_ps(sys)
1156-
i = findfirst(x -> getname(x) == name, ps)
1157-
if i !== nothing
1158-
return namespace ? renamespace(sys, ps[i]) : ps[i]
1159-
end
1160-
end
11611150
end
11621151

11631152
sts = get_unknowns(sys)
@@ -1166,6 +1155,14 @@ function getvar(sys::AbstractSystem, name::Symbol; namespace = !iscomplete(sys))
11661155
return namespace ? renamespace(sys, sts[i]) : sts[i]
11671156
end
11681157

1158+
if has_ps(sys)
1159+
ps = get_ps(sys)
1160+
i = findfirst(x -> getname(x) == name, ps)
1161+
if i !== nothing
1162+
return namespace ? renamespace(sys, ps[i]) : ps[i]
1163+
end
1164+
end
1165+
11691166
if has_observed(sys)
11701167
obs = get_observed(sys)
11711168
i = findfirst(x -> getname(x.lhs) == name, obs)

test/components.jl

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,3 +314,39 @@ sol = solve(prob, Tsit5())
314314
end
315315
@test string(Base.doc(Pin2)) == "Hey there, Pin2!\n"
316316
end
317+
318+
@testset "Issue#3016 Hierarchical indexing" begin
319+
@mtkmodel Inner begin
320+
@parameters begin
321+
p
322+
end
323+
end
324+
@mtkmodel Outer begin
325+
@components begin
326+
inner = Inner()
327+
end
328+
@variables begin
329+
x(t)
330+
end
331+
@equations begin
332+
x ~ inner.p
333+
end
334+
end
335+
336+
@named outer = Outer()
337+
simp = structural_simplify(outer)
338+
339+
@test sort(propertynames(outer)) == [:inner, :t, :x]
340+
@test propertynames(simp) == propertynames(outer)
341+
@test sort(propertynames(outer.inner)) == [:p, :t]
342+
@test propertynames(simp.inner) == propertynames(outer.inner)
343+
344+
for sym in (:t, :x)
345+
@test_nowarn getproperty(simp, sym)
346+
@test_nowarn getproperty(outer, sym)
347+
end
348+
@test_nowarn simp.inner.p
349+
@test_nowarn outer.inner.p
350+
@test_throws ArgumentError simp.inner₊p
351+
@test_throws ArgumentError outer.inner₊p
352+
end

0 commit comments

Comments
 (0)