Skip to content

Commit d9ee7c3

Browse files
refactor: change metadata field to be like BasicSymbolic
1 parent 7bceb7a commit d9ee7c3

File tree

3 files changed

+37
-12
lines changed

3 files changed

+37
-12
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
"""

0 commit comments

Comments
 (0)