Skip to content

Commit cbb3cc5

Browse files
EdelmanJonathanChrisRackauckas
authored andcommitted
solve without !
1 parent cee9315 commit cbb3cc5

File tree

2 files changed

+17
-20
lines changed

2 files changed

+17
-20
lines changed

src/LinearSolve.jl

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ function set_p(cache, p)
3737
# @set! cache.isfresh = true
3838
end
3939

40+
function set_cacheval(cache::LinearCache,alg)
41+
if cache.isfresh
42+
@set! cache.cacheval = alg
43+
@set! cache.isfresh = false
44+
end
45+
4046
function SciMLBase.init(prob::LinearProblem, alg; kwargs...)
4147
@unpack A, b, p = prob
4248
if alg isa LUFactorization
@@ -54,20 +60,17 @@ function SciMLBase.init(prob::LinearProblem, alg; kwargs...)
5460
return cache
5561
end
5662

57-
SciMLBase.solve!(prob::LinearProblem, alg; kwargs...) = solve!(init(prob, alg; kwargs...))
58-
SciMLBase.solve!(cache) = solve!(cache, cache.alg)
63+
SciMLBase.solve(prob::LinearProblem, alg; kwargs...) = solve(init(prob, alg; kwargs...))
64+
SciMLBase.solve(cache) = solve(cache, cache.alg)
5965

6066
struct LUFactorization{P} <: AbstractLinearAlgorithm
6167
pivot::P
6268
end
6369
LUFactorization() = LUFactorization(Val(true))
6470

65-
function SciMLBase.solve!(cache::LinearCache, alg::LUFactorization)
71+
function SciMLBase.solve(cache::LinearCache, alg::LUFactorization)
6672
cache.A isa Union{AbstractMatrix, AbstractDiffEqOperator} || error("LU is not defined for $(typeof(prob.A))")
67-
if cache.isfresh
68-
@set! cache.cacheval = lu!(cache.A, alg.pivot)
69-
@set! cache.isfresh = false
70-
end
73+
set_cacheval(cache,lu!(cache.A, alg.pivot))
7174
ldiv!(cache.cacheval, cache.b)
7275
end
7376

@@ -77,12 +80,9 @@ struct QRFactorization{P} <: AbstractLinearAlgorithm
7780
end
7881
QRFactorization() = QRFactorization(Val(false), 16)
7982

80-
function SciMLBase.solve!(cache::LinearCache, alg::QRFactorization)
83+
function SciMLBase.solve(cache::LinearCache, alg::QRFactorization)
8184
cache.A isa Union{AbstractMatrix, AbstractDiffEqOperator} || error("QR is not defined for $(typeof(prob.A))")
82-
if cache.isfresh
83-
@set! cache.cacheval = qr!(cache.A.A, alg.pivot; blocksize=alg.blocksize)
84-
@set! cache.isfresh = false
85-
end
85+
set_cacheval(cache,qr!(cache.A.A, alg.pivot; blocksize=alg.blocksize))
8686
ldiv!(cache.cacheval, cache.b)
8787
end
8888

@@ -92,12 +92,9 @@ struct SVDFactorization{A} <: AbstractLinearAlgorithm
9292
end
9393
SVDFactorization() = SVDFactorization(false, LinearAlgebra.DivideAndConquer())
9494

95-
function SciMLBase.solve!(cache::LinearCache, alg::SVDFactorization)
95+
function SciMLBase.solve(cache::LinearCache, alg::SVDFactorization)
9696
cache.A isa Union{AbstractMatrix, AbstractDiffEqOperator} || error("SVD is not defined for $(typeof(prob.A))")
97-
if cache.isfresh
98-
@set! cache.cacheval = svd!(cache.A; full=alg.full, alg=alg.alg)
99-
@set! cache.isfresh = false
100-
end
97+
set_cacheval(cache,svd!(cache.A; full=alg.full, alg=alg.alg))
10198
ldiv!(cache.cacheval, cache.b)
10299
end
103100

test/runtests.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ using Test
55
A = rand(5, 5)
66
b = rand(5)
77
prob = LinearProblem(A, b)
8-
@test A * solve!(deepcopy(prob), LUFactorization()) b
9-
@test A * solve!(deepcopy(prob), QRFactorization()) b
10-
@test A * solve!(deepcopy(prob), SVDFactorization()) b
8+
@test A * solve(deepcopy(prob), LUFactorization();alias_A = false, alias_b = false) b
9+
@test A * solve(deepcopy(prob), QRFactorization();alias_A = false, alias_b = false) b
10+
@test A * solve(deepcopy(prob), SVDFactorization();alias_A = false, alias_b = false) b
1111
end

0 commit comments

Comments
 (0)