Skip to content

Commit dca3d1f

Browse files
committed
Generate all out-of-place methods in krylov_solve.jl
1 parent 3a1deba commit dca3d1f

File tree

6 files changed

+28
-78
lines changed

6 files changed

+28
-78
lines changed

src/krylov_solve.jl

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,9 @@ for (KS, fun, fun2, args, def_args, optargs, def_optargs, kwargs, def_kwargs) in
4444
(:CgLanczosShiftSolver , :cg_lanczos_shift! , :cg_lanczos_shift , args_cg_lanczos_shift , def_args_cg_lanczos_shift , (), (), kwargs_cg_lanczos_shift , def_kwargs_cg_lanczos_shift )
4545
(:CglsLanczosShiftSolver, :cgls_lanczos_shift!, :cgls_lanczos_shift, args_cgls_lanczos_shift, def_args_cgls_lanczos_shift, (), (), kwargs_cgls_lanczos_shift, def_kwargs_cgls_lanczos_shift)
4646
]
47-
# window :: 5 -> lslq, lsmr, lsqr, minres, symmlq
47+
## Out-of-place
4848
if fun2 in (:cg_lanczos_shift, :cgls_lanczos_shift)
4949
@eval begin
50-
## Out-of-place
5150
function $(fun2)($(def_args...); $(def_kwargs...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}}
5251
start_time = time_ns()
5352
nshifts = length(shifts)
@@ -61,7 +60,6 @@ for (KS, fun, fun2, args, def_args, optargs, def_optargs, kwargs, def_kwargs) in
6160
end
6261
elseif fun2 in (:diom, :dqgmres, :fom, :gmres, :fgmres, :gpmr)
6362
@eval begin
64-
## Out-of-place
6563
function $(fun2)($(def_args...); memory::Int=20, $(def_kwargs...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}}
6664
start_time = time_ns()
6765
solver = $KS(A, b, memory)
@@ -85,9 +83,33 @@ for (KS, fun, fun2, args, def_args, optargs, def_optargs, kwargs, def_kwargs) in
8583
end
8684
end
8785
end
88-
elseif fun2 (:cg_lanczos_shift, :cgls_lanczos_shift, :lslq, :lsmr, :lsqr, :minres, :symmlq, :diom, :dqgmres, :fom, :gmres, :fgmres, :gpmr)
86+
elseif fun2 in (:lslq, :lsmr, :lsqr, :minres, :symmlq)
87+
@eval begin
88+
function $(fun2)($(def_args...); window::Int=5, $(def_kwargs...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}}
89+
start_time = time_ns()
90+
solver = $KS(A, b; window)
91+
elapsed_time = ktimer(start_time)
92+
timemax -= elapsed_time
93+
$(fun)(solver, $(args...); $(kwargs...))
94+
solver.stats.timer += elapsed_time
95+
return results(solver)
96+
end
97+
98+
if !isempty($optargs)
99+
function $(fun2)($(def_args...), $(def_optargs...); window::Int=5, $(def_kwargs...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}}
100+
start_time = time_ns()
101+
solver = $KS(A, b; window)
102+
warm_start!(solver, $(optargs...))
103+
elapsed_time = ktimer(start_time)
104+
timemax -= elapsed_time
105+
$(fun)(solver, $(args...); $(kwargs...))
106+
solver.stats.timer += elapsed_time
107+
return results(solver)
108+
end
109+
end
110+
end
111+
else
89112
@eval begin
90-
## Out-of-place
91113
function $(fun2)($(def_args...); $(def_kwargs...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}}
92114
start_time = time_ns()
93115
solver = $KS(A, b)
@@ -113,8 +135,8 @@ for (KS, fun, fun2, args, def_args, optargs, def_optargs, kwargs, def_kwargs) in
113135
end
114136
end
115137

138+
## In-place
116139
@eval begin
117-
## In-place
118140
solve!(solver :: $KS{T,FC,S}, $(def_args...); $(def_kwargs...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}, S <: AbstractVector{FC}} = $(fun)(solver, $(args...); $(kwargs...))
119141

120142
if !isempty($optargs)

src/lslq.jl

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -182,16 +182,6 @@ args_lslq = (:A, :b)
182182
kwargs_lslq = (:M, :N, :ldiv, :transfer_to_lsqr, :sqd, , , :etol, :utol, :btol, :conlim, :atol, :rtol, :itmax, :timemax, :verbose, :history, :callback, :iostream)
183183

184184
@eval begin
185-
function lslq($(def_args_lslq...); window :: Int=5, $(def_kwargs_lslq...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}}
186-
start_time = time_ns()
187-
solver = LslqSolver(A, b; window)
188-
elapsed_time = ktimer(start_time)
189-
timemax -= elapsed_time
190-
lslq!(solver, $(args_lslq...); $(kwargs_lslq...))
191-
solver.stats.timer += elapsed_time
192-
return (solver.x, solver.stats)
193-
end
194-
195185
function lslq!(solver :: LslqSolver{T,FC,S}, $(def_args_lslq...); $(def_kwargs_lslq...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}, S <: AbstractVector{FC}}
196186

197187
# Timer

