@@ -38,6 +38,7 @@ const UnknownIndexMap = Dict{
3838 BasicSymbolic, Union{Int, UnitRange{Int}, AbstractArray{Int}}}
3939const TunableIndexMap = Dict{BasicSymbolic,
4040 Union{Int, UnitRange{Int}, Base. ReshapedArray{Int, N, UnitRange{Int}} where {N}}}
41+ const TimeseriesSetType = Set{Union{ContinuousTimeseries, Int}}
4142
4243struct IndexCache
4344 unknown_idx:: UnknownIndexMap
@@ -48,8 +49,9 @@ struct IndexCache
4849 tunable_idx:: TunableIndexMap
4950 constant_idx:: ParamIndexMap
5051 nonnumeric_idx:: NonnumericMap
51- observed_syms:: Set{BasicSymbolic}
52- dependent_pars:: Set{Union{BasicSymbolic, CallWithMetadata}}
52+ observed_syms_to_timeseries:: Dict{BasicSymbolic, TimeseriesSetType}
53+ dependent_pars_to_timeseries:: Dict {
54+ Union{BasicSymbolic, CallWithMetadata}, TimeseriesSetType}
5355 discrete_buffer_sizes:: Vector{Vector{BufferTemplate}}
5456 tunable_buffer_size:: BufferTemplate
5557 constant_buffer_sizes:: Vector{BufferTemplate}
@@ -91,20 +93,6 @@ function IndexCache(sys::AbstractSystem)
9193 end
9294 end
9395
94- observed_syms = Set {BasicSymbolic} ()
95- for eq in observed (sys)
96- if symbolic_type (eq. lhs) != NotSymbolic ()
97- sym = eq. lhs
98- ttsym = default_toterm (sym)
99- rsym = renamespace (sys, sym)
100- rttsym = renamespace (sys, ttsym)
101- push! (observed_syms, sym)
102- push! (observed_syms, ttsym)
103- push! (observed_syms, rsym)
104- push! (observed_syms, rttsym)
105- end
106- end
107-
10896 tunable_buffers = Dict {Any, Set{BasicSymbolic}} ()
10997 constant_buffers = Dict {Any, Set{BasicSymbolic}} ()
11098 nonnumeric_buffers = Dict {Any, Set{Union{BasicSymbolic, CallWithMetadata}}} ()
@@ -267,38 +255,77 @@ function IndexCache(sys::AbstractSystem)
267255 end
268256 end
269257
270- for sym in Iterators. flatten ((keys (unk_idxs), keys (disc_idxs), keys (tunable_idxs),
271- keys (const_idxs), keys (nonnumeric_idxs),
272- observed_syms, independent_variable_symbols (sys)))
273- if hasname (sym) && (! iscall (sym) || operation (sym) != = getindex)
274- symbol_to_variable[getname (sym)] = sym
275- end
276- end
277-
278- dependent_pars = Set {Union{BasicSymbolic, CallWithMetadata}} ()
258+ dependent_pars_to_timeseries = Dict{
259+ Union{BasicSymbolic, CallWithMetadata}, TimeseriesSetType}()
279260
280261 for eq in parameter_dependencies (sys)
281262 sym = eq. lhs
263+ vs = vars (eq. rhs)
264+ timeseries = TimeseriesSetType ()
265+ if is_time_dependent (sys)
266+ for v in vs
267+ if (idx = get (disc_idxs, v, nothing )) != = nothing
268+ push! (timeseries, idx. clock_idx)
269+ end
270+ end
271+ end
282272 ttsym = default_toterm (sym)
283273 rsym = renamespace (sys, sym)
284274 rttsym = renamespace (sys, ttsym)
285- for s in [ sym, ttsym, rsym, rttsym]
286- push! (dependent_pars, s)
275+ for s in ( sym, ttsym, rsym, rttsym)
276+ dependent_pars_to_timeseries[s] = timeseries
287277 if hasname (s) && (! iscall (s) || operation (s) != getindex)
288278 symbol_to_variable[getname (s)] = sym
289279 end
290280 end
291281 end
292282
283+ observed_syms_to_timeseries = Dict {BasicSymbolic, TimeseriesSetType} ()
284+ for eq in observed (sys)
285+ if symbolic_type (eq. lhs) != NotSymbolic ()
286+ sym = eq. lhs
287+ vs = vars (eq. rhs; op = Nothing)
288+ timeseries = TimeseriesSetType ()
289+ if is_time_dependent (sys)
290+ for v in vs
291+ if (idx = get (disc_idxs, v, nothing )) != = nothing
292+ push! (timeseries, idx. clock_idx)
293+ elseif haskey (observed_syms_to_timeseries, v)
294+ union! (timeseries, observed_syms_to_timeseries[v])
295+ elseif haskey (dependent_pars_to_timeseries, v)
296+ union! (timeseries, dependent_pars_to_timeseries[v])
297+ end
298+ end
299+ if isempty (timeseries)
300+ push! (timeseries, ContinuousTimeseries ())
301+ end
302+ end
303+ ttsym = default_toterm (sym)
304+ rsym = renamespace (sys, sym)
305+ rttsym = renamespace (sys, ttsym)
306+ for s in (sym, ttsym, rsym, rttsym)
307+ observed_syms_to_timeseries[s] = timeseries
308+ end
309+ end
310+ end
311+
312+ for sym in Iterators. flatten ((keys (unk_idxs), keys (disc_idxs), keys (tunable_idxs),
313+ keys (const_idxs), keys (nonnumeric_idxs),
314+ keys (observed_syms_to_timeseries), independent_variable_symbols (sys)))
315+ if hasname (sym) && (! iscall (sym) || operation (sym) != = getindex)
316+ symbol_to_variable[getname (sym)] = sym
317+ end
318+ end
319+
293320 return IndexCache (
294321 unk_idxs,
295322 disc_idxs,
296323 callback_to_clocks,
297324 tunable_idxs,
298325 const_idxs,
299326 nonnumeric_idxs,
300- observed_syms ,
301- dependent_pars ,
327+ observed_syms_to_timeseries ,
328+ dependent_pars_to_timeseries ,
302329 disc_buffer_templates,
303330 BufferTemplate (Real, tunable_buffer_size),
304331 const_buffer_sizes,
0 commit comments