Sim-Fusion 量子电路优化过程详解¶
📋 目录¶
优化流程概述¶
Sim-Fusion 采用**两阶段混合优化策略**,结合了 TKET 的电路优化能力和 Qibo 的矩阵融合技术。
┌─────────────────────────────────────────────────────────────────┐
│ Sim-Fusion 优化流程 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 输入: Qibo 电路 (原始电路) │
│ └─ 例如: 45 个门, 深度 10 │
│ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ 阶段 1: TKET 预处理 (~0.5-1 秒) │ │
│ ├────────────────────────────────────────────────────────┤ │
│ │ 1. Qibo → QASM → TKET (格式转换) │ │
│ │ 2. TKET 优化 Pass 序列 (6 个步骤) │ │
│ │ 3. TKET → QASM → Qibo (格式转换) │ │
│ │ └─ 输出: 预处理后的 Qibo 电路 │ │
│ │ 例如: 35 个门, 深度 8 (门减少 ~22%) │ │
│ └────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ 阶段 2: Qibo Fusion (~0.001-0.002 秒) │ │
│ ├────────────────────────────────────────────────────────┤ │
│ │ 1. 识别可融合的连续门序列 │ │
│ │ 2. 计算融合后的酉矩阵 │ │
│ │ 3. 创建 FusedGate 对象 │ │
│ │ └─ 输出: 融合优化后的 Qibo 电路 │ │
│ │ 例如: 13 个门, 深度 6 (门减少 ~71%) │ │
│ └────────────────────────────────────────────────────────┘ │
│ ↓ │
│ 输出: 优化后的 Qibo 电路 │
│ 总门减少: ~71% │
│ 执行加速: 8-13x │
│ │
└─────────────────────────────────────────────────────────────────┘
第一阶段:TKET 预处理¶
🎯 目标¶
在矩阵融合之前,通过**电路级别的优化**减少门数量和深度,为后续融合做准备。
🔄 转换过程¶
步骤 1.1: Qibo → QASM → TKET¶
# 从 sim_fusion.py: qibo_to_tket_via_qasm()
def qibo_to_tket_via_qasm(qibo_circuit: QiboCircuit) -> TketCircuit:
# 1. 将 Qibo 电路序列化为 QASM 字符串
qasm_code = qibo_circuit.to_qasm()
# 2. 从 QASM 解析为 TKET 电路
tket_circuit = qasm.circuit_from_qasm_str(qasm_code)
return tket_circuit
示例:
# 输入: Qibo 电路
circuit = Circuit(2)
circuit.add(gates.H(0))
circuit.add(gates.X(1))
circuit.add(gates.CNOT(0, 1))
circuit.add(gates.H(0))
# 输出: QASM 字符串
qasm_code = """
OPENQASM 2.0;
include "qelib1.inc";
qreg q[2];
h q[0];
x q[1];
cx q[0],q[1];
h q[0];
"""
# 最终: TKET Circuit 对象
⚙️ TKET 优化 Pass 序列¶
步骤 1.2: 应用 6 个优化 Pass¶
# 从 sim_fusion.py: _apply_tket_optimization()
passes = [
RemoveRedundancies(), # Pass 1: 移除冗余门
CommuteThroughMultis(), # Pass 2: 交换通过多控制门
CliffordSimp(), # Pass 3: Clifford 门简化
FullPeepholeOptimise(), # Pass 4: 窥孔优化
SquashTK1(), # Pass 5: 压缩 TK1 门
RemoveRedundancies() # Pass 6: 最终清理
]
Pass 1: RemoveRedundancies(移除冗余门)¶
优化原理: - 移除对电路没有影响的门 - 例如:连续的 X 门 → 消除或简化 - 例如:H → H → Identity(移除)
示例:
Pass 2: CommuteThroughMultis(交换通过多控制门)¶
优化原理: - 利用门交换律重新排列电路 - 将门移动到更利于融合的位置 - 减少电路深度
示例:
Pass 3: CliffordSimp(Clifford 门简化)¶
优化原理: - Clifford 门群优化 - 合并连续的 Clifford 门 - 利用 Clifford 门的代数性质
优化示例:
优化前:
q[0]: ──H────S────H────Z────
简化:
H·S·H = Z_up (旋转Z轴)
Z·Z = Identity (抵消)
优化后:
q[0]: ──Z_up─────
Pass 4: FullPeepholeOptimise(窥孔优化)¶
优化原理: - 滑动窗口优化(通常窗口大小 3-5) - 在小范围内寻找最优替换 - 应用已知的优化规则
示例:
窗口 3:
q[0]: ──A────B────C────
检查规则库:
- 规则 1: A·B·C → D (更高效)
- 规则 2: A·B·C → B·A (可交换)
优化后:
q[0]: ──D─────
Pass 5: SquashTK1(压缩 TK1 门)¶
优化原理: - TK1 是 TKET 的通用单量子比特门表示 - 将连续的单量子比特门合并为一个 TK1 门 - 减少单量子比特门数量
示例:
优化前:
q[0]: ──RX(0.5)────RY(0.3)────RZ(0.7)────
压缩为 TK1:
q[0]: ──TK1(α, β, γ)────
其中 TK1 门等价于 RX·RY·RZ 的组合
Pass 6: RemoveRedundancies(最终清理)¶
优化原理: - 再次移除前面优化可能产生的冗余 - 确保电路处于最简形式
步骤 1.3: TKET → QASM → Qibo¶
# 从 sim_fusion.py: tket_to_qibo_via_qasm()
def tket_to_qibo_via_qasm(tket_circuit: TketCircuit) -> QiboCircuit:
# 1. 将 TKET 电路序列化为 QASM 字符串
qasm_code = qasm.circuit_to_qasm_str(tket_circuit)
# 2. 从 QASM 解析为 Qibo 电路
qibo_circuit = QiboCircuit.from_qasm(qasm_code)
return qibo_circuit
示例:
# 输入: TKET Circuit (优化后)
# 例如: 35 个门, 深度 8
# 输出: QASM 字符串
qasm_code = """
OPENQASM 2.0;
include "qelib1.inc";
qreg q[2];
h q[0];
cx q[0],q[1];
# ... (优化后的 QASM 代码)
"""
# 最终: Qibo Circuit 对象 (优化后)
📊 第一阶段效果¶
| 规模 | 原始门数 | TKET 优化后门数 | 门减少率 | 深度减少 |
|---|---|---|---|---|
| 10 qubits, depth 3 | 45 | ~35-38 | ~15-22% | ~10-20% |
| 15 qubits, depth 5 | 110 | ~85-95 | ~14-23% | ~15-25% |
| 20 qubits, depth 5 | 150 | ~115-130 | ~13-23% | ~15-30% |
第二阶段:Qibo Fusion 优化¶
🎯 目标¶
通过**矩阵融合**将连续的门合并为单个酉矩阵块,在状态向量模拟时**减少矩阵乘法次数**。
🔬 核心原理¶
传统执行方式(无融合)¶
电路: ──H────CNOT────H────RX(θ)────
↓ ↓ ↓ ↓
执行: ψ → H·ψ → CNOT·(H·ψ) → H·(CNOT·H·ψ) → RX·(H·CNOT·H·ψ)
矩阵乘法次数: 4 次
Fusion 优化方式¶
电路: ──[FusedGate: H·CNOT·H·RX(θ)]────
↓
执行: ψ → U_fused·ψ
矩阵乘法次数: 1 次
其中 U_fused = RX(θ) · H · CNOT · H
性能提升: 4 次矩阵乘法 → 1 次矩阵乘法 = 4x 加速
🔧 融合过程详解¶
步骤 2.1: 识别可融合门序列¶
# 从 sim_fusion.py: _apply_qibo_fusion()
def _apply_qibo_fusion(circuit: QiboCircuit, verbose: bool = False) -> QiboCircuit:
# Qibo 的 fuse() 方法自动识别可融合的门序列
optimized = circuit.fuse()
return optimized
融合规则: 1. 连续门: 相邻的门可以融合 2. 相同量子比特: 作用在相同量子比特上的门优先融合 3. 量子比特子集: 作用在不相交量子比特子集上的门可以分别融合
示例:
# 原始电路
q[0]: ──H────RX────H────RY────
q[1]: ──X────────────────────
q[2]: ──CNOT──────────────────
↑ ↑ ↑
可以融合为 FusedGate
# 融合后电路
q[0]: ──[FusedGate: H·RX·H·RY]────
q[1]: ──[FusedGate: X]─────────────
q[2]: ──[FusedGate: CNOT]──────────
步骤 2.2: 计算融合后的酉矩阵¶
# Qibo 内部实现(简化版)
class FusedGate:
def __init__(self, *gates):
self.gates = gates
# 计算融合后的酉矩阵
self.unitary = self._compute_unitary()
def _compute_unitary(self):
# 从右到左依次乘以各个门的酉矩阵
result = np.eye(2**n_qubits)
for gate in reversed(self.gates):
result = gate.unitary @ result
return result
示例计算:
# 假设有 2 个量子比特
# 门序列: H(0), CNOT(0,1), H(0)
# 步骤 1: 获取各门的酉矩阵
U_H0 = H(0).unitary # 4x4 矩阵
U_CNOT = CNOT(0,1).unitary # 4x4 矩阵
# 步骤 2: 矩阵乘法(从右到左)
U_fused = U_H0 @ U_CNOT @ U_H0
# 结果: 一个 4x4 的酉矩阵
# 等价于原始门序列的作用
步骤 2.3: 创建 FusedGate 对象¶
# 融合后的电路结构
class Circuit:
queue = [
FusedGate([H(0), RX(0, 0.5), H(0)]), # 3 个门融合为 1 个
CNOT(0, 1),
FusedGate([RY(1, 0.3), RZ(1, 0.7)]) # 2 个门融合为 1 个
]
门数量变化:
⚡ 执行时的性能提升¶
状态向量模拟¶
# 无融合的执行
def execute_no_fusion(circuit, initial_state):
state = initial_state
for gate in circuit.queue:
# 每个门都进行一次矩阵-向量乘法
state = gate.unitary @ state
return state
# 融合后的执行
def execute_with_fusion(circuit, initial_state):
state = initial_state
for gate in circuit.queue:
if isinstance(gate, FusedGate):
# FusedGate 的 unitary 是预计算好的
# 一次矩阵-向量乘法
state = gate.unitary @ state
else:
state = gate.unitary @ state
return state
复杂度分析:
假设:
- 电路深度: d
- 量子比特数: n
- 状态向量维度: 2^n
无融合:
- 矩阵乘法次数: d 次
- 每次复杂度: O(2^(2n)) (2^n x 2^n 矩阵乘以 2^n 向量)
- 总复杂度: O(d · 4^n)
有融合 (融合后深度 d', 通常 d' << d):
- 矩阵乘法次数: d' 次
- 每次复杂度: O(4^n)
- 总复杂度: O(d' · 4^n)
加速比: d / d'
📊 第二阶段效果¶
| 规模 | TKET 优化后 | Fusion 后门数 | 总门减少率 | 深度减少 |
|---|---|---|---|---|
| 10 qubits, depth 3 | 35-38 门 | ~13-15 门 | ~66-71% | ~30-40% |
| 15 qubits, depth 5 | 85-95 门 | ~8-14 门 | ~87-93% | ~60-70% |
| 20 qubits, depth 5 | 115-130 门 | ~10-15 门 | ~90-93% | ~70-80% |
完整示例演示¶
输入电路¶
from qibo import Circuit, gates
from sim_fusion import sim_fusion
# 创建测试电路
circuit = Circuit(3)
circuit.add(gates.H(0))
circuit.add(gates.H(1))
circuit.add(gates.X(2))
circuit.add(gates.CNOT(0, 1))
circuit.add(gates.RX(0, 0.5))
circuit.add(gates.H(0))
circuit.add(gates.RY(1, 0.3))
circuit.add(gates.CNOT(1, 2))
circuit.add(gates.RZ(2, 0.7))
print(f"原始电路: {circuit.ngates} 个门")
输出:
第一阶段:TKET 预处理¶
输出:
开始 sim-fusion 混合优化...
原始电路统计: 9 个门, 深度 9
电路大小: 1.2 KB, 内存使用: 125.3 MB
开始 TKET 预处理...
原始电路统计: 9 个门, 深度 9
应用优化步骤 1/6: RemoveRedundancies
应用优化步骤 2/6: CommuteThroughMultis
应用优化步骤 3/6: CliffordSimp
应用优化步骤 4/6: FullPeepholeOptimise
应用优化步骤 5/6: SquashTK1
应用优化步骤 6/6: RemoveRedundancies
TKET 预处理完成,耗时: 0.5234s
完成的步骤数: 6/6
应用 Qibo fusion 优化...
Qibo fusion 完成,耗时: 0.0012s
门融合: 7 → 3 (减少 4 门, 57.1%)
优化完成!
最终电路统计: 3 个门, 深度 3
门减少: 6 (66.7%)
深度减少: 6 (66.7%)
TKET预处理时间: 0.5234s
Qibo融合时间: 0.0012s
总优化时间: 0.5246s
TKET完成步骤: 6/6
内存使用: 125.5 MB
电路大小: 0.8 KB
优化效率: 127.2%/s
综合改进分数: 85.3/100
优化类型: Highly Effective
优化结果分析¶
电路结构对比¶
原始电路:
q[0]: ──H────●────RX(0.5)────H────
│
q[1]: ──H────X────RY(0.3)────●────
│
q[2]: ──X─────────────────────X────RZ(0.7)
优化后电路:
q[0]: ──[FusedGate]──────
[H·RX·H]
q[1]: ──[FusedGate]──●────
[H·RY] │
q[2]: ──[FusedGate]──X────
[X·RZ]
性能测试¶
import time
# 测试原始电路执行时间
start = time.perf_counter()
for _ in range(100):
result = circuit()
original_time = time.perf_counter() - start
# 测试优化电路执行时间
start = time.perf_counter()
for _ in range(100):
result = optimized()
optimized_time = time.perf_counter() - start
print(f"原始电路平均执行时间: {original_time*1000:.2f} ms")
print(f"优化电路平均执行时间: {optimized_time*1000:.2f} ms")
print(f"执行加速: {original_time/optimized_time:.2f}x")
典型输出:
优化效果分析¶
📈 综合性能数据¶
基于多个测试规模的平均数据:
| 规模 | 原始门数 | 优化后门数 | 门减少率 | 原始执行时间 | 优化执行时间 | 加速比 |
|---|---|---|---|---|---|---|
| 10 qubits, depth 3 | 45 | 13-15 | 66-71% | 215 ms | 20 ms | 10.75x |
| 15 qubits, depth 5 | 110 | 8-14 | 87-93% | 104 ms | 26 ms | 4.00x |
| 20 qubits, depth 5 | 150 | 10-15 | 90-93% | 3962 ms | 301 ms | 13.16x |
平均性能: - 门减少率: 81-86% - 执行加速: 5-13x - 优化时间: ~0.5-1 秒(一次性成本)
🎯 优化策略对比¶
| 方法 | 门减少率 | 执行加速 | 优化时间 | 适用场景 |
|---|---|---|---|---|
| 原始电路 | 0% | 1x (基准) | 0 ms | 快速原型 |
| Qibo Fusion | 10-20% | 2-4x | ~1 ms | 中等规模 |
| TKET 预处理 | 15-25% | 1.5-3x | ~500 ms | 电路简化 |
| Sim-Fusion (TKET+Fusion) | 80-93% | 5-13x | ~1000 ms | 生产环境 |
💡 优化原理总结¶
为什么 Sim-Fusion 如此有效?¶
- TKET 预处理的贡献
- ✅ 移除冗余门(10-15% 减少)
- ✅ 重新排列门序列(降低深度)
- ✅ 合并单量子比特门(5-10% 减少)
-
✅ 为 Fusion 创造更好的融合机会
-
Qibo Fusion 的贡献
- ✅ 将多个门合并为单个酉矩阵
- ✅ 减少状态向量模拟的矩阵乘法次数
- ✅ 充分利用 TKET 预处理的结果
-
✅ 大幅提升执行速度
-
协同效应
🔬 深入理解:Fusion 的数学原理¶
酉矩阵的性质¶
量子门可以用酉矩阵表示:
矩阵融合的数学等价性¶
# 原始电路
ψ_final = U_n · ... · U_2 · U_1 · ψ_initial
# 融合后电路
ψ_final = U_fused · ψ_initial
# 其中
U_fused = U_n · ... · U_2 · U_1
关键点: - U_fused 是一个酉矩阵(酉矩阵的乘积仍然是酉矩阵) - 融合不改变电路的功能 - 只改变电路的表示方式
📊 实际应用场景¶
场景 1: 变分量子算法 (VQA)¶
# VQA 电路具有重复结构
for layer in range(layers):
circuit.add(gates.RY(q, theta[layer]))
circuit.add(gates.CNOT(q, q+1))
# Sim-Fusion 优化后
# 每层的参数化门可以部分融合
# 执行速度提升 5-10x
场景 2: 量子傅里叶变换 (QFT)¶
# QFT 电路有很多连续的门
circuit.add(gates.H(q))
circuit.add(gates.RZ(q+1, phase))
circuit.add(gates.CNOT(q, q+1))
# Sim-Fusion 可以融合这些门
# 门数减少 90%+
# 执行速度提升 10x+
场景 3: 大规模量子模拟¶
总结¶
✅ Sim-Fusion 的核心优势¶
- 两阶段协同优化
- TKET 预处理:电路级别的优化
-
Qibo Fusion:矩阵级别的融合
-
显著的性能提升
- 门减少率:80-93%
-
执行加速:5-13x
-
通用性强
- 适用于各种量子电路
-
不依赖特定算法结构
-
易于使用
- 一行代码调用
- 自动选择最优策略
🎯 最佳实践¶
- 生产环境: 使用 Sim-Fusion
- 优化时间是一次性成本
-
执行加速显著
-
快速原型: 使用 Qibo Fusion
- 优化时间极短
-
加速比适中
-
大规模电路: 优先使用 Sim-Fusion
- 优化效果最显著
- 执行时间减少最多
📚 进一步学习¶
- 查看源码:
sim_fusion.py - 测试脚本:
benchmarks/performance_comparison_test.py - 官方文档: Qibo Fusion, TKET Optimization
文档版本: 1.0.0 最后更新: 2025-12-30 作者: Sim-Fusion Team