Skip to content

Commit 1ef1217

Browse files
feat: use HomotopyContinuationProblem in NonlinearProblem if possible
1 parent 669bc84 commit 1ef1217

File tree

2 files changed

+21
-3
lines changed

2 files changed

+21
-3
lines changed

src/systems/nonlinear/nonlinearsystem.jl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -496,10 +496,14 @@ end
496496

497497
function DiffEqBase.NonlinearProblem{iip}(sys::NonlinearSystem, u0map,
498498
parammap = DiffEqBase.NullParameters();
499-
check_length = true, kwargs...) where {iip}
499+
check_length = true, use_homotopy_continuation = true, kwargs...) where {iip}
500500
if !iscomplete(sys)
501501
error("A completed `NonlinearSystem` is required. Call `complete` or `structural_simplify` on the system before creating a `NonlinearProblem`")
502502
end
503+
prob = safe_HomotopyContinuationProblem(sys, u0map, parammap; check_length, kwargs...)
504+
if prob isa HomotopyContinuationProblem
505+
return prob
506+
end
503507
f, u0, p = process_SciMLProblem(NonlinearFunction{iip}, sys, u0map, parammap;
504508
check_length, kwargs...)
505509
pt = something(get_metadata(sys), StandardNonlinearProblem())

test/extensions/homotopy_continuation.jl

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ using Test
1313
@test prob === nothing
1414
end
1515

16-
1716
import HomotopyContinuation
1817

1918
@testset "No parameters" begin
@@ -22,12 +21,19 @@ import HomotopyContinuation
2221
0 ~ x^2 + 4x + 4
2322
0 ~ y * z + 4x^2]
2423
@mtkbuild sys = NonlinearSystem(eqs)
25-
prob = HomotopyContinuationProblem(sys, [x => 1.0, y => 1.0, z => 1.0], [])
24+
u0 = [x => 1.0, y => 1.0, z => 1.0]
25+
prob = HomotopyContinuationProblem(sys, u0)
2626
@test prob[x] == prob[y] == prob[z] == 1.0
2727
@test prob[x + y] == 2.0
2828
sol = solve(prob; threading = false)
2929
@test SciMLBase.successful_retcode(sol)
3030
@test norm(sol.resid)0.0 atol=1e-10
31+
32+
prob2 = NonlinearProblem(sys, u0)
33+
@test prob2 isa HomotopyContinuationProblem
34+
sol = solve(prob2; threading = false)
35+
@test SciMLBase.successful_retcode(sol)
36+
@test norm(sol.resid)0.0 atol=1e-10
3137
end
3238

3339
struct Wrapper
@@ -92,36 +98,44 @@ end
9298
"Exponent", "not an integer", "not a polynomial"] HomotopyContinuationProblem(
9399
sys, [])
94100
@test MTK.safe_HomotopyContinuationProblem(sys, []) isa MTK.NotPolynomialError
101+
@test NonlinearProblem(sys, []) isa NonlinearProblem
102+
95103
@mtkbuild sys = NonlinearSystem([x^x - x ~ 0])
96104
@test_throws ["Cannot convert", "Unable", "symbolically solve",
97105
"Exponent", "unknowns", "not a polynomial"] HomotopyContinuationProblem(
98106
sys, [])
99107
@test MTK.safe_HomotopyContinuationProblem(sys, []) isa MTK.NotPolynomialError
108+
@test NonlinearProblem(sys, []) isa NonlinearProblem
100109
@mtkbuild sys = NonlinearSystem([((x^2) / sin(x))^2 + x ~ 0])
101110
@test_throws ["Cannot convert", "both polynomial", "non-polynomial",
102111
"recognized", "sin", "not a polynomial"] HomotopyContinuationProblem(
103112
sys, [])
104113
@test MTK.safe_HomotopyContinuationProblem(sys, []) isa MTK.NotPolynomialError
114+
@test NonlinearProblem(sys, []) isa NonlinearProblem
105115

106116
@variables y = 2.0
107117
@mtkbuild sys = NonlinearSystem([x^2 + y^2 + 2 ~ 0, y ~ sin(x)])
108118
@test_throws ["Cannot convert", "recognized", "sin", "not a polynomial"] HomotopyContinuationProblem(
109119
sys, [])
110120
@test MTK.safe_HomotopyContinuationProblem(sys, []) isa MTK.NotPolynomialError
121+
@test NonlinearProblem(sys, []) isa NonlinearProblem
111122

112123
@mtkbuild sys = NonlinearSystem([x^2 + y^2 - 2 ~ 0, sin(x + y) ~ 0])
113124
@test_throws ["Cannot convert", "function of multiple unknowns"] HomotopyContinuationProblem(
114125
sys, [])
115126
@test MTK.safe_HomotopyContinuationProblem(sys, []) isa MTK.NotPolynomialError
127+
@test NonlinearProblem(sys, []) isa NonlinearProblem
116128

117129
@mtkbuild sys = NonlinearSystem([sin(x)^2 + 1 ~ 0, cos(y) - cos(x) - 1 ~ 0])
118130
@test_throws ["Cannot convert", "multiple non-polynomial terms", "same unknown"] HomotopyContinuationProblem(
119131
sys, [])
120132
@test MTK.safe_HomotopyContinuationProblem(sys, []) isa MTK.NotPolynomialError
133+
@test NonlinearProblem(sys, []) isa NonlinearProblem
121134

122135
@mtkbuild sys = NonlinearSystem([sin(x^2)^2 + sin(x^2) - 1 ~ 0])
123136
@test_throws ["import Nemo"] HomotopyContinuationProblem(sys, [])
124137
@test MTK.safe_HomotopyContinuationProblem(sys, []) isa MTK.NotPolynomialError
138+
@test NonlinearProblem(sys, []) isa NonlinearProblem
125139
end
126140

127141
import Nemo

0 commit comments

Comments
 (0)