@@ -169,14 +169,14 @@ function isdelay(var, iv)
169
169
return false
170
170
end
171
171
const DDE_HISTORY_FUN = Sym {Symbolics.FnType{Tuple{Any, <:Real}, Vector{Real}}} (:___history___ )
172
- function delay_to_function (sys:: AbstractODESystem )
173
- delay_to_function (full_equations (sys) ,
172
+ function delay_to_function (sys:: AbstractODESystem , eqs = full_equations (sys) )
173
+ delay_to_function (eqs ,
174
174
get_iv (sys),
175
175
Dict {Any, Int} (operation (s) => i for (i, s) in enumerate (states (sys))),
176
176
parameters (sys),
177
177
DDE_HISTORY_FUN)
178
178
end
179
- function delay_to_function (eqs:: Vector{<:Equation} , iv, sts, ps, h)
179
+ function delay_to_function (eqs:: Vector , iv, sts, ps, h)
180
180
delay_to_function .(eqs, (iv,), (sts,), (ps,), (h,))
181
181
end
182
182
function delay_to_function (eq:: Equation , iv, sts, ps, h)
@@ -548,8 +548,8 @@ function DiffEqBase.DDEFunction{iip}(sys::AbstractODESystem, dvs = states(sys),
548
548
expression_module = eval_module, checkbounds = checkbounds,
549
549
kwargs... )
550
550
f_oop, f_iip = (drop_expr (@RuntimeGeneratedFunction (eval_module, ex)) for ex in f_gen)
551
- f (u, p, h , t) = f_oop (u, p, h , t)
552
- f (du, u, p, h , t) = f_iip (du, u, p, h , t)
551
+ f (u, h, p , t) = f_oop (u, h, p , t)
552
+ f (du, u, h, p , t) = f_iip (du, u, h, p , t)
553
553
554
554
DDEFunction {iip} (f,
555
555
sys = sys,
@@ -558,6 +558,35 @@ function DiffEqBase.DDEFunction{iip}(sys::AbstractODESystem, dvs = states(sys),
558
558
paramsyms = Symbol .(ps))
559
559
end
560
560
561
+ function DiffEqBase. SDDEFunction (sys:: AbstractODESystem , args... ; kwargs... )
562
+ SDDEFunction {true} (sys, args... ; kwargs... )
563
+ end
564
+
565
+ function DiffEqBase. SDDEFunction {iip} (sys:: AbstractODESystem , dvs = states (sys),
566
+ ps = parameters (sys), u0 = nothing ;
567
+ eval_module = @__MODULE__ ,
568
+ checkbounds = false ,
569
+ kwargs... ) where {iip}
570
+ f_gen = generate_function (sys, dvs, ps; isdde = true ,
571
+ expression = Val{true },
572
+ expression_module = eval_module, checkbounds = checkbounds,
573
+ kwargs... )
574
+ f_oop, f_iip = (drop_expr (@RuntimeGeneratedFunction (eval_module, ex)) for ex in f_gen)
575
+ g_gen = generate_diffusion_function (sys, dvs, ps; expression = Val{true },
576
+ isdde = true , kwargs... )
577
+ g_oop, g_iip = (drop_expr (@RuntimeGeneratedFunction (ex)) for ex in g_gen)
578
+ f (u, h, p, t) = f_oop (u, h, p, t)
579
+ f (du, u, h, p, t) = f_iip (du, u, h, p, t)
580
+ g (u, h, p, t) = g_oop (u, h, p, t)
581
+ g (du, u, h, p, t) = g_iip (du, u, h, p, t)
582
+
583
+ SDDEFunction {iip} (f, g,
584
+ sys = sys,
585
+ syms = Symbol .(dvs),
586
+ indepsym = Symbol (get_iv (sys)),
587
+ paramsyms = Symbol .(ps))
588
+ end
589
+
561
590
"""
562
591
```julia
563
592
ODEFunctionExpr{iip}(sys::AbstractODESystem, dvs = states(sys),
@@ -941,6 +970,72 @@ function DiffEqBase.DDEProblem{iip}(sys::AbstractODESystem, u0map = [],
941
970
DDEProblem {iip} (f, u0, h, tspan, p; kwargs1... , kwargs... )
942
971
end
943
972
973
+ function DiffEqBase. SDDEProblem (sys:: AbstractODESystem , args... ; kwargs... )
974
+ SDDEProblem {true} (sys, args... ; kwargs... )
975
+ end
976
+ function DiffEqBase. SDDEProblem {iip} (sys:: AbstractODESystem , u0map = [],
977
+ tspan = get_tspan (sys),
978
+ parammap = DiffEqBase. NullParameters ();
979
+ callback = nothing ,
980
+ check_length = true ,
981
+ sparsenoise = nothing ,
982
+ kwargs... ) where {iip}
983
+ has_difference = any (isdifferenceeq, equations (sys))
984
+ f, u0, p = process_DEProblem (SDDEFunction{iip}, sys, u0map, parammap;
985
+ t = tspan != = nothing ? tspan[1 ] : tspan,
986
+ has_difference = has_difference,
987
+ symbolic_u0 = true ,
988
+ check_length, kwargs... )
989
+ h_oop, h_iip = generate_history (sys, u0)
990
+ h (out, p, t) = h_iip (out, p, t)
991
+ h (p, t) = h_oop (p, t)
992
+ u0 = h (p, tspan[1 ])
993
+ cbs = process_events (sys; callback, has_difference, kwargs... )
994
+ if has_discrete_subsystems (sys) && (dss = get_discrete_subsystems (sys)) != = nothing
995
+ affects, clocks, svs = ModelingToolkit. generate_discrete_affect (dss... )
996
+ discrete_cbs = map (affects, clocks, svs) do affect, clock, sv
997
+ if clock isa Clock
998
+ PeriodicCallback (DiscreteSaveAffect (affect, sv), clock. dt)
999
+ else
1000
+ error (" $clock is not a supported clock type." )
1001
+ end
1002
+ end
1003
+ if cbs === nothing
1004
+ if length (discrete_cbs) == 1
1005
+ cbs = only (discrete_cbs)
1006
+ else
1007
+ cbs = CallbackSet (discrete_cbs... )
1008
+ end
1009
+ else
1010
+ cbs = CallbackSet (cbs, discrete_cbs)
1011
+ end
1012
+ else
1013
+ svs = nothing
1014
+ end
1015
+ kwargs = filter_kwargs (kwargs)
1016
+
1017
+ kwargs1 = (;)
1018
+ if cbs != = nothing
1019
+ kwargs1 = merge (kwargs1, (callback = cbs,))
1020
+ end
1021
+ if svs != = nothing
1022
+ kwargs1 = merge (kwargs1, (disc_saved_values = svs,))
1023
+ end
1024
+
1025
+ noiseeqs = get_noiseeqs (sys)
1026
+ sparsenoise === nothing && (sparsenoise = get (kwargs, :sparse , false ))
1027
+ if noiseeqs isa AbstractVector
1028
+ noise_rate_prototype = nothing
1029
+ elseif sparsenoise
1030
+ I, J, V = findnz (SparseArrays. sparse (noiseeqs))
1031
+ noise_rate_prototype = SparseArrays. sparse (I, J, zero (eltype (u0)))
1032
+ else
1033
+ noise_rate_prototype = zeros (eltype (u0), size (noiseeqs))
1034
+ end
1035
+ SDDEProblem {iip} (f, f. g, u0, h, tspan, p; noise_rate_prototype =
1036
+ noise_rate_prototype, kwargs1... , kwargs... )
1037
+ end
1038
+
944
1039
"""
945
1040
```julia
946
1041
ODEProblemExpr{iip}(sys::AbstractODESystem, u0map, tspan,
0 commit comments