@@ -8,12 +8,14 @@ mutable struct LBFGSData{T, I <: Integer}
88 damped:: Bool
99 σ₂:: T
1010 σ₃:: T
11+ opnorm_upper_bound:: T # Upper bound for the operator norm ‖Bₖ‖₂ ≤ ‖B₀‖₂ + ∑ᵢ ‖bᵢ‖₂²
1112 s:: Vector{Vector{T}}
1213 y:: Vector{Vector{T}}
1314 ys:: Vector{T}
1415 α:: Vector{T}
1516 a:: Vector{Vector{T}}
1617 b:: Vector{Vector{T}}
18+ norm_b:: Vector{T}
1719 insert:: I
1820 Ax:: Vector{T}
1921 shifted_p:: Matrix{T} # Temporary matrix used in the computation solve_shifted_system!
@@ -38,12 +40,14 @@ function LBFGSData(
3840 damped,
3941 convert (T, σ₂),
4042 convert (T, σ₃),
43+ convert (T, 1 ),
4144 [zeros (T, n) for _ = 1 : mem],
4245 [zeros (T, n) for _ = 1 : mem],
4346 zeros (T, mem),
4447 inverse ? zeros (T, mem) : zeros (T, 0 ),
4548 inverse ? Vector {T} (undef, 0 ) : [zeros (T, n) for _ = 1 : mem],
4649 inverse ? Vector {T} (undef, 0 ) : [zeros (T, n) for _ = 1 : mem],
50+ inverse ? Vector {T} (undef, 0 ) : zeros (T, mem),
4751 1 ,
4852 Vector {T} (undef, n),
4953 Array {T} (undef, (n, 2 * mem)),
@@ -217,11 +221,18 @@ function push_common!(
217221 data. s[insert] .= s
218222 data. y[insert] .= y
219223 data. ys[insert] = ys
220- op. data. scaling && (op. data. scaling_factor = ys / dot (y, y))
224+ if op. data. scaling
225+ ! iszero (data. scaling_factor) && (data. opnorm_upper_bound -= 1 / op. data. scaling_factor)
226+ op. data. scaling_factor = ys / dot (y, y)
227+ ! iszero (data. scaling_factor) && (data. opnorm_upper_bound += 1 / op. data. scaling_factor)
228+ end
221229
222230 # Update arrays a and b used in forward products.
223231 if ! op. inverse
232+ data. opnorm_upper_bound -= data. norm_b[insert]
224233 data. b[insert] .= y ./ sqrt (ys)
234+ data. norm_b[insert] = norm (data. b[insert])
235+ data. opnorm_upper_bound += data. norm_b[insert]
225236
226237 @inbounds for i = 1 : (data. mem)
227238 k = mod (insert + i - 1 , data. mem) + 1
0 commit comments