Transpiler
Transpiler 用于把逻辑量子程序映射到目标拓扑,统一完成 layout、路由、门分解和优化。
创建
python
from pyqpanda3.transpilation import Transpiler
transpiler = Transpiler()transpile 重载
基于边列表的重载
python
Transpiler.transpile(
prog: QProg,
chip_topology_edges: list[list[int]] = [],
init_mapping: dict[int, int] = {},
optimization_level: int = 2,
basic_gates: list[str] = [],
) -> QProg当你想显式传入拓扑边列表和目标门集时,使用这个重载。
| 参数 | 类型 | 说明 |
|---|---|---|
prog | QProg | 需要转译的量子程序。 |
chip_topology_edges | list[list[int]] | 物理耦合边,例如 [[0, 1], [1, 2]]。 |
init_mapping | dict[int, int] | 可选的初始虚拟到物理映射。 |
optimization_level | int | 优化等级,通常为 0、1 或 2。 |
basic_gates | list[str] | 分解后的目标门集,例如 ["U3", "CZ"]。 |
基于 ChipBackend 的重载
python
Transpiler.transpile(
prog: QProg,
backend: ChipBackend,
init_mapping: dict[int, int] = {},
optimization_level: int = 2,
) -> QProg当目标设备已经由 ChipBackend 描述时,使用这个重载。
带 layout_method 的 ChipBackend 重载
python
Transpiler.transpile(
prog: QProg,
backend: ChipBackend,
init_mapping: dict[int, int] = {},
optimization_level: int = 2,
layout_method: str = "default",
) -> QProg| 参数 | 类型 | 说明 |
|---|---|---|
layout_method | str | layout 策略。传入 "fidelity" 时,会根据后端拓扑和保真度数据自动计算初始映射。 |
virtual_z
python
virtual_z(prog: QProg) -> QProg把已经分解到 X1 / RZ / CZ / RPhi 门族的程序转换成 RPhi / CZ 形式,同时保留测量操作。对于需要把虚拟 Z 相位折叠进 RPhi 的指令导出流程,这个函数是关键桥接步骤。
fidelity_layout
python
fidelity_layout(
prog: QProg,
chip_topology_edges: list[list[int]],
single_gate_fidelity: dict[int, float] = {},
readout_fidelity: dict[int, float] = {},
double_gate_fidelity: dict[tuple[int, int], float] = {},
max_candidate_blocks: int = 32,
max_mappings_per_block: int = 256,
distance_penalty_weight: float = 1.0,
) -> dict[int, int]计算一个虚拟到物理的初始映射,优先选择连通且单比特、读出、双比特保真度更高的物理区域。
| 参数 | 类型 | 说明 |
|---|---|---|
prog | QProg | 用于驱动布局搜索的量子程序。 |
chip_topology_edges | list[list[int]] | 物理耦合边。 |
single_gate_fidelity | dict[int, float] | 每个物理量子比特的单门保真度。 |
readout_fidelity | dict[int, float] | 每个物理量子比特的读出保真度。 |
double_gate_fidelity | dict[tuple[int, int], float] | 每条物理耦合边上的双比特门保真度。 |
max_candidate_blocks | int | 最多评估多少个候选连通区域。 |
max_mappings_per_block | int | 每个区域最多尝试多少种映射。 |
distance_penalty_weight | float | 非邻接交互的距离惩罚权重。 |
ChipBackend 中的保真度字段
启用 fidelity-aware layout 时,ChipBackend 可以携带下面这些校准数据:
| 字段 | 类型 | 说明 |
|---|---|---|
single_gate_fidelity | dict[int, float] | 每个物理量子比特的单比特门保真度。 |
readout_fidelity | dict[int, float] | 每个物理量子比特的读出保真度。 |
double_gate_fidelity | dict[tuple[int, int], float] | 每条物理耦合边的双比特门保真度。 |
gate_fidelity | dict[tuple[str, tuple[int, ...]], float] | 逐指令的保真度,键为 (门名, 有序量子比特元组)。transpilation_metrics() 与保真度驱动近似会优先匹配这里的数据,命中即走精确分支。设置时校验每个键的门名与比特数;任意条目超出 [0, 1] 抛出 ValueError。 |
这些字段既可以手动填写,也可以通过 service.backend(...).chip_info().get_chip_backend() 从 QCloud 元数据中获取(云端元数据会填充 gate_fidelity)。
可运行示例
python
from pyqpanda3.core import QProg, H, CZ, measure
from pyqpanda3.transpilation import ChipBackend, Transpiler, fidelity_layout
prog = QProg()
prog << H(0) << CZ(0, 1) << measure(0, 0) << measure(1, 1)
backend = ChipBackend()
backend.chip_topology_edges = [[0, 1], [1, 2]]
backend.basic_gates = ["RPhi", "CZ"]
backend.single_gate_fidelity = {0: 0.99, 1: 0.99, 2: 0.99}
backend.readout_fidelity = {0: 0.90, 1: 0.90, 2: 0.99}
backend.double_gate_fidelity = {(0, 1): 0.90, (1, 2): 0.99}
mapping = fidelity_layout(
prog,
backend.chip_topology_edges,
backend.single_gate_fidelity,
backend.readout_fidelity,
backend.double_gate_fidelity,
)
transpiled = Transpiler().transpile(
prog,
backend,
{},
1,
"fidelity",
)
print(mapping)
print(len(transpiled.operations()) > 0)