---
title: "保存与复用收缩序"
description: "保存网络、收缩序和切片信息，在数组值变化时重复执行；无切片时也可先编译，减少每次执行的准备工作。"
eyebrow: "应用教程"
---

请先完成[快速开始中的张量网络输入](/docs/quick-start#network)，准备示例使用的网络结构、维度和数值数组。

## 跨进程保存与加载 {#save-load}

沿用[快速开始](/docs/quick-start#network)中的网络和数组，或提供自己的输入。另一个进程可以加载已保存的收缩序和切片信息；数值数组仍需另外创建或加载。

```python
from arctn import ArcTNExecutionPlan, arctn_plan

plan = arctn_plan(
    inputs, output, size_dict,
    preset="heavy", seed=0,
    target_size=2**24, slicing_mode="fixed",
)
plan.save("plan.json")

loaded = ArcTNExecutionPlan.load("plan.json")
loaded.validate(inputs, output, size_dict, arrays=arrays)
result = loaded.execute(arrays, backend="native")
```

`ArcTNExecutionPlan` 保存规范化网络、SSA 收缩序和切片 index 集合，不保存数值数组。`load()` 与 `execute()` 都不会重新进行收缩序优化，加载后会按保存的收缩序和切片信息执行。

## 同一进程内编译并重复执行 {#compile}

```python
unsliced = arctn_plan(
    inputs, output, size_dict, preset="heavy", seed=0
)
compiled = unsliced.compile(backend="native")
arrays_1 = arrays
arrays_2 = [array * 2 for array in arrays]
result_1 = compiled.execute(arrays_1)
result_2 = compiled.execute(arrays_2)
print(compiled.stats())
```

- 每次 `arrays` 的数量和 shape 必须与编译时的网络一致；同一次执行的全部数组必须使用同一种受支持 dtype。编译时不固定 dtype。
- `ArcTNExecutionPlan` 可保存为文件，不绑定执行后端；`ArcTNCompiledContraction` 绑定执行后端，只在当前进程中使用。
- 切片集合非空时不能调用 `plan.compile()`；可使用 `plan.execute()`，或调用 `plan.to_tree()` 交给 Cotengra 执行。

## 参数变化时复用收缩序 {#variational-reuse}

在 VQE、QAOA 或量子机器学习的参数迭代中，门的数值通常会变化，而电路连接结构可以保持不变。对固定的电路结构和可观测量，可先构建一次期望值网络，使用 `arctn_plan` 优化收缩序，再按新的参数更新门张量与对应的共轭张量。

无切片时，调用一次 `plan.compile()`，每组参数只需调用 `compiled.execute(arrays)`。已保存切片时，使用 `plan.execute(arrays)`，沿已有收缩序执行全部切片，不重新寻路；但每次仍需准备执行所用的信息，不能使用当前的无切片编译接口。

复用要求张量顺序、每个张量各轴的 index 对应关系、维度和输出顺序一致，不只是量子比特数或数组 shape 一样。若前端化简、可观测量或电路结构的变化改变了这些信息，需要为新的网络重新优化收缩序。多个可观测量可分别保存各自网络的收缩序。

数值执行的结果还需由应用按算符系数求和，形成能量或模型输出；参数更新和训练循环不由保存的收缩序执行。Quimb 调用方式见 [VQE 与 QAOA 示例](/docs/tutorial-quimb#variational)。

## 复用的适用条件 {#amortization}

先进行一次收缩序优化和编译，再用同一编译对象执行 $N$ 次。若收缩序优化耗时为 $P$、编译耗时为 $K$、单次执行耗时为 $E$，总耗时近似为

$$
T(N)\approx P+K+NE.
$$

反复调用 `arctn_contract` 会重复进行收缩序优化；复用已有收缩序可以省去这部分工作。无切片时，复用编译对象还能省去重复编译的开销。

这条关系只说明时间组成。跨库速度仍取决于相同网络、dtype、backend、线程设置和同步边界下的实测。
