@@ -39,7 +39,7 @@ Base.iterate(C::ReverseCholesky, ::Val{:U}) = (C.L, Val(:done))
39
39
Base. iterate (C:: ReverseCholesky , :: Val{:done} ) = nothing
40
40
41
41
# # Non BLAS/LAPACK element types (generic)
42
- function _reverse_chol! ( A:: AbstractMatrix , :: Type{UpperTriangular} )
42
+ function reversecholesky_layout! (_, A:: AbstractMatrix , :: Type{UpperTriangular} )
43
43
require_one_based_indexing (A)
44
44
n = checksquare (A)
45
45
realdiag = eltype (A) <: Complex
@@ -52,7 +52,7 @@ function _reverse_chol!(A::AbstractMatrix, ::Type{UpperTriangular})
52
52
Akk -= realdiag ? abs2 (A[k,j]) : A[k,j]' A[k,j]
53
53
end
54
54
A[k,k] = Akk
55
- Akk, info = _reverse_chol! ( Akk, UpperTriangular)
55
+ Akk, info = reversecholesky_layout! ( MemoryLayout (Akk), Akk, UpperTriangular)
56
56
if info != 0
57
57
return UpperTriangular (A), info
58
58
end
@@ -72,7 +72,7 @@ function _reverse_chol!(A::AbstractMatrix, ::Type{UpperTriangular})
72
72
return UpperTriangular (A), convert (BlasInt, 0 )
73
73
end
74
74
75
- function _reverse_chol! ( A:: AbstractMatrix , :: Type{LowerTriangular} )
75
+ function reversecholesky_layout! (_, A:: AbstractMatrix , :: Type{LowerTriangular} )
76
76
require_one_based_indexing (A)
77
77
n = checksquare (A)
78
78
realdiag = eltype (A) <: Complex
@@ -85,7 +85,7 @@ function _reverse_chol!(A::AbstractMatrix, ::Type{LowerTriangular})
85
85
Akk -= realdiag ? abs2 (A[i,k]) : A[i,k]' A[i,k]
86
86
end
87
87
A[k,k] = Akk
88
- Akk, info = _reverse_chol! ( Akk, LowerTriangular)
88
+ Akk, info = reversecholesky_layout! ( MemoryLayout (Akk), Akk, LowerTriangular)
89
89
if info != 0
90
90
return LowerTriangular (A), info
91
91
end
@@ -103,15 +103,15 @@ function _reverse_chol!(A::AbstractMatrix, ::Type{LowerTriangular})
103
103
end
104
104
105
105
# # Numbers
106
- _reverse_chol! ( x:: Number , uplo) = LinearAlgebra. _chol! (x, uplo)
106
+ reversecholesky_layout! (_, x:: Number , uplo) = LinearAlgebra. _chol! (x, uplo)
107
107
108
108
# # for StridedMatrices, check that matrix is symmetric/Hermitian
109
109
110
110
# cholesky!. Destructive methods for computing Cholesky factorization of real symmetric
111
111
# or Hermitian matrix
112
112
# # No pivoting (default)
113
113
function reversecholesky! (A:: RealHermSymComplexHerm , :: NoPivot = NoPivot (); check:: Bool = true )
114
- C, info = _reverse_chol! ( A. data, A. uplo == ' U' ? UpperTriangular : LowerTriangular)
114
+ C, info = reversecholesky_layout! ( MemoryLayout (A . data), A. data, A. uplo == ' U' ? UpperTriangular : LowerTriangular)
115
115
check && checkpositivedefinite (info)
116
116
return ReverseCholesky (C. data, A. uplo, info)
117
117
end
@@ -174,8 +174,10 @@ and return a [`ReverseCholesky`](@ref) factorization. The matrix `A` can either
174
174
The triangular ReverseCholesky factor can be obtained from the factorization `F` via `F.L` and `F.U`,
175
175
where `A ≈ F.U * F.U' ≈ F.L' * F.L`.
176
176
"""
177
- reversecholesky (A:: AbstractMatrix , :: NoPivot = NoPivot (); check:: Bool = true ) =
178
- reversecholesky! (reversecholcopy (A); check)
177
+ reversecholesky (A:: AbstractMatrix , piv:: NoPivot = NoPivot (); check:: Bool = true ) =
178
+ reversecholesky_layout (MemoryLayout (A), axes (A), A, piv; check)
179
+
180
+ reversecholesky_layout (lay, ax, A, piv; kwds... ) = reversecholesky! (reversecholcopy (A); kwds... )
179
181
180
182
function reversecholesky (A:: AbstractMatrix{Float16} , :: NoPivot = NoPivot (); check:: Bool = true )
181
183
X = reversecholesky! (reversecholcopy (A); check = check)
@@ -185,11 +187,12 @@ end
185
187
186
188
# # Number
187
189
function reversecholesky (x:: Number , uplo:: Symbol = :U )
188
- C, info = _reverse_chol! ( x, uplo)
190
+ C, info = reversecholesky_layout! ( MemoryLayout (x), x, uplo)
189
191
xf = fill (C, 1 , 1 )
190
192
ReverseCholesky (xf, uplo, info)
191
193
end
192
194
195
+ _reverse_chol! (A, T) = reversecholesky_layout! (MemoryLayout (A), A, T)
193
196
194
197
function ReverseCholesky {T} (C:: ReverseCholesky ) where T
195
198
Cnew = convert (AbstractMatrix{T}, C. factors)
0 commit comments