导入和导出受限 OpenQASM 3 线路¶
使用 cascaqit.interop 中的 import_program() 与 export_program() 转换静态数字线路。当前解析器只接收 OpenQASM 3 的一个明确子集。文件声明为 OpenQASM 3,并不表示其中所有语法都能转换。
导入前先把文件读成字符串,传入 ProgramImportRequest(source_format="openqasm3", source=text)。检查返回的 program、diagnostics、unsupported_features 和 lossy_mappings,确认可用后再处理程序。默认 on_unsupported="diagnose" 返回诊断;需要异常时可改为 "raise"。
转换后再导入,并检查被拒绝的语句¶
这个例子导入旋转和受控门,导出后再次导入,检查结构及当前线路的本地状态概率。最后把 X 门改成不支持的 reset,确认程序被拒绝。
"""使用导入程序前,检查受限 OpenQASM 转换。"""
from __future__ import annotations
import json
from cascaqit.digital import DigitalProgramIR
from cascaqit.interop import (
ProgramExportRequest,
ProgramImportRequest,
export_program,
import_program,
prove_openqasm3_round_trip,
)
from cascaqit.simulators import compare_digital_program_semantics
def main() -> None:
"""检查有效转换、往返结果和不支持的重置操作。"""
source = """
OPENQASM 3;
qubit[2] q;
bit[2] c;
ry(0.4) q[0];
cx q[0], q[1];
x q[1];
measure q[0] -> c[0];
measure q[1] -> c[1];
"""
imported = import_program(
ProgramImportRequest(source_format="openqasm3", source=source)
)
if (
not isinstance(imported.program, DigitalProgramIR)
or imported.unsupported_features
):
raise RuntimeError("受支持的源码没有生成数字程序。")
exported = export_program(
ProgramExportRequest(program=imported.program, target_format="openqasm3")
)
if not isinstance(exported.payload, str):
raise RuntimeError("导出没有生成 OpenQASM 源码。")
restored = import_program(
ProgramImportRequest(source_format="openqasm3", source=exported.payload)
)
if not isinstance(restored.program, DigitalProgramIR):
raise RuntimeError("导出的源码无法重新导入。")
structure = prove_openqasm3_round_trip(imported.program)
probabilities = compare_digital_program_semantics(
imported.program, restored.program
)
blocked = import_program(
ProgramImportRequest(
source_format="openqasm3", source=source.replace("x q[1];", "reset q[1];")
)
)
if (
structure.status != "passed"
or probabilities.status != "equivalent"
or blocked.program is not None
):
raise RuntimeError("转换检查结果与支持范围不一致。")
print(
json.dumps(
{
"exported_source": exported.payload,
"round_trip_status": structure.status,
"matched_fields": list(structure.matched_fields),
"probability_status": probabilities.status,
"maximum_probability_delta": probabilities.max_probability_delta,
"blocked_reset": blocked.program is None,
"reset_diagnostics": [item.code for item in blocked.diagnostics],
},
sort_keys=True,
)
)
if __name__ == "__main__":
main()
python examples/learning/guides/openqasm_interop_zh.py
{
"blocked_reset": true,
"exported_source": "OPENQASM 3;\ninclude \"stdgates.inc\";\nqubit[2] q;\nbit[2] c;\nry(0.40000000000000002) q[0];\ncx q[0], q[1];\nx q[1];\nmeasure q[0] -> c[0];\nmeasure q[1] -> c[1];\n",
"matched_fields": [
"qubits",
"gates",
"measurements",
"bit_order",
"measurement_mapping"
],
"maximum_probability_delta": 0.0,
"probability_status": "equivalent",
"reset_diagnostics": [
"OPENQASM_RESET_UNSUPPORTED"
],
"round_trip_status": "passed"
}
round_trip_status 应为 passed,检查的字段包括门、测量、位序和经典位映射。probability_status 应为 equivalent,本例概率差为零。它检查的是这条线路的计算基概率,不是任意输入态下的完整酉等价证明。
blocked_reset 应为 true,并出现 OPENQASM_RESET_UNSUPPORTED。返回诊断不会自动移除 reset,也不会把剩余部分当作完整程序运行。
支持范围与转换后的检查¶
| 内容 | 当前处理 |
|---|---|
| 固定大小 qubit/bit 数组、数字角度和末端测量 | 接受符合受限语法的声明与操作 |
| I/X/Y/Z/H/S/SDG/T/TDG、RX/RY/RZ/P/U、CX/CY/CZ | 支持对应静态门语句 |
| 导出 SWAP | 展开为三个 CX;不能据此推断导入支持 SWAP 语句 |
| 运行时条件、循环、reset、中途测量 | 拒绝或要求先由外部工具转换 |
| 自定义门、defcal、delay、box、barrier | 不属于当前解析子集 |
| 任意外部 SDK 运行时对象 | 不会自动加载或执行 |
当前测量语法为 measure q[0] -> c[0];。使用其他等价写法或表达式时,也要先检查实际解析结果。导出结果的 payload 为字符串时才能保存为源码文件;它不是已经提交的设备任务。
保存原始源码、转换诊断、位序与测量映射。不要只看 counts 的字符串相同,就假定所有门、相位或位序都未改变。参考位序课程与包级接口导航。外部格式需要适配器时,原生 SDK 不会自动引入 cascaqit-compat。