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。