Skip to content

Commit 90e617c

Browse files
committed
Use metaprogramming to generate more out-of-place methods
1 parent a4cc680 commit 90e617c

File tree

7 files changed

+26
-127
lines changed

7 files changed

+26
-127
lines changed

src/diom.jl

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -109,27 +109,6 @@ optargs_diom = (:x0,)
109109
kwargs_diom = (:M, :N, :ldiv, :reorthogonalization, :atol, :rtol, :itmax, :timemax, :verbose, :history, :callback, :iostream)
110110

111111
@eval begin
112-
function diom($(def_args_diom...), $(def_optargs_diom...); memory :: Int=20, $(def_kwargs_diom...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}}
113-
start_time = time_ns()
114-
solver = DiomSolver(A, b, memory)
115-
warm_start!(solver, $(optargs_diom...))
116-
elapsed_time = ktimer(start_time)
117-
timemax -= elapsed_time
118-
diom!(solver, $(args_diom...); $(kwargs_diom...))
119-
solver.stats.timer += elapsed_time
120-
return (solver.x, solver.stats)
121-
end
122-
123-
function diom($(def_args_diom...); memory :: Int=20, $(def_kwargs_diom...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}}
124-
start_time = time_ns()
125-
solver = DiomSolver(A, b, memory)
126-
elapsed_time = ktimer(start_time)
127-
timemax -= elapsed_time
128-
diom!(solver, $(args_diom...); $(kwargs_diom...))
129-
solver.stats.timer += elapsed_time
130-
return (solver.x, solver.stats)
131-
end
132-
133112
function diom!(solver :: DiomSolver{T,FC,S}, $(def_args_diom...); $(def_kwargs_diom...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}, S <: AbstractVector{FC}}
134113

135114
# Timer

src/dqgmres.jl

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -109,27 +109,6 @@ optargs_dqgmres = (:x0,)
109109
kwargs_dqgmres = (:M, :N, :ldiv, :reorthogonalization, :atol, :rtol, :itmax, :timemax, :verbose, :history, :callback, :iostream)
110110

111111
@eval begin
112-
function dqgmres($(def_args_dqgmres...), $(def_optargs_dqgmres...); memory :: Int=20, $(def_kwargs_dqgmres...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}}
113-
start_time = time_ns()
114-
solver = DqgmresSolver(A, b, memory)
115-
warm_start!(solver, $(optargs_dqgmres...))
116-
elapsed_time = ktimer(start_time)
117-
timemax -= elapsed_time
118-
dqgmres!(solver, $(args_dqgmres...); $(kwargs_dqgmres...))
119-
solver.stats.timer += elapsed_time
120-
return (solver.x, solver.stats)
121-
end
122-
123-
function dqgmres($(def_args_dqgmres...); memory :: Int=20, $(def_kwargs_dqgmres...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}}
124-
start_time = time_ns()
125-
solver = DqgmresSolver(A, b, memory)
126-
elapsed_time = ktimer(start_time)
127-
timemax -= elapsed_time
128-
dqgmres!(solver, $(args_dqgmres...); $(kwargs_dqgmres...))
129-
solver.stats.timer += elapsed_time
130-
return (solver.x, solver.stats)
131-
end
132-
133112
function dqgmres!(solver :: DqgmresSolver{T,FC,S}, $(def_args_dqgmres...); $(def_kwargs_dqgmres...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}, S <: AbstractVector{FC}}
134113

135114
# Timer

src/fgmres.jl

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -112,27 +112,6 @@ optargs_fgmres = (:x0,)
112112
kwargs_fgmres = (:M, :N, :ldiv, :restart, :reorthogonalization, :atol, :rtol, :itmax, :timemax, :verbose, :history, :callback, :iostream)
113113

