Skip to content

Commit 1a18ba4

Browse files
authored
Nested broadcast (#46)
* overload copy * Update lazyquasiarrays.jl * Simplify broadcast * LazyArrays v0.18 * Increase coverage * Update test_quasibroadcast.jl
1 parent 3db8b59 commit 1a18ba4

File tree

6 files changed

+30
-18
lines changed

6 files changed

+30
-18
lines changed

Project.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "QuasiArrays"
22
uuid = "c4ea9172-b204-11e9-377d-29865faadc5c"
33
authors = ["Sheehan Olver <solver@mac.com>"]
4-
version = "0.3.2"
4+
version = "0.3.3"
55

66
[deps]
77
ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"
@@ -10,7 +10,7 @@ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
1010

1111
[compat]
1212
ArrayLayouts = "0.4.3"
13-
LazyArrays = "0.17"
13+
LazyArrays = "0.17, 0.18"
1414
julia = "1.5"
1515

1616
[extras]

src/inv.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,4 @@ pinv(A::PInvQuasiMatrix) = first(A.args)
5454
inv(A::QuasiMatrix) = QuasiArray(inv(A.parent), reverse(A.axes))
5555

5656
_factorize(_, A) = error("Overload for $(typeof(A))")
57-
factorize(A::AbstractQuasiArray) = _factorize(MemoryLayout(typeof(A)), A)
57+
factorize(A::AbstractQuasiArray) = _factorize(MemoryLayout(A), A)

src/lazyquasiarrays.jl

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

7474
copy(A::Applied{LazyQuasiArrayApplyStyle}) = ApplyQuasiArray(A)
@@ -103,14 +103,16 @@ BroadcastQuasiArray{T,N}(bc::Broadcasted{Style,Axes,F,Args}) where {T,N,Style,Ax
103103
BroadcastQuasiArray{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)
109109
BroadcastQuasiArray(bc::Broadcasted{S}) where S =
110110
_BroadcastQuasiArray(instantiate(Broadcasted{S}(bc.f, _broadcast2broadcastarray(bc.args...))))
111111
BroadcastQuasiArray(b::BroadcastQuasiArray) = b
112112
BroadcastQuasiArray(f, A, As...) = BroadcastQuasiArray(broadcasted(f, A, As...))
113113

114+
@inline BroadcastQuasiArray(A::AbstractQuasiArray) = BroadcastQuasiArray(call(A), arguments(A)...)
115+
114116
broadcasted(A::BroadcastQuasiArray) = instantiate(broadcasted(A.f, A.args...))
115117

116118
axes(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-
139134
copy(bc::Broadcasted{<:LazyQuasiArrayStyle}) = BroadcastQuasiArray(bc)
140135

141136

142137
BroadcastStyle(::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

147142
arguments(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

161156
ndims(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

src/quasibroadcast.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ Base.@propagate_inbounds newindex(arg, I::QuasiCartesianIndex) = QuasiCartesianI
117117
end
118118

119119
Base.@propagate_inbounds Base.getindex(bc::Broadcasted{<:AbstractQuasiArrayStyle}, i1::Number, I::Number...) = bc[QuasiCartesianIndex(i1, I...)]
120+
Base.@propagate_inbounds Base.getindex(bc::Broadcasted{<:AbstractQuasiArrayStyle}, i1::Integer, i2::Integer, I::Integer...) = bc[QuasiCartesianIndex(i1, i2, I...)]
120121
Base.@propagate_inbounds Base.getindex(bc::Broadcasted{<:AbstractQuasiArrayStyle}) = bc[QuasiCartesianIndex()]
121122

122123
@inline Base.checkbounds(bc::Broadcasted{<:AbstractQuasiArrayStyle}, I::Number) =

test/test_quasibroadcast.jl

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# This file is based on a part of Julia. License is MIT: https://julialang.org/license
22

3-
using QuasiArrays, Test
3+
using QuasiArrays, LazyArrays, Test
44
import Base: OneTo, Slice
55
import Base.Broadcast: check_broadcast_axes, newindex, broadcasted, broadcastable, Broadcasted, DefaultArrayStyle, BroadcastStyle
66
import QuasiArrays: QuasiCartesianIndex, QuasiCartesianIndices, DefaultQuasiArrayStyle, SubQuasiArray
@@ -120,7 +120,6 @@ import QuasiArrays: QuasiCartesianIndex, QuasiCartesianIndices, DefaultQuasiArra
120120
a = QuasiVector(randn(6), 0:0.5:2.5)
121121
b = BroadcastQuasiArray(exp, a)
122122
@test b[0.5] == exp(a[0.5])
123-
@test b[0.5:0.5:1.0] isa QuasiArrays.BroadcastArray
124123
@test b[0.5:0.5:1.0] == b[[0.5,1.0]] == exp.(a[0.5:0.5:1.0])
125124

126125
A = QuasiArray(randn(6,6), (0:0.5:2.5,0:0.5:2.5))
@@ -143,6 +142,16 @@ import QuasiArrays: QuasiCartesianIndex, QuasiCartesianIndices, DefaultQuasiArra
143142
x = Inclusion([0.0,2.0])
144143
@test BroadcastQuasiArray(exp,x)[QuasiCartesianIndex(2.0)] == exp(2.0)
145144
end
145+
146+
@testset "subview" begin
147+
v = view(b,0.0:0.5:1.0)
148+
c = BroadcastArray(v)
149+
@test c == b[0.0:0.5:1.0]
150+
151+
w = view(b,Inclusion(0.0:0.5:1.0))
152+
d = BroadcastQuasiArray(w)
153+
@test d == b[Inclusion(0.0:0.5:1.0)]
154+
end
146155
end
147156

148157
@testset "SubQuasi Broadcast" begin

test/test_quasilazy.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,4 +95,11 @@ Base.getindex(A::MyQuasiLazyMatrix, x::Float64, y::Float64) = A.A[x,y]
9595
@test A^2.5 * b Ap*b
9696
@test A^2.5 * B Ap*B
9797
end
98+
@testset "Broadcast" begin
99+
A = MyQuasiLazyMatrix(QuasiArray(rand(3,3),(0:0.5:1,0:0.5:1)))
100+
@test exp.(A) isa BroadcastQuasiArray
101+
@test exp.(A) == exp.(A.A)
102+
@test exp.(exp.(A) .+ 1) isa BroadcastQuasiArray
103+
@test exp.(exp.(A) .+ 1) == exp.(exp.(A.A) .+ 1)
104+
end
98105
end

0 commit comments

Comments
 (0)