Skip to content

Commit 46e20a9

Browse files
committed
remove redundant definition, parameterize
1 parent 7ba0241 commit 46e20a9

File tree

1 file changed

+19
-52
lines changed

1 file changed

+19
-52
lines changed

src/DiagonalHessianApproximation.jl

Lines changed: 19 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,22 @@
11
export DiagonalQN, SpectralGradient
22

3-
function mulSquareOpDiagonal!(res, d, v, α, β::T) where {T <: Real}
4-
if β == zero(T)
5-
res .= α .* d .* v
6-
else
7-
res .= α .* d .* v .+ β .* res
8-
end
9-
end
10-
113
"""
124
Implementation of the diagonal quasi-Newton approximation described in
135
146
Andrei, N.
157
A diagonal quasi-Newton updating method for unconstrained optimization.
168
https://doi.org/10.1007/s11075-018-0562-7
179
"""
18-
mutable struct DiagonalQN{T <: Real, I <: Integer, V <: AbstractVector{T}} <:
10+
mutable struct DiagonalQN{T <: Real, I <: Integer, V <: AbstractVector{T}, F} <:
1911
AbstractDiagonalQuasiNewtonOperator{T}
2012
d::V # Diagonal of the operator
2113
nrow::I
2214
ncol::I
2315
symmetric::Bool
2416
hermitian::Bool
25-
prod!
26-
tprod!
27-
ctprod!
17+
prod!::F
18+
tprod!::F
19+
ctprod!::F
2820
nprod::I
2921
ntprod::I
3022
nctprod::I
@@ -44,31 +36,19 @@ positive definite.
4436
4537
- `d::AbstractVector`: initial diagonal approximation.
4638
"""
47-
DiagonalQN(d::AbstractVector{T}) where {T <: Real} = DiagonalQN(
48-
d,
49-
length(d),
50-
length(d),
51-
true,
52-
true,
53-
(res, v, α, β) -> mulSquareOpDiagonal!(res, d, v, α, β),
54-
(res, v, α, β) -> mulSquareOpDiagonal!(res, d, v, α, β),
55-
(res, v, α, β) -> mulSquareOpDiagonal!(res, d, v, α, β),
56-
0,
57-
0,
58-
0,
59-
true,
60-
true,
61-
true,
62-
)
39+
function DiagonalQN(d::AbstractVector{T}) where {T <: Real}
40+
prod = (res, v, α, β) -> mulSquareOpDiagonal!(res, d, v, α, β)
41+
DiagonalQN(d, length(d), length(d), true, true, prod, prod, prod, 0, 0, 0, true, true, true)
42+
end
6343

6444
# update function
6545
# s = x_{k+1} - x_k
6646
# y = ∇f(x_{k+1}) - ∇f(x_k)
6747
function push!(
68-
B::DiagonalQN{T, I, V},
48+
B::DiagonalQN{T, I, V, F},
6949
s::V,
7050
y::V,
71-
) where {T <: Real, I <: Integer, V <: AbstractVector{T}}
51+
) where {T <: Real, I <: Integer, V <: AbstractVector{T}, F}
7252
trA2 = zero(T)
7353
for i in eachindex(s)
7454
trA2 += s[i]^4
@@ -91,15 +71,16 @@ Birgin, E. G., Martínez, J. M., & Raydan, M.
9171
Spectral Projected Gradient Methods: Review and Perspectives.
9272
https://doi.org/10.18637/jss.v060.i03
9373
"""
94-
mutable struct SpectralGradient{T <: Real, I <: Integer} <: AbstractDiagonalQuasiNewtonOperator{T}
74+
mutable struct SpectralGradient{T <: Real, I <: Integer, F} <:
75+
AbstractDiagonalQuasiNewtonOperator{T}
9576
d::T # Diagonal coefficient of the operator (multiple of the identity)
9677
nrow::I
9778
ncol::I
9879
symmetric::Bool
9980
hermitian::Bool
100-
prod!
101-
tprod!
102-
ctprod!
81+
prod!::F
82+
tprod!::F
83+
ctprod!::F
10384
nprod::I
10485
ntprod::I
10586
nctprod::I
@@ -121,32 +102,18 @@ The approximation is defined as σI.
121102
"""
122103
function SpectralGradient(d::T, n::I) where {T <: Real, I <: Integer}
123104
@assert d > 0
124-
SpectralGradient(
125-
d,
126-
n,
127-
n,
128-
true,
129-
true,
130-
(res, v, α, β) -> mulSquareOpDiagonal!(res, d, v, α, β),
131-
(res, v, α, β) -> mulSquareOpDiagonal!(res, d, v, α, β),
132-
(res, v, α, β) -> mulSquareOpDiagonal!(res, d, v, α, β),
133-
0,
134-
0,
135-
0,
136-
true,
137-
true,
138-
true,
139-
)
105+
prod = (res, v, α, β) -> mulSquareOpDiagonal!(res, d, v, α, β)
106+
SpectralGradient(d, n, n, true, true, prod, prod, prod, 0, 0, 0, true, true, true)
140107
end
141108

142109
# update function
143110
# s = x_{k+1} - x_k
144111
# y = ∇f(x_{k+1}) - ∇f(x_k)
145112
function push!(
146-
B::SpectralGradient{T, I},
113+
B::SpectralGradient{T, I, F},
147114
s::V,
148115
y::V,
149-
) where {T <: Real, I <: Integer, V <: AbstractVector{T}}
116+
) where {T <: Real, I <: Integer, F, V <: AbstractVector{T}}
150117
if all(s .== 0)
151118
error("Cannot divide by zero and s .= 0")
152119
end

0 commit comments

Comments
 (0)