Deprecate conv(u, v::AbstractVector, A) to conv(u, v::Transpose, A)#577
Conversation
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## master #577 +/- ##
==========================================
- Coverage 97.87% 97.84% -0.04%
==========================================
Files 19 19
Lines 3251 3252 +1
==========================================
Hits 3182 3182
- Misses 69 70 +1 ☔ View full report in Codecov by Sentry. |
b0969dc to
b24091f
Compare
| Uses 2-D FFT algorithm. | ||
| """ | ||
| function conv(u::AbstractVector{T}, v::AbstractVector{T}, A::AbstractMatrix{T}) where T | ||
| function conv(u::AbstractVector{T}, v::Transpose{T,<:AbstractVector}, A::AbstractMatrix{T}) where T |
There was a problem hiding this comment.
This could also be Adjoint instead of Transpose (with no change to the implementation below). Would that make more sense? Would one rather separate a separable kernel H as H=u*v' or H=u*transpose(v)? (Anyone around working with complex-valued 2D-data and separable filters?)
Or should that even be Union{Adjoint{T,<:AbstractVector}, Transpose{T,<:AbstractVector}} (aka LinearAlgebra.AdjOrTransAbsVec{T})?
There was a problem hiding this comment.
So I thought I'd ping the author of that method in case he has any insight on whether Transpose or Adjoint would be more idiomatic. Some git blames later, I've arrived at JuliaLang/julia@823cff9 where @JeffBezanson added this to signal.j almost 13 years ago. So Jeff, what do you say?
More seriously, the current code does transpose, so the deprecation for conv(u, v, A) could either be conv(u, transpose(v), A) or conv(u, conj(v)', A), where I find the former more obvious. If we're going with that, it's either Transpose or AdjOrTransAbsVec, and I tend to prefer the simpler Transpose for now. We can always wider the signature later if the need arises.
Another issue that in light of #403, the argument order conv(A, u, transpose(v)) might be more future-proof, as there, the first argument plays the role of the input and the second one plays the role of a convolution kernel (as inspired by MATLAB).
There was a problem hiding this comment.
Letting this sink in a bit more, I think these concerns are non-issues:
- As the old code
transposed, that's what the deprecation should do. If we want to similarly allowAdjoint, we can always do so later. - If another argument order turns out to be more natural later, we can add support for it then. But I see no reason why we should not support the order now implemented -- convolution is commutative and associative, after all -- so keeping that order for the deprecation seems least surprising.
b24091f to
4f5959d
Compare
|
Another pair of eyes would be welcome, but absent objections, I plan to merge this soonish. |
4f5959d to
bf14a3c
Compare
Prepare for a possible future multi-arg
conv(cf. #338, #224, #166) by deprecating the currentconv(u::AbstractVector, v::AbstractVector, A::AbstractMatrix)(which would have a conflicting meaning) toconv(u::AbstractVector, v::Transpose{T,<:AbstractVector}, A::AbstractMatrix)which is consistent with a futureconv(u, v, A) == conv(conv(u, v), A)), just more effcient.See #224 (comment), #166 (comment).
Even without the general n-arg
conv, I think this signature makes more sense as it makes it explicit which ofuandvoperates in which direction. (Which before wasn't even documented.)