@@ -63,9 +63,9 @@ struct LazyQuasiArrayApplyStyle <: ApplyStyle end
63
63
ndims (M:: Applied{LazyQuasiArrayApplyStyle,typeof(*)} ) = ndims (last (M. args))
64
64
65
65
66
- * (A:: AbstractQuasiArray , B... ) = materialize (Mul (A,B... ))
67
- * (A:: AbstractQuasiArray , B:: AbstractQuasiArray , C... ) = materialize (Mul (A,B,C... ))
68
- * (A:: AbstractArray , B:: AbstractQuasiArray , C... ) = materialize (Mul (A,B,C... ))
66
+ * (A:: AbstractQuasiArray , B... ) = fullmaterialize ( materialize (Mul (A,B... ) ))
67
+ * (A:: AbstractQuasiArray , B:: AbstractQuasiArray , C... ) = fullmaterialize ( materialize (Mul (A,B,C... ) ))
68
+ * (A:: AbstractArray , B:: AbstractQuasiArray , C... ) = fullmaterialize ( materialize (Mul (A,B,C... ) ))
69
69
70
70
pinv (A:: AbstractQuasiArray ) = materialize (PInv (A))
71
71
inv (A:: AbstractQuasiArray ) = materialize (Inv (A))
@@ -74,8 +74,8 @@ inv(A::AbstractQuasiArray) = materialize(Inv(A))
74
74
\ (A:: AbstractQuasiArray , B:: AbstractQuasiArray ) = materialize (Ldiv (A,B))
75
75
76
76
77
- * (A:: AbstractQuasiArray , B:: Mul , C... ) = materialize (Mul (A, B. args... , C... ))
78
- * (A:: Mul , B:: AbstractQuasiArray , C... ) = materialize (Mul (A. args... , B, C... ))
77
+ * (A:: AbstractQuasiArray , B:: Mul , C... ) = fullmaterialize ( materialize (Mul (A, B. args... , C... ) ))
78
+ * (A:: Mul , B:: AbstractQuasiArray , C... ) = fullmaterialize ( materialize (Mul (A. args... , B, C... ) ))
79
79
80
80
81
81
struct ApplyQuasiArray{T, N, App<: Applied } <: AbstractQuasiArray{T,N}
@@ -142,11 +142,53 @@ MulQuasiMatrix(factors...) = MulQuasiMatrix(Mul(factors...))
142
142
_MulArray (factors... ) = MulQuasiArray (factors... )
143
143
_MulArray (factors:: AbstractArray... ) = MulArray (factors... )
144
144
145
- * (A:: MulQuasiArray , B:: MulQuasiArray ) = materialize (Mul (A. applied. args... , B. applied. args... ))
146
- * (A:: MulQuasiArray , B:: AbstractQuasiArray ) = materialize (Mul (A. applied. args... , B))
147
- * (A:: AbstractQuasiArray , B:: MulQuasiArray ) = materialize (Mul (A, B. applied. args... ))
148
- * (A:: MulQuasiArray , B:: AbstractArray ) = materialize (Mul (A. applied. args... , B))
149
- * (A:: AbstractArray , B:: MulQuasiArray ) = materialize (Mul (A, B. applied. args... ))
145
+ most (a) = reverse (tail (reverse (a)))
146
+
147
+ MulQuasiOrArray = Union{MulArray,MulQuasiArray}
148
+
149
+ _factors (M:: MulQuasiOrArray ) = M. applied. args
150
+ _factors (M) = (M,)
151
+
152
+ _flatten () = ()
153
+ _flatten (A, B... ) = (A, _flatten (B... )... )
154
+ _flatten (A:: Mul , B... ) = _flatten (A. args... , B... )
155
+ flatten (A:: Mul ) = Mul (_flatten (A. args... )... )
156
+
157
+ _flatten (A:: MulQuasiArray , B... ) = _flatten (A. applied, B... )
158
+ flatten (A:: MulQuasiArray ) = MulQuasiArray (flatten (A. applied))
159
+
160
+ function fullmaterialize (M:: Applied{<:Any,typeof(*)} )
161
+ M_mat = materialize (flatten (M))
162
+ typeof (M_mat) <: MulQuasiOrArray || return M_mat
163
+ typeof (M_mat. applied) == typeof (M) || return (fullmaterialize (M_mat))
164
+
165
+ ABC = M_mat. applied. args
166
+ length (ABC) ≤ 2 && return M_mat
167
+
168
+ AB = most (ABC)
169
+ Mhead = fullmaterialize (Mul (AB... ))
170
+
171
+ typeof (_factors (Mhead)) == typeof (AB) ||
172
+ return fullmaterialize (Mul (_factors (Mhead)... , last (ABC)))
173
+
174
+ BC = tail (ABC)
175
+ Mtail = fullmaterialize (Mul (BC... ))
176
+ typeof (_factors (Mtail)) == typeof (BC) ||
177
+ return fullmaterialize (Mul (first (ABC), _factors (Mtail)... ))
178
+
179
+ first (ABC) * Mtail
180
+ end
181
+
182
+ fullmaterialize (M:: ApplyQuasiArray ) = fullmaterialize (M. applied)
183
+ fullmaterialize (M) = M
184
+
185
+ * (A:: MulQuasiArray , B:: MulQuasiArray ) = fullmaterialize (materialize (Mul (A. applied. args... , B. applied. args... )))
186
+ * (A:: MulQuasiArray , B:: AbstractQuasiArray ) = fullmaterialize (materialize (Mul (A. applied. args... , B)))
187
+ * (A:: AbstractQuasiArray , B:: MulQuasiArray ) = fullmaterialize (materialize (Mul (A, B. applied. args... )))
188
+ * (A:: MulQuasiArray , B:: AbstractArray ) = fullmaterialize (materialize (Mul (A. applied. args... , B)))
189
+ * (A:: AbstractArray , B:: MulQuasiArray ) = fullmaterialize (materialize (Mul (A, B. applied. args... )))
190
+
191
+
150
192
151
193
adjoint (A:: MulQuasiArray ) = MulQuasiArray (reverse (adjoint .(A. applied. args))... )
152
194
transpose (A:: MulQuasiArray ) = MulQuasiArray (reverse (transpose .(A. applied. args))... )
0 commit comments