scikit-network 0.30.0__cp39-cp39-win_amd64.whl → 0.32.1__cp39-cp39-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.

Files changed (187) hide show
  1. {scikit_network-0.30.0.dist-info → scikit_network-0.32.1.dist-info}/AUTHORS.rst +3 -0
  2. {scikit_network-0.30.0.dist-info → scikit_network-0.32.1.dist-info}/METADATA +31 -3
  3. scikit_network-0.32.1.dist-info/RECORD +228 -0
  4. {scikit_network-0.30.0.dist-info → scikit_network-0.32.1.dist-info}/WHEEL +1 -1
  5. sknetwork/__init__.py +1 -1
  6. sknetwork/base.py +67 -0
  7. sknetwork/classification/base.py +24 -24
  8. sknetwork/classification/base_rank.py +17 -25
  9. sknetwork/classification/diffusion.py +35 -35
  10. sknetwork/classification/knn.py +24 -21
  11. sknetwork/classification/metrics.py +1 -1
  12. sknetwork/classification/pagerank.py +10 -10
  13. sknetwork/classification/propagation.py +23 -20
  14. sknetwork/classification/tests/test_diffusion.py +13 -3
  15. sknetwork/classification/vote.cp39-win_amd64.pyd +0 -0
  16. sknetwork/classification/vote.cpp +14482 -10351
  17. sknetwork/classification/vote.pyx +1 -3
  18. sknetwork/clustering/__init__.py +3 -1
  19. sknetwork/clustering/base.py +36 -40
  20. sknetwork/clustering/kcenters.py +253 -0
  21. sknetwork/clustering/leiden.py +241 -0
  22. sknetwork/clustering/leiden_core.cp39-win_amd64.pyd +0 -0
  23. sknetwork/clustering/leiden_core.cpp +31564 -0
  24. sknetwork/clustering/leiden_core.pyx +124 -0
  25. sknetwork/clustering/louvain.py +133 -102
  26. sknetwork/clustering/louvain_core.cp39-win_amd64.pyd +0 -0
  27. sknetwork/clustering/louvain_core.cpp +22457 -18792
  28. sknetwork/clustering/louvain_core.pyx +86 -96
  29. sknetwork/clustering/postprocess.py +2 -2
  30. sknetwork/clustering/propagation_clustering.py +15 -19
  31. sknetwork/clustering/tests/test_API.py +8 -4
  32. sknetwork/clustering/tests/test_kcenters.py +92 -0
  33. sknetwork/clustering/tests/test_leiden.py +34 -0
  34. sknetwork/clustering/tests/test_louvain.py +3 -4
  35. sknetwork/data/__init__.py +2 -1
  36. sknetwork/data/base.py +28 -0
  37. sknetwork/data/load.py +38 -37
  38. sknetwork/data/models.py +18 -18
  39. sknetwork/data/parse.py +54 -33
  40. sknetwork/data/test_graphs.py +2 -2
  41. sknetwork/data/tests/test_API.py +1 -1
  42. sknetwork/data/tests/test_base.py +14 -0
  43. sknetwork/data/tests/test_load.py +1 -1
  44. sknetwork/data/tests/test_parse.py +9 -12
  45. sknetwork/data/tests/test_test_graphs.py +1 -2
  46. sknetwork/data/toy_graphs.py +18 -18
  47. sknetwork/embedding/__init__.py +0 -1
  48. sknetwork/embedding/base.py +21 -20
  49. sknetwork/embedding/force_atlas.py +3 -2
  50. sknetwork/embedding/louvain_embedding.py +2 -2
  51. sknetwork/embedding/random_projection.py +5 -3
  52. sknetwork/embedding/spectral.py +0 -73
  53. sknetwork/embedding/tests/test_API.py +4 -28
  54. sknetwork/embedding/tests/test_louvain_embedding.py +4 -9
  55. sknetwork/embedding/tests/test_random_projection.py +2 -2
  56. sknetwork/embedding/tests/test_spectral.py +5 -8
  57. sknetwork/embedding/tests/test_svd.py +1 -1
  58. sknetwork/gnn/base.py +4 -4
  59. sknetwork/gnn/base_layer.py +3 -3
  60. sknetwork/gnn/gnn_classifier.py +45 -89
  61. sknetwork/gnn/layer.py +1 -1
  62. sknetwork/gnn/loss.py +1 -1
  63. sknetwork/gnn/optimizer.py +4 -3
  64. sknetwork/gnn/tests/test_base_layer.py +4 -4
  65. sknetwork/gnn/tests/test_gnn_classifier.py +12 -35
  66. sknetwork/gnn/utils.py +8 -8
  67. sknetwork/hierarchy/base.py +29 -2
  68. sknetwork/hierarchy/louvain_hierarchy.py +45 -41
  69. sknetwork/hierarchy/paris.cp39-win_amd64.pyd +0 -0
  70. sknetwork/hierarchy/paris.cpp +27369 -22852
  71. sknetwork/hierarchy/paris.pyx +7 -9
  72. sknetwork/hierarchy/postprocess.py +16 -16
  73. sknetwork/hierarchy/tests/test_API.py +1 -1
  74. sknetwork/hierarchy/tests/test_algos.py +5 -0
  75. sknetwork/hierarchy/tests/test_metrics.py +1 -1
  76. sknetwork/linalg/__init__.py +1 -1
  77. sknetwork/linalg/diteration.cp39-win_amd64.pyd +0 -0
  78. sknetwork/linalg/diteration.cpp +13474 -9454
  79. sknetwork/linalg/diteration.pyx +0 -2
  80. sknetwork/linalg/eig_solver.py +1 -1
  81. sknetwork/linalg/{normalization.py → normalizer.py} +18 -15
  82. sknetwork/linalg/operators.py +1 -1
  83. sknetwork/linalg/ppr_solver.py +1 -1
  84. sknetwork/linalg/push.cp39-win_amd64.pyd +0 -0
  85. sknetwork/linalg/push.cpp +22993 -18807
  86. sknetwork/linalg/push.pyx +0 -2
  87. sknetwork/linalg/svd_solver.py +1 -1
  88. sknetwork/linalg/tests/test_normalization.py +3 -7
  89. sknetwork/linalg/tests/test_operators.py +4 -8
  90. sknetwork/linalg/tests/test_ppr.py +1 -1
  91. sknetwork/linkpred/base.py +13 -2
  92. sknetwork/linkpred/nn.py +6 -6
  93. sknetwork/log.py +19 -0
  94. sknetwork/path/__init__.py +4 -3
  95. sknetwork/path/dag.py +54 -0
  96. sknetwork/path/distances.py +98 -0
  97. sknetwork/path/search.py +13 -47
  98. sknetwork/path/shortest_path.py +37 -162
  99. sknetwork/path/tests/test_dag.py +37 -0
  100. sknetwork/path/tests/test_distances.py +62 -0
  101. sknetwork/path/tests/test_search.py +26 -11
  102. sknetwork/path/tests/test_shortest_path.py +31 -36
  103. sknetwork/ranking/__init__.py +0 -1
  104. sknetwork/ranking/base.py +13 -8
  105. sknetwork/ranking/betweenness.cp39-win_amd64.pyd +0 -0
  106. sknetwork/ranking/betweenness.cpp +5709 -3017
  107. sknetwork/ranking/betweenness.pyx +0 -2
  108. sknetwork/ranking/closeness.py +7 -10
  109. sknetwork/ranking/pagerank.py +14 -14
  110. sknetwork/ranking/postprocess.py +12 -3
  111. sknetwork/ranking/tests/test_API.py +2 -4
  112. sknetwork/ranking/tests/test_betweenness.py +3 -3
  113. sknetwork/ranking/tests/test_closeness.py +3 -7
  114. sknetwork/ranking/tests/test_pagerank.py +11 -5
  115. sknetwork/ranking/tests/test_postprocess.py +5 -0
  116. sknetwork/regression/base.py +19 -2
  117. sknetwork/regression/diffusion.py +24 -10
  118. sknetwork/regression/tests/test_diffusion.py +8 -0
  119. sknetwork/test_base.py +35 -0
  120. sknetwork/test_log.py +15 -0
  121. sknetwork/topology/__init__.py +7 -8
  122. sknetwork/topology/cliques.cp39-win_amd64.pyd +0 -0
  123. sknetwork/topology/{kcliques.cpp → cliques.cpp} +23412 -20276
  124. sknetwork/topology/cliques.pyx +149 -0
  125. sknetwork/topology/core.cp39-win_amd64.pyd +0 -0
  126. sknetwork/topology/{kcore.cpp → core.cpp} +21732 -18867
  127. sknetwork/topology/core.pyx +90 -0
  128. sknetwork/topology/cycles.py +243 -0
  129. sknetwork/topology/minheap.cp39-win_amd64.pyd +0 -0
  130. sknetwork/{utils → topology}/minheap.cpp +19452 -15368
  131. sknetwork/{utils → topology}/minheap.pxd +1 -3
  132. sknetwork/{utils → topology}/minheap.pyx +1 -3
  133. sknetwork/topology/structure.py +3 -43
  134. sknetwork/topology/tests/test_cliques.py +11 -11
  135. sknetwork/topology/tests/test_core.py +19 -0
  136. sknetwork/topology/tests/test_cycles.py +65 -0
  137. sknetwork/topology/tests/test_structure.py +2 -16
  138. sknetwork/topology/tests/test_triangles.py +11 -15
  139. sknetwork/topology/tests/test_wl.py +72 -0
  140. sknetwork/topology/triangles.cp39-win_amd64.pyd +0 -0
  141. sknetwork/topology/triangles.cpp +5056 -2696
  142. sknetwork/topology/triangles.pyx +74 -89
  143. sknetwork/topology/weisfeiler_lehman.py +56 -86
  144. sknetwork/topology/weisfeiler_lehman_core.cp39-win_amd64.pyd +0 -0
  145. sknetwork/topology/weisfeiler_lehman_core.cpp +14727 -10622
  146. sknetwork/topology/weisfeiler_lehman_core.pyx +0 -2
  147. sknetwork/utils/__init__.py +1 -31
  148. sknetwork/utils/check.py +2 -2
  149. sknetwork/utils/format.py +5 -3
  150. sknetwork/utils/membership.py +2 -2
  151. sknetwork/utils/tests/test_check.py +3 -3
  152. sknetwork/utils/tests/test_format.py +3 -1
  153. sknetwork/utils/values.py +1 -1
  154. sknetwork/visualization/__init__.py +2 -2
  155. sknetwork/visualization/dendrograms.py +55 -7
  156. sknetwork/visualization/graphs.py +292 -72
  157. sknetwork/visualization/tests/test_dendrograms.py +9 -9
  158. sknetwork/visualization/tests/test_graphs.py +71 -62
  159. scikit_network-0.30.0.dist-info/RECORD +0 -227
  160. sknetwork/embedding/louvain_hierarchy.py +0 -142
  161. sknetwork/embedding/tests/test_louvain_hierarchy.py +0 -19
  162. sknetwork/path/metrics.py +0 -148
  163. sknetwork/path/tests/test_metrics.py +0 -29
  164. sknetwork/ranking/harmonic.py +0 -82
  165. sknetwork/topology/dag.py +0 -74
  166. sknetwork/topology/dag_core.cp39-win_amd64.pyd +0 -0
  167. sknetwork/topology/dag_core.cpp +0 -23350
  168. sknetwork/topology/dag_core.pyx +0 -38
  169. sknetwork/topology/kcliques.cp39-win_amd64.pyd +0 -0
  170. sknetwork/topology/kcliques.pyx +0 -193
  171. sknetwork/topology/kcore.cp39-win_amd64.pyd +0 -0
  172. sknetwork/topology/kcore.pyx +0 -120
  173. sknetwork/topology/tests/test_cores.py +0 -21
  174. sknetwork/topology/tests/test_dag.py +0 -26
  175. sknetwork/topology/tests/test_wl_coloring.py +0 -49
  176. sknetwork/topology/tests/test_wl_kernel.py +0 -31
  177. sknetwork/utils/base.py +0 -35
  178. sknetwork/utils/minheap.cp39-win_amd64.pyd +0 -0
  179. sknetwork/utils/simplex.py +0 -140
  180. sknetwork/utils/tests/test_base.py +0 -28
  181. sknetwork/utils/tests/test_bunch.py +0 -16
  182. sknetwork/utils/tests/test_projection_simplex.py +0 -33
  183. sknetwork/utils/tests/test_verbose.py +0 -15
  184. sknetwork/utils/verbose.py +0 -37
  185. {scikit_network-0.30.0.dist-info → scikit_network-0.32.1.dist-info}/LICENSE +0 -0
  186. {scikit_network-0.30.0.dist-info → scikit_network-0.32.1.dist-info}/top_level.txt +0 -0
  187. /sknetwork/{utils → data}/timeout.py +0 -0
