packages feed

ad 0.23 → 0.24

raw patch · 5 files changed

+176/−15 lines, 5 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

+ Numeric.AD.Internal: on :: (a -> a -> b) -> (c -> a) -> c -> c -> b
+ Numeric.AD.Stream: (:<) :: a -> f (f :> a) -> :> f a
+ Numeric.AD.Stream: class (Functor f) => Comonad f
+ Numeric.AD.Stream: data (:>) f a
+ Numeric.AD.Stream: duplicate :: (Comonad f) => (f :> a) -> (f :> (f :> a))
+ Numeric.AD.Stream: extend :: (Comonad f) => ((f :> a) -> b) -> (f :> a) -> (f :> b)
+ Numeric.AD.Stream: extract :: (Comonad f) => (f :> a) -> a
+ Numeric.AD.Stream: instance (Foldable f) => Foldable ((:>) f)
+ Numeric.AD.Stream: instance (Functor f) => Comonad ((:>) f)
+ Numeric.AD.Stream: instance (Functor f) => Functor ((:>) f)
+ Numeric.AD.Stream: instance (Mode f) => Lifted ((:>) f)
+ Numeric.AD.Stream: instance (Mode f) => Mode ((:>) f)
+ Numeric.AD.Stream: instance (Mode f, Floating a) => Floating (f :> a)
+ Numeric.AD.Stream: instance (Mode f, Fractional a) => Fractional (f :> a)
+ Numeric.AD.Stream: instance (Mode f, Num a) => Num (f :> a)
+ Numeric.AD.Stream: instance (Mode f, Real a) => Real (f :> a)
+ Numeric.AD.Stream: instance (Mode f, RealFloat a) => RealFloat (f :> a)
+ Numeric.AD.Stream: instance (Mode f, RealFrac a) => RealFrac (f :> a)
+ Numeric.AD.Stream: instance (Mode f, Show a) => Show (f :> a)
+ Numeric.AD.Stream: instance (Num a, Mode f, Bounded a) => Bounded (f :> a)
+ Numeric.AD.Stream: instance (Num a, Mode f, Enum a) => Enum (f :> a)
+ Numeric.AD.Stream: instance (Num a, Mode f, Eq a) => Eq (f :> a)
+ Numeric.AD.Stream: instance (Num a, Mode f, Ord a) => Ord (f :> a)
+ Numeric.AD.Stream: instance (Traversable f) => Traversable ((:>) f)
+ Numeric.AD.Stream: instance Primal ((:>) f)
+ Numeric.AD.Stream: tails :: (f :> a) -> f (f :> a)
+ Numeric.AD.Stream: unfold :: (Functor f) => (a -> (b, f a)) -> a -> (f :> b)
- Numeric.AD.Classes: deriveNumeric :: Q Type -> Q Type -> Q [Dec]
+ Numeric.AD.Classes: deriveNumeric :: ([Q Pred] -> [Q Pred]) -> Q Type -> Q [Dec]

Files

