Skip to content

Commit 5111eb1

Browse files
authored
Allow overloading ^ and I for infinity arrays (#51)
* Allow overloading ^ and I for infinity arrays * Update mul.jl
1 parent 4f17d53 commit 5111eb1

File tree

3 files changed

+31
-2
lines changed

3 files changed

+31
-2
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "ArrayLayouts"
22
uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"
33
authors = ["Sheehan Olver <[email protected]>"]
4-
version = "0.5.0"
4+
version = "0.5.1"
55

66
[deps]
77
Compat = "34da2185-b29b-5c13-b0c7-acf172513d20"

src/mul.jl

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,8 +254,26 @@ dot(a, b) = materialize(Dot(a, b))
254254
@inline LinearAlgebra.dot(a::LayoutArray, b::SubArray{<:Any,N,<:LayoutArray}) where N = dot(a,b)
255255
@inline LinearAlgebra.dot(a::SubArray{<:Any,N,<:LayoutArray}, b::SubArray{<:Any,N,<:LayoutArray}) where N = dot(a,b)
256256

257-
# Temporary until layout 3-arg dot is added.
257+
# Temporary until layout 3-arg dot is added.
258258
# We go to generic fallback as layout-arrays are structured
259259
dot(x, A, y) = dot(x, mul(A, y))
260260
LinearAlgebra.dot(x::AbstractVector, A::LayoutMatrix, y::AbstractVector) = dot(x, A, y)
261261
LinearAlgebra.dot(x::AbstractVector, A::Symmetric{<:Real,<:LayoutMatrix}, y::AbstractVector) = dot(x, A, y)
262+
263+
264+
265+
# allow overloading for infinite or lazy case
266+
@inline _power_by_squaring(_, _, A, p) = Base.invoke(Base.power_by_squaring, Tuple{AbstractMatrix,Integer}, A, p)
267+
@inline _apply(_, _, op, A::AbstractMatrix, Λ::UniformScaling) = Base.invoke(op, Tuple{AbstractMatrix,UniformScaling}, A, Λ)
268+
@inline _apply(_, _, op, Λ::UniformScaling, A::AbstractMatrix) = Base.invoke(op, Tuple{UniformScaling,AbstractMatrix}, Λ, A)
269+
270+
for Typ in (:LayoutMatrix, :(Symmetric{<:Any,<:LayoutMatrix}), :(Hermitian{<:Any,<:LayoutMatrix}),
271+
:(Adjoint{<:Any,<:LayoutMatrix}), :(Transpose{<:Any,<:LayoutMatrix}))
272+
@eval begin
273+
@inline Base.power_by_squaring(A::$Typ, p::Integer) = _power_by_squaring(MemoryLayout(A), size(A), A, p)
274+
@inline +(A::$Typ, Λ::UniformScaling) = _apply(MemoryLayout(A), size(A), +, A, Λ)
275+
@inline +::UniformScaling, A::$Typ) = _apply(MemoryLayout(A), size(A), +, Λ, A)
276+
@inline -(A::$Typ, Λ::UniformScaling) = _apply(MemoryLayout(A), size(A), -, A, Λ)
277+
@inline -::UniformScaling, A::$Typ) = _apply(MemoryLayout(A), size(A), -, Λ, A)
278+
end
279+
end

test/runtests.jl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,17 @@ MemoryLayout(::Type{MyVector}) = DenseColumnMajor()
177177
@test ArrayLayouts.ldiv!(2, Hermitian(copy(C))) == ArrayLayouts.rdiv!(Hermitian(copy(C)), 2) == 2\Hermitian(C)
178178
end
179179
end
180+
181+
@testset "pow/I" begin
182+
A = randn(2,2)
183+
B = MyMatrix(A)
184+
@test B^2 A^2
185+
@test B^2.3 A^2.3
186+
@test B^(-1) inv(A)
187+
@test B + I I + B A + I
188+
@test B - I A - I
189+
@test I - B I - B
190+
end
180191
end
181192

182193
struct MyUpperTriangular{T} <: AbstractMatrix{T}

0 commit comments

Comments
 (0)