@@ -1,7 +1,5 @@
1
1
  # distutils: language = c++
2
2
  # cython: language_level=3
3
- # cython: linetrace=True
4
- # distutils: define_macros=CYTHON_TRACE_NOGIL=1
5
3
  """
6
4
  Created on July 1, 2020
7
5
  @author: Pierre Pebereau <pierre.pebereau@telecom-paris.fr>
@@ -1,37 +1,7 @@
1
1
  """utils module"""
2
+ from sknetwork.data import Bunch
2
3
  from sknetwork.utils.check import is_symmetric
3
4
  from sknetwork.utils.format import *
4
5
  from sknetwork.utils.membership import get_membership, from_membership
5
6
  from sknetwork.utils.neighbors import get_neighbors, get_degrees, get_weights
6
- from sknetwork.utils.simplex import projection_simplex, projection_simplex_array, projection_simplex_csr
7
7
  from sknetwork.utils.tfidf import get_tfidf
8
-
9
-
10
- class Bunch(dict):
11
- """Container object for datasets.
12
- Dictionary-like object that exposes its keys as attributes.
13
-
14
- This code is taken from scikit-learn.
15
- >>> bunch = Bunch(a=1, b=2)
16
- >>> bunch['a']
17
- 1
18
- >>> bunch.a
19
- 1
20
- >>> bunch.b = 3
21
- >>> bunch['b']
22
- 3
23
- >>> bunch.c = 4
24
- >>> bunch['c']
25
- 4
26
- """
27
- def __init__(self, **kwargs):
28
- super().__init__(kwargs)
29
-
30
- def __setattr__(self, key, value):
31
- self[key] = value
32
-
33
- def __getattr__(self, key):
34
- try:
35
- return self[key]
36
- except KeyError:
37
- raise AttributeError(key)
sknetwork/utils/check.py CHANGED
@@ -121,7 +121,7 @@ def make_weights(distribution: str, adjacency: sparse.csr_matrix) -> np.ndarray:
121
121
 
122
122
 
123
123
  def check_format(input_matrix: Union[sparse.csr_matrix, sparse.csc_matrix, sparse.coo_matrix, sparse.lil_matrix,
124
- np.ndarray]) -> sparse.csr_matrix:
124
+ np.ndarray], allow_empty: bool = False) -> sparse.csr_matrix:
125
125
  """Check whether the matrix is a NumPy array or a Scipy sparse matrix and return
