@@ -192,7 +192,7 @@ function generate_initializesystem(sys::AbstractSystem;
192192 defs[k] = substitute (defs[k], paramsubs)
193193 end
194194 meta = InitializationSystemMetadata (
195- anydict (u0map), anydict (pmap), additional_guesses, additional_initialization_eqs, extra_metadata)
195+ anydict (u0map), anydict (pmap), additional_guesses, additional_initialization_eqs, extra_metadata, nothing )
196196 return NonlinearSystem (eqs_ics,
197197 vars,
198198 pars;
@@ -204,12 +204,29 @@ function generate_initializesystem(sys::AbstractSystem;
204204 kwargs... )
205205end
206206
207+ struct ReconstructInitializeprob
208+ getter:: Any
209+ setter:: Any
210+ end
211+
212+ function ReconstructInitializeprob (srcsys:: AbstractSystem , dstsys:: AbstractSystem )
213+ syms = [unknowns (dstsys); reduce (vcat, reorder_parameters (dstsys, parameters (dstsys)); init = [])]
214+ getter = getu (srcsys, syms)
215+ setter = setsym_oop (dstsys, syms)
216+ return ReconstructInitializeprob (getter, setter)
217+ end
218+
219+ function (rip:: ReconstructInitializeprob )(srcvalp, dstvalp)
220+ rip. setter (dstvalp, rip. getter (srcvalp))
221+ end
222+
207223struct InitializationSystemMetadata
208224 u0map:: Dict{Any, Any}
209225 pmap:: Dict{Any, Any}
210226 additional_guesses:: Dict{Any, Any}
211227 additional_initialization_eqs:: Vector{Equation}
212228 extra_metadata:: NamedTuple
229+ oop_reconstruct_u0_p:: Union{Nothing, ReconstructInitializeprob}
213230end
214231
215232function is_parameter_solvable (p, pmap, defs, guesses)
@@ -239,55 +256,24 @@ function SciMLBase.remake_initialization_data(
239256 if ! SciMLBase. has_sys (oldinitprob. f) || ! (oldinitprob. f. sys isa NonlinearSystem)
240257 return oldinitdata
241258 end
242- pidxs = ParameterIndex[]
243- pvals = []
244- u0idxs = Int[]
245- u0vals = []
246- for sym in variable_symbols (oldinitprob)
247- if is_variable (sys, sym) || has_observed_with_lhs (sys, sym)
248- u0 != = missing || continue
249- idx = variable_index (oldinitprob, sym)
250- push! (u0idxs, idx)
251- push! (u0vals, eltype (u0)(state_values (oldinitprob, idx)))
252- else
253- p != = missing || continue
254- idx = variable_index (oldinitprob, sym)
255- push! (u0idxs, idx)
256- push! (u0vals, typeof (getp (sys, sym)(p))(state_values (oldinitprob, idx)))
257- end
258- end
259- if p != = missing
260- for sym in parameter_symbols (oldinitprob)
261- push! (pidxs, parameter_index (oldinitprob, sym))
262- if is_time_dependent (sys) && isequal (sym, get_iv (sys))
263- push! (pvals, t0)
264- else
265- push! (pvals, getp (sys, sym)(p))
266- end
267- end
268- end
269- if isempty (u0idxs)
270- newu0 = state_values (oldinitprob)
271- else
272- newu0 = remake_buffer (
273- oldinitprob. f. sys, state_values (oldinitprob), u0idxs, u0vals)
274- end
275- if isempty (pidxs)
276- newp = parameter_values (oldinitprob)
259+ oldinitsys = oldinitprob. f. sys
260+ meta = get_metadata (oldinitsys)
261+ if meta isa InitializationSystemMetadata && meta. oop_reconstruct_u0_p != = nothing
262+ reconstruct_fn = meta. oop_reconstruct_u0_p
277263 else
278- newp = remake_buffer (
279- oldinitprob. f. sys, parameter_values (oldinitprob), pidxs, pvals)
264+ reconstruct_fn = ReconstructInitializeprob (sys, oldinitsys)
280265 end
266+ new_initu0, new_initp = reconstruct_fn (ProblemState (; u = newu0, p = newp, t = t0), oldinitprob)
281267 if oldinitprob. f. resid_prototype === nothing
282268 newf = oldinitprob. f
283269 else
284270 newf = NonlinearFunction{
285271 SciMLBase. isinplace (oldinitprob. f), SciMLBase. specialization (oldinitprob. f)}(
286272 oldinitprob. f;
287273 resid_prototype = calculate_resid_prototype (
288- length (oldinitprob. f. resid_prototype), newu0, newp ))
274+ length (oldinitprob. f. resid_prototype), new_initu0, new_initp ))
289275 end
290- initprob = remake (oldinitprob; f = newf, u0 = newu0 , p = newp )
276+ initprob = remake (oldinitprob; f = newf, u0 = new_initu0 , p = new_initp )
291277 return SciMLBase. OverrideInitData (initprob, oldinitdata. update_initializeprob!,
292278 oldinitdata. initializeprobmap, oldinitdata. initializeprobpmap)
293279 end
0 commit comments