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 算法
2,696 每月下载量
在 tket2 中使用
170KB
4K SLoC
portmatching
端口图上的快速模式匹配。
这个crate旨在快速找到端口图的嵌入,适用于许多模式。模式被预处理以加快匹配速度,并编译成类似于用于字符串匹配和正则表达式的有限自动机的图 trie 数据结构。
该crate导出几个 Matcher
实例,可用于模式匹配。此crate中感兴趣的主要对象是 ManyMatcher
对象。其他 Matcher
作用为基准测试的基线。 SinglePatternMatcher
在时间 O(nm)
(输入大小乘以模式大小)内匹配单个模式。 NaiveManyMatcher
使用 k
个 SinglePatternMatcher
实例在时间 O(kmn)
内找到 k
个模式中的匹配项。
基准测试
对于所有基准测试,输入和模式都是具有量子电路结构结构的随机图。输入有最多 2000 个节点(门)和 400 个量子位,模式有最多 30 个节点和 2 到 5 个量子位。对于加权图上的模式匹配,每个节点 n
的权重在集合 {(d, 0), (d, 1), (d, 2)}
中随机选择,其中 d
是节点 n
的度(基数)。
注意:加权模式匹配比无加权模式匹配更容易,尤其是在权重固定节点阶数的情况下。从某种意义上说,无加权模式匹配对应于最坏情况。可以对自动机进行优化以显著加快无加权匹配,但这并不是重点。
与基线[无加权]的比较
0 ... 1000个模式的模式匹配时间,NaiveManyMatcher
与基于自动机的 ManyMatcher
对比。该图衡量匹配时间(毫秒)作为模式数量的函数。
加权模式匹配缩放(在线)[加权]
只有 ManyMatcher
的匹配时间(毫秒)作为模式数量的函数,最多10k个模式。模式根据量子比特的数量进行分类。
自动机构造时间(离线)[无加权]
除了上面绘制的运行时间外,还有一次性的成本来从模式集中构建自动机。这里再次作为模式数量的函数绘制。
示例
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