Skip to content

Commit 780ffeb

Browse files
authored
adjoint/transpose broadcast (#16)
* adjoint/transpose broadcast * fix dot notation * Support LazyArrays 0.12 * permutedims * Diagonal * is now BroadcastArray * vcat with fill * v0.3 * Update infrange.jl * Update runtests.jl * Update runtests.jl * override other OneTo case
1 parent cd12c7e commit 780ffeb

File tree

4 files changed

+54
-9
lines changed

4 files changed

+54
-9
lines changed

Project.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "InfiniteArrays"
22
uuid = "4858937d-0d70-526a-a4dd-2d5cb5dd786c"
3-
version = "0.2"
3+
version = "0.3"
44

55
[deps]
66
DSP = "717857b8-e6f2-59f4-9121-6e50c889abd2"
@@ -12,8 +12,8 @@ Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
1212

1313
[compat]
1414
DSP = "0.5.1, 0.6"
15-
FillArrays = "0.6, 0.7"
16-
LazyArrays = "0.11"
15+
FillArrays = "0.7.1"
16+
LazyArrays = "0.12"
1717
julia = "1"
1818

1919
[extras]

src/InfiniteArrays.jl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import Base: *, +, -, /, \, ==, isinf, isfinite, sign, angle, show, isless,
2222
AbstractArray, AbstractVector, Array, Vector, Matrix,
2323
axes, (:), _sub2ind_recurse, broadcast, promote_eltypeof,
2424
diff, cumsum, show_delim_array, show_circular, Int,
25-
similar, _unsafe_getindex, string, zeros, fill
25+
similar, _unsafe_getindex, string, zeros, fill, permutedims
2626

2727
using Base.Broadcast
2828
import Base.Broadcast: BroadcastStyle, AbstractArrayStyle, Broadcasted, broadcasted,
@@ -80,7 +80,8 @@ length(::Zeros{<:Any,2,Tuple{OneToInf{Int},OneToInf{Int}}}) = ∞
8080
length(::Zeros{<:Any,2,<:Tuple{OneToInf{Int},<:Any}}) =
8181
length(::Zeros{<:Any,2,<:Tuple{<:Any,OneToInf{Int}}}) =
8282

83-
83+
vcat(a::Number, b::AbstractFill{<:Any,1,<:Tuple{<:OneToInf}}) = Vcat(a, b)
84+
vcat(a::AbstractVector, b::AbstractFill{<:Any,1,<:Tuple{<:OneToInf}}) = Vcat(a, b)
8485

8586
##
8687
# Temporary hacks for base support
@@ -89,6 +90,8 @@ OneTo(::Infinity) = OneToInf()
8990
OneTo{T}(::Infinity) where T<:Integer = OneToInf{T}()
9091
UnitRange(start::Integer, ::Infinity) = InfUnitRange(start)
9192
UnitRange{T}(start::Integer, ::Infinity) where T<:Real = InfUnitRange{T}(start)
93+
OneTo(a::OneToInf) = a
94+
OneTo{T}(::OneToInf) where T<:Integer = OneToInf{T}()
9295

9396
Int(::Infinity) =
9497

src/infrange.jl

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,8 @@ in(x::Real, r::InfRanges{T}) where {T<:Integer} =
354354
### Lazy broadcasting
355355

356356
BroadcastStyle(::Type{<:InfRanges}) = LazyArrayStyle{1}()
357+
BroadcastStyle(::Type{<:Adjoint{<:Any,<:InfRanges}}) = LazyArrayStyle{2}()
358+
BroadcastStyle(::Type{<:Transpose{<:Any,<:InfRanges}}) = LazyArrayStyle{2}()
357359

358360

359361

@@ -364,6 +366,20 @@ BroadcastStyle(::Type{<:SubArray{<:Any,2,<:Any,<:Tuple{<:InfIndexRanges,<:InfInd
364366
BroadcastStyle(::Type{<:SubArray{<:Any,2,<:Any,<:Tuple{<:InfIndexRanges,<:Any}}})= LazyArrayStyle{1}()
365367
BroadcastStyle(::Type{<:SubArray{<:Any,2,<:Any,<:Tuple{<:Any,<:InfIndexRanges}}})= LazyArrayStyle{1}()
366368

369+
broadcasted(::BroadcastStyle, f, r::Adjoint{<:Any,<:InfRanges}) = broadcast(f,parent(r))'
370+
broadcasted(::BroadcastStyle, f, r::Transpose{<:Any,<:InfRanges}) = transpose(broadcast(f,parent(r)))
371+
broadcasted(::BroadcastStyle, f, a::Number, r::Adjoint{<:Any,<:InfRanges}) = broadcast(f,a,parent(r))'
372+
broadcasted(::BroadcastStyle, f, a::Number, r::Transpose{<:Any,<:InfRanges}) = transpose(broadcast(f,a,parent(r)))
373+
broadcasted(::BroadcastStyle, f, r::Adjoint{<:Any,<:InfRanges}, a::Number) = broadcast(f,parent(r),a)'
374+
broadcasted(::BroadcastStyle, f, r::Transpose{<:Any,<:InfRanges}, a::Number) = transpose(broadcast(f,parent(r),a))
375+
376+
broadcast(f, r::Adjoint{<:Any,<:InfRanges}) = broadcast(f,parent(r))'
377+
broadcast(f, r::Transpose{<:Any,<:InfRanges}) = transpose(broadcast(f,parent(r)))
378+
broadcast(f, a::Number, r::Adjoint{<:Any,<:InfRanges}) = broadcast(f,a,parent(r))'
379+
broadcast(f, a::Number, r::Transpose{<:Any,<:InfRanges}) = transpose(broadcast(f,a,parent(r)))
380+
broadcast(f, r::Adjoint{<:Any,<:InfRanges}, a::Number) = broadcast(f,parent(r),a)'
381+
broadcast(f, r::Transpose{<:Any,<:InfRanges}, a::Number) = transpose(broadcast(f,parent(r),a))
382+
367383

368384
cumsum(r::InfRanges) = OneToInf() .* (first(r) .+ r) 2
369385

@@ -448,3 +464,10 @@ end
448464

449465
MemoryLayout(::Type{<:AbstractInfUnitRange}) = LazyLayout()
450466
MemoryLayout(::Type{<:InfStepRange}) = LazyLayout()
467+
468+
469+
####
470+
# permutedims
471+
####
472+
permutedims(r::InfRanges) = transpose(r)
473+
permutedims(r::BroadcastVector{<:Number,<:Any,<:Tuple{Int,InfRanges}}) = transpose(r)

test/runtests.jl

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
using LinearAlgebra, SparseArrays, InfiniteArrays, FillArrays, LazyArrays, Statistics, DSP, BandedMatrices, Test
22
import InfiniteArrays: OrientedInfinity, OneToInf, InfUnitRange, InfStepRange
3-
import LazyArrays: CachedArray, MemoryLayout, LazyLayout
3+
import LazyArrays: CachedArray, MemoryLayout, LazyLayout, DiagonalLayout, LazyArrayStyle
44
import BandedMatrices: _BandedMatrix, BandedColumns
5+
import Base.Broadcast: broadcasted, Broadcasted, instantiate
56

67
@testset "" begin
78
@test 1
@@ -272,6 +273,12 @@ end
272273
@test broadcast(-, 1:2:∞, 1) 0:2:
273274
@test broadcast(-, 1:2:∞, 0.3) 1-0.3:2:
274275
@test broadcast(-, 2, 1:∞) 1:-1:-
276+
@test exp.((1:∞)') broadcast(exp, (1:∞)') exp.(1:∞)'
277+
@test exp.(transpose(1:∞)) broadcast(exp, transpose(1:∞)) transpose(exp.(1:∞))
278+
@test 1 .+ (1:∞)' broadcast(+, 1, (1:∞)') (2:∞)'
279+
@test 1 .+ transpose(1:∞) broadcast(+, 1, transpose(1:∞)) transpose(2:∞)
280+
@test (1:∞)' .+ 1 broadcast(+, (1:∞)', 1) (2:∞)'
281+
@test transpose(1:∞) .+ 1 broadcast(+, transpose(1:∞), 1) transpose(2:∞)
275282
end
276283

277284
@testset "near-equal ranges" begin
@@ -421,8 +428,15 @@ end
421428
@test_broken D^2 isa Diagonal
422429
@test D*D isa Diagonal
423430
@test MemoryLayout(typeof(D.diag)) == LazyLayout()
424-
@test MemoryLayout(typeof(D)) == LazyLayout()
425-
@test Ones(∞,∞)*D isa ApplyArray
431+
@test MemoryLayout(typeof(D)) == DiagonalLayout{LazyLayout}()
432+
@test Base.BroadcastStyle(typeof(D)) == LazyArrayStyle{2}()
433+
@test Base.BroadcastStyle(typeof(permutedims(D.diag))) == LazyArrayStyle{2}()
434+
bc = broadcasted(*,Ones(∞,∞),permutedims(D.diag))
435+
@test bc isa Broadcasted{LazyArrayStyle{2}}
436+
@test instantiate(bc) isa Broadcasted{LazyArrayStyle{2}}
437+
@test copy(instantiate(bc)) isa BroadcastArray
438+
@test broadcast(*,Ones(∞,∞),permutedims(D.diag)) isa BroadcastArray
439+
@test Ones(∞,∞)*D isa BroadcastArray
426440
@test (Ones(∞,∞)*D)[1:10,1:10] == Ones(10,10)*D[1:10,1:10]
427441
end
428442

@@ -594,7 +608,7 @@ end
594608
C = Vcat([1,2,3], Zeros(∞))
595609
D = Vcat(Fill(1,3,∞), Zeros(∞,∞))
596610

597-
@test A*B isa ApplyArray
611+
@test A*B isa BroadcastArray
598612
@test size(A*B) == (3,∞)
599613
@test (A*B)[1:3,1:10] == Fill(1,3,10)*Diagonal(1:10)
600614

@@ -618,4 +632,9 @@ end
618632
@testset "Banded" begin
619633
A = _BandedMatrix((0:∞)', ∞, -1, 1)
620634
@test_broken apply(*, Eye(∞), A) A
635+
end
636+
637+
@testset "permutedims" begin
638+
@test permutedims(1:∞) isa Transpose
639+
@test permutedims(1:∞)[1,1:10] == (1:10)
621640
end

0 commit comments

Comments
 (0)