scikit-network 0.30.0__cp310-cp310-win_amd64.whl → 0.32.1__cp310-cp310-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of scikit-network might be problematic. Click here for more details.
- {scikit_network-0.30.0.dist-info → scikit_network-0.32.1.dist-info}/AUTHORS.rst +3 -0
- {scikit_network-0.30.0.dist-info → scikit_network-0.32.1.dist-info}/METADATA +31 -3
- scikit_network-0.32.1.dist-info/RECORD +228 -0
- {scikit_network-0.30.0.dist-info → scikit_network-0.32.1.dist-info}/WHEEL +1 -1
- sknetwork/__init__.py +1 -1
- sknetwork/base.py +67 -0
- sknetwork/classification/base.py +24 -24
- sknetwork/classification/base_rank.py +17 -25
- sknetwork/classification/diffusion.py +35 -35
- sknetwork/classification/knn.py +24 -21
- sknetwork/classification/metrics.py +1 -1
- sknetwork/classification/pagerank.py +10 -10
- sknetwork/classification/propagation.py +23 -20
- sknetwork/classification/tests/test_diffusion.py +13 -3
- sknetwork/classification/vote.cp310-win_amd64.pyd +0 -0
- sknetwork/classification/vote.cpp +14482 -10351
- sknetwork/classification/vote.pyx +1 -3
- sknetwork/clustering/__init__.py +3 -1
- sknetwork/clustering/base.py +36 -40
- sknetwork/clustering/kcenters.py +253 -0
- sknetwork/clustering/leiden.py +241 -0
- sknetwork/clustering/leiden_core.cp310-win_amd64.pyd +0 -0
- sknetwork/clustering/leiden_core.cpp +31564 -0
- sknetwork/clustering/leiden_core.pyx +124 -0
- sknetwork/clustering/louvain.py +133 -102
- sknetwork/clustering/louvain_core.cp310-win_amd64.pyd +0 -0
- sknetwork/clustering/louvain_core.cpp +22457 -18792
- sknetwork/clustering/louvain_core.pyx +86 -96
- sknetwork/clustering/postprocess.py +2 -2
- sknetwork/clustering/propagation_clustering.py +15 -19
- sknetwork/clustering/tests/test_API.py +8 -4
- sknetwork/clustering/tests/test_kcenters.py +92 -0
- sknetwork/clustering/tests/test_leiden.py +34 -0
- sknetwork/clustering/tests/test_louvain.py +3 -4
- sknetwork/data/__init__.py +2 -1
- sknetwork/data/base.py +28 -0
- sknetwork/data/load.py +38 -37
- sknetwork/data/models.py +18 -18
- sknetwork/data/parse.py +54 -33
- sknetwork/data/test_graphs.py +2 -2
- sknetwork/data/tests/test_API.py +1 -1
- sknetwork/data/tests/test_base.py +14 -0
- sknetwork/data/tests/test_load.py +1 -1
- sknetwork/data/tests/test_parse.py +9 -12
- sknetwork/data/tests/test_test_graphs.py +1 -2
- sknetwork/data/toy_graphs.py +18 -18
- sknetwork/embedding/__init__.py +0 -1
- sknetwork/embedding/base.py +21 -20
- sknetwork/embedding/force_atlas.py +3 -2
- sknetwork/embedding/louvain_embedding.py +2 -2
- sknetwork/embedding/random_projection.py +5 -3
- sknetwork/embedding/spectral.py +0 -73
- sknetwork/embedding/tests/test_API.py +4 -28
- sknetwork/embedding/tests/test_louvain_embedding.py +4 -9
- sknetwork/embedding/tests/test_random_projection.py +2 -2
- sknetwork/embedding/tests/test_spectral.py +5 -8
- sknetwork/embedding/tests/test_svd.py +1 -1
- sknetwork/gnn/base.py +4 -4
- sknetwork/gnn/base_layer.py +3 -3
- sknetwork/gnn/gnn_classifier.py +45 -89
- sknetwork/gnn/layer.py +1 -1
- sknetwork/gnn/loss.py +1 -1
- sknetwork/gnn/optimizer.py +4 -3
- sknetwork/gnn/tests/test_base_layer.py +4 -4
- sknetwork/gnn/tests/test_gnn_classifier.py +12 -35
- sknetwork/gnn/utils.py +8 -8
- sknetwork/hierarchy/base.py +29 -2
- sknetwork/hierarchy/louvain_hierarchy.py +45 -41
- sknetwork/hierarchy/paris.cp310-win_amd64.pyd +0 -0
- sknetwork/hierarchy/paris.cpp +27369 -22852
- sknetwork/hierarchy/paris.pyx +7 -9
- sknetwork/hierarchy/postprocess.py +16 -16
- sknetwork/hierarchy/tests/test_API.py +1 -1
- sknetwork/hierarchy/tests/test_algos.py +5 -0
- sknetwork/hierarchy/tests/test_metrics.py +1 -1
- sknetwork/linalg/__init__.py +1 -1
- sknetwork/linalg/diteration.cp310-win_amd64.pyd +0 -0
- sknetwork/linalg/diteration.cpp +13474 -9454
- sknetwork/linalg/diteration.pyx +0 -2
- sknetwork/linalg/eig_solver.py +1 -1
- sknetwork/linalg/{normalization.py → normalizer.py} +18 -15
- sknetwork/linalg/operators.py +1 -1
- sknetwork/linalg/ppr_solver.py +1 -1
- sknetwork/linalg/push.cp310-win_amd64.pyd +0 -0
- sknetwork/linalg/push.cpp +22993 -18807
- sknetwork/linalg/push.pyx +0 -2
- sknetwork/linalg/svd_solver.py +1 -1
- sknetwork/linalg/tests/test_normalization.py +3 -7
- sknetwork/linalg/tests/test_operators.py +4 -8
- sknetwork/linalg/tests/test_ppr.py +1 -1
- sknetwork/linkpred/base.py +13 -2
- sknetwork/linkpred/nn.py +6 -6
- sknetwork/log.py +19 -0
- sknetwork/path/__init__.py +4 -3
- sknetwork/path/dag.py +54 -0
- sknetwork/path/distances.py +98 -0
- sknetwork/path/search.py +13 -47
- sknetwork/path/shortest_path.py +37 -162
- sknetwork/path/tests/test_dag.py +37 -0
- sknetwork/path/tests/test_distances.py +62 -0
- sknetwork/path/tests/test_search.py +26 -11
- sknetwork/path/tests/test_shortest_path.py +31 -36
- sknetwork/ranking/__init__.py +0 -1
- sknetwork/ranking/base.py +13 -8
- sknetwork/ranking/betweenness.cp310-win_amd64.pyd +0 -0
- sknetwork/ranking/betweenness.cpp +5709 -3017
- sknetwork/ranking/betweenness.pyx +0 -2
- sknetwork/ranking/closeness.py +7 -10
- sknetwork/ranking/pagerank.py +14 -14
- sknetwork/ranking/postprocess.py +12 -3
- sknetwork/ranking/tests/test_API.py +2 -4
- sknetwork/ranking/tests/test_betweenness.py +3 -3
- sknetwork/ranking/tests/test_closeness.py +3 -7
- sknetwork/ranking/tests/test_pagerank.py +11 -5
- sknetwork/ranking/tests/test_postprocess.py +5 -0
- sknetwork/regression/base.py +19 -2
- sknetwork/regression/diffusion.py +24 -10
- sknetwork/regression/tests/test_diffusion.py +8 -0
- sknetwork/test_base.py +35 -0
- sknetwork/test_log.py +15 -0
- sknetwork/topology/__init__.py +7 -8
- sknetwork/topology/cliques.cp310-win_amd64.pyd +0 -0
- sknetwork/topology/{kcliques.cpp → cliques.cpp} +23412 -20276
- sknetwork/topology/cliques.pyx +149 -0
- sknetwork/topology/core.cp310-win_amd64.pyd +0 -0
- sknetwork/topology/{kcore.cpp → core.cpp} +21732 -18867
- sknetwork/topology/core.pyx +90 -0
- sknetwork/topology/cycles.py +243 -0
- sknetwork/topology/minheap.cp310-win_amd64.pyd +0 -0
- sknetwork/{utils → topology}/minheap.cpp +19452 -15368
- sknetwork/{utils → topology}/minheap.pxd +1 -3
- sknetwork/{utils → topology}/minheap.pyx +1 -3
- sknetwork/topology/structure.py +3 -43
- sknetwork/topology/tests/test_cliques.py +11 -11
- sknetwork/topology/tests/test_core.py +19 -0
- sknetwork/topology/tests/test_cycles.py +65 -0
- sknetwork/topology/tests/test_structure.py +2 -16
- sknetwork/topology/tests/test_triangles.py +11 -15
- sknetwork/topology/tests/test_wl.py +72 -0
- sknetwork/topology/triangles.cp310-win_amd64.pyd +0 -0
- sknetwork/topology/triangles.cpp +5056 -2696
- sknetwork/topology/triangles.pyx +74 -89
- sknetwork/topology/weisfeiler_lehman.py +56 -86
- sknetwork/topology/weisfeiler_lehman_core.cp310-win_amd64.pyd +0 -0
- sknetwork/topology/weisfeiler_lehman_core.cpp +14727 -10622
- sknetwork/topology/weisfeiler_lehman_core.pyx +0 -2
- sknetwork/utils/__init__.py +1 -31
- sknetwork/utils/check.py +2 -2
- sknetwork/utils/format.py +5 -3
- sknetwork/utils/membership.py +2 -2
- sknetwork/utils/tests/test_check.py +3 -3
- sknetwork/utils/tests/test_format.py +3 -1
- sknetwork/utils/values.py +1 -1
- sknetwork/visualization/__init__.py +2 -2
- sknetwork/visualization/dendrograms.py +55 -7
- sknetwork/visualization/graphs.py +292 -72
- sknetwork/visualization/tests/test_dendrograms.py +9 -9
- sknetwork/visualization/tests/test_graphs.py +71 -62
- scikit_network-0.30.0.dist-info/RECORD +0 -227
- sknetwork/embedding/louvain_hierarchy.py +0 -142
- sknetwork/embedding/tests/test_louvain_hierarchy.py +0 -19
- sknetwork/path/metrics.py +0 -148
- sknetwork/path/tests/test_metrics.py +0 -29
- sknetwork/ranking/harmonic.py +0 -82
- sknetwork/topology/dag.py +0 -74
- sknetwork/topology/dag_core.cp310-win_amd64.pyd +0 -0
- sknetwork/topology/dag_core.cpp +0 -23350
- sknetwork/topology/dag_core.pyx +0 -38
- sknetwork/topology/kcliques.cp310-win_amd64.pyd +0 -0
- sknetwork/topology/kcliques.pyx +0 -193
- sknetwork/topology/kcore.cp310-win_amd64.pyd +0 -0
- sknetwork/topology/kcore.pyx +0 -120
- sknetwork/topology/tests/test_cores.py +0 -21
- sknetwork/topology/tests/test_dag.py +0 -26
- sknetwork/topology/tests/test_wl_coloring.py +0 -49
- sknetwork/topology/tests/test_wl_kernel.py +0 -31
- sknetwork/utils/base.py +0 -35
- sknetwork/utils/minheap.cp310-win_amd64.pyd +0 -0
- sknetwork/utils/simplex.py +0 -140
- sknetwork/utils/tests/test_base.py +0 -28
- sknetwork/utils/tests/test_bunch.py +0 -16
- sknetwork/utils/tests/test_projection_simplex.py +0 -33
- sknetwork/utils/tests/test_verbose.py +0 -15
- sknetwork/utils/verbose.py +0 -37
- {scikit_network-0.30.0.dist-info → scikit_network-0.32.1.dist-info}/LICENSE +0 -0
- {scikit_network-0.30.0.dist-info → scikit_network-0.32.1.dist-info}/top_level.txt +0 -0
- /sknetwork/{utils → data}/timeout.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
|
-
"""tests for visualization
|
|
3
|
+
"""tests for visualization of graphs"""
|
|
4
4
|
|
|
5
5
|
import tempfile
|
|
6
6
|
import unittest
|
|
@@ -8,9 +8,9 @@ import unittest
|
|
|
8
8
|
import numpy as np
|
|
9
9
|
from scipy import sparse
|
|
10
10
|
|
|
11
|
-
from sknetwork.data.test_graphs import
|
|
11
|
+
from sknetwork.data.test_graphs import test_disconnected_graph, test_bigraph_disconnect
|
|
12
12
|
from sknetwork.data.toy_graphs import karate_club, painters, movie_actor, bow_tie, star_wars
|
|
13
|
-
from sknetwork.visualization.graphs import svg_graph, svg_bigraph, svg_text, rescale
|
|
13
|
+
from sknetwork.visualization.graphs import visualize_graph, visualize_bigraph, svg_graph, svg_bigraph, svg_text, rescale
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
# noinspection DuplicatedCode
|
|
@@ -21,74 +21,77 @@ class TestVisualization(unittest.TestCase):
|
|
|
21
21
|
adjacency = graph.adjacency
|
|
22
22
|
position = graph.position
|
|
23
23
|
labels = graph.labels
|
|
24
|
+
image = visualize_graph(adjacency, position, labels=labels)
|
|
25
|
+
self.assertEqual(image[1:4], 'svg')
|
|
26
|
+
# alias
|
|
24
27
|
image = svg_graph(adjacency, position, labels=labels)
|
|
25
28
|
self.assertEqual(image[1:4], 'svg')
|
|
26
|
-
image =
|
|
29
|
+
image = visualize_graph(adjacency, position, labels=list(labels))
|
|
27
30
|
self.assertEqual(image[1:4], 'svg')
|
|
28
|
-
image =
|
|
31
|
+
image = visualize_graph(adjacency, position, display_edges=False)
|
|
29
32
|
self.assertEqual(image[1:4], 'svg')
|
|
30
|
-
image =
|
|
33
|
+
image = visualize_graph(adjacency, position, height=None)
|
|
31
34
|
self.assertEqual(image[1:4], 'svg')
|
|
32
|
-
image =
|
|
35
|
+
image = visualize_graph(adjacency, position, height=300, width=None)
|
|
33
36
|
self.assertEqual(image[1:4], 'svg')
|
|
34
|
-
image =
|
|
37
|
+
image = visualize_graph(adjacency, position, height=None, width=200)
|
|
35
38
|
self.assertEqual(image[1:4], 'svg')
|
|
36
39
|
n = adjacency.shape[0]
|
|
37
40
|
edge_labels = [(0, 1, 0), (1, 1, 1), (3, 10, 2)]
|
|
38
|
-
image =
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
41
|
+
image = visualize_graph(adjacency, position=None, names=np.arange(n), labels=np.arange(n), scores=np.arange(n),
|
|
42
|
+
seeds=[0, 1], width=200, height=200, margin=10, margin_text=5, scale=3,
|
|
43
|
+
node_order=np.flip(np.arange(n)),
|
|
44
|
+
node_size=5, node_size_min=2, node_size_max=6, display_node_weight=True,
|
|
45
|
+
node_weights=np.arange(n),
|
|
46
|
+
node_width=2, node_width_max=5, node_color='red', edge_width=2, edge_width_min=2,
|
|
47
|
+
edge_width_max=4, edge_color='blue', edge_labels=edge_labels, display_edge_weight=True,
|
|
48
|
+
font_size=14)
|
|
46
49
|
self.assertEqual(image[1:4], 'svg')
|
|
47
|
-
image =
|
|
50
|
+
image = visualize_graph(adjacency, position=None, labels={0: 0})
|
|
48
51
|
self.assertEqual(image[1:4], 'svg')
|
|
49
|
-
image =
|
|
52
|
+
image = visualize_graph(adjacency, position=None, scores={0: 0})
|
|
50
53
|
self.assertEqual(image[1:4], 'svg')
|
|
51
|
-
image =
|
|
54
|
+
image = visualize_graph(adjacency=None, position=position)
|
|
52
55
|
self.assertEqual(image[1:4], 'svg')
|
|
53
|
-
image =
|
|
56
|
+
image = visualize_graph(adjacency=None, position=position, edge_labels=edge_labels)
|
|
54
57
|
self.assertEqual(image[1:4], 'svg')
|
|
55
|
-
image =
|
|
58
|
+
image = visualize_graph(adjacency, position, labels, label_colors={0: "red", 1: "blue"})
|
|
56
59
|
self.assertEqual(image[1:4], 'svg')
|
|
57
|
-
image =
|
|
60
|
+
image = visualize_graph(adjacency, position, labels, label_colors=["red", "blue"])
|
|
58
61
|
self.assertEqual(image[1:4], 'svg')
|
|
59
|
-
image =
|
|
62
|
+
image = visualize_graph(adjacency, position, labels, node_weights=np.arange(adjacency.shape[0]))
|
|
60
63
|
self.assertEqual(image[1:4], 'svg')
|
|
61
|
-
image =
|
|
64
|
+
image = visualize_graph(adjacency, position, scores=list(np.arange(n)))
|
|
62
65
|
self.assertEqual(image[1:4], 'svg')
|
|
63
|
-
image =
|
|
66
|
+
image = visualize_graph(adjacency, position, seeds={0: 1, 2: 1})
|
|
64
67
|
self.assertEqual(image[1:4], 'svg')
|
|
65
|
-
image =
|
|
68
|
+
image = visualize_graph(adjacency, position, labels=np.arange(n), name_position='left')
|
|
66
69
|
self.assertEqual(image[1:4], 'svg')
|
|
67
|
-
image =
|
|
70
|
+
image = visualize_graph(adjacency, position, scale=2, labels=np.arange(n), name_position='left')
|
|
68
71
|
self.assertEqual(image[1:4], 'svg')
|
|
69
72
|
with self.assertRaises(ValueError):
|
|
70
|
-
|
|
73
|
+
visualize_graph(adjacency, position, labels=[0, 1])
|
|
71
74
|
with self.assertRaises(ValueError):
|
|
72
|
-
|
|
73
|
-
|
|
75
|
+
visualize_graph(adjacency, position, scores=[0, 1])
|
|
76
|
+
visualize_graph(adjacency, position, scale=2, labels=np.arange(n), name_position='left')
|
|
74
77
|
|
|
75
78
|
def test_directed(self):
|
|
76
79
|
graph = painters(True)
|
|
77
80
|
adjacency = graph.adjacency
|
|
78
81
|
position = graph.position
|
|
79
82
|
names = graph.names
|
|
80
|
-
image =
|
|
83
|
+
image = visualize_graph(adjacency, position, names=names)
|
|
81
84
|
self.assertEqual(image[1:4], 'svg')
|
|
82
|
-
image =
|
|
85
|
+
image = visualize_graph(adjacency, position, display_edges=False)
|
|
83
86
|
self.assertEqual(image[1:4], 'svg')
|
|
84
87
|
n = adjacency.shape[0]
|
|
85
|
-
image =
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
88
|
+
image = visualize_graph(adjacency, position=None, names=np.arange(n), labels=np.arange(n), scores=np.arange(n),
|
|
89
|
+
name_position='below', seeds=[0, 1], width=200, height=200, margin=10, margin_text=5,
|
|
90
|
+
scale=3, node_order=np.flip(np.arange(n)),
|
|
91
|
+
node_size=5, node_size_min=2, node_size_max=6, display_node_weight=True,
|
|
92
|
+
node_weights=np.arange(n),
|
|
93
|
+
node_width=2, node_width_max=5, node_color='red', edge_width=2, edge_width_min=2,
|
|
94
|
+
edge_width_max=4, edge_color='blue', display_edge_weight=True, font_size=14)
|
|
92
95
|
self.assertEqual(image[1:4], 'svg')
|
|
93
96
|
|
|
94
97
|
def test_bipartite(self):
|
|
@@ -96,51 +99,57 @@ class TestVisualization(unittest.TestCase):
|
|
|
96
99
|
biadjacency = graph.biadjacency
|
|
97
100
|
names_row = graph.names_row
|
|
98
101
|
names_col = graph.names_col
|
|
102
|
+
image = visualize_bigraph(biadjacency, names_row, names_col)
|
|
103
|
+
self.assertEqual(image[1:4], 'svg')
|
|
104
|
+
# alias
|
|
99
105
|
image = svg_bigraph(biadjacency, names_row, names_col)
|
|
100
106
|
self.assertEqual(image[1:4], 'svg')
|
|
101
|
-
image =
|
|
107
|
+
image = visualize_bigraph(biadjacency, display_edges=False)
|
|
102
108
|
self.assertEqual(image[1:4], 'svg')
|
|
103
|
-
image =
|
|
109
|
+
image = visualize_bigraph(biadjacency, reorder=False)
|
|
104
110
|
self.assertEqual(image[1:4], 'svg')
|
|
105
111
|
n_row, n_col = biadjacency.shape
|
|
106
112
|
position_row = np.random.random((n_row, 2))
|
|
107
113
|
position_col = np.random.random((n_col, 2))
|
|
108
114
|
edge_labels = [(0, 1, 0), (1, 1, 1), (3, 10, 2)]
|
|
109
|
-
image =
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
115
|
+
image = visualize_bigraph(biadjacency=biadjacency, names_row=np.arange(n_row), names_col=np.arange(n_col),
|
|
116
|
+
labels_row=np.arange(n_row), labels_col=np.arange(n_col), scores_row=np.arange(n_row),
|
|
117
|
+
scores_col=np.arange(n_col), seeds_row=[0, 1], seeds_col=[1, 2],
|
|
118
|
+
position_row=position_row, position_col=position_col, color_row='red', color_col='white',
|
|
119
|
+
width=200, height=200, margin=10, margin_text=5, scale=3, node_size=5,
|
|
120
|
+
node_size_min=1, node_size_max=30, node_weights_row=np.arange(n_row),
|
|
121
|
+
node_weights_col=np.arange(n_col), display_node_weight=True, node_width=2, node_width_max=5,
|
|
122
|
+
edge_labels=edge_labels, edge_width=2, edge_width_min=0.3, edge_width_max=4,
|
|
123
|
+
edge_color='red', display_edge_weight=True, font_size=14)
|
|
118
124
|
self.assertEqual(image[1:4], 'svg')
|
|
119
125
|
|
|
120
126
|
def test_disconnect(self):
|
|
121
|
-
adjacency =
|
|
127
|
+
adjacency = test_disconnected_graph()
|
|
122
128
|
position = np.random.random((adjacency.shape[0], 2))
|
|
123
|
-
image =
|
|
129
|
+
image = visualize_graph(adjacency, position)
|
|
124
130
|
self.assertEqual(image[1:4], 'svg')
|
|
125
131
|
biadjacency = test_bigraph_disconnect()
|
|
126
|
-
image =
|
|
132
|
+
image = visualize_bigraph(biadjacency)
|
|
127
133
|
self.assertEqual(image[1:4], 'svg')
|
|
128
134
|
|
|
129
|
-
def
|
|
135
|
+
def test_probs(self):
|
|
130
136
|
adjacency = bow_tie()
|
|
131
|
-
|
|
132
|
-
image =
|
|
137
|
+
probs = np.array([[.5, .5], [0, 0], [1, 0], [0, 1], [0, 1]])
|
|
138
|
+
image = visualize_graph(adjacency, probs=probs)
|
|
139
|
+
self.assertEqual(image[1:4], 'svg')
|
|
140
|
+
probs = sparse.csr_matrix(probs)
|
|
141
|
+
image = visualize_graph(adjacency, probs=probs)
|
|
133
142
|
self.assertEqual(image[1:4], 'svg')
|
|
134
143
|
biadjacency = star_wars()
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
image =
|
|
144
|
+
probs_row = sparse.csr_matrix([[.5, .5], [0, 0], [1, 0], [0, 1]])
|
|
145
|
+
probs_col = sparse.csr_matrix([[.5, .5], [0, 0], [1, 0]])
|
|
146
|
+
image = visualize_bigraph(biadjacency, probs_row=probs_row, probs_col=probs_col)
|
|
138
147
|
self.assertEqual(image[1:4], 'svg')
|
|
139
148
|
|
|
140
149
|
def test_labels(self):
|
|
141
150
|
adjacency = bow_tie()
|
|
142
151
|
names = ["aa", "bb", "<>", "a&b", ""]
|
|
143
|
-
image =
|
|
152
|
+
image = visualize_graph(adjacency, names=names)
|
|
144
153
|
self.assertEqual(image[1:4], 'svg')
|
|
145
154
|
|
|
146
155
|
def test_text(self):
|
|
@@ -157,11 +166,11 @@ class TestVisualization(unittest.TestCase):
|
|
|
157
166
|
graph = karate_club(True)
|
|
158
167
|
adjacency = graph.adjacency
|
|
159
168
|
position = graph.position
|
|
160
|
-
_ =
|
|
169
|
+
_ = visualize_graph(adjacency, position, filename=filename)
|
|
161
170
|
with open(filename + '.svg', 'r') as f:
|
|
162
171
|
row = f.readline()
|
|
163
172
|
self.assertEqual(row[1:4], 'svg')
|
|
164
|
-
_ =
|
|
173
|
+
_ = visualize_bigraph(adjacency, position, filename=filename)
|
|
165
174
|
with open(filename + '.svg', 'r') as f:
|
|
166
175
|
row = f.readline()
|
|
167
176
|
self.assertEqual(row[1:4], 'svg')
|
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
sknetwork/__init__.py,sha256=jkpo7YNbBq4jJuolUFmoKkwtSNcvADLSxFHU5uAeOBA,554
|
|
2
|
-
sknetwork/sknetwork.py,sha256=Qtq3EpSkdAFqQNQPDXTAouXS784LkR8Rh2D5s5w5_tc,47
|
|
3
|
-
sknetwork/classification/__init__.py,sha256=QoS3fTnCZ0nFdlDkEphEYqj1NDEf23_aqsfP0G4zLMM,483
|
|
4
|
-
sknetwork/classification/base.py,sha256=XUt7XY_molL68DGtrT1Qovg0Qzz-yCe4u3kHtnvABAM,4517
|
|
5
|
-
sknetwork/classification/base_rank.py,sha256=xwVnujfiyioU76U5UUVHETvMzVPaOY417nW44UShazw,5001
|
|
6
|
-
sknetwork/classification/diffusion.py,sha256=ZBgD5_3_ZbCJvjF-v88E4uXakswynb3b95zZ0xigrCM,5531
|
|
7
|
-
sknetwork/classification/knn.py,sha256=l9GZDxLe33Og2o3KH6W06HFo4OZasPkxBmzTA7vQU4o,5280
|
|
8
|
-
sknetwork/classification/metrics.py,sha256=1sPqOqliIexvL6ozNy9QTDKfHLV9Sqz5rGoSr3Gjv0M,7012
|
|
9
|
-
sknetwork/classification/pagerank.py,sha256=QtKsuaob8-l4PavvttLhtdGFW_yahM6MjEFmwlHE7Rk,2612
|
|
10
|
-
sknetwork/classification/propagation.py,sha256=odXNOrFUTH3o-2bYBvqjljngAb-x7Qt-QuCWZuC_jMQ,5760
|
|
11
|
-
sknetwork/classification/vote.cp310-win_amd64.pyd,sha256=TjbxZd4OZ6_xNCs2TIZloIiaHGJNCOJfmZrpoDd4UUo,205824
|
|
12
|
-
sknetwork/classification/vote.cpp,sha256=zqsEckc9EhqXA1DaDKuqBBlXsd1eh9RWn8X6ELDlHRw,876336
|
|
13
|
-
sknetwork/classification/vote.pyx,sha256=9II49U_j2UQyBEsDzvnRmescsCrwFjlMOiSuMiJWQME,1716
|
|
14
|
-
sknetwork/classification/tests/__init__.py,sha256=Per0oy1Frnm5jB7dnpod1g_xbgYhqkNteWQV5cemcH0,32
|
|
15
|
-
sknetwork/classification/tests/test_API.py,sha256=WV5cY8yhTHBHYRbDE3InZ4v-agymxLPMKxa2NqjbWZo,1154
|
|
16
|
-
sknetwork/classification/tests/test_diffusion.py,sha256=9BC5qYbm7DQUmZCNfatrEFcAJOoQCv5MhAUGO7zGCKc,2798
|
|
17
|
-
sknetwork/classification/tests/test_knn.py,sha256=EWuWiJJSsfthfvb3x0ejUjdccRBZIFpmG6nv7F8VkOk,807
|
|
18
|
-
sknetwork/classification/tests/test_metrics.py,sha256=9eqBvRiMdVUHf7WhjfwzMcUJFALt4Ufmx5LhBzou8Ww,2356
|
|
19
|
-
sknetwork/classification/tests/test_pagerank.py,sha256=8ywBVzfJOtz_gTIn7XYr0nvHlVwvmZERLrG3LkQHeTU,640
|
|
20
|
-
sknetwork/classification/tests/test_propagation.py,sha256=GzhpCpg0ijLvXuWtABolq02k0-Yh3UHJ2rAKpdQlTxI,874
|
|
21
|
-
sknetwork/clustering/__init__.py,sha256=HAWSDCezfp1FkAQPIxOinB84G_L4cOlrjwnLyqPUths,343
|
|
22
|
-
sknetwork/clustering/base.py,sha256=mk9fws0XTf-SvckRZd0LzA4eIRtQhIFoVpb4b3y9sPM,6472
|
|
23
|
-
sknetwork/clustering/louvain.py,sha256=X9dwCKFgIGUt9G3W5bFKWYyyi9dSU5YO53R_LiE0aEw,10117
|
|
24
|
-
sknetwork/clustering/louvain_core.cp310-win_amd64.pyd,sha256=SWLijZLDHEl9SH94hP2kgjRPL1aCkyxYnLl1BVL99R0,248320
|
|
25
|
-
sknetwork/clustering/louvain_core.cpp,sha256=DMLu0ff4Fe_L9yxd-FSbEUXp5nw7_aNTPIOnDINPUmc,1043679
|
|
26
|
-
sknetwork/clustering/louvain_core.pyx,sha256=Ah5pVcqvO_ULRB13H4hTBUUJxCeKo0_zIHViUGr8Pvs,4692
|
|
27
|
-
sknetwork/clustering/metrics.py,sha256=ptLLtUpFtdKLZ4lcx_MN-PpOrzv--PWhAcEFoFghccM,3151
|
|
28
|
-
sknetwork/clustering/postprocess.py,sha256=Xk9FOPPBLemoROd--qgd9gc4I6xgMOXPKG-LSXqfEZQ,2101
|
|
29
|
-
sknetwork/clustering/propagation_clustering.py,sha256=WLDf9rurCaV1Ue14MQD6JI6JLORpKHBNptOgh0ncQRA,3955
|
|
30
|
-
sknetwork/clustering/tests/__init__.py,sha256=tCA27jkL3pdstka9XWQEA1NbC6ZqL7Rf-1V1UcySCEE,28
|
|
31
|
-
sknetwork/clustering/tests/test_API.py,sha256=WAXGGx_LIRQirOZAA95KM3JHuCE-vocm6rGc4JUIg5c,1516
|
|
32
|
-
sknetwork/clustering/tests/test_louvain.py,sha256=KPrB3C_kQwz2Rn3djKEwWfu7hJ246GrcTNYcd83xTEY,4809
|
|
33
|
-
sknetwork/clustering/tests/test_metrics.py,sha256=ZTr4T-d-g6kQJinei9VH6Teb_rOScmj5XLG168EI5LQ,1868
|
|
34
|
-
sknetwork/clustering/tests/test_postprocess.py,sha256=41l4coS_1CHqGOCnnucqxU6UkXws89YVMjef162ZTEQ,1417
|
|
35
|
-
sknetwork/data/__init__.py,sha256=Cf-TeZkkmgeOcAQ4-vEZRqBJ55ANjdMMiiHY2dZk15s,310
|
|
36
|
-
sknetwork/data/load.py,sha256=-0qleEIdmauQV3e4f86Q6euq1b_Tvkjs1p9xl1-U-8g,14870
|
|
37
|
-
sknetwork/data/models.py,sha256=K8y142q4cOe1DXO_ZvFfoAO-0l_dXnqvBqhceprVSY8,13581
|
|
38
|
-
sknetwork/data/parse.py,sha256=0PHPoVqM-s6PnymttjjnO8kmULPjQcqvHWMzaZPmH8c,26287
|
|
39
|
-
sknetwork/data/test_graphs.py,sha256=N1kwEDOQX9BRA7A47NocBEvdejPjUnDYucaUtQqx9mw,2572
|
|
40
|
-
sknetwork/data/toy_graphs.py,sha256=Bgb0bqDVqlU8ry0ZmqILRPuYNy_leT6M0QBvnEqdYDI,25616
|
|
41
|
-
sknetwork/data/tests/__init__.py,sha256=LtUcKFe5CeBpspRwa6A2uX2cVEf_uPpOo2mGkH7W8cI,20
|
|
42
|
-
sknetwork/data/tests/test_API.py,sha256=qR2Af9Nqgkj4VSNQ2jgxGV7vzMr9fA1qqXk1J-Ys3XA,988
|
|
43
|
-
sknetwork/data/tests/test_load.py,sha256=uoZQna3lXxqP9ScWhI_LWc5q6wVIfREJROe9F-CwmB8,3646
|
|
44
|
-
sknetwork/data/tests/test_models.py,sha256=_2y5xZrWbE3XZltd4n-z84YwyJhPcpaBa2TxXMvhXF4,1967
|
|
45
|
-
sknetwork/data/tests/test_parse.py,sha256=jJtOu9oQ920a8hzce_p0PPfBmjWtt6yfxPH-Azs0SV0,13006
|
|
46
|
-
sknetwork/data/tests/test_test_graphs.py,sha256=2Iqfyr-zzptjzG8KROzdGR7O_zuC77n5EM0EWXwEBwo,878
|
|
47
|
-
sknetwork/data/tests/test_toy_graphs.py,sha256=wQ2X-CVv9oycBUAaB68aJqg-0o3yMlaVtZ9D4thZJrc,2205
|
|
48
|
-
sknetwork/embedding/__init__.py,sha256=XvDQcRkxf5Kbf51Ai6X74AgSAXMarFgP8_AGxeIZY7Q,479
|
|
49
|
-
sknetwork/embedding/base.py,sha256=peUIlGj0NdLSSgS_ReXMRh1d7UeHWbSG1-w1O7IH-_k,2857
|
|
50
|
-
sknetwork/embedding/force_atlas.py,sha256=D1UOepcBnAXGleC-kCxIIRY1o5kPj-jLRUWw15IagR4,7626
|
|
51
|
-
sknetwork/embedding/louvain_embedding.py,sha256=H300QiFP_jqWcHWLhJHZSbA46RmKUk44Qu-B_CJ9FKo,7132
|
|
52
|
-
sknetwork/embedding/louvain_hierarchy.py,sha256=PYfBgOyN6Bi61PNlbQIW6dD-6-fz5m7v2UMvy5lYKpo,5850
|
|
53
|
-
sknetwork/embedding/random_projection.py,sha256=enjMO6sltf4zBLmavqS17X0iknrir5GkDWe8Rfgx7gQ,5053
|
|
54
|
-
sknetwork/embedding/spectral.py,sha256=wZspZ9MvjwK9G-b3ys7gr8fD4goeWigYwd7mXMDcTUM,8335
|
|
55
|
-
sknetwork/embedding/spring.py,sha256=Cl1airI_mSWmV1isKmcxqjY1uxw7NcH7xMwHc8ADmHA,7349
|
|
56
|
-
sknetwork/embedding/svd.py,sha256=isI2y9GfCGA5VJmogHrtq2MDVaxuWCZsEvh4YqgfB2k,15097
|
|
57
|
-
sknetwork/embedding/tests/__init__.py,sha256=PsZQYFNrSmRW_KIuNX3qVtxtZVn8yV18d0mk8Y6ieck,27
|
|
58
|
-
sknetwork/embedding/tests/test_API.py,sha256=CVIg2qkAOCjz2dgGdT8gCImXiICRGX0KZGrKC-9LQTU,2652
|
|
59
|
-
sknetwork/embedding/tests/test_force_atlas.py,sha256=dYiyWroqB7UKNW9MTYpGP6e7tF_qPWqVZNmZBndd_ks,1155
|
|
60
|
-
sknetwork/embedding/tests/test_louvain_embedding.py,sha256=bsjMQy4nTmBLtrpalzr-8sKXOksZ5HvInRtYLrNSD9k,1189
|
|
61
|
-
sknetwork/embedding/tests/test_louvain_hierarchy.py,sha256=shQCsB8qfpP_5LCOKdAtOnDcs78e3Ag9IB_-0Umezws,749
|
|
62
|
-
sknetwork/embedding/tests/test_random_projection.py,sha256=CWrqoT3-CZTF25oJPlYyfzlbP4iICMWWExOockM1btI,1217
|
|
63
|
-
sknetwork/embedding/tests/test_spectral.py,sha256=cjOy0HNb2P3Q8b1wXQ2YNNBILSvhGUqEVWYTwhatFYU,4342
|
|
64
|
-
sknetwork/embedding/tests/test_spring.py,sha256=z3eT-mFcfNSoMWPKQF-Dz_ZjAsJplQrx1yspiaeFRBw,1693
|
|
65
|
-
sknetwork/embedding/tests/test_svd.py,sha256=jn8Osv7eMzWHfdtFkuCB189cdJ0v2Af4Bm9bQ7QjzmQ,1212
|
|
66
|
-
sknetwork/gnn/__init__.py,sha256=808PNZEYNHZrIBpKqPzAMKES8yhN6QXEVUWkZVJIJWI,529
|
|
67
|
-
sknetwork/gnn/activation.py,sha256=rhvEXgrIix4nZ9I3WYZ0e1MID_DESCCC_XlVcOa4Wpo,3677
|
|
68
|
-
sknetwork/gnn/base.py,sha256=7XznRlzuPJcpOjYT9lRzdD7KuvDL0y-iELEp2xmI60w,5932
|
|
69
|
-
sknetwork/gnn/base_activation.py,sha256=Kxs_d4aPOpMRXZMBAW7WKkA_uWLXRM7XM-JqE4nFHhc,2395
|
|
70
|
-
sknetwork/gnn/base_layer.py,sha256=mGiMee2HKAdqlBcKLvr6ylRG-BrraBg68cGe4n6S-Q0,4085
|
|
71
|
-
sknetwork/gnn/gnn_classifier.py,sha256=zdnv9rlWy9VdmyKYN7NdoTTuuX5xha0u0arZ7FkPUcE,14598
|
|
72
|
-
sknetwork/gnn/layer.py,sha256=agAIKeoWcae4-QBeztGDCmowq68U_Cv3m2-4jZWBE04,5684
|
|
73
|
-
sknetwork/gnn/loss.py,sha256=2cSOj-MbXjmrZbH-KQdEG6IYvSjdwMCnN7SUnI_fd7U,5342
|
|
74
|
-
sknetwork/gnn/neighbor_sampler.py,sha256=l5OkylbRQsDpmkfeHAaSA7gHi5l7OUKtL4YvH-YTMWM,1929
|
|
75
|
-
sknetwork/gnn/optimizer.py,sha256=DNL4AXAkO5bUhyK34MFBlZ7QaydYNtgjbhjJ_kjUsN4,5902
|
|
76
|
-
sknetwork/gnn/utils.py,sha256=OZQuxNO2CAe_KVuXNCFyOzYA1HqwpJFWWpuuhlSesaU,4448
|
|
77
|
-
sknetwork/gnn/tests/__init__.py,sha256=_q1IzwMWdNgX90qzdbVkr0LV4NTjFzXg81z4-TM93cw,21
|
|
78
|
-
sknetwork/gnn/tests/test_activation.py,sha256=UznwTCvOeCX80n5urtoDhnM8lskDM67AsVFiY-ViqzU,2543
|
|
79
|
-
sknetwork/gnn/tests/test_base.py,sha256=EN3QjzsSwzpOgyIYHwA6mgCDRBigx7YQ5iSQXQbw_pM,3468
|
|
80
|
-
sknetwork/gnn/tests/test_base_layer.py,sha256=J1cVNOXOe1_iwaKqq6EAFBa_KG-fVthDDEETNWJaNqw,1432
|
|
81
|
-
sknetwork/gnn/tests/test_gnn_classifier.py,sha256=RrmQumX9_3RA7y-H3CgWi4AIR-XYNC9ZWHb_D6WySm4,7012
|
|
82
|
-
sknetwork/gnn/tests/test_layers.py,sha256=6Rbz_jJm3m5e6XWZA3P8Bfzlss9nBoiE4rSz2Tc-QKo,3256
|
|
83
|
-
sknetwork/gnn/tests/test_loss.py,sha256=QvzXKW_xzirXUSkiDm9HgqJPHJdd55FOpuHWZzxyeKs,1078
|
|
84
|
-
sknetwork/gnn/tests/test_neigh_sampler.py,sha256=7yhKZSRg2sZd3kFNs-qdj1LKgM7X8xZBNoOYYkYRfek,721
|
|
85
|
-
sknetwork/gnn/tests/test_optimizer.py,sha256=OZnIeO__kNt8HXLHr-WHGzvDsTy4LvJ19p9jcFVzXME,1823
|
|
86
|
-
sknetwork/gnn/tests/test_utils.py,sha256=MJvOXEWouRiIVaPM76W0hizt3jFb-1_BXHLd1zkPzSg,1884
|
|
87
|
-
sknetwork/hierarchy/__init__.py,sha256=-2-y7iBVQRanXLSl9kY8VASJVqx37trYmVNcz74QsUc,418
|
|
88
|
-
sknetwork/hierarchy/base.py,sha256=iXQvMTGGGbLm5zOgHNpR8erMtJIXNDqV8X5oNY80wNg,2097
|
|
89
|
-
sknetwork/hierarchy/louvain_hierarchy.py,sha256=QWgGQNoZxRoOBULDbC-1J-jRg7duDX8ItcL19WHpIlY,9367
|
|
90
|
-
sknetwork/hierarchy/metrics.py,sha256=5WZLsSLYKifLIQ9aPrXyzvPtTFN5ROSlNivhV-n9VuY,8280
|
|
91
|
-
sknetwork/hierarchy/paris.cp310-win_amd64.pyd,sha256=3wXllpcii0YLKoUcmKiptwh_LnT-sEf38qOTSRGnCgg,284672
|
|
92
|
-
sknetwork/hierarchy/paris.cpp,sha256=daV8ZWQLfviO6tiNxto2BmMDap3TqXbnQAmsjieEy3Y,1296401
|
|
93
|
-
sknetwork/hierarchy/paris.pyx,sha256=q6hjnaLmFBL_T6RK2Id4TgqN89V4DyJhFzvkl9H-pdo,11990
|
|
94
|
-
sknetwork/hierarchy/postprocess.py,sha256=h8v3Ft0li53ewkbpdeiM4j2Xw8tjPbvpJkpqIJstZ-Y,12313
|
|
95
|
-
sknetwork/hierarchy/tests/__init__.py,sha256=jRlC4pbyKuxaiXvByYK-4ix7DwYWxpjwKNvSXZ7rQJE,27
|
|
96
|
-
sknetwork/hierarchy/tests/test_API.py,sha256=TuAH54nypEPmhzV9POoyg43cVLop7FQhhhl_w-NgwjA,742
|
|
97
|
-
sknetwork/hierarchy/tests/test_algos.py,sha256=DtIlYH9zqX0tiX0nmuvL5jTAZiqMhb56F7IQRV-jeMc,1172
|
|
98
|
-
sknetwork/hierarchy/tests/test_metrics.py,sha256=FOo-AhxIf_3U9LGuE3OFA1ZbycbqMa8KH0iarSIwH6Y,3220
|
|
99
|
-
sknetwork/hierarchy/tests/test_postprocess.py,sha256=Bm1_XU6OgwZr_1B28IA5m_HZRqI7GMwlTLpzkXux__Y,2266
|
|
100
|
-
sknetwork/linalg/__init__.py,sha256=_qdALdabKv3x8CAuhq6UB4R9jRewNfpgh6XCRnhHvCE,545
|
|
101
|
-
sknetwork/linalg/basics.py,sha256=WDlylrkBTCQpjXGtzs8kshJYfpo0h3uM8TMhHmnAnnM,1179
|
|
102
|
-
sknetwork/linalg/diteration.cp310-win_amd64.pyd,sha256=lpeAZJUOCBMXpyEIWUC6y0TcUx2x7CYHF_qx6yX-R3M,195584
|
|
103
|
-
sknetwork/linalg/diteration.cpp,sha256=oYB83Aml6u4QiczRYjbkD0hotaydBJvNmNPTaDOZbUg,878950
|
|
104
|
-
sknetwork/linalg/diteration.pyx,sha256=kYl5ZxCBzaK7F3Ju40pcjzph5qaPX95UKfUecsmjh9k,1506
|
|
105
|
-
sknetwork/linalg/eig_solver.py,sha256=-Xl87UQUFD9Y7UJok2SYD3Vv0Z82FZ-quqsdOqjEOgY,2799
|
|
106
|
-
sknetwork/linalg/laplacian.py,sha256=qifd-8iltcTKCQW-7fG5z3XfwVrrrCeaBqbViBQCLf0,416
|
|
107
|
-
sknetwork/linalg/normalization.py,sha256=obwwS0E_gVXbZlVkxWBVmAyGlTS8WCKwSTnK7wayJTw,2393
|
|
108
|
-
sknetwork/linalg/operators.py,sha256=PPGw20FDAXWj89_CD-lVVh9oA30-O29-XtN_yIygKcM,7660
|
|
109
|
-
sknetwork/linalg/polynome.py,sha256=qnIhfpRk26JMinuNCrZO1EDj5ci65ZLxkKJyhO7HxpE,2201
|
|
110
|
-
sknetwork/linalg/ppr_solver.py,sha256=Vr8H5f3R8qwvqlhmvlt8p2t09v83WCLyx9mlCvXVLe8,6706
|
|
111
|
-
sknetwork/linalg/push.cp310-win_amd64.pyd,sha256=7Cwpq41cmFrEjz9UvlMWAZ6zeoMAHGWClvSEqnNR6Z8,214528
|
|
112
|
-
sknetwork/linalg/push.cpp,sha256=G1XPYrRt5YtuvFWFhSriHHWxtXsxaCxBoQWGgbMoSkk,1005496
|
|
113
|
-
sknetwork/linalg/push.pyx,sha256=jPjTqyhhXSKfqsYhbwkPGP_y6wJt_dfmof4FZS0Pvp0,2504
|
|
114
|
-
sknetwork/linalg/sparse_lowrank.py,sha256=-6-cNRs6tpiNqA8ah3mBKWap3Nh9GQHTFIarPjIiC7U,5170
|
|
115
|
-
sknetwork/linalg/svd_solver.py,sha256=vHcwG07cyxnm5KhHRVeJ0pZU5lg3u1uV1eOikCA6V8Y,2778
|
|
116
|
-
sknetwork/linalg/tests/__init__.py,sha256=i2cO6oXoryXdEJ-HdSFZsY7LZdNit7W3GC8J8LAUMU4,24
|
|
117
|
-
sknetwork/linalg/tests/test_eig.py,sha256=c_BpjP_S7xCwYgk2N7kaFfsjV1-nfUYCu3Rys07bPeo,1548
|
|
118
|
-
sknetwork/linalg/tests/test_laplacian.py,sha256=iGI4bFmYfhCbymlN4wcnE0tV9GmApC3g7bDL3Qx8dR0,452
|
|
119
|
-
sknetwork/linalg/tests/test_normalization.py,sha256=mwUzdftJg0ZucOi5hf1X0dqOhfMJWyhjpIdymIYeEyc,1142
|
|
120
|
-
sknetwork/linalg/tests/test_operators.py,sha256=F-LnXKwoQ3B7c2IuF7luNthz7HJOl9lIsdFfukDjBVo,3175
|
|
121
|
-
sknetwork/linalg/tests/test_polynome.py,sha256=-F0iMhYd1lVFau6ILxq7Mr5BtJxJPB-TX3ya3tQwzOM,1015
|
|
122
|
-
sknetwork/linalg/tests/test_ppr.py,sha256=uN8vTEemFSDLJJYW2W9EVKb8x25ynB8Bez0D7q-B3NQ,2139
|
|
123
|
-
sknetwork/linalg/tests/test_sparse_lowrank.py,sha256=Vqeey1W8jB85zT0L4c5TEGTL0hyQ9zX4FQ6EEI4tmHE,2337
|
|
124
|
-
sknetwork/linalg/tests/test_svd.py,sha256=9Uu89-1vTlaJ_H82MUwzGz-iiYf_wFiZMyfelVBRHMI,1323
|
|
125
|
-
sknetwork/linkpred/__init__.py,sha256=a7t20Q3xpm1M5IXnyErmucoQuHnGwPTNKAD42oYHEWQ,74
|
|
126
|
-
sknetwork/linkpred/base.py,sha256=Bjuwiep1ZckROUKGWpttZzo9pOR8ea-atCTxnGLcZDQ,788
|
|
127
|
-
sknetwork/linkpred/nn.py,sha256=I9r5xiob1lFAcNfF7369LOLzwZMJJrzFofJOvEL0Sws,4085
|
|
128
|
-
sknetwork/linkpred/tests/__init__.py,sha256=vghxhmK0F5SJOYIb9HZV0h3AVXsCVEPwkgfM7aPpV9M,33
|
|
129
|
-
sknetwork/linkpred/tests/test_nn.py,sha256=-1r8LyU34XXvhHnvJA53fGmOd6Ei2jGG6-LHtYvHYGc,1010
|
|
130
|
-
sknetwork/path/__init__.py,sha256=tTfCsZCydR5zWkwkJN6_9RwU7bOlG4IRtJy5TsCoKME,249
|
|
131
|
-
sknetwork/path/metrics.py,sha256=d_ILvQKY8MWqjl5jny1jrLmZruMgGOUYf6BpRVzmlq8,5015
|
|
132
|
-
sknetwork/path/search.py,sha256=3rXmt052El8R02XvpAlljGv03sQVtYJ-HeCApHShJrw,2568
|
|
133
|
-
sknetwork/path/shortest_path.py,sha256=74JtUcxzcRS4GuHPqDvs_lc6nZpOlvbVspB8r6UkpTM,6911
|
|
134
|
-
sknetwork/path/tests/__init__.py,sha256=ntNGJ8p6RZkIrYnePF-TESyoidEXx8fw6A9OBNAlIqo,29
|
|
135
|
-
sknetwork/path/tests/test_metrics.py,sha256=O_5-2vtu5hG3csO_LuquMn8AidprDunZD7SVsnTi1_I,868
|
|
136
|
-
sknetwork/path/tests/test_search.py,sha256=7-rrTJfw2l3D3kP-rauQJyD5lyvC_bO6kDUAB06A1xk,728
|
|
137
|
-
sknetwork/path/tests/test_shortest_path.py,sha256=s973xj3Dp-Rh9nkOl-r8BdPtMlgIr-wXUwazZUSbaJw,1564
|
|
138
|
-
sknetwork/ranking/__init__.py,sha256=88IDSo6q9uPCtMBUzAenq9Tfw5qC6xAN7wihCsQUmhg,405
|
|
139
|
-
sknetwork/ranking/base.py,sha256=aYs2Jl_higrG1pyxgiPEgFPSp3C9nPtF3_BT3dYQlpI,1503
|
|
140
|
-
sknetwork/ranking/betweenness.cp310-win_amd64.pyd,sha256=eEXs_VIYHvWyI3j5LFfim4FIgyUDXv5RmVwOrX9-JPo,75264
|
|
141
|
-
sknetwork/ranking/betweenness.cpp,sha256=px19BV7kyhL8QiKXy5bAWDzJaZrHCLmNlySOwKvBzdg,281847
|
|
142
|
-
sknetwork/ranking/betweenness.pyx,sha256=JsLjz9otsrPWMwGrN9wD0SzVZHdh4HwVAs9pZGSaw-M,3259
|
|
143
|
-
sknetwork/ranking/closeness.py,sha256=ozR46X23EznYFwtt_xdPZVMd1jgRrhYbthja43d-wHs,3153
|
|
144
|
-
sknetwork/ranking/harmonic.py,sha256=LbWpyOfsI98H3YNgHWDteCxWToBM5tnvf7LRLiUp2Jk,2385
|
|
145
|
-
sknetwork/ranking/hits.py,sha256=uhGJH2C0U9hLsVRutI6M1ulbEIM7L6dCeYqiAhtTD9A,2855
|
|
146
|
-
sknetwork/ranking/katz.py,sha256=WQpxJq_qqvjFm1ZG_P1ynfpzLlPu-dXCJ9luK-8sRjY,2618
|
|
147
|
-
sknetwork/ranking/pagerank.py,sha256=r1zz9IiqMcX3k1nvcgc-144aIYej2jVACy_1hBUugO8,4853
|
|
148
|
-
sknetwork/ranking/postprocess.py,sha256=3NyhVdywPZFC56TlhC4QcgL_vgtF4wpk0UotU_sZaOg,631
|
|
149
|
-
sknetwork/ranking/tests/__init__.py,sha256=46AJCs9irV6PtFg8CVH8TqpqHA6ajs29-3rsL3zxZQ8,25
|
|
150
|
-
sknetwork/ranking/tests/test_API.py,sha256=OqQmT_TCsABrtWx3L_2yq1Pd3Nm2snTu8_zvIJh3PIk,1194
|
|
151
|
-
sknetwork/ranking/tests/test_betweenness.py,sha256=Ur1WM2PGNkciMbb99S7CrDkNkZIj1X-tVn-U2_gFAvs,1171
|
|
152
|
-
sknetwork/ranking/tests/test_closeness.py,sha256=73xTsOpP5OUhA3J714pVlFWUrrLwry8dv9Oca8Fm1gM,1041
|
|
153
|
-
sknetwork/ranking/tests/test_hits.py,sha256=aOPsAyU3GNyb_Mcujd7U_TLBtzWn91SuOPyZZRUF9MU,511
|
|
154
|
-
sknetwork/ranking/tests/test_pagerank.py,sha256=e_f7Y33ITMDZyFgvZaRxrTyIODgvXwKgDK8BgMyitw0,1983
|
|
155
|
-
sknetwork/ranking/tests/test_postprocess.py,sha256=krBSXLzmseTxjdwkMdlZu62bZ56kC4iCpIelFMLEmDI,524
|
|
156
|
-
sknetwork/regression/__init__.py,sha256=FYnlc-DKS1Mz2lKVCtKldjSgtvzxMmkd5kwKq2HdNmE,145
|
|
157
|
-
sknetwork/regression/base.py,sha256=6BpA7O3lVTwkYtaS9JlDaBOHvNVnQH7lrxD7pSYJiJ0,1129
|
|
158
|
-
sknetwork/regression/diffusion.py,sha256=GagoWzmlc86w8eY_df-kIbbyNVNXzrhE1XJIkLFSTNU,7462
|
|
159
|
-
sknetwork/regression/tests/__init__.py,sha256=GvqvsSMbqMYwRmWw4VrZntwccz1jOPqrqufAZqw_NAc,28
|
|
160
|
-
sknetwork/regression/tests/test_API.py,sha256=7x_n8bG8hUcJVRYDbdC6GvPmwW5cE7HmASlu5SHnwFI,1056
|
|
161
|
-
sknetwork/regression/tests/test_diffusion.py,sha256=kUncxGwUnXFn15TfAkQKqE4syVvg_-ERNZGwua1JJoo,1734
|
|
162
|
-
sknetwork/topology/__init__.py,sha256=mafuxKAbQIlrM6i_9lPw0S6WhFR1AT6lKSaZDRD7uz4,456
|
|
163
|
-
sknetwork/topology/dag.py,sha256=_5z1uy0D4zC2mF9vpfE0bYmNffcMkMIERGlCDbFTxa8,2396
|
|
164
|
-
sknetwork/topology/dag_core.cp310-win_amd64.pyd,sha256=IDDODGSjYdYzOcHgpvKscBm1WQJLBehrmtJTDdYRJvw,198656
|
|
165
|
-
sknetwork/topology/dag_core.cpp,sha256=t5vn8Jw_JrrQm-rSS9F1oegGZ7_CJo3ltm5WchB09ZE,874332
|
|
166
|
-
sknetwork/topology/dag_core.pyx,sha256=GdWMM_4fn1tFxWJHThTqC8oxRGIzCtwd1DjOaEkH9fY,1046
|
|
167
|
-
sknetwork/topology/kcliques.cp310-win_amd64.pyd,sha256=0Aum8dFG0QV3q3zgV7bqBq2ct9uvUMsoFtJhH793OGk,243712
|
|
168
|
-
sknetwork/topology/kcliques.cpp,sha256=59Hv1hUvBT23SBeIcHn60RnoyF89Cel6RToSfMnhd00,1103591
|
|
169
|
-
sknetwork/topology/kcliques.pyx,sha256=qhm0ENqqPngm5y_1Hxgt8Zjtaba5gMKlPAolHsUNBqU,5314
|
|
170
|
-
sknetwork/topology/kcore.cp310-win_amd64.pyd,sha256=k4W-37ZDltyxHAgZhYCeoX8xrxEZqBRVKFXrAHEYZag,218624
|
|
171
|
-
sknetwork/topology/kcore.cpp,sha256=iiQrdVQYfrjgJEJdGI_6MJB6TlqN6B4DdNzyGqZp9OQ,1029784
|
|
172
|
-
sknetwork/topology/kcore.pyx,sha256=A7rX7-WiffMOSuOrVfSBWa_A14antAlu6rvrXTVrVTI,3500
|
|
173
|
-
sknetwork/topology/structure.py,sha256=ZN8Oz2pCtDPgadvzAtTpaeBrGip564vWz9XVKJaUR8E,8856
|
|
174
|
-
sknetwork/topology/triangles.cp310-win_amd64.pyd,sha256=eQfy0oK7AiuMQcrQaX8j5pXUHJSk7Pr2O0TWtXprmAE,60416
|
|
175
|
-
sknetwork/topology/triangles.cpp,sha256=wshfOPgRhuBY4sICklafPmLBhvJeDQwBye0Mabi-QWA,258294
|
|
176
|
-
sknetwork/topology/triangles.pyx,sha256=ra1CSDDCdlEqZ1VTqS6Gv62MabhYg2bQ60M9ybPtZJw,4811
|
|
177
|
-
sknetwork/topology/weisfeiler_lehman.py,sha256=MLCM7ViRuYl4tj5hjlB34iulD0Z1COYIaT52JQLBNEI,5473
|
|
178
|
-
sknetwork/topology/weisfeiler_lehman_core.cp310-win_amd64.pyd,sha256=afAAwqJ1RYnqe45-N2TqEXq_tjAYO5gtvHc4jLOJiJY,205312
|
|
179
|
-
sknetwork/topology/weisfeiler_lehman_core.cpp,sha256=hklfTm2NGrMz_ZOkCztULYJVI1VDpvsO_bY4DjKdZ6w,880493
|
|
180
|
-
sknetwork/topology/weisfeiler_lehman_core.pyx,sha256=Tg690FqNjoCaxd1KeOKY5fFrEGEnmeShc1NkvhIbw7U,3223
|
|
181
|
-
sknetwork/topology/tests/__init__.py,sha256=84T-xv8JCFeA9D7Rxw9gy3_dNAoE8CY1k1pYcuG8K3s,26
|
|
182
|
-
sknetwork/topology/tests/test_cliques.py,sha256=33JZ78-su0he3S_vk8U7sna__Gvyo2oaUI-KgcQ1LIY,929
|
|
183
|
-
sknetwork/topology/tests/test_cores.py,sha256=e7EcpX5ah-XY3B4oAg__XfpQXYHahNrRnyGRSS6W390,628
|
|
184
|
-
sknetwork/topology/tests/test_dag.py,sha256=j0YOY-HTLopB3revJCpCVhSUvKJNUkgro4iiOw-nbMY,680
|
|
185
|
-
sknetwork/topology/tests/test_structure.py,sha256=MJcPSCNSxairXVc_FO4nCsqJu7f_-zyy1VC4sFL8b90,4734
|
|
186
|
-
sknetwork/topology/tests/test_triangles.py,sha256=k8wc7ZFrHcSUnfdViHQHAZjYT8rYz6qUoYiDQPXaBmQ,1384
|
|
187
|
-
sknetwork/topology/tests/test_wl_coloring.py,sha256=ENzomssejjvsjD6mDjTsgoXHlR8OPAOQ_AFOsK3sjmo,1697
|
|
188
|
-
sknetwork/topology/tests/test_wl_kernel.py,sha256=8j0bRgbyy2mKMvEFs8bfTimU35f3gbwlLQu4w8WqeQc,864
|
|
189
|
-
sknetwork/utils/__init__.py,sha256=poK60DO1CGqGenK6zCbQX31YKTMzJ9d7_jbf0xPjQ0k,1052
|
|
190
|
-
sknetwork/utils/base.py,sha256=7Zd65d8p0Xh6jsPGdKnmnBCPJ1R3V6DaodeFYGAlGS4,1086
|
|
191
|
-
sknetwork/utils/check.py,sha256=3sHaRmLM9XsyX-wEi4o1r_c8QMQfV8jwmEeqS5ntrS4,13248
|
|
192
|
-
sknetwork/utils/format.py,sha256=xMDHgcqCSYzOejy7OJiA_R2CtS0aFheAy6jJbGaSquY,8845
|
|
193
|
-
sknetwork/utils/membership.py,sha256=claXsrZd6BVT4WuuI0P00tqapbczvAxtLAWMWNQ78KE,2234
|
|
194
|
-
sknetwork/utils/minheap.cp310-win_amd64.pyd,sha256=PD0tQux9lcgQRR7ldDIaqsm6ugLbYEj2J1D8_2ROWh4,187392
|
|
195
|
-
sknetwork/utils/minheap.cpp,sha256=5-Mz_5BFVUK3mOUAl3KYvNFwOI8E736TgCB824NWA78,866948
|
|
196
|
-
sknetwork/utils/minheap.pxd,sha256=KP710yK0fKOpnN7d87LSYyRuipzgNUd-YqfTN0fbmx0,661
|
|
197
|
-
sknetwork/utils/minheap.pyx,sha256=mr6VIqK-0SGprUHmKhduuu9D-e8LULavdbR9BYeHHyE,3496
|
|
198
|
-
sknetwork/utils/neighbors.py,sha256=-EwBXigM3mn2qvVTi_aPmG0XifDMojZgsMQ9_A8cLkk,3466
|
|
199
|
-
sknetwork/utils/simplex.py,sha256=uEO_mcZCb9YMHCAK3DIlYM0YpkH3ZAcQxD9SgmVKz3M,4384
|
|
200
|
-
sknetwork/utils/tfidf.py,sha256=vvISEaZJa7RZrNNgQEAHgMH2rJToARuNWcVjnA8u7po,993
|
|
201
|
-
sknetwork/utils/timeout.py,sha256=mXSqgKFRc6AVZBlIobN2xPYJjAyQOClKH3KQJ5M_4Sw,1085
|
|
202
|
-
sknetwork/utils/values.py,sha256=Y0GYTazOV9Sh_8BQC_yjleoUyx2Tjz9G2EYSu_IZAxM,2583
|
|
203
|
-
sknetwork/utils/verbose.py,sha256=9-R6D5s217EsCzA7D-IPHbNLfFIBEiLw9xua2CyAoAU,988
|
|
204
|
-
sknetwork/utils/tests/__init__.py,sha256=JQuARG8Ycb5apL6PUy_wuEHsLjmEZFOPQUKWRgTMdCY,23
|
|
205
|
-
sknetwork/utils/tests/test_base.py,sha256=RmS70uR6F0p5k2yBqPKViGbfpAmEwO3Rx1JuFYZmIO4,851
|
|
206
|
-
sknetwork/utils/tests/test_bunch.py,sha256=eZIQEzd-Hc4uixoarEjsuS_uJQO2_b0d-eO1Ygpw1Ho,351
|
|
207
|
-
sknetwork/utils/tests/test_check.py,sha256=R3AB9OmBIHE7hO_LfNLzRfJJuOYQxDWY3M9tSvDs7zY,6948
|
|
208
|
-
sknetwork/utils/tests/test_format.py,sha256=_88lJ6Ewpr8mro8gyuq6Kj-inN6-W5GeZdTlZN0GzmY,2175
|
|
209
|
-
sknetwork/utils/tests/test_membership.py,sha256=d_TobwpRl2K3qCcFBDQV1bGCSmF7Ls3r2s_XGvJC3Sg,772
|
|
210
|
-
sknetwork/utils/tests/test_neighbors.py,sha256=Q7-Y23CcF4vn5lcyEqjaojEAk7-pG03Mf59O1Rz3IUs,1467
|
|
211
|
-
sknetwork/utils/tests/test_projection_simplex.py,sha256=hBXbJc-G2v7Qr9m97gYoznHbs5blEzIk48NmdEjhaIQ,892
|
|
212
|
-
sknetwork/utils/tests/test_tfidf.py,sha256=KYz_LSxi625kKL-v5-uA1-YQOliIfgXCmNXTAZtgpmw,463
|
|
213
|
-
sknetwork/utils/tests/test_values.py,sha256=K3ctTXpSy9fwiHnpFVlHX5KeTd2wNF4kbFiTXe_gQq8,2334
|
|
214
|
-
sknetwork/utils/tests/test_verbose.py,sha256=TlQ3JdO08lL_01A0RXKelnU9cMdUp6IWxNhBT6QG6Ko,410
|
|
215
|
-
sknetwork/visualization/__init__.py,sha256=0gVE7r4oXW6IPlNzq2EXwvr_oRDwCjtuhBh0FN-4I4Y,162
|
|
216
|
-
sknetwork/visualization/colors.py,sha256=NhyMQeetfH16khnJD2gD_uZJkBD3JQDV0K3Jzacamqw,2543
|
|
217
|
-
sknetwork/visualization/dendrograms.py,sha256=-U-WVuO-uFpqPrXuWJmhpkIUyeYX-GLemRmChdtbWhY,8280
|
|
218
|
-
sknetwork/visualization/graphs.py,sha256=nhxU9VuvP6Y9C2e1ND7tkssdewAXp4Hu0yp6GIjmrXo,32740
|
|
219
|
-
sknetwork/visualization/tests/__init__.py,sha256=hrso2pNVzMWn4D2pRyWA_xAMib-xacKjm-rf91MyGGk,31
|
|
220
|
-
sknetwork/visualization/tests/test_dendrograms.py,sha256=4BEdDonrQZsylKgwDpxwTdUZTnqbMKokpugTYbcAp5o,2455
|
|
221
|
-
sknetwork/visualization/tests/test_graphs.py,sha256=63ISDfBHE9JQOeyXSjKuwD3ZVl3CnJ0vnrqrhqj3L_I,8885
|
|
222
|
-
scikit_network-0.30.0.dist-info/AUTHORS.rst,sha256=SSAG2WortFtGW_lEWFDX15zhkIvoEOwc60q2yVTRN7Q,921
|
|
223
|
-
scikit_network-0.30.0.dist-info/LICENSE,sha256=BJ1Hth1QjBmjIfHcp1sVxlkEqHYM58Vn5bcpYcggMZE,1656
|
|
224
|
-
scikit_network-0.30.0.dist-info/METADATA,sha256=yCsGNB0LVK9CXyw6lyiFhEYHSBCdHRLMjyFxgCivvjY,14068
|
|
225
|
-
scikit_network-0.30.0.dist-info/WHEEL,sha256=rneS2j8QNmAwdNKHN86s6-qP7AMcWZgqiEoH3bdbh_Y,102
|
|
226
|
-
scikit_network-0.30.0.dist-info/top_level.txt,sha256=fkwspWQ9B3csqb5ENEOoVciRY6XftnMuz4MvTDQeSsg,10
|
|
227
|
-
scikit_network-0.30.0.dist-info/RECORD,,
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# coding: utf-8
|
|
3
|
-
"""
|
|
4
|
-
Created on Dec 2020
|
|
5
|
-
@author: Quentin Lutz <qlutz@enst.fr>
|
|
6
|
-
"""
|
|
7
|
-
from typing import Optional, Union
|
|
8
|
-
|
|
9
|
-
import numpy as np
|
|
10
|
-
from scipy import sparse
|
|
11
|
-
|
|
12
|
-
from sknetwork.utils.check import check_format, check_random_state
|
|
13
|
-
from sknetwork.utils.format import get_adjacency
|
|
14
|
-
from sknetwork.clustering.louvain import Louvain
|
|
15
|
-
from sknetwork.embedding.base import BaseEmbedding
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class LouvainNE(BaseEmbedding):
|
|
19
|
-
"""Embedding of graphs based on the hierarchical Louvain algorithm with random scattering per level.
|
|
20
|
-
|
|
21
|
-
Parameters
|
|
22
|
-
----------
|
|
23
|
-
n_components : int
|
|
24
|
-
Dimension of the embedding.
|
|
25
|
-
scale : float
|
|
26
|
-
Dilution factor to be applied on the random vector to be added at each iteration of the clustering method.
|
|
27
|
-
resolution :
|
|
28
|
-
Resolution parameter.
|
|
29
|
-
tol_optimization :
|
|
30
|
-
Minimum increase in the objective function to enter a new optimization pass.
|
|
31
|
-
tol_aggregation :
|
|
32
|
-
Minimum increase in the objective function to enter a new aggregation pass.
|
|
33
|
-
n_aggregations :
|
|
34
|
-
Maximum number of aggregations.
|
|
35
|
-
A negative value is interpreted as no limit.
|
|
36
|
-
shuffle_nodes :
|
|
37
|
-
Enables node shuffling before optimization.
|
|
38
|
-
random_state :
|
|
39
|
-
Random number generator or random seed. If None, numpy.random is used.
|
|
40
|
-
|
|
41
|
-
Attributes
|
|
42
|
-
----------
|
|
43
|
-
embedding_ : array, shape = (n, n_components)
|
|
44
|
-
Embedding of the nodes.
|
|
45
|
-
embedding_row_ : array, shape = (n_row, n_components)
|
|
46
|
-
Embedding of the rows, for bipartite graphs.
|
|
47
|
-
embedding_col_ : array, shape = (n_col, n_components)
|
|
48
|
-
Embedding of the columns, for bipartite graphs.
|
|
49
|
-
Example
|
|
50
|
-
-------
|
|
51
|
-
>>> from sknetwork.embedding import LouvainNE
|
|
52
|
-
>>> from sknetwork.data import karate_club
|
|
53
|
-
>>> louvain = LouvainNE(n_components=3)
|
|
54
|
-
>>> adjacency = karate_club()
|
|
55
|
-
>>> embedding = louvain.fit_transform(adjacency)
|
|
56
|
-
>>> embedding.shape
|
|
57
|
-
(34, 3)
|
|
58
|
-
|
|
59
|
-
References
|
|
60
|
-
----------
|
|
61
|
-
Bhowmick, A. K., Meneni, K., Danisch, M., Guillaume, J. L., & Mitra, B. (2020, January).
|
|
62
|
-
`LouvainNE: Hierarchical Louvain Method for High Quality and Scalable Network Embedding.
|
|
63
|
-
<https://hal.archives-ouvertes.fr/hal-02999888/document>`_
|
|
64
|
-
In Proceedings of the 13th International Conference on Web Search and Data Mining (pp. 43-51).
|
|
65
|
-
"""
|
|
66
|
-
def __init__(self, n_components: int = 2, scale: float = .1, resolution: float = 1, tol_optimization: float = 1e-3,
|
|
67
|
-
tol_aggregation: float = 1e-3, n_aggregations: int = -1, shuffle_nodes: bool = False,
|
|
68
|
-
random_state: Optional[Union[np.random.RandomState, int]] = None, verbose: bool = False):
|
|
69
|
-
super(LouvainNE, self).__init__()
|
|
70
|
-
|
|
71
|
-
self.n_components = n_components
|
|
72
|
-
self.scale = scale
|
|
73
|
-
self._clustering_method = Louvain(resolution=resolution, tol_optimization=tol_optimization,
|
|
74
|
-
tol_aggregation=tol_aggregation, n_aggregations=n_aggregations,
|
|
75
|
-
shuffle_nodes=shuffle_nodes, random_state=random_state, verbose=verbose)
|
|
76
|
-
self.random_state = check_random_state(random_state)
|
|
77
|
-
self.bipartite = None
|
|
78
|
-
|
|
79
|
-
def _recursive_louvain(self, adjacency: Union[sparse.csr_matrix, np.ndarray], depth: int,
|
|
80
|
-
nodes: Optional[np.ndarray] = None):
|
|
81
|
-
"""Recursive function for fit, modifies the embedding in place.
|
|
82
|
-
|
|
83
|
-
Parameters
|
|
84
|
-
----------
|
|
85
|
-
adjacency :
|
|
86
|
-
Adjacency matrix of the graph.
|
|
87
|
-
depth :
|
|
88
|
-
Depth of the recursion.
|
|
89
|
-
nodes :
|
|
90
|
-
The indices of the current nodes in the original graph.
|
|
91
|
-
"""
|
|
92
|
-
n = adjacency.shape[0]
|
|
93
|
-
if nodes is None:
|
|
94
|
-
nodes = np.arange(n)
|
|
95
|
-
|
|
96
|
-
if adjacency.nnz:
|
|
97
|
-
labels = self._clustering_method.fit_transform(adjacency)
|
|
98
|
-
else:
|
|
99
|
-
labels = np.zeros(n)
|
|
100
|
-
|
|
101
|
-
clusters = np.unique(labels)
|
|
102
|
-
|
|
103
|
-
if len(clusters) != 1:
|
|
104
|
-
random_vectors = (self.scale ** depth) * self.random_state.rand(self.n_components, len(clusters))
|
|
105
|
-
for index, cluster in enumerate(clusters):
|
|
106
|
-
mask = (labels == cluster)
|
|
107
|
-
nodes_cluster = nodes[mask]
|
|
108
|
-
self.embedding_[nodes_cluster, :] += random_vectors[:, index]
|
|
109
|
-
n_row = len(mask)
|
|
110
|
-
indptr = np.zeros(n_row + 1, dtype=int)
|
|
111
|
-
indptr[1:] = np.cumsum(mask)
|
|
112
|
-
n_col = indptr[-1]
|
|
113
|
-
combiner = sparse.csr_matrix((np.ones(n_col), np.arange(n_col, dtype=int), indptr),
|
|
114
|
-
shape=(n_row, n_col))
|
|
115
|
-
adjacency_cluster = adjacency[mask, :].dot(combiner)
|
|
116
|
-
self._recursive_louvain(adjacency_cluster, depth + 1, nodes_cluster)
|
|
117
|
-
|
|
118
|
-
def fit(self, input_matrix: Union[sparse.csr_matrix, np.ndarray], force_bipartite: bool = False):
|
|
119
|
-
"""Embedding of graphs from a clustering obtained with Louvain.
|
|
120
|
-
|
|
121
|
-
Parameters
|
|
122
|
-
----------
|
|
123
|
-
input_matrix :
|
|
124
|
-
Adjacency matrix or biadjacency matrix of the graph.
|
|
125
|
-
force_bipartite :
|
|
126
|
-
If ``True``, force the input matrix to be considered as a biadjacency matrix even if square.
|
|
127
|
-
Returns
|
|
128
|
-
-------
|
|
129
|
-
self: :class:`LouvainNE`
|
|
130
|
-
"""
|
|
131
|
-
# input
|
|
132
|
-
input_matrix = check_format(input_matrix)
|
|
133
|
-
adjacency, self.bipartite = get_adjacency(input_matrix, force_bipartite=force_bipartite)
|
|
134
|
-
n = adjacency.shape[0]
|
|
135
|
-
|
|
136
|
-
# embedding
|
|
137
|
-
self.embedding_ = np.zeros((n, self.n_components))
|
|
138
|
-
self._recursive_louvain(adjacency, 0)
|
|
139
|
-
|
|
140
|
-
if self.bipartite:
|
|
141
|
-
self._split_vars(input_matrix.shape)
|
|
142
|
-
return self
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
|
-
"""tests for LouvainNE"""
|
|
4
|
-
import unittest
|
|
5
|
-
|
|
6
|
-
from sknetwork.data.test_graphs import test_graph, test_graph_disconnect, test_digraph, test_bigraph
|
|
7
|
-
from sknetwork.embedding import LouvainNE
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class TestLouvainNE(unittest.TestCase):
|
|
11
|
-
|
|
12
|
-
def test_louvain_hierarchy(self):
|
|
13
|
-
louvain = LouvainNE()
|
|
14
|
-
for adjacency in [test_graph(), test_graph_disconnect(), test_digraph()]:
|
|
15
|
-
self.assertTupleEqual(louvain.fit_transform(adjacency).shape, (10, 2))
|
|
16
|
-
louvain.fit(test_bigraph())
|
|
17
|
-
self.assertTupleEqual(louvain.embedding_.shape, (6, 2))
|
|
18
|
-
louvain.fit(test_graph(), force_bipartite=True)
|
|
19
|
-
self.assertTupleEqual(louvain.embedding_.shape, (10, 2))
|