2 Module : Gargantext.Core.Viz.Graph.Tools.IGraph
3 Description : Tools to build Graph
4 Copyright : (c) CNRS, 2017-Present
5 License : AGPL + CECILL v3
6 Maintainer : team@gargantext.org
7 Stability : experimental
11 * Gábor Csárdi, Tamás Nepusz: The igraph software package for complex network research. InterJournal Complex Systems, 1695, 2006.
15 module Gargantext.Core.Viz.Graph.Tools.IGraph
19 import Data.Singletons (SingI)
20 import Gargantext.Core.Viz.Graph.Index
21 import Graph.Types (ClusterNode(..))
22 import IGraph hiding (mkGraph, neighbors, edges, nodes, Node, Graph)
24 import Gargantext.Prelude (saveAsFileDebug)
25 import qualified Data.List as List
26 import qualified Data.Map.Strict as Map
27 import qualified IGraph as IG
28 import qualified IGraph.Algorithms.Clique as IG
29 import qualified IGraph.Algorithms.Community as IG
30 import qualified IGraph.Algorithms.Structure as IG
31 import qualified IGraph.Random as IG
32 import qualified Data.Set as Set
34 ------------------------------------------------------------------
36 type Graph_Undirected = IG.Graph 'U () ()
37 type Graph_Directed = IG.Graph 'D () ()
42 ------------------------------------------------------------------
43 -- | Main Graph management Functions
44 neighbors :: IG.Graph d v e -> IG.Node -> [IG.Node]
45 neighbors = IG.neighbors
47 edges :: IG.Graph d v e -> [Edge]
50 nodes :: IG.Graph d v e -> [IG.Node]
53 ------------------------------------------------------------------
55 maximalCliques :: IG.Graph d v e -> [[Int]]
56 maximalCliques g = IG.maximalCliques g (min',max')
61 ------------------------------------------------------------------
64 spinglass :: Seed -> Map (Int, Int) Double -> IO [ClusterNode]
65 spinglass s g = toClusterNode
67 <$> map (map (\n -> Map.lookup n fromI))
69 <$> mapM (partitions_spinglass' s) g'
71 -- Not connected components of the graph make crash spinglass
72 g' = IG.decompose $ mkGraphUfromEdges
76 (toI, fromI) = createIndices g
78 spinglass' :: Seed -> Map (Int, Int) Double -> IO [Set Int]
79 spinglass' s g = map Set.fromList
81 <$> map (map (\n -> Map.lookup n fromI))
83 <$> mapM (partitions_spinglass' s) g'
85 -- Not connected components of the graph make crash spinglass
86 g' = IG.decompose $ mkGraphUfromEdges
90 (toI, fromI) = createIndices g
96 -- | Tools to analyze graphs
97 partitions_spinglass' :: (Serialize v, Serialize e)
98 => Seed -> IG.Graph 'U v e -> IO [[Int]]
99 partitions_spinglass' s g = do
100 gen <- IG.withSeed s pure
101 res <- IG.findCommunity g Nothing Nothing IG.spinglass gen
102 -- res <- IG.findCommunity g Nothing Nothing IG.leiden gen
103 -- res <- IG.findCommunity g Nothing Nothing IG.infomap gen
104 saveAsFileDebug "/tmp/res" res
108 toClusterNode :: [[Int]] -> [ClusterNode]
109 toClusterNode ns = List.concat
110 $ map (\(cId, ns') -> map (\n -> ClusterNode n cId) ns')
113 ------------------------------------------------------------------
114 mkGraph :: (SingI d, Ord v,
115 Serialize v, Serialize e) =>
116 [v] -> [LEdge e] -> IG.Graph d v e
119 ------------------------------------------------------------------
120 mkGraphUfromEdges :: [(Int, Int)] -> Graph_Undirected
121 mkGraphUfromEdges es = mkGraph (List.replicate n ()) $ zip es $ repeat ()
123 (a,b) = List.unzip es
124 n = List.length (List.nub $ a <> b)
127 mkGraphDfromEdges :: [(Int, Int)] -> Graph_Directed
128 mkGraphDfromEdges = undefined