src/lsmr.jl

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -159,16 +159,6 @@ args_lsmr = (:A, :b)
159159
kwargs_lsmr = (:M, :N, :ldiv, :sqd, , :radius, :etol, :axtol, :btol, :conlim, :atol, :rtol, :itmax, :timemax, :verbose, :history, :callback, :iostream)
160160

161161
@eval begin
162-
function lsmr($(def_args_lsmr...); window :: Int=5, $(def_kwargs_lsmr...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}}
163-
start_time = time_ns()
164-
solver = LsmrSolver(A, b; window)
165-
elapsed_time = ktimer(start_time)
166-
timemax -= elapsed_time
167-
lsmr!(solver, $(args_lsmr...); $(kwargs_lsmr...))
168-
solver.stats.timer += elapsed_time
169-
return (solver.x, solver.stats)
170-
end
171-
172162
function lsmr!(solver :: LsmrSolver{T,FC,S}, $(def_args_lsmr...); $(def_kwargs_lsmr...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}, S <: AbstractVector{FC}}
173163

174164
# Timer

src/lsqr.jl

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -155,16 +155,6 @@ args_lsqr = (:A, :b)
155155
kwargs_lsqr = (:M, :N, :ldiv, :sqd, , :radius, :etol, :axtol, :btol, :conlim, :atol, :rtol, :itmax, :timemax, :verbose, :history, :callback, :iostream)
156156

157157
@eval begin
158-
function lsqr($(def_args_lsqr...); window :: Int=5, $(def_kwargs_lsqr...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}}
159-
start_time = time_ns()
160-
solver = LsqrSolver(A, b; window)
161-
elapsed_time = ktimer(start_time)
162-
timemax -= elapsed_time
163-
lsqr!(solver, $(args_lsqr...); $(kwargs_lsqr...))
164-
solver.stats.timer += elapsed_time
165-
return (solver.x, solver.stats)
166-
end
167-
168158
function lsqr!(solver :: LsqrSolver{T,FC,S}, $(def_args_lsqr...); $(def_kwargs_lsqr...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}, S <: AbstractVector{FC}}
169159

170160
# Timer

src/minres.jl

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -127,27 +127,6 @@ optargs_minres = (:x0,)
127127
kwargs_minres = (:M, :ldiv, , :atol, :rtol, :etol, :conlim, :itmax, :timemax, :verbose, :history, :callback, :iostream)
128128

129129
@eval begin
130-
function minres($(def_args_minres...), $(def_optargs_minres...); window :: Int=5, $(def_kwargs_minres...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}}
131-
start_time = time_ns()
132-
solver = MinresSolver(A, b; window)
133-
warm_start!(solver, $(optargs_minres...))
134-
elapsed_time = ktimer(start_time)
135-
timemax -= elapsed_time
136-
minres!(solver, $(args_minres...); $(kwargs_minres...))
137-
solver.stats.timer += elapsed_time
138-
return (solver.x, solver.stats)
139-
end
140-
141-
function minres($(def_args_minres...); window :: Int=5, $(def_kwargs_minres...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}}
142-
start_time = time_ns()
143-
solver = MinresSolver(A, b; window)
144-
elapsed_time = ktimer(start_time)
145-
timemax -= elapsed_time
146-
minres!(solver, $(args_minres...); $(kwargs_minres...))
147-
solver.stats.timer += elapsed_time
148-
return (solver.x, solver.stats)
149-
end
150-
151130
function minres!(solver :: MinresSolver{T,FC,S}, $(def_args_minres...); $(def_kwargs_minres...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}, S <: AbstractVector{FC}}
152131

153132
# Timer

src/symmlq.jl

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -113,27 +113,6 @@ optargs_symmlq = (:x0,)
113113
kwargs_symmlq = (:M, :ldiv, :transfer_to_cg, , :λest, :atol, :rtol, :etol, :conlim, :itmax, :timemax, :verbose, :history, :callback, :iostream)
114114

115115
@eval begin
116-
function symmlq($(def_args_symmlq...), $(def_optargs_symmlq...); window :: Int=5, $(def_kwargs_symmlq...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}}
117-
start_time = time_ns()
118-
solver = SymmlqSolver(A, b; window)
119-
warm_start!(solver, $(optargs_symmlq...))
120-
elapsed_time = ktimer(start_time)
121-
timemax -= elapsed_time
122-
symmlq!(solver, $(args_symmlq...); $(kwargs_symmlq...))
123-
solver.stats.timer += elapsed_time
124-
return (solver.x, solver.stats)
125-
end
126-
127-
function symmlq($(def_args_symmlq...); window :: Int=5, $(def_kwargs_symmlq...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}}
128-
start_time = time_ns()
129-
solver = SymmlqSolver(A, b; window)
130-
elapsed_time = ktimer(start_time)
131-
timemax -= elapsed_time
132-
symmlq!(solver, $(args_symmlq...); $(kwargs_symmlq...))
133-
solver.stats.timer += elapsed_time
134-
return (solver.x, solver.stats)
135-
end
136-
137116
function symmlq!(solver :: SymmlqSolver{T,FC,S}, $(def_args_symmlq...); $(def_kwargs_symmlq...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}, S <: AbstractVector{FC}}
138117

139118
# Timer

0 commit comments

Comments
 (0)