From 14be880ce787a35f70a749c1176c4607bfb535ed Mon Sep 17 00:00:00 2001 From: Tom Smeding Date: Fri, 21 Feb 2025 13:04:16 +0100 Subject: Evaluate result Dual before backpropagating This ensures that the tape is actually created/written before we start backpropagating over it, lol. --- src/Numeric/ADDual/Internal.hs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Numeric/ADDual/Internal.hs b/src/Numeric/ADDual/Internal.hs index 858e0db..5955fae 100644 --- a/src/Numeric/ADDual/Internal.hs +++ b/src/Numeric/ADDual/Internal.hs @@ -1,3 +1,4 @@ +{-# LANGUAGE BangPatterns #-} {-# LANGUAGE DeriveTraversable #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE MultiWayIf #-} @@ -41,7 +42,7 @@ gradient' f inp topctg = unsafePerformIO $ do taperef <- newIORef (MLog idref (Chunk 0 vec1) SLNil) when debug $ hPutStrLn stderr "Running function" - let Dual result outi = withDict @(Taping () a) taperef $ f @() inp' + let !(Dual result outi) = withDict @(Taping () a) taperef $ f @() inp' when debug $ hPutStrLn stderr $ "result = " ++ show result ++ "; outi = " ++ show outi MLog _ lastChunk tapeTail <- readIORef taperef -- cgit v1.2.3-70-g09d2