Skip to content

Commit 04b6ffe

Browse files
committed
Cholesky R
1 parent 186a218 commit 04b6ffe

File tree

3 files changed

+37
-3
lines changed

3 files changed

+37
-3
lines changed

src/banded/tridiagonalconjugation.jl

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ end
3131

3232
initiate_upper_mul_tri_triview!(UX, U::UpperTriangular, X) = initiate_upper_mul_tri_triview!(UX, parent(U), X)
3333
initiate_upper_mul_tri_triview!(UX, U::CachedMatrix, X) = initiate_upper_mul_tri_triview!(UX, U.data, X)
34+
initiate_upper_mul_tri_triview!(UX, U::AdaptiveCholeskyFactors, X) = initiate_upper_mul_tri_triview!(UX, U.data.data, X)
3435

3536
function initiate_upper_mul_tri_triview!(UX, U::BandedMatrix, X)
3637
Xdl, Xd, Xdu = X.dl, X.d, X.du
@@ -50,7 +51,9 @@ function initiate_upper_mul_tri_triview!(UX, U::BandedMatrix, X)
5051
end
5152

5253
# fills in the rows kr of UX
53-
function main_upper_mul_tri_triview!(UX, U::CachedMatrix, X, kr, kwds...)
54+
main_upper_mul_tri_triview!(UX, U::UpperTriangular, X, kr, kwds...) = main_upper_mul_tri_triview!(UX, parent(U), X, kr, kwds...)
55+
56+
function main_upper_mul_tri_triview!(UX, U::Union{CachedMatrix,AdaptiveCholeskyFactors}, X, kr, kwds...)
5457
resizedata!(U, kr[end], kr[end]+2)
5558
main_upper_mul_tri_triview!(UX, U.data, X, kr, kwds...)
5659
end
@@ -125,6 +128,13 @@ function initiate_tri_mul_invupper_triview!(Y, X, R::CachedMatrix)
125128
initiate_tri_mul_invupper_triview!(Y, X, R.data)
126129
end
127130

131+
function initiate_tri_mul_invupper_triview!(Y, X, R::AdaptiveCholeskyFactors)
132+
resizedata!(R, 1, 2)
133+
initiate_tri_mul_invupper_triview!(Y, X, R.data.data)
134+
end
135+
136+
initiate_tri_mul_invupper_triview!(Y, X, R::UpperTriangular) = initiate_tri_mul_invupper_triview!(Y, X, parent(R))
137+
128138
function initiate_tri_mul_invupper_triview!(Y, X, R::BandedMatrix)
129139
Xdl, Xd, Xdu = X.dl, X.d, X.du
130140
Ydl, Yd, Ydu = Y.dl, Y.d, Y.du
@@ -144,7 +154,8 @@ end
144154

145155

146156
# populate rows kr of X/R. Ydu[k] is wrong until next run.
147-
function main_tri_mul_invupper_triview!(Y::Tridiagonal, X::Tridiagonal, R::CachedMatrix, kr, kwds...)
157+
main_tri_mul_invupper_triview!(Y::Tridiagonal, X::Tridiagonal, R::UpperTriangular, kr, kwds...) = main_tri_mul_invupper_triview!(Y, X, parent(R), kr, kwds...)
158+
function main_tri_mul_invupper_triview!(Y::Tridiagonal, X::Tridiagonal, R::Union{AdaptiveCholeskyFactors,CachedMatrix}, kr, kwds...)
148159
resizedata!(R, kr[end], kr[end]+1)
149160
main_tri_mul_invupper_triview!(Y, X, R.data, kr, kwds...)
150161
end

src/infcholesky.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ function partialcholesky!(F::AdaptiveCholeskyFactors{T,<:BandedMatrix}, n::Int)
4141
F
4242
end
4343

44+
resizedata!(F::AdaptiveCholeskyFactors, m, n) = partialcholesky!(F, n) # support cache interface
45+
46+
resizedata!(R::UpperTriangular{<:Any,<:AdaptiveCholeskyFactors}, m...) = resizedata!(parent(R), m...)
47+
4448
function getindex(F::AdaptiveCholeskyFactors, k::Int, j::Int)
4549
partialcholesky!(F, max(k,j))
4650
F.data.data[k,j]

test/test_bidiagonalconjugation.jl

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,25 @@ end
156156
M = Symmetric(_BandedMatrix(Vcat(Hcat(Fill(-1/(2sqrt(2)),1,3), Fill(-1/4,1,∞)), Zeros(1,∞), Hcat([0.5 0.25], Fill(0.5,1,∞))), ∞, 0, 2))
157157
R = cholesky(M).U
158158
X_T = LazyBandedMatrices.Tridiagonal(Vcat(1/sqrt(2), Fill(1/2,∞)), Zeros(∞), Vcat(1/sqrt(2), Fill(1/2,∞)))
159-
data = InfiniteLinearAlgebra.TridiagonalConjugationData(R, X_T)
159+
data = InfiniteLinearAlgebra.TridiagonalConjugationData(R, X_T);
160+
n = 1000
161+
@time U = V = R[1:n,1:n];
162+
@time X = Tridiagonal(Vector(X_T.dl[1:n-1]), Vector(X_T.d[1:n]), Vector(X_T.du[1:n-1]));
163+
UX = Tridiagonal(U*X)
164+
Y = Tridiagonal(UX / U)
165+
@test data.UX[1,:] UX[1,1:100]
166+
InfiniteLinearAlgebra.resizedata!(data, 1)
167+
@test data.UX[1:2,:] UX[1:2,1:100]
168+
@test data.Y[1,:] Y[1,1:100]
169+
InfiniteLinearAlgebra.resizedata!(data, 2)
170+
@test data.UX[1:3,:] UX[1:3,1:100]
171+
@test data.Y[1:2,:] Y[1:2,1:100]
172+
InfiniteLinearAlgebra.resizedata!(data, 3)
173+
@test data.UX[1:4,:] UX[1:4,1:100]
174+
@test data.Y[1:3,:] Y[1:3,1:100]
175+
InfiniteLinearAlgebra.resizedata!(data, 1000)
176+
@test data.UX[1:999,1:999] UX[1:999,1:999]
177+
@test data.Y[1:999,1:999] Y[1:999,1:999]
178+
160179
end
161180
end

0 commit comments

Comments
 (0)