Skip to content

Commit 651899b

Browse files
feat: add lazy initialization to remake
1 parent a4fd6d8 commit 651899b

File tree

3 files changed

+37
-1
lines changed

3 files changed

+37
-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: 16 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 = nothing,
117118
_kwargs...)
118119
if tspan === missing
119120
tspan = prob.tspan
@@ -123,6 +124,8 @@ function remake(prob::ODEProblem; f = missing,
123124

124125
iip = isinplace(prob)
125126

127+
initialization_data = prob.f.initialization_data
128+
126129
if f === missing
127130
if build_initializeprob
128131
initialization_data = remake_initialization_data_compat_wrapper(
@@ -170,13 +173,25 @@ function remake(prob::ODEProblem; f = missing,
170173
_f = ODEFunction{isinplace(prob), specialization(prob.f)}(f)
171174
end
172175

173-
if kwargs === missing
176+
prob = if kwargs === missing
174177
ODEProblem{isinplace(prob)}(
175178
_f, newu0, tspan, newp, prob.problem_type; prob.kwargs...,
176179
_kwargs...)
177180
else
178181
ODEProblem{isinplace(prob)}(_f, newu0, tspan, newp, prob.problem_type; kwargs...)
179182
end
183+
184+
if lazy_initialization === nothing
185+
lazy_initialization = !is_trivial_initialization(initialization_data)
186+
end
187+
if !lazy_initialization
188+
u0, p, _ = get_initial_values(
189+
prob, prob, prob.f, OverrideInit(), Val(isinplace(prob)))
190+
@reset prob.u0 = u0
191+
@reset prob.p = p
192+
end
193+
194+
return prob
180195
end
181196

182197
"""

test/downstream/modelingtoolkit_remake.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,3 +336,12 @@ end
336336
@test sccprob4.parameter_object !== sccprob4.probs[1].p
337337
@test sccprob4.parameter_object !== sccprob4.probs[2].p
338338
end
339+
340+
@testset "Lazy initialization" begin
341+
@variables x(t) [guess = 1.0] y(t) [guess = 1.0]
342+
@parameters p=missing [guess = 1.0]
343+
@mtkbuild sys = ODESystem([D(x) ~ x, x + y ~ p], t)
344+
prob = ODEProblem(sys, [x => 1.0, y => 1.0], (0.0, 1.0))
345+
prob2 = remake(prob; u0 = [x => 2.0])
346+
@test prob2.ps[p] 3.0
347+
end

0 commit comments

Comments
 (0)