@@ -48,8 +48,10 @@ import LinearAlgebra
4848 :(LinearAlgebra. dot (partial,dx))
4949 elseif dx <: AbstractFloat || dx <: AbstractArray{<:AbstractFloat}
5050 :(LinearAlgebra. dot (dx, partial))
51- else
51+ elseif partial <: AbstractVector
5252 :(LinearAlgebra. dot (adjoint (partial),dx))
53+ else
54+ :(LinearAlgebra. dot (conj (partial),dx))
5355 end
5456 return quote
5557 Base. @_inline_meta
@@ -106,10 +108,52 @@ import LinearAlgebra
106108 end
107109end
108110
109- @inline function EnzymeCore. EnzymeRules. multiply_rev_into (prev, partial, dx)
111+ @inline function EnzymeCore. EnzymeRules. multiply_rev_into (prev, partial:: Real , dx)
112+ EnzymeCore. EnzymeRules. multiply_fwd_into (prev, partial, dx)
113+ end
114+
115+ @inline function EnzymeCore. EnzymeRules. multiply_rev_into (prev, partial:: Complex , dx)
116+ EnzymeCore. EnzymeRules. multiply_fwd_into (prev, conj (partial), dx)
117+ end
118+
119+ @inline function EnzymeCore. EnzymeRules. multiply_rev_into (prev, partial:: AbstractArray{<:Real} , dx:: Number )
120+ EnzymeCore. EnzymeRules. multiply_fwd_into (prev, partial, dx)
121+ end
122+
123+ @inline function EnzymeCore. EnzymeRules. multiply_rev_into (prev, partial:: AbstractArray{<:Complex} , dx:: Number )
124+ EnzymeCore. EnzymeRules. multiply_fwd_into (prev, conj (partial), dx)
125+ end
126+
127+ @inline function EnzymeCore. EnzymeRules. multiply_rev_into (prev, partial:: AbstractArray{<:Real, N} , dx:: AbstractArray{<:Any, N} ) where N
128+ EnzymeCore. EnzymeRules. multiply_fwd_into (prev, partial, dx)
129+ end
130+
131+ @inline function EnzymeCore. EnzymeRules. multiply_rev_into (prev, partial:: AbstractArray{<:Complex, N} , dx:: AbstractArray{<:Any, N} ) where N
132+ EnzymeCore. EnzymeRules. multiply_fwd_into (prev, conj (partial), dx)
133+ end
134+
135+ @inline function EnzymeCore. EnzymeRules. multiply_rev_into (prev, partial:: AbstractVector{<:Complex} , dx:: AbstractVector{<:Any} )
110136 EnzymeCore. EnzymeRules. multiply_fwd_into (prev, adjoint (partial), dx)
111137end
112138
139+ @inline function EnzymeCore. EnzymeRules. multiply_rev_into (prev, partial:: AbstractMatrix{<:Real} , dx:: AbstractVector )
140+ EnzymeCore. EnzymeRules. multiply_fwd_into (prev, transpose (partial), dx)
141+ end
142+
143+ @inline function EnzymeCore. EnzymeRules. multiply_rev_into (prev, partial:: AbstractMatrix{<:Complex} , dx:: AbstractVector )
144+ EnzymeCore. EnzymeRules. multiply_fwd_into (prev, adjoint (partial), dx)
145+ end
146+
147+ @inline function EnzymeCore. EnzymeRules. multiply_rev_into (prev, partial:: AbstractArray{<:Real} , dx:: AbstractArray )
148+ EnzymeCore. EnzymeRules. multiply_fwd_into (prev, Base. permutedims (partial, (((ndims (dx)+ 1 ): ndims (partial)). .. , Base. OneTo (ndims (dx))... )), dx)
149+ end
150+
151+ @inline function EnzymeCore. EnzymeRules. multiply_rev_into (prev, partial:: AbstractArray{<:Complex} , dx:: AbstractArray )
152+ pd = Base. permutedims (partial, (((ndims (dx)+ 1 ): ndims (partial)). .. , Base. OneTo (ndims (dx))... ))
153+ Base. conj! (pd)
154+ EnzymeCore. EnzymeRules. multiply_fwd_into (prev, pd, dx)
155+ end
156+
113157function enzyme_custom_setup_args (
114158 @nospecialize (B:: Union{Nothing, LLVM.IRBuilder} ),
115159 orig:: LLVM.CallInst ,
0 commit comments