126
126
  the corresponding Scipy CSR matrix.
127
127
  """
@@ -129,7 +129,7 @@ def check_format(input_matrix: Union[sparse.csr_matrix, sparse.csc_matrix, spars
129
129
  if type(input_matrix) not in formats:
130
130
  raise TypeError('The input matrix must be in Scipy sparse format or Numpy ndarray format.')
131
131
  input_matrix = sparse.csr_matrix(input_matrix)
132
- if input_matrix.nnz == 0:
132
+ if not allow_empty and input_matrix.nnz == 0:
133
133
  raise ValueError('The input matrix is empty.')
134
134
  return input_matrix
135
135
 
sknetwork/utils/format.py CHANGED
@@ -30,7 +30,7 @@ def directed2undirected(adjacency: Union[sparse.csr_matrix, SparseLR],
30
30
 
31
31
  or
32
32
 
33
- :math:`\\max(A,A^T)`
33
+ :math:`\\max(A,A^T) > 0` (binary)
34
34
 
35
35
  If the initial adjacency matrix :math:`A` is binary, bidirectional edges have weight 2
36
36
  (first method, default) or 1 (second method).
@@ -134,7 +134,7 @@ def bipartite2undirected(biadjacency: Union[sparse.csr_matrix, SparseLR]) -> Uni
134
134
 
135
135
 
136
136
  def get_adjacency(input_matrix: Union[sparse.csr_matrix, np.ndarray], allow_directed: bool = True,
137
- force_bipartite: bool = False, force_directed: bool = False)\
137
+ force_bipartite: bool = False, force_directed: bool = False, allow_empty: bool = False)\
138
138
  -> Tuple[sparse.csr_matrix, bool]:
139
139
  """Check the input matrix and return a proper adjacency matrix.
