# 资源估计(Toffoli+Clifford+T+QRAM)
English · **简体中文**
> 模块 [`oracq.infrastructure.estimate`](../api/infrastructure/estimate.rst) 与 [`oracq.infrastructure.backends.strict`](../api/infrastructure/backends/strict.rst)
## 概述
资源估计回答「这个程序在容错级别要花多少」:把 RIR 程序沿
OriginIR-ext → basis 的真实降低链路计数到 **Toffoli + Clifford + T + QRAM**
级别,输出量子位数、Toffoli 数、Clifford 原子数、精确 T 数、待合成旋转
原子数(及其 Ross–Selinger 型 T 开销估计)和 **QRAM 查询数**。估计器是
组合式的:按 `(module, 控制数)` 记忆化聚合,{obj}`Repeat ` 以符号计数相乘——
`2^40` 次重复的程序不需要展开即可估计,这正是 RIR「结构保持」设计直接
买来的能力。
同一降低链路上的 {obj}`export_strict(program) ` 给出**可检查的编译产物**:模块
保持的严格网表(TOFFOLI/CZ/H/S/SDG/T/TDG/X/Y/Z 原子 + `RZ`/`RY` 待合成
旋转 + QRAM 行),`DEF` 调用、`Repeat` 符号与 QRAM 声明都不展开。
## 接口
开放程序使用 {obj}`estimate_resources(program, require_closed=False) `。报告把已知
线路成本和 `oracle_calls` 分开列出;每项记录槽名、控制数、伴随标记、资源实参
及调用次数。绑定后重新估计即可得到具体实现成本。`complete=False` 表示仍有
未实现依赖,已知门数不等于全程序总成本。
开放程序的 `qubits=None`;`qubits_lower_bound` 是已知寄存器和私有工作区
下界,`unknown_workspace` 列出未实现模块。MCX 辅助位也只覆盖已知实现。
完整程序保持原有整数位数结果。QRAM 读写按入口逻辑资源分账,沿调用边替换
形参,不把不同 bank 合并到内部同名参数。同一分析也有命令行入口,
见[开放与闭合资源分析](cli.md#开放与闭合资源分析)。
`rotations` 现在是紧凑的 {obj}`RotationCounts `:`rotations.total` 给出任意大小的
总数,`rotations.counts` 按 `(轴, 角度)` 保存重数。保留只读的 `len`、索引和
惰性迭代,小型程序可继续按序列读取;它不是可修改列表,也不是执行顺序。
巨大 Repeat 的计数和 JSON 报告不会展开旋转列表。
`epsilon` 表示每个旋转的合成配置,不是整个科学计算算法的总误差保证。
资源报告不为 QRAM 硬件、数据装载或物理纠错成本补上默认零值。
```python
from oracq import estimate_resources, export_strict
estimate = estimate_resources(program) # 或 operation.estimate()
estimate.qubits # 入口寄存器 + 模块工作区(不含 MCX 池位)
estimate.mcx_ancilla # basis 池位(max(0, 最大控制数-1))
estimate.toffoli # Toffoli 总数
estimate.clifford # H/S/SDG/X/Y/Z/CZ 原子总数
estimate.t_exact # 精确 T/TDG 数(π/4 网格上的旋转)
estimate.rotations # 待合成旋转原子 [(axis, angle), ...]
estimate.t_total(1e-10) # 精确 T + 旋转 × ceil(3·log2(1/eps))
estimate.qram_queries # 逐资源查询数;estimate.qram_total 为总和
estimate.to_dict() # JSON 友好台账
```
计数模型与导出器逐行对齐(这不是理想化成本模型,而是**实际发射电路**
的账本):X 型多控走 `basis.mcx` 配方(c≥3 时 2c−3 Toffoli);受控单比特
门走 `basis.controlled_u3` 配方(c≥2 时 2(c−1) Toffoli 梯子加中间网络);
零值控制位在每个发射行组两侧各翻转一次;每次 {obj}`Load ` 记 1 次 QRAM 查询。
角度恰为 π/4 整数倍的旋转按精确 Clifford+T 计入(S/T/Z 系列),其余记为
待合成旋转。全局相位不计(与 strict 导出一致)。
## 适用边界与已知差距
- 估计器按**当前编译器的发射配方**计数:常量加法走 O(n³) 阶梯(文献有
O(n) 可逆加法器)、{obj}`gate_database `/{obj}`qrom_lookup ` 走逐分支真值表网络
(理想化 unary-iteration QROM 为 N−1 Toffoli,见
{obj}`qrom_cost ` 模型与 babbush2018encoding)。真实发射与理想化模型之间的
差距是编译器 lowering 的优化空间,估计器把它变成可测量的量。
- 旋转的 T 开销是前导项估计(≈3·log2(1/ε),Ross–Selinger 型),不含
具体合成器实现;物理层成本(T 工厂、蒸馏、布线、表面码周期)不在
本层范围内。
- QRAM 查询数把 QRAM 当作第一类资源:它回答「算法向内存系统发起多少次
查询」,与「若用门合成同一表需要多少 Toffoli」互为对照(见下表)。
## 数值验证
实验设计(`tests/core/test_estimate.py` 手算计数与 strict 网表逐行对拍;
`tools/build_resource_estimates.py` 十组缩放实验,产物
`out/resource-estimates/*.json`,已注册进 `tools/check_project.py`):
- 手算计数:阶梯加法、受控门配方、零值控制翻转、符号 Repeat(2^40)
相乘、QRAM 逐资源查询,15 例全过;`estimate_resources` 与
`export_strict` 的逐原子计数在平铺程序上逐项一致。
- 缩放实验(log-log 拟合斜率 vs 理论预期):
| 组 | 规模 | 关键读数 | 拟合/预期 |
|---|---|---|---|
| `add_const` | n=4..64 | n=64 时 Toffoli 81 375 | 阶梯 ≈3.5(立方区);文献最优 O(n) |
| `fixed_mul` | n=4..32 | Toffoli 112→6 356 | 1.94 vs O(n²) |
| {obj}`qft ` | n=3..12 | 旋转 3→165,精确 T 6→33 | ≈2.85(π/4 网格精确旋转在小 n 处掉出) |
| `qpe_add_const` | p=3..12 | p=12 时门数 ~5.5万 | 符号 Repeat:~2^p × cost(add) |
| {obj}`grover ` | n=4..14 | 迭代 ⌊π/4·2^{n/2}⌋ | 总门数 ~2^{n/2}·O(n) |
| `state_prep_dense` | n=2..10 | 旋转 17→5 114 | O(2^n) |
| `qram_lookup` | n=4..16 | **查询 = 1**,门 = 0 | 与规模无关 |
| `qrom_lookup_gate` | n=4..12 | n=12 时 Toffoli 344 064 | 真实发射 vs `qrom_cost` 理想模型 4 095(≈84×) |
| `diagonal_be_qram` | n=2..12 | **查询 = 2**,旋转 = 2 | 常数 |
| `diagonal_be_gate` | n=2..8 | n=8 时 Toffoli 11 388 | 同一输入模型的门级对照 |
| {obj}`roe_face ` / `math_polynomial` | w=6..16 | Roe 面 w=16 时 Toffoli 446 076 | ≈1.8,字长多项式 |
- 暴露的文档级差距:`qrom_lookup` 的 `qrom_unary_iteration` 成本属性
描述的是理想化模型,而当前发射为真值表网络——已记录为 lowering
优化项(与 OAA、Schrödingerization 两处记录并列,属验证驱动的发现)。
复现:`PYTHONPATH=src python tools/build_resource_estimates.py`;
`python -m unittest tests.core.test_estimate -v`。