@@ -32,6 +32,8 @@ struct DiscreteIndex
3232end
3333
3434const ParamIndexMap = Dict{BasicSymbolic, Tuple{Int, Int}}
35+ const NonnumericMap = Dict{
36+ Union{BasicSymbolic, Symbolics. CallWithMetadata}, Tuple{Int, Int}}
3537const UnknownIndexMap = Dict{
3638 BasicSymbolic, Union{Int, UnitRange{Int}, AbstractArray{Int}}}
3739const TunableIndexMap = Dict{BasicSymbolic,
@@ -45,20 +47,20 @@ struct IndexCache
4547 callback_to_clocks:: Dict{Any, Vector{Int}}
4648 tunable_idx:: TunableIndexMap
4749 constant_idx:: ParamIndexMap
48- nonnumeric_idx:: ParamIndexMap
50+ nonnumeric_idx:: NonnumericMap
4951 observed_syms:: Set{BasicSymbolic}
5052 dependent_pars:: Set{BasicSymbolic}
5153 discrete_buffer_sizes:: Vector{Vector{BufferTemplate}}
5254 tunable_buffer_size:: BufferTemplate
5355 constant_buffer_sizes:: Vector{BufferTemplate}
5456 nonnumeric_buffer_sizes:: Vector{BufferTemplate}
55- symbol_to_variable:: Dict{Symbol, BasicSymbolic}
57+ symbol_to_variable:: Dict{Symbol, Union{ BasicSymbolic, CallWithMetadata} }
5658end
5759
5860function IndexCache (sys:: AbstractSystem )
5961 unks = solved_unknowns (sys)
6062 unk_idxs = UnknownIndexMap ()
61- symbol_to_variable = Dict {Symbol, BasicSymbolic} ()
63+ symbol_to_variable = Dict {Symbol, Union{ BasicSymbolic, CallWithMetadata} } ()
6264
6365 let idx = 1
6466 for sym in unks
@@ -105,12 +107,12 @@ function IndexCache(sys::AbstractSystem)
105107
106108 tunable_buffers = Dict {Any, Set{BasicSymbolic}} ()
107109 constant_buffers = Dict {Any, Set{BasicSymbolic}} ()
108- nonnumeric_buffers = Dict {Any, Set{BasicSymbolic}} ()
110+ nonnumeric_buffers = Dict {Any, Set{Union{ BasicSymbolic, CallWithMetadata} }} ()
109111
110- function insert_by_type! (buffers:: Dict{Any, Set{BasicSymbolic}} , sym)
112+ function insert_by_type! (buffers:: Dict{Any, S} , sym) where {S}
111113 sym = unwrap (sym)
112114 ctype = symtype (sym)
113- buf = get! (buffers, ctype, Set {BasicSymbolic} ())
115+ buf = get! (buffers, ctype, S ())
114116 push! (buf, sym)
115117 end
116118
@@ -216,8 +218,8 @@ function IndexCache(sys::AbstractSystem)
216218 )
217219 end
218220
219- function get_buffer_sizes_and_idxs (buffers:: Dict{Any, Set{BasicSymbolic}} )
220- idxs = ParamIndexMap ()
221+ function get_buffer_sizes_and_idxs (T, buffers:: Dict )
222+ idxs = T ()
221223 buffer_sizes = BufferTemplate[]
222224 for (i, (T, buf)) in enumerate (buffers)
223225 for (j, p) in enumerate (buf)
@@ -229,13 +231,18 @@ function IndexCache(sys::AbstractSystem)
229231 idxs[rp] = (i, j)
230232 idxs[rttp] = (i, j)
231233 end
234+ if T <: Symbolics.FnType
235+ T = Any
236+ end
232237 push! (buffer_sizes, BufferTemplate (T, length (buf)))
233238 end
234239 return idxs, buffer_sizes
235240 end
236241
237- const_idxs, const_buffer_sizes = get_buffer_sizes_and_idxs (constant_buffers)
238- nonnumeric_idxs, nonnumeric_buffer_sizes = get_buffer_sizes_and_idxs (nonnumeric_buffers)
242+ const_idxs, const_buffer_sizes = get_buffer_sizes_and_idxs (
243+ ParamIndexMap, constant_buffers)
244+ nonnumeric_idxs, nonnumeric_buffer_sizes = get_buffer_sizes_and_idxs (
245+ NonnumericMap, nonnumeric_buffers)
239246
240247 tunable_idxs = TunableIndexMap ()
241248 tunable_buffer_size = 0
@@ -397,7 +404,8 @@ function reorder_parameters(ic::IndexCache, ps; drop_missing = false)
397404 for temp in ic. discrete_buffer_sizes)
398405 const_buf = Tuple (BasicSymbolic[unwrap (variable (:DEF )) for _ in 1 : (temp. length)]
399406 for temp in ic. constant_buffer_sizes)
400- nonnumeric_buf = Tuple (BasicSymbolic[unwrap (variable (:DEF )) for _ in 1 : (temp. length)]
407+ nonnumeric_buf = Tuple (Union{BasicSymbolic, CallWithMetadata}[unwrap (variable (:DEF ))
408+ for _ in 1 : (temp. length)]
401409 for temp in ic. nonnumeric_buffer_sizes)
402410 for p in ps
403411 p = unwrap (p)
0 commit comments