@@ -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,36 @@ 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+ @show g_gen[2 ]
578+ g_oop, g_iip = (drop_expr (@RuntimeGeneratedFunction (ex)) for ex in g_gen)
579+ f (u, h, p, t) = f_oop (u, h, p, t)
580+ f (du, u, h, p, t) = f_iip (du, u, h, p, t)
581+ g (u, h, p, t) = g_oop (u, h, p, t)
582+ g (du, u, h, p, t) = g_iip (du, u, h, p, t)
583+
584+ SDDEFunction {iip} (f, g,
585+ sys = sys,
586+ syms = Symbol .(dvs),
587+ indepsym = Symbol (get_iv (sys)),
588+ paramsyms = Symbol .(ps))
589+ end
590+
561591"""
562592```julia
563593ODEFunctionExpr{iip}(sys::AbstractODESystem, dvs = states(sys),
@@ -941,6 +971,72 @@ function DiffEqBase.DDEProblem{iip}(sys::AbstractODESystem, u0map = [],
941971 DDEProblem {iip} (f, u0, h, tspan, p; kwargs1... , kwargs... )
942972end
943973
974+ function DiffEqBase. SDDEProblem (sys:: AbstractODESystem , args... ; kwargs... )
975+ SDDEProblem {true} (sys, args... ; kwargs... )
976+ end
977+ function DiffEqBase. SDDEProblem {iip} (sys:: AbstractODESystem , u0map = [],
978+ tspan = get_tspan (sys),
979+ parammap = DiffEqBase. NullParameters ();
980+ callback = nothing ,
981+ check_length = true ,
982+ sparsenoise = nothing ,
983+ kwargs... ) where {iip}
984+ has_difference = any (isdifferenceeq, equations (sys))
985+ f, u0, p = process_DEProblem (SDDEFunction{iip}, sys, u0map, parammap;
986+ t = tspan != = nothing ? tspan[1 ] : tspan,
987+ has_difference = has_difference,
988+ symbolic_u0 = true ,
989+ check_length, kwargs... )
990+ h_oop, h_iip = generate_history (sys, u0)
991+ h (out, p, t) = h_iip (out, p, t)
992+ h (p, t) = h_oop (p, t)
993+ u0 = h (p, tspan[1 ])
994+ cbs = process_events (sys; callback, has_difference, kwargs... )
995+ if has_discrete_subsystems (sys) && (dss = get_discrete_subsystems (sys)) != = nothing
996+ affects, clocks, svs = ModelingToolkit. generate_discrete_affect (dss... )
997+ discrete_cbs = map (affects, clocks, svs) do affect, clock, sv
998+ if clock isa Clock
999+ PeriodicCallback (DiscreteSaveAffect (affect, sv), clock. dt)
1000+ else
1001+ error (" $clock is not a supported clock type." )
1002+ end
1003+ end
1004+ if cbs === nothing
1005+ if length (discrete_cbs) == 1
1006+ cbs = only (discrete_cbs)
1007+ else
1008+ cbs = CallbackSet (discrete_cbs... )
1009+ end
1010+ else
1011+ cbs = CallbackSet (cbs, discrete_cbs)
1012+ end
1013+ else
1014+ svs = nothing
1015+ end
1016+ kwargs = filter_kwargs (kwargs)
1017+
1018+ kwargs1 = (;)
1019+ if cbs != = nothing
1020+ kwargs1 = merge (kwargs1, (callback = cbs,))
1021+ end
1022+ if svs != = nothing
1023+ kwargs1 = merge (kwargs1, (disc_saved_values = svs,))
1024+ end
1025+
1026+ noiseeqs = get_noiseeqs (sys)
1027+ sparsenoise === nothing && (sparsenoise = get (kwargs, :sparse , false ))
1028+ if noiseeqs isa AbstractVector
1029+ noise_rate_prototype = nothing
1030+ elseif sparsenoise
1031+ I, J, V = findnz (SparseArrays. sparse (noiseeqs))
1032+ noise_rate_prototype = SparseArrays. sparse (I, J, zero (eltype (u0)))
1033+ else
1034+ noise_rate_prototype = zeros (eltype (u0), size (noiseeqs))
1035+ end
1036+ SDDEProblem {iip} (f, f. g, u0, h, tspan, p; noise_rate_prototype =
1037+ noise_rate_prototype, kwargs1... , kwargs... )
1038+ end
1039+
9441040"""
9451041```julia
9461042ODEProblemExpr{iip}(sys::AbstractODESystem, u0map, tspan,
0 commit comments