Autodiff for `A -> A * A'` does not give hermitian result for complex `A`
- Dominant language
- Julia
- Stars
- 586
- Forks
- 108
- Avg merge
- 1d 5h
- Merged PRs (30d)
- 44
Description
This was found while writing tests for #1307, where the function below is composed with `cholesky`:
```julia
square(A) = A * adjoint(A)
A = rand(ComplexF64, 5, 5)
ishermitian(square(A)) # true
dA = rand(ComplexF64, 5, 5)
S, dS = autodiff(Forward, square, Duplicated, Duplicated(A, dA))
S ≈ square(A) # true
ishermitian(S) # false
test_forward(square, Duplicated, (A, Duplicated)) # passes
```
So somehow the forward mode does not produce the same result as the function for `square`, but this is not caught by EnzymeTestUtils.
Something similar for reverse mode
```julia
square(A) = A * adjoint(A)
square!(S, A) = (mul!(S, A, adjoint(A)); return nothing)
A = rand(ComplexF64, 5, 5)
dA = zeros(ComplexF64, 5, 5)
S = zeros(ComplexF64, 5, 5)
dS = ones(ComplexF64, 5, 5)
autodiff(Reverse, square!, Const, Duplicated(S, dS), Duplicated(A, dA))
S ≈ square(A) # true
ishermitian(S) # false
test_reverse(square!, Const, (S, Duplicated), (A, Duplicated)) # passes
```
Contributor guide
Assessment
This issue has not been assessed yet.