Numeric/AD/Classes.hs view
@@ -286,7 +286,8 @@ -- > instance ('Lifted' $f, 'Num' a, 'Enum' a) => 'Enum' ($g a) -- > instance ('Lifted' $f, 'Num' a, 'Eq' a) => 'Eq' ($g a) -- > instance ('Lifted' $f, 'Num' a, 'Ord' a) => 'Ord' ($g a)--- > instance ('Lifted' $f, 'Num a, 'Bounded' a) => 'Bounded' ($g a)+-- > instance ('Lifted' $f, 'Num' a, 'Bounded' a) => 'Bounded' ($g a)+-- -- > instance ('Lifted' $f, 'Show' a) => 'Show' ($g a) -- > instance ('Lifted' $f, 'Num' a) => 'Num' ($g a) -- > instance ('Lifted' $f, 'Fractional' a) => 'Fractional' ($g a)@@ -294,19 +295,19 @@ -- > instance ('Lifted' $f, 'RealFloat' a) => 'RealFloat' ($g a) -- > instance ('Lifted' $f, 'RealFrac' a) => 'RealFrac' ($g a) -- > instance ('Lifted' $f, 'Real' a) => 'Real' ($g a)-deriveNumeric :: Q Type -> Q Type -> Q [Dec]-deriveNumeric t' t = do+deriveNumeric :: ([Q Pred] -> [Q Pred]) -> Q Type -> Q [Dec]+deriveNumeric f t = do     members <- liftedMembers     let keep n = nameBase n `elem` members-    xs <- lowerInstance keep (classP ''Num [varA]:) t t' `mapM` [''Enum, ''Eq, ''Ord, ''Bounded]-    ys <- lowerInstance keep id                     t t' `mapM` [''Show, ''Num, ''Fractional, ''Floating, ''RealFloat,''RealFrac, ''Real]+    xs <- lowerInstance keep ((classP ''Num [varA]:) . f) t `mapM` [''Enum, ''Eq, ''Ord, ''Bounded]+    ys <- lowerInstance keep f                            t `mapM` [''Show, ''Num, ''Fractional, ''Floating, ''RealFloat,''RealFrac, ''Real]     return (xs ++ ys) -lowerInstance :: (Name -> Bool) -> ([Q Pred] -> [Q Pred]) -> Q Type -> Q Type -> Name -> Q Dec-lowerInstance p f t t' n = do+lowerInstance :: (Name -> Bool) -> ([Q Pred] -> [Q Pred]) -> Q Type -> Name -> Q Dec+lowerInstance p f t n = do     ClassI (ClassD _ _ _ _ ds) <- reify n-    instanceD (cxt (f [classP ''Lifted [t], classP n [varA]]))-              (conT n `appT` (t' `appT` varA))+    instanceD (cxt (f [classP n [varA]]))+              (conT n `appT` (t `appT` varA))               (concatMap lower1 ds)     where         lower1 :: Dec -> [Q Dec]
Numeric/AD/Forward.hs view
@@ -166,8 +166,13 @@  -- | Compute the product of a vector with the Hessian using forward-on-forward-mode AD.  hessianProduct :: (Traversable f, Num a) => (forall s. Mode s => f (AD s a) -> AD s a) -> f (a, a) -> f a-hessianProduct f = duF (grad (decomposeMode . f . fmap composeMode))+hessianProduct f = duF $ grad $ decomposeMode . f . fmap composeMode  -- | Compute the gradient and hessian product using forward-on-forward-mode AD.  hessianProduct' :: (Traversable f, Num a) => (forall s. Mode s => f (AD s a) -> AD s a) -> f (a, a) -> f (a, a)-hessianProduct' f = duF' (grad (decomposeMode . f . fmap composeMode))+hessianProduct' f = duF' $ grad $ decomposeMode . f . fmap composeMode++-- * Experimental++-- data f :> a = a :< f (f :> a)+-- gradients :: (Traversable f, Num a) => (forall s. Mode s => f (AD s a) -> AD s a) -> f a -> (f :> a)
Numeric/AD/Internal.hs view
@@ -12,6 +12,7 @@ module Numeric.AD.Internal     ( zipWithT     , zipWithDefaultT+    , on     , AD(..)     , Id(..)     , probe@@ -28,6 +29,9 @@ import Data.Traversable (Traversable, mapAccumL) import Data.Foldable (Foldable, toList) +on :: (a -> a -> b) -> (c -> a) -> c -> c -> b+on f g a b = f (g a) (g b)+ data Pair a b = Pair a b deriving (Eq, Ord, Show, Read, Functor, Foldable, Traversable)  zipWithT :: (Foldable f, Traversable g) => (a -> b -> c) -> f a -> g b -> g c@@ -50,7 +54,13 @@ -- interchangeably as both the type level \"brand\" and dictionary, providing a common API. newtype AD f a = AD { runAD :: f a } deriving (Iso (f a), Lifted, Mode, Primal) -let f = varT (mkName "f") in deriveNumeric (conT ''AD `appT` f) f++-- > instance (Lifted f, Num a) => Num (AD f a)+-- etc.+let f = varT (mkName "f") in +    deriveNumeric +        (classP ''Lifted [f]:) +        (conT ''AD `appT` f)  newtype Id a = Id a deriving     (Iso a, Eq, Ord, Show, Enum, Bounded, Num, Real, Fractional, Floating, RealFrac, RealFloat, Monoid)
+ Numeric/AD/Stream.hs view
@@ -0,0 +1,144 @@+{-# LANGUAGE TypeOperators, TemplateHaskell, ScopedTypeVariables #-}+-----------------------------------------------------------------------------+-- |+-- Module      :  Numeric.AD.Stream+-- Copyright   :  (c) Edward Kmett 2010+-- License     :  BSD3+-- Maintainer  :  ekmett@gmail.com+-- Stability   :  experimental+-- Portability :  GHC only+--+-- A cofree comonad/f-branching stream  for use in returning towers of gradients. +--+-----------------------------------------------------------------------------++module Numeric.AD.Stream +    ( (:>)(..)+    , Comonad(..)+    , unfold+    , tails+    ) where++import Control.Applicative+import Data.Monoid+import Data.Foldable+import Data.Traversable+import Numeric.AD.Classes+import Numeric.AD.Internal+import Language.Haskell.TH++infixl 3 :<, :>++class Functor f => Comonad f where+    extract :: (f :> a) -> a+    duplicate :: (f :> a) -> (f :> (f :> a))+    extend :: ((f :> a) -> b) -> (f :> a) -> (f :> b)++data (f :> a) = a :< f (f :> a)++instance Functor f => Functor ((:>)f) where+    fmap f (a :< as) = f a :< fmap f <$> as++instance Functor f => Comonad ((:>) f) where+    extract (a :< _) = a+    duplicate aas@(_ :< as) = aas :< duplicate <$> as+    extend f aas@(_ :< as) = f aas :< extend f <$> as++instance Foldable f => Foldable ((:>) f) where+    foldMap f (a :< as) = f a `mappend` foldMap (foldMap f) as++instance Traversable f => Traversable ((:>) f) where+    traverse f (a :< as) = (:<) <$> f a <*> traverse (traverse f) as++-- tails of the f-branching stream comonad/cofree comonad+tails :: (f :> a) -> f (f :> a)+tails (_ :< as) = as++unfold :: Functor f => (a -> (b, f a)) -> a -> (f :> b)+unfold f a = h :< unfold f <$> t +    where+        (h, t) = f a++instance Primal ((:>) f) where+    primal (a :< _) = a++instance Mode f => Mode ((:>) f) where+    lift a = as+        where as = a :< lift as+    (a :< as) <+> (b :< bs) = (a + b) :< (as <+> bs)+    a *^ (b :< bs) = (a * b) :< (lift a *^ bs)+    (a :< as) ^* b = (a * b) :< (as ^* lift b)+    (a :< as) ^/ b = (a / b) :< (as ^/ lift b)++instance Mode f => Lifted ((:>) f) where+    showsPrec1 n (a :< _) = showsPrec n a+    (==!) = (==) `on` primal+    compare1 = compare `on` primal+    fromInteger1 a = fromInteger a :< fromInteger1 a+    (a :< as) +! (b :< bs) = (a + b) :< (as +! bs)+    (a :< as) -! (b :< bs) = (a - b) :< (as -! bs)+    (a :< as) *! (b :< bs) = (a * b) :< (as *! bs)+    negate1 (a :< as) = negate a :< negate1 as+    abs1 (a :< as) = abs a :< abs1 as+    signum1 (a :< as) = signum a :< signum1 as+    (a :< as) /! (b :< bs) = (a / b) :< (as /! bs)+    recip1 (a :< as) = recip a :< recip1 as+    fromRational1 n = fromRational n :< fromRational1 n+    toRational1 = toRational . primal+    pi1 = pi :< pi1+    exp1 (a :< as) = exp a :< exp1 as+    log1 (a :< as) = log a :< log1 as+    sqrt1 (a :< as) = sqrt a :< sqrt1 as+    (a :< as) **! (b :< bs) = (a ** b) :< (as **! bs)+    logBase1 (a :< as) (b :< bs) = logBase a b :< logBase1 as bs+    sin1 (a :< as) = sin a :< sin1 as+    cos1 (a :< as) = cos a :< cos1 as+    tan1 (a :< as) = tan a :< tan1 as+    asin1 (a :< as) = asin a :< asin1 as+    acos1 (a :< as) = acos a :< acos1 as+    atan1 (a :< as) = atan a :< atan1 as+    sinh1 (a :< as) = sinh a :< sinh1 as+    cosh1 (a :< as) = cosh a :< cosh1 as+    tanh1 (a :< as) = tanh a :< tanh1 as+    asinh1 (a :< as) = asinh a :< asinh1 as+    acosh1 (a :< as) = acosh a :< acosh1 as+    atanh1 (a :< as) = atanh a :< atanh1 as+    properFraction1 (a :< as) = (b, c :< cs) +        where+            (b, c) = properFraction a+            (_ :: Int, cs) = properFraction1 as+    truncate1 = truncate . primal+    round1 = round . primal+    ceiling1 = ceiling . primal +    floor1  = floor . primal +    floatRadix1 = floatRadix . primal+    floatDigits1 = floatDigits . primal+    floatRange1 = floatRange . primal+    decodeFloat1 = decodeFloat . primal+    encodeFloat1 m e = encodeFloat m e :< encodeFloat1 m e+    exponent1 = exponent . primal +    significand1 (a :< as) = significand a :< significand1 as+    scaleFloat1 n (a :< as) = scaleFloat n a :< scaleFloat1 n as+    isNaN1 = isNaN . primal +    isInfinite1 = isInfinite . primal+    isDenormalized1 = isDenormalized . primal +    isNegativeZero1 = isNegativeZero . primal +    isIEEE1 = isIEEE . primal +    atan21 (a :< as) (b :< bs) = atan2 a b :< atan21 as bs+    succ1 (a :< as) = succ a :< succ1 as+    pred1 (a :< as) = pred a :< pred1 as+    toEnum1 n = toEnum n :< toEnum1 n+    fromEnum1 = fromEnum . primal+    enumFrom1 = error "TODO"+    enumFromThen1 = error "TODO"+    enumFromTo1 = error "TODO"+    enumFromThenTo1 = error "TODO"+    minBound1 = minBound :< minBound1+    maxBound1 = maxBound :< maxBound1+    -- TODO:+++-- instance (Mode f, Foo a) => Foo ((:>) f) ...+deriveNumeric +    (classP (mkName "Mode") [varT $ mkName "f"]:) +    (conT (mkName ":>") `appT` varT (mkName "f")) 
ad.cabal view
@@ -1,9 +1,9 @@ Name:         ad-Version:      0.23+Version:      0.24 License:      BSD3 License-File: LICENSE-Copyright:    Edward Kmett 2010-              Barak Pearlmutter and Jeffrey Mark Siskind 2008-2009+Copyright:    (c) Edward Kmett 2010,+              (c) Barak Pearlmutter and Jeffrey Mark Siskind 2008-2009 Author:       Edward Kmett Maintainer:   ekmett@gmail.com Stability:    Experimental@@ -32,6 +32,7 @@     Numeric.AD.Directed     Numeric.AD.Newton     Numeric.AD.Classes+    Numeric.AD.Stream     Numeric.AD.Internal     Numeric.AD.Internal.Composition     Numeric.AD.Internal.Forward