@@ -411,6 +411,9 @@ function build_explicit_observed_function(sys, ts;
411
411
ts = [ts]
412
412
end
413
413
ts = unwrap .(ts)
414
+ if is_dde (sys)
415
+ ts = map (x -> delay_to_function (sys, x), ts)
416
+ end
414
417
415
418
vars = Set ()
416
419
foreach (v -> vars! (vars, v; op), ts)
@@ -483,8 +486,12 @@ function build_explicit_observed_function(sys, ts;
483
486
end
484
487
ts = map (t -> substitute (t, subs), ts)
485
488
obsexprs = []
489
+
486
490
for i in 1 : maxidx
487
491
eq = obs[i]
492
+ if is_dde (sys)
493
+ eq = delay_to_function (sys, eq)
494
+ end
488
495
lhs = eq. lhs
489
496
rhs = eq. rhs
490
497
push! (obsexprs, lhs ← rhs)
@@ -505,12 +512,17 @@ function build_explicit_observed_function(sys, ts;
505
512
ps = (DestructuredArgs (unwrap .(ps), inbounds = ! checkbounds),)
506
513
end
507
514
dvs = DestructuredArgs (unknowns (sys), inbounds = ! checkbounds)
515
+ if is_dde (sys)
516
+ dvs = (dvs, DDE_HISTORY_FUN)
517
+ else
518
+ dvs = (dvs,)
519
+ end
508
520
if inputs === nothing
509
- args = param_only ? [ps... , ivs... ] : [dvs, ps... , ivs... ]
521
+ args = param_only ? [ps... , ivs... ] : [dvs... , ps... , ivs... ]
510
522
else
511
523
inputs = unwrap .(inputs)
512
524
ipts = DestructuredArgs (inputs, inbounds = ! checkbounds)
513
- args = param_only ? [ipts, ps... , ivs... ] : [dvs, ipts, ps... , ivs... ]
525
+ args = param_only ? [ipts, ps... , ivs... ] : [dvs... , ipts, ps... , ivs... ]
514
526
end
515
527
pre = get_postprocess_fbody (sys)
516
528
@@ -546,6 +558,20 @@ function build_explicit_observed_function(sys, ts;
546
558
end
547
559
end
548
560
561
+ function populate_delays (delays:: Set , obsexprs, histfn, sys, sym)
562
+ _vars_util = vars (sym)
563
+ for v in _vars_util
564
+ v in delays && continue
565
+ iscall (v) && issym (operation (v)) && (args = arguments (v); length (args) == 1 ) &&
566
+ iscall (only (args)) || continue
567
+
568
+ idx = variable_index (sys, operation (v)(get_iv (sys)))
569
+ idx === nothing && error (" Delay term $v is not an unknown in the system" )
570
+ push! (delays, v)
571
+ push! (obsexprs, v ← histfn (only (args))[idx])
572
+ end
573
+ end
574
+
549
575
function _eq_unordered (a, b)
550
576
length (a) === length (b) || return false
551
577
n = length (a)
0 commit comments