140
140
  Parameters
@@ -150,8 +150,10 @@ def get_adjacency(input_matrix: Union[sparse.csr_matrix, np.ndarray], allow_dire
150
150
  force_directed :
151
151
  If ``True`` return :math:`A = \\begin{bmatrix} 0 & B \\\\ 0 & 0 \\end{bmatrix}`.
152
152
  Otherwise (default), return :math:`A = \\begin{bmatrix} 0 & B \\\\ B^T & 0 \\end{bmatrix}`.
153
+ allow_empty :
154
+ If ``True``, allow the input matrix to be empty.
153
155
  """
154
- input_matrix = check_format(input_matrix)
156
+ input_matrix = check_format(input_matrix, allow_empty=allow_empty)
155
157
  bipartite = False
156
158
  if force_bipartite or not is_square(input_matrix) or not (allow_directed or is_symmetric(input_matrix)):
157
159
  bipartite = True
@@ -20,9 +20,9 @@ def get_membership(labels: np.ndarray, dtype=bool, n_labels: Optional[int] = Non
20
20
  Parameters
21
21
  ----------
22
22
  labels :
23
- Label of each node.
23
+ Label of each node (integers).
24
24
  dtype :
25
- Type of the entries. Boolean by default.
25
+ Type of the output. Boolean by default.
26
26
  n_labels : int
27
27
  Number of labels.
28
28
 
@@ -4,7 +4,7 @@
4
4
  import unittest
5
5
 
6
6
  from sknetwork.data import cyclic_digraph
7
- from sknetwork.data.test_graphs import test_graph_disconnect
7
+ from sknetwork.data.test_graphs import test_disconnected_graph
8
8
  from sknetwork.utils.check import *
9
9
  from sknetwork.utils.format import check_csr_or_slr
10
10
 
@@ -26,7 +26,7 @@ class TestChecks(unittest.TestCase):
26
26
 
27
27
  def test_check_connected(self):
28
28
  with self.assertRaises(ValueError):
29
- check_connected(test_graph_disconnect())
29
+ check_connected(test_disconnected_graph())
30
30
 
31
31
  def test_check_symmetry(self):
32
32
  with self.assertRaises(ValueError):
@@ -153,7 +153,7 @@ class TestChecks(unittest.TestCase):
153
153
  adjacency = cyclic_digraph(3)
154
154
  with self.assertRaises(ValueError):
155
155
  check_scaling(-1, adjacency, regularize=True)
156
- adjacency = test_graph_disconnect()
156
+ adjacency = test_disconnected_graph()
157
157
  with self.assertRaises(ValueError):
158
158
  check_scaling(-1, adjacency, regularize=False)
159
159
 
@@ -58,4 +58,6 @@ class TestFormats(unittest.TestCase):
58
58
 
59
59
  def test_check(self):
60
60
  with self.assertRaises(ValueError):
61
- check_format(sparse.csr_matrix((3, 4)))
61
+ check_format(sparse.csr_matrix((3, 4)), allow_empty=False)
62
+ adjacency = check_format(np.array([[0, 2], [2, 3]]))
63
+ self.assertTrue(adjacency.shape == (2, 2))
sknetwork/utils/values.py CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env python3
2
2
  # -*- coding: utf-8 -*-
3
3
  """
4
- Created on Apr, 2019
4
+ Created in April 2019
5
5
  @author: Nathan de Lara <nathan.delara@polytechnique.org>
6
6
  """
7
7
  import warnings
@@ -1,4 +1,4 @@
1
1
  """Visualization module."""
2
2
 
3
- from sknetwork.visualization.dendrograms import svg_dendrogram
4
- from sknetwork.visualization.graphs import svg_graph, svg_bigraph
3
+ from sknetwork.visualization.dendrograms import visualize_dendrogram, svg_dendrogram
4
+ from sknetwork.visualization.graphs import visualize_graph, visualize_bigraph, svg_graph, svg_bigraph
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env python3
2
2
  # -*- coding: utf-8 -*-
3
3
  """
4
- Created on April 2020
4
+ Created in April 2020
5
5
  @author: Thomas Bonald <bonald@enst.fr>
6
6
  """
7
7
  from typing import Iterable, Optional
@@ -158,12 +158,12 @@ def svg_dendrogram_left(dendrogram, names, width, height, margin, margin_text, s
158
158
  return svg
159
159
 
160
160
 
161
- def svg_dendrogram(dendrogram: np.ndarray, names: Optional[np.ndarray] = None, rotate: bool = False, width: float = 400,
162
- height: float = 300, margin: float = 10, margin_text: float = 5, scale: float = 1,
163
- line_width: float = 2, n_clusters: int = 2, color: str = 'black', colors: Optional[Iterable] = None,
164
- font_size: int = 12, reorder: bool = False, rotate_names: bool = True,
165
- filename: Optional[str] = None):
166
- """Return SVG image of a dendrogram.
161
+ def visualize_dendrogram(dendrogram: np.ndarray, names: Optional[np.ndarray] = None, rotate: bool = False,
162
+ width: float = 400, height: float = 300, margin: float = 10, margin_text: float = 5,
163
+ scale: float = 1, line_width: float = 2, n_clusters: int = 2, color: str = 'black',
164
+ colors: Optional[Iterable] = None, font_size: int = 12, reorder: bool = False,
165
+ rotate_names: bool = True, filename: Optional[str] = None):
166
+ """Return the image of a dendrogram in SVG format.
167
167
 
168
168
  Parameters
169
169
  ----------
@@ -227,3 +227,51 @@ def svg_dendrogram(dendrogram: np.ndarray, names: Optional[np.ndarray] = None, r
227
227
  f.write(svg)
228
228
 
229
229
  return svg
230
+
231
+
232
+ def svg_dendrogram(dendrogram: np.ndarray, names: Optional[np.ndarray] = None, rotate: bool = False, width: float = 400,
233
+ height: float = 300, margin: float = 10, margin_text: float = 5, scale: float = 1,
234
+ line_width: float = 2, n_clusters: int = 2, color: str = 'black', colors: Optional[Iterable] = None,
235
+ font_size: int = 12, reorder: bool = False, rotate_names: bool = True,
236
+ filename: Optional[str] = None):
237
+ """Return the image of a dendrogram in SVG format.
238
+
239
+ Alias for visualize_dendrogram.
240
+
241
+ Parameters
242
+ ----------
243
+ dendrogram :
244
+ Dendrogram to display.
245
+ names :
246
+ Names of leaves.
247
+ rotate :
248
+ If ``True``, rotate the tree so that the root is on the left.
249
+ width :
250
+ Width of the image (margins excluded).
251
+ height :
252
+ Height of the image (margins excluded).
253
+ margin :
254
+ Margin.
255
+ margin_text :
256
+ Margin between leaves and their names, if any.
257
+ scale :
258
+ Scaling factor.
259
+ line_width :
260
+ Line width.
261
+ n_clusters :
262
+ Number of coloured clusters to display.
263
+ color :
264
+ Default SVG color for the dendrogram.
265
+ colors :
266
+ SVG colors of the clusters of the dendrogram (optional).
267
+ font_size :
268
+ Font size.
269
+ reorder :
270
+ If ``True``, reorder leaves so that left subtree has more leaves than right subtree.
271
+ rotate_names :
272
+ If ``True``, rotate names of leaves (only valid if **rotate** is ``False``).
273
+ filename :
274
+ Filename for saving image (optional).
275
+ """
276
+ return visualize_dendrogram(dendrogram, names, rotate, width, height, margin, margin_text, scale, line_width,
277
+ n_clusters, color, colors, font_size, reorder, rotate_names, filename)