Skip to content

Commit cfdb435

Browse files
committed
Add LSQR
1 parent 1d20061 commit cfdb435

File tree

2 files changed

+16
-16
lines changed

2 files changed

+16
-16
lines changed

src/krylov_workspaces.jl

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2030,22 +2030,22 @@ The following outer constructors can be used to initialize this workspace:
20302030
workspace = LsqrWorkspace(A, b)
20312031
workspace = LsqrWorkspace(kc::KrylovConstructor)
20322032
"""
2033-
mutable struct LsqrWorkspace{T,FC,S} <: KrylovWorkspace{T,FC,S,S}
2033+
mutable struct LsqrWorkspace{T,FC,Sm,Sn} <: KrylovWorkspace{T,FC,Sm,Sn}
20342034
m :: Int
20352035
n :: Int
2036-
x :: S
2037-
Nv :: S
2038-
Aᴴu :: S
2039-
w :: S
2040-
Mu :: S
2041-
Av :: S
2042-
u :: S
2043-
v :: S
2036+
x :: Sn
2037+
Nv :: Sn
2038+
Aᴴu :: Sn
2039+
w :: Sn
2040+
Mu :: Sm
2041+
Av :: Sm
2042+
u :: Sm
2043+
v :: Sn
20442044
err_vec :: Vector{T}
20452045
stats :: SimpleStats{T}
20462046
end
20472047

2048-
function LsqrWorkspace(kc::KrylovConstructor; window::Integer = 5)
2048+
function LsqrWorkspace(kc::KrylovConstructor{Sm,Sn}; window::Integer = 5) where {Sm,Sn}
20492049
S = typeof(kc.vm)
20502050
FC = eltype(S)
20512051
T = real(FC)
@@ -2061,7 +2061,7 @@ function LsqrWorkspace(kc::KrylovConstructor; window::Integer = 5)
20612061
v = similar(kc.vn_empty)
20622062
err_vec = zeros(T, window)
20632063
stats = SimpleStats(0, false, false, false, 0, T[], T[], T[], 0.0, "unknown")
2064-
workspace = LsqrWorkspace{T,FC,S}(m, n, x, Nv, Aᴴu, w, Mu, Av, u, v, err_vec, stats)
2064+
workspace = LsqrWorkspace{T,FC,Sm,Sn}(m, n, x, Nv, Aᴴu, w, Mu, Av, u, v, err_vec, stats)
20652065
return workspace
20662066
end
20672067

@@ -2079,7 +2079,7 @@ function LsqrWorkspace(m::Integer, n::Integer, S::Type; window::Integer = 5)
20792079
err_vec = zeros(T, window)
20802080
S = isconcretetype(S) ? S : typeof(x)
20812081
stats = SimpleStats(0, false, false, false, 0, T[], T[], T[], 0.0, "unknown")
2082-
workspace = LsqrWorkspace{T,FC,S}(m, n, x, Nv, Aᴴu, w, Mu, Av, u, v, err_vec, stats)
2082+
workspace = LsqrWorkspace{T,FC,S,S}(m, n, x, Nv, Aᴴu, w, Mu, Av, u, v, err_vec, stats)
20832083
return workspace
20842084
end
20852085

src/lsqr.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ args_lsqr = (:A, :b)
164164
kwargs_lsqr = (:M, :N, :ldiv, :sqd, , :radius, :etol, :axtol, :btol, :conlim, :atol, :rtol, :itmax, :timemax, :verbose, :history, :callback, :iostream)
165165

166166
@eval begin
167-
function lsqr!(workspace :: LsqrWorkspace{T,FC,S}, $(def_args_lsqr...); $(def_kwargs_lsqr...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}, S <: AbstractVector{FC}}
167+
function lsqr!(workspace :: LsqrWorkspace{T,FC,Sm,Sn}, $(def_args_lsqr...); $(def_kwargs_lsqr...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}, Sm <: AbstractVector{FC}, Sn <: AbstractVector{FC}}
168168

169169
# Timer
170170
start_time = time_ns()
@@ -185,14 +185,14 @@ kwargs_lsqr = (:M, :N, :ldiv, :sqd, :λ, :radius, :etol, :axtol, :btol, :conlim,
185185

186186
# Check type consistency
187187
eltype(A) == FC || @warn "eltype(A) ≠ $FC. This could lead to errors or additional allocations in operator-vector products."
188-
ktypeof(b) == S || error("ktypeof(b) must be equal to $S")
188+
ktypeof(b) == Sm || error("ktypeof(b) must be equal to $Sm")
189189

190190
# Compute the adjoint of A
191191
Aᴴ = A'
192192

193193
# Set up workspace.
194-
allocate_if(!MisI, workspace, :u, S, workspace.Av) # The length of u is m
195-
allocate_if(!NisI, workspace, :v, S, workspace.x) # The length of v is n
194+
allocate_if(!MisI, workspace, :u, Sm, workspace.Av) # The length of u is m
195+
allocate_if(!NisI, workspace, :v, Sn, workspace.x) # The length of v is n
196196
x, Nv, Aᴴu, w = workspace.x, workspace.Nv, workspace.Aᴴu, workspace.w
197197
Mu, Av, err_vec, stats = workspace.Mu, workspace.Av, workspace.err_vec, workspace.stats
198198
rNorms, ArNorms = stats.residuals, stats.Aresiduals

0 commit comments

Comments
 (0)