Skip to content

Commit f0e4f7e

Browse files
Merge pull request #1490 from ValentinKaisermayer/patch-concrete_init
Patch concrete init
2 parents a65b4f9 + dfb2d68 commit f0e4f7e

File tree

8 files changed

+33
-12
lines changed

8 files changed

+33
-12
lines changed

src/systems/diffeqs/abstractodesystem.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -563,12 +563,12 @@ function process_DEProblem(constructor, sys::AbstractODESystem,u0map,parammap;
563563
defs = mergedefaults(defs,parammap,ps)
564564
defs = mergedefaults(defs,u0map,dvs)
565565

566-
u0 = varmap_to_vars(u0map,dvs; defaults=defs)
566+
u0 = varmap_to_vars(u0map,dvs; defaults=defs, promotetoconcrete=true)
567567
p = varmap_to_vars(parammap,ps; defaults=defs)
568568
if implicit_dae && du0map !== nothing
569569
ddvs = map(Differential(iv), dvs)
570570
defs = mergedefaults(defs,du0map, ddvs)
571-
du0 = varmap_to_vars(du0map,ddvs; defaults=defs, toterm=identity)
571+
du0 = varmap_to_vars(du0map,ddvs; defaults=defs, toterm=identity, promotetoconcrete=true)
572572
else
573573
du0 = nothing
574574
ddvs = nothing

src/systems/discrete_system/discrete_system.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ function DiffEqBase.DiscreteProblem(sys::DiscreteSystem,u0map,tspan,
180180
defs = mergedefaults(defs,parammap,ps)
181181
defs = mergedefaults(defs,u0map,dvs)
182182

183-
u0 = varmap_to_vars(u0map,dvs; defaults=defs)
183+
u0 = varmap_to_vars(u0map,dvs; defaults=defs, promotetoconcrete=true)
184184
p = varmap_to_vars(parammap,ps; defaults=defs)
185185

186186
rhss = [eq.rhs for eq in eqs]

src/systems/jumps/jumpsystem.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ function DiffEqBase.DiscreteProblem(sys::JumpSystem, u0map, tspan::Union{Tuple,N
228228
defs = mergedefaults(defs,parammap,ps)
229229
defs = mergedefaults(defs,u0map,dvs)
230230

231-
u0 = varmap_to_vars(u0map,dvs; defaults=defs)
231+
u0 = varmap_to_vars(u0map,dvs; defaults=defs, promotetoconcrete=true)
232232
p = varmap_to_vars(parammap,ps; defaults=defs)
233233

234234
f = DiffEqBase.DISCRETE_INPLACE_DEFAULT

src/systems/nonlinear/nonlinearsystem.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ function process_NonlinearProblem(constructor, sys::NonlinearSystem,u0map,paramm
269269
defs = mergedefaults(defs,parammap,ps)
270270
defs = mergedefaults(defs,u0map,dvs)
271271

272-
u0 = varmap_to_vars(u0map,dvs; defaults=defs)
272+
u0 = varmap_to_vars(u0map,dvs; defaults=defs, promotetoconcrete=true)
273273
p = varmap_to_vars(parammap,ps; defaults=defs)
274274

275275
check_eqs_u0(eqs, dvs, u0; kwargs...)

src/systems/optimization/optimizationsystem.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ function OptimizationProblemExpr{iip}(sys::OptimizationSystem, u0,
239239
defs = mergedefaults(defs,parammap,ps)
240240
defs = mergedefaults(defs,u0map,dvs)
241241

242-
u0 = varmap_to_vars(u0map,dvs; defaults=defs)
242+
u0 = varmap_to_vars(u0map,dvs; defaults=defs, promotetoconcrete=true)
243243
p = varmap_to_vars(parammap,ps; defaults=defs)
244244
lb = varmap_to_vars(lb,dvs)
245245
ub = varmap_to_vars(ub,dvs)

src/utils.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,4 +470,17 @@ function mergedefaults(defaults, varmap, vars)
470470
else
471471
defaults
472472
end
473+
end
474+
475+
function promote_to_concrete(vs)
476+
if isempty(vs)
477+
return vs
478+
end
479+
T = eltype(vs)
480+
if Base.isconcretetype(T) # nothing to do
481+
vs
482+
else
483+
C = foldl((t, elem)->promote_type(t, eltype(elem)), vs; init=typeof(first(vs)))
484+
convert.(C, vs)
485+
end
473486
end

src/variables.jl

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ Takes a list of pairs of `variables=>values` and an ordered list of variables
3232
and creates the array of values in the correct order with default values when
3333
applicable.
3434
"""
35-
function varmap_to_vars(varmap, varlist; defaults=Dict(), check=true, toterm=Symbolics.diff2term)
35+
function varmap_to_vars(varmap, varlist; defaults=Dict(), check=true, toterm=Symbolics.diff2term, promotetoconcrete=false)
3636
varlist = map(unwrap, varlist)
3737
# Edge cases where one of the arguments is effectively empty.
3838
is_incomplete_initialization = varmap isa DiffEqBase.NullParameters || varmap === nothing
@@ -51,11 +51,15 @@ function varmap_to_vars(varmap, varlist; defaults=Dict(), check=true, toterm=Sym
5151
# We respect the input type
5252
container_type = T <: Dict ? Array : T
5353

54-
if eltype(varmap) <: Pair # `varmap` is a dict or an array of pairs
54+
vals = if eltype(varmap) <: Pair # `varmap` is a dict or an array of pairs
5555
varmap = todict(varmap)
56-
vals = _varmap_to_vars(varmap, varlist; defaults=defaults, check=check, toterm=toterm)
56+
_varmap_to_vars(varmap, varlist; defaults=defaults, check=check, toterm=toterm)
5757
else # plain array-like initialization
58-
vals = varmap
58+
varmap
59+
end
60+
61+
if promotetoconcrete
62+
vals = promote_to_concrete(vals)
5963
end
6064

6165
if isempty(vals)

test/odesystem.jl

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -631,10 +631,14 @@ let
631631
@test isapprox(sol[x[1]][end], 2, atol=1e-3)
632632

633633
# no initial conditions for D(x[1]) and D(x[2]) provided
634-
@test_throws ArgumentError prob = DAEProblem(sys, Pair[], Pair[], (0, 50))
634+
@test_throws ArgumentError prob = DAEProblem(sys, Pair[], Pair[], (0, 50))
635+
636+
prob = ODEProblem(sys, Pair[x[1] => 0], (0, 50))
637+
sol = solve(prob, Rosenbrock23())
638+
@test isapprox(sol[x[1]][end], 1, atol=1e-3)
635639
end
636640

637-
#issue 1475 (mixed numeric type)
641+
#issue 1475 (mixed numeric type for parameters)
638642
let
639643
@parameters k1 k2
640644
@variables t, A(t)

0 commit comments

Comments
 (0)