Skip to content

Commit f09aee5

Browse files
feat: add lazy initialization to remake
1 parent a6a4a1f commit f09aee5

File tree

3 files changed

+31
-1
lines changed

3 files changed

+31
-1
lines changed

src/initialization.jl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,3 +225,15 @@ function get_initial_values(prob, valp, f, alg::OverrideInit,
225225

226226
return u0, p, success
227227
end
228+
229+
function is_trivial_initialization(initdata::OverrideInitData)
230+
state_values(initdata.initializeprob) === nothing
231+
end
232+
233+
function is_trivial_initialization(f::AbstractSciMLFunction)
234+
has_initialization_data(f) && is_trivial_initialization(f.initialization_data)
235+
end
236+
237+
function is_trivial_initialization(prob::AbstractSciMLProblem)
238+
is_trivial_initialization(prob.f)
239+
end

src/remake.jl

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ function remake(prob::ODEProblem; f = missing,
114114
interpret_symbolicmap = true,
115115
build_initializeprob = true,
116116
use_defaults = false,
117+
lazy_initialization = !is_trivial_initialization(prob),
117118
_kwargs...)
118119
if tspan === missing
119120
tspan = prob.tspan
@@ -170,13 +171,21 @@ function remake(prob::ODEProblem; f = missing,
170171
_f = ODEFunction{isinplace(prob), specialization(prob.f)}(f)
171172
end
172173

173-
if kwargs === missing
174+
prob = if kwargs === missing
174175
ODEProblem{isinplace(prob)}(
175176
_f, newu0, tspan, newp, prob.problem_type; prob.kwargs...,
176177
_kwargs...)
177178
else
178179
ODEProblem{isinplace(prob)}(_f, newu0, tspan, newp, prob.problem_type; kwargs...)
179180
end
181+
182+
if !lazy_initialization
183+
u0, p, _ = get_initial_values(prob, prob, prob.f, OverrideInit(), Val(isinplace(prob)))
184+
@reset prob.u0 = u0
185+
@reset prob.p = p
186+
end
187+
188+
return prob
180189
end
181190

182191
"""

test/downstream/modelingtoolkit_remake.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,3 +274,12 @@ end
274274
@test_throws SciMLBase.CyclicDependencyError remake(
275275
prob; u0 = [x => 2y + p, y => q + 3], p = [p => x + y, q => p + 3])
276276
end
277+
278+
@testset "Lazy initialization" begin
279+
@variables x(t) [guess = 1.0] y(t) [guess = 1.0]
280+
@parameters p = missing [guess = 1.0]
281+
@mtkbuild sys = ODESystem([D(x) ~ x, x + y ~ p], t)
282+
prob = ODEProblem(sys, [x => 1.0, y => 1.0], (0.0, 1.0))
283+
prob2 = remake(prob; u0 = [x => 2.0])
284+
@test prob2.ps[p] 3.0
285+
end

0 commit comments

Comments
 (0)