@@ -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,77 @@ 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
+ 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
282
272
ttsym = default_toterm (sym)
283
273
rsym = renamespace (sys, sym)
284
274
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
287
277
if hasname (s) && (! iscall (s) || operation (s) != getindex)
288
278
symbol_to_variable[getname (s)] = sym
289
279
end
290
280
end
291
281
end
292
282
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
+
293
320
return IndexCache (
294
321
unk_idxs,
295
322
disc_idxs,
296
323
callback_to_clocks,
297
324
tunable_idxs,
298
325
const_idxs,
299
326
nonnumeric_idxs,
300
- observed_syms ,
301
- dependent_pars ,
327
+ observed_syms_to_timeseries ,
328
+ dependent_pars_to_timeseries ,
302
329
disc_buffer_templates,
303
330
BufferTemplate (Real, tunable_buffer_size),
304
331
const_buffer_sizes,
0 commit comments