diff --git a/lib/ModelingToolkitBase/src/systems/system.jl b/lib/ModelingToolkitBase/src/systems/system.jl index ee88081e13..ca7aafc2fe 100644 --- a/lib/ModelingToolkitBase/src/systems/system.jl +++ b/lib/ModelingToolkitBase/src/systems/system.jl @@ -398,6 +398,7 @@ end defsdict(x::SymmapT) = x defsdict(x::Vector{Any}) = isempty(x) ? SymmapT() : defsdict(Dict(x)) + function defsdict(x::Union{AbstractDict, AbstractArray{<:Pair}}) result = SymmapT() for (k, v) in x @@ -406,6 +407,20 @@ function defsdict(x::Union{AbstractDict, AbstractArray{<:Pair}}) return result end +function defsdict( + x::Union{AbstractDict, AbstractArray{<:Pair}}, var_to_name::Dict{Symbol, SymbolicT} + ) + result = SymmapT() + for (k, v) in x + k_unwrapped = unwrap(k) + if k_unwrapped isa Symbol + k_unwrapped = get(var_to_name, k_unwrapped, k_unwrapped) + end + result[k_unwrapped] = SU.Const{VartypeT}(v) + end + return result +end + as_atomicmap(::Type{T}, x::AtomicMapT{T}) where {T} = x function as_atomicmap(::Type{T}, x::Union{AbstractDict, AbstractArray{<:Pair}}) where {T} result = AtomicMapT{T}() @@ -517,9 +532,12 @@ function System( end var_to_name = Dict{Symbol, SymbolicT}() - bindings = defsdict(bindings) - initial_conditions = defsdict(initial_conditions) - guesses = defsdict(guesses) + # Populate var_to_name early so defsdict can resolve Symbol keys (e.g. :X => 1.0) + collect_var_to_name!(var_to_name, dvs) + collect_var_to_name!(var_to_name, ps) + bindings = defsdict(bindings, var_to_name) + initial_conditions = defsdict(initial_conditions, var_to_name) + guesses = defsdict(guesses, var_to_name) all_dvs = as_atomic_array_set(dvs) if iv === nothing for k in keys(bindings) diff --git a/lib/ModelingToolkitBase/test/binding_semantics.jl b/lib/ModelingToolkitBase/test/binding_semantics.jl index 3590d05ce2..fb5aec5942 100644 --- a/lib/ModelingToolkitBase/test/binding_semantics.jl +++ b/lib/ModelingToolkitBase/test/binding_semantics.jl @@ -112,3 +112,15 @@ end @parameters p::Int q::String @test_throws "only valid for solvable" System(Equation[], t, [], [q]; bindings = [q => missing], name = :a) end + +@testset "Symbol keys in initial_conditions, guesses, and bindings" begin + @variables x(t) + @parameters p d + eqs = [D(x) ~ p - d * x] + + sys = System(eqs, t; initial_conditions = [:x => 1.0, :p => 2.0], + guesses = [:x => 0.5], bindings = [:d => 2p], name = :a) + @test isequal(initial_conditions(sys), Dict(x => SConst(1.0), p => SConst(2.0))) + @test isequal(guesses(sys), Dict(x => SConst(0.5))) + @test isequal(bindings(sys), Dict(d => 2p)) +end