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.

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.cp310-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.cp310-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.cp310-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.cp310-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.cp310-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.cp310-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.cp310-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.cp310-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.cp310-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.cp310-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.cp310-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.cp310-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.cp310-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.cp310-win_amd64.pyd +0 -0
  170. sknetwork/topology/kcliques.pyx +0 -193
  171. sknetwork/topology/kcore.cp310-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.cp310-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
@@ -0,0 +1,149 @@
1
+ # distutils: language = c++
2
+ # cython: language_level=3
3
+ """
4
+ Created in June 2020
5
+ @author: Julien Simonnet <julien.simonnet@etu.upmc.fr>
6
+ @author: Yohann Robert <yohann.robert@etu.upmc.fr>
7
+ """
8
+ from libcpp.vector cimport vector
9
+ import numpy as np
10
+ cimport numpy as np
11
+ from scipy import sparse
12
+
13
+ cimport cython
14
+
15
+ from sknetwork.path.dag import get_dag
16
+ from sknetwork.topology.core import get_core_decomposition
17
+
18
+
19
+ @cython.boundscheck(False)
20
+ @cython.wraparound(False)
21
+ cdef class ListingBox:
22
+ cdef int[:] ns
23
+ cdef np.ndarray degrees
24
+ cdef np.ndarray subs
25
+ cdef short[:] lab
26
+
27
+ def __cinit__(self, vector[int] indptr, int k):
28
+ cdef int n = indptr.size() - 1
29
+ cdef int i
30
+ cdef int max_deg = 0
31
+
32
+ cdef np.ndarray[int, ndim=1] ns = np.empty((k+1,), dtype=np.int32)
33
+ ns[k] = n
34
+ self.ns = ns
35
+
36
+ cdef np.ndarray[short, ndim=1] lab = np.full((n,), k, dtype=np.int16)
37
+ self.lab = lab
38
+
39
+ cdef np.ndarray[int, ndim=1] deg = np.zeros(n, dtype=np.int32)
40
+ cdef np.ndarray[int, ndim=1] sub = np.zeros(n, dtype=np.int32)
41
+
42
+ for i in range(n):
43
+ deg[i] = indptr[i+1] - indptr[i]
44
+ max_deg = max(deg[i], max_deg)
45
+ sub[i] = i
46
+
47
+ self.degrees = np.empty((k+1,), dtype=object)
48
+ self.subs = np.empty((k+1,), dtype=object)
49
+
50
+ self.degrees[k] = deg
51
+ self.subs[k] = sub
52
+
53
+ for i in range(2, k):
54
+ deg = np.zeros(n, dtype=np.int32)
55
+ sub = np.zeros(max_deg, dtype=np.int32)
56
+ self.degrees[i] = deg
57
+ self.subs[i] = sub
58
+
59
+
60
+ @cython.boundscheck(False)
61
+ @cython.wraparound(False)
62
+ cdef long count_cliques_from_dag(vector[int] indptr, vector[int] indices, int clique_size, ListingBox box):
63
+ cdef int n = indptr.size() - 1
64
+ cdef long n_cliques = 0
65
+ cdef int i, j, k, k_max
66
+ cdef int u, v, w
67
+
68
+ if clique_size == 2:
69
+ degree_ = box.degrees[2]
70
+ sub_ = box.subs[2]
71
+ for i in range(box.ns[2]):
72
+ j = sub_[i]
73
+ n_cliques += degree_[j]
74
+ return n_cliques
75
+
76
+ sub_ = box.subs[clique_size]
77
+ sub_prev = box.subs[clique_size - 1]
78
+ degree_ = box.degrees[clique_size]
79
+ deg_prev = box.degrees[clique_size - 1]
80
+ for i in range(box.ns[clique_size]):
81
+ u = sub_[i]
82
+ box.ns[clique_size - 1] = 0
83
+ for j in range(indptr[u], indptr[u] + degree_[u]):
84
+ v = indices[j]
85
+ if box.lab[v] == clique_size:
86
+ box.lab[v] = clique_size - 1
87
+ sub_prev[box.ns[clique_size - 1]] = v
88
+ box.ns[clique_size - 1] += 1
89
+ deg_prev[v] = 0
90
+ for j in range(box.ns[clique_size - 1]):
91
+ v = sub_prev[j]
92
+ k = indptr[v]
93
+ k_max = indptr[v] + degree_[v]
94
+ while k < k_max:
95
+ w = indices[k]
96
+ if box.lab[w] == clique_size - 1:
97
+ deg_prev[v] += 1
98
+ else:
99
+ k_max -= 1
100
+ indices[k] = indices[k_max]
101
+ k -= 1
102
+ indices[k_max] = w
103
+ k += 1
104
+ n_cliques += count_cliques_from_dag(indptr, indices, clique_size - 1, box)
105
+ for j in range(box.ns[clique_size - 1]):
106
+ v = sub_prev[j]
107
+ box.lab[v] = clique_size
108
+ return n_cliques
109
+
110
+
111
+ def count_cliques(adjacency: sparse.csr_matrix, clique_size: int = 3) -> int:
112
+ """Count the number of cliques of some size.
113
+
114
+ Parameters
115
+ ----------
116
+ adjacency :
117
+ Adjacency matrix of the graph.
118
+ clique_size : int
119
+ Clique size (default = 3, corresponding to triangles.
120
+
121
+ Returns
122
+ -------
123
+ n_cliques : int
124
+ Number of cliques.
125
+
126
+ Example
127
+ -------
128
+ >>> from sknetwork.data import karate_club
129
+ >>> adjacency = karate_club()
130
+ >>> count_cliques(adjacency, 3)
131
+ 45
132
+
133
+ References
134
+ ----------
135
+ Danisch, M., Balalau, O., & Sozio, M. (2018, April).
136
+ `Listing k-cliques in sparse real-world graphs.
137
+ <https://dl.acm.org/doi/pdf/10.1145/3178876.3186125>`_
138
+ In Proceedings of the 2018 World Wide Web Conference (pp. 589-598).
139
+ """
140
+ if clique_size < 2:
141
+ raise ValueError("The clique size must be at least 2.")
142
+
143
+ values = get_core_decomposition(adjacency)
144
+ dag = get_dag(adjacency, order=np.argsort(values))
145
+ indptr = dag.indptr
146
+ indices = dag.indices
147
+ box = ListingBox.__new__(ListingBox, indptr, clique_size)
148
+ n_cliques = count_cliques_from_dag(indptr, indices, clique_size, box)
149
+ return n_cliques