@@ -192,7 +192,8 @@ 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,
196+ additional_initialization_eqs, extra_metadata, nothing )
196197 return NonlinearSystem (eqs_ics,
197198 vars,
198199 pars;
@@ -204,12 +205,30 @@ function generate_initializesystem(sys::AbstractSystem;
204205 kwargs... )
205206end
206207
208+ struct ReconstructInitializeprob
209+ getter:: Any
210+ setter:: Any
211+ end
212+
213+ function ReconstructInitializeprob (srcsys:: AbstractSystem , dstsys:: AbstractSystem )
214+ syms = [unknowns (dstsys);
215+ reduce (vcat, reorder_parameters (dstsys, parameters (dstsys)); init = [])]
216+ getter = getu (srcsys, syms)
217+ setter = setsym_oop (dstsys, syms)
218+ return ReconstructInitializeprob (getter, setter)
219+ end
220+
221+ function (rip:: ReconstructInitializeprob )(srcvalp, dstvalp)
222+ rip. setter (dstvalp, rip. getter (srcvalp))
223+ end
224+
207225struct InitializationSystemMetadata
208226 u0map:: Dict{Any, Any}
209227 pmap:: Dict{Any, Any}
210228 additional_guesses:: Dict{Any, Any}
211229 additional_initialization_eqs:: Vector{Equation}
212230 extra_metadata:: NamedTuple
231+ oop_reconstruct_u0_p:: Union{Nothing, ReconstructInitializeprob}
213232end
214233
215234function is_parameter_solvable (p, pmap, defs, guesses)
@@ -239,55 +258,25 @@ function SciMLBase.remake_initialization_data(
239258 if ! SciMLBase. has_sys (oldinitprob. f) || ! (oldinitprob. f. sys isa NonlinearSystem)
240259 return oldinitdata
241260 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)
261+ oldinitsys = oldinitprob. f. sys
262+ meta = get_metadata (oldinitsys)
263+ if meta isa InitializationSystemMetadata && meta. oop_reconstruct_u0_p != = nothing
264+ reconstruct_fn = meta. oop_reconstruct_u0_p
277265 else
278- newp = remake_buffer (
279- oldinitprob. f. sys, parameter_values (oldinitprob), pidxs, pvals)
266+ reconstruct_fn = ReconstructInitializeprob (sys, oldinitsys)
280267 end
268+ new_initu0, new_initp = reconstruct_fn (
269+ ProblemState (; u = newu0, p = newp, t = t0), oldinitprob)
281270 if oldinitprob. f. resid_prototype === nothing
282271 newf = oldinitprob. f
283272 else
284273 newf = NonlinearFunction{
285274 SciMLBase. isinplace (oldinitprob. f), SciMLBase. specialization (oldinitprob. f)}(
286275 oldinitprob. f;
287276 resid_prototype = calculate_resid_prototype (
288- length (oldinitprob. f. resid_prototype), newu0, newp ))
277+ length (oldinitprob. f. resid_prototype), new_initu0, new_initp ))
289278 end
290- initprob = remake (oldinitprob; f = newf, u0 = newu0 , p = newp )
279+ initprob = remake (oldinitprob; f = newf, u0 = new_initu0 , p = new_initp )
291280 return SciMLBase. OverrideInitData (initprob, oldinitdata. update_initializeprob!,
292281 oldinitdata. initializeprobmap, oldinitdata. initializeprobpmap)
293282 end
0 commit comments