Skip to content

Commit a1d8d9d

Browse files
feat: add proper remake for NonlinearFunction, NonlinearLeastSquaresFunction
1 parent 015879e commit a1d8d9d

File tree

1 file changed

+76
-13
lines changed

1 file changed

+76
-13
lines changed

src/remake.jl

Lines changed: 76 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -675,23 +675,63 @@ function remake(prob::NonlinearProblem;
675675
kwargs = missing,
676676
interpret_symbolicmap = true,
677677
use_defaults = false,
678+
lazy_initialization = nothing,
679+
build_initializeprob = true,
678680
_kwargs...)
679-
u0, p = updated_u0_p(prob, u0, p; interpret_symbolicmap, use_defaults)
680-
if f === missing
681-
f = prob.f
681+
newu0, newp = updated_u0_p(prob, u0, p; interpret_symbolicmap, use_defaults)
682+
683+
if build_initializeprob
684+
initialization_data = remake_initialization_data(
685+
prob.f.sys, prob.f, u0, nothing, p, newu0, newp)
686+
else
687+
initialization_data = nothing
682688
end
689+
690+
f = remake(prob.f; f, initialization_data)
691+
683692
if problem_type === missing
684693
problem_type = prob.problem_type
685694
end
686695

687-
if kwargs === missing
688-
NonlinearProblem{isinplace(prob)}(f = f, u0 = u0, p = p,
696+
prob = if kwargs === missing
697+
NonlinearProblem{isinplace(prob)}(f = f, u0 = newu0, p = newp,
689698
problem_type = problem_type; prob.kwargs...,
690699
_kwargs...)
691700
else
692-
NonlinearProblem{isinplace(prob)}(f = f, u0 = u0, p = p,
701+
NonlinearProblem{isinplace(prob)}(f = f, u0 = newu0, p = newp,
693702
problem_type = problem_type; kwargs...)
694703
end
704+
705+
if lazy_initialization === nothing
706+
lazy_initialization = !is_trivial_initialization(initialization_data)
707+
end
708+
if !lazy_initialization
709+
u0, p, _ = get_initial_values(
710+
prob, prob, prob.f, OverrideInit(), Val(isinplace(prob)))
711+
if u0 !== nothing && eltype(u0) == Any && isempty(u0)
712+
u0 = nothing
713+
end
714+
@reset prob.u0 = u0
715+
@reset prob.p = p
716+
end
717+
718+
return prob
719+
end
720+
721+
function remake(func::NonlinearFunction;
722+
f = missing,
723+
kwargs...)
724+
props = getproperties(func)
725+
props = @delete props.f
726+
727+
if f === missing
728+
f = func.f
729+
end
730+
if f isa AbstractSciMLFunction
731+
f = f.f
732+
end
733+
734+
return NonlinearFunction(f; props..., kwargs...)
695735
end
696736

697737
"""
@@ -701,19 +741,42 @@ end
701741
Remake the given `NonlinearLeastSquaresProblem`.
702742
"""
703743
function remake(prob::NonlinearLeastSquaresProblem; f = missing, u0 = missing, p = missing,
704-
interpret_symbolicmap = true, use_defaults = false, kwargs = missing, _kwargs...)
705-
u0, p = updated_u0_p(prob, u0, p; interpret_symbolicmap, use_defaults)
744+
interpret_symbolicmap = true, use_defaults = false, kwargs = missing,
745+
lazy_initialization = nothing, build_initializeprob = true, _kwargs...)
746+
newu0, newp = updated_u0_p(prob, u0, p; interpret_symbolicmap, use_defaults)
706747

707-
if f === missing
708-
f = prob.f
748+
if build_initializeprob
749+
initialization_data = remake_initialization_data(
750+
prob.f.sys, prob.f, u0, nothing, p, newu0, newp)
751+
else
752+
initialization_data = nothing
709753
end
710754

711-
if kwargs === missing
712-
return NonlinearLeastSquaresProblem{isinplace(prob)}(; f, u0, p, prob.kwargs...,
755+
f = remake(prob.f; f, initialization_data)
756+
757+
prob = if kwargs === missing
758+
return NonlinearLeastSquaresProblem{isinplace(prob)}(;
759+
f, u0 = newu0, p = newp, prob.kwargs...,
713760
_kwargs...)
714761
else
715-
return NonlinearLeastSquaresProblem{isinplace(prob)}(; f, u0, p, kwargs...)
762+
return NonlinearLeastSquaresProblem{isinplace(prob)}(;
763+
f, u0 = newu0, p = newp, kwargs...)
764+
end
765+
766+
if lazy_initialization === nothing
767+
lazy_initialization = !is_trivial_initialization(initialization_data)
768+
end
769+
if !lazy_initialization
770+
u0, p, _ = get_initial_values(
771+
prob, prob, prob.f, OverrideInit(), Val(isinplace(prob)))
772+
if u0 !== nothing && eltype(u0) == Any && isempty(u0)
773+
u0 = nothing
774+
end
775+
@reset prob.u0 = u0
776+
@reset prob.p = p
716777
end
778+
779+
return prob
717780
end
718781

719782
"""

0 commit comments

Comments
 (0)