@@ -169,15 +169,54 @@ function is_parameter_solvable(p, pmap, defs, guesses)
169169 # either (missing is a default or was passed to the ODEProblem) or (nothing was passed to
170170 # the ODEProblem and it has a default and a guess)
171171 return ((_val1 === missing || _val2 === missing ) ||
172- (_val1 === nothing && _val2 != = nothing )) && _val3 != = nothing
172+ (_val1 === nothing && _val2 != = nothing )) && _val3 != = nothing
173173end
174174
175175function SciMLBase. remake_initializeprob (sys:: ODESystem , odefn, u0, t0, p)
176- if (u0 === missing || ! (eltype (u0) <: Pair ) || isempty (u0)) &&
177- (p === missing || ! (eltype (p) <: Pair ) || isempty (p))
176+ if u0 === missing && p === missing
178177 return odefn. initializeprob, odefn. update_initializeprob!, odefn. initializeprobmap,
179178 odefn. initializeprobpmap
180179 end
180+ if ! (eltype (u0) <: Pair ) && ! (eltype (p) <: Pair )
181+ oldinitprob = odefn. initializeprob
182+ if oldinitprob === nothing || ! SciMLBase. has_sys (oldinitprob. f) ||
183+ ! (oldinitprob. f. sys isa NonlinearSystem)
184+ return oldinitprob, odefn. update_initializeprob!, odefn. initializeprobmap,
185+ odefn. initializeprobpmap
186+ end
187+ pidxs = ParameterIndex[]
188+ pvals = []
189+ u0idxs = Int[]
190+ u0vals = []
191+ for sym in variable_symbols (oldinitprob)
192+ if is_variable (sys, sym)
193+ u0 != = missing || continue
194+ idx = variable_index (oldinitprob, sym)
195+ push! (u0idxs, idx)
196+ push! (u0vals, eltype (u0)(state_values (oldinitprob, idx)))
197+ else
198+ p != = missing || continue
199+ idx = variable_index (oldinitprob, sym)
200+ push! (u0idxs, idx)
201+ push! (u0vals, typeof (getp (sys, sym)(p))(state_values (oldinitprob, idx)))
202+ end
203+ end
204+ if p != = missing
205+ for sym in parameter_symbols (oldinitprob)
206+ push! (pidxs, parameter_index (oldinitprob, sym))
207+ if isequal (sym, get_iv (sys))
208+ push! (pvals, t0)
209+ else
210+ push! (pvals, getp (sys, sym)(p))
211+ end
212+ end
213+ end
214+ newu0 = remake_buffer (oldinitprob. f. sys, state_values (oldinitprob), u0idxs, u0vals)
215+ newp = remake_buffer (oldinitprob. f. sys, parameter_values (oldinitprob), pidxs, pvals)
216+ initprob = remake (oldinitprob; u0 = newu0, p = newp)
217+ return initprob, odefn. update_initializeprob!, odefn. initializeprobmap,
218+ odefn. initializeprobpmap
219+ end
181220 if u0 === missing || isempty (u0)
182221 u0 = Dict ()
183222 elseif ! (eltype (u0) <: Pair )
0 commit comments