@@ -68,7 +68,7 @@ copy(A::ApplyQuasiArray) = A # immutable arrays don't need to copy
6868@propagate_inbounds _getindex (:: Type{IND} , A:: ApplyQuasiArray , I:: IND ) where {M,IND} =
6969 Applied (A)[I... ]
7070
71- MemoryLayout (M:: Type{ApplyQuasiArray{T,N,F,Args}} ) where {T,N,F,Args} =
71+ MemoryLayout (M:: Type{ApplyQuasiArray{T,N,F,Args}} ) where {T,N,F,Args} =
7272 applylayout (F, tuple_type_memorylayouts (Args)... )
7373
7474copy (A:: Applied{LazyQuasiArrayApplyStyle} ) = ApplyQuasiArray (A)
@@ -103,14 +103,16 @@ BroadcastQuasiArray{T,N}(bc::Broadcasted{Style,Axes,F,Args}) where {T,N,Style,Ax
103103BroadcastQuasiArray {T} (bc:: Broadcasted{<:Union{Nothing,BroadcastStyle},<:Tuple{Vararg{Any,N}},<:Any,<:Tuple} ) where {T,N} =
104104 BroadcastQuasiArray {T,N} (bc)
105105
106- _broadcast2broadcastarray (a:: Broadcasted{<:LazyQuasiArrayStyle} , b... ) = tuple (BroadcastQuasiArray (a), b ... )
106+ _broadcast2broadcastarray (a:: Broadcasted{<:LazyQuasiArrayStyle} , b... ) = tuple (BroadcastQuasiArray (a), _broadcast2broadcastarray (b ... ) ... )
107107
108108_BroadcastQuasiArray (bc:: Broadcasted ) = BroadcastQuasiArray {combine_eltypes(bc.f, bc.args)} (bc)
109109BroadcastQuasiArray (bc:: Broadcasted{S} ) where S =
110110 _BroadcastQuasiArray (instantiate (Broadcasted {S} (bc. f, _broadcast2broadcastarray (bc. args... ))))
111111BroadcastQuasiArray (b:: BroadcastQuasiArray ) = b
112112BroadcastQuasiArray (f, A, As... ) = BroadcastQuasiArray (broadcasted (f, A, As... ))
113113
114+ @inline BroadcastQuasiArray (A:: AbstractQuasiArray ) = BroadcastQuasiArray (call (A), arguments (A)... )
115+
114116broadcasted (A:: BroadcastQuasiArray ) = instantiate (broadcasted (A. f, A. args... ))
115117
116118axes (A:: BroadcastQuasiArray ) = axes (broadcasted (A))
@@ -129,23 +131,16 @@ copy(A::BroadcastQuasiArray) = A # BroadcastQuasiArray are immutable
129131 A[kj. I... ]
130132
131133
132- @propagate_inbounds _broadcast_getindex_range (A:: Union{Ref,AbstractQuasiArray{<:Any,0},Number} , I) = A # Scalar-likes can just ignore all indices
133- # Everything else falls back to dynamically dropping broadcasted indices based upon its axes
134- @propagate_inbounds _broadcast_getindex_range (A, I) = A[I]
135-
136- getindex (B:: BroadcastQuasiArray{<:Any,1} , kr:: AbstractVector{<:Number} ) =
137- BroadcastArray (B. f, map (a -> _broadcast_getindex_range (a,kr), B. args)... )
138-
139134copy (bc:: Broadcasted{<:LazyQuasiArrayStyle} ) = BroadcastQuasiArray (bc)
140135
141136
142137BroadcastStyle (:: Type{<:LazyQuasiArray{<:Any,N}} ) where N = LazyQuasiArrayStyle {N} ()
143138
144- MemoryLayout (M:: Type{BroadcastQuasiArray{T,N,F,Args}} ) where {T,N,F,Args} =
139+ MemoryLayout (M:: Type{BroadcastQuasiArray{T,N,F,Args}} ) where {T,N,F,Args} =
145140 broadcastlayout (F, tuple_type_memorylayouts (Args)... )
146141
147142arguments (b:: BroadcastLayout , V:: SubQuasiArray ) = LazyArrays. _broadcast_sub_arguments (V)
148-
143+ call (b :: BroadcastLayout , a :: SubQuasiArray ) = call (b, parent (a))
149144
150145
151146# ##
@@ -155,7 +150,7 @@ arguments(b::BroadcastLayout, V::SubQuasiArray) = LazyArrays._broadcast_sub_argu
155150# a .* (B * C) flattens to (a .* B) * C
156151__broadcast_mul_arguments (a, B, C... ) = (a .* B, C... )
157152_broadcast_mul_arguments (a, B) = __broadcast_mul_arguments (a, _mul_arguments (B)... )
158- _mul_arguments (A:: BroadcastQuasiMatrix{<:Any,typeof(*),<:Tuple{AbstractQuasiVector,AbstractQuasiMatrix}} ) =
153+ _mul_arguments (A:: BroadcastQuasiMatrix{<:Any,typeof(*),<:Tuple{AbstractQuasiVector,AbstractQuasiMatrix}} ) =
159154 _broadcast_mul_arguments (A. args... )
160155
161156ndims (M:: Applied{LazyQuasiArrayApplyStyle,typeof(*)} ) = ndims (last (M. args))
@@ -186,4 +181,4 @@ function *(App::ApplyQuasiMatrix{<:Any,typeof(^),<:Tuple{<:AbstractQuasiMatrix{T
186181 p < 0 && return ApplyQuasiMatrix (^ ,inv (A),- p)* b
187182 p == 0 && return copy (b)
188183 return A* (ApplyQuasiMatrix (^ ,A,p- 1 )* b)
189- end
184+ end
0 commit comments