Skip to content

Commit df84eec

Browse files
Merge pull request #906 from AayushSabharwal/as/remake-bug
fix: fix `remake` not able to substitute values
2 parents 234dd64 + 8d0c407 commit df84eec

File tree

2 files changed

+29
-2
lines changed

2 files changed

+29
-2
lines changed

src/remake.jl

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1072,10 +1072,20 @@ function _updated_u0_p_symmap(prob, u0, ::Val{true}, p, ::Val{true}, t0)
10721072
varmap[only(independent_variable_symbols(prob))] = t0
10731073
end
10741074
for (k, v) in u0
1075-
u0[k] = symbolic_type(v) === NotSymbolic() ? v : symbolic_evaluate(v, varmap)
1075+
v = symbolic_type(v) === NotSymbolic() ? v : symbolic_evaluate(v, varmap)
1076+
# if `symbolic_evaluate` can't get us a concrete value,
1077+
# use the old one from `prob`.
1078+
if symbolic_type(v) != NotSymbolic()
1079+
v = getu(prob, k)(prob)
1080+
end
1081+
u0[k] = v
10761082
end
10771083
for (k, v) in p
1078-
p[k] = symbolic_type(v) === NotSymbolic() ? v : symbolic_evaluate(v, varmap)
1084+
v = symbolic_type(v) === NotSymbolic() ? v : symbolic_evaluate(v, varmap)
1085+
if symbolic_type(v) != NotSymbolic()
1086+
v = getu(prob, k)(prob)
1087+
end
1088+
p[k] = v
10791089
end
10801090
return remake_buffer(prob, state_values(prob), keys(u0), values(u0)),
10811091
remake_buffer(prob, parameter_values(prob), keys(p), values(p))

test/downstream/modelingtoolkit_remake.jl

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,3 +380,20 @@ end
380380
@test prob2.ps[p] 3.0
381381
end
382382
end
383+
384+
# https://github.com/SciML/ModelingToolkit.jl/issues/3326
385+
@testset "Remake with non-substitute-able values" begin
386+
@variables x1(t) x2(t) y(t)
387+
@parameters k2 p Gamma y0 d k1
388+
@mtkbuild sys = ODESystem([D(y) ~ p - d * y, D(x1) ~ -k1 * x1 + k2 * (Gamma - x1), x2 ~ Gamma - x1], t; defaults = Dict(y => y0, Gamma => x1 + x2))
389+
u0 = [x1 => 1.0, x2 => 2.0]
390+
p0 = [p => 10.0, d => 5.0, y0 => 3.0, k1 => 1.0, k2 => 2.0]
391+
prob = ODEProblem(sys, u0, (0.0, 1.0), p0)
392+
u0_new = [x1 => 0.1]
393+
ps_new = [y0 => 0.3, p => 100.0]
394+
prob2 = remake(prob; u0 = u0_new, p = ps_new)
395+
@test prob2[x1] 0.1
396+
@test prob2[y] 0.3
397+
# old value retained
398+
@test prob2.ps[Gamma] 3.0
399+
end

0 commit comments

Comments
 (0)