2 Module : Gargantext.Graph.Distances.Matrix
4 Copyright : (c) CNRS, 2017-Present
5 License : AGPL + CECILL v3
6 Maintainer : team@gargantext.org
7 Stability : experimental
10 Motivation and definition of the @Conditional@ distance.
12 Implementation use Accelerate library :
13 * Manuel M. T. Chakravarty, Gabriele Keller, Sean Lee, Trevor L. McDonell, and Vinod Grover.
14 [Accelerating Haskell Array Codes with Multicore GPUs][CKLM+11].
15 In _DAMP '11: Declarative Aspects of Multicore Programming_, ACM, 2011.
17 * Trevor L. McDonell, Manuel M. T. Chakravarty, Gabriele Keller, and Ben Lippmeier.
18 [Optimising Purely Functional GPU Programs][MCKL13].
19 In _ICFP '13: The 18th ACM SIGPLAN International Conference on Functional Programming_, ACM, 2013.
21 * Robert Clifton-Everest, Trevor L. McDonell, Manuel M. T. Chakravarty, and Gabriele Keller.
22 [Embedding Foreign Code][CMCK14].
23 In _PADL '14: The 16th International Symposium on Practical Aspects of Declarative Languages_, Springer-Verlag, LNCS, 2014.
25 * Trevor L. McDonell, Manuel M. T. Chakravarty, Vinod Grover, and Ryan R. Newton.
26 [Type-safe Runtime Code Generation: Accelerate to LLVM][MCGN15].
27 In _Haskell '15: The 8th ACM SIGPLAN Symposium on Haskell_, ACM, 2015.
31 {-# LANGUAGE NoImplicitPrelude #-}
32 {-# LANGUAGE FlexibleContexts #-}
33 {-# LANGUAGE TypeFamilies #-}
34 {-# LANGUAGE TypeOperators #-}
36 module Gargantext.Viz.Graph.Distances.Matrice
39 --import Data.Array.Accelerate.Data.Bits
40 import Data.Array.Accelerate.Interpreter (run)
42 import Data.Array.Accelerate
43 import Data.Array.Accelerate.Smart
44 import Data.Array.Accelerate.Type
45 import Data.Array.Accelerate.Array.Sugar (fromArr, Array, Z)
47 import Data.Maybe (Maybe(Just))
48 import qualified Gargantext.Prelude as P
49 import qualified Data.Array.Accelerate.Array.Representation as Repr
52 vector :: Int -> (Array (Z :. Int) Int)
53 vector n = fromList (Z :. n) [0..n]
55 matrix :: Elt c => Int -> [c] -> Matrix c
56 matrix n l = fromList (Z :. n :. n) l
58 myMat :: Int -> Matrix Double
59 myMat n = matrix n [1..]
61 -- | Two ways to get the rank (as documentation)
62 rank :: (Matrix Double) -> Int
63 rank m = arrayRank $ arrayShape m
65 rank' :: (Matrix Double) -> Int
68 Z :. _ :. n = arrayShape m
70 -----------------------------------------------------------------------
71 -- | Conditional Distance
75 proba :: Rank -> Acc (Matrix Double) -> Acc (Matrix Double)
76 proba r mat = zipWith (/) mat (mkSum r mat)
78 mkSum :: Rank -> Acc (Matrix Double) -> Acc (Matrix Double)
79 mkSum r mat = replicate (constant (Z :. (r :: Int) :. All))
83 type Matrix' a = Acc (Matrix a)
84 type InclusionExclusion = Double
85 type SpecificityGenericity = Double
87 conditional :: Matrix Double -> (Matrix InclusionExclusion, Matrix SpecificityGenericity)
88 conditional m = (run $ ie (use m), run $ sg (use m))
93 xs :: Matrix' Double -> Matrix' Double
94 xs mat = zipWith (-) (proba r mat) (mkSum r $ proba r mat)
95 ys :: Acc (Matrix Double) -> Acc (Matrix Double)
96 ys mat = zipWith (-) (proba r mat) (mkSum r $ transpose $ proba r mat)
98 ie :: Matrix' Double -> Matrix' Double
99 ie mat = map (\x -> x / (2*n-1)) $ zipWith (+) (xs mat) (ys mat)
100 sg :: Acc (Matrix Double) -> Acc (Matrix Double)
101 sg mat = map (\x -> x / (2*n-1)) $ zipWith (-) (xs mat) (ys mat)
107 -- filter with threshold
108 -----------------------------------------------------------------------
110 -- | Distributional Distance
112 distributional :: Matrix Double -> Matrix Double
113 distributional m = run $ filter $ ri (use m)
117 filter m = zipWith (\a b -> max a b) m (transpose m)
119 --miniMax m = map (\x -> if unlift ( x > (unlift $ minimum $ maximum m)) then x else 0) m
121 ri mat = zipWith (/) mat1 mat2
123 mat1 = mkSum n $ zipWith min (mi mat) (mi $ transpose mat)
126 mi m' = zipWith (\a b -> max (log $ a/b) 0) m'
127 $ zipWith (/) (crossProduct m') (total m')
129 total m'' = replicate (constant (Z :. n :. n)) $ fold (+) 0 $ fold (+) 0 m''
131 crossProduct m = zipWith (*) (cross m ) (cross (transpose m))
132 cross mat = zipWith (-) (mkSum n mat) (mat)