]> Git — Sourcephile - gargantext.git/blob - src/Gargantext/Core/Viz/Graph/Tools/IGraph.hs
[FEAT] IGraph partitions complement
[gargantext.git] / src / Gargantext / Core / Viz / Graph / Tools / IGraph.hs
1 {-|
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
8 Portability : POSIX
9
10 Reference:
11 * Gábor Csárdi, Tamás Nepusz: The igraph software package for complex network research. InterJournal Complex Systems, 1695, 2006.
12
13 -}
14
15
16 module Gargantext.Core.Viz.Graph.Tools.IGraph
17 where
18
19 import Data.Serialize
20 import Data.Singletons (SingI)
21 import IGraph hiding (mkGraph, neighbors, edges, nodes, Node, Graph)
22 import Protolude
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
29 ------------------------------------------------------------------
30 -- | Main Types
31 type Graph_Undirected = IG.Graph 'U () ()
32 type Graph_Directed = IG.Graph 'D () ()
33
34 type Node = IG.Node
35 type Graph = IG.Graph
36
37 ------------------------------------------------------------------
38 -- | Main Graph management Functions
39 neighbors :: IG.Graph d v e -> IG.Node -> [IG.Node]
40 neighbors = IG.neighbors
41
42 edges :: IG.Graph d v e -> [Edge]
43 edges = IG.edges
44
45 nodes :: IG.Graph d v e -> [IG.Node]
46 nodes = IG.nodes
47
48 ------------------------------------------------------------------
49 -- | Partitions
50 maximalCliques :: IG.Graph d v e -> [[Int]]
51 maximalCliques g = IG.maximalCliques g (min',max')
52 where
53 min' = 0
54 max' = 0
55
56 ------------------------------------------------------------------
57 type Seed = Int
58
59 -- | Tools to analyze graphs
60 partitions_spinglass :: (Serialize v, Serialize e)
61 => Seed -> IG.Graph 'U v e -> IO [[Int]]
62 partitions_spinglass s g = do
63 gen <- IG.withSeed s pure
64 pure $ IG.findCommunity g Nothing Nothing IG.spinglass gen
65
66 ------------------------------------------------------------------
67
68 mkGraph :: (SingI d, Ord v,
69 Serialize v, Serialize e) =>
70 [v] -> [LEdge e] -> IG.Graph d v e
71 mkGraph = IG.mkGraph
72
73
74 ------------------------------------------------------------------
75 mkGraphUfromEdges :: [(Int, Int)] -> Graph_Undirected
76 mkGraphUfromEdges es = mkGraph (List.replicate n ()) $ zip es $ repeat ()
77 where
78 (a,b) = List.unzip es
79 n = List.length (List.nub $ a <> b)
80
81 mkGraphDfromEdges :: [(Int, Int)] -> Graph_Directed
82 mkGraphDfromEdges = undefined
83
84