Skip to content

Commit 1e5a2b1

Browse files
Merge pull request #3652 from AayushSabharwal/as/better-metadata
refactor: change `metadata` field to be like `BasicSymbolic`
2 parents e907fb9 + 3625523 commit 1e5a2b1

8 files changed

+54
-59
lines changed

src/systems/abstractsystem.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2665,7 +2665,7 @@ function extend(sys::AbstractSystem, basesys::AbstractSystem;
26652665
cevs = union(get_continuous_events(basesys), get_continuous_events(sys))
26662666
devs = union(get_discrete_events(basesys), get_discrete_events(sys))
26672667
defs = merge(get_defaults(basesys), get_defaults(sys)) # prefer `sys`
2668-
meta = union_nothing(get_metadata(basesys), get_metadata(sys))
2668+
meta = merge(get_metadata(basesys), get_metadata(sys))
26692669
syss = union(get_systems(basesys), get_systems(sys))
26702670
args = length(ivs) == 0 ? (eqs, sts, ps) : (eqs, ivs[1], sts, ps)
26712671
kwargs = (parameter_dependencies = dep_ps, observed = obs, continuous_events = cevs,

src/systems/connectors.jl

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -298,19 +298,19 @@ end
298298
error("Different types of connectors are in one connection statement: <$(map(nameof, ss))>")
299299
end
300300

301+
abstract type IsFrame end
302+
301303
"Return true if the system is a 3D multibody frame, otherwise return false."
302304
function isframe(sys)
303-
(has_metadata(sys) && (md = get_metadata(sys)) isa Dict) || return false
304-
get(md, :frame, false)
305+
getmetadata(sys, IsFrame, false)
305306
end
306307

308+
abstract type FrameOrientation end
309+
307310
"Return orientation object of a multibody frame."
308311
function ori(sys)
309-
@assert has_metadata(sys)
310-
md = get_metadata(sys)
311-
if md isa Dict && (O = get(md, :orientation, nothing)) !== nothing
312-
return O
313-
else
312+
val = getmetadata(sys, FrameOrientation, nothing)
313+
if val === nothing
314314
error("System $(sys.name) does not have an orientation object.")
315315
end
316316
end

src/systems/system.jl

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ struct Schedule{V <: BipartiteGraphs.Matching}
99
dummy_sub::Dict{Any, Any}
1010
end
1111

12+
const MetadataT = Base.ImmutableDict{DataType, Any}
13+
1214
struct System <: AbstractSystem
1315
tag::UInt
1416
eqs::Vector{Equation}
@@ -38,7 +40,7 @@ struct System <: AbstractSystem
3840
discrete_events::Vector{SymbolicDiscreteCallback}
3941
connector_type::Any
4042
assertions::Dict{BasicSymbolic, String}
41-
metadata::Any
43+
metadata::MetadataT
4244
gui_metadata::Any # ?
4345
is_dde::Bool
4446
tstops::Vector{Any}
@@ -60,7 +62,7 @@ struct System <: AbstractSystem
6062
brownians, iv, observed, parameter_dependencies, var_to_name, name, description,
6163
defaults, guesses, systems, initialization_eqs, continuous_events, discrete_events,
6264
connector_type, assertions = Dict{BasicSymbolic, String}(),
63-
metadata = nothing, gui_metadata = nothing,
65+
metadata = MetadataT(), gui_metadata = nothing,
6466
is_dde = false, tstops = [], tearing_state = nothing, namespacing = true,
6567
complete = false, index_cache = nothing, ignored_connections = nothing,
6668
preface = nothing, parent = nothing, initializesystem = nothing,
@@ -119,8 +121,9 @@ function System(eqs::Vector{Equation}, iv, dvs, ps, brownians = [];
119121
guesses = Dict(), systems = System[], initialization_eqs = Equation[],
120122
continuous_events = SymbolicContinuousCallback[], discrete_events = SymbolicDiscreteCallback[],
121123
connector_type = nothing, assertions = Dict{BasicSymbolic, String}(),
122-
metadata = nothing, gui_metadata = nothing, is_dde = nothing, tstops = [],
123-
tearing_state = nothing, ignored_connections = nothing, parent = nothing,
124+
metadata = MetadataT(), gui_metadata = nothing,
125+
is_dde = nothing, tstops = [], tearing_state = nothing,
126+
ignored_connections = nothing, parent = nothing,
124127
description = "", name = nothing, discover_from_metadata = true,
125128
initializesystem = nothing, is_initializesystem = false, preface = [],
126129
checks = true)
@@ -185,6 +188,17 @@ function System(eqs::Vector{Equation}, iv, dvs, ps, brownians = [];
185188

186189
assertions = Dict{BasicSymbolic, String}(unwrap(k) => v for (k, v) in assertions)
187190

191+
if isempty(metadata)
192+
metadata = MetadataT()
193+
elseif metadata isa MetadataT
194+
metadata = metadata
195+
else
196+
meta = MetadataT()
197+
for kvp in metadata
198+
meta = Base.ImmutableDict(meta, kvp)
199+
end
200+
metadata = meta
201+
end
188202
System(Threads.atomic_add!(SYSTEM_COUNT, UInt(1)), eqs, noise_eqs, jumps, constraints,
189203
costs, consolidate, dvs, ps, brownians, iv, observed, parameter_dependencies,
190204
var_to_name, name, description, defaults, guesses, systems, initialization_eqs,
@@ -621,6 +635,17 @@ function Base.hash(sys::System, h::UInt)
621635
return h
622636
end
623637

638+
function SymbolicUtils.getmetadata(sys::AbstractSystem, k::DataType, default)
639+
meta = get_metadata(sys)
640+
return get(meta, k, default)
641+
end
642+
643+
function SymbolicUtils.setmetadata(sys::AbstractSystem, k::DataType, v)
644+
meta = get_metadata(sys)
645+
meta = Base.ImmutableDict(meta, k => v)::MetadataT
646+
@set sys.metadata = meta
647+
end
648+
624649
"""
625650
$(TYPEDSIGNATURES)
626651
"""

test/components.jl

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ using ModelingToolkitStandardLibrary.Electrical
88
using ModelingToolkitStandardLibrary.Blocks
99
using LinearAlgebra
1010
using ModelingToolkitStandardLibrary.Thermal
11+
using SymbolicUtils: getmetadata
1112
include("common/rc_model.jl")
1213

1314
@testset "Basics" begin
@@ -328,8 +329,8 @@ end
328329
@testset "Issue#3275: Metadata retained on `complete`" begin
329330
@variables x(t) y(t)
330331
@named inner = System(D(x) ~ x, t)
331-
@named outer = System(D(y) ~ y, t; systems = [inner], metadata = "test")
332-
@test ModelingToolkit.get_metadata(outer) == "test"
332+
@named outer = System(D(y) ~ y, t; systems = [inner], metadata = [Int => "test"])
333+
@test getmetadata(outer, Int, nothing) == "test"
333334
sys = complete(outer)
334-
@test ModelingToolkit.get_metadata(sys) == "test"
335+
@test getmetadata(sys, Int, nothing) == "test"
335336
end

test/discrete_system.jl

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
=#
66
using ModelingToolkit, SymbolicIndexingInterface, Test
77
using ModelingToolkit: t_nounits as t
8-
using ModelingToolkit: get_metadata, MTKParameters
98

109
# Make sure positive shifts error
1110
@variables x(t)
@@ -205,11 +204,6 @@ RHS2 = RHS
205204
# @test c[1] + 1 == length(sol)
206205
# end
207206

208-
@variables x(t) y(t)
209-
testdict = Dict([:test => 1])
210-
@named sys = System([x(k + 1) ~ 1.0], t, [x], []; metadata = testdict)
211-
@test get_metadata(sys) == testdict
212-
213207
@variables x(t) y(t) u(t)
214208
eqs = [u ~ 1
215209
x ~ x(k - 1) + u

test/nonlinearsystem.jl

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using ModelingToolkit, StaticArrays, LinearAlgebra
2-
using ModelingToolkit: get_metadata
32
using DiffEqBase, SparseArrays
43
using Test
54
using NonlinearSolve
@@ -198,14 +197,6 @@ eq = [v1 ~ sin(2pi * t * h)
198197
@named sys = System(eq, t)
199198
@test length(equations(structural_simplify(sys))) == 0
200199

201-
@variables x(t)
202-
@parameters a
203-
eqs = [0 ~ a * x]
204-
205-
testdict = Dict([:test => 1])
206-
@named sys = System(eqs, [x], [a], metadata = testdict)
207-
@test get_metadata(sys) == testdict
208-
209200
@testset "Remake" begin
210201
@parameters a=1.0 b=1.0 c=1.0
211202
@constants h = 1

test/odesystem.jl

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -799,16 +799,6 @@ let
799799
@test string.(independent_variables(prob.f.sys)) == ["t"]
800800
end
801801

802-
@parameters C L R
803-
@variables q(t) p(t) F(t)
804-
805-
eqs = [D(q) ~ -p / L - F
806-
D(p) ~ q / C
807-
0 ~ q / C - R * F]
808-
testdict = Dict([:name => "test"])
809-
@named sys = System(eqs, t, metadata = testdict)
810-
@test get_metadata(sys) == testdict
811-
812802
@variables P(t)=NaN Q(t)=NaN
813803
eqs = [D(Q) ~ 1 / sin(P), D(P) ~ log(-cos(Q))]
814804
@named sys = System(eqs, t, [P, Q], [])
@@ -1112,16 +1102,23 @@ end
11121102

11131103
# https://github.com/SciML/ModelingToolkit.jl/issues/2502
11141104
@testset "Extend systems with a field that can be nothing" begin
1115-
A = Dict(:a => 1)
1116-
B = Dict(:b => 2)
1105+
A = Dict(Int => 1)
1106+
B = Dict(String => 2)
11171107
@named A1 = System(Equation[], t, [], [])
11181108
@named B1 = System(Equation[], t, [], [])
11191109
@named A2 = System(Equation[], t, [], []; metadata = A)
11201110
@named B2 = System(Equation[], t, [], []; metadata = B)
1121-
@test ModelingToolkit.get_metadata(extend(A1, B1)) == nothing
1122-
@test ModelingToolkit.get_metadata(extend(A1, B2)) == B
1123-
@test ModelingToolkit.get_metadata(extend(A2, B1)) == A
1124-
@test Set(ModelingToolkit.get_metadata(extend(A2, B2))) == Set(A B)
1111+
@test isempty(ModelingToolkit.get_metadata(extend(A1, B1)))
1112+
meta = ModelingToolkit.get_metadata(extend(A1, B2))
1113+
@test length(meta) == 1
1114+
@test meta[String] == 2
1115+
meta = ModelingToolkit.get_metadata(extend(A2, B1))
1116+
@test length(meta) == 1
1117+
@test meta[Int] == 1
1118+
meta = ModelingToolkit.get_metadata(extend(A2, B2))
1119+
@test length(meta) == 2
1120+
@test meta[Int] == 1
1121+
@test meta[String] == 2
11251122
end
11261123

11271124
# https://github.com/SciML/ModelingToolkit.jl/issues/2859

test/optimizationsystem.jl

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using ModelingToolkit, SparseArrays, Test, Optimization, OptimizationOptimJL,
22
OptimizationMOI, Ipopt, AmplNLWriter, Ipopt_jll, SymbolicIndexingInterface,
33
LinearAlgebra
4-
using ModelingToolkit: get_metadata
54

65
@testset "basic" begin
76
@variables x y
@@ -228,18 +227,6 @@ end
228227
=#
229228
end
230229

231-
@testset "metadata" begin
232-
@variables x
233-
o1 = (x - 1)^2
234-
c1 = [
235-
x ~ 1
236-
]
237-
testdict = Dict(["test" => 1])
238-
sys1 = OptimizationSystem(o1, [x], [], name = :sys1, constraints = c1,
239-
metadata = testdict)
240-
@test get_metadata(sys1) == testdict
241-
end
242-
243230
@testset "non-convex problem with inequalities" begin
244231
@variables x[1:2] [bounds = (0.0, Inf)]
245232
@named sys = OptimizationSystem(x[1] + x[2], [x...], [];

0 commit comments

Comments
 (0)