|
1 | 1 | module ForwardDiffExt |
2 | 2 | import ForwardDiff, ChainRulesCore |
3 | | -using LoopVectorization, VectorizationBase, SLEEFPirates, ForwardDiff, NNlib |
| 3 | +using LoopVectorization, VectorizationBase, SLEEFPirates, ForwardDiff |
4 | 4 | using SLEEFPirates: tanh_fast, sigmoid_fast |
5 | 5 |
|
6 | 6 | import IfElse: ifelse |
|
141 | 141 | end |
142 | 142 | end |
143 | 143 |
|
144 | | -@generated function NNlib.relu( |
145 | | - x::ForwardDiff.Dual{T,<:LoopVectorization.AbstractSIMD,N} |
146 | | -) where {T,S,N} |
147 | | - quote |
148 | | - $(Expr(:meta, :inline)) |
149 | | - v = x.value |
150 | | - z = zero(v) |
151 | | - cmp = v < z |
152 | | - r = ifelse(cmp, z, v) |
153 | | - p = x.partials |
154 | | - ForwardDiff.Dual{T}( |
155 | | - r, |
156 | | - ForwardDiff.Partials(Base.Cartesian.@ntuple $N n -> ifelse(cmp, z, p[n])) |
157 | | - ) |
158 | | - end |
159 | | -end |
160 | | - |
161 | | -@generated function NNlib.leakyrelu( |
162 | | - x::ForwardDiff.Dual{T,<:LoopVectorization.AbstractSIMD,N}, |
163 | | - a = 0.01 |
164 | | -) where {T,S,N} |
165 | | - quote |
166 | | - $(Expr(:meta, :inline)) |
167 | | - v = x.value |
168 | | - z = zero(v) |
169 | | - |
170 | | - α = convert(typeof(v), a) |
171 | | - cmp = v < z |
172 | | - r = ifelse(cmp, α * v, v) |
173 | | - p = x.partials |
174 | | - ForwardDiff.Dual{T}( |
175 | | - r, |
176 | | - ForwardDiff.Partials(Base.Cartesian.@ntuple $N n -> ifelse(cmp, α * p[n], p[n])) |
177 | | - ) |
178 | | - end |
179 | | -end |
180 | | - |
181 | | - |
182 | 144 | @generated function _ifelse( |
183 | 145 | m::Union{AbstractMask,VecUnroll{<:Any,<:Any,Bit,<:AbstractMask}}, |
184 | 146 | x::ForwardDiff.Dual{TAG,V,P}, |
|
0 commit comments