packages feed

accelerate-kullback-liebler 0.1.1.0 → 0.1.2.0

raw patch · 6 files changed

+51/−6 lines, 6 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

+ Data.Array.Accelerate.KullbackLiebler: alphaDivergence :: Floating e => Exp e -> Acc (Vector e) -> Acc (Vector e) -> Acc (Scalar e)
+ Data.Array.Accelerate.KullbackLiebler: fDivergence :: Floating e => (Exp e -> Exp e) -> Acc (Vector e) -> Acc (Vector e) -> Acc (Scalar e)
+ Data.Array.Accelerate.KullbackLiebler: hellinger :: Floating e => Acc (Vector e) -> Acc (Vector e) -> Acc (Scalar e)

Files

CHANGELOG.md view
@@ -1,5 +1,9 @@ # accelerate-kullback-liebler +## 0.1.2.0++  * Add `f`-divergence, `alpha`-divergence, Hellinger distance+ ## 0.1.1.0    * Add `scale` function
README.md view
@@ -1,3 +1,4 @@ # accelerate-kullback-liebler -Kullback-Liebler divergence on arrays.+Kullback-Liebler divergence, Hellinger distance, alpha-divergence, and+f-divergence on arrays.
accelerate-kullback-liebler.cabal view
@@ -1,6 +1,6 @@ cabal-version:   2.0 name:            accelerate-kullback-liebler-version:         0.1.1.0+version:         0.1.2.0 license:         BSD3 license-file:    LICENSE copyright:       Copyright: (c) 2019-2020 Vanessa McHale
bench/Bench.cpphs view
@@ -26,13 +26,17 @@                   bgroup "GPU"                       [ bench "K-L (1e7)" $ nf (kullbackLieblerGPU ps) qs                       , bench "entropy (1e7)" $ nf entropyGPU ps+                      , bench "K-L (1e7) (scaled)" $ nf (kullbackLieblerGPUScaled ps) qs+                      , bench "entropy (1e7) (scaled)" $ nf entropyGPUScaled ps                       ]                 , bgroup "CPU" #else                   bgroup "CPU" #endif                       [ bench "K-L (1e7)" $ nf (kullbackLieblerCPU ps) qs+                      , bench "K-L (1e7) (scaled)" $ nf (kullbackLieblerCPUScaled ps) qs                       , bench "entropy (1e7)" $ nf entropyCPU ps+                      , bench "entropy (1e7) (scaled)" $ nf entropyCPUScaled ps                       ]                 ] @@ -40,8 +44,12 @@           distEnv = randDist (A.Z A.:. 10000000) #ifdef ACCELERATE_GPU           kullbackLieblerGPU ps qs = the $ GPU.run $ kullbackLiebler ps qs+          kullbackLieblerGPUScaled ps qs = the $ GPU.run $ kullbackLiebler (scale ps) (scale qs)           entropyGPU = the . GPU.run . entropy+          entropyGPUScaled = the . GPU.run . entropy . scale #endif           -- TODO: runQ           kullbackLieblerCPU ps qs = the $ CPU.run $ kullbackLiebler ps qs+          kullbackLieblerCPUScaled ps qs = the $ CPU.run $ kullbackLiebler (scale ps) (scale qs)           entropyCPU = the . CPU.run . entropy+          entropyCPUScaled = the . CPU.run . entropy . scale
src/Data/Array/Accelerate/KullbackLiebler.hs view
@@ -5,9 +5,35 @@                                              , entropy                                              , dropZeroes                                              , scale+                                             , hellinger+                                             , fDivergence+                                             , alphaDivergence                                              ) where  import qualified Data.Array.Accelerate as A++-- | \( D_f(p \| q) = \displaystyle\int p(x) f\left(\frac{p(x)}{q(x)}\right) dx \)+--+-- @since 0.1.2.0+fDivergence :: (A.Floating e) => (A.Exp e -> A.Exp e) -- ^ \(f\)+            -> A.Acc (A.Vector e)+            -> A.Acc (A.Vector e)+            -> A.Acc (A.Scalar e)+fDivergence f ps qs = A.sum (A.zipWith (\p q -> p * f (p / q)) ps qs)++-- | \( D^{(\alpha)}(p\| q) = \frac{4}{1 - \alpha^2}\left(1 - \displaystyle\int p(x)^{\frac{1-\alpha}{2}} q(x)^{\frac{1+\alpha}{2}} dx\right)\)+-- for \( \alpha \neq \pm 1\)+--+-- @since 0.1.2.0+alphaDivergence :: A.Floating e => A.Exp e -> A.Acc (A.Vector e) -> A.Acc (A.Vector e) -> A.Acc (A.Scalar e)+alphaDivergence α ps qs = A.map (\x -> (4 / (1 - α ** 2)) * (1 - x)) integrand+    where integrand = A.sum (A.zipWith (\p q -> p ** ((1 - α)/2) * q ** ((1 + α)/2)) ps qs)++-- | Hellinger distance+--+-- @since 0.1.2.0+hellinger :: (A.Floating e) => A.Acc (A.Vector e) -> A.Acc (A.Vector e) -> A.Acc (A.Scalar e)+hellinger ps qs = A.map (A.sqrt . (2*)) $ A.sum (A.zipWith (\p q -> (A.sqrt p - A.sqrt q) ** 2) ps qs)  -- | Assumes input is nonzero kullbackLiebler :: (A.Floating e) => A.Acc (A.Vector e) -> A.Acc (A.Vector e) -> A.Acc (A.Scalar e)
test/Spec.cpphs view
@@ -5,7 +5,7 @@  import           Control.Composition                   ((.$)) import qualified Data.Array.Accelerate                 as A-import           Data.Array.Accelerate.KullbackLiebler (kullbackLiebler, scale)+import           Data.Array.Accelerate.KullbackLiebler (hellinger, kullbackLiebler, scale) import qualified Data.Array.Accelerate.LLVM.Native     as CPU #ifdef ACCELERATE_GPU import qualified Data.Array.Accelerate.LLVM.PTX        as GPU@@ -30,18 +30,24 @@         assertBool "simple unit test" =<< selfCPU     ] ---TODO: random gen/normalization? commonData :: IO (A.Acc (A.Scalar Double)) commonData = do     datums <- randDist (A.Z A.:. 1000000)-    pure $ kullbackLiebler .$ (scale datums)+    pure $ kullbackLiebler .$ scale datums +hellingerData :: IO (A.Acc (A.Scalar Double))+hellingerData = do+    datums <- randDist (A.Z A.:. 1000000)+    pure $ hellinger .$ scale datums+ #ifdef ACCELERATE_GPU selfGPU :: IO Bool selfGPU = do     datums <- commonData+    datums' <- hellingerData     let res = the $ GPU.run datums-    pure $ res == 0+        res' = the $ GPU.run datums'+    pure $ res == 0 && res' == 0 #endif  selfCPU :: IO Bool