1+ for Typ in (:Ldiv , :Rdiv )
2+ @eval begin
3+ struct $ Typ{StyleA, StyleB, AType, BType}
4+ A:: AType
5+ B:: BType
6+ end
17
8+ $ Typ {StyleA, StyleB} (A:: AType , B:: BType ) where {StyleA,StyleB,AType,BType} =
9+ $ Typ {StyleA,StyleB,AType,BType} (A,B)
210
11+ $ Typ (A:: AType , B:: BType ) where {AType,BType} =
12+ $ Typ {typeof(MemoryLayout(AType)),typeof(MemoryLayout(BType)),AType,BType} (A, B)
313
14+ BroadcastStyle (:: Type{<:$Typ} ) = ApplyBroadcastStyle ()
15+ broadcastable (M:: $Typ ) = M
416
5- struct Ldiv{StyleA, StyleB, AType, BType}
6- A:: AType
7- B:: BType
8- end
9-
10- Ldiv {StyleA, StyleB} (A:: AType , B:: BType ) where {StyleA,StyleB,AType,BType} =
11- Ldiv {StyleA,StyleB,AType,BType} (A,B)
17+ similar (A:: $Typ , :: Type{T} , axes) where T = similar (Array{T}, axes)
18+ similar (A:: $Typ , :: Type{T} ) where T = similar (A, T, axes (A))
19+ similar (A:: $Typ ) = similar (A, eltype (A))
1220
13- Ldiv (A :: AType , B :: BType ) where {AType,BType} =
14- Ldiv {typeof(MemoryLayout(AType)),typeof(MemoryLayout(BType)),AType,BType} (A, B )
15-
16- struct LdivBroadcastStyle <: BroadcastStyle end
21+ copy (M :: $Typ ) = copyto! ( similar (M), M)
22+ materialize (M :: $Typ ) = copy ( instantiate (M) )
23+ end
24+ end
1725
1826size (L:: Ldiv{<:Any,<:Any,<:Any,<:AbstractMatrix} ) = (size (L. A, 2 ),size (L. B,2 ))
1927size (L:: Ldiv{<:Any,<:Any,<:Any,<:AbstractVector} ) = (size (L. A, 2 ),)
2028axes (L:: Ldiv{<:Any,<:Any,<:Any,<:AbstractMatrix} ) = (axes (L. A, 2 ),axes (L. B,2 ))
21- axes (L:: Ldiv{<:Any,<:Any,<:Any,<:AbstractVector} ) = (axes (L. A, 2 ),)
29+ axes (L:: Ldiv{<:Any,<:Any,<:Any,<:AbstractVector} ) = (axes (L. A, 2 ),)
2230length (L:: Ldiv{<:Any,<:Any,<:Any,<:AbstractVector} ) = size (L. A, 2 )
2331
32+ size (L:: Rdiv ) = (size (L. A, 1 ),size (L. B,1 ))
33+ axes (L:: Rdiv ) = (axes (L. A, 1 ),axes (L. B,1 ))
34+
2435_ldivaxes (:: Tuple{} , :: Tuple{} ) = ()
2536_ldivaxes (:: Tuple{} , Bax:: Tuple ) = Bax
2637_ldivaxes (:: Tuple{<:Any} , :: Tuple{<:Any} ) = ()
@@ -32,27 +43,26 @@ _ldivaxes(Aax::Tuple{<:Any,<:Any}, Bax::Tuple{<:Any,<:Any}) = (last(Aax),last(Ba
3243
3344ndims (L:: Ldiv ) = ndims (last (L. args))
3445eltype (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)))
47+
48+
49+ check_ldiv_axes (A, B) =
50+ axes (A,1 ) == axes (B,1 ) || throw (DimensionMismatch (" First axis of A, $(axes (A,1 )) , and first axis of B, $(axes (B,1 )) must match" ))
51+
52+ check_rdiv_axes (A, B) =
53+ axes (A,2 ) == axes (B,2 ) || throw (DimensionMismatch (" Second axis of A, $(axes (A,2 )) , and second axis of B, $(axes (B,2 )) must match" ))
3554
36- BroadcastStyle (:: Type{<:Ldiv} ) = ApplyBroadcastStyle ()
37- broadcastable (M:: Ldiv ) = M
3855
39- similar (A:: Ldiv , :: Type{T} , axes) where T = similar (Array{T}, axes)
40- similar (A:: Ldiv , :: Type{T} ) where T = similar (A, T, axes (A))
41- similar (A:: Ldiv ) = similar (A, eltype (A))
4256
4357function instantiate (L:: Ldiv )
4458 check_ldiv_axes (L. A, L. B)
4559 Ldiv (instantiate (L. A), instantiate (L. B))
4660end
4761
48-
49- check_ldiv_axes (A, B) =
50- axes (A,1 ) == axes (B,1 ) || throw (DimensionMismatch (" First axis of A, $(axes (A,1 )) , and first axis of B, $(axes (B,1 )) must match" ))
51-
52-
53-
54- copy (M:: Ldiv ) = copyto! (similar (M), M)
55- materialize (M:: Ldiv ) = copy (instantiate (M))
62+ function instantiate (L:: Rdiv )
63+ check_rdiv_axes (L. A, L. B)
64+ Rdiv (instantiate (L. A), instantiate (L. B))
65+ end
5666
5767_ldiv! (A, B) = ldiv! (factorize (A), B)
5868_ldiv! (A:: Factorization , B) = ldiv! (A, B)
@@ -61,7 +71,11 @@ _ldiv!(dest, A, B) = ldiv!(dest, factorize(A), B)
6171_ldiv! (dest, A:: Factorization , B) = ldiv! (dest, A, B)
6272
6373
74+
6475materialize! (M:: Ldiv ) = _ldiv! (M. A, M. B)
76+ materialize! (M:: Rdiv ) = materialize! (Lmul (M. B' , M. A' ))'
77+ copyto! (dest:: AbstractArray , M:: Rdiv ) = copyto! (dest' , Ldiv (M. B' , M. A' ))'
78+
6579if VERSION ≥ v " 1.1-pre"
6680 copyto! (dest:: AbstractArray , M:: Ldiv ) = _ldiv! (dest, M. A, M. B)
6781else
@@ -73,6 +87,13 @@ const MatLdivMat{styleA, styleB, T, V} = Ldiv{styleA, styleB, <:AbstractMatrix{T
7387const BlasMatLdivVec{styleA, styleB, T<: BlasFloat } = MatLdivVec{styleA, styleB, T, T}
7488const BlasMatLdivMat{styleA, styleB, T<: BlasFloat } = MatLdivMat{styleA, styleB, T, T}
7589
90+ const MatRdivMat{styleA, styleB, T, V} = Rdiv{styleA, styleB, <: AbstractMatrix{T} , <: AbstractMatrix{V} }
91+ const BlasMatRdivMat{styleA, styleB, T<: BlasFloat } = MatRdivMat{styleA, styleB, T, T}
92+
93+ # function materialize!(L::BlasMatLdivVec{<:AbstractColumnMajor,<:AbstractColumnMajor})
94+
95+ # end
96+
7697
7798macro lazyldiv (Typ)
7899 esc (quote
@@ -83,5 +104,18 @@ macro lazyldiv(Typ)
83104
84105 Base.:\ (A:: $Typ , x:: AbstractVector ) = ArrayLayouts. materialize (ArrayLayouts. Ldiv (A,x))
85106 Base.:\ (A:: $Typ , x:: AbstractMatrix ) = ArrayLayouts. materialize (ArrayLayouts. Ldiv (A,x))
107+
108+ Base.:\ (x:: AbstractMatrix , A:: $Typ ) = ArrayLayouts. materialize (ArrayLayouts. Ldiv (x,A))
109+ Base.:\ (x:: Diagonal , A:: $Typ ) = ArrayLayouts. materialize (ArrayLayouts. Ldiv (x,A))
110+
111+ Base.:\ (x:: $Typ , A:: $Typ ) = ArrayLayouts. materialize (ArrayLayouts. Ldiv (x,A))
112+
113+ Base.:/ (A:: $Typ , x:: AbstractVector ) = ArrayLayouts. materialize (ArrayLayouts. Rdiv (A,x))
114+ Base.:/ (A:: $Typ , x:: AbstractMatrix ) = ArrayLayouts. materialize (ArrayLayouts. Rdiv (A,x))
115+
116+ Base.:/ (x:: AbstractMatrix , A:: $Typ ) = ArrayLayouts. materialize (ArrayLayouts. Rdiv (x,A))
117+ Base.:/ (x:: Diagonal , A:: $Typ ) = ArrayLayouts. materialize (ArrayLayouts. Rdiv (x,A))
118+
119+ Base.:/ (x:: $Typ , A:: $Typ ) = ArrayLayouts. materialize (ArrayLayouts. Rdiv (x,A))
86120 end )
87- end
121+ end
0 commit comments