1
1
export DiagonalQN, SpectralGradient
2
2
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
-
11
3
"""
12
4
Implementation of the diagonal quasi-Newton approximation described in
13
5
14
6
Andrei, N.
15
7
A diagonal quasi-Newton updating method for unconstrained optimization.
16
8
https://doi.org/10.1007/s11075-018-0562-7
17
9
"""
18
- mutable struct DiagonalQN{T <: Real , I <: Integer , V <: AbstractVector{T} } < :
10
+ mutable struct DiagonalQN{T <: Real , I <: Integer , V <: AbstractVector{T} , F } < :
19
11
AbstractDiagonalQuasiNewtonOperator{T}
20
12
d:: V # Diagonal of the operator
21
13
nrow:: I
22
14
ncol:: I
23
15
symmetric:: Bool
24
16
hermitian:: Bool
25
- prod!
26
- tprod!
27
- ctprod!
17
+ prod!:: F
18
+ tprod!:: F
19
+ ctprod!:: F
28
20
nprod:: I
29
21
ntprod:: I
30
22
nctprod:: I
@@ -44,31 +36,19 @@ positive definite.
44
36
45
37
- `d::AbstractVector`: initial diagonal approximation.
46
38
"""
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
63
43
64
44
# update function
65
45
# s = x_{k+1} - x_k
66
46
# y = ∇f(x_{k+1}) - ∇f(x_k)
67
47
function push! (
68
- B:: DiagonalQN{T, I, V} ,
48
+ B:: DiagonalQN{T, I, V, F } ,
69
49
s:: V ,
70
50
y:: V ,
71
- ) where {T <: Real , I <: Integer , V <: AbstractVector{T} }
51
+ ) where {T <: Real , I <: Integer , V <: AbstractVector{T} , F }
72
52
trA2 = zero (T)
73
53
for i in eachindex (s)
74
54
trA2 += s[i]^ 4
@@ -91,15 +71,16 @@ Birgin, E. G., Martínez, J. M., & Raydan, M.
91
71
Spectral Projected Gradient Methods: Review and Perspectives.
92
72
https://doi.org/10.18637/jss.v060.i03
93
73
"""
94
- mutable struct SpectralGradient{T <: Real , I <: Integer } <: AbstractDiagonalQuasiNewtonOperator{T}
74
+ mutable struct SpectralGradient{T <: Real , I <: Integer , F} < :
75
+ AbstractDiagonalQuasiNewtonOperator{T}
95
76
d:: T # Diagonal coefficient of the operator (multiple of the identity)
96
77
nrow:: I
97
78
ncol:: I
98
79
symmetric:: Bool
99
80
hermitian:: Bool
100
- prod!
101
- tprod!
102
- ctprod!
81
+ prod!:: F
82
+ tprod!:: F
83
+ ctprod!:: F
103
84
nprod:: I
104
85
ntprod:: I
105
86
nctprod:: I
@@ -121,32 +102,18 @@ The approximation is defined as σI.
121
102
"""
122
103
function SpectralGradient (d:: T , n:: I ) where {T <: Real , I <: Integer }
123
104
@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 )
140
107
end
141
108
142
109
# update function
143
110
# s = x_{k+1} - x_k
144
111
# y = ∇f(x_{k+1}) - ∇f(x_k)
145
112
function push! (
146
- B:: SpectralGradient{T, I} ,
113
+ B:: SpectralGradient{T, I, F } ,
147
114
s:: V ,
148
115
y:: V ,
149
- ) where {T <: Real , I <: Integer , V <: AbstractVector{T} }
116
+ ) where {T <: Real , I <: Integer , F, V <: AbstractVector{T} }
150
117
if all (s .== 0 )
151
118
error (" Cannot divide by zero and s .= 0" )
152
119
end
0 commit comments