Skip to content

Commit 63cbc97

Browse files
Merge pull request SciML#731 from AayushSabharwal/as/remake-initprob
feat: add `remake_initializeprob`
2 parents 7dbe928 + e70c912 commit 63cbc97

File tree

1 file changed

+27
-9
lines changed

1 file changed

+27
-9
lines changed

src/remake.jl

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -97,49 +97,67 @@ function remake(prob::ODEProblem; f = missing,
9797
tspan = prob.tspan
9898
end
9999

100-
u0, p = updated_u0_p(prob, u0, p; interpret_symbolicmap, use_defaults)
100+
newu0, newp = updated_u0_p(prob, u0, p; interpret_symbolicmap, use_defaults)
101101

102102
iip = isinplace(prob)
103103

104104
if f === missing
105+
initializeprob, initializeprobmap = remake_initializeprob(prob.f.sys, prob.f, u0 === missing ? newu0 : u0, tspan[1], p === missing ? newp : p)
105106
if specialization(prob.f) === FunctionWrapperSpecialize
106107
ptspan = promote_tspan(tspan)
107108
if iip
108109
_f = ODEFunction{iip, FunctionWrapperSpecialize}(wrapfun_iip(
109110
unwrapped_f(prob.f.f),
110-
(u0, u0, p,
111-
ptspan[1])))
111+
(newu0, newu0, newp,
112+
ptspan[1])); initializeprob, initializeprobmap)
112113
else
113114
_f = ODEFunction{iip, FunctionWrapperSpecialize}(wrapfun_oop(
114115
unwrapped_f(prob.f.f),
115-
(u0, p,
116-
ptspan[1])))
116+
(newu0, newp,
117+
ptspan[1])); initializeprob, initializeprobmap)
117118
end
118119
else
119120
_f = prob.f
121+
@reset _f.initializeprob = initializeprob
122+
@reset _f.initializeprobmap = initializeprobmap
120123
end
121124
elseif f isa AbstractODEFunction
122125
_f = f
123126
elseif specialization(prob.f) === FunctionWrapperSpecialize
124127
ptspan = promote_tspan(tspan)
125128
if iip
126129
_f = ODEFunction{iip, FunctionWrapperSpecialize}(wrapfun_iip(f,
127-
(u0, u0, p,
130+
(newu0, newu0, newp,
128131
ptspan[1])))
129132
else
130133
_f = ODEFunction{iip, FunctionWrapperSpecialize}(wrapfun_oop(f,
131-
(u0, p, ptspan[1])))
134+
(newu0, newp, ptspan[1])))
132135
end
133136
else
134137
_f = ODEFunction{isinplace(prob), specialization(prob.f)}(f)
135138
end
136139

137140
if kwargs === missing
138-
ODEProblem{isinplace(prob)}(_f, u0, tspan, p, prob.problem_type; prob.kwargs...,
141+
ODEProblem{isinplace(prob)}(_f, newu0, tspan, newp, prob.problem_type; prob.kwargs...,
139142
_kwargs...)
140143
else
141-
ODEProblem{isinplace(prob)}(_f, u0, tspan, p, prob.problem_type; kwargs...)
144+
ODEProblem{isinplace(prob)}(_f, newu0, tspan, newp, prob.problem_type; kwargs...)
145+
end
146+
end
147+
148+
"""
149+
remake_initializeprob(sys, scimlfn, u0, t0, p)
150+
151+
Re-create the initialization problem present in the function `scimlfn`, using the
152+
associated system `sys`, and the new values of `u0`, initial time `t0` and `p`. By
153+
default, returns `nothing, nothing` if `scimlfn` does not have an initialization
154+
problem, and `scimlfn.initializeprob, scimlfn.initializeprobmap` if it does.
155+
"""
156+
function remake_initializeprob(sys, scimlfn, u0, t0, p)
157+
if !has_initializeprob(scimlfn)
158+
return nothing, nothing
142159
end
160+
return scimlfn.initializeprob, scimlfn.initializeprobmap
143161
end
144162

145163
"""

0 commit comments

Comments
 (0)