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
|
@@ -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
|
|
Binary file
|