@@ -410,11 +410,13 @@ end
410
410
@ambiguous @inline Base. atan2 (y:: Real , x:: Dual ) = calc_atan2 (y, x)
411
411
@ambiguous @inline Base. atan2 (y:: Dual , x:: Real ) = calc_atan2 (y, x)
412
412
413
- @inline function Base. fma (x:: Dual , y:: Dual , z:: Dual )
414
- vx, vy = value (x), value (y)
415
- result = fma (vx, vy, value (z))
416
- return Dual (result,
417
- _mul_partials (partials (x), partials (y), vy, vx) + partials (z))
413
+ @generated function Base. fma {N} (x:: Dual{N} , y:: Dual{N} , z:: Dual{N} )
414
+ ex = Expr (:tuple , [:(fma (value (x), partials (y)[$ i], fma (value (y), partials (x)[$ i], partials (z)[$ i]))) for i in 1 : N]. .. )
415
+ return quote
416
+ $ (Expr (:meta , :inline ))
417
+ v = fma (value (x), value (y), value (z))
418
+ Dual (v, $ ex)
419
+ end
418
420
end
419
421
420
422
@inline function Base. fma (x:: Dual , y:: Dual , z:: Real )
@@ -423,10 +425,13 @@ end
423
425
return Dual (result, _mul_partials (partials (x), partials (y), vy, vx))
424
426
end
425
427
426
- @inline function Base. fma (x:: Dual , y:: Real , z:: Dual )
427
- vx = value (x)
428
- result = fma (vx, y, value (z))
429
- return Dual (result, partials (x) * y + partials (z))
428
+ @generated function Base. fma {N} (x:: Dual{N} , y:: Real , z:: Dual{N} )
429
+ ex = Expr (:tuple , [:(fma (partials (x)[$ i], y, partials (z)[$ i])) for i in 1 : N]. .. )
430
+ return quote
431
+ $ (Expr (:meta , :inline ))
432
+ v = fma (value (x), y, value (z))
433
+ Dual (v, $ ex)
434
+ end
430
435
end
431
436
432
437
@inline Base. fma (x:: Real , y:: Dual , z:: Dual ) = fma (y, x, z)
0 commit comments