Skip to content

Commit

Permalink
Remove over-templating
Browse files Browse the repository at this point in the history
  • Loading branch information
dlfivefifty committed Feb 8, 2025
1 parent a5037f2 commit b77c57f
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 37 deletions.
20 changes: 16 additions & 4 deletions src/infcholesky.jl
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@

mutable struct AdaptiveCholeskyFactors{T,DM<:AbstractMatrix{T},M<:AbstractMatrix{T}} <: LazyMatrix{T}
data::CachedMatrix{T,DM,M}
mutable struct AdaptiveCholeskyFactors{T,DM<:AbstractMatrix{T}} <: LazyMatrix{T}
data::CachedMatrix{T,DM}
ncols::Int
end

Expand All @@ -16,7 +16,19 @@ function AdaptiveCholeskyFactors(::SymmetricBandedLayouts, S::AbstractMatrix{T})
AdaptiveCholeskyFactors(CachedArray(data,A), 0)
end
AdaptiveCholeskyFactors(A::AbstractMatrix{T}) where T = AdaptiveCholeskyFactors(MemoryLayout(A), A)
MemoryLayout(::Type{AdaptiveCholeskyFactors{T,DM,M}}) where {T,DM,M} = AdaptiveLayout{typeof(MemoryLayout(DM))}()

struct AdaptiveCholeskyFactorsLayout <: AbstractLazyLayout end
struct AdaptiveCholeskyFactorsBandedLayout <: AbstractLazyBandedLayout end
struct AdaptiveCholeskyFactorsBlockBandedLayout <: AbstractLazyBlockBandedLayout end

const AdaptiveCholeskyFactorsLayouts = Union{AdaptiveCholeskyFactorsLayout,AdaptiveCholeskyFactorsBandedLayout,AdaptiveCholeskyFactorsBlockBandedLayout}

adaptivecholeskyfactorslayout(_) = AdaptiveCholeskyFactorsLayout()
adaptivecholeskyfactorslayout(::BandedLayouts) = AdaptiveCholeskyFactorsBandedLayout()
adaptivecholeskyfactorslayout(::BlockBandedLayouts) = AdaptiveCholeskyFactorsBlockBandedLayout()

Check warning on line 28 in src/infcholesky.jl

View check run for this annotation

Codecov / codecov/patch

src/infcholesky.jl#L26-L28

Added lines #L26 - L28 were not covered by tests


MemoryLayout(::Type{AdaptiveCholeskyFactors{T,DM}}) where {T,DM} = adaptivecholeskyfactorslayout(MemoryLayout(DM))

Check warning on line 31 in src/infcholesky.jl

View check run for this annotation

Codecov / codecov/patch

src/infcholesky.jl#L31

Added line #L31 was not covered by tests

copy(A::AdaptiveCholeskyFactors) = AdaptiveCholeskyFactors(copy(A.data), copy(A.ncols))
copy(A::Adjoint{T,<:AdaptiveCholeskyFactors}) where T = copy(parent(A))'
Expand Down Expand Up @@ -74,7 +86,7 @@ end
colsupport(F::AdjOrTrans{<:Any,<:AdaptiveCholeskyFactors}, j) = rowsupport(parent(F), j)
rowsupport(F::AdjOrTrans{<:Any,<:AdaptiveCholeskyFactors}, j) = colsupport(parent(F), j)

function materialize!(M::MatLdivVec{<:TriangularLayout{'L','N',<:AdaptiveLayout},<:AbstractPaddedLayout})
function materialize!(M::MatLdivVec{<:TriangularLayout{'L','N',<:AdaptiveCholeskyFactorsLayouts},<:AbstractPaddedLayout})

Check warning on line 89 in src/infcholesky.jl

View check run for this annotation

Codecov / codecov/patch

src/infcholesky.jl#L89

Added line #L89 was not covered by tests
A,B = M.A,M.B
T = eltype(M)
COLGROWTH = 1000 # rate to grow columns
Expand Down
62 changes: 31 additions & 31 deletions src/infqr.jl
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@

mutable struct AdaptiveQRData{T,DM<:AbstractMatrix{T},M<:AbstractMatrix{T}}
data::CachedMatrix{T,DM,M}
mutable struct AdaptiveQRData{T,DM<:AbstractMatrix{T}}
data::CachedMatrix{T,DM}
τ::Vector{T}
ncols::Int
end
Expand Down Expand Up @@ -89,24 +89,24 @@ partialqr!(F::AdaptiveQRData{<:Any,<:BlockSkylineMatrix}, n::Int) =
partialqr!(F, findblock(axes(F.data,2), n))


