跳转至

Sim-Fusion 量子电路优化过程详解

📋 目录

  1. 优化流程概述
  2. 第一阶段:TKET 预处理
  3. 第二阶段:Qibo Fusion 优化
  4. 完整示例演示
  5. 优化效果分析

优化流程概述

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(移除)

示例:

优化前:
q[0]: ──H────X────H────
优化后:
q[0]: ──H────X─────


Pass 2: CommuteThroughMultis(交换通过多控制门)

优化原理: - 利用门交换律重新排列电路 - 将门移动到更利于融合的位置 - 减少电路深度

示例:

优化前:
q[0]: ──●────H────
q[1]: ──X────●────

交换后:
q[0]: ──H────●────
q[1]: ──●────X────


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 个
    ]

门数量变化:

原始: 3 + 1 + 2 = 6 个门
融合: 1 + 1 + 1 = 3 个门
减少: 50%


⚡ 执行时的性能提升

状态向量模拟

# 无融合的执行
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} 个门")

输出:

原始电路: 9 个门


第一阶段:TKET 预处理

# 启用 verbose 模式查看详细过程
optimized, stats = sim_fusion(
    circuit,
    return_stats=True,
    verbose=True
)

输出:

开始 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")

典型输出:

原始电路平均执行时间: 45.23 ms
优化电路平均执行时间: 8.12 ms
执行加速: 5.57x


优化效果分析

📈 综合性能数据

基于多个测试规模的平均数据:

规模 原始门数 优化后门数 门减少率 原始执行时间 优化执行时间 加速比
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 如此有效?

  1. TKET 预处理的贡献
  2. ✅ 移除冗余门(10-15% 减少)
  3. ✅ 重新排列门序列(降低深度)
  4. ✅ 合并单量子比特门(5-10% 减少)
  5. ✅ 为 Fusion 创造更好的融合机会

  6. Qibo Fusion 的贡献

  7. ✅ 将多个门合并为单个酉矩阵
  8. ✅ 减少状态向量模拟的矩阵乘法次数
  9. ✅ 充分利用 TKET 预处理的结果
  10. ✅ 大幅提升执行速度

  11. 协同效应

    TKET 预处理 → 创建更规整的电路结构
               更容易被 Fusion 识别和融合
               融合效果更好,门数减少更多
               执行时矩阵乘法次数更少
               最终加速比显著提升
    


🔬 深入理解:Fusion 的数学原理

酉矩阵的性质

量子门可以用酉矩阵表示:

U† · U = I  (酉矩阵的性质)

矩阵融合的数学等价性

# 原始电路
ψ_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: 大规模量子模拟

# 20+ 量子比特的电路
# 原始执行时间: 数秒到数十秒
# 优化后执行时间: 几百毫秒
# 加速比: 10-13x

总结

✅ Sim-Fusion 的核心优势

  1. 两阶段协同优化
  2. TKET 预处理:电路级别的优化
  3. Qibo Fusion:矩阵级别的融合

  4. 显著的性能提升

  5. 门减少率:80-93%
  6. 执行加速:5-13x

  7. 通用性强

  8. 适用于各种量子电路
  9. 不依赖特定算法结构

  10. 易于使用

  11. 一行代码调用
  12. 自动选择最优策略

🎯 最佳实践

  1. 生产环境: 使用 Sim-Fusion
  2. 优化时间是一次性成本
  3. 执行加速显著

  4. 快速原型: 使用 Qibo Fusion

  5. 优化时间极短
  6. 加速比适中

  7. 大规模电路: 优先使用 Sim-Fusion

  8. 优化效果最显著
  9. 执行时间减少最多

📚 进一步学习

  • 查看源码: sim_fusion.py
  • 测试脚本: benchmarks/performance_comparison_test.py
  • 官方文档: Qibo Fusion, TKET Optimization

文档版本: 1.0.0 最后更新: 2025-12-30 作者: Sim-Fusion Team