Skip to content

pyqpanda3 v0.4.0:从云端指令到保真度感知布局

pyqpanda3 v0.4.0 更适合作为一次“工作流版本”来理解。单个 API 本身当然有价值,但真正的提升在于它们终于能串起来:QCloud 芯片元数据可以变成 ChipBackend,这个后端对象继续驱动保真度感知转译和指令时序,带调度的指令流可以在提交前绘图检查,QCloud 结果字段也能回到本地的指令还原工具中。

从云端标定到可提交的指令流 ​

新的 QCloud 流程应该从芯片元数据开始,而不是从手写 instruction JSON 开始。这样拓扑、保真度、补偿角和时序会在布局、转译、可视化和提交之间保持一致。

python
import os

from pyqpanda3.core import CZ, H, QProg, instruction_to_qprog, measure
from pyqpanda3.qcloud import QCloudOptions, QCloudService
from pyqpanda3.transpilation import Transpiler, decompose
from pyqpanda3.visualization import draw_time_scheduling

service = QCloudService(os.environ["QPANDA_QCLOUD_API_KEY"])
backend = service.backend(os.environ.get("QPANDA_QCLOUD_BACKEND", "WK_C180"))

chip_backend = backend.chip_info().get_chip_backend()

prog = QProg()
prog << H(0) << CZ(0, 1) << measure(0, 0) << measure(1, 1)

decomposed = decompose(prog, ["U3", "CZ"])
transpiled = Transpiler().transpile(decomposed, chip_backend, {}, 2, "fidelity")
instruction = transpiled.to_instruction(
    chip_backend,
    offset=1,
    is_scheduling=True,
    compensate_pulse=False,
)
figure = draw_time_scheduling(instruction, backend=chip_backend, output="plotly")

options = QCloudOptions()
options.set_mapping(False)
options.set_optimization(False)
options.set_amend(False)

job = backend.run_instruction([instruction], 1000, options)
result = job.result()

print(chip_backend.single_gate_timing, chip_backend.double_gate_timing)
print(type(figure).__name__)
raw = result.origin_data()
print(type(raw).__name__)

示例输出形态:

text
40 80
Figure
str

对用户来说,最直观的变化是:指令时序不再是示例里写死的神秘常量,而是来自同一个 QCloud ChipBackend,也就是用于 layout 决策的那份芯片信息。

指令可以还原,也可以绘图 ​

同一套流程在本地也能跑通。instruction_to_qprog() 从指令 JSON 还原程序,visualization 模块则把同一条指令流画成时序图。

python
import json

from pyqpanda3.core import instruction_to_qprog
from pyqpanda3.visualization import draw_time_scheduling, parse_instruction_schedule

instruction = [
    {"RPhi": [1, 90.0, 0.0, 0]},
    {"CZ": [1, 2, 40]},
    {"Measure": [[2, 1], 120]},
]

prog = instruction_to_qprog(json.dumps(instruction), qubit_offset=1)
items = parse_instruction_schedule(instruction, durations={"RPhi": 40, "CZ": 40})
fig = draw_time_scheduling(instruction, durations={"RPhi": 40, "CZ": 40})
fig.savefig("schedule-v040.png", dpi=160)

print(type(prog).__name__)
print(items[0].name, items[0].end_time)
print("schedule-v040.png")

输出:

text
QProg
RPhi 40.0
schedule-v040.png

布局可使用保真度,并继续导出指令 ​

ChipBackend 现在携带单量子比特、读出和双量子比特保真度映射。fidelity_layout() 暴露映射决策,Transpiler().transpile(..., "fidelity") 则把该逻辑放进转译流程中。

python
from pyqpanda3.core import CZ, H, QProg, 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)

输出:

text
{0: 2, 1: 1}
True

状态制备也理解拓扑 ​

Encode.topology_aware_mps_encode() 为近似振幅编码增加了硬件拓扑感知路径。

python
from pyqpanda3.core import Encode

data = [0.25] * 16
topology = [[0, 1], [1, 2], [2, 3]]

encoder = Encode()
encoder.topology_aware_mps_encode([0, 1, 2, 3], data, topology, depth=3)

print(type(encoder.get_circuit()).__name__)
print(round(encoder.get_fidelity(data), 6))

输出:

text
QCircuit
1.0

完整内容可继续阅读 0.4.0 发布说明、QCloud API 和 时序可视化 API。

Released under the MIT License.