@@ -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
143161end
144162
145163"""
0 commit comments