651651
652652Take dictionaries with initial conditions and parameters and convert them to numeric arrays `u0` and `p`. Also return the merged dictionary `defs` containing the entire operating point.
653653"""
654- function get_u0_p (sys, u0map, parammap; use_union = false , tofloat = ! use_union)
654+ function get_u0_p (sys,
655+ u0map,
656+ parammap;
657+ use_union = false ,
658+ tofloat = ! use_union,
659+ symbolic_u0 = false )
655660 eqs = equations (sys)
656661 dvs = states (sys)
657662 ps = parameters (sys)
@@ -660,7 +665,11 @@ function get_u0_p(sys, u0map, parammap; use_union = false, tofloat = !use_union)
660665 defs = mergedefaults (defs, parammap, ps)
661666 defs = mergedefaults (defs, u0map, dvs)
662667
663- u0 = varmap_to_vars (u0map, dvs; defaults = defs, tofloat = true )
668+ if symbolic_u0
669+ u0 = varmap_to_vars (u0map, dvs; defaults = defs, tofloat = false , use_union = false )
670+ else
671+ u0 = varmap_to_vars (u0map, dvs; defaults = defs, tofloat = true )
672+ end
664673 p = varmap_to_vars (parammap, ps; defaults = defs, tofloat, use_union)
665674 p = p === nothing ? SciMLBase. NullParameters () : p
666675 u0, p, defs
@@ -676,13 +685,14 @@ function process_DEProblem(constructor, sys::AbstractODESystem, u0map, parammap;
676685 eval_expression = true ,
677686 use_union = false ,
678687 tofloat = ! use_union,
688+ symbolic_u0 = false ,
679689 kwargs... )
680690 eqs = equations (sys)
681691 dvs = states (sys)
682692 ps = parameters (sys)
683693 iv = get_iv (sys)
684694
685- u0, p, defs = get_u0_p (sys, u0map, parammap; tofloat, use_union)
695+ u0, p, defs = get_u0_p (sys, u0map, parammap; tofloat, use_union, symbolic_u0 )
686696
687697 if implicit_dae && du0map != = nothing
688698 ddvs = map (Differential (iv), dvs)
@@ -874,11 +884,14 @@ function DiffEqBase.DAEProblem{iip}(sys::AbstractODESystem, du0map, u0map, tspan
874884 end
875885end
876886
887+ function generate_history (sys:: AbstractODESystem , u0; kwargs... )
888+ build_function (u0, parameters (sys), get_iv (sys); expression = Val{false }, kwargs... )
889+ end
890+
877891function DiffEqBase. DDEProblem (sys:: AbstractODESystem , args... ; kwargs... )
878892 DDEProblem {true} (sys, args... ; kwargs... )
879893end
880894function DiffEqBase. DDEProblem {iip} (sys:: AbstractODESystem , u0map = [],
881- h = (u, p) -> zeros (length (states (sts))),
882895 tspan = get_tspan (sys),
883896 parammap = DiffEqBase. NullParameters ();
884897 callback = nothing ,
@@ -888,7 +901,11 @@ function DiffEqBase.DDEProblem{iip}(sys::AbstractODESystem, u0map = [],
888901 f, u0, p = process_DEProblem (DDEFunction{iip}, sys, u0map, parammap;
889902 t = tspan != = nothing ? tspan[1 ] : tspan,
890903 has_difference = has_difference,
904+ symbolic_u0 = true ,
891905 check_length, kwargs... )
906+ h_oop, h_iip = generate_history (sys, u0)
907+ h = h_oop
908+ u0 = h (p, tspan[1 ])
892909 cbs = process_events (sys; callback, has_difference, kwargs... )
893910 if has_discrete_subsystems (sys) && (dss = get_discrete_subsystems (sys)) != = nothing
894911 affects, clocks, svs = ModelingToolkit. generate_discrete_affect (dss... )
0 commit comments