Skip to content

Commit 9cd9427

Browse files
committed
Add Sym/TridiagonalConjugation
1 parent 04b6ffe commit 9cd9427

File tree

2 files changed

+60
-16
lines changed

2 files changed

+60
-16
lines changed

src/banded/tridiagonalconjugation.jl

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ copy(data::TridiagonalConjugationData) = TridiagonalConjugationData(copy(data.U)
238238
function resizedata!(data::TridiagonalConjugationData, n)
239239
n data.datasize && return data
240240

241-
if n > length(data.UX.d) # Avoid O(n²) growing. Note min(length(dv), length(ev)) == length(ev)
241+
if n length(data.UX.dl) # Avoid O(n²) growing. Note min(length(dv), length(ev)) == length(ev)
242242
resize!(data.UX.dl, 2n)
243243
resize!(data.UX.d, 2n + 1)
244244
resize!(data.UX.du, 2n)
@@ -258,3 +258,35 @@ function resizedata!(data::TridiagonalConjugationData, n)
258258
data
259259
end
260260

261+
struct TridiagonalConjugationBand{T} <: LazyVector{T}
262+
data::TridiagonalConjugationData{T}
263+
diag::Symbol
264+
end
265+
266+
size(P::TridiagonalConjugationBand) = (ℵ₀,)
267+
resizedata!(A::TridiagonalConjugationBand, n) = resizedata!(A.data, n)
268+
269+
function _triconj_getindex(C::TridiagonalConjugationBand, I)
270+
resizedata!(C, maximum(I)+1)
271+
getfield(C.data.Y, C.diag)[I]
272+
end
273+
274+
getindex(A::TridiagonalConjugationBand, I::Integer) = _triconj_getindex(A, I)
275+
getindex(A::TridiagonalConjugationBand, I::AbstractVector) = _triconj_getindex(A, I)
276+
getindex(K::TridiagonalConjugationBand, k::AbstractInfUnitRange{<:Integer}) = view(K, k)
277+
getindex(K::SubArray{<:Any,1,<:TridiagonalConjugationBand}, k::AbstractInfUnitRange{<:Integer}) = view(K, k)
278+
279+
copy(A::TridiagonalConjugationBand) = A # immutable
280+
281+
282+
const TridiagonalConjugation{T} = Tridiagonal{T, TridiagonalConjugationBand{T}}
283+
const SymTridiagonalConjugation{T} = SymTridiagonal{T, TridiagonalConjugationBand{T}}
284+
function TridiagonalConjugation(R, X, Y...)
285+
data = TridiagonalConjugationData(R, X, Y...)
286+
Tridiagonal(TridiagonalConjugationBand(data, :dl), TridiagonalConjugationBand(data, :d), TridiagonalConjugationBand(data, :du))
287+
end
288+
289+
function SymTridiagonalConjugation(R, X, Y...)
290+
data = TridiagonalConjugationData(R, X, Y...)
291+
SymTridiagonal(TridiagonalConjugationBand(data, :d), TridiagonalConjugationBand(data, :du))
292+
end

test/test_bidiagonalconjugation.jl

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
using InfiniteLinearAlgebra, InfiniteRandomArrays, BandedMatrices, LazyArrays, LazyBandedMatrices, InfiniteArrays, ArrayLayouts, Test
2-
using InfiniteLinearAlgebra: BidiagonalConjugation, OneToInf
2+
using InfiniteLinearAlgebra: BidiagonalConjugation, SymTridiagonalConjugation, TridiagonalConjugation, OneToInf, TridiagonalConjugationData, resizedata!, TridiagonalConjugationBand
33
using ArrayLayouts: supdiagonaldata, subdiagonaldata, diagonaldata
44
using LinearAlgebra
55
using LazyArrays: LazyLayout
@@ -131,50 +131,62 @@ end
131131
@time Y = InfiniteLinearAlgebra.tri_mul_invupper_triview(UX, U)
132132
@test Tridiagonal(U*X / U) Tridiagonal(UX / U) Y
133133

134-
data = InfiniteLinearAlgebra.TridiagonalConjugationData(R, X_T)
134+
data = TridiagonalConjugationData(R, X_T)
135135
@test data.UX[1,:] UX[1,1:100]
136-
InfiniteLinearAlgebra.resizedata!(data, 1)
136+
resizedata!(data, 1)
137137
@test data.UX[1:2,:] UX[1:2,1:100]
138138
@test data.Y[1,:] Y[1,1:100]
139-
InfiniteLinearAlgebra.resizedata!(data, 2)
139+
resizedata!(data, 2)
140140
@test data.UX[1:3,:] UX[1:3,1:100]
141141
@test data.Y[1:2,:] Y[1:2,1:100]
142-
InfiniteLinearAlgebra.resizedata!(data, 3)
142+
resizedata!(data, 3)
143143
@test data.UX[1:4,:] UX[1:4,1:100]
144144
@test data.Y[1:3,:] Y[1:3,1:100]
145-
InfiniteLinearAlgebra.resizedata!(data, 1000)
145+
resizedata!(data, 1000)
146146
@test data.UX[1:999,1:999] UX[1:999,1:999]
147147
@test data.Y[1:999,1:999] Y[1:999,1:999]
148148

149-
data = InfiniteLinearAlgebra.TridiagonalConjugationData(R, X_T)
150-
InfiniteLinearAlgebra.resizedata!(data, 1000)
149+
data = TridiagonalConjugationData(R, X_T)
150+
resizedata!(data, 1000)
151151
@test data.UX[1:999,1:999] UX[1:999,1:999]
152152
@test data.Y[1:999,1:999] Y[1:999,1:999]
153153
end
154-
154+
155155
@testset "Cholesky" begin
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 = TridiagonalConjugationData(R, X_T);
160160
n = 1000
161161
@time U = V = R[1:n,1:n];
162162
@time X = Tridiagonal(Vector(X_T.dl[1:n-1]), Vector(X_T.d[1:n]), Vector(X_T.du[1:n-1]));
163163
UX = Tridiagonal(U*X)
164164
Y = Tridiagonal(UX / U)
165165
@test data.UX[1,:] UX[1,1:100]
166-
InfiniteLinearAlgebra.resizedata!(data, 1)
166+
resizedata!(data, 1)
167167
@test data.UX[1:2,:] UX[1:2,1:100]
168168
@test data.Y[1,:] Y[1,1:100]
169-
InfiniteLinearAlgebra.resizedata!(data, 2)
169+
resizedata!(data, 2)
170170
@test data.UX[1:3,:] UX[1:3,1:100]
171171
@test data.Y[1:2,:] Y[1:2,1:100]
172-
InfiniteLinearAlgebra.resizedata!(data, 3)
172+
resizedata!(data, 3)
173173
@test data.UX[1:4,:] UX[1:4,1:100]
174174
@test data.Y[1:3,:] Y[1:3,1:100]
175-
InfiniteLinearAlgebra.resizedata!(data, 1000)
175+
resizedata!(data, 1000)
176176
@test data.UX[1:999,1:999] UX[1:999,1:999]
177177
@test data.Y[1:999,1:999] Y[1:999,1:999]
178-
178+
end
179+
180+
@testset "TridiagonalConjugationBand" begin
181+
R,X = (_BandedMatrix(Vcat(-Ones(1,∞)/2, Zeros(1,∞), Hcat(Ones(1,1),Ones(1,∞)/2)), ℵ₀, 0,2),
182+
LazyBandedMatrices.Tridiagonal(Vcat(1.0, Fill(1/2,∞)), Zeros(∞), Fill(1/2,∞)))
183+
184+
Y = TridiagonalConjugation(R, X)
185+
n = 100_000
186+
@test Y[n,n+1] 1/2
187+
188+
Y = SymTridiagonalConjugation(R, X)
189+
n = 100_000
190+
@test Y[n,n+1] 1/2
179191
end
180192
end

0 commit comments

Comments
 (0)