跳转至

circuit_compression

概览

  • 模块:fieldqkit.algorithms.circuit_compression
  • 目标:为 VQE parameter-shift 路径提供可复用的线路压缩工具。
  • 核心思想:
    • 先把目标线路按层切成 prefix/suffix blocks(可选)。
    • 再用浅层硬件高效 ansatz 拟合每个 stage。
    • 拟合目标显式二选一:mps(状态保真)或 mpo(过程保真)。

数据结构

SuffixCompressionBlock

@dataclass
class SuffixCompressionBlock:
        start_layer: int
        end_layer: int
        max_bond: int
        relative_trunc_error: float
        num_gates: int
  • 含义:描述一个后缀压缩块在层空间上的范围和复杂度估计。

HybridCompressionPlan

@dataclass
class HybridCompressionPlan:
        split_layer: int
        total_layers: int
        prefix_max_bond: int
        prefix_relative_trunc_error: float
        blocks: List[SuffixCompressionBlock]
  • 含义:
    • split_layer 左侧是 prefix。
    • split_layer 到末层被连续划分为 blocks

关键函数

build_layer_span_circuit

build_layer_span_circuit(
        qc_bound: QuantumCircuit,
        *,
        start_layer: int,
        end_layer: int,
) -> QuantumCircuit
  • 作用:提取闭区间 [start_layer, end_layer] 对应的子线路。
  • 行为:
    • 自动按门冲突构建 moments/layers。
    • 入参越界会被裁剪到合法范围。
    • 空区间返回空线路。
  • 典型用法:VQE 在 stage 压缩前构造每个 stage 的 target 子线路。

plan_hybrid_suffix_blocks

plan_hybrid_suffix_blocks(
        qc_bound: QuantumCircuit,
        *,
        bond_cap: int = 128,
        trunc_tol: float = 1e-8,
        max_layers_per_block: int = 6,
        device: torch.device | str | None = None,
) -> HybridCompressionPlan
  • 作用:依据 bond 与截断误差阈值,把线路切成 prefix + suffix blocks
  • 规划策略:
    • prefix:逐层扩展,使用 MPS 截断误差判断是否继续吸收。
    • suffix:在每个起点上尝试扩展到 max_layers_per_block,用 MPO 截断误差决定 block 终点。
  • 参数约束:
    • bond_cap > 0
    • trunc_tol >= 0
    • max_layers_per_block > 0

compress_circuit_with_hybrid_objective

compress_circuit_with_hybrid_objective(
        qc_bound: QuantumCircuit,
        *,
        num_qubits: int,
        approx_layers: int,
        optimizer_steps: int,
        optimizer_lr: float,
        objective_mode: Literal["mps", "mpo"] = "mps",
        bond_cap: int,
        warm_start_params: Optional[np.ndarray],
        device: torch.device | str | None = None,
        verbose: bool = False,
) -> Tuple[QuantumCircuit, np.ndarray, Dict[str, object]]
  • 作用:把 qc_bound 拟合为浅层硬件高效线路。
  • 内部先将 qc_bound 模拟为 MPS 或 MPO 目标态,然后委托给 compile_tn_1d 执行优化。
  • 目标模式:
    • objective_mode="mps":状态 infidelity。
    • objective_mode="mpo":过程 infidelity。

compile_tn_1d

compile_tn_1d(
        target_tn,
        *,
        num_qubits: int,
        approx_layers: int,
        optimizer_steps: int,
        optimizer_lr: float,
        objective_mode: Literal["mps", "mpo"] = "mps",
        bond_cap: Optional[int] = None,
        warm_start_params: Optional[np.ndarray] = None,
        device: torch.device | str | None = None,
        verbose: bool = False,
) -> Tuple[QuantumCircuit, np.ndarray, Dict[str, object]]
  • 作用:核心张量网络优化器,接收已有的 MPS/MPO 张量目标,用浅层 HEA 逼近。
  • 优化器:Adam,两阶段(主优化 + 可选 refine)。
  • compress_circuit_with_hybrid_objective 是对此函数的上层包装。

build_compression_transform

build_compression_transform(
        client,
        *,
        num_qubits: int,
        layers: int,
        backend,
        target_qubits: Optional[Sequence[int]] = None,
        use_dd: bool = True,
        enable_block_planner: bool = False,
        planner_bond_cap: int = 128,
        planner_trunc_tol: float = 1e-8,
        planner_max_layers_per_block: int = 6,
        compression_block_layers: Optional[int] = None,
        compression_optimizer_steps: int = 20,
        compression_optimizer_lr: float = 0.05,
        compression_verbose: bool = False,
        compression_plot_loss: bool = False,
        tag: str = "compress",
        convert_single_qubit_gate_to_u: bool = True,
        transpile: bool = True,
) -> dict
  • 作用:构建可复用的压缩回调函数,兼容 run_variational_loopcircuit_transform 参数。
  • 返回 dict 包含:
    • transform(qc, param_index) -> qc 回调。
    • compressed_transpiled_template:预编译的压缩模板。
    • target_qubits_in_use:解析后的物理比特映射。

使用示例

1) 先规划后分段压缩

from fieldqkit.algorithms.circuit_compression import (
        plan_hybrid_suffix_blocks,
        build_layer_span_circuit,
        compress_circuit_with_hybrid_objective,
)

plan = plan_hybrid_suffix_blocks(
        qc,
        bond_cap=128,
        trunc_tol=1e-8,
        max_layers_per_block=6,
)

prefix_qc = build_layer_span_circuit(
        qc,
        start_layer=0,
        end_layer=max(plan.split_layer - 1, -1),
)

cmp_prefix, warm, info_prefix = compress_circuit_with_hybrid_objective(
        prefix_qc,
        num_qubits=qc.nqubits,
        approx_layers=2,
        optimizer_steps=20,
        optimizer_lr=0.05,
        objective_mode="mps",
        bond_cap=128,
        warm_start_params=None,
)

for block in plan.blocks:
        block_qc = build_layer_span_circuit(
                qc,
                start_layer=block.start_layer,
                end_layer=block.end_layer,
        )
        cmp_block, warm, info_block = compress_circuit_with_hybrid_objective(
                block_qc,
                num_qubits=qc.nqubits,
                approx_layers=2,
                optimizer_steps=20,
                optimizer_lr=0.05,
                objective_mode="mpo",
                bond_cap=128,
                warm_start_params=warm,
        )

2) 直接压缩整条线路

compressed_qc, warm_start, summary = compress_circuit_with_hybrid_objective(
        qc,
        num_qubits=qc.nqubits,
        approx_layers=2,
        optimizer_steps=30,
        optimizer_lr=0.03,
        objective_mode="mps",
        bond_cap=64,
        warm_start_params=None,
)

注意事项

  • 该模块假设输入线路可由 simulate_mps / simulate_mpo_process 支持。
  • objective_mode 为显式单目标,不再支持 mps/mpo 权重混合。
  • warm_start_params 长度不匹配时会回退到随机初始化。

相关页面