@@ -112,8 +112,6 @@ function zero_tangent end
112112
113113zero_tangent (x:: Number ) = zero (x)
114114
115- zero_tangent (:: Type ) = NoTangent ()
116-
117115function zero_tangent (x:: MutableTangent{P} ) where {P}
118116 zb = backing (zero_tangent (backing (x)))
119117 return MutableTangent {P} (zb)
@@ -171,10 +169,25 @@ function zero_tangent(x::Array{P,N}) where {P,N}
171169 return y
172170end
173171
172+ function zero_tangent (:: T ) where {K,V,T<: AbstractDict{K,V} }
173+ return Tangent {T} (Dict {K,guess_zero_tangent_type(V)} ())
174+ end
175+
174176# Sad heauristic methods we need because of unassigned values
175177guess_zero_tangent_type (:: Type{T} ) where {T<: Number } = T
176178guess_zero_tangent_type (:: Type{T} ) where {T<: Integer } = typeof (float (zero (T)))
177179function guess_zero_tangent_type (:: Type{<:Array{T,N}} ) where {T,N}
178180 return Array{guess_zero_tangent_type (T),N}
179181end
180- guess_zero_tangent_type (T:: Type ) = Any
182+ guess_zero_tangent_type (T:: Type ) = Any
183+
184+ # Stuff that conceptually has its own identity regardless of structual implementation and doesn't have a tangent
185+ zero_tangent (:: Base.AbstractLogger ) = NoTangent ()
186+
187+ # Prevent zero_tangent going wild on the internals
188+ zero_tangent (:: Type ) = NoTangent ()
189+ zero_tangent (:: Expr ) = NoTangent ()
190+ zero_tangent (:: Core.Compiler.AbstractInterpreter ) = NoTangent ()
191+ zero_tangent (:: Core.Compiler.InstructionStream ) = NoTangent ()
192+ zero_tangent (:: Core.CodeInfo ) = NoTangent ()
193+ zero_tangent (:: Core.MethodInstance ) = NoTangent ()
0 commit comments