@@ -481,22 +481,19 @@ function SciMLBase.remake_initialization_data(
481481 if u0 === missing && p === missing
482482 return odefn. initialization_data
483483 end
484+
485+ oldinitdata = odefn. initialization_data
486+
484487 if ! (eltype (u0) <: Pair ) && ! (eltype (p) <: Pair )
485- oldinitdata = odefn. initialization_data
486488 oldinitdata === nothing && return nothing
487489
488490 oldinitprob = oldinitdata. initializeprob
489491 oldinitprob === nothing && return nothing
490- if ! SciMLBase. has_sys (oldinitprob. f) || ! (oldinitprob. f. sys isa NonlinearSystem)
491- return oldinitdata
492- end
493- oldinitsys = oldinitprob. f. sys
494- meta = get_metadata (oldinitsys)
495- if meta isa InitializationSystemMetadata && meta. oop_reconstruct_u0_p != = nothing
496- reconstruct_fn = meta. oop_reconstruct_u0_p
497- else
498- reconstruct_fn = ReconstructInitializeprob (sys, oldinitsys)
499- end
492+
493+ meta = oldinitdata. metadata
494+ meta isa InitializationMetadata || return oldinitdata
495+
496+ reconstruct_fn = meta. oop_reconstruct_u0_p
500497 # the history function doesn't matter because `reconstruct_fn` is only going to
501498 # update the values of parameters, which aren't time dependent. The reason it
502499 # is called is because `Initial` parameters are calculated from the corresponding
@@ -507,16 +504,15 @@ function SciMLBase.remake_initialization_data(
507504 if oldinitprob. f. resid_prototype === nothing
508505 newf = oldinitprob. f
509506 else
510- newf = NonlinearFunction{
511- SciMLBase. isinplace (oldinitprob. f), SciMLBase. specialization (oldinitprob. f)}(
512- oldinitprob. f;
507+ newf = remake (oldinitprob. f;
513508 resid_prototype = calculate_resid_prototype (
514509 length (oldinitprob. f. resid_prototype), new_initu0, new_initp))
515510 end
516511 initprob = remake (oldinitprob; f = newf, u0 = new_initu0, p = new_initp)
517512 return SciMLBase. OverrideInitData (initprob, oldinitdata. update_initializeprob!,
518- oldinitdata. initializeprobmap, oldinitdata. initializeprobpmap)
513+ oldinitdata. initializeprobmap, oldinitdata. initializeprobpmap; metadata = oldinitdata . metadata )
519514 end
515+
520516 dvs = unknowns (sys)
521517 ps = parameters (sys)
522518 u0map = to_varmap (u0, dvs)
@@ -530,16 +526,13 @@ function SciMLBase.remake_initialization_data(
530526 use_scc = true
531527 initialization_eqs = Equation[]
532528
533- if SciMLBase. has_initializeprob (odefn)
534- oldsys = odefn. initialization_data. initializeprob. f. sys
535- meta = get_metadata (oldsys)
536- if meta isa InitializationSystemMetadata
537- u0map = merge (meta. u0map, u0map)
538- pmap = merge (meta. pmap, pmap)
539- merge! (guesses, meta. additional_guesses)
540- use_scc = get (meta. extra_metadata, :use_scc , true )
541- initialization_eqs = meta. additional_initialization_eqs
542- end
529+ if oldinitdata != = nothing && oldinitdata. metadata isa InitializationMetadata
530+ meta = oldinitdata. metadata
531+ u0map = merge (meta. u0map, u0map)
532+ pmap = merge (meta. pmap, pmap)
533+ merge! (guesses, meta. guesses)
534+ use_scc = meta. use_scc
535+ initialization_eqs = meta. additional_initialization_eqs
543536 else
544537 # there is no initializeprob, so the original problem construction
545538 # had no solvable parameters and had the differential variables
@@ -598,19 +591,22 @@ function SciMLBase.late_binding_update_u0_p(
598591 if ! (eltype (u0) <: Pair )
599592 # if `p` is not provided or is symbolic
600593 p === missing || eltype (p) <: Pair || return newu0, newp
601- newu0 === nothing && return newu0, newp
602- all (is_parameter (sys, Initial (x)) for x in unknowns (sys)) || return newu0, newp
594+ (newu0 === nothing || isempty (newu0)) && return newu0, newp
595+ initdata = prob. f. initialization_data
596+ initdata === nothing && return newu0, newp
597+ meta = initdata. metadata
598+ meta isa InitializationMetadata || return newu0, newp
603599 newp = p === missing ? copy (newp) : newp
604600 initials, repack, alias = SciMLStructures. canonicalize (
605601 SciMLStructures. Initials (), newp)
606602 if eltype (initials) != eltype (newu0)
607603 initials = DiffEqBase. promote_u0 (initials, newu0, t0)
608604 newp = repack (initials)
609605 end
610- if length (newu0) != length (unknowns (sys) )
611- throw (ArgumentError (" Expected `newu0` to be of same length as unknowns ($(length (unknowns (sys) )) ). Got $(typeof (newu0)) of length $(length (newu0)) " ))
606+ if length (newu0) != length (prob . u0 )
607+ throw (ArgumentError (" Expected `newu0` to be of same length as unknowns ($(length (prob . u0 )) ). Got $(typeof (newu0)) of length $(length (newu0)) " ))
612608 end
613- setp (sys, Initial .( unknowns (sys))) (newp, newu0)
609+ meta . set_initial_unknowns! (newp, newu0)
614610 return newu0, newp
615611 end
616612
0 commit comments