scikit-network 0.33.3__cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.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 (229) hide show
  1. scikit_network-0.33.3.dist-info/METADATA +122 -0
  2. scikit_network-0.33.3.dist-info/RECORD +229 -0
  3. scikit_network-0.33.3.dist-info/WHEEL +6 -0
  4. scikit_network-0.33.3.dist-info/licenses/AUTHORS.rst +43 -0
  5. scikit_network-0.33.3.dist-info/licenses/LICENSE +34 -0
  6. scikit_network-0.33.3.dist-info/top_level.txt +1 -0
  7. scikit_network.libs/libgomp-d22c30c5.so.1.0.0 +0 -0
  8. sknetwork/__init__.py +21 -0
  9. sknetwork/base.py +67 -0
  10. sknetwork/classification/__init__.py +8 -0
  11. sknetwork/classification/base.py +142 -0
  12. sknetwork/classification/base_rank.py +133 -0
  13. sknetwork/classification/diffusion.py +134 -0
  14. sknetwork/classification/knn.py +139 -0
  15. sknetwork/classification/metrics.py +205 -0
  16. sknetwork/classification/pagerank.py +66 -0
  17. sknetwork/classification/propagation.py +152 -0
  18. sknetwork/classification/tests/__init__.py +1 -0
  19. sknetwork/classification/tests/test_API.py +30 -0
  20. sknetwork/classification/tests/test_diffusion.py +77 -0
  21. sknetwork/classification/tests/test_knn.py +23 -0
  22. sknetwork/classification/tests/test_metrics.py +53 -0
  23. sknetwork/classification/tests/test_pagerank.py +20 -0
  24. sknetwork/classification/tests/test_propagation.py +24 -0
  25. sknetwork/classification/vote.cpp +27587 -0
  26. sknetwork/classification/vote.cpython-39-aarch64-linux-gnu.so +0 -0
  27. sknetwork/classification/vote.pyx +56 -0
  28. sknetwork/clustering/__init__.py +8 -0
  29. sknetwork/clustering/base.py +172 -0
  30. sknetwork/clustering/kcenters.py +253 -0
  31. sknetwork/clustering/leiden.py +242 -0
  32. sknetwork/clustering/leiden_core.cpp +31578 -0
  33. sknetwork/clustering/leiden_core.cpython-39-aarch64-linux-gnu.so +0 -0
  34. sknetwork/clustering/leiden_core.pyx +124 -0
  35. sknetwork/clustering/louvain.py +286 -0
  36. sknetwork/clustering/louvain_core.cpp +31223 -0
  37. sknetwork/clustering/louvain_core.cpython-39-aarch64-linux-gnu.so +0 -0
  38. sknetwork/clustering/louvain_core.pyx +124 -0
  39. sknetwork/clustering/metrics.py +91 -0
  40. sknetwork/clustering/postprocess.py +66 -0
  41. sknetwork/clustering/propagation_clustering.py +104 -0
  42. sknetwork/clustering/tests/__init__.py +1 -0
  43. sknetwork/clustering/tests/test_API.py +38 -0
  44. sknetwork/clustering/tests/test_kcenters.py +60 -0
  45. sknetwork/clustering/tests/test_leiden.py +34 -0
  46. sknetwork/clustering/tests/test_louvain.py +135 -0
  47. sknetwork/clustering/tests/test_metrics.py +50 -0
  48. sknetwork/clustering/tests/test_postprocess.py +39 -0
  49. sknetwork/data/__init__.py +6 -0
  50. sknetwork/data/base.py +33 -0
  51. sknetwork/data/load.py +406 -0
  52. sknetwork/data/models.py +459 -0
  53. sknetwork/data/parse.py +644 -0
  54. sknetwork/data/test_graphs.py +84 -0
  55. sknetwork/data/tests/__init__.py +1 -0
  56. sknetwork/data/tests/test_API.py +30 -0
  57. sknetwork/data/tests/test_base.py +14 -0
  58. sknetwork/data/tests/test_load.py +95 -0
  59. sknetwork/data/tests/test_models.py +52 -0
  60. sknetwork/data/tests/test_parse.py +250 -0
  61. sknetwork/data/tests/test_test_graphs.py +29 -0
  62. sknetwork/data/tests/test_toy_graphs.py +68 -0
  63. sknetwork/data/timeout.py +38 -0
  64. sknetwork/data/toy_graphs.py +611 -0
  65. sknetwork/embedding/__init__.py +8 -0
  66. sknetwork/embedding/base.py +94 -0
  67. sknetwork/embedding/force_atlas.py +198 -0
  68. sknetwork/embedding/louvain_embedding.py +148 -0
  69. sknetwork/embedding/random_projection.py +135 -0
  70. sknetwork/embedding/spectral.py +141 -0
  71. sknetwork/embedding/spring.py +198 -0
  72. sknetwork/embedding/svd.py +359 -0
  73. sknetwork/embedding/tests/__init__.py +1 -0
  74. sknetwork/embedding/tests/test_API.py +49 -0
  75. sknetwork/embedding/tests/test_force_atlas.py +35 -0
  76. sknetwork/embedding/tests/test_louvain_embedding.py +33 -0
  77. sknetwork/embedding/tests/test_random_projection.py +28 -0
  78. sknetwork/embedding/tests/test_spectral.py +81 -0
  79. sknetwork/embedding/tests/test_spring.py +50 -0
  80. sknetwork/embedding/tests/test_svd.py +43 -0
  81. sknetwork/gnn/__init__.py +10 -0
  82. sknetwork/gnn/activation.py +117 -0
  83. sknetwork/gnn/base.py +181 -0
  84. sknetwork/gnn/base_activation.py +90 -0
  85. sknetwork/gnn/base_layer.py +109 -0
  86. sknetwork/gnn/gnn_classifier.py +305 -0
  87. sknetwork/gnn/layer.py +153 -0
  88. sknetwork/gnn/loss.py +180 -0
  89. sknetwork/gnn/neighbor_sampler.py +65 -0
  90. sknetwork/gnn/optimizer.py +164 -0
  91. sknetwork/gnn/tests/__init__.py +1 -0
  92. sknetwork/gnn/tests/test_activation.py +56 -0
  93. sknetwork/gnn/tests/test_base.py +75 -0
  94. sknetwork/gnn/tests/test_base_layer.py +37 -0
  95. sknetwork/gnn/tests/test_gnn_classifier.py +130 -0
  96. sknetwork/gnn/tests/test_layers.py +80 -0
  97. sknetwork/gnn/tests/test_loss.py +33 -0
  98. sknetwork/gnn/tests/test_neigh_sampler.py +23 -0
  99. sknetwork/gnn/tests/test_optimizer.py +43 -0
  100. sknetwork/gnn/tests/test_utils.py +41 -0
  101. sknetwork/gnn/utils.py +127 -0
  102. sknetwork/hierarchy/__init__.py +6 -0
  103. sknetwork/hierarchy/base.py +96 -0
  104. sknetwork/hierarchy/louvain_hierarchy.py +272 -0
  105. sknetwork/hierarchy/metrics.py +234 -0
  106. sknetwork/hierarchy/paris.cpp +37889 -0
  107. sknetwork/hierarchy/paris.cpython-39-aarch64-linux-gnu.so +0 -0
  108. sknetwork/hierarchy/paris.pyx +316 -0
  109. sknetwork/hierarchy/postprocess.py +350 -0
  110. sknetwork/hierarchy/tests/__init__.py +1 -0
  111. sknetwork/hierarchy/tests/test_API.py +24 -0
  112. sknetwork/hierarchy/tests/test_algos.py +34 -0
  113. sknetwork/hierarchy/tests/test_metrics.py +62 -0
  114. sknetwork/hierarchy/tests/test_postprocess.py +57 -0
  115. sknetwork/linalg/__init__.py +9 -0
  116. sknetwork/linalg/basics.py +37 -0
  117. sknetwork/linalg/diteration.cpp +27403 -0
  118. sknetwork/linalg/diteration.cpython-39-aarch64-linux-gnu.so +0 -0
  119. sknetwork/linalg/diteration.pyx +47 -0
  120. sknetwork/linalg/eig_solver.py +93 -0
  121. sknetwork/linalg/laplacian.py +15 -0
  122. sknetwork/linalg/normalizer.py +86 -0
  123. sknetwork/linalg/operators.py +225 -0
  124. sknetwork/linalg/polynome.py +76 -0
  125. sknetwork/linalg/ppr_solver.py +170 -0
  126. sknetwork/linalg/push.cpp +31093 -0
  127. sknetwork/linalg/push.cpython-39-aarch64-linux-gnu.so +0 -0
  128. sknetwork/linalg/push.pyx +71 -0
  129. sknetwork/linalg/sparse_lowrank.py +142 -0
  130. sknetwork/linalg/svd_solver.py +91 -0
  131. sknetwork/linalg/tests/__init__.py +1 -0
  132. sknetwork/linalg/tests/test_eig.py +44 -0
  133. sknetwork/linalg/tests/test_laplacian.py +18 -0
  134. sknetwork/linalg/tests/test_normalization.py +34 -0
  135. sknetwork/linalg/tests/test_operators.py +66 -0
  136. sknetwork/linalg/tests/test_polynome.py +38 -0
  137. sknetwork/linalg/tests/test_ppr.py +50 -0
  138. sknetwork/linalg/tests/test_sparse_lowrank.py +61 -0
  139. sknetwork/linalg/tests/test_svd.py +38 -0
  140. sknetwork/linkpred/__init__.py +2 -0
  141. sknetwork/linkpred/base.py +46 -0
  142. sknetwork/linkpred/nn.py +126 -0
  143. sknetwork/linkpred/tests/__init__.py +1 -0
  144. sknetwork/linkpred/tests/test_nn.py +27 -0
  145. sknetwork/log.py +19 -0
  146. sknetwork/path/__init__.py +5 -0
  147. sknetwork/path/dag.py +54 -0
  148. sknetwork/path/distances.py +98 -0
  149. sknetwork/path/search.py +31 -0
  150. sknetwork/path/shortest_path.py +61 -0
  151. sknetwork/path/tests/__init__.py +1 -0
  152. sknetwork/path/tests/test_dag.py +37 -0
  153. sknetwork/path/tests/test_distances.py +62 -0
  154. sknetwork/path/tests/test_search.py +40 -0
  155. sknetwork/path/tests/test_shortest_path.py +40 -0
  156. sknetwork/ranking/__init__.py +8 -0
  157. sknetwork/ranking/base.py +61 -0
  158. sknetwork/ranking/betweenness.cpp +9710 -0
  159. sknetwork/ranking/betweenness.cpython-39-aarch64-linux-gnu.so +0 -0
  160. sknetwork/ranking/betweenness.pyx +97 -0
  161. sknetwork/ranking/closeness.py +92 -0
  162. sknetwork/ranking/hits.py +94 -0
  163. sknetwork/ranking/katz.py +83 -0
  164. sknetwork/ranking/pagerank.py +110 -0
  165. sknetwork/ranking/postprocess.py +37 -0
  166. sknetwork/ranking/tests/__init__.py +1 -0
  167. sknetwork/ranking/tests/test_API.py +32 -0
  168. sknetwork/ranking/tests/test_betweenness.py +38 -0
  169. sknetwork/ranking/tests/test_closeness.py +30 -0
  170. sknetwork/ranking/tests/test_hits.py +20 -0
  171. sknetwork/ranking/tests/test_pagerank.py +62 -0
  172. sknetwork/ranking/tests/test_postprocess.py +26 -0
  173. sknetwork/regression/__init__.py +4 -0
  174. sknetwork/regression/base.py +61 -0
  175. sknetwork/regression/diffusion.py +210 -0
  176. sknetwork/regression/tests/__init__.py +1 -0
  177. sknetwork/regression/tests/test_API.py +32 -0
  178. sknetwork/regression/tests/test_diffusion.py +56 -0
  179. sknetwork/sknetwork.py +3 -0
  180. sknetwork/test_base.py +35 -0
  181. sknetwork/test_log.py +15 -0
  182. sknetwork/topology/__init__.py +8 -0
  183. sknetwork/topology/cliques.cpp +32586 -0
  184. sknetwork/topology/cliques.cpython-39-aarch64-linux-gnu.so +0 -0
  185. sknetwork/topology/cliques.pyx +149 -0
  186. sknetwork/topology/core.cpp +30672 -0
  187. sknetwork/topology/core.cpython-39-aarch64-linux-gnu.so +0 -0
  188. sknetwork/topology/core.pyx +90 -0
  189. sknetwork/topology/cycles.py +243 -0
  190. sknetwork/topology/minheap.cpp +27335 -0
  191. sknetwork/topology/minheap.cpython-39-aarch64-linux-gnu.so +0 -0
  192. sknetwork/topology/minheap.pxd +20 -0
  193. sknetwork/topology/minheap.pyx +109 -0
  194. sknetwork/topology/structure.py +194 -0
  195. sknetwork/topology/tests/__init__.py +1 -0
  196. sknetwork/topology/tests/test_cliques.py +28 -0
  197. sknetwork/topology/tests/test_core.py +19 -0
  198. sknetwork/topology/tests/test_cycles.py +65 -0
  199. sknetwork/topology/tests/test_structure.py +85 -0
  200. sknetwork/topology/tests/test_triangles.py +38 -0
  201. sknetwork/topology/tests/test_wl.py +72 -0
  202. sknetwork/topology/triangles.cpp +8897 -0
  203. sknetwork/topology/triangles.cpython-39-aarch64-linux-gnu.so +0 -0
  204. sknetwork/topology/triangles.pyx +151 -0
  205. sknetwork/topology/weisfeiler_lehman.py +133 -0
  206. sknetwork/topology/weisfeiler_lehman_core.cpp +27638 -0
  207. sknetwork/topology/weisfeiler_lehman_core.cpython-39-aarch64-linux-gnu.so +0 -0
  208. sknetwork/topology/weisfeiler_lehman_core.pyx +114 -0
  209. sknetwork/utils/__init__.py +7 -0
  210. sknetwork/utils/check.py +355 -0
  211. sknetwork/utils/format.py +221 -0
  212. sknetwork/utils/membership.py +82 -0
  213. sknetwork/utils/neighbors.py +115 -0
  214. sknetwork/utils/tests/__init__.py +1 -0
  215. sknetwork/utils/tests/test_check.py +190 -0
  216. sknetwork/utils/tests/test_format.py +63 -0
  217. sknetwork/utils/tests/test_membership.py +24 -0
  218. sknetwork/utils/tests/test_neighbors.py +41 -0
  219. sknetwork/utils/tests/test_tfidf.py +18 -0
  220. sknetwork/utils/tests/test_values.py +66 -0
  221. sknetwork/utils/tfidf.py +37 -0
  222. sknetwork/utils/values.py +76 -0
  223. sknetwork/visualization/__init__.py +4 -0
  224. sknetwork/visualization/colors.py +34 -0
  225. sknetwork/visualization/dendrograms.py +277 -0
  226. sknetwork/visualization/graphs.py +1039 -0
  227. sknetwork/visualization/tests/__init__.py +1 -0
  228. sknetwork/visualization/tests/test_dendrograms.py +53 -0
  229. sknetwork/visualization/tests/test_graphs.py +176 -0
