@@ -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,68 @@ 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+ for v in vs
266+ if (idx = get (disc_idxs, v, nothing )) != = nothing
267+ push! (timeseries, idx. clock_idx)
268+ end
269+ end
282270 ttsym = default_toterm (sym)
283271 rsym = renamespace (sys, sym)
284272 rttsym = renamespace (sys, ttsym)
285- for s in [ sym, ttsym, rsym, rttsym]
286- push! (dependent_pars, s)
273+ for s in ( sym, ttsym, rsym, rttsym)
274+ dependent_pars_to_timeseries[s] = timeseries
287275 if hasname (s) && (! iscall (s) || operation (s) != getindex)
288276 symbol_to_variable[getname (s)] = sym
289277 end
290278 end
291279 end
292280
281+ observed_syms_to_timeseries = Dict {BasicSymbolic, TimeseriesSetType} ()
282+ for eq in observed (sys)
283+ if symbolic_type (eq. lhs) != NotSymbolic ()
284+ sym = eq. lhs
285+ vs = vars (eq. rhs)
286+ timeseries = TimeseriesSetType ()
287+ for v in vs
288+ if (idx = get (disc_idxs, v, nothing )) != = nothing
289+ push! (timeseries, idx. clock_idx)
290+ elseif haskey (unk_idxs, v) || haskey (observed_syms_to_timeseries, v)
291+ push! (timeseries, ContinuousTimeseries ())
292+ end
293+ end
294+ ttsym = default_toterm (sym)
295+ rsym = renamespace (sys, sym)
296+ rttsym = renamespace (sys, ttsym)
297+ for s in (sym, ttsym, rsym, rttsym)
298+ observed_syms_to_timeseries[s] = timeseries
299+ end
300+ end
301+ end
302+
303+ for sym in Iterators. flatten ((keys (unk_idxs), keys (disc_idxs), keys (tunable_idxs),
304+ keys (const_idxs), keys (nonnumeric_idxs),
305+ keys (observed_syms_to_timeseries), independent_variable_symbols (sys)))
306+ if hasname (sym) && (! iscall (sym) || operation (sym) != = getindex)
307+ symbol_to_variable[getname (sym)] = sym
308+ end
309+ end
310+
293311 return IndexCache (
294312 unk_idxs,
295313 disc_idxs,
296314 callback_to_clocks,
297315 tunable_idxs,
298316 const_idxs,
299317 nonnumeric_idxs,
300- observed_syms ,
301- dependent_pars ,
318+ observed_syms_to_timeseries ,
319+ dependent_pars_to_timeseries ,
302320 disc_buffer_templates,
303321 BufferTemplate (Real, tunable_buffer_size),
304322 const_buffer_sizes,
0 commit comments