@@ -192,7 +192,7 @@ function generate_initializesystem(sys::AbstractSystem;
192
192
defs[k] = substitute (defs[k], paramsubs)
193
193
end
194
194
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 )
196
196
return NonlinearSystem (eqs_ics,
197
197
vars,
198
198
pars;
@@ -204,12 +204,29 @@ function generate_initializesystem(sys::AbstractSystem;
204
204
kwargs... )
205
205
end
206
206
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
+
207
223
struct InitializationSystemMetadata
208
224
u0map:: Dict{Any, Any}
209
225
pmap:: Dict{Any, Any}
210
226
additional_guesses:: Dict{Any, Any}
211
227
additional_initialization_eqs:: Vector{Equation}
212
228
extra_metadata:: NamedTuple
229
+ oop_reconstruct_u0_p:: Union{Nothing, ReconstructInitializeprob}
213
230
end
214
231
215
232
function is_parameter_solvable (p, pmap, defs, guesses)
@@ -239,55 +256,24 @@ function SciMLBase.remake_initialization_data(
239
256
if ! SciMLBase. has_sys (oldinitprob. f) || ! (oldinitprob. f. sys isa NonlinearSystem)
240
257
return oldinitdata
241
258
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
277
263
else
278
- newp = remake_buffer (
279
- oldinitprob. f. sys, parameter_values (oldinitprob), pidxs, pvals)
264
+ reconstruct_fn = ReconstructInitializeprob (sys, oldinitsys)
280
265
end
266
+ new_initu0, new_initp = reconstruct_fn (ProblemState (; u = newu0, p = newp, t = t0), oldinitprob)
281
267
if oldinitprob. f. resid_prototype === nothing
282
268
newf = oldinitprob. f
283
269
else
284
270
newf = NonlinearFunction{
285
271
SciMLBase. isinplace (oldinitprob. f), SciMLBase. specialization (oldinitprob. f)}(
286
272
oldinitprob. f;
287
273
resid_prototype = calculate_resid_prototype (
288
- length (oldinitprob. f. resid_prototype), newu0, newp ))
274
+ length (oldinitprob. f. resid_prototype), new_initu0, new_initp ))
289
275
end
290
- initprob = remake (oldinitprob; f = newf, u0 = newu0 , p = newp )
276
+ initprob = remake (oldinitprob; f = newf, u0 = new_initu0 , p = new_initp )
291
277
return SciMLBase. OverrideInitData (initprob, oldinitdata. update_initializeprob!,
292
278
oldinitdata. initializeprobmap, oldinitdata. initializeprobpmap)
293
279
end
0 commit comments