@@ -0,0 +1,170 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ Created on Apr 2020
5
+ @author: Nathan de Lara <nathan.delara@polytechnique.org>
6
+ """
7
+ from typing import Union
8
+
9
+ import numpy as np
10
+ from scipy import sparse
11
+ from scipy.sparse.linalg import eigs, LinearOperator, bicgstab
12
+
13
+ from sknetwork.linalg.diteration import diffusion
14
+ from sknetwork.linalg.push import push_pagerank
15
+ from sknetwork.linalg.normalizer import normalize
16
+ from sknetwork.linalg.polynome import Polynome
17
+
18
+
19
+ class RandomSurferOperator(LinearOperator):
20
+ """Random surfer as a LinearOperator
21
+
22
+ Parameters
23
+ ----------
24
+ adjacency :
25
+ Adjacency matrix of the graph as a CSR or a LinearOperator.
26
+ damping_factor : float
27
+ Probability to continue the random walk.
28
+ seeds :
29
+ Probability vector for seeds.
30
+
31
+ Attributes
32
+ ----------
33
+ a : sparse.csr_matrix
34
+ Scaled transposed transition matrix.
35
+ b : np.ndarray
36
+ Scaled restart probability vector.
37
+ """
38
+
39
+ def __init__(self, adjacency: Union[sparse.csr_matrix, LinearOperator], seeds: np.ndarray, damping_factor):
40
+ super(RandomSurferOperator, self).__init__(shape=adjacency.shape, dtype=float)
41
+
42
+ n = adjacency.shape[0]
43
+ out_degrees = adjacency.dot(np.ones(n)).astype(bool)
44
+
45
+ if hasattr(adjacency, 'left_sparse_dot'):
46
+ self.a = damping_factor * normalize(adjacency).T
47
+ else:
48
+ self.a = (damping_factor * normalize(adjacency)).T.tocsr()
49
+ self.b = (np.ones(n) - damping_factor * out_degrees) * seeds
50
+
51
+ def _matvec(self, x: np.ndarray):
52
+ return self.a.dot(x) + self.b * x.sum()
53
+
54
+
55
+ def get_pagerank(adjacency: Union[sparse.csr_matrix, LinearOperator], seeds: np.ndarray, damping_factor: float,
56
+ n_iter: int, tol: float = 1e-6, solver: str = 'piteration') -> np.ndarray:
57
+ """Solve the Pagerank problem. Formally,
58
+
59
+ :math:`x = \\alpha Px + (1-\\alpha)y`,
60
+
61
+ where :math:`P = (D^{-1}A)^T` is the transition matrix and :math:`y` is the personalization probability vector.
62
+
63
+ Parameters
64
+ ----------
65
+ adjacency : sparse.csr_matrix
66
+ Adjacency matrix of the graph.
67
+ seeds : np.ndarray
68
+ Personalization array. Must be a valid probability vector.
69
+ damping_factor : float
70
+ Probability to continue the random walk.
71
+ n_iter : int
72
+ Number of iterations for some of the solvers such as ``'piteration'`` or ``'diteration'``.
73
+ tol : float
74
+ Tolerance for the convergence of some solvers such as ``'bicgstab'`` or ``'lanczos'`` or ``'push'``.
75
+ solver : :obj:`str`
76
+ Which solver to use: ``'piteration'``, ``'diteration'``, ``'bicgstab'``, ``'lanczos'``, ``̀'RH'``, ``'push'``.
77
+
78
+ Returns
79
+ -------
80
+ pagerank : np.ndarray
81
+ Probability vector.
82
+
83
+ Examples
84
+ --------
85
+ >>> from sknetwork.data import house
86
+ >>> adjacency = house()
87
+ >>> seeds = np.array([1, 0, 0, 0, 0])
88
+ >>> scores = get_pagerank(adjacency, seeds, damping_factor=0.85, n_iter=10)
89
+ >>> np.round(scores, 2)
90
+ array([0.29, 0.24, 0.12, 0.12, 0.24])
91
+
92
+
93
+ References
94
+ ----------
95
+ * Hong, D. (2012). `Optimized on-line computation of pagerank algorithm.
96
+ <https://arxiv.org/pdf/1202.6158.pdf>`_
97
+ arXiv preprint arXiv:1202.6158.
98
+ * Van der Vorst, H. A. (1992). `Bi-CGSTAB:
99
+ <https://en.wikipedia.org/wiki/Biconjugate_gradient_stabilized_method>`_
100
+ A fast and smoothly converging variant of Bi-CG for the solution of nonsymmetric linear systems.
101
+ SIAM Journal on scientific and Statistical Computing, 13(2), 631-644.
102
+ * Lanczos, C. (1950).
103
+ `An iteration method for the solution of the eigenvalue problem of linear differential and integral operators.
104
+ <http://www.cs.umd.edu/~oleary/lanczos1950.pdf>`_
105
+ Los Angeles, CA: United States Governm. Press Office.
106
+ * Whang, J. , Lenharth, A. , Dhillon, I. , & Pingali, K. . (2015).
107
+ `Scalable Data-Driven PageRank: Algorithms, System Issues, and Lessons Learned`. 9233, 438-450.
108
+ <https://www.cs.utexas.edu/users/inderjit/public_papers/scalable_pagerank_europar15.pdf>
109
+ """
110
+ n = adjacency.shape[0]
111
+
112
+ if solver == 'diteration':
113
+ if not isinstance(adjacency, sparse.csr_matrix):
114
+ raise ValueError('D-iteration is not compatible with linear operators.')
115
+ adjacency = normalize(adjacency, p=1)
116
+ indptr = adjacency.indptr.astype(np.int32)
117
+ indices = adjacency.indices.astype(np.int32)
118
+ data = adjacency.data.astype(np.float32)
119
+ damping_factor = np.float32(damping_factor)
120
+ n_iter = np.int32(n_iter)
121
+ tol = np.float32(tol)
122
+
123
+ scores = np.zeros(n, dtype=np.float32)
124
+ fluid = (1 - damping_factor) * seeds.astype(np.float32)
125
+ diffusion(indptr, indices, data, scores, fluid, damping_factor, n_iter, tol)
126
+
127
+ elif solver == 'push':
128
+ n = adjacency.shape[0]
129
+ damping_factor = np.float32(damping_factor)
130
+ tol = np.float32(tol)
131
+ degrees = adjacency.dot(np.ones(n)).astype(np.int32)
132
+ rev_adjacency = adjacency.transpose().tocsr()
133
+
134
+ indptr = adjacency.indptr.astype(np.int32)
135
+ indices = adjacency.indices.astype(np.int32)
136
+ rev_indptr = rev_adjacency.indptr.astype(np.int32)
137
+ rev_indices = rev_adjacency.indices.astype(np.int32)
138
+
139
+ scores = push_pagerank(n, degrees, indptr, indices,
140
+ rev_indptr, rev_indices,
141
+ seeds.astype(np.float32),
142
+ damping_factor, tol)
143
+
144
+ elif solver == 'RH':
145
+ coeffs = np.ones(n_iter + 1)
146
+ polynome = Polynome(damping_factor * normalize(adjacency, p=1).T.tocsr(), coeffs)
147
+ scores = polynome.dot(seeds)
148
+
149
+ else:
150
+ rso = RandomSurferOperator(adjacency, seeds, damping_factor)
151
+ v0 = rso.b
152
+ if solver == 'bicgstab':
153
+ scores, info = bicgstab(sparse.eye(n, format='csr') - rso.a, rso.b, atol=tol, x0=v0)
154
+ elif solver == 'lanczos':
155
+ # noinspection PyTypeChecker
156
+ _, scores = sparse.linalg.eigs(rso, k=1, tol=tol, v0=v0)
157
+ scores = abs(scores.flatten().real)
158
+ elif solver == 'piteration':
159
+ scores = v0
160
+ for i in range(n_iter):
161
+ scores_ = rso.dot(scores)
162
+ scores_ /= scores_.sum()
163
+ if np.linalg.norm(scores - scores_, ord=1) < tol:
164
+ break
165
+ else:
166
+ scores = scores_
167
+ else:
168
+ raise ValueError('Unknown solver.')
169
+
170
+ return scores / scores.sum()