@@ -78,8 +78,6 @@ mutable struct CompressedLBFGSData{T, M<:AbstractMatrix{T}, V<:AbstractVector{T}
7878 inverse_intermediate_2:: LowerTriangular{T,M} # 2mem * 2mem
7979 intermediary_vector:: V # 2mem
8080 sol:: V # 2mem
81-
82- nprod:: I
8381end
8482
8583"""
@@ -106,9 +104,7 @@ function CompressedLBFGSData(n::I; mem::I=5, T=Float64, M=default_matrix_type(;
106104 intermediary_vector = V (undef, 2 * mem)
107105 sol = V (undef, 2 * mem)
108106
109- nprod = 0
110-
111- return CompressedLBFGSData {T,M,V,I} (mem, n, k, α, Sₖ, Yₖ, Dₖ, Lₖ, chol_matrix, intermediate_diagonal, intermediate_1, intermediate_2, inverse_intermediate_1, inverse_intermediate_2, intermediary_vector, sol, nprod)
107+ return CompressedLBFGSData {T,M,V,I} (mem, n, k, α, Sₖ, Yₖ, Dₖ, Lₖ, chol_matrix, intermediate_diagonal, intermediate_1, intermediate_2, inverse_intermediate_1, inverse_intermediate_2, intermediary_vector, sol)
112108end
113109
114110mutable struct CompressedLBFGSOperator{T, M<: AbstractMatrix{T} , V<: AbstractVector{T} , F, I <: Integer } <: AbstractQuasiNewtonOperator{T}
@@ -121,6 +117,9 @@ mutable struct CompressedLBFGSOperator{T, M<:AbstractMatrix{T}, V<:AbstractVecto
121117 prod!:: F # apply the operator to a vector
122118 tprod!:: F # apply the transpose operator to a vector
123119 ctprod!:: F # apply the transpose conjugate operator to a vector
120+ nprod:: I
121+ ntprod:: I
122+ nctprod:: I
124123end
125124
126125function CompressedLBFGSOperator (n:: I ; mem:: I = 5 , T= Float64, M= default_matrix_type (; T), V= default_vector_type (; T)) where {I <: Integer }
@@ -142,7 +141,7 @@ function CompressedLBFGSOperator(n::I; mem::I=5, T=Float64, M=default_matrix_typ
142141
143142 F = typeof (prod!)
144143
145- return CompressedLBFGSOperator {T,M,V,F,I} (nrow, ncol, symmetric, hermitian, Bv, data, prod!, prod!, prod!)
144+ return CompressedLBFGSOperator {T,M,V,F,I} (nrow, ncol, symmetric, hermitian, Bv, data, prod!, prod!, prod!, 0 , 0 , 0 )
146145end
147146
148147has_args5 (op:: CompressedLBFGSOperator ) = true
@@ -234,14 +233,17 @@ function precompile_iterated_structure!(data::CompressedLBFGSData)
234233 mul! (view (data. intermediate_2, data. k+ 1 : 2 * data. k, 1 : data. k), view (data. Lₖ, 1 : data. k, 1 : data. k), view (data. intermediate_diagonal, 1 : data. k, 1 : data. k))
235234 view (data. intermediate_2, data. k+ 1 : 2 * data. k, 1 : data. k) .= view (data. intermediate_2, data. k+ 1 : 2 * data. k, 1 : data. k) .* - 1
236235
237- view (data. inverse_intermediate_1, 1 : 2 * data. k, 1 : 2 * data. k) .= inv (data. intermediate_1[ 1 : 2 * data. k, 1 : 2 * data. k] )
238- view (data. inverse_intermediate_2, 1 : 2 * data. k, 1 : 2 * data. k) .= inv (data. intermediate_2[ 1 : 2 * data. k, 1 : 2 * data. k] )
236+ view (data. inverse_intermediate_1, 1 : 2 * data. k, 1 : 2 * data. k) .= inv (view ( data. intermediate_1, 1 : 2 * data. k, 1 : 2 * data. k) )
237+ view (data. inverse_intermediate_2, 1 : 2 * data. k, 1 : 2 * data. k) .= inv (view ( data. intermediate_2, 1 : 2 * data. k, 1 : 2 * data. k) )
239238end
240239
241240# Algorithm 3.2 (p15)
242- LinearAlgebra. mul! (Bv:: V , op:: CompressedLBFGSOperator{T,M,V} , v:: V ) where {T,M,V<: AbstractVector{T} } = LinearAlgebra. mul! (Bv, op. data, v)
241+ function LinearAlgebra. mul! (Bv:: V , op:: CompressedLBFGSOperator{T,M,V} , v:: V ) where {T,M,V<: AbstractVector{T} }
242+ op. nprod += 1
243+ return LinearAlgebra. mul! (Bv, op. data, v)
244+ end
245+
243246function LinearAlgebra. mul! (Bv:: V , data:: CompressedLBFGSData{T,M,V} , v:: V ) where {T,M,V<: AbstractVector{T} }
244- data. nprod += 1
245247 # step 1-4 and 6 mainly done by Base.push!
246248 # step 5
247249 mul! (view (data. sol, 1 : data. k), transpose (view (data. Yₖ, :, 1 : data. k)), v)
265267Resets the CompressedLBFGS data of the given operator.
266268"""
267269function reset! (op:: CompressedLBFGSOperator )
268- op. data . nprod = 0
270+ op. nprod = 0
269271 return op
270272end
0 commit comments