@@ -110,10 +110,9 @@ function Butterfly(A::AbstractMatrix{T}, L::Int; isorthogonal::Bool = false, opt
110
110
Butterfly (columns, factors, permutations, indices, threadsafezeros (T, kk), threadsafezeros (T, kk), threadsafezeros (T, kk), threadsafezeros (T, kk))
111
111
end
112
112
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
+
117
116
118
117
function sumkmax (indices:: Vector{Vector{Int}} )
119
118
ret = 0
@@ -173,66 +172,61 @@ function rowperm!(fwd::Bool, y::AbstractVector, x::AbstractVector, p::Vector{Int
173
172
end
174
173
175
174
# # 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)
179
177
180
178
mul! (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)
183
180
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.
185
182
186
183
187
184
function mul! (y:: AbstractVecOrMat{T} , A:: IDPackedV{T} , P:: ColumnPermutation , x:: AbstractVecOrMat{T} , istart:: Int , jstart:: Int ) where {T}
188
185
k, n = size (A)
189
- At_mul_B! (P , x, jstart)
186
+ lmul! ( transpose (P) , x, jstart)
190
187
copyto! (y, istart, x, jstart, k)
191
188
mul! (y, A. T, x, istart, jstart+ k)
192
- mul ! (P, x, jstart)
189
+ lmul ! (P, x, jstart)
193
190
y
194
191
end
195
192
196
193
function mul! (y:: AbstractVector{T} , A:: IDPackedV{T} , P:: ColumnPermutation , x:: AbstractVector{T} , temp:: AbstractVector{T} , istart:: Int , jstart:: Int ) where {T}
197
194
k, n = size (A)
198
- At_mul_B ! (temp, P , x, jstart)
195
+ mul ! (temp, transpose (P) , x, jstart)
199
196
copyto! (y, istart, temp, jstart, k)
200
197
mul! (y, A. T, temp, istart, jstart+ k)
201
198
y
202
199
end
203
200
204
- # ## mul!, At_mul_B!, and Ac_mul_B! for a Butterfly factorization.
201
+ # ## mul! for a Butterfly factorization.
205
202
mul! (u:: Vector{T} , B:: Butterfly{T} , b:: Vector{T} ) where T = mul_col_J! (u, B, b, 1 )
206
203
207
- for f! in (:At_mul_B! , :Ac_mul_B! )
204
+ for Trans in (:Transpose , :Adjoint )
208
205
@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)
210
208
k, n = size (A)
211
209
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)
214
212
y
215
213
end
216
214
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)
218
217
k, n = size (A)
219
218
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)
221
220
mul! (y, P, temp, istart)
222
221
y
223
222
end
224
223
end
225
224
end
226
225
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
+
236
230
237
231
238
232
function 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
290
284
u
291
285
end
292
286
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 )
295
288
@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)
297
291
L = length (B. factors) - 1
298
292
tL = 2 ^ L
299
293
@@ -315,7 +309,7 @@ for f! in (:At_mul_B!,:Ac_mul_B!)
315
309
for i = 1 : tL
316
310
ml = mu+ 1
317
311
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)
319
313
end
320
314
321
315
ii, jj = tL, 1
@@ -329,7 +323,7 @@ for f! in (:At_mul_B!,:Ac_mul_B!)
329
323
shft = 2 jj* div (ctr,2 jj)
330
324
fill! (temp4, zero (T))
331
325
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])
333
327
addtemp3totemp2! (temp2, temp3, indsout[2 j+ shft- 1 ], indsout[2 j+ shft+ 1 ]- 1 )
334
328
end
335
329
ctr += jj
@@ -346,7 +340,7 @@ for f! in (:At_mul_B!,:Ac_mul_B!)
346
340
for j = 1 : tL
347
341
nl = nu+ 1
348
342
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])
350
344
end
351
345
352
346
u
0 commit comments