ITADN

`complete` swaps order of metadata in `ReactionSystem`s

#1353OpenTorkelE 创建于 2026-01-16
bug
T
TorkelEcommented
For some reason, in some cases where you do `complete` on a `ReactionSystem`, that can swap around the order on metadata. Since metadata is not overwritten, but just added to the metadata dict, that means that what is retrieved from `getmetadata` can change. In principle, this just involves MTK functions, so everything should transfer to `ReactionSystem`. However, since things work fine for `System`, something is obviously going on in Catalyst. ```julia using Catalyst, ModelingToolkitBase t = default_t() D = default_time_deriv() # Create model. @species X(t) @parameters d @named rs2 = ReactionSystem([Reaction(d, [X], nothing)], t; metadata = [MiscSystemData => π]) rs2 = ModelingToolkitBase.setmetadata(rs2, MiscSystemData, ones(2, 3)) ModelingToolkitBase.getmetadata(complete(rs2), MiscSystemData, nothing) # π = 3.1415926535897... (incorrect) @species X(t) @parameters d @named sys2 = System([Differential(t)(X) ~ -d*X], t; metadata = [MiscSystemData => π]) sys2 = ModelingToolkitBase.setmetadata(sys2, MiscSystemData, ones(2, 3)) ModelingToolkitBase.getmetadata(complete(sys2), MiscSystemData, nothing) # 2×3 Matrix{Float64}: (correct) ``` And the actual metadata dicts are: ``` julia> ModelingToolkitBase.get_metadata((rs2)) Base.ImmutableDict{DataType, Any} with 3 entries: MiscSystemData => [1.0 1.0 1.0; 1.0 1.0 1.0] MutableCacheKey => Dict{DataType, Any}() MiscSystemData => π julia> ModelingToolkitBase.get_metadata(complete(rs2)) Base.ImmutableDict{DataType, Any} with 3 entries: MiscSystemData => π MutableCacheKey => Dict{DataType, Any}() MiscSystemData => [1.0 1.0 1.0; 1.0 1.0 1.0] julia> ModelingToolkitBase.get_metadata((sys2)) Base.ImmutableDict{DataType, Any} with 3 entries: MiscSystemData => [1.0 1.0 1.0; 1.0 1.0 1.0] MutableCacheKey => Dict{DataType, Any}() MiscSystemData => π julia> ModelingToolkitBase.get_metadata(complete(sys2)) Base.ImmutableDict{DataType, Any} with 3 entries: MiscSystemData => [1.0 1.0 1.0; 1.0 1.0 1.0] MutableCacheKey => Dict{DataType, Any}() MiscSystemData => π ``` This is only relevant on the current branch for Catalyst v16 (but will likely remain after that merges)
3 条评论