Skip to content

Commit 2fddc01

Browse files
authored
Introduce DiagonalBFGSModel (#145)
* Introduce DiagonalBFGSModel Supersedes #127
1 parent 88e19bb commit 2fddc01

2 files changed

Lines changed: 28 additions & 2 deletions

File tree

src/quasi-newton.jl

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export AbstractDiagonalQNModel,
44
LSR1Model,
55
DiagonalPSBModel,
66
DiagonalAndreiModel,
7+
DiagonalBFGSModel,
78
SpectralGradientModel,
89
get_model,
910
get_op
@@ -130,6 +131,23 @@ function DiagonalAndreiModel(
130131
return DiagonalQNModel{T, S, typeof(nlp), typeof(nlp.meta), typeof(op)}(nlp.meta, nlp, op)
131132
end
132133

134+
"""
135+
DiagonalBFGSModel(nlp; d0 = fill!(S(undef, nlp.meta.nvar), 1.0))
136+
137+
Construct a `DiagonalBFGSModel` from another type of nlp, in which the Hessian is approximated
138+
via a diagonal BFGS quasi-Newton operator.
139+
`d0` is the initial approximation of the diagonal of the Hessian, and by default a vector of ones.
140+
See the
141+
[`DiagonalBFGS operator documentation`](https://juliasmoothoptimizers.github.io/LinearOperators.jl/stable/reference/#LinearOperators.DiagonalBFGS).
142+
"""
143+
function DiagonalBFGSModel(
144+
nlp::AbstractNLPModel{T, S};
145+
d0::S = fill!(S(undef, nlp.meta.nvar), one(T)),
146+
) where {T, S}
147+
op = DiagonalBFGS(d0)
148+
return DiagonalQNModel{T, S, typeof(nlp), typeof(nlp.meta), typeof(op)}(nlp.meta, nlp, op)
149+
end
150+
133151
"""
134152
SpectralGradientModel(nlp; σ = 1.0)
135153

test/nlp/quasi-newton.jl

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
(LBFGSModel, LBFGSOperator),
1515
(DiagonalPSBModel, DiagonalPSB),
1616
(DiagonalAndreiModel, DiagonalAndrei),
17+
(DiagonalBFGSModel, DiagonalBFGS),
1718
(SpectralGradientModel, SpectralGradient),
1819
],
1920
T in [Float64, Float32],
@@ -24,7 +25,7 @@
2425
m = nlp.meta.ncon
2526

2627
s, y = randn(T, n), randn(T, n)
27-
if QNO (DiagonalPSB, DiagonalAndrei)
28+
if QNO (DiagonalPSB, DiagonalAndrei, DiagonalBFGS)
2829
B = QNO(ones(T, n))
2930
elseif QNO == SpectralGradient
3031
B = QNO(one(T), n)
@@ -153,7 +154,14 @@
153154
end
154155

155156
@testset "Show" begin
156-
for QNM [LSR1Model, LBFGSModel, DiagonalPSBModel, DiagonalAndreiModel, SpectralGradientModel]
157+
for QNM [
158+
LSR1Model,
159+
LBFGSModel,
160+
DiagonalPSBModel,
161+
DiagonalAndreiModel,
162+
DiagonalBFGSModel,
163+
SpectralGradientModel,
164+
]
157165
nlp = QNM(SimpleNLPModel())
158166
io = IOBuffer()
159167
show(io, nlp)

0 commit comments

Comments
 (0)