@@ -110,10 +110,9 @@ function Butterfly(A::AbstractMatrix{T}, L::Int; isorthogonal::Bool = false, opt
110110 Butterfly (columns, factors, permutations, indices, threadsafezeros (T, kk), threadsafezeros (T, kk), threadsafezeros (T, kk), threadsafezeros (T, kk))
111111end
112112
113- if VERSION ≥ v " 0.7-"
114- LinearAlgebra. adjoint (B:: Butterfly ) = Adjoint (B)
115- LinearAlgebra. transpose (B:: Butterfly ) = Transpose (B)
116- end
113+ LinearAlgebra. adjoint (B:: Butterfly ) = Adjoint (B)
114+ LinearAlgebra. transpose (B:: Butterfly ) = Transpose (B)
115+
117116
118117function sumkmax (indices:: Vector{Vector{Int}} )
119118 ret = 0
@@ -173,66 +172,61 @@ function rowperm!(fwd::Bool, y::AbstractVector, x::AbstractVector, p::Vector{Int
173172end
174173
175174# # ColumnPermutation
176- mul! (A:: ColPerm , B:: AbstractVecOrMat , jstart:: Int ) = rowperm! (false , B, A. p, jstart)
177- At_mul_B! (A:: ColPerm , B:: AbstractVecOrMat , jstart:: Int ) = rowperm! (true , B, A. p, jstart)
178- Ac_mul_B! (A:: ColPerm , B:: AbstractVecOrMat , jstart:: Int ) = At_mul_B! (A, B, jstart)
175+ lmul! (A:: ColPerm , B:: AbstractVecOrMat , jstart:: Int ) = rowperm! (false , B, A. p, jstart)
176+ lmul! (At:: RowPerm , B:: AbstractVecOrMat , jstart:: Int ) = rowperm! (true , B, transpose (At). p, jstart)
179177
180178mul! (y:: AbstractVector , A:: ColPerm , x:: AbstractVector , jstart:: Int ) = rowperm! (false , y, x, A. p, jstart)
181- At_mul_B! (y:: AbstractVector , A:: ColPerm , x:: AbstractVector , jstart:: Int ) = rowperm! (true , y, x, A. p, jstart)
182- Ac_mul_B! (y:: AbstractVector , A:: ColPerm , x:: AbstractVector , jstart:: Int ) = At_mul_B! (y, x, A, jstart)
179+ mul! (y:: AbstractVector , At:: RowPerm , x:: AbstractVector , jstart:: Int ) = rowperm! (true , y, x, transpose (At). p, jstart)
183180
184- # Fast mul!, At_mul_B!, and Ac_mul_B! for an ID. These overwrite the output.
181+ # Fast mul! for an ID. These overwrite the output.
185182
186183
187184function mul! (y:: AbstractVecOrMat{T} , A:: IDPackedV{T} , P:: ColumnPermutation , x:: AbstractVecOrMat{T} , istart:: Int , jstart:: Int ) where {T}
188185 k, n = size (A)
189- At_mul_B! (P , x, jstart)
186+ lmul! ( transpose (P) , x, jstart)
190187 copyto! (y, istart, x, jstart, k)
191188 mul! (y, A. T, x, istart, jstart+ k)
192- mul ! (P, x, jstart)
189+ lmul ! (P, x, jstart)
193190 y
194191end
195192
196193function mul! (y:: AbstractVector{T} , A:: IDPackedV{T} , P:: ColumnPermutation , x:: AbstractVector{T} , temp:: AbstractVector{T} , istart:: Int , jstart:: Int ) where {T}
197194 k, n = size (A)
198- At_mul_B ! (temp, P , x, jstart)
195+ mul ! (temp, transpose (P) , x, jstart)
199196 copyto! (y, istart, temp, jstart, k)
200197 mul! (y, A. T, temp, istart, jstart+ k)
201198 y
202199end
203200
204- # ## mul!, At_mul_B!, and Ac_mul_B! for a Butterfly factorization.
201+ # ## mul! for a Butterfly factorization.
205202mul! (u:: Vector{T} , B:: Butterfly{T} , b:: Vector{T} ) where T = mul_col_J! (u, B, b, 1 )
206203
207- for f! in (:At_mul_B! , :Ac_mul_B! )
204+ for Trans in (:Transpose , :Adjoint )
208205 @eval begin
209- function $f! (y:: AbstractVecOrMat{T} , A:: IDPackedV{T} , P:: ColumnPermutation , x:: AbstractVecOrMat{T} , istart:: Int , jstart:: Int ) where {T}
206+ function mul! (y:: AbstractVecOrMat{T} , Ac:: $Trans{T,IDPackedV{T}} , P:: ColumnPermutation , x:: AbstractVecOrMat{T} , istart:: Int , jstart:: Int ) where {T}
207+ A = parent (Ac)
210208 k, n = size (A)
211209 copyto! (y, istart, x, jstart, k)
212- $ f ! (y, A. T, x, istart+ k, jstart)
213- mul ! (P, y, istart)
210+ mul ! (y, $ Trans ( A. T) , x, istart+ k, jstart)
211+ lmul ! (P, y, istart)
214212 y
215213 end
216214
217- function $f! (y:: AbstractVector{T} , A:: IDPackedV{T} , P:: ColumnPermutation , x:: AbstractVector{T} , temp:: AbstractVector{T} , istart:: Int , jstart:: Int ) where {T}
215+ function mul! (y:: AbstractVector{T} , Ac:: $Trans{T,IDPackedV{T}} , P:: ColumnPermutation , x:: AbstractVector{T} , temp:: AbstractVector{T} , istart:: Int , jstart:: Int ) where {T}
216+ A = parent (Ac)
218217 k, n = size (A)
219218 copyto! (temp, istart, x, jstart, k)
220- $ f ! (temp, A. T, x, istart+ k, jstart)
219+ mul ! (temp, $ Trans ( A. T) , x, istart+ k, jstart)
221220 mul! (y, P, temp, istart)
222221 y
223222 end
224223 end
225224end
226225
227- if VERSION < v " 0.7-"
228- Base. A_mul_B! (u:: Vector{T} , B:: Butterfly{T} , b:: Vector{T} ) where T = mul_col_J! (u, B, b, 1 )
229- Base. At_mul_B! (u:: Vector{T} , B:: Butterfly{T} , b:: Vector{T} ) where T = At_mul_B_col_J! (u, B, b, 1 )
230- Base. Ac_mul_B! (u:: Vector{T} , B:: Butterfly{T} , b:: Vector{T} ) where T = Ac_mul_B_col_J! (u, B, b, 1 )
231- else
232- LinearAlgebra. mul! (u:: Vector{T} , B:: Butterfly{T} , b:: Vector{T} ) where T = mul_col_J! (u, B, b, 1 )
233- LinearAlgebra. mul! (u:: Vector{T} , Bt:: Transpose{T,Butterfly{T}} , b:: Vector{T} ) where T = At_mul_B_col_J! (u, parent (Bt), b, 1 )
234- LinearAlgebra. mul! (u:: Vector{T} , Bc:: Adjoint{T,Butterfly{T}} , b:: Vector{T} ) where T = Ac_mul_B_col_J! (u, parent (Bc), b, 1 )
235- end
226+ LinearAlgebra. mul! (u:: Vector{T} , B:: Butterfly{T} , b:: Vector{T} ) where T = mul_col_J! (u, B, b, 1 )
227+ LinearAlgebra. mul! (u:: Vector{T} , Bt:: Transpose{T,Butterfly{T}} , b:: Vector{T} ) where T = mul_col_J! (u, Bt, b, 1 )
228+ LinearAlgebra. mul! (u:: Vector{T} , Bc:: Adjoint{T,Butterfly{T}} , b:: Vector{T} ) where T = mul_col_J! (u, Bc, b, 1 )
229+
236230
237231
238232function mul_col_J! (u:: VecOrMat{T} , B:: Butterfly{T} , b:: VecOrMat{T} , J:: Int ) where T
@@ -290,10 +284,10 @@ function mul_col_J!(u::VecOrMat{T}, B::Butterfly{T}, b::VecOrMat{T}, J::Int) whe
290284 u
291285end
292286
293- for f! in (:At_mul_B! ,:Ac_mul_B! )
294- f_col_J! = Meta. parse (string (f!)[1 : end - 1 ]* " _col_J!" )
287+ for Trans in (:Transpose ,:Adjoint )
295288 @eval begin
296- function $f_col_J! (u:: VecOrMat{T} , B:: Butterfly{T} , b:: VecOrMat{T} , J:: Int ) where T
289+ function mul_col_J! (u:: VecOrMat{T} , Bc:: $Trans{T,Butterfly{T}} , b:: VecOrMat{T} , J:: Int ) where T
290+ B = parent (Bc)
297291 L = length (B. factors) - 1
298292 tL = 2 ^ L
299293
@@ -315,7 +309,7 @@ for f! in (:At_mul_B!,:Ac_mul_B!)
315309 for i = 1 : tL
316310 ml = mu+ 1
317311 mu += size (columns[i], 1 )
318- $ f ! (temp1, columns[i], b, inds[i], ml+ COLSHIFT)
312+ mul ! (temp1, $ Trans ( columns[i]) , b, inds[i], ml+ COLSHIFT)
319313 end
320314
321315 ii, jj = tL, 1
@@ -329,7 +323,7 @@ for f! in (:At_mul_B!,:Ac_mul_B!)
329323 shft = 2 jj* div (ctr,2 jj)
330324 fill! (temp4, zero (T))
331325 for j = 1 : jj
332- $ f ! (temp3, factors[j+ ctr], permutations[j+ ctr], temp1, temp4, indsout[2 j+ shft- 1 ], indsin[j+ ctr])
326+ mul ! (temp3, $ Trans ( factors[j+ ctr]) , permutations[j+ ctr], temp1, temp4, indsout[2 j+ shft- 1 ], indsin[j+ ctr])
333327 addtemp3totemp2! (temp2, temp3, indsout[2 j+ shft- 1 ], indsout[2 j+ shft+ 1 ]- 1 )
334328 end
335329 ctr += jj
@@ -346,7 +340,7 @@ for f! in (:At_mul_B!,:Ac_mul_B!)
346340 for j = 1 : tL
347341 nl = nu+ 1
348342 nu += size (factors[j], 2 )
349- $ f ! (u, factors[j], permutations[j], temp1, nl+ COLSHIFT, inds[j])
343+ mul ! (u, $ Trans ( factors[j]) , permutations[j], temp1, nl+ COLSHIFT, inds[j])
350344 end
351345
352346 u
0 commit comments