114114
@eval begin
115-
function fgmres($(def_args_fgmres...), $(def_optargs_fgmres...); memory :: Int=20, $(def_kwargs_fgmres...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}}
116-
start_time = time_ns()
117-
solver = FgmresSolver(A, b, memory)
118-
warm_start!(solver, $(optargs_fgmres...))
119-
elapsed_time = ktimer(start_time)
120-
timemax -= elapsed_time
121-
fgmres!(solver, $(args_fgmres...); $(kwargs_fgmres...))
122-
solver.stats.timer += elapsed_time
123-
return (solver.x, solver.stats)
124-
end
125-
126-
function fgmres($(def_args_fgmres...); memory :: Int=20, $(def_kwargs_fgmres...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}}
127-
start_time = time_ns()
128-
solver = FgmresSolver(A, b, memory)
129-
elapsed_time = ktimer(start_time)
130-
timemax -= elapsed_time
131-
fgmres!(solver, $(args_fgmres...); $(kwargs_fgmres...))
132-
solver.stats.timer += elapsed_time
133-
return (solver.x, solver.stats)
134-
end
135-
136115
function fgmres!(solver :: FgmresSolver{T,FC,S}, $(def_args_fgmres...); $(def_kwargs_fgmres...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}, S <: AbstractVector{FC}}
137116

138117
# Timer

src/fom.jl

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -105,27 +105,6 @@ optargs_fom = (:x0,)
105105
kwargs_fom = (:M, :N, :ldiv, :restart, :reorthogonalization, :atol, :rtol, :itmax, :timemax, :verbose, :history, :callback, :iostream)
106106

107107
@eval begin
108-
function fom($(def_args_fom...), $(def_optargs_fom...); memory :: Int=20, $(def_kwargs_fom...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}}
109-
start_time = time_ns()
110-
solver = FomSolver(A, b, memory)
111-
warm_start!(solver, $(optargs_fom...))
112-
elapsed_time = ktimer(start_time)
113-
timemax -= elapsed_time
114-
fom!(solver, $(args_fom...); $(kwargs_fom...))
115-
solver.stats.timer += elapsed_time
116-
return (solver.x, solver.stats)
117-
end
118-
119-
function fom($(def_args_fom...); memory :: Int=20, $(def_kwargs_fom...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}}
120-
start_time = time_ns()
121-
solver = FomSolver(A, b, memory)
122-
elapsed_time = ktimer(start_time)
123-
timemax -= elapsed_time
124-
fom!(solver, $(args_fom...); $(kwargs_fom...))
125-
solver.stats.timer += elapsed_time
126-
return (solver.x, solver.stats)
127-
end
128-
129108
function fom!(solver :: FomSolver{T,FC,S}, $(def_args_fom...); $(def_kwargs_fom...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}, S <: AbstractVector{FC}}
130109

131110
# Timer

src/gmres.jl

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -105,27 +105,6 @@ optargs_gmres = (:x0,)
105105
kwargs_gmres = (:M, :N, :ldiv, :restart, :reorthogonalization, :atol, :rtol, :itmax, :timemax, :verbose, :history, :callback, :iostream)
106106

107107
@eval begin
108-
function gmres($(def_args_gmres...), $(def_optargs_gmres...); memory :: Int=20, $(def_kwargs_gmres...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}}
109-
start_time = time_ns()
110-
solver = GmresSolver(A, b, memory)
111-
warm_start!(solver, $(optargs_gmres...))
112-
elapsed_time = ktimer(start_time)
113-
timemax -= elapsed_time
114-
gmres!(solver, $(args_gmres...); $(kwargs_gmres...))
115-
solver.stats.timer += elapsed_time
116-
return (solver.x, solver.stats)
117-
end
118-
119-
function gmres($(def_args_gmres...); memory :: Int=20, $(def_kwargs_gmres...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}}
120-
start_time = time_ns()
121-
solver = GmresSolver(A, b, memory)
122-
elapsed_time = ktimer(start_time)
123-
timemax -= elapsed_time
124-
gmres!(solver, $(args_gmres...); $(kwargs_gmres...))
125-
solver.stats.timer += elapsed_time
126-
return (solver.x, solver.stats)
127-
end
128-
129108
function gmres!(solver :: GmresSolver{T,FC,S}, $(def_args_gmres...); $(def_kwargs_gmres...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}, S <: AbstractVector{FC}}
130109

