Skip to content

Commit 45e246b

Browse files
authored
Merge pull request #33 from JuliaNLSolvers/pkm/newtonb0
Allow for initial B0 input in ActiveBox.
2 parents f741cc9 + 6c1eee3 commit 45e246b

File tree

3 files changed

+45
-22
lines changed

3 files changed

+45
-22
lines changed

src/optimize/projected/projectednewton.jl

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,16 +61,33 @@ end
6161
isbinding(i, j) = i & j
6262

6363
factorize(ab::ActiveBox, M) = ab.factorize(M)
64-
6564
function solve(
66-
prob::OptimizationProblem,
65+
problem::OptimizationProblem,
6766
x0,
67+
approach::ActiveBox,
68+
options::OptimizationOptions,
69+
)
70+
B0 = false * x0 * x0' + I
71+
s0 = (x0, B0)
72+
_solve(problem, s0, approach, options)
73+
end
74+
function solve(
75+
problem::OptimizationProblem,
76+
s0::Tuple,
77+
approach::ActiveBox,
78+
options::OptimizationOptions,
79+
)
80+
_solve(problem, s0, approach, options)
81+
end
82+
83+
function _solve(
84+
prob::OptimizationProblem,
85+
s0::Tuple,
6886
scheme::ActiveBox,
6987
options::OptimizationOptions,
7088
)
7189
t0 = time()
72-
73-
x0, B0 = x0, (false * x0 * x0' + I)
90+
x0, B0 = s0
7491

7592
lower, upper = bounds(prob)
7693
if isnothing(scheme.ϵ)

src/optimize/univariate/brentmin.jl

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ function solve(
1414
end
1515

1616
function _solve(prob, bm::BrentMin, options)
17+
time0 = time()
1718
a, b = bounds(prob)
1819
T = typeof(a)
1920
t = 1e-8
@@ -22,10 +23,11 @@ function _solve(prob, bm::BrentMin, options)
2223

2324
e = d = 0 * x
2425

25-
fv = fw = fx = value(prob, x)
26+
f0 = fv = fw = fx = value(prob, x)
2627
p = q = r = 0 * x
27-
28-
for i = 1:options.maxiter
28+
brent_iter = 0
29+
while brent_iter < options.maxiter
30+
brent_iter += 1
2931
m = (a + b) / 2
3032
tol = eps(T) * abs(x) + t
3133
if abs(x - m) > 2 * tol - (b - a) / 2 # stopping crit
@@ -45,15 +47,11 @@ function _solve(prob, bm::BrentMin, options)
4547
end
4648

4749
if abs(p) < abs(q * r / 2) && p < q * (a - x) && p < q * (b - x)
48-
# the do the parapolic interpolation
50+
# then do the parapolic interpolation
4951
d = p / q
5052
u = x + d
5153
if u - a < 2 * tol || b - u < 2 * tol
52-
if x < m # this should just use sign
53-
d = tol
54-
else
55-
d = -tol
56-
end
54+
d = sign(m-x)*tol
5755
end
5856
else
5957
# do golden section
@@ -104,12 +102,6 @@ function _solve(prob, bm::BrentMin, options)
104102
break
105103
end
106104
end
107-
return x, fx
108-
end
109-
110105

111-
#=
112-
prob = OptimizationProblem(ScalarObjective(;f=x->sign(x)), (-2.0,2.0))
113-
@time solve(prob, 0.0, BrentMin(), OptimizationOptions())
114-
115-
=#
106+
return ConvergenceInfo(bm, (;x, f0, minimum=fx, time=time()-time0, iter=brent_iter), options)
107+
end

test/optimize/interface.jl

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,12 +250,21 @@ const brent_prob = OptimizationProblem(brent_scalar, (-2.0, 2.0))
250250
@test alloc == 0
251251
end
252252

253+
const f3(x) = abs(x)
254+
const obj3 = ScalarObjective(; f=f3)
255+
const prob3 = OptimizationProblem(obj3, (-10.1, 9.0))
253256
@testset "brentmin" begin
254257
f(x) = (5.0 + x)^2.0
255258
obj = ScalarObjective(; f)
256259
prob = OptimizationProblem(obj, (-10.1, 9.0))
257260

258-
@test all(abs.(solve(prob, BrentMin(), OptimizationOptions()) .- (-5.0, 0.0)) .< 1e-8)
261+
f2(x) = abs(x)
262+
obj2 = ScalarObjective(; f=f2)
263+
prob2 = OptimizationProblem(obj2, (-10.1, 9.0))
264+
265+
@test all(abs.(solve(prob, BrentMin(), OptimizationOptions()).info.minimum) .< 1e-8)
266+
@test all(abs.(solve(prob2, BrentMin(), OptimizationOptions()).info.minimum) .< 1e-8)
267+
@test all(abs.(solve(prob3, BrentMin(), OptimizationOptions()).info.minimum) .< 1e-8)
259268
end
260269

261270

@@ -523,6 +532,11 @@ solve(static_prob_qn, rand(3), AdaMax(), OptimizationOptions(maxiter = 1000))
523532
@test res_unc.info.solution [3.0, 2.0]
524533
res_con = solve(prob_on_bounds, copy(start), ActiveBox(), OptimizationOptions())
525534
@test res_con.info.solution [3.5, 1.6165968467448326]
535+
536+
res_con_matrix = solve(prob_on_bounds, (copy(start), [1.0 0.0;0.0 1.0]) , ActiveBox(), OptimizationOptions())
537+
@test res_con_matrix.info.B isa Matrix
538+
res_con_mmatrix = solve(prob_on_bounds, (copy(start), @MMatrix([1.0 0.0;0.0 1.0])) , ActiveBox(), OptimizationOptions())
539+
@test res_con_mmatrix.info.B isa MMatrix
526540
end
527541

528542
function fourth_f(x)

0 commit comments

Comments
 (0)