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 IGraph hiding (mkGraph, neighbors, edges, nodes, Node, Graph)
22 import Gargantext.Core.Viz.Graph.Index
23 import qualified Data.List as List
24 import qualified IGraph as IG
25 import qualified IGraph.Algorithms.Clique as IG
26 import qualified IGraph.Algorithms.Community as IG
27 import qualified IGraph.Random as IG
28 import qualified Data.Map as Map
30 ------------------------------------------------------------------
32 type Graph_Undirected = IG.Graph 'U () ()
33 type Graph_Directed = IG.Graph 'D () ()
38 ------------------------------------------------------------------
39 -- | Main Graph management Functions
40 neighbors :: IG.Graph d v e -> IG.Node -> [IG.Node]
41 neighbors = IG.neighbors
43 edges :: IG.Graph d v e -> [Edge]
46 nodes :: IG.Graph d v e -> [IG.Node]
49 ------------------------------------------------------------------
51 maximalCliques :: IG.Graph d v e -> [[Int]]
52 maximalCliques g = IG.maximalCliques g (min',max')
57 ------------------------------------------------------------------
60 spinglass :: Seed -> Map (Int, Int) Double -> IO [ClusterNode]
61 spinglass s g = toClusterNode
63 <$> map (map (\n -> Map.lookup n fromI))
64 <$> partitions_spinglass' s g''
66 g'' = mkGraphUfromEdges (Map.keys g')
67 (toI, fromI) = createIndices g
70 -- | Tools to analyze graphs
71 partitions_spinglass' :: (Serialize v, Serialize e)
72 => Seed -> IG.Graph 'U v e -> IO [[Int]]
73 partitions_spinglass' s g = do
74 gen <- IG.withSeed s pure
75 pure $ IG.findCommunity g Nothing Nothing IG.spinglass gen
78 data ClusterNode = ClusterNode { cl_node_id :: Int
79 , cl_community_id :: Int
82 toClusterNode :: [[Int]] -> [ClusterNode]
83 toClusterNode ns = List.concat
84 $ map (\(cId, ns') -> map (\n -> ClusterNode n cId) ns')
87 ------------------------------------------------------------------
88 mkGraph :: (SingI d, Ord v,
89 Serialize v, Serialize e) =>
90 [v] -> [LEdge e] -> IG.Graph d v e
93 ------------------------------------------------------------------
94 mkGraphUfromEdges :: [(Int, Int)] -> Graph_Undirected
95 mkGraphUfromEdges es = mkGraph (List.replicate n ()) $ zip es $ repeat ()
98 n = List.length (List.nub $ a <> b)
101 mkGraphDfromEdges :: [(Int, Int)] -> Graph_Directed
102 mkGraphDfromEdges = undefined