@@ -186,6 +186,13 @@ function split_system(ci::ClockInference{S}) where {S}
186
186
end
187
187
tss[id] = ts_i
188
188
end
189
+ if continuous_id != 0
190
+ tss[continuous_id], tss[end ] = tss[end ], tss[continuous_id]
191
+ inputs[continuous_id], inputs[end ] = inputs[end ], inputs[continuous_id]
192
+ id_to_clock[continuous_id], id_to_clock[end ] = id_to_clock[end ],
193
+ id_to_clock[continuous_id]
194
+ continuous_id = lastindex (tss)
195
+ end
189
196
return tss, inputs, continuous_id, id_to_clock
190
197
end
191
198
@@ -270,25 +277,9 @@ function generate_discrete_affect(
270
277
],
271
278
[],
272
279
let_block) |> toexpr
273
- if use_index_cache
274
- cont_to_disc_idxs = [parameter_index (osys, sym) for sym in input]
275
- disc_range = [parameter_index (osys, sym) for sym in unknowns (sys)]
276
- else
277
- cont_to_disc_idxs = (offset + 1 ): (offset += ni)
278
- input_offset = offset
279
- disc_range = (offset + 1 ): (offset += ns)
280
- end
281
- save_vec = Expr (:ref , :Float64 )
282
- if use_index_cache
283
- for unk in unknowns (sys)
284
- idx = parameter_index (osys, unk)
285
- push! (save_vec. args, :($ (parameter_values)(p, $ idx)))
286
- end
287
- else
288
- for i in 1 : ns
289
- push! (save_vec. args, :(p[$ (input_offset + i)]))
290
- end
291
- end
280
+ cont_to_disc_idxs = [parameter_index (osys, sym) for sym in input]
281
+ disc_range = [parameter_index (osys, sym) for sym in unknowns (sys)]
282
+ save_expr = :($ (SciMLBase. save_discretes!)(integrator, $ i))
292
283
empty_disc = isempty (disc_range)
293
284
disc_init = if use_index_cache
294
285
:(function (u, p, t)
@@ -351,11 +342,14 @@ function generate_discrete_affect(
351
342
# d2c comes last
352
343
# @show t
353
344
# @show "incoming", p
354
- $ (
355
- if use_index_cache
345
+ result = c2d_obs (u, p... , t)
346
+ for (val, i) in zip (result, $ cont_to_disc_idxs)
347
+ $ (_set_parameter_unchecked!)(p, val, i; update_dependent = false )
348
+ end
349
+ $ (if ! empty_disc
356
350
quote
357
- result = c2d_obs (integrator . u, p... , t)
358
- for (val, i) in zip (result , $ cont_to_disc_idxs )
351
+ disc (disc_unknowns, u, p... , t)
352
+ for (val, i) in zip (disc_unknowns , $ disc_range )
359
353
$ (_set_parameter_unchecked!)(p, val, i; update_dependent = false )
360
354
end
361
355
end
@@ -406,7 +400,7 @@ function generate_discrete_affect(
406
400
end
407
401
)
408
402
end )
409
- sv = SavedValues (Float64, Vector{Float64})
403
+
410
404
push! (affect_funs, affect!)
411
405
push! (init_funs, disc_init)
412
406
push! (svs, sv)
0 commit comments