Skip to content

Commit de884a0

Browse files
authored
hcat and vcat ability to dispatch on size, for ∞-array support (#65)
* hcat and vcat ability to dispatch on size, for ∞-array support * add 5-arg mul! * Update test_layoutarray.jl * v0.7.2
1 parent 5a52d61 commit de884a0

File tree

4 files changed

+70
-5
lines changed

4 files changed

+70
-5
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.7.1"
4+
version = "0.7.2"
55

66

77
[deps]

src/ArrayLayouts.jl

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
module ArrayLayouts
2+
using Base: _typed_hcat
23
using Base, Base.Broadcast, LinearAlgebra, FillArrays, SparseArrays
34
import LinearAlgebra.BLAS
45

@@ -328,4 +329,22 @@ Base.print_matrix_row(io::IO,
328329

329330
include("cumsum.jl")
330331

331-
end
332+
###
333+
# support overloading hcat/vcat for ∞-arrays
334+
###
335+
336+
const LayoutVecOrMat{T} = Union{LayoutVector{T},LayoutMatrix{T}}
337+
const LayoutVecOrMats{T} = Union{LayoutVecOrMat{T},SubArray{T,1,<:LayoutVecOrMat},SubArray{T,2,<:LayoutVecOrMat}}
338+
339+
typed_hcat(::Type{T}, ::Tuple, A...) where T = Base._typed_hcat(T, A)
340+
typed_vcat(::Type{T}, ::Tuple, A...) where T = Base._typed_vcat(T, A)
341+
typed_hcat(::Type{T}, A...) where T = typed_hcat(T, (size(A[1],1), sum(size.(A,2))), A...)
342+
typed_vcat(::Type{T}, A...) where T = typed_vcat(T, (sum(size.(A,1)),size(A[1],2)), A...)
343+
344+
Base.typed_vcat(::Type{T}, A::LayoutVecOrMats, B::AbstractVecOrMat...) where T = typed_vcat(T, A, B...)
345+
Base.typed_hcat(::Type{T}, A::LayoutVecOrMats, B::AbstractVecOrMat...) where T = typed_hcat(T, A, B...)
346+
Base.typed_vcat(::Type{T}, A::LayoutVecOrMats, B::LayoutVecOrMats, C::AbstractVecOrMat...) where T = typed_vcat(T, A, B, C...)
347+
Base.typed_hcat(::Type{T}, A::LayoutVecOrMats, B::LayoutVecOrMats, C::AbstractVecOrMat...) where T = typed_hcat(T, A, B, C...)
348+
Base.typed_vcat(::Type{T}, A::AbstractVecOrMat, B::LayoutVecOrMats, C::AbstractVecOrMat...) where T = typed_vcat(T, A, B, C...)
349+
Base.typed_hcat(::Type{T}, A::AbstractVecOrMat, B::LayoutVecOrMats, C::AbstractVecOrMat...) where T = typed_hcat(T, A, B, C...)
350+
end # module

src/mul.jl

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ copy(M::Mul) = copy(mulreduce(M))
109109
@inline copyto!(dest, M::Mul) = copyto!(dest, mulreduce(M))
110110
@inline copyto!(dest::AbstractArray, M::Mul) = copyto!(dest, mulreduce(M))
111111
mul!(dest::AbstractArray, A::AbstractArray, B::AbstractArray) = copyto!(dest, Mul(A,B))
112+
mul!(dest::AbstractArray, A::AbstractArray, B::AbstractArray, α::Number, β::Number) = muladd!(α, A, B, β, dest)
112113

113114

114115
broadcastable(M::Mul) = M
@@ -161,12 +162,18 @@ macro layoutmul(Typ)
161162
LinearAlgebra.mul!(dest::AbstractVector, A::$Typ, b::AbstractVector) =
162163
ArrayLayouts.mul!(dest,A,b)
163164

164-
LinearAlgebra.mul!(dest::AbstractMatrix, A::$Typ, b::AbstractMatrix) =
165-
ArrayLayouts.mul!(dest,A,b)
165+
LinearAlgebra.mul!(dest::AbstractMatrix, A::$Typ, B::AbstractMatrix) =
166+
ArrayLayouts.mul!(dest,A,B)
166167
LinearAlgebra.mul!(dest::AbstractMatrix, A::AbstractMatrix, B::$Typ) =
167168
ArrayLayouts.mul!(dest,A,B)
168169
LinearAlgebra.mul!(dest::AbstractMatrix, A::$Typ, B::$Typ) =
169170
ArrayLayouts.mul!(dest,A,B)
171+
LinearAlgebra.mul!(dest::AbstractMatrix, A::$Typ, B::AbstractMatrix, α::Number, β::Number) =
172+
ArrayLayouts.mul!(dest,A,B,α,β)
173+
LinearAlgebra.mul!(dest::AbstractMatrix, A::AbstractMatrix, B::$Typ, α::Number, β::Number) =
174+
ArrayLayouts.mul!(dest,A,B,α,β)
175+
LinearAlgebra.mul!(dest::AbstractMatrix, A::$Typ, B::$Typ, α::Number, β::Number) =
176+
ArrayLayouts.mul!(dest,A,B,α,β)
170177

171178
Base.:*(A::$Typ, B::$Typ) = ArrayLayouts.mul(A,B)
172179
Base.:*(A::$Typ, B::AbstractMatrix) = ArrayLayouts.mul(A,B)
@@ -193,9 +200,22 @@ macro layoutmul(Typ)
193200

194201
LinearAlgebra.mul!(dest::AbstractMatrix, A::$Typ, b::$Mod{<:Any,<:AbstractMatrix}) =
195202
ArrayLayouts.mul!(dest,A,b)
196-
197203
LinearAlgebra.mul!(dest::AbstractVector, A::$Mod{<:Any,<:$Typ}, b::AbstractVector) =
198204
ArrayLayouts.mul!(dest,A,b)
205+
LinearAlgebra.mul!(dest::AbstractMatrix, A::$Mod{<:Any,<:$Typ}, B::AbstractMatrix, α::Number, β::Number) =
206+
ArrayLayouts.mul!(dest,A,B,α,β)
207+
LinearAlgebra.mul!(dest::AbstractMatrix, A::AbstractMatrix, B::$Mod{<:Any,<:$Typ}, α::Number, β::Number) =
208+
ArrayLayouts.mul!(dest,A,B,α,β)
209+
LinearAlgebra.mul!(dest::AbstractMatrix, A::$Mod{<:Any,<:$Typ}, B::$Typ, α::Number, β::Number) =
210+
ArrayLayouts.mul!(dest,A,B,α,β)
211+
LinearAlgebra.mul!(dest::AbstractMatrix, A::$Typ, B::$Mod{<:Any,<:$Typ}, α::Number, β::Number) =
212+
ArrayLayouts.mul!(dest,A,B,α,β)
213+
LinearAlgebra.mul!(dest::AbstractMatrix, A::$Mod{<:Any,<:AbstractVecOrMat}, B::$Typ, α::Number, β::Number) =
214+
ArrayLayouts.mul!(dest,A,B,α,β)
215+
LinearAlgebra.mul!(dest::AbstractMatrix, A::$Typ, B::$Mod{<:Any,<:AbstractVecOrMat}, α::Number, β::Number) =
216+
ArrayLayouts.mul!(dest,A,B,α,β)
217+
LinearAlgebra.mul!(dest::AbstractMatrix, A::$Mod{<:Any,<:$Typ}, B::$Mod{<:Any,<:$Typ}, α::Number, β::Number) =
218+
ArrayLayouts.mul!(dest,A,B,α,β)
199219

200220
Base.:*(A::$Mod{<:Any,<:$Typ}, B::$Mod{<:Any,<:$Typ}) = ArrayLayouts.mul(A,B)
201221
Base.:*(A::$Mod{<:Any,<:$Typ}, B::AbstractMatrix) = ArrayLayouts.mul(A,B)

test/test_layoutarray.jl

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,20 @@ MemoryLayout(::Type{MyVector}) = DenseColumnMajor()
110110
@test mul!(B, A, A) A*A
111111
@test mul!(B, A', A) A'*A
112112
@test mul!(B, A, A') A*A'
113+
@test mul!(B, A', A') A'*A'
114+
@test mul!(B, A, Bin) A*Bin
115+
116+
@test mul!(copy(B), A, A, 2, 3) 2A*A + 3B
117+
@test mul!(copy(B), A', A, 2, 3) 2A'*A + 3B
118+
@test mul!(copy(B), A, A', 2, 3) 2A*A' + 3B
119+
@test mul!(copy(B), A', A', 2, 3) 2A'*A' + 3B
120+
@test mul!(copy(B), Bin, A, 2, 3) 2Bin*A + 3B
121+
@test mul!(copy(B), Bin, A', 2, 3) 2Bin*A' + 3B
122+
@test mul!(copy(B), A, Bin, 2, 3) 2A*Bin + 3B
123+
@test mul!(copy(B), A', Bin, 2, 3) 2A'*Bin + 3B
124+
@test mul!(copy(B), A, Bin, 2, 3) 2A*Bin + 3B
125+
@test mul!(copy(B), A, Bin', 2, 3) 2A*Bin' + 3B
126+
@test mul!(copy(B), Bin', A, 2, 3) 2Bin'*A + 3B
113127
end
114128

115129
@testset "generic_blasmul!" begin
@@ -244,6 +258,18 @@ MemoryLayout(::Type{MyVector}) = DenseColumnMajor()
244258
@test Transpose(T)A' Adjoint(T)A' Adjoint(T)Transpose(A) Transpose(T)Transpose(A)
245259
@test Transpose(A)Adjoint(T) A'Adjoint(T) A'Transpose(T) Transpose(A)Transpose(T)
246260
end
261+
262+
@testset "concat" begin
263+
a = MyVector(randn(5))
264+
A = MyMatrix(randn(5,6))
265+
266+
@test [a; a] == [Array(a); a] == [a; Array(a)]
267+
@test [A; A] == [Array(A); A] == [A; Array(A)]
268+
269+
@test [Array(a) A A] == [Array(a) Array(A) Array(A)]
270+
@test [a A A] == [Array(a) Array(A) Array(A)]
271+
@test [a Array(A) A] == [Array(a) Array(A) Array(A)]
272+
end
247273
end
248274

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

0 commit comments

Comments
 (0)