-
-
Notifications
You must be signed in to change notification settings - Fork 71
Complete BLIS integration with reference LAPACK #660
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
d647b0f
0028d9c
9c927dd
a84421a
71ab480
f75223a
95d5c40
ee8c3a2
237debc
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
@@ -16,10 +16,12 @@ the best choices, with SVD being the slowest but most precise. | |||||||||
|
||||||||||
For efficiency, `RFLUFactorization` is the fastest for dense LU-factorizations until around | ||||||||||
150x150 matrices, though this can be dependent on the exact details of the hardware. After this | ||||||||||
point, `MKLLUFactorization` is usually faster on most hardware. Note that on Mac computers | ||||||||||
that `AppleAccelerateLUFactorization` is generally always the fastest. `LUFactorization` will | ||||||||||
use your base system BLAS which can be fast or slow depending on the hardware configuration. | ||||||||||
`SimpleLUFactorization` will be fast only on very small matrices but can cut down on compile times. | ||||||||||
point, `MKLLUFactorization` is usually faster on most hardware. `BLISLUFactorization` provides | ||||||||||
another high-performance option that combines optimized BLAS operations from BLIS with optimized LAPACK routines from libflame. | ||||||||||
Note that on Mac computers that `AppleAccelerateLUFactorization` is generally always the fastest. | ||||||||||
`LUFactorization` will use your base system BLAS which can be fast or slow depending on the hardware | ||||||||||
configuration. `SimpleLUFactorization` will be fast only on very small matrices but can cut down on | ||||||||||
compile times. | ||||||||||
|
||||||||||
For very large dense factorizations, offloading to the GPU can be preferred. Metal.jl can be used | ||||||||||
on Mac hardware to offload, and has a cutoff point of being faster at around size 20,000 x 20,000 | ||||||||||
|
@@ -185,6 +187,18 @@ KrylovJL | |||||||||
MKLLUFactorization | ||||||||||
``` | ||||||||||
|
||||||||||
### BLIS.jl | ||||||||||
|
||||||||||
!!! note | ||||||||||
|
||||||||||
Using this solver requires that both blis_jll and libflame_jll packages are available. | ||||||||||
The solver will be automatically available when both packages are loaded, i.e., | ||||||||||
Comment on lines
+194
to
+195
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [JuliaFormatter] reported by reviewdog 🐶
Suggested change
|
||||||||||
`using blis_jll, libflame_jll`. | ||||||||||
|
||||||||||
```@docs | ||||||||||
BLISLUFactorization | ||||||||||
``` | ||||||||||
|
||||||||||
### AppleAccelerate.jl | ||||||||||
|
||||||||||
!!! note | ||||||||||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,278 @@ | ||||||||||||||||||||
""" | ||||||||||||||||||||
LinearSolveBLISExt | ||||||||||||||||||||
|
||||||||||||||||||||
Extension module that provides BLIS (BLAS-like Library Instantiation Software) integration | ||||||||||||||||||||
for LinearSolve.jl. This extension combines BLIS for optimized BLAS operations with | ||||||||||||||||||||
libflame for optimized LAPACK operations, providing a fully optimized linear algebra | ||||||||||||||||||||
Comment on lines
+5
to
+6
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [JuliaFormatter] reported by reviewdog 🐶
Suggested change
|
||||||||||||||||||||
backend. | ||||||||||||||||||||
|
||||||||||||||||||||
Key features: | ||||||||||||||||||||
- Uses BLIS for BLAS operations (matrix multiplication, etc.) | ||||||||||||||||||||
- Uses libflame for LAPACK operations (LU factorization, solve, etc.) | ||||||||||||||||||||
- Supports all standard numeric types (Float32/64, ComplexF32/64) | ||||||||||||||||||||
- Follows MKL-style ccall patterns for consistency | ||||||||||||||||||||
Comment on lines
+10
to
+13
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [JuliaFormatter] reported by reviewdog 🐶
Suggested change
|
||||||||||||||||||||
""" | ||||||||||||||||||||
module LinearSolveBLISExt | ||||||||||||||||||||
|
||||||||||||||||||||
using Libdl | ||||||||||||||||||||
using blis_jll | ||||||||||||||||||||
using libflame_jll | ||||||||||||||||||||
using LinearAlgebra | ||||||||||||||||||||
using LinearSolve | ||||||||||||||||||||
|
||||||||||||||||||||
using LinearAlgebra: BlasInt, LU, libblastrampoline | ||||||||||||||||||||
using LinearAlgebra.LAPACK: require_one_based_indexing, chkfinite, chkstride1, | ||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [JuliaFormatter] reported by reviewdog 🐶
Suggested change
|
||||||||||||||||||||
@blasfunc, chkargsok | ||||||||||||||||||||
using LinearSolve: ArrayInterface, BLISLUFactorization, @get_cacheval, LinearCache, SciMLBase, do_factorization | ||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [JuliaFormatter] reported by reviewdog 🐶
Suggested change
|
||||||||||||||||||||
|
||||||||||||||||||||
const global libblis = blis_jll.blis | ||||||||||||||||||||
const global libflame = libflame_jll.libflame | ||||||||||||||||||||
|
||||||||||||||||||||
""" | ||||||||||||||||||||
LinearSolve.do_factorization(alg::BLISLUFactorization, A, b, u) | ||||||||||||||||||||
|
||||||||||||||||||||
Perform LU factorization using BLIS for the underlying BLAS operations. | ||||||||||||||||||||
This method converts the matrix to a standard format and calls the BLIS-backed getrf! routine. | ||||||||||||||||||||
""" | ||||||||||||||||||||
function LinearSolve.do_factorization(alg::BLISLUFactorization, A, b, u) | ||||||||||||||||||||
A = convert(AbstractMatrix, A) | ||||||||||||||||||||
ipiv = similar(A, BlasInt, min(size(A, 1), size(A, 2))) | ||||||||||||||||||||
info = Ref{BlasInt}() | ||||||||||||||||||||
A, ipiv, info_val, info_ref = getrf!(A; ipiv=ipiv, info=info) | ||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [JuliaFormatter] reported by reviewdog 🐶
Suggested change
|
||||||||||||||||||||
return LU(A, ipiv, info_val) | ||||||||||||||||||||
end | ||||||||||||||||||||
|
||||||||||||||||||||
function getrf!(A::AbstractMatrix{<:ComplexF64}; | ||||||||||||||||||||
ipiv = similar(A, BlasInt, min(size(A, 1), size(A, 2))), | ||||||||||||||||||||
info = Ref{BlasInt}(), | ||||||||||||||||||||
check = false) | ||||||||||||||||||||
Comment on lines
+46
to
+48
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [JuliaFormatter] reported by reviewdog 🐶
Suggested change
|
||||||||||||||||||||
require_one_based_indexing(A) | ||||||||||||||||||||
check && chkfinite(A) | ||||||||||||||||||||
chkstride1(A) | ||||||||||||||||||||
m, n = size(A) | ||||||||||||||||||||
lda = max(1, stride(A, 2)) | ||||||||||||||||||||
if isempty(ipiv) | ||||||||||||||||||||
ipiv = similar(A, BlasInt, min(size(A, 1), size(A, 2))) | ||||||||||||||||||||
end | ||||||||||||||||||||
ccall(("zgetrf_", libflame), Cvoid, | ||||||||||||||||||||
(Ref{BlasInt}, Ref{BlasInt}, Ptr{ComplexF64}, | ||||||||||||||||||||
Ref{BlasInt}, Ptr{BlasInt}, Ptr{BlasInt}), | ||||||||||||||||||||
m, n, A, lda, ipiv, info) | ||||||||||||||||||||
chkargsok(info[]) | ||||||||||||||||||||
A, ipiv, info[], info #Error code is stored in LU factorization type | ||||||||||||||||||||
end | ||||||||||||||||||||
|
||||||||||||||||||||
function getrf!(A::AbstractMatrix{<:ComplexF32}; | ||||||||||||||||||||
ipiv = similar(A, BlasInt, min(size(A, 1), size(A, 2))), | ||||||||||||||||||||
info = Ref{BlasInt}(), | ||||||||||||||||||||
check = false) | ||||||||||||||||||||
Comment on lines
+66
to
+68
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [JuliaFormatter] reported by reviewdog 🐶
Suggested change
|
||||||||||||||||||||
require_one_based_indexing(A) | ||||||||||||||||||||
check && chkfinite(A) | ||||||||||||||||||||
chkstride1(A) | ||||||||||||||||||||
m, n = size(A) | ||||||||||||||||||||
lda = max(1, stride(A, 2)) | ||||||||||||||||||||
if isempty(ipiv) | ||||||||||||||||||||
ipiv = similar(A, BlasInt, min(size(A, 1), size(A, 2))) | ||||||||||||||||||||
end | ||||||||||||||||||||
ccall(("cgetrf_", libflame), Cvoid, | ||||||||||||||||||||
(Ref{BlasInt}, Ref{BlasInt}, Ptr{ComplexF32}, | ||||||||||||||||||||
Ref{BlasInt}, Ptr{BlasInt}, Ptr{BlasInt}), | ||||||||||||||||||||
m, n, A, lda, ipiv, info) | ||||||||||||||||||||
chkargsok(info[]) | ||||||||||||||||||||
A, ipiv, info[], info #Error code is stored in LU factorization type | ||||||||||||||||||||
end | ||||||||||||||||||||
|
||||||||||||||||||||
function getrf!(A::AbstractMatrix{<:Float64}; | ||||||||||||||||||||
ipiv = similar(A, BlasInt, min(size(A, 1), size(A, 2))), | ||||||||||||||||||||
info = Ref{BlasInt}(), | ||||||||||||||||||||
check = false) | ||||||||||||||||||||
Comment on lines
+86
to
+88
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [JuliaFormatter] reported by reviewdog 🐶
Suggested change
|
||||||||||||||||||||
require_one_based_indexing(A) | ||||||||||||||||||||
check && chkfinite(A) | ||||||||||||||||||||
chkstride1(A) | ||||||||||||||||||||
m, n = size(A) | ||||||||||||||||||||
lda = max(1, stride(A, 2)) | ||||||||||||||||||||
if isempty(ipiv) | ||||||||||||||||||||
ipiv = similar(A, BlasInt, min(size(A, 1), size(A, 2))) | ||||||||||||||||||||
end | ||||||||||||||||||||
ccall(("dgetrf_", libflame), Cvoid, | ||||||||||||||||||||
(Ref{BlasInt}, Ref{BlasInt}, Ptr{Float64}, | ||||||||||||||||||||
Ref{BlasInt}, Ptr{BlasInt}, Ptr{BlasInt}), | ||||||||||||||||||||
m, n, A, lda, ipiv, info) | ||||||||||||||||||||
chkargsok(info[]) | ||||||||||||||||||||
A, ipiv, info[], info #Error code is stored in LU factorization type | ||||||||||||||||||||
end | ||||||||||||||||||||
|
||||||||||||||||||||
function getrf!(A::AbstractMatrix{<:Float32}; | ||||||||||||||||||||
ipiv = similar(A, BlasInt, min(size(A, 1), size(A, 2))), | ||||||||||||||||||||
info = Ref{BlasInt}(), | ||||||||||||||||||||
check = false) | ||||||||||||||||||||
Comment on lines
+106
to
+108
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [JuliaFormatter] reported by reviewdog 🐶
Suggested change
|
||||||||||||||||||||
require_one_based_indexing(A) | ||||||||||||||||||||
check && chkfinite(A) | ||||||||||||||||||||
chkstride1(A) | ||||||||||||||||||||
m, n = size(A) | ||||||||||||||||||||
lda = max(1, stride(A, 2)) | ||||||||||||||||||||
if isempty(ipiv) | ||||||||||||||||||||
ipiv = similar(A, BlasInt, min(size(A, 1), size(A, 2))) | ||||||||||||||||||||
end | ||||||||||||||||||||
ccall(("sgetrf_", libflame), Cvoid, | ||||||||||||||||||||
(Ref{BlasInt}, Ref{BlasInt}, Ptr{Float32}, | ||||||||||||||||||||
Ref{BlasInt}, Ptr{BlasInt}, Ptr{BlasInt}), | ||||||||||||||||||||
m, n, A, lda, ipiv, info) | ||||||||||||||||||||
chkargsok(info[]) | ||||||||||||||||||||
A, ipiv, info[], info #Error code is stored in LU factorization type | ||||||||||||||||||||
end | ||||||||||||||||||||
|
||||||||||||||||||||
function getrs!(trans::AbstractChar, | ||||||||||||||||||||
A::AbstractMatrix{<:ComplexF64}, | ||||||||||||||||||||
ipiv::AbstractVector{BlasInt}, | ||||||||||||||||||||
B::AbstractVecOrMat{<:ComplexF64}; | ||||||||||||||||||||
info = Ref{BlasInt}()) | ||||||||||||||||||||
Comment on lines
+126
to
+129
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [JuliaFormatter] reported by reviewdog 🐶
Suggested change
|
||||||||||||||||||||
require_one_based_indexing(A, ipiv, B) | ||||||||||||||||||||
LinearAlgebra.LAPACK.chktrans(trans) | ||||||||||||||||||||
chkstride1(A, B, ipiv) | ||||||||||||||||||||
n = LinearAlgebra.checksquare(A) | ||||||||||||||||||||
if n != size(B, 1) | ||||||||||||||||||||
throw(DimensionMismatch("B has leading dimension $(size(B,1)), but needs $n")) | ||||||||||||||||||||
end | ||||||||||||||||||||
if n != length(ipiv) | ||||||||||||||||||||
throw(DimensionMismatch("ipiv has length $(length(ipiv)), but needs to be $n")) | ||||||||||||||||||||
end | ||||||||||||||||||||
nrhs = size(B, 2) | ||||||||||||||||||||
ccall((@blasfunc(zgetrs_), libblis), Cvoid, | ||||||||||||||||||||
(Ref{UInt8}, Ref{BlasInt}, Ref{BlasInt}, Ptr{ComplexF64}, Ref{BlasInt}, | ||||||||||||||||||||
Ptr{BlasInt}, Ptr{ComplexF64}, Ref{BlasInt}, Ptr{BlasInt}, Clong), | ||||||||||||||||||||
trans, n, size(B, 2), A, max(1, stride(A, 2)), ipiv, B, max(1, stride(B, 2)), info, | ||||||||||||||||||||
1) | ||||||||||||||||||||
LinearAlgebra.LAPACK.chklapackerror(BlasInt(info[])) | ||||||||||||||||||||
B | ||||||||||||||||||||
end | ||||||||||||||||||||
|
||||||||||||||||||||
function getrs!(trans::AbstractChar, | ||||||||||||||||||||
A::AbstractMatrix{<:ComplexF32}, | ||||||||||||||||||||
ipiv::AbstractVector{BlasInt}, | ||||||||||||||||||||
B::AbstractVecOrMat{<:ComplexF32}; | ||||||||||||||||||||
info = Ref{BlasInt}()) | ||||||||||||||||||||
Comment on lines
+151
to
+154
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [JuliaFormatter] reported by reviewdog 🐶
Suggested change
|
||||||||||||||||||||
require_one_based_indexing(A, ipiv, B) | ||||||||||||||||||||
LinearAlgebra.LAPACK.chktrans(trans) | ||||||||||||||||||||
chkstride1(A, B, ipiv) | ||||||||||||||||||||
n = LinearAlgebra.checksquare(A) | ||||||||||||||||||||
if n != size(B, 1) | ||||||||||||||||||||
throw(DimensionMismatch("B has leading dimension $(size(B,1)), but needs $n")) | ||||||||||||||||||||
end | ||||||||||||||||||||
if n != length(ipiv) | ||||||||||||||||||||
throw(DimensionMismatch("ipiv has length $(length(ipiv)), but needs to be $n")) | ||||||||||||||||||||
end | ||||||||||||||||||||
nrhs = size(B, 2) | ||||||||||||||||||||
ccall((@blasfunc(cgetrs_), libblis), Cvoid, | ||||||||||||||||||||
(Ref{UInt8}, Ref{BlasInt}, Ref{BlasInt}, Ptr{ComplexF32}, Ref{BlasInt}, | ||||||||||||||||||||
Ptr{BlasInt}, Ptr{ComplexF32}, Ref{BlasInt}, Ptr{BlasInt}, Clong), | ||||||||||||||||||||
trans, n, size(B, 2), A, max(1, stride(A, 2)), ipiv, B, max(1, stride(B, 2)), info, | ||||||||||||||||||||
1) | ||||||||||||||||||||
LinearAlgebra.LAPACK.chklapackerror(BlasInt(info[])) | ||||||||||||||||||||
B | ||||||||||||||||||||
end | ||||||||||||||||||||
|
||||||||||||||||||||
function getrs!(trans::AbstractChar, | ||||||||||||||||||||
A::AbstractMatrix{<:Float64}, | ||||||||||||||||||||
ipiv::AbstractVector{BlasInt}, | ||||||||||||||||||||
B::AbstractVecOrMat{<:Float64}; | ||||||||||||||||||||
info = Ref{BlasInt}()) | ||||||||||||||||||||
Comment on lines
+176
to
+179
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [JuliaFormatter] reported by reviewdog 🐶
Suggested change
|
||||||||||||||||||||
require_one_based_indexing(A, ipiv, B) | ||||||||||||||||||||
LinearAlgebra.LAPACK.chktrans(trans) | ||||||||||||||||||||
chkstride1(A, B, ipiv) | ||||||||||||||||||||
n = LinearAlgebra.checksquare(A) | ||||||||||||||||||||
if n != size(B, 1) | ||||||||||||||||||||
throw(DimensionMismatch("B has leading dimension $(size(B,1)), but needs $n")) | ||||||||||||||||||||
end | ||||||||||||||||||||
if n != length(ipiv) | ||||||||||||||||||||
throw(DimensionMismatch("ipiv has length $(length(ipiv)), but needs to be $n")) | ||||||||||||||||||||
end | ||||||||||||||||||||
nrhs = size(B, 2) | ||||||||||||||||||||
ccall((@blasfunc(dgetrs_), libblis), Cvoid, | ||||||||||||||||||||
(Ref{UInt8}, Ref{BlasInt}, Ref{BlasInt}, Ptr{Float64}, Ref{BlasInt}, | ||||||||||||||||||||
Ptr{BlasInt}, Ptr{Float64}, Ref{BlasInt}, Ptr{BlasInt}, Clong), | ||||||||||||||||||||
trans, n, size(B, 2), A, max(1, stride(A, 2)), ipiv, B, max(1, stride(B, 2)), info, | ||||||||||||||||||||
1) | ||||||||||||||||||||
LinearAlgebra.LAPACK.chklapackerror(BlasInt(info[])) | ||||||||||||||||||||
B | ||||||||||||||||||||
end | ||||||||||||||||||||
|
||||||||||||||||||||
function getrs!(trans::AbstractChar, | ||||||||||||||||||||
A::AbstractMatrix{<:Float32}, | ||||||||||||||||||||
ipiv::AbstractVector{BlasInt}, | ||||||||||||||||||||
B::AbstractVecOrMat{<:Float32}; | ||||||||||||||||||||
info = Ref{BlasInt}()) | ||||||||||||||||||||
Comment on lines
+201
to
+204
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [JuliaFormatter] reported by reviewdog 🐶
Suggested change
|
||||||||||||||||||||
require_one_based_indexing(A, ipiv, B) | ||||||||||||||||||||
LinearAlgebra.LAPACK.chktrans(trans) | ||||||||||||||||||||
chkstride1(A, B, ipiv) | ||||||||||||||||||||
n = LinearAlgebra.checksquare(A) | ||||||||||||||||||||
if n != size(B, 1) | ||||||||||||||||||||
throw(DimensionMismatch("B has leading dimension $(size(B,1)), but needs $n")) | ||||||||||||||||||||
end | ||||||||||||||||||||
if n != length(ipiv) | ||||||||||||||||||||
throw(DimensionMismatch("ipiv has length $(length(ipiv)), but needs to be $n")) | ||||||||||||||||||||
end | ||||||||||||||||||||
nrhs = size(B, 2) | ||||||||||||||||||||
ccall((@blasfunc(sgetrs_), libblis), Cvoid, | ||||||||||||||||||||
(Ref{UInt8}, Ref{BlasInt}, Ref{BlasInt}, Ptr{Float32}, Ref{BlasInt}, | ||||||||||||||||||||
Ptr{BlasInt}, Ptr{Float32}, Ref{BlasInt}, Ptr{BlasInt}, Clong), | ||||||||||||||||||||
trans, n, size(B, 2), A, max(1, stride(A, 2)), ipiv, B, max(1, stride(B, 2)), info, | ||||||||||||||||||||
1) | ||||||||||||||||||||
LinearAlgebra.LAPACK.chklapackerror(BlasInt(info[])) | ||||||||||||||||||||
B | ||||||||||||||||||||
end | ||||||||||||||||||||
|
||||||||||||||||||||
default_alias_A(::BLISLUFactorization, ::Any, ::Any) = false | ||||||||||||||||||||
default_alias_b(::BLISLUFactorization, ::Any, ::Any) = false | ||||||||||||||||||||
|
||||||||||||||||||||
const PREALLOCATED_BLIS_LU = begin | ||||||||||||||||||||
A = rand(0, 0) | ||||||||||||||||||||
luinst = ArrayInterface.lu_instance(A), Ref{BlasInt}() | ||||||||||||||||||||
end | ||||||||||||||||||||
|
||||||||||||||||||||
function LinearSolve.init_cacheval(alg::BLISLUFactorization, A, b, u, Pl, Pr, | ||||||||||||||||||||
maxiters::Int, abstol, reltol, verbose::Bool, | ||||||||||||||||||||
assumptions::OperatorAssumptions) | ||||||||||||||||||||
Comment on lines
+234
to
+235
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [JuliaFormatter] reported by reviewdog 🐶
Suggested change
|
||||||||||||||||||||
PREALLOCATED_BLIS_LU | ||||||||||||||||||||
end | ||||||||||||||||||||
|
||||||||||||||||||||
function LinearSolve.init_cacheval(alg::BLISLUFactorization, A::AbstractMatrix{<:Union{Float32,ComplexF32,ComplexF64}}, b, u, Pl, Pr, | ||||||||||||||||||||
maxiters::Int, abstol, reltol, verbose::Bool, | ||||||||||||||||||||
assumptions::OperatorAssumptions) | ||||||||||||||||||||
Comment on lines
+239
to
+241
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [JuliaFormatter] reported by reviewdog 🐶
Suggested change
|
||||||||||||||||||||
A = rand(eltype(A), 0, 0) | ||||||||||||||||||||
ArrayInterface.lu_instance(A), Ref{BlasInt}() | ||||||||||||||||||||
end | ||||||||||||||||||||
|
||||||||||||||||||||
function SciMLBase.solve!(cache::LinearCache, alg::BLISLUFactorization; | ||||||||||||||||||||
kwargs...) | ||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [JuliaFormatter] reported by reviewdog 🐶
Suggested change
|
||||||||||||||||||||
A = cache.A | ||||||||||||||||||||
A = convert(AbstractMatrix, A) | ||||||||||||||||||||
if cache.isfresh | ||||||||||||||||||||
cacheval = @get_cacheval(cache, :BLISLUFactorization) | ||||||||||||||||||||
res = getrf!(A; ipiv = cacheval[1].ipiv, info = cacheval[2]) | ||||||||||||||||||||
fact = LU(res[1:3]...), res[4] | ||||||||||||||||||||
cache.cacheval = fact | ||||||||||||||||||||
cache.isfresh = false | ||||||||||||||||||||
end | ||||||||||||||||||||
|
||||||||||||||||||||
y = ldiv!(cache.u, @get_cacheval(cache, :BLISLUFactorization)[1], cache.b) | ||||||||||||||||||||
SciMLBase.build_linear_solution(alg, y, nothing, cache) | ||||||||||||||||||||
|
||||||||||||||||||||
#= | ||||||||||||||||||||
A, info = @get_cacheval(cache, :BLISLUFactorization) | ||||||||||||||||||||
LinearAlgebra.require_one_based_indexing(cache.u, cache.b) | ||||||||||||||||||||
m, n = size(A, 1), size(A, 2) | ||||||||||||||||||||
if m > n | ||||||||||||||||||||
Bc = copy(cache.b) | ||||||||||||||||||||
getrs!('N', A.factors, A.ipiv, Bc; info) | ||||||||||||||||||||
return copyto!(cache.u, 1, Bc, 1, n) | ||||||||||||||||||||
else | ||||||||||||||||||||
copyto!(cache.u, cache.b) | ||||||||||||||||||||
getrs!('N', A.factors, A.ipiv, cache.u; info) | ||||||||||||||||||||
end | ||||||||||||||||||||
|
||||||||||||||||||||
SciMLBase.build_linear_solution(alg, cache.u, nothing, cache) | ||||||||||||||||||||
=# | ||||||||||||||||||||
end | ||||||||||||||||||||
|
||||||||||||||||||||
end | ||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [JuliaFormatter] reported by reviewdog 🐶
Suggested change
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[JuliaFormatter] reported by reviewdog 🐶