@@ -81,13 +81,15 @@ _hvcat_paddeddata(N, A, B::Zeros...) = A
8181paddeddata (A:: ApplyMatrix{<:Any,typeof(hvcat)} ) = _hvcat_paddeddata (A. args... )
8282
8383
84+ paddeddata (A:: Array ) = A # support padded interface for strided arrays
8485
8586
8687# ####
8788# conversion
8889# ####
8990
9091cache_layout (:: AbstractPaddedLayout , O:: AbstractArray ) = CachedArray (copy (paddeddata (O)), Zeros {eltype(O)} (axes (O)))
92+ cache_layout (:: AbstractPaddedLayout , O:: CachedArray ) = CachedArray (copy (O. data), O. array, O. datasize)
9193
9294
9395# ####
@@ -252,48 +254,51 @@ end
252254
253255makearray (a:: Number , :: Tuple{Any} ) = [a]
254256makearray (a:: Number , :: Tuple{Any,Any} ) = [a ;;]
257+ makearray (a:: AbstractVector , :: Tuple{Any,Any} ) = reshape (a, :, 1 )
255258makearray (a, _) = convert (Array, a)
256259
260+ broadcast_deblock (op, A, B) = broadcast (op, A, B)
261+
257262function layout_broadcasted (_, :: AbstractPaddedLayout , op, A:: Union{Ref,Number} , B:: AbstractArray )
258263 b = paddeddata (B)
259264 m = length (b)
260265 zB = Zeros {eltype(B)} (size (B)... )
261- CachedArray (makearray (broadcast (op, A, b), size (B)), broadcast (op, A, zB))
266+ CachedArray (makearray (broadcast_deblock (op, A, b), size (B)), broadcast (op, A, zB))
262267end
263268
264269function layout_broadcasted (:: AbstractPaddedLayout , _, op, A:: AbstractArray , B:: Union{Ref,Number} )
265270 a = paddeddata (A)
266271 n = length (a)
267272 zA = Zeros {eltype(A)} (size (A)... )
268- CachedArray (makearray (broadcast (op, a, B), size (A)), broadcast (op, zA, B))
273+ CachedArray (makearray (broadcast_deblock (op, a, B), size (A)), broadcast (op, zA, B))
269274end
270275
271276function layout_broadcasted (_, :: AbstractPaddedLayout , op, A:: AbstractVector , B:: AbstractVector )
272277 b = paddeddata (B)
273278 m = length (b)
274279 zB = Zeros {eltype(B)} (size (B)... )
275- CachedArray (makearray (broadcast (op, view (A,1 : m), b), size (B)), broadcast (op, A, zB))
280+ CachedArray (makearray (broadcast_deblock (op, view (A,1 : m), b), size (B)), broadcast (op, A, zB))
276281end
277282
278283function layout_broadcasted (:: AbstractPaddedLayout , _, op, A:: AbstractVector , B:: AbstractVector )
279284 a = paddeddata (A)
280285 n = length (a)
281286 zA = Zeros {eltype(A)} (size (A)... )
282- CachedArray (makearray (broadcast (op, a, view (B,1 : n)), size (A)), broadcast (op, zA, B))
287+ CachedArray (makearray (broadcast_deblock (op, a, view (B,1 : n)), size (A)), broadcast (op, zA, B))
283288end
284289
285290function layout_broadcasted (_, :: AbstractPaddedLayout , op, A:: AbstractVector , B:: AbstractMatrix )
286291 b = paddeddata (B)
287292 m = size (b,1 )
288293 zB = Zeros {eltype(B)} (size (B)... )
289- CachedArray (makearray (broadcast (op, view (A,1 : m ), b), size (B)), broadcast (op, A, zB))
294+ CachedArray (makearray (broadcast_deblock (op, view (A,1 : ( size (B, 1 ) == 1 ? size (A, 1 ) : m) ), b), size (B)), broadcast (op, A, zB))
290295end
291296
292297function layout_broadcasted (:: AbstractPaddedLayout , _, op, A:: AbstractMatrix , B:: AbstractVector )
293298 a = paddeddata (A)
294299 n = size (a,1 )
295300 zA = Zeros {eltype(A)} (size (A)... )
296- CachedArray (makearray (broadcast (op, a, view (B,1 : n )), size (A)), broadcast (op, zA, B))
301+ CachedArray (makearray (broadcast_deblock (op, a, view (B,1 : ( size (A, 1 ) == 1 ? size (B, 1 ) : n) )), size (A)), broadcast (op, zA, B))
297302end
298303
299304
@@ -724,10 +729,15 @@ function ArrayLayouts.qr!_layout(::AbstractPaddedLayout, ax, A)
724729 padqr (F, ax)
725730end
726731
732+ colsupport (:: QRCompactWYQLayout{<:AbstractPaddedLayout} , Q, k) = colsupport (paddeddata (Q. factors), k)
733+ rowsupport (:: QRCompactWYQLayout{<:AbstractPaddedLayout} , Q, k) = colsupport (paddeddata (Q. factors), k)
734+ colsupport (:: AdjQRCompactWYQLayout{<:AbstractPaddedLayout} , Q, k) = colsupport (paddeddata (Q' . factors), k)
735+ rowsupport (:: AdjQRCompactWYQLayout{<:AbstractPaddedLayout} , Q, k) = colsupport (paddeddata (Q' . factors), k)
736+
727737similar (M:: Lmul{<:AdjQRCompactWYQLayout{<:PaddedColumns}, <:PaddedColumns} , :: Type{T} , ax) where T = CachedArray (Zeros {T} (ax))
728738
729739
730- function materialize! (L:: MatLmulVec{<:AdjQRCompactWYQLayout{<:PaddedColumns}, <:PaddedColumns} )
740+ function materialize! (L:: MatLmulVec{<:AdjQRCompactWYQLayout{<:PaddedColumns}, <:Union{AbstractStridedLayout, PaddedColumns} } )
731741 Q,b = L. A' ,L. B
732742 F = paddeddata (Q. factors)
733743 m = size (F,1 )
@@ -737,3 +747,49 @@ function materialize!(L::MatLmulVec{<:AdjQRCompactWYQLayout{<:PaddedColumns}, <:
737747 lmul! (Q̃' , view (p_b,oneto (m)))
738748 b
739749end
750+
751+ function materialize! (L:: MatLmulMat{<:AdjQRCompactWYQLayout{<:PaddedColumns}, <:Union{AbstractStridedLayout,AbstractPaddedLayout}} )
752+ Q,b = L. A' ,L. B
753+ F = paddeddata (Q. factors)
754+ m = size (F,1 )
755+ resizedata! (b, m, size (b,2 ))
756+ Q̃ = LinearAlgebra. QRCompactWYQ (F, Q. T)
757+ p_b = paddeddata (b)
758+ lmul! (Q̃' , view (p_b,oneto (m),:))
759+ b
760+ end
761+
762+
763+
764+ function materialize! (L:: MatLmulVec{<:QRCompactWYQLayout{<:PaddedColumns}, <:Union{AbstractStridedLayout,PaddedColumns}} )
765+ Q,b = L. A,L. B
766+ F = paddeddata (Q. factors)
767+ m = size (F,1 )
768+ resizedata! (b, m)
769+ Q̃ = LinearAlgebra. QRCompactWYQ (F, Q. T)
770+ p_b = paddeddata (b)
771+ lmul! (Q̃, view (p_b,oneto (m)))
772+ b
773+ end
774+
775+ function materialize! (L:: MatLmulMat{<:QRCompactWYQLayout{<:PaddedColumns}, <:Union{AbstractStridedLayout,AbstractPaddedLayout}} )
776+ Q,b = L. A,L. B
777+ F = paddeddata (Q. factors)
778+ m = size (F,1 )
779+ resizedata! (b, m, size (b,2 ))
780+ Q̃ = LinearAlgebra. QRCompactWYQ (F, Q. T)
781+ p_b = paddeddata (b)
782+ lmul! (Q̃, view (p_b,oneto (m),:))
783+ b
784+ end
785+
786+ function materialize! (L:: MatRmulMat{<:Union{AbstractStridedLayout,AbstractPaddedLayout}, <:QRCompactWYQLayout{<:PaddedColumns}} )
787+ A,Q = L. A,L. B
788+ F = paddeddata (Q. factors)
789+ m = size (F,1 )
790+ resizedata! (A, size (A,1 ), m)
791+ Q̃ = LinearAlgebra. QRCompactWYQ (F, Q. T)
792+ p_A = paddeddata (A)
793+ rmul! (view (p_A,:, oneto (m)), Q̃)
794+ A
795+ end
0 commit comments