@@ -169,14 +169,14 @@ function isdelay(var, iv)
169169 return false
170170end
171171const 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 ,
174174 get_iv (sys),
175175 Dict {Any, Int} (operation (s) => i for (i, s) in enumerate (states (sys))),
176176 parameters (sys),
177177 DDE_HISTORY_FUN)
178178end
179- function delay_to_function (eqs:: Vector{<:Equation} , iv, sts, ps, h)
179+ function delay_to_function (eqs:: Vector , iv, sts, ps, h)
180180 delay_to_function .(eqs, (iv,), (sts,), (ps,), (h,))
181181end
182182function delay_to_function (eq:: Equation , iv, sts, ps, h)
@@ -548,8 +548,8 @@ function DiffEqBase.DDEFunction{iip}(sys::AbstractODESystem, dvs = states(sys),
548548 expression_module = eval_module, checkbounds = checkbounds,
549549 kwargs... )
550550 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)
553553
554554 DDEFunction {iip} (f,
555555 sys = sys,
@@ -558,6 +558,35 @@ function DiffEqBase.DDEFunction{iip}(sys::AbstractODESystem, dvs = states(sys),
558558 paramsyms = Symbol .(ps))
559559end
560560
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+
561590"""
562591```julia
563592ODEFunctionExpr{iip}(sys::AbstractODESystem, dvs = states(sys),
@@ -941,6 +970,72 @@ function DiffEqBase.DDEProblem{iip}(sys::AbstractODESystem, u0map = [],
941970 DDEProblem {iip} (f, u0, h, tspan, p; kwargs1... , kwargs... )
942971end
943972
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+
9441039"""
9451040```julia
9461041ODEProblemExpr{iip}(sys::AbstractODESystem, u0map, tspan,
0 commit comments