1
+ for Typ in (:Ldiv , :Rdiv )
2
+ @eval begin
3
+ struct $ Typ{StyleA, StyleB, AType, BType}
4
+ A:: AType
5
+ B:: BType
6
+ end
1
7
8
+ $ Typ {StyleA, StyleB} (A:: AType , B:: BType ) where {StyleA,StyleB,AType,BType} =
9
+ $ Typ {StyleA,StyleB,AType,BType} (A,B)
2
10
11
+ $ Typ (A:: AType , B:: BType ) where {AType,BType} =
12
+ $ Typ {typeof(MemoryLayout(AType)),typeof(MemoryLayout(BType)),AType,BType} (A, B)
3
13
14
+ BroadcastStyle (:: Type{<:$Typ} ) = ApplyBroadcastStyle ()
15
+ broadcastable (M:: $Typ ) = M
4
16
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))
12
20
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
17
25
18
26
size (L:: Ldiv{<:Any,<:Any,<:Any,<:AbstractMatrix} ) = (size (L. A, 2 ),size (L. B,2 ))
19
27
size (L:: Ldiv{<:Any,<:Any,<:Any,<:AbstractVector} ) = (size (L. A, 2 ),)
20
28
axes (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 ),)
22
30
length (L:: Ldiv{<:Any,<:Any,<:Any,<:AbstractVector} ) = size (L. A, 2 )
23
31
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
+
24
35
_ldivaxes (:: Tuple{} , :: Tuple{} ) = ()
25
36
_ldivaxes (:: Tuple{} , Bax:: Tuple ) = Bax
26
37
_ldivaxes (:: Tuple{<:Any} , :: Tuple{<:Any} ) = ()
@@ -32,27 +43,26 @@ _ldivaxes(Aax::Tuple{<:Any,<:Any}, Bax::Tuple{<:Any,<:Any}) = (last(Aax),last(Ba
32
43
33
44
ndims (L:: Ldiv ) = ndims (last (L. args))
34
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)))
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" ))
35
54
36
- BroadcastStyle (:: Type{<:Ldiv} ) = ApplyBroadcastStyle ()
37
- broadcastable (M:: Ldiv ) = M
38
55
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))
42
56
43
57
function instantiate (L:: Ldiv )
44
58
check_ldiv_axes (L. A, L. B)
45
59
Ldiv (instantiate (L. A), instantiate (L. B))
46
60
end
47
61
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
56
66
57
67
_ldiv! (A, B) = ldiv! (factorize (A), B)
58
68
_ldiv! (A:: Factorization , B) = ldiv! (A, B)
@@ -61,7 +71,11 @@ _ldiv!(dest, A, B) = ldiv!(dest, factorize(A), B)
61
71
_ldiv! (dest, A:: Factorization , B) = ldiv! (dest, A, B)
62
72
63
73
74
+
64
75
materialize! (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
+
65
79
if VERSION ≥ v " 1.1-pre"
66
80
copyto! (dest:: AbstractArray , M:: Ldiv ) = _ldiv! (dest, M. A, M. B)
67
81
else
@@ -73,6 +87,13 @@ const MatLdivMat{styleA, styleB, T, V} = Ldiv{styleA, styleB, <:AbstractMatrix{T
73
87
const BlasMatLdivVec{styleA, styleB, T<: BlasFloat } = MatLdivVec{styleA, styleB, T, T}
74
88
const BlasMatLdivMat{styleA, styleB, T<: BlasFloat } = MatLdivMat{styleA, styleB, T, T}
75
89
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
+
76
97
77
98
macro lazyldiv (Typ)
78
99
esc (quote
@@ -83,5 +104,18 @@ macro lazyldiv(Typ)
83
104
84
105
Base.:\ (A:: $Typ , x:: AbstractVector ) = ArrayLayouts. materialize (ArrayLayouts. Ldiv (A,x))
85
106
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))
86
120
end )
87
- end
121
+ end
0 commit comments