Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/BracketingNonlinearSolve/Project.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name = "BracketingNonlinearSolve"
uuid = "70df07ce-3d50-431d-a3e7-ca6ddb60ac1e"
authors = ["Avik Pal <avikpal@mit.edu> and contributors"]
version = "1.6.1"
version = "1.6.2"

[deps]
CommonSolve = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ using SciMLBase: SciMLBase, IntervalNonlinearProblem, ReturnCode

abstract type AbstractBracketingAlgorithm <: AbstractNonlinearSolveAlgorithm end

include("utils.jl")
include("common.jl")

include("alefeld.jl")
Expand Down
46 changes: 11 additions & 35 deletions lib/BracketingNonlinearSolve/src/alefeld.jl
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,11 @@ function SciMLBase.__solve(

fc = f(c)
if a == c || b == c
return SciMLBase.build_solution(
prob, alg, c, fc; retcode = ReturnCode.FloatingPointLimit, left = a, right = b
)
return build_bracketing_solution(prob, alg, c, fc, a, b, ReturnCode.FloatingPointLimit)
end

if iszero(fc)
return SciMLBase.build_solution(
prob, alg, c, fc; retcode = ReturnCode.Success, left = a, right = b
)
return build_exact_solution(prob, alg, c, fc, ReturnCode.Success)
end

a, b, d = Impl.bracket(f, a, b, c)
Expand All @@ -46,14 +42,11 @@ function SciMLBase.__solve(

ē, fc = d, f(c)
if a == c || b == c
return SciMLBase.build_solution(
prob, alg, c, fc; retcode = ReturnCode.FloatingPointLimit,
left = a, right = b)
return build_bracketing_solution(prob, alg, c, fc, a, b, ReturnCode.FloatingPointLimit)
end

if iszero(fc)
return SciMLBase.build_solution(
prob, alg, c, fc; retcode = ReturnCode.Success, left = a, right = b)
return build_exact_solution(prob, alg, c, fc, ReturnCode.Success)
end

ā, b̄, d̄ = Impl.bracket(f, a, b, c)
Expand All @@ -71,16 +64,11 @@ function SciMLBase.__solve(
fc = f(c)

if ā == c || b̄ == c
return SciMLBase.build_solution(
prob, alg, c, fc;
retcode = ReturnCode.FloatingPointLimit, left = ā, right = b̄
)
return build_bracketing_solution(prob, alg, c, fc, ā, b̄, ReturnCode.FloatingPointLimit)
end

if iszero(fc)
return SciMLBase.build_solution(
prob, alg, c, fc; retcode = ReturnCode.Success, left = ā, right = b̄
)
return build_exact_solution(prob, alg, c, fc, ReturnCode.Success)
end

ā, b̄, d̄ = Impl.bracket(f, ā, b̄, c)
Expand All @@ -94,16 +82,11 @@ function SciMLBase.__solve(
fc = f(c)

if ā == c || b̄ == c
return SciMLBase.build_solution(
prob, alg, c, fc;
retcode = ReturnCode.FloatingPointLimit, left = ā, right = b̄
)
return build_bracketing_solution(prob, alg, c, fc, ā, b̄, ReturnCode.FloatingPointLimit)
end

if iszero(fc)
return SciMLBase.build_solution(
prob, alg, c, fc; retcode = ReturnCode.Success, left = ā, right = b̄
)
return build_exact_solution(prob, alg, c, fc, ReturnCode.Success)
end

ā, b̄, d = Impl.bracket(f, ā, b̄, c)
Expand All @@ -117,15 +100,10 @@ function SciMLBase.__solve(
fc = f(c)

if ā == c || b̄ == c
return SciMLBase.build_solution(
prob, alg, c, fc;
retcode = ReturnCode.FloatingPointLimit, left = ā, right = b̄
)
return build_bracketing_solution(prob, alg, c, fc, ā, b̄, ReturnCode.FloatingPointLimit)
end
if iszero(fc)
return SciMLBase.build_solution(
prob, alg, c, fc; retcode = ReturnCode.Success, left = ā, right = b̄
)
return build_exact_solution(prob, alg, c, fc, ReturnCode.Success)
end
a, b, d = Impl.bracket(f, ā, b̄, c)
end
Expand All @@ -140,7 +118,5 @@ function SciMLBase.__solve(
fc = f(c)

# Return solution when run out of max iteration
return SciMLBase.build_solution(
prob, alg, c, fc; retcode = ReturnCode.MaxIters, left = a, right = b
)
return build_bracketing_solution(prob, alg, c, fc, a, b, ReturnCode.MaxIters)
end
24 changes: 6 additions & 18 deletions lib/BracketingNonlinearSolve/src/bisection.jl
Original file line number Diff line number Diff line change
Expand Up @@ -33,41 +33,31 @@ function SciMLBase.__solve(
left, abstol, promote_type(eltype(left), eltype(right)))

if iszero(fl)
return SciMLBase.build_solution(
prob, alg, left, fl; retcode = ReturnCode.ExactSolutionLeft, left, right
)
return build_exact_solution(prob, alg, left, fl, ReturnCode.ExactSolutionLeft)
end

if iszero(fr)
return SciMLBase.build_solution(
prob, alg, right, fr; retcode = ReturnCode.ExactSolutionRight, left, right
)
return build_exact_solution(prob, alg, right, fr, ReturnCode.ExactSolutionRight)
end

if sign(fl) == sign(fr)
@SciMLMessage("The interval is not an enclosing interval, opposite signs at the \
boundaries are required.",
verbose, :non_enclosing_interval)
return SciMLBase.build_solution(
prob, alg, left, fl; retcode = ReturnCode.InitialFailure, left, right
)
return build_bracketing_solution(prob, alg, left, fl, left, right, ReturnCode.InitialFailure)
end

i = 1
while i ≤ maxiters
mid = (left + right) / 2

if mid == left || mid == right
return SciMLBase.build_solution(
prob, alg, left, fl; retcode = ReturnCode.FloatingPointLimit, left, right
)
return build_bracketing_solution(prob, alg, left, fl, left, right, ReturnCode.FloatingPointLimit)
end

fm = f(mid)
if abs((right - left) / 2) < abstol
return SciMLBase.build_solution(
prob, alg, mid, fm; retcode = ReturnCode.Success, left, right
)
return build_bracketing_solution(prob, alg, mid, fm, left, right, ReturnCode.Success)
end

if iszero(fm)
Expand All @@ -93,7 +83,5 @@ function SciMLBase.__solve(

sol !== nothing && return sol

return SciMLBase.build_solution(
prob, alg, left, fl; retcode = ReturnCode.MaxIters, left, right
)
return build_bracketing_solution(prob, alg, left, fl, left, right, ReturnCode.MaxIters)
end
25 changes: 6 additions & 19 deletions lib/BracketingNonlinearSolve/src/brent.jl
Original file line number Diff line number Diff line change
Expand Up @@ -31,24 +31,18 @@ function SciMLBase.__solve(
)

if iszero(fl)
return SciMLBase.build_solution(
prob, alg, left, fl; retcode = ReturnCode.ExactSolutionLeft, left, right
)
return build_exact_solution(prob, alg, left, fl, ReturnCode.ExactSolutionLeft)
end

if iszero(fr)
return SciMLBase.build_solution(
prob, alg, right, fr; retcode = ReturnCode.ExactSolutionRight, left, right
)
return build_exact_solution(prob, alg, right, fr, ReturnCode.ExactSolutionRight)
end

if sign(fl) == sign(fr)
@SciMLMessage("The interval is not an enclosing interval, opposite signs at the \
boundaries are required.",
verbose, :non_enclosing_interval)
return SciMLBase.build_solution(
prob, alg, left, fl; retcode = ReturnCode.InitialFailure, left, right
)
return build_bracketing_solution(prob, alg, left, fl, left, right, ReturnCode.InitialFailure)
end

if abs(fl) < abs(fr)
Expand Down Expand Up @@ -83,10 +77,7 @@ function SciMLBase.__solve(
# Bisection method
s = (left + right) / 2
if s == left || s == right
return SciMLBase.build_solution(
prob, alg, left, fl;
retcode = ReturnCode.FloatingPointLimit, left, right
)
return build_bracketing_solution(prob, alg, left, fl, left, right, ReturnCode.FloatingPointLimit)
end
cond = true
else
Expand All @@ -95,9 +86,7 @@ function SciMLBase.__solve(

fs = f(s)
if abs((right - left) / 2) < abstol
return SciMLBase.build_solution(
prob, alg, s, fs; retcode = ReturnCode.Success, left, right
)
return build_bracketing_solution(prob, alg, s, fs, left, right, ReturnCode.Success)
end

if iszero(fs)
Expand Down Expand Up @@ -135,7 +124,5 @@ function SciMLBase.__solve(

sol !== nothing && return sol

return SciMLBase.build_solution(
prob, alg, left, fl; retcode = ReturnCode.MaxIters, left, right
)
return build_bracketing_solution(prob, alg, left, fl, left, right, ReturnCode.MaxIters)
end
24 changes: 6 additions & 18 deletions lib/BracketingNonlinearSolve/src/falsi.jl
Original file line number Diff line number Diff line change
Expand Up @@ -30,32 +30,24 @@ function SciMLBase.__solve(
left, abstol, promote_type(eltype(left), eltype(right)))

if iszero(fl)
return SciMLBase.build_solution(
prob, alg, left, fl; retcode = ReturnCode.ExactSolutionLeft, left, right
)
return build_exact_solution(prob, alg, left, fl, ReturnCode.ExactSolutionLeft)
end

if iszero(fr)
return SciMLBase.build_solution(
prob, alg, right, fr; retcode = ReturnCode.ExactSolutionRight, left, right
)
return build_exact_solution(prob, alg, right, fr, ReturnCode.ExactSolutionRight)
end

if sign(fl) == sign(fr)
@SciMLMessage("The interval is not an enclosing interval, opposite signs at the \
boundaries are required.",
verbose, :non_enclosing_interval)
return SciMLBase.build_solution(
prob, alg, left, fl; retcode = ReturnCode.InitialFailure, left, right
)
return build_bracketing_solution(prob, alg, left, fl, left, right, ReturnCode.InitialFailure)
end

i = 1
while i ≤ maxiters
if Impl.nextfloat_tdir(left, l, r) == right
return SciMLBase.build_solution(
prob, alg, left, fl; left, right, retcode = ReturnCode.FloatingPointLimit
)
return build_bracketing_solution(prob, alg, left, fl, left, right, ReturnCode.FloatingPointLimit)
end

mid = (fr * left - fl * right) / (fr - fl)
Expand All @@ -67,9 +59,7 @@ function SciMLBase.__solve(

fm = f(mid)
if abs((right - left) / 2) < abstol
return SciMLBase.build_solution(
prob, alg, mid, fm; left, right, retcode = ReturnCode.Success
)
return build_bracketing_solution(prob, alg, mid, fm, left, right, ReturnCode.Success)
end

if abs(fm) < abstol
Expand All @@ -93,7 +83,5 @@ function SciMLBase.__solve(

sol !== nothing && return sol

return SciMLBase.build_solution(
prob, alg, left, fl; retcode = ReturnCode.MaxIters, left, right
)
return build_bracketing_solution(prob, alg, left, fl, left, right, ReturnCode.MaxIters)
end
28 changes: 7 additions & 21 deletions lib/BracketingNonlinearSolve/src/itp.jl
Original file line number Diff line number Diff line change
Expand Up @@ -71,24 +71,18 @@ function SciMLBase.__solve(
)

if iszero(fl)
return SciMLBase.build_solution(
prob, alg, left, fl; retcode = ReturnCode.ExactSolutionLeft, left, right
)
return build_exact_solution(prob, alg, left, fl, ReturnCode.ExactSolutionLeft)
end

if iszero(fr)
return SciMLBase.build_solution(
prob, alg, right, fr; retcode = ReturnCode.ExactSolutionRight, left, right
)
return build_exact_solution(prob, alg, right, fr, ReturnCode.ExactSolutionRight)
end

if sign(fl) == sign(fr)
@SciMLMessage("The interval is not an enclosing interval, opposite signs at the \
boundaries are required.",
verbose, :non_enclosing_interval)
return SciMLBase.build_solution(
prob, alg, left, fl; retcode = ReturnCode.InitialFailure, left, right
)
return build_bracketing_solution(prob, alg, left, fl, left, right, ReturnCode.InitialFailure)
end

ϵ = abstol
Expand Down Expand Up @@ -120,9 +114,7 @@ function SciMLBase.__solve(

xp = ifelse(abs(xt - mid) ≤ r, xt, mid - copysign(r, diff)) # Projection Step
if span < 2ϵ
return SciMLBase.build_solution(
prob, alg, xt, f(xt); retcode = ReturnCode.Success, left, right
)
return build_bracketing_solution(prob, alg, xt, f(xt), left, right, ReturnCode.Success)
end
yp = f(xp)
yps = yp * sign(fr)
Expand All @@ -131,22 +123,16 @@ function SciMLBase.__solve(
elseif yps < T0
left, fl = xp, yp
else
return SciMLBase.build_solution(
prob, alg, xp, yps; retcode = ReturnCode.Success, left, right
)
return build_exact_solution(prob, alg, xp, yps, ReturnCode.Success)
end

i += 1
ϵ_s /= 2

if nextfloat(left) == right
return SciMLBase.build_solution(
prob, alg, right, fr; retcode = ReturnCode.FloatingPointLimit, left, right
)
return build_bracketing_solution(prob, alg, right, fr, left, right, ReturnCode.FloatingPointLimit)
end
end

return SciMLBase.build_solution(
prob, alg, left, fl; retcode = ReturnCode.MaxIters, left, right
)
return build_bracketing_solution(prob, alg, left, fl, left, right, ReturnCode.MaxIters)
end
Loading
Loading