跳转至

导入和导出受限 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。

English

SDK 1.0.8a · `8b227bff`