module Numeric.AD.Mode.Directed
(
grad
, grad'
, jacobian
, jacobian'
, diff
, diff'
, Direction(..)
) where
import Prelude hiding (reverse)
import Numeric.AD.Types
import Data.Traversable (Traversable)
import qualified Numeric.AD.Mode.Reverse as R
import qualified Numeric.AD.Mode.Forward as F
import qualified Numeric.AD.Mode.Tower as T
import qualified Numeric.AD.Mode.Chain as C
import qualified Numeric.AD as M
import Data.Ix
data Direction
= Forward
| Reverse
| Chain
| Tower
| Mixed
deriving (Show, Eq, Ord, Read, Bounded, Enum, Ix)
diff :: Num a => Direction -> (forall s. Mode s => AD s a -> AD s a) -> a -> a
diff Forward = F.diff
diff Reverse = R.diff
diff Chain = C.diff
diff Tower = T.diff
diff Mixed = F.diff
diff' :: Num a => Direction -> (forall s. Mode s => AD s a -> AD s a) -> a -> (a, a)
diff' Forward = F.diff'
diff' Reverse = R.diff'
diff' Chain = C.diff'
diff' Tower = T.diff'
diff' Mixed = F.diff'
jacobian :: (Traversable f, Traversable g, Num a) => Direction -> (forall s. Mode s => f (AD s a) -> g (AD s a)) -> f a -> g (f a)
jacobian Forward = F.jacobian
jacobian Reverse = R.jacobian
jacobian Chain = C.jacobian
jacobian Tower = F.jacobian
jacobian Mixed = M.jacobian
jacobian' :: (Traversable f, Traversable g, Num a) => Direction -> (forall s. Mode s => f (AD s a) -> g (AD s a)) -> f a -> g (a, f a)
jacobian' Forward = F.jacobian'
jacobian' Reverse = R.jacobian'
jacobian' Chain = C.jacobian'
jacobian' Tower = F.jacobian'
jacobian' Mixed = M.jacobian'
grad :: (Traversable f, Num a) => Direction -> (forall s. Mode s => f (AD s a) -> AD s a) -> f a -> f a
grad Forward = F.grad
grad Reverse = R.grad
grad Chain = C.grad
grad Tower = F.grad
grad Mixed = M.grad
grad' :: (Traversable f, Num a) => Direction -> (forall s. Mode s => f (AD s a) -> AD s a) -> f a -> (a, f a)
grad' Forward = F.grad'
grad' Reverse = R.grad'
grad' Chain = C.grad'
grad' Tower = F.grad'
grad' Mixed = M.grad'