131110
# Timer

src/gpmr.jl

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -148,27 +148,6 @@ optargs_gpmr = (:x0, :y0)
148148
kwargs_gpmr = (:C, :D, :E, :F, :ldiv, :gsp, , , :reorthogonalization, :atol, :rtol, :itmax, :timemax, :verbose, :history, :callback, :iostream)
149149

150150
@eval begin
151-
function gpmr($(def_args_gpmr...), $(def_optargs_gpmr...); memory :: Int=20, $(def_kwargs_gpmr...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}}
152-
start_time = time_ns()
153-
solver = GpmrSolver(A, b, memory)
154-
warm_start!(solver, $(optargs_gpmr...))
155-
elapsed_time = ktimer(start_time)
156-
timemax -= elapsed_time
157-
gpmr!(solver, $(args_gpmr...); $(kwargs_gpmr...))
158-
solver.stats.timer += elapsed_time
159-
return (solver.x, solver.y, solver.stats)
160-
end
161-
162-
function gpmr($(def_args_gpmr...); memory :: Int=20, $(def_kwargs_gpmr...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}}
163-
start_time = time_ns()
164-
solver = GpmrSolver(A, b, memory)
165-
elapsed_time = ktimer(start_time)
166-
timemax -= elapsed_time
167-
gpmr!(solver, $(args_gpmr...); $(kwargs_gpmr...))
168-
solver.stats.timer += elapsed_time
169-
return (solver.x, solver.y, solver.stats)
170-
end
171-
172151
function gpmr!(solver :: GpmrSolver{T,FC,S}, $(def_args_gpmr...); $(def_kwargs_gpmr...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}, S <: AbstractVector{FC}}
173152

174153
# Timer

src/krylov_solve.jl

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ for (KS, fun, fun2, args, def_args, optargs, def_optargs, kwargs, def_kwargs) in
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
]
4747
# window :: 5 -> lslq, lsmr, lsqr, minres, symmlq
48-
# memory :: 20 -> diom, dqgmres, fom, gmres, fgmres, gpmr
4948
if fun2 in (:cg_lanczos_shift, :cgls_lanczos_shift)
5049
@eval begin
5150
## Out-of-place
@@ -60,6 +59,32 @@ for (KS, fun, fun2, args, def_args, optargs, def_optargs, kwargs, def_kwargs) in
6059
return results(solver)
6160
end
6261
end
62+
elseif fun2 in (:diom, :dqgmres, :fom, :gmres, :fgmres, :gpmr)
63+
@eval begin
64+
## Out-of-place
65+
function $(fun2)($(def_args...); memory::Int=20, $(def_kwargs...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}}
66+
start_time = time_ns()
67+
solver = $KS(A, b, memory)
68+
elapsed_time = ktimer(start_time)
69+
timemax -= elapsed_time
70+
$(fun)(solver, $(args...); $(kwargs...))
71+
solver.stats.timer += elapsed_time
72+
return results(solver)
73+
end
74+
75+
if !isempty($optargs)
76+
function $(fun2)($(def_args...), $(def_optargs...); memory::Int=20, $(def_kwargs...)) where {T <: AbstractFloat, FC <: FloatOrComplex{T}}
77+
start_time = time_ns()
78+
solver = $KS(A, b, memory)
79+
warm_start!(solver, $(optargs...))
80+
elapsed_time = ktimer(start_time)
81+
timemax -= elapsed_time
82+
$(fun)(solver, $(args...); $(kwargs...))
83+
solver.stats.timer += elapsed_time
84+
return results(solver)
85+
end
86+
end
87+
end
6388
elseif fun2 (:cg_lanczos_shift, :cgls_lanczos_shift, :lslq, :lsmr, :lsqr, :minres, :symmlq, :diom, :dqgmres, :fom, :gmres, :fgmres, :gpmr)
6489
@eval begin
6590
## Out-of-place

0 commit comments

Comments
 (0)