ChainRulesCore.jl icon indicating copy to clipboard operation
ChainRulesCore.jl copied to clipboard

using ChainRulesCore changes type promotion logic

Open liushang0322 opened this issue 2 years ago • 1 comments

I'm using Julia 1.9 and ChainRulesCore v1.19.0

When I use the following code, the results change

a = ones(Complex,100,100)
a'

ela = eltype(a') # Complex

using ChainRulesCore
a = ones(Complex,100,100)
a'

ela1 = eltype(a') # Any

ela is Complex but ela1 is Any

Please tell me how to avoid this problem (constructing the Complex type is inevitable),Please tell me how to avoid this problem (constructing the Complex type is inevitable), or is this a bug?

liushang0322 avatar Jan 03 '24 09:01 liushang0322

Work around, is don't use Complex use ComplexF64, which will also make your code all round faster. Since Complex is an nonconcrete type. See https://docs.julialang.org/en/v1/manual/performance-tips/#man-performance-abstract-container If you do ones(ComplexF64, 100, 100) then everything works fine.

I don't know exactly what is happening have no idea what is happening here. ChainRulesCore doesn't monkey patch ' or really touch anything in the promotion machiner at all. (It doesn't monkey patch anything). so I don't think this is something we have done.

I think this is because the eltype of adjoint is determines using Base.promote_op(adjoint, typeof(a)) which is documented as extremely fragile.

I will open an issue in julia itself

oxinabox avatar Jan 04 '24 05:01 oxinabox