EnzymeAD / EnzymeAD/Enzyme.jl

Autodiff for `A -> A * A'` does not give hermitian result for complex `A`

Open
#1,456 4 comments 0 reactions 0 assignees View on GitHub
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.