高性能图算法库。
项目描述
graph_mate
为graph
crates集提供Python绑定。
graph_mate
是一个Python API,提供了一组高性能图算法。它提供了有向和无向图的实现。
图可以通过编程创建或从Graph500
输入格式读取。
该库用Rust实现,并使用rayon在并行运行图创建和算法执行时,不持有全局解释器锁或使用多进程。
图本身实现为压缩稀疏行(CSR)数据结构,适用于快速和并发访问图拓扑。
graph_mate
提供了一些图算法。算法实现旨在在大规模图(具有数十亿个节点和边)上高效运行。
注意:开发主要由Neo4j开发者驱动。然而,该库不是Neo4j的官方产品。
用法
安装
graph_mate
可在PyPI上找到
pip install graph-mate
当前版本适用于Windows、Mac/Linux上的x86_64架构,并对苹果硅Mac进行通用适配。
如果您需要为不同的架构或系统使用graph_mate
,请参考手动安装。
用法
什么是图?
图由节点和边组成,其中边恰好连接两个节点。图可以是有向的,即边具有源节点和目标节点,也可以是无向的,没有这种区别。
在有向图中,每个节点u
都有出度和入度邻居。节点u
的出度邻居是任何存在边(u, v)
的节点v
。节点u
的入度邻居是任何存在边(v, u)
的节点v
。
在无向图中,没有源节点和目标节点的区别。节点u
的邻居是任何存在边(u, v)
或(v, u)
的节点v
。
如何创建图
目前有两种构建图的方法。您可以从Graph500
格式中load
图,例如从LDBC Graphalytics网站下载。或者,您可以使用from_numpy
提供numpy边列表。
import graph_mate as gm
import numpy as np
# Let's load a small graph:
# (a)-->(b)-->(c)-->(d), (a)-->(c), (b)-->(d)
# To load from an edge list, we need to create a 2d numpy array of `uint32`s.
edge_list = np.array([
# (a)-->(b)
[0, 1],
# (a)-->(c)
[0, 2],
# (b)-->(c)
[1, 2],
# (b)-->(d)
[1, 3],
# (c)-->(d)
[2, 3]
], dtype=np.uint32)
要构建有向图,您可以使用graph_mate.DiGraph
和一个无向图graph_mate.Graph
。
# We can load a directed graph from the edge list
directed = gm.DiGraph.from_numpy(edge_list)
# Or we can load an undirected graph
undirected = gm.Graph.from_numpy(edge_list)
为了使断言更容易,我们可以通过提供一个可选的第二个参数graph_mate.Layout
来创建具有排序邻接表的图。
directed = gm.DiGraph.from_numpy(edge_list, gm.Layout.Sorted)
undirected = gm.Graph.from_numpy(edge_list, gm.Layout.Sorted)
从numpy边列表加载时,数据不会共享,而是复制到图中。numpy数组之后可以删除。
我们可以使用一些方法来检查图。
assert directed.node_count() == 4
assert directed.edge_count() == 5
assert directed.out_degree(1) == 2
assert directed.in_degree(1) == 1
assert np.array_equal(directed.out_neighbors(1), [2, 3])
assert np.array_equal(directed.in_neighbors(1), [0])
邻居以numpy数组视图的形式返回,这意味着我们无法修改该数组。
neighbors = directed.out_neighbors(1)
try:
neighbors[0] = 42
except ValueError as e:
assert str(e) == "assignment destination is read-only"
为了将邻居用作Python列表而不是numpy数组,我们可以使用copy_
方法。
neighbors = directed.copy_out_neighbors(1)
assert neighbors == [2, 3]
assert type(neighbors) == list
对于无向图,我们没有针对度或邻居的方向方法。
assert undirected.node_count() == 4
assert undirected.edge_count() == 5
assert undirected.degree(1) == 3
assert np.array_equal(undirected.neighbors(1), [0, 2, 3])
如何运行算法
以下我们将演示运行PageRank,一种基于节点进入边数量和质量确定图节点重要性的图算法。PageRank需要一个有向图,并为每个节点返回排名值。
# https://en.wikipedia.org/wiki/PageRank#/media/File:PageRanks-Example.svg
graph = gm.DiGraph.from_numpy(np.array([
(1,2), # B->C
(2,1), # C->B
(4,0), # D->A
(4,1), # D->B
(5,4), # E->D
(5,1), # E->B
(5,6), # E->F
(6,1), # F->B
(6,5), # F->E
(7,1), # G->B
(7,5), # F->E
(8,1), # G->B
(8,5), # G->E
(9,1), # H->B
(9,5), # H->E
(10,1), # I->B
(10,5), # I->E
(11,5), # J->B
(12,5), # K->B
], dtype=np.uint32))
pr_result = graph.page_rank(max_iterations=10, tolerance=1e-4, damping_factor=0.85)
assert pr_result.ran_iterations == 10
expected = np.array([
0.024064068,
0.3145448,
0.27890152,
0.01153846,
0.029471997,
0.06329483,
0.029471997,
0.01153846,
0.01153846,
0.01153846,
0.01153846,
0.01153846,
0.01153846,
], dtype=np.float32)
assert np.array_equal(pr_result.scores(), expected)
示例笔记本
有关更多示例和演示,请参阅notebooks
目录中的笔记本。
开发
一次性设置
# Run the command from the extension directory, not the git root
# cd crates/mate
python -m venv .env
source .env/bin/activate
pip install -r requirements/dev.txt
每次新终端设置
确保在每个您希望进行开发的新的终端中激活venv。
source .env/bin/activate
构建扩展
以调试模式构建。
maturin develop
以发布模式构建。
maturin develop --release
在最后文件更改后2秒内重新构建扩展(可选步骤)。
cargo watch --shell 'maturin develop --release' --delay 2
测试
运行测试
pytest tests
格式化和代码审查
# Runs code formatter https://pypi.ac.cn/project/black/
black tests
# Sort imports using https://pypi.ac.cn/project/isort/
isort tests
# Verify with https://pypi.ac.cn/project/flake8/
flake8 tests
# Very types using http://mypy-lang.org
mypy .
许可证:MIT
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪一个,请了解更多关于安装软件包的信息。
源分布
构建版本
graph_mate-0.1.1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e7ad8c16d5b5eaa00dc3aabdaa130ab00deffe85393a442ac42d6a61ec902290 |
|
MD5 | 20a648d718d53bda9dbc0fa6b8330d71 |
|
BLAKE2b-256 | 75915a95c795b81422ef8d9831db9069a52ab93e0175731fbbe1588b510e3012 |
graph_mate-0.1.1-cp38-abi3-win_amd64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e0d4a684d91e8518dc746b8f4a60c86b91e3e13bfd8dca6945ad2952a75334db |
|
MD5 | 6fb31a6f68bed4f2960517167e16ad66 |
|
BLAKE2b-256 | 396d4dab1aca22eadcf64acf659ad993671b4a9e2bc44174ebae5eb2e96f33a6 |
graph_mate-0.1.1-cp38-abi3-win32.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | bb89d656b871979da47289ffb6c9f57d6d4c3dc1445b8bbe21db1de078a699ce |
|
MD5 | ba4d00e39ca57f3b60bf52a739ed953b |
|
BLAKE2b-256 | a8a89950175a97bdca3c59dd0bc42db646011a63ab0c608eacd7b4322f6080f5 |
graph_mate-0.1.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b0f6e4d094c5bb867ae3e247d6487409438456d03ba0cf385cacebc571fb7c7a |
|
MD5 | 98d8aa9633a30483eba2ad5705a6e6c8 |
|
BLAKE2b-256 | 30eb1458458a34a5b7edf6299ba75aacc24876cfc71d21ba949bcdb9b2208463 |
哈希值 for graph_mate-0.1.1-cp38-abi3-manylinux_2_12_i686.manylinux2010_i686.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 2048743560f5bf92110758ce84851bd0d32eaf56091639c09d42d341973dc440 |
|
MD5 | 8e0970052cf7182d20538e9345562bd6 |
|
BLAKE2b-256 | 4aca65faba79e82575f71a72a9cf6221060ce8938bfa457fd19ca7b7ff256fb4 |
哈希值 for graph_mate-0.1.1-cp38-abi3-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | fe773052487e0de3c06fe49be5368051dc55004be72901d250e21bf05a18ca45 |
|
MD5 | d6525c12337a714df6e5c111efce9ce5 |
|
BLAKE2b-256 | 25d441ae8b2b7b16c98884931257b9f0fc60d63bfb326f4f78caeb4113dfd621 |
哈希值 for graph_mate-0.1.1-cp38-abi3-macosx_10_7_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 0392e41da8f03ebb86cdcbe8a49ee3f29060982a54b5f0ef988c602ad0894f56 |
|
MD5 | 83e7bdb34bbdb76d62e2003b320b5ae0 |
|
BLAKE2b-256 | 488d4ddcd47f5bf11627bd733b984a7de9a3e02e54aa29abea00980ec51c8f52 |