Skip to content

Commit 7a34f91

Browse files
Merge pull request #923 from AayushSabharwal/as/hc-remake
fix: fix `remake(::HomotopyNonlinearFunction)`
2 parents a454760 + ac6eabb commit 7a34f91

File tree

3 files changed

+34
-11
lines changed

3 files changed

+34
-11
lines changed

src/remake.jl

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -177,17 +177,19 @@ function remake(
177177
if !(f isa Union{AbstractSciMLOperator, split_function_f_wrapper(T)})
178178
f = split_function_f_wrapper(T){iip, spec}(f)
179179
end
180-
# For SplitFunction
181-
# we don't do the same thing as `g`, because for SDEs `g` is
182-
# stored in the problem as well, whereas for Split ODEs etc
183-
# f2 is a part of the function. Thus, if the user provides
184-
# a SciMLFunction for `f` which contains `f2` we use that.
185-
f2 = coalesce(f2, get(props, :f2, missing), func.f2)
186-
if !(f2 isa Union{AbstractSciMLOperator, split_function_f_wrapper(T)})
187-
f2 = split_function_f_wrapper(T){iip, spec}(f2)
180+
if hasproperty(func, :f2)
181+
# For SplitFunction
182+
# we don't do the same thing as `g`, because for SDEs `g` is
183+
# stored in the problem as well, whereas for Split ODEs etc
184+
# f2 is a part of the function. Thus, if the user provides
185+
# a SciMLFunction for `f` which contains `f2` we use that.
186+
f2 = coalesce(f2, get(props, :f2, missing), func.f2)
187+
if !(f2 isa Union{AbstractSciMLOperator, split_function_f_wrapper(T)})
188+
f2 = split_function_f_wrapper(T){iip, spec}(f2)
189+
end
190+
props = @delete props.f2
191+
args = (args..., f2)
188192
end
189-
props = @delete props.f2
190-
args = (args..., f2)
191193
end
192194
if isdefined(func, :g)
193195
# For SDEs/SDDEs where `g` is not a keyword

src/scimlfunctions.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4757,7 +4757,7 @@ is_split_function(x) = is_split_function(typeof(x))
47574757
is_split_function(::Type) = false
47584758
function is_split_function(::Type{T}) where {T <: Union{
47594759
SplitFunction, SplitSDEFunction, DynamicalODEFunction,
4760-
DynamicalDDEFunction, DynamicalSDEFunction}}
4760+
DynamicalDDEFunction, DynamicalSDEFunction, HomotopyNonlinearFunction}}
47614761
true
47624762
end
47634763

@@ -4766,6 +4766,7 @@ split_function_f_wrapper(::Type{<:SplitSDEFunction}) = SDEFunction
47664766
split_function_f_wrapper(::Type{<:DynamicalODEFunction}) = ODEFunction
47674767
split_function_f_wrapper(::Type{<:DynamicalDDEFunction}) = DDEFunction
47684768
split_function_f_wrapper(::Type{<:DynamicalSDEFunction}) = DDEFunction
4769+
split_function_f_wrapper(::Type{<:HomotopyNonlinearFunction}) = NonlinearFunction
47694770

47704771
######### Additional traits
47714772

test/remake_tests.jl

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,3 +384,23 @@ end
384384
prob2 = remake(prob; f = fn2)
385385
@test prob2.f.resid_prototype isa Vector{Float32}
386386
end
387+
388+
@testset "`remake(::HomotopyNonlinearFunction)`" begin
389+
f! = function (du, u, p)
390+
du[1] = u[1] * u[1] - p[1] * u[2] + u[2]^3 + 1
391+
du[2] = u[2]^3 + 2 * p[2] * u[1] * u[2] + u[2]
392+
end
393+
394+
fjac! = function (j, u, p)
395+
j[1, 1] = 2u[1]
396+
j[1, 2] = -p[1] + 3 * u[2]^2
397+
j[2, 1] = 2 * p[2] * u[2]
398+
j[2, 2] = 3 * u[2]^2 + 2 * p[2] * u[1] + 1
399+
end
400+
fn = NonlinearFunction(f!; jac = fjac!)
401+
fn = HomotopyNonlinearFunction(fn)
402+
prob = NonlinearProblem(fn, ones(2), ones(2))
403+
@test prob.f.f.jac == fjac!
404+
prob2 = remake(prob; u0 = zeros(2))
405+
@test prob2.f.f.jac == fjac!
406+
end

0 commit comments

Comments
 (0)