Skip to content

Commit 99ebebc

Browse files
committed
Add resid param in struct and update build_solution in solve.jl
1 parent df1fd74 commit 99ebebc

File tree

3 files changed

+27
-22
lines changed

3 files changed

+27
-22
lines changed

src/scalar.jl

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
function SciMLBase.solve(prob::NonlinearProblem{<:Number}, alg::NewtonRaphson, args...; xatol = nothing, xrtol = nothing, maxiters = 1000, kwargs...)
22
f = Base.Fix2(prob.f, prob.p)
33
x = float(prob.u0)
4+
fx = float(prob.u0)
45
T = typeof(x)
56
atol = xatol !== nothing ? xatol : oneunit(T) * (eps(one(T)))^(4//5)
67
rtol = xrtol !== nothing ? xrtol : eps(one(T))^(4//5)
@@ -13,15 +14,15 @@ function SciMLBase.solve(prob::NonlinearProblem{<:Number}, alg::NewtonRaphson, a
1314
fx = f(x)
1415
dfx = FiniteDiff.finite_difference_derivative(f, x, alg.diff_type, eltype(x), fx)
1516
end
16-
iszero(fx) && return NewtonSolution(x, DEFAULT)
17+
iszero(fx) && return NewtonSolution(x, DEFAULT, fx)
1718
Δx = dfx \ fx
1819
x -= Δx
1920
if isapprox(x, xo, atol=atol, rtol=rtol)
20-
return NewtonSolution(x, DEFAULT)
21+
return NewtonSolution(x, DEFAULT, fx)
2122
end
2223
xo = x
2324
end
24-
return NewtonSolution(x, MAXITERS_EXCEED)
25+
return NewtonSolution(x, MAXITERS_EXCEED, fx)
2526
end
2627

2728
function scalar_nlsolve_ad(prob, alg, args...; kwargs...)
@@ -50,22 +51,22 @@ end
5051

5152
function SciMLBase.solve(prob::NonlinearProblem{<:Number, iip, <:Dual{T,V,P}}, alg::NewtonRaphson, args...; kwargs...) where {iip, T, V, P}
5253
sol, partials = scalar_nlsolve_ad(prob, alg, args...; kwargs...)
53-
return NewtonSolution(Dual{T,V,P}(sol.u, partials), sol.retcode)
54+
return NewtonSolution(Dual{T,V,P}(sol.u, partials), sol.retcode, sol.resid)
5455
end
5556
function SciMLBase.solve(prob::NonlinearProblem{<:Number, iip, <:AbstractArray{<:Dual{T,V,P}}}, alg::NewtonRaphson, args...; kwargs...) where {iip, T, V, P}
5657
sol, partials = scalar_nlsolve_ad(prob, alg, args...; kwargs...)
57-
return NewtonSolution(Dual{T,V,P}(sol.u, partials), sol.retcode)
58+
return NewtonSolution(Dual{T,V,P}(sol.u, partials), sol.retcode, sol.resid)
5859
end
5960

6061
# avoid ambiguities
6162
for Alg in [Bisection]
6263
@eval function SciMLBase.solve(prob::NonlinearProblem{uType, iip, <:Dual{T,V,P}}, alg::$Alg, args...; kwargs...) where {uType, iip, T, V, P}
6364
sol, partials = scalar_nlsolve_ad(prob, alg, args...; kwargs...)
64-
return BracketingSolution(Dual{T,V,P}(sol.left, partials), Dual{T,V,P}(sol.right, partials), sol.retcode)
65+
return BracketingSolution(Dual{T,V,P}(sol.left, partials), Dual{T,V,P}(sol.right, partials), sol.retcode, sol.resid)
6566
end
6667
@eval function SciMLBase.solve(prob::NonlinearProblem{uType, iip, <:AbstractArray{<:Dual{T,V,P}}}, alg::$Alg, args...; kwargs...) where {uType, iip, T, V, P}
6768
sol, partials = scalar_nlsolve_ad(prob, alg, args...; kwargs...)
68-
return BracketingSolution(Dual{T,V,P}(sol.left, partials), Dual{T,V,P}(sol.right, partials), sol.retcode)
69+
return BracketingSolution(Dual{T,V,P}(sol.left, partials), Dual{T,V,P}(sol.right, partials), sol.retcode, sol.resid)
6970
end
7071
end
7172

@@ -75,14 +76,14 @@ function SciMLBase.solve(prob::NonlinearProblem, ::Bisection, args...; maxiters
7576
fl, fr = f(left), f(right)
7677

7778
if iszero(fl)
78-
return BracketingSolution(left, right, EXACT_SOLUTION_LEFT)
79+
return BracketingSolution(left, right, EXACT_SOLUTION_LEFT,fl)
7980
end
8081

8182
i = 1
8283
if !iszero(fr)
8384
while i < maxiters
8485
mid = (left + right) / 2
85-
(mid == left || mid == right) && return BracketingSolution(left, right, FLOATING_POINT_LIMIT)
86+
(mid == left || mid == right) && return BracketingSolution(left, right, FLOATING_POINT_LIMIT, fl)
8687
fm = f(mid)
8788
if iszero(fm)
8889
right = mid
@@ -101,7 +102,7 @@ function SciMLBase.solve(prob::NonlinearProblem, ::Bisection, args...; maxiters
101102

102103
while i < maxiters
103104
mid = (left + right) / 2
104-
(mid == left || mid == right) && return BracketingSolution(left, right, FLOATING_POINT_LIMIT)
105+
(mid == left || mid == right) && return BracketingSolution(left, right, FLOATING_POINT_LIMIT, fl)
105106
fm = f(mid)
106107
if iszero(fm)
107108
right = mid
@@ -113,7 +114,7 @@ function SciMLBase.solve(prob::NonlinearProblem, ::Bisection, args...; maxiters
113114
i += 1
114115
end
115116

116-
return BracketingSolution(left, right, MAXITERS_EXCEED)
117+
return BracketingSolution(left, right, MAXITERS_EXCEED,fl)
117118
end
118119

119120
function SciMLBase.solve(prob::NonlinearProblem, ::Falsi, args...; maxiters = 1000, kwargs...)
@@ -122,14 +123,14 @@ function SciMLBase.solve(prob::NonlinearProblem, ::Falsi, args...; maxiters = 10
122123
fl, fr = f(left), f(right)
123124

124125
if iszero(fl)
125-
return BracketingSolution(left, right, EXACT_SOLUTION_LEFT)
126+
return BracketingSolution(left, right, EXACT_SOLUTION_LEFT,fl)
126127
end
127128

128129
i = 1
129130
if !iszero(fr)
130131
while i < maxiters
131132
if nextfloat_tdir(left, prob.u0...) == right
132-
return BracketingSolution(left, right, FLOATING_POINT_LIMIT)
133+
return BracketingSolution(left, right, FLOATING_POINT_LIMIT, fx)
133134
end
134135
mid = (fr * left - fl * right) / (fr - fl)
135136
for i in 1:10
@@ -156,7 +157,7 @@ function SciMLBase.solve(prob::NonlinearProblem, ::Falsi, args...; maxiters = 10
156157

157158
while i < maxiters
158159
mid = (left + right) / 2
159-
(mid == left || mid == right) && return BracketingSolution(left, right, FLOATING_POINT_LIMIT)
160+
(mid == left || mid == right) && return BracketingSolution(left, right, FLOATING_POINT_LIMIT, fl)
160161
fm = f(mid)
161162
if iszero(fm)
162163
right = mid
@@ -171,5 +172,5 @@ function SciMLBase.solve(prob::NonlinearProblem, ::Falsi, args...; maxiters = 10
171172
i += 1
172173
end
173174

174-
return BracketingSolution(left, right, MAXITERS_EXCEED)
175+
return BracketingSolution(left, right, MAXITERS_EXCEED,fl)
175176
end

src/solve.jl

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ function SciMLBase.solve(prob::NonlinearProblem,
22
alg::AbstractNonlinearSolveAlgorithm, args...;
33
kwargs...)
44
solver = init(prob, alg, args...; kwargs...)
5-
sol, resid = solve!(solver)
5+
sol = solve!(solver)
66
if typeof(sol) <: NewtonSolution
7-
return SciMLBase.build_solution(prob, alg, sol.u, resid;retcode=:Success)
7+
SciMLBase.build_solution(prob, alg, getsolution(sol), sol.resid;retcode=Symbol(sol.retcode))
8+
else
9+
SciMLBase.build_solution(prob, alg, get_solution(sol),sol.resid;retcode=Symbol(sol.retcode),left = sol.left,right = sol.right)
810
end
911
end
1012

@@ -70,7 +72,7 @@ function SciMLBase.solve!(solver::AbstractImmutableNonlinearSolver)
7072
@set! solver.retcode = MAXITERS_EXCEED
7173
end
7274
sol = get_solution(solver)
73-
return sol, solver.fu
75+
return sol
7476
end
7577

7678
"""
@@ -105,11 +107,11 @@ end
105107
Form solution object from solver types
106108
"""
107109
function get_solution(solver::BracketingImmutableSolver)
108-
return BracketingSolution(solver.left, solver.right, solver.retcode)
110+
return BracketingSolution(solver.left, solver.right, solver.retcode, solver.fl)
109111
end
110112

111113
function get_solution(solver::NewtonImmutableSolver)
112-
return NewtonSolution(solver.u, solver.retcode)
114+
return NewtonSolution(solver.u, solver.retcode, solver.fu)
113115
end
114116

115117
"""

src/types.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,17 @@ end
4848
# typeof(fu), typeof(p), typeof(internalnorm), typeof(tol), typeof(cache)}(iter, f, alg, u, fu, p, force_stop, maxiters, internalnorm, retcode, tol, cache)
4949
# end
5050

51-
struct BracketingSolution{uType}
51+
struct BracketingSolution{uType,resType}
5252
left::uType
5353
right::uType
5454
retcode::Retcode
55+
resid::resType
5556
end
5657

57-
struct NewtonSolution{uType}
58+
struct NewtonSolution{uType,resType}
5859
u::uType
5960
retcode::Retcode
61+
resid::resType
6062
end
6163

6264
function sync_residuals!(solver::BracketingImmutableSolver)

0 commit comments

Comments
 (0)