Skip to content

Commit

Permalink
krontrav with Eye (#141)
Browse files Browse the repository at this point in the history
* krontrav with Eye

* add tests

* Update test_lazybandedinf.jl
  • Loading branch information
dlfivefifty authored Jan 9, 2025
1 parent 3c68051 commit 818c3cd
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 9 deletions.
5 changes: 4 additions & 1 deletion ext/LazyBandedMatricesInfiniteArraysExt.jl
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ using LazyBandedMatrices.BlockArrays
using LazyBandedMatrices.ArrayLayouts

import Base: BroadcastStyle, copy, OneTo, oneto
import LazyBandedMatrices: _krontrav_axes, _block_interlace_axes, _broadcast_sub_arguments, AbstractLazyBandedBlockBandedLayout, KronTravBandedBlockBandedLayout, krontravargs, DiagTravLayout
import LazyBandedMatrices: _krontrav_axes, _block_interlace_axes, _broadcast_sub_arguments, AbstractLazyBandedBlockBandedLayout, KronTravBandedBlockBandedLayout, krontravargs, DiagTravLayout, krontrav_materialize_layout, krontrav
import InfiniteArrays: InfFill, TridiagonalToeplitzLayout, BidiagonalToeplitzLayout, LazyArrayStyle, OneToInf
import LazyBandedMatrices.ArrayLayouts: MemoryLayout, sublayout, RangeCumsum, Mul
import LazyBandedMatrices.BlockArrays: sizes_from_blocks, BlockedOneTo, BlockSlice1, BlockSlice
Expand Down Expand Up @@ -58,4 +58,7 @@ _block_interlace_axes(nbc::Int, ax::NTuple{2,BlockedOneTo{Int,OneToInf{Int}}}...

copy(M::Mul{InfKronTravBandedBlockBandedLayout, Lay}) where Lay<:DiagTravLayout{<:AbstractPaddedLayout} = copy(Mul{KronTravBandedBlockBandedLayout, Lay}(M.A, M.B))

krontrav_materialize_layout(::InfKronTravBandedBlockBandedLayout, K) = K


end
4 changes: 2 additions & 2 deletions src/LazyBandedMatrices.jl
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module LazyBandedMatrices
using ArrayLayouts: symmetriclayout
using BandedMatrices, BlockBandedMatrices, BlockArrays, LazyArrays,
using BandedMatrices, BlockBandedMatrices, BlockArrays, LazyArrays, FillArrays,
ArrayLayouts, MatrixFactorizations, Base, StaticArrays, LinearAlgebra

import Base: -, +, *, /, \, ==, AbstractMatrix, Matrix, Array, size, conj, real, imag, copy, copymutable,
Expand All @@ -22,7 +22,7 @@ import BandedMatrices: AbstractBandedMatrix, BandedStyle, bandwidths, isbanded
import BlockBandedMatrices: AbstractBlockBandedLayout, AbstractBandedBlockBandedLayout, BlockRange1, Block1, blockbandwidths, subblockbandwidths,
BlockBandedStyle, BandedBlockBandedStyle, isblockbanded, isbandedblockbanded
import BlockArrays: BlockSlices, BlockSlice1, BlockSlice, blockvec, AbstractBlockLayout, blockcolsupport, blockrowsupport, BlockLayout, block, blockindex, viewblock, AbstractBlockedUnitRange

import FillArrays: SquareEye

const LazyArraysBlockBandedMatricesExt = Base.get_extension(LazyArrays, :LazyArraysBlockBandedMatricesExt)

Expand Down
13 changes: 8 additions & 5 deletions src/blockkron.jl
Original file line number Diff line number Diff line change
Expand Up @@ -391,11 +391,14 @@ function _krontrav_mul_diagtrav((A,B,C), X::AbstractArray{<:Any,3}, ::Type{T}) w
DiagTrav(Y)
end

kron_materialize_layout(_, K) = BlockedArray(K)
kron_materialize_layout(::AbstractBandedBlockBandedLayout, K) = BandedBlockBandedMatrix(K)
kron_materialize(K) = kron_materialize_layout(MemoryLayout(K), K)
krontrav(A...) = kron_materialize(KronTrav(A...))

krontrav_materialize_layout(_, K) = BlockedArray(K)
krontrav_materialize_layout(::AbstractBandedBlockBandedLayout, K) = BandedBlockBandedMatrix(K)
krontrav_materialize(K) = krontrav_materialize_layout(MemoryLayout(K), K)
krontrav(A...) = krontrav_materialize(KronTrav(A...))


function krontrav(a::SquareEye{T}, b::SquareEye{V}) where {T,V}
size(a) == size(b) || throw(ArgumentError("size must match"))
SquareEye{promote_type(T,V)}((blockedrange(oneto(size(a,1))),))
end
# C = α*B*X*A' + β*C
5 changes: 5 additions & 0 deletions test/test_blockkron.jl
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,11 @@ LinearAlgebra.factorize(A::MyLazyArray) = factorize(A.data)
Δ = BandedMatrix(1 => Ones(n-1), 0 => Fill(-2,n), -1 => Ones(n-1))
@test krontrav(Δ,Eye(n)) == KronTrav(Δ, Eye(n))
@test krontrav(Δ,Eye(n)) isa BandedBlockBandedMatrix

@test krontrav(Eye(4), Eye(4)) isa Eye
@test krontrav(Eye(4), Eye(4)) == KronTrav(Eye(4), Eye(4))

@test_throws ArgumentError krontrav(Eye(4), Eye(5))
end
end

Expand Down
4 changes: 3 additions & 1 deletion test/test_lazybandedinf.jl
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ using InfiniteArrays: TridiagonalToeplitzLayout, BidiagonalToeplitzLayout, Tridi
using Base: oneto
using BlockArrays: blockcolsupport
using LazyArrays: arguments, simplifiable
using LazyBandedMatrices: BroadcastBandedBlockBandedLayout
using LazyBandedMatrices: BroadcastBandedBlockBandedLayout, krontrav

const InfiniteArraysBlockArraysExt = Base.get_extension(InfiniteArrays, :InfiniteArraysBlockArraysExt)
const LazyBandedMatricesInfiniteArraysExt = Base.get_extension(LazyBandedMatrices, :LazyBandedMatricesInfiniteArraysExt)
Expand Down Expand Up @@ -195,6 +195,8 @@ const InfKronTravBandedBlockBandedLayout = LazyBandedMatricesInfiniteArraysExt.I
@test subblockbandwidths(A + B) == (1, 1)
@test subblockbandwidths(2A) == (1, 1)
@test subblockbandwidths(2 * (A + B)) == (1, 1)

@test krontrav(Eye(∞), Eye(∞)) isa Eye
end

@testset "BlockTridiagonal" begin
Expand Down

2 comments on commit 818c3cd

@dlfivefifty
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@JuliaRegistrator
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Error while trying to register: Version 0.11.1 already exists

Please sign in to comment.