Skip to content

Commit 93387c2

Browse files
fix: fix parameter object aliasing after remake
1 parent b49628d commit 93387c2

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

src/systems/nonlinear/initializesystem.jl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -512,9 +512,10 @@ end
512512

513513
function SciMLBase.late_binding_update_u0_p(
514514
prob, sys::AbstractSystem, u0, p, t0, newu0, newp)
515-
u0 === missing && return newu0, newp
516-
eltype(u0) <: Pair || return newu0, newp
515+
u0 === missing && return newu0, (p === missing ? copy(newp) : newp)
516+
eltype(u0) <: Pair || return newu0, (p === missing ? copy(newp) : newp)
517517

518+
newp = p === missing ? copy(newp) : newp
518519
newu0 = DiffEqBase.promote_u0(newu0, newp, t0)
519520
tunables, repack, alias = SciMLStructures.canonicalize(SciMLStructures.Tunable(), newp)
520521
tunables = DiffEqBase.promote_u0(tunables, newu0, t0)

test/initializationsystem.jl

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1370,3 +1370,21 @@ end
13701370
@test_nowarn remake(prob, p = [p => 1.0])
13711371
@test_nowarn remake(prob, p = [p => ForwardDiff.Dual(1.0)])
13721372
end
1373+
1374+
@testset "`late_binding_update_u0_p` copies `newp`" begin
1375+
@parameters k1 k2
1376+
@variables X1(t) X2(t)
1377+
@parameters Γ[1:1]=missing [guess = [1.0]]
1378+
eqs = [
1379+
D(X1) ~ k1 * (Γ[1] - X1) - k2 * X1
1380+
]
1381+
obs = [X2 ~ Γ[1] - X1]
1382+
@mtkbuild osys = ODESystem(eqs, t, [X1, X2], [k1, k2, Γ]; observed = obs)
1383+
u0 = [X1 => 1.0, X2 => 2.0]
1384+
ps = [k1 => 0.1, k2 => 0.2]
1385+
1386+
oprob1 = ODEProblem(osys, u0, 1.0, ps)
1387+
oprob2 = remake(oprob1, u0 = [X1 => 10.0])
1388+
integ1 = init(oprob1)
1389+
@test integ1[X1] 1.0
1390+
end

0 commit comments

Comments
 (0)