struct AdaptiveQRFactors{T,DM<:AbstractMatrix{T},M<:AbstractMatrix{T}} <: LayoutMatrix{T}
data::AdaptiveQRData{T,DM,M}
struct AdaptiveQRFactors{T,DM<:AbstractMatrix{T}} <: LayoutMatrix{T}
data::AdaptiveQRData{T,DM}
end

struct AdaptiveLayout <: AbstractLazyLayout end
struct AdaptiveBandedLayout <: AbstractLazyBandedLayout end
struct AdaptiveBlockBandedLayout <: AbstractLazyBlockBandedLayout end
struct AdaptiveQRFactorsLayout <: AbstractLazyLayout end
struct AdaptiveQRFactorsBandedLayout <: AbstractLazyBandedLayout end
struct AdaptiveQRFactorsBlockBandedLayout <: AbstractLazyBlockBandedLayout end

const AdaptiveLayouts = Union{AdaptiveLayout,AdaptiveBandedLayout,AdaptiveBlockBandedLayout}
const AdaptiveQRFactorsLayouts = Union{AdaptiveQRFactorsLayout,AdaptiveQRFactorsBandedLayout,AdaptiveQRFactorsBlockBandedLayout}

adaptivelayout(_) = AdaptiveLayout()
adaptivelayout(::BandedLayouts) = AdaptiveBandedLayout()
adaptivelayout(::BlockBandedLayouts) = AdaptiveBlockBandedLayout()
adaptiveqrfactorslayout(_) = AdaptiveQRFactorsLayout()
adaptiveqrfactorslayout(::BandedLayouts) = AdaptiveQRFactorsBandedLayout()
adaptiveqrfactorslayout(::BlockBandedLayouts) = AdaptiveQRFactorsBlockBandedLayout()

Check warning on line 104 in src/infqr.jl

View check run for this annotation

Codecov / codecov/patch

src/infqr.jl#L102-L104

Added lines #L102 - L104 were not covered by tests


MemoryLayout(::Type{AdaptiveQRFactors{T,DM,M}}) where {T,DM,M} =adaptivelayout(MemoryLayout(DM))
triangularlayout(::Type{Tri}, ::ML) where {Tri, ML<:AdaptiveLayouts} = Tri{ML}()
transposelayout(A::AdaptiveLayouts) = A
MemoryLayout(::Type{AdaptiveQRFactors{T,DM}}) where {T,DM} =adaptiveqrfactorslayout(MemoryLayout(DM))
triangularlayout(::Type{Tri}, ::ML) where {Tri, ML<:AdaptiveQRFactorsLayouts} = Tri{ML}()
transposelayout(A::AdaptiveQRFactorsLayouts) = A

Check warning on line 109 in src/infqr.jl

View check run for this annotation

Codecov / codecov/patch

src/infqr.jl#L107-L109

Added lines #L107 - L109 were not covered by tests

size(F::AdaptiveQRFactors) = size(F.data.data)
axes(F::AdaptiveQRFactors) = axes(F.data.data)
Expand Down Expand Up @@ -146,8 +146,8 @@ rowsupport(F::QRPackedQ{<:Any,<:AdaptiveQRFactors}, j) = first(rowsupport(F.fact
blockcolsupport(F::QRPackedQ{<:Any,<:AdaptiveQRFactors}, j) = blockcolsupport(F.factors, j)


struct AdaptiveQRTau{T,DM<:AbstractMatrix{T},M<:AbstractMatrix{T}} <: LayoutVector{T}
data::AdaptiveQRData{T,DM,M}
struct AdaptiveQRTau{T,DM<:AbstractMatrix{T}} <: LayoutVector{T}
data::AdaptiveQRData{T,DM}
end

size(F::AdaptiveQRTau) = (size(F.data.data,1),)
Expand All @@ -174,7 +174,7 @@ factorize_layout(::BandedLayouts, ::NTuple{2,OneToInf{Int}}, A) = qr(A)
factorize_layout(::AbstractBandedLayout, ::NTuple{2,OneToInf{Int}}, A) = qr(A)


cache_layout(::TriangularLayout{UPLO, UNIT, <:AdaptiveLayouts}, A::AbstractMatrix) where {UPLO, UNIT} = A # already cached
cache_layout(::TriangularLayout{UPLO, UNIT, <:AdaptiveQRFactorsLayouts}, A::AbstractMatrix) where {UPLO, UNIT} = A # already cached

Check warning on line 177 in src/infqr.jl

View check run for this annotation

Codecov / codecov/patch

src/infqr.jl#L177

Added line #L177 was not covered by tests

partialqr!(F::QR, n) = partialqr!(F.factors, n)
partialqr!(F::AdaptiveQRFactors, n) = partialqr!(F.data, n)
Expand All @@ -191,7 +191,7 @@ getindex(Q::QRPackedQ{<:Any,<:AdaptiveQRFactors,<:AdaptiveQRTau}, I::AbstractVec
#########

_view_QRPackedQ(A, kr, jr) = QRPackedQ(view(A.factors.data.data.data,kr,jr), view(A.τ.data.τ,jr))
function materialize!(M::MatLmulVec{<:QRPackedQLayout{<:AdaptiveLayouts},<:AbstractPaddedLayout})
function materialize!(M::MatLmulVec{<:QRPackedQLayout{<:AdaptiveQRFactorsLayouts},<:AbstractPaddedLayout})

Check warning on line 194 in src/infqr.jl

View check run for this annotation

Codecov / codecov/patch

src/infqr.jl#L194

Added line #L194 was not covered by tests
A,B = M.A,M.B
sB = size(paddeddata(B),1)
partialqr!(A.factors.data,sB)
Expand Down Expand Up @@ -233,7 +233,7 @@ end

_norm(x::Number) = abs(x)

function materialize!(M::MatLmulVec{<:AdjQRPackedQLayout{<:AdaptiveLayouts},<:AbstractPaddedLayout}; tolerance=floatmin(real(eltype(M))))
function materialize!(M::MatLmulVec{<:AdjQRPackedQLayout{<:AdaptiveQRFactorsLayouts},<:AbstractPaddedLayout}; tolerance=floatmin(real(eltype(M))))

Check warning on line 236 in src/infqr.jl

View check run for this annotation

Codecov / codecov/patch

src/infqr.jl#L236

Added line #L236 was not covered by tests
adjA,B = M.A,M.B
COLGROWTH = 1000 # rate to grow columns

Expand Down Expand Up @@ -284,7 +284,7 @@ function _view_QRPackedQ(A, KR::BlockRange, JR::BlockRange)
QRPackedQ(view(A.factors.data.data.data,KR,JR), view(A.τ.data.τ,jr))
end

function materialize!(M::MatLmulVec{QRPackedQLayout{AdaptiveBlockBandedLayout},<:AbstractPaddedLayout})
function materialize!(M::MatLmulVec{QRPackedQLayout{AdaptiveQRFactorsBlockBandedLayout},<:AbstractPaddedLayout})

Check warning on line 287 in src/infqr.jl

View check run for this annotation

Codecov / codecov/patch

src/infqr.jl#L287

Added line #L287 was not covered by tests
A,B_in = M.A,M.B
sB = length(paddeddata(B_in))
ax1,ax2 = axes(A.factors.data.data)
Expand All @@ -300,7 +300,7 @@ function materialize!(M::MatLmulVec{QRPackedQLayout{AdaptiveBlockBandedLayout},<
B
end

function materialize!(M::MatLmulVec{<:AdjQRPackedQLayout{AdaptiveBlockBandedLayout},<:AbstractPaddedLayout}; tolerance=1E-30)
function materialize!(M::MatLmulVec{<:AdjQRPackedQLayout{AdaptiveQRFactorsBlockBandedLayout},<:AbstractPaddedLayout}; tolerance=1E-30)

Check warning on line 303 in src/infqr.jl

View check run for this annotation

Codecov / codecov/patch

src/infqr.jl#L303

Added line #L303 was not covered by tests
adjA,B_in = M.A,M.B
A = parent(adjA)
T = eltype(M)
Expand Down Expand Up @@ -377,15 +377,15 @@ ldiv!(F::QR{<:Any,<:AdaptiveQRFactors}, b::LayoutVector; kwds...) = ldiv!(F.R, l
factorize(A::BandedMatrix{<:Any,<:Any,<:OneToInf}) = qr(A)
qr(A::SymTridiagonal{T,<:AbstractFill{T,1,Tuple{OneToInf{Int}}}}) where T = adaptiveqr(A)

simplifiable(M::Mul{<:QRPackedQLayout{<:AdaptiveLayouts}}) = Val(false)
simplifiable(M::Mul{<:QRPackedQLayout{<:AdaptiveLayouts},<:QRPackedQLayout{<:AdaptiveLayouts}}) = Val(false)
simplifiable(M::Mul{<:QRPackedQLayout{<:AdaptiveLayouts},<:LazyLayouts}) = Val(false)
simplifiable(M::Mul{<:Any,<:QRPackedQLayout{<:AdaptiveLayouts}}) = Val(false)
simplifiable(M::Mul{<:LazyLayouts,<:QRPackedQLayout{<:AdaptiveLayouts}}) = Val(false)
simplifiable(M::Mul{<:QRPackedQLayout{<:AdaptiveQRFactorsLayouts}}) = Val(false)
simplifiable(M::Mul{<:QRPackedQLayout{<:AdaptiveQRFactorsLayouts},<:QRPackedQLayout{<:AdaptiveQRFactorsLayouts}}) = Val(false)
simplifiable(M::Mul{<:QRPackedQLayout{<:AdaptiveQRFactorsLayouts},<:LazyLayouts}) = Val(false)
simplifiable(M::Mul{<:Any,<:QRPackedQLayout{<:AdaptiveQRFactorsLayouts}}) = Val(false)
simplifiable(M::Mul{<:LazyLayouts,<:QRPackedQLayout{<:AdaptiveQRFactorsLayouts}}) = Val(false)

Check warning on line 384 in src/infqr.jl

View check run for this annotation

Codecov / codecov/patch

src/infqr.jl#L380-L384

Added lines #L380 - L384 were not covered by tests


copy(M::Mul{<:QRPackedQLayout{<:AdaptiveLayouts},<:QRPackedQLayout{<:AdaptiveLayouts}}) = simplify(M)
copy(M::Mul{<:QRPackedQLayout{<:AdaptiveLayouts}}) = simplify(M)
copy(M::Mul{<:QRPackedQLayout{<:AdaptiveLayouts},<:LazyLayouts}) = simplify(M)
copy(M::Mul{<:Any,<:QRPackedQLayout{<:AdaptiveLayouts}}) = simplify(M)
copy(M::Mul{<:LazyLayouts,<:QRPackedQLayout{<:AdaptiveLayouts}}) = simplify(M)
copy(M::Mul{<:QRPackedQLayout{<:AdaptiveQRFactorsLayouts},<:QRPackedQLayout{<:AdaptiveQRFactorsLayouts}}) = simplify(M)
copy(M::Mul{<:QRPackedQLayout{<:AdaptiveQRFactorsLayouts}}) = simplify(M)
copy(M::Mul{<:QRPackedQLayout{<:AdaptiveQRFactorsLayouts},<:LazyLayouts}) = simplify(M)
copy(M::Mul{<:Any,<:QRPackedQLayout{<:AdaptiveQRFactorsLayouts}}) = simplify(M)
copy(M::Mul{<:LazyLayouts,<:QRPackedQLayout{<:AdaptiveQRFactorsLayouts}}) = simplify(M)

Check warning on line 391 in src/infqr.jl

View check run for this annotation

Codecov / codecov/patch

src/infqr.jl#L387-L391

Added lines #L387 - L391 were not covered by tests
4 changes: 2 additions & 2 deletions test/test_infqr.jl
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ using InfiniteLinearAlgebra, LinearAlgebra, BandedMatrices, InfiniteArrays, Matr
import LazyArrays: colsupport, rowsupport, MemoryLayout, DenseColumnMajor, TriangularLayout, resizedata!, arguments
import LazyBandedMatrices: BroadcastBandedLayout, InvDiagTrav, BroadcastBandedBlockBandedLayout
import BandedMatrices: _BandedMatrix, _banded_qr!, BandedColumns
import InfiniteLinearAlgebra: partialqr!, AdaptiveQRData, AdaptiveLayout, AdaptiveBandedLayout, adaptiveqr
import InfiniteLinearAlgebra: partialqr!, AdaptiveQRData, AdaptiveQRFactorsBandedLayout, adaptiveqr
import SemiseparableMatrices: AlmostBandedLayout, VcatAlmostBandedLayout


Expand Down Expand Up @@ -44,7 +44,7 @@ import SemiseparableMatrices: AlmostBandedLayout, VcatAlmostBandedLayout
@testset "col/rowsupport" begin
A = _BandedMatrix(Vcat(Ones(1,∞), (1:∞)', Ones(1,∞)), ℵ₀, 1, 1)
F = qr(A)
@test MemoryLayout(typeof(F.factors)) isa AdaptiveBandedLayout
@test MemoryLayout(typeof(F.factors)) isa AdaptiveQRFactorsBandedLayout
@test bandwidths(F.factors) == (1,2)
@test colsupport(F.factors,1) == 1:2
@test colsupport(F.factors,5) == 3:6
Expand Down

0 comments on commit b77c57f

Please sign in to comment.