---
title: "ArcTN Rust原生张量网络收缩序优化"
description: "ArcTN 是用 Rust 编写的张量网络收缩库，提供收缩序优化、切片和数值执行，并通过 Python 接口接入 Quimb、opt_einsum 等工具。ArcTN 接收张量网络，不直接将量子线路任务转换为张量网络；量子线路对应的网络由 Quimb 等前端或用户自行构建。"
eyebrow: ""
---

## 许可证与使用范围 {#license}

ArcTN 公司有权授权的源码适用 [Arclight 非商业源码可用许可证 1.0](https://github.com/Quill-ArcLight/ArcTN/blob/HEAD/LICENSE)，禁止商用和闭源集成。这不是 OSI 认可的开源许可证；商业使用需另行取得授权。

- 第三方依赖保留各自许可；此前已按 MIT / Apache 授出的版本保留已授予的权利，见[第三方及历史授权说明](https://github.com/Quill-ArcLight/ArcTN/blob/HEAD/THIRD_PARTY_NOTICES.md)。
- Light / Heavy 动态库单独许可。公司代码的源码许可证不授权这些动态库的分发或使用；其对外分发条款尚未确定，首次源码发布及从该源码构建的 wheel 均不附带这些动态库。

完整许可说明见 [ArcTN 代码仓库的许可证章节](https://github.com/Quill-ArcLight/ArcTN#license)。商业授权及许可咨询：[quill@arclightquantum.com](mailto:quill@arclightquantum.com)。

## 张量网络与二叉收缩树 {#contraction-trees}

张量网络描述张量之间通过 index 连接的关系。采用两两收缩时，计算过程可以表示为一棵**二叉收缩树**：叶节点是输入张量，内部节点是一次收缩，根节点是最终结果。

同一个网络可以对应不同的收缩树。下面以四个矩阵的乘积 $ABCD$ 为例：两种顺序得到相同的 $2\times2$ 结果，但计算量不同。

```diagram
contraction-trees
图中统计普通矩阵乘法的标量乘法次数。
```

收缩树表示张量的组合方式，收缩路径列出具体的计算步骤。例如，第一棵树可以先算 $AB$，也可以先算 $CD$，最后合并两者。**收缩序优化**要做的，就是在不同收缩树之间搜索，根据计算量、读写量等目标选择代价更低的收缩序。Light / Heavy 采用启发式搜索，不保证全局最优。详见[张量网络与收缩树](/docs/tensor-network)。

## 收缩序优化与执行 {#position}

用 `inputs`、`output` 和 `size_dict` 描述张量网络，并指定优化目标（objective），即可进行收缩序优化。

当中间张量太大、占用内存过多时，可以设置 `target_size`，通过切片把一次大收缩拆成多次较小的收缩。`target_size` 限制每个切片内单个收缩结果的最大元素数：例如，100 万个 `float64` 元素的数据占用约 8 MB。它不限制程序的总内存，输入数组和计算时的临时空间仍需另计。

ArcTN 既可以只做规划，也可以完成数值计算：路径和切片方案可保存为 `ArcTNExecutionPlan`，作为规划与执行之间的中间表示（IR）；提供数组后，`arctn_contract` 可直接完成规划与执行。已有 Quimb 网络也可以通过 `ArcTNOptimizer` 使用 ArcTN 的规划结果。

量子线路应用推荐使用 [Quimb 前端](/docs/tutorial-quimb)：在 Quimb 中构建电路，计算振幅或期望值时传入 `optimize=ArcTNOptimizer(...)`，即可让 ArcTN 优化收缩序，无需手动整理 `inputs`、`output` 和 `size_dict`。Quimb 负责把任务转换为张量网络，并可在搜索前化简；数值收缩由 Quimb / Cotengra 完成。

### VQE、QAOA 与量子机器学习 {#variational}

在这类算法中，电路前端根据参数化电路构建振幅、概率或期望值对应的张量网络，ArcTN 为该网络优化收缩序，外层经典优化器根据计算结果更新电路参数。使用 Quimb 时，可通过 `optimize=ArcTNOptimizer(...)` 接入，数值收缩由 Quimb / Cotengra 完成；也可以把网络与数组直接交给 `arctn_contract` 执行。

参数更新后，如果张量顺序、index 对应关系、维度和输出顺序不变，可以复用已有收缩序。ArcTN 不是完整的量子机器学习训练框架，损失函数、参数梯度和训练循环由应用或所用框架处理。具体调用见 [VQE 与 QAOA 示例](/docs/tutorial-quimb#variational)，重复执行见[参数变化时复用收缩序](/docs/tutorial-reuse#variational-reuse)。

```diagram
ecosystem
```

## 从量子线路到收缩结果 {#first-example}

两个量子比特从 $|00\rangle$ 出发，依次施加 H、$R_y(\pi/3)$、CNOT 和 $R_y(\pi/4)$。我们计算最后测到 `11` 的概率：先求振幅 $A_{11}=\langle11|U|00\rangle$，再计算 $P(11)=|A_{11}|^2$。这里的基顺序为 $|q_0q_1\rangle$。

### 逐步查看收缩 {#contraction-example}

先把初态、量子门和末端的 $\langle1|$ 写成张量，再交给 ArcTN 搜索收缩路径。下图逐一对应电路中的门与张量；点击“下一步”，可查看已生成的收缩序和各步中间结果。

“运行 NumPy”可沿这条路径计算振幅与概率，并与 ArcTN 的结果、直接收缩和独立状态向量计算比较。

```diagram
contraction-demo
```

- [快速开始](/docs/quick-start) — 从一个更小的 Python 例子开始。

## 数值执行与第三方接入 {#usage}

### 直接执行收缩 {#direct-execution}

提供数值数组后，`arctn_contract` 可在一次调用中完成规划、可选切片和执行。默认使用 ArcTN 的原生 CPU 执行器，也可以指定外部数组后端。`return_info=True` 同时返回规划和执行报告。

- [数值执行](/docs/execution) — 数组类型、收缩步骤和返回信息。
- [切片示例](/docs/tutorial-slicing) — 设置 `target_size`，选择 Fixed 或 Dynamic 切片。

### 在 Quimb 中使用 {#quimb-integration}

向 Quimb 的 `optimize=` 传入 `ArcTNOptimizer`，即可使用 ArcTN 搜索路径。`ArcTNOptimizer.search()` 返回包含路径和切片 index 的 `ContractionTree`，后续数值收缩由 Quimb / Cotengra 执行。

- [Quimb 示例](/docs/tutorial-quimb)

### 保存与复用收缩序 {#reuse-plan}

同一网络结构和维度下，数组值变化时无需重新寻路。用 `arctn_plan` 得到收缩序和切片信息，保存后可用于后续收缩。

- [保存与复用收缩序](/docs/tutorial-reuse)

## 核心能力 {#capabilities}

| 能力 | 实现方式 | 相关说明 |
| --- | --- | --- |
| 路径生成 | 贪心、随机贪心、动态规划与递归超图二分 | [寻路算法](/docs/greedy-search) |
| 路径改进 | 子树重构、模拟退火、副本交换与固定叶序动态规划 | [退火与副本交换](/docs/tree-search)、[子树重构](/docs/reconfiguration) |
| 自动收缩序优化 | Light / Heavy 预设，安排路径生成与改进 | [方法组合调度](/docs/auto) |
| 切片 | Fixed 固定路径，Dynamic 允许局部调整路径 | [切片](/docs/slicing) |
| 数值执行 | 原生 CPU 执行器，或指定 opt_einsum 数组后端 | [执行后端](/docs/execution-backends) |
| 并行与分布式 | Rayon 单机并行，以及 `tnmpi` 分布式切片执行 | [并行设置](/docs/parallelism) |

## 功能范围 {#boundaries}

- 原生执行器使用 CPU；CuPy、PyTorch 和 JAX 数组由指定的外部后端执行。
- 切片不进行低秩截断。当前只对内部 index 切片，遍历全部取值并将结果相加；输出 index 保留，不参与切片。
- Light、Heavy 与多数局部搜索采用启发式算法，不保证全局最优。动态规划适合规模较小的子问题，其搜索范围见[动态规划](/docs/structured-search)。
- `max_time` 在算法检查点生效，不是强制进程超时。严格时间上限应由外部进程或作业调度器控制。

- [兼容性与限制](/docs/versioning)
- [测试集](/docs/benchmarks)
