Skip to content

Commit 119358a

Browse files
authored
Update ldiv.jl (#4)
* Update ldiv.jl * Add ldiv/rdiv * Increase coverage * v0.1.4
1 parent c7db689 commit 119358a

File tree

4 files changed

+54
-51
lines changed

4 files changed

+54
-51
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.1.3"
4+
version = "0.1.4"
55

66
[deps]
77
FillArrays = "1a297f60-69ca-5386-bcde-b61e274b549b"

src/ArrayLayouts.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ else
4646
import Base: require_one_based_indexing
4747
end
4848

49-
export materialize, materialize!, MulAdd, muladd!, Ldiv, Rdiv, Lmul, Rmul, lmul, rmul, mul, MemoryLayout, AbstractStridedLayout,
49+
export materialize, materialize!, MulAdd, muladd!, Ldiv, Rdiv, Lmul, Rmul, lmul, rmul, ldiv, rdiv, mul, MemoryLayout, AbstractStridedLayout,
5050
DenseColumnMajor, ColumnMajor, ZerosLayout, FillLayout, AbstractColumnMajor, RowMajor, AbstractRowMajor,
5151
DiagonalLayout, ScalarLayout, SymTridiagonalLayout, HermitianLayout, SymmetricLayout, TriangularLayout,
5252
UnknownLayout, AbstractBandedLayout, ApplyBroadcastStyle, ConjLayout, AbstractFillLayout,

src/ldiv.jl

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,45 +5,44 @@ for Typ in (:Ldiv, :Rdiv)
55
B::BType
66
end
77

8-
$Typ{StyleA, StyleB}(A::AType, B::BType) where {StyleA,StyleB,AType,BType} =
8+
@inline $Typ{StyleA, StyleB}(A::AType, B::BType) where {StyleA,StyleB,AType,BType} =
99
$Typ{StyleA,StyleB,AType,BType}(A,B)
1010

11-
$Typ(A::AType, B::BType) where {AType,BType} =
11+
@inline $Typ(A::AType, B::BType) where {AType,BType} =
1212
$Typ{typeof(MemoryLayout(AType)),typeof(MemoryLayout(BType)),AType,BType}(A, B)
1313

14-
BroadcastStyle(::Type{<:$Typ}) = ApplyBroadcastStyle()
15-
broadcastable(M::$Typ) = M
14+
@inline BroadcastStyle(::Type{<:$Typ}) = ApplyBroadcastStyle()
15+
@inline broadcastable(M::$Typ) = M
1616

1717
similar(A::$Typ, ::Type{T}, axes) where T = similar(Array{T}, axes)
1818
similar(A::$Typ, ::Type{T}) where T = similar(A, T, axes(A))
1919
similar(A::$Typ) = similar(A, eltype(A))
2020

21-
copy(M::$Typ) = copyto!(similar(M), M)
22-
materialize(M::$Typ) = copy(instantiate(M))
21+
@inline copy(M::$Typ) = copyto!(similar(M), M)
22+
@inline materialize(M::$Typ) = copy(instantiate(M))
2323
end
2424
end
2525

26-
size(L::Ldiv{<:Any,<:Any,<:Any,<:AbstractMatrix}) = (size(L.A, 2),size(L.B,2))
27-
size(L::Ldiv{<:Any,<:Any,<:Any,<:AbstractVector}) = (size(L.A, 2),)
28-
axes(L::Ldiv{<:Any,<:Any,<:Any,<:AbstractMatrix}) = (axes(L.A, 2),axes(L.B,2))
29-
axes(L::Ldiv{<:Any,<:Any,<:Any,<:AbstractVector}) = (axes(L.A, 2),)
30-
length(L::Ldiv{<:Any,<:Any,<:Any,<:AbstractVector}) =size(L.A, 2)
26+
@inline _ldivaxes(::Tuple{}, ::Tuple{}) = ()
27+
@inline _ldivaxes(::Tuple{}, Bax::Tuple) = Bax
28+
@inline _ldivaxes(::Tuple{<:Any}, ::Tuple{<:Any}) = ()
29+
@inline _ldivaxes(::Tuple{<:Any}, Bax::Tuple{<:Any,<:Any}) = (OneTo(1),last(Bax))
30+
@inline _ldivaxes(Aax::Tuple{<:Any,<:Any}, ::Tuple{<:Any}) = (last(Aax),)
31+
@inline _ldivaxes(Aax::Tuple{<:Any,<:Any}, Bax::Tuple{<:Any,<:Any}) = (last(Aax),last(Bax))
3132

32-
size(L::Rdiv) = (size(L.A, 1),size(L.B,1))
33-
axes(L::Rdiv) = (axes(L.A, 1),axes(L.B,1))
33+
@inline ldivaxes(A, B) = _ldivaxes(axes(A), axes(B))
3434

35-
_ldivaxes(::Tuple{}, ::Tuple{}) = ()
36-
_ldivaxes(::Tuple{}, Bax::Tuple) = Bax
37-
_ldivaxes(::Tuple{<:Any}, ::Tuple{<:Any}) = ()
38-
_ldivaxes(::Tuple{<:Any}, Bax::Tuple{<:Any,<:Any}) = (OneTo(1),last(Bax))
39-
_ldivaxes(Aax::Tuple{<:Any,<:Any}, ::Tuple{<:Any}) = (last(Aax),)
40-
_ldivaxes(Aax::Tuple{<:Any,<:Any}, Bax::Tuple{<:Any,<:Any}) = (last(Aax),last(Bax))
35+
@inline axes(L::Ldiv) = ldivaxes(L.A, L.B)
36+
@inline size(L::Ldiv) = map(length, axes(L))
37+
@inline length(L::Ldiv{<:Any,<:Any,<:Any,<:AbstractVector}) =size(L.A, 2)
4138

42-
@inline ldivaxes(A, B) = _ldivaxes(axes(A), axes(B))
39+
@inline size(L::Rdiv) = (size(L.A, 1),size(L.B,1))
40+
@inline axes(L::Rdiv) = (axes(L.A, 1),axes(L.B,1))
4341

44-
ndims(L::Ldiv) = ndims(last(L.args))
45-
eltype(M::Ldiv) = promote_type(Base.promote_op(inv, eltype(M.A)), eltype(M.B))
46-
eltype(M::Rdiv) = promote_type(eltype(M.A), Base.promote_op(inv, eltype(M.B)))
42+
@inline ndims(L::Ldiv) = ndims(L.B)
43+
@inline ndims(L::Rdiv) = 2
44+
@inline eltype(M::Ldiv) = promote_type(Base.promote_op(inv, eltype(M.A)), eltype(M.B))
45+
@inline eltype(M::Rdiv) = promote_type(eltype(M.A), Base.promote_op(inv, eltype(M.B)))
4746

4847

4948
check_ldiv_axes(A, B) =
@@ -54,34 +53,35 @@ check_rdiv_axes(A, B) =
5453

5554

5655

57-
function instantiate(L::Ldiv)
56+
@inline function instantiate(L::Ldiv)
5857
check_ldiv_axes(L.A, L.B)
5958
Ldiv(instantiate(L.A), instantiate(L.B))
6059
end
6160

62-
function instantiate(L::Rdiv)
61+
@inline function instantiate(L::Rdiv)
6362
check_rdiv_axes(L.A, L.B)
6463
Rdiv(instantiate(L.A), instantiate(L.B))
6564
end
6665

67-
_ldiv!(A, B) = ldiv!(factorize(A), B)
68-
_ldiv!(A::Factorization, B) = ldiv!(A, B)
69-
70-
_ldiv!(dest, A, B) = ldiv!(dest, factorize(A), B)
71-
_ldiv!(dest, A::Factorization, B) = ldiv!(dest, A, B)
72-
_ldiv!(dest, A::Transpose{<:Any,<:Factorization}, B) = ldiv!(dest, A, B)
73-
_ldiv!(dest, A::Adjoint{<:Any,<:Factorization}, B) = ldiv!(dest, A, B)
66+
@inline _ldiv!(A, B) = ldiv!(factorize(A), B)
67+
@inline _ldiv!(A::Factorization, B) = ldiv!(A, B)
7468

69+
@inline _ldiv!(dest, A, B) = ldiv!(dest, factorize(A), B)
70+
@inline _ldiv!(dest, A::Factorization, B) = ldiv!(dest, A, B)
71+
@inline _ldiv!(dest, A::Transpose{<:Any,<:Factorization}, B) = ldiv!(dest, A, B)
72+
@inline _ldiv!(dest, A::Adjoint{<:Any,<:Factorization}, B) = ldiv!(dest, A, B)
7573

74+
@inline ldiv(A, B) = materialize(Ldiv(A,B))
75+
@inline rdiv(A, B) = materialize(Rdiv(A,B))
7676

77-
materialize!(M::Ldiv) = _ldiv!(M.A, M.B)
78-
materialize!(M::Rdiv) = materialize!(Lmul(M.B', M.A'))'
79-
copyto!(dest::AbstractArray, M::Rdiv) = copyto!(dest', Ldiv(M.B', M.A'))'
77+
@inline materialize!(M::Ldiv) = _ldiv!(M.A, M.B)
78+
@inline materialize!(M::Rdiv) = materialize!(Lmul(M.B', M.A'))'
79+
@inline copyto!(dest::AbstractArray, M::Rdiv) = copyto!(dest', Ldiv(M.B', M.A'))'
8080

8181
if VERSION v"1.1-pre"
82-
copyto!(dest::AbstractArray, M::Ldiv) = _ldiv!(dest, M.A, M.B)
82+
@inline copyto!(dest::AbstractArray, M::Ldiv) = _ldiv!(dest, M.A, M.B)
8383
else
84-
copyto!(dest::AbstractArray, M::Ldiv) = _ldiv!(dest, M.A, copy(M.B))
84+
@inline copyto!(dest::AbstractArray, M::Ldiv) = _ldiv!(dest, M.A, copy(M.B))
8585
end
8686

8787
const MatLdivVec{styleA, styleB, T, V} = Ldiv{styleA, styleB, <:AbstractMatrix{T}, <:AbstractVector{V}}

test/test_ldiv.jl

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@ import ArrayLayouts: ApplyBroadcastStyle
77
b = randn(5)
88
M = Ldiv(A,b)
99

10+
@test ndims(M) == 1
1011
@test size(M) == (5,)
1112
@test similar(M) isa Vector{Float64}
1213
@test materialize(M) isa Vector{Float64}
13-
@test all(materialize(M) .=== (A\b))
14+
@test all(materialize(M) .=== (A\b) .=== ldiv(A,b))
1415

1516
@test Base.BroadcastStyle(typeof(Ldiv(A,b))) isa ApplyBroadcastStyle
1617

@@ -99,6 +100,8 @@ import ArrayLayouts: ApplyBroadcastStyle
99100
B = randn(5,5)
100101
M = Rdiv(A,B)
101102

103+
@test eltype(M) == Float64
104+
@test ndims(M) == 2
102105
@test size(M) == (3,5)
103106
@test axes(M) == (Base.OneTo(3),Base.OneTo(5))
104107
@test similar(M) isa Matrix{Float64}
@@ -109,17 +112,17 @@ import ArrayLayouts: ApplyBroadcastStyle
109112
D = Diagonal(randn(5))
110113
F = Eye(5)
111114
A = randn(5,5)
112-
@test copy(Ldiv(D,F)) == D \ F
113-
@test copy(Ldiv(F,D)) == F \ D
114-
@test copy(Ldiv(D,A)) D \ A
115-
@test copy(Ldiv(A,D)) == A \ D
116-
@test copy(Ldiv(F,A)) F \ A
117-
@test copy(Ldiv(A,F)) == A \ F
118-
119-
@test copy(Rdiv(D,F)) == D / F
120-
@test copy(Rdiv(F,D)) == F / D
121-
@test copy(Rdiv(A,D)) A / D
122-
@test copy(Rdiv(A,F)) == A / F
115+
@test copy(Ldiv(D,F)) == ldiv(D,F) == D \ F
116+
@test ldiv(F,D) == F \ D
117+
@test ldiv(D,A) D \ A
118+
@test ldiv(A,D) == A \ D
119+
@test ldiv(F,A) F \ A
120+
@test ldiv(A,F) == A \ F
121+
122+
@test copy(Rdiv(D,F)) == rdiv(D,F) == D / F
123+
@test rdiv(F,D) == F / D
124+
@test rdiv(A,D) A / D
125+
@test rdiv(A,F) == A / F
123126
end
124127
end
125128

0 commit comments

Comments
 (0)