@@ -38,6 +38,7 @@ const UnknownIndexMap = Dict{
38
38
BasicSymbolic, Union{Int, UnitRange{Int}, AbstractArray{Int}}}
39
39
const TunableIndexMap = Dict{BasicSymbolic,
40
40
Union{Int, UnitRange{Int}, Base. ReshapedArray{Int, N, UnitRange{Int}} where {N}}}
41
+ const TimeseriesSetType = Set{Union{ContinuousTimeseries, Int}}
41
42
42
43
struct IndexCache
43
44
unknown_idx:: UnknownIndexMap
@@ -48,8 +49,9 @@ struct IndexCache
48
49
tunable_idx:: TunableIndexMap
49
50
constant_idx:: ParamIndexMap
50
51
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}
53
55
discrete_buffer_sizes:: Vector{Vector{BufferTemplate}}
54
56
tunable_buffer_size:: BufferTemplate
55
57
constant_buffer_sizes:: Vector{BufferTemplate}
@@ -91,20 +93,6 @@ function IndexCache(sys::AbstractSystem)
91
93
end
92
94
end
93
95
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
-
108
96
tunable_buffers = Dict {Any, Set{BasicSymbolic}} ()
109
97
constant_buffers = Dict {Any, Set{BasicSymbolic}} ()
110
98
nonnumeric_buffers = Dict {Any, Set{Union{BasicSymbolic, CallWithMetadata}}} ()
@@ -267,38 +255,68 @@ function IndexCache(sys::AbstractSystem)
267
255
end
268
256
end
269
257
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}()
279
260
280
261
for eq in parameter_dependencies (sys)
281
262
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
282
270
ttsym = default_toterm (sym)
283
271
rsym = renamespace (sys, sym)
284
272
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
287
275
if hasname (s) && (! iscall (s) || operation (s) != getindex)
288
276
symbol_to_variable[getname (s)] = sym
289
277
end
290
278
end
291
279
end
292
280
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
+
293
311
return IndexCache (
294
312
unk_idxs,
295
313
disc_idxs,
296
314
callback_to_clocks,
297
315
tunable_idxs,
298
316
const_idxs,
299
317
nonnumeric_idxs,
300
- observed_syms ,
301
- dependent_pars ,
318
+ observed_syms_to_timeseries ,
319
+ dependent_pars_to_timeseries ,
302
320
disc_buffer_templates,
303
321
BufferTemplate (Real, tunable_buffer_size),
304
322
const_buffer_sizes,
0 commit comments