@@ -481,22 +481,19 @@ function SciMLBase.remake_initialization_data(
481
481
if u0 === missing && p === missing
482
482
return odefn. initialization_data
483
483
end
484
+
485
+ oldinitdata = odefn. initialization_data
486
+
484
487
if ! (eltype (u0) <: Pair ) && ! (eltype (p) <: Pair )
485
- oldinitdata = odefn. initialization_data
486
488
oldinitdata === nothing && return nothing
487
489
488
490
oldinitprob = oldinitdata. initializeprob
489
491
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
500
497
# the history function doesn't matter because `reconstruct_fn` is only going to
501
498
# update the values of parameters, which aren't time dependent. The reason it
502
499
# is called is because `Initial` parameters are calculated from the corresponding
@@ -507,16 +504,15 @@ function SciMLBase.remake_initialization_data(
507
504
if oldinitprob. f. resid_prototype === nothing
508
505
newf = oldinitprob. f
509
506
else
510
- newf = NonlinearFunction{
511
- SciMLBase. isinplace (oldinitprob. f), SciMLBase. specialization (oldinitprob. f)}(
512
- oldinitprob. f;
507
+ newf = remake (oldinitprob. f;
513
508
resid_prototype = calculate_resid_prototype (
514
509
length (oldinitprob. f. resid_prototype), new_initu0, new_initp))
515
510
end
516
511
initprob = remake (oldinitprob; f = newf, u0 = new_initu0, p = new_initp)
517
512
return SciMLBase. OverrideInitData (initprob, oldinitdata. update_initializeprob!,
518
- oldinitdata. initializeprobmap, oldinitdata. initializeprobpmap)
513
+ oldinitdata. initializeprobmap, oldinitdata. initializeprobpmap; metadata = oldinitdata . metadata )
519
514
end
515
+
520
516
dvs = unknowns (sys)
521
517
ps = parameters (sys)
522
518
u0map = to_varmap (u0, dvs)
@@ -530,16 +526,13 @@ function SciMLBase.remake_initialization_data(
530
526
use_scc = true
531
527
initialization_eqs = Equation[]
532
528
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
543
536
else
544
537
# there is no initializeprob, so the original problem construction
545
538
# had no solvable parameters and had the differential variables
@@ -600,19 +593,22 @@ function SciMLBase.late_binding_update_u0_p(
600
593
if ! (eltype (u0) <: Pair )
601
594
# if `p` is not provided or is symbolic
602
595
p === missing || eltype (p) <: Pair || return newu0, newp
603
- newu0 === nothing && return newu0, newp
604
- all (is_parameter (sys, Initial (x)) for x in unknowns (sys)) || return newu0, newp
596
+ (newu0 === nothing || isempty (newu0)) && return newu0, newp
597
+ initdata = prob. f. initialization_data
598
+ initdata === nothing && return newu0, newp
599
+ meta = initdata. metadata
600
+ meta isa InitializationMetadata || return newu0, newp
605
601
newp = p === missing ? copy (newp) : newp
606
602
initials, repack, alias = SciMLStructures. canonicalize (
607
603
SciMLStructures. Initials (), newp)
608
604
if eltype (initials) != eltype (newu0)
609
605
initials = DiffEqBase. promote_u0 (initials, newu0, t0)
610
606
newp = repack (initials)
611
607
end
612
- if length (newu0) != length (unknowns (sys) )
613
- throw (ArgumentError (" Expected `newu0` to be of same length as unknowns ($(length (unknowns (sys) )) ). Got $(typeof (newu0)) of length $(length (newu0)) " ))
608
+ if length (newu0) != length (prob . u0 )
609
+ throw (ArgumentError (" Expected `newu0` to be of same length as unknowns ($(length (prob . u0 )) ). Got $(typeof (newu0)) of length $(length (newu0)) " ))
614
610
end
615
- setp (sys, Initial .( unknowns (sys))) (newp, newu0)
611
+ meta . set_initial_unknowns! (newp, newu0)
616
612
return newu0, newp
617
613
end
618
614
0 commit comments