@@ -67,6 +67,11 @@ function columnshift!(A::AbstractMatrix{T}; direction::Int=-1, indicemax::Int=si
67
67
return A
68
68
end
69
69
70
+ function columnshift! (A:: AbstractMatrix{T} ; direction:: Int = - 1 , indicemax:: Int = size (A)[1 ]) where T
71
+ map (i-> view (A,:,i+ direction) .= view (A,:,i), 1 - direction: indicemax)
72
+ return A
73
+ end
74
+
70
75
"""
71
76
CompressedLBFGS(n::Int; [T=Float64, m=5], gpu:Bool)
72
77
@@ -100,21 +105,16 @@ function Base.push!(op::CompressedLBFGS{T,M,V}, s::V, y::V) where {T,M,V<:Abstra
100
105
view (op. Yₖ, :, op. k) .= y
101
106
view (op. Dₖ. diag, op. k) .= dot (s, y)
102
107
mul! (view (op. Lₖ. data, op. k, 1 : op. k- 1 ), transpose (view (op. Yₖ, :, 1 : op. k- 1 )), view (op. Sₖ, :, op. k) )
103
-
104
108
else # k == m update circurlarly the intermediary structures
105
- op. Sₖ . = circshift ( op. Sₖ, ( 0 , - 1 ) )
106
- op. Yₖ . = circshift ( op. Yₖ, ( 0 , - 1 ) )
109
+ columnshift! ( op. Sₖ; indicemax = op. k )
110
+ columnshift! ( op. Yₖ; indicemax = op. k )
107
111
op. Dₖ .= circshift (op. Dₖ, (- 1 , - 1 ))
108
- op. Sₖ[:, op. k] .= s
109
- op. Yₖ[:, op. k] .= y
110
- op. Dₖ. diag[op. k] = dot (s, y)
111
- # circshift doesn't work for a LowerTriangular matrix
112
- # for the time being, reinstantiate completely the Lₖ matrix
113
- for j in 1 : op. k
114
- for i in 1 : j- 1
115
- op. Lₖ. data[j, i] = dot (view (op. Sₖ,:, j), view (op. Yₖ, :, i))
116
- end
117
- end
112
+ view (op. Sₖ, :, op. k) .= s
113
+ view (op. Yₖ, :, op. k) .= y
114
+ view (op. Dₖ. diag, op. k) .= dot (s, y)
115
+
116
+ map (i-> view (op. Lₖ, i: op. m- 1 , i- 1 ) .= view (op. Lₖ, i+ 1 : op. m, i), 2 : op. m)
117
+ mul! (view (op. Lₖ. data, op. k, 1 : op. k- 1 ), transpose (view (op. Yₖ, :, 1 : op. k- 1 )), view (op. Sₖ, :, op. k) )
118
118
end
119
119
120
120
# step 4 and 6
@@ -150,15 +150,11 @@ end
150
150
function inverse_cholesky (op:: CompressedLBFGS{T,M,V} ) where {T,M,V}
151
151
view (op. intermediate_diagonal. diag, 1 : op. k) .= inv .(view (op. Dₖ. diag, 1 : op. k))
152
152
153
- # view(op.Lₖ, 1:op.k, 1:op.k) * inv(Diagonal(op.Dₖ[1:op.k, 1:op.k])) * transpose(view(op.Lₖ, 1:op.k, 1:op.k))
154
153
mul! (view (op. inverse_intermediate_1, 1 : op. k, 1 : op. k), view (op. intermediate_diagonal, 1 : op. k, 1 : op. k), transpose (view (op. Lₖ, 1 : op. k, 1 : op. k)))
155
154
mul! (view (op. chol_matrix, 1 : op. k, 1 : op. k), view (op. Lₖ, 1 : op. k, 1 : op. k), view (op. inverse_intermediate_1, 1 : op. k, 1 : op. k))
156
155
157
- # view(op.chol_matrix, 1:op.k, 1:op.k) .= op.α .* (transpose(view(op.Sₖ, :, 1:op.k)) * view(op.Sₖ, :, 1:op.k))
158
156
mul! (view (op. chol_matrix, 1 : op. k, 1 : op. k), transpose (view (op. Sₖ, :, 1 : op. k)), view (op. Sₖ, :, 1 : op. k), op. α, (T)(1 ))
159
157
160
- # view(op.chol_matrix, 1:op.k, 1:op.k) .= op.α .* (transpose(view(op.Sₖ, :, 1:op.k)) * view(op.Sₖ, :, 1:op.k)) .+ view(op.Lₖ, 1:op.k, 1:op.k) * inv(Diagonal(op.Dₖ[1:op.k, 1:op.k])) * transpose(view(op.Lₖ, 1:op.k, 1:op.k))
161
-
162
158
cholesky! (Symmetric (view (op. chol_matrix, 1 : op. k, 1 : op. k)))
163
159
Jₖ = transpose (UpperTriangular (view (op. chol_matrix, 1 : op. k, 1 : op. k)))
164
160
return Jₖ
@@ -182,10 +178,8 @@ function precompile_iterated_structure!(op::CompressedLBFGS)
182
178
# updates related to D^(-1/2)
183
179
view (op. intermediate_diagonal. diag, 1 : op. k) .= (x -> 1 / sqrt (x)). (view (op. Dₖ. diag, 1 : op. k))
184
180
mul! (view (op. intermediate_1, 1 : op. k,op. k+ 1 : 2 * op. k), view (op. intermediate_diagonal, 1 : op. k, 1 : op. k), transpose (view (op. Lₖ, 1 : op. k, 1 : op. k)))
185
- # view(op.intermediate_1, 1:op.k,op.k+1:2*op.k) .= view(op.Dₖ, 1:op.k, 1:op.k)^(-1/2) * transpose(view(op.Lₖ, 1:op.k, 1:op.k))
186
181
mul! (view (op. intermediate_2, op. k+ 1 : 2 * op. k, 1 : op. k), view (op. Lₖ, 1 : op. k, 1 : op. k), view (op. intermediate_diagonal, 1 : op. k, 1 : op. k))
187
182
view (op. intermediate_2, op. k+ 1 : 2 * op. k, 1 : op. k) .= view (op. intermediate_2, op. k+ 1 : 2 * op. k, 1 : op. k) .* - 1
188
- # view(op.intermediate_2, op.k+1:2*op.k, 1:op.k) .= .- view(op.Lₖ, 1:op.k, 1:op.k) * view(op.Dₖ, 1:op.k, 1:op.k)^(-1/2)
189
183
190
184
view (op. inverse_intermediate_1, 1 : 2 * op. k, 1 : 2 * op. k) .= inv (op. intermediate_1[1 : 2 * op. k, 1 : 2 * op. k])
191
185
view (op. inverse_intermediate_2, 1 : 2 * op. k, 1 : 2 * op. k) .= inv (op. intermediate_2[1 : 2 * op. k, 1 : 2 * op. k])
@@ -200,12 +194,10 @@ function LinearAlgebra.mul!(Bv::V, op::CompressedLBFGS{T,M,V}, v::V) where {T,M,
200
194
# scal!(op.α, view(op.sol, op.k+1:2*op.k)) # more allocation, slower
201
195
view (op. sol, op. k+ 1 : 2 * op. k) .*= op. α
202
196
203
- # view(op.sol, 1:2*op.k) .= view(op.inverse_intermediate_1, 1:2*op.k, 1:2*op.k) * (view(op.inverse_intermediate_2, 1:2*op.k, 1:2*op.k) * view(op.sol, 1:2*op.k))
204
197
mul! (view (op. intermediary_vector, 1 : 2 * op. k), view (op. inverse_intermediate_2, 1 : 2 * op. k, 1 : 2 * op. k), view (op. sol, 1 : 2 * op. k))
205
198
mul! (view (op. sol, 1 : 2 * op. k), view (op. inverse_intermediate_1, 1 : 2 * op. k, 1 : 2 * op. k), view (op. intermediary_vector, 1 : 2 * op. k))
206
199
207
200
# step 7
208
- # Bv .= op.α .* v .- (view(op.Yₖ, :,1:op.k) * view(op.sol, 1:op.k) .+ op.α .* view(op.Sₖ, :, 1:op.k) * view(op.sol, op.k+1:2*op.k))
209
201
mul! (Bv, view (op. Yₖ, :, 1 : op. k), view (op. sol, 1 : op. k))
210
202
mul! (Bv, view (op. Sₖ, :, 1 : op. k), view (op. sol, op. k+ 1 : 2 * op. k), - op. α, (T)(- 1 ))
211
203
Bv .+ = op. α .* v
0 commit comments