4 个版本

0.3.1 2024年2月22日
0.3.0 2023年11月17日
0.2.1 2023年8月21日
0.2.0 2023年7月31日

#319 in 算法

Download history 179/week @ 2024-04-13 3/week @ 2024-04-20 382/week @ 2024-04-27 28/week @ 2024-05-04 165/week @ 2024-05-11 448/week @ 2024-05-18 235/week @ 2024-05-25 669/week @ 2024-06-01 562/week @ 2024-06-08 603/week @ 2024-06-15 932/week @ 2024-06-22 211/week @ 2024-06-29 928/week @ 2024-07-06 515/week @ 2024-07-13 524/week @ 2024-07-20 729/week @ 2024-07-27

2,696 每月下载量
tket2 中使用

MIT 许可证

170KB
4K SLoC

portmatching

build_status msrv

端口图上的快速模式匹配。

这个crate旨在快速找到端口图的嵌入,适用于许多模式。模式被预处理以加快匹配速度,并编译成类似于用于字符串匹配和正则表达式的有限自动机的图 trie 数据结构。

该crate导出几个 Matcher 实例,可用于模式匹配。此crate中感兴趣的主要对象是 ManyMatcher 对象。其他 Matcher 作用为基准测试的基线。 SinglePatternMatcher 在时间 O(nm) (输入大小乘以模式大小)内匹配单个模式。 NaiveManyMatcher 使用 kSinglePatternMatcher 实例在时间 O(kmn) 内找到 k 个模式中的匹配项。

基准测试

对于所有基准测试,输入和模式都是具有量子电路结构结构的随机图。输入有最多 2000 个节点(门)和 400 个量子位,模式有最多 30 个节点和 2 到 5 个量子位。对于加权图上的模式匹配,每个节点 n 的权重在集合 {(d, 0), (d, 1), (d, 2)} 中随机选择,其中 d 是节点 n 的度(基数)。

注意:加权模式匹配比无加权模式匹配更容易,尤其是在权重固定节点阶数的情况下。从某种意义上说,无加权模式匹配对应于最坏情况。可以对自动机进行优化以显著加快无加权匹配,但这并不是重点。

与基线[无加权]的比较

0 ... 1000个模式的模式匹配时间,NaiveManyMatcher 与基于自动机的 ManyMatcher 对比。该图衡量匹配时间(毫秒)作为模式数量的函数。

comparison with baseline

加权模式匹配缩放(在线)[加权]

只有 ManyMatcher 的匹配时间(毫秒)作为模式数量的函数,最多10k个模式。模式根据量子比特的数量进行分类。

pattern matching as a fn of patterns

自动机构造时间(离线)[无加权]

除了上面绘制的运行时间外,还有一次性的成本来从模式集中构建自动机。这里再次作为模式数量的函数绘制。

trie construction times

示例

use portgraph::{PortGraph, PortMut};
use portmatching::*;

let (mut g1, mut g2) = (PortGraph::new(), PortGraph::new());
g1.add_node(0, 0);
g2.add_node(1, 1);
let (p1, p2) = (UnweightedPattern::from_portgraph(&g1), UnweightedPattern::from_portgraph(&g2));
let trie = ManyMatcher::from_patterns(vec![p1, p2]);
trie.find_matches(&g1);

功能

  • serde:通过 serde 启用序列化和反序列化。
  • datagen:对于 data_generation 二进制文件是必要的,用于基准测试。目前对 crate 的最终用户没有用处。

许可证

根据 MIT 许可证分发。有关更多信息,请参阅 LICENSE

依赖项

~4–5.5MB
~103K SLoC