跳转至

运行第一个实验

完成环境安装后,先运行一次旋转并查看测量结果。实验从 0 状态开始,绕 Y 轴旋转 π/3 弧度,再采样 128 次。测到 1 的理想概率为 sin²(π/6) = 1/4。

运行前先预测:128 次采样是否一定恰好得到 32 个 1?答案是否定的,采样课程会解释原因。

"""Rotate one qubit, read the samples and save a report from the same result."""

from __future__ import annotations

import argparse
import json
from math import pi
from pathlib import Path
from typing import Literal

import cascaqit
from cascaqit import Circuit, visualize


def experiment(output: Path, language: Literal["en", "zh"] = "en") -> dict[str, object]:
    """Keep the raw result beside the HTML so the plot can be checked later."""
    theta, shots, seed = pi / 3, 128, 17
    circuit = Circuit(1).ry(theta, 0).measure_all(key="readout")
    result = circuit.run(shots=shots, seed=seed, return_probabilities=True)
    output.parent.mkdir(parents=True, exist_ok=True)
    visualize(result, program=circuit, output=output, language=language)
    raw = output.with_suffix(".json")
    raw.write_text(json.dumps(result.to_dict(), indent=2) + "\n", encoding="utf-8")
    return {
        "sdk_version": cascaqit.__version__,
        "theta_rad": theta,
        "shots": shots,
        "seed": seed,
        "counts": result.counts,
        "probabilities": result.probabilities,
        "bit_order": result.metadata["bitstring_ordering"]["qubit_order"],
        "diagnostic_codes": [item.code for item in result.diagnostics],
        "report": output.as_posix(),
        "raw_result": raw.as_posix(),
    }


def main() -> None:
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument(
        "--output", type=Path, default=Path("artifacts/first-experiment.html")
    )
    parser.add_argument("--language", choices=("en", "zh"), default="en")
    args = parser.parse_args()
    print(json.dumps(experiment(args.output, args.language), sort_keys=True))


if __name__ == "__main__":
    main()

下载完整脚本

在仓库根目录运行:

python examples/learning/foundations/first_experiment.py --language zh

Circuit(1) 创建单量子比特程序,.ry(theta, 0) 旋转第 0 个量子比特,.measure_all(key="readout") 声明末端测量。circuit.run(...) 在本地运行并返回 ResultIR。visualize() 读取这份结果生成报告,不会重新采样线路。

{
  "bit_order": [
    "q0"
  ],
  "counts": {
    "0": 91,
    "1": 37
  },
  "diagnostic_codes": [
    "DIGITAL_SIMULATION_COMPLETED",
    "DIGITAL_RESULT_ALIGNMENT_VALID"
  ],
  "probabilities": {
    "0": 0.7500000000000001,
    "1": 0.24999999999999994
  },
  "raw_result": "artifacts/first-experiment.json",
  "report": "artifacts/first-experiment.html",
  "sdk_version": "1.0.8a",
  "seed": 17,
  "shots": 128,
  "theta_rad": 1.0471975511965976
}

计数总和应为 128。考虑浮点精度,0 和 1 的概率应分别接近 0.75 和 0.25。计数来自有限次采样,不必恰好等于这些概率乘以 128。seed 有助于在相同环境中重复采样。

用浏览器打开 artifacts/first-experiment.html。旁边的 JSON 文件保存了报告所使用的结果,查看它们不需要上传文件。

只改一个数

在本地副本中,把 theta 改为 pi。先预测结果,再换一个输出路径运行,例如传入 --output artifacts/pi-rotation.html,保留第一次实验的文件。对照查看计数和概率。

核对结果

理想的 Y 轴 π 旋转把 0 变为 1,因此考虑数值精度后,1 的概率应为一。不能从这个单量子比特例子推断双量子比特结果的位序;需要读取那次运行自己的位序元数据。

下一步:读懂结果与报告。如果还不熟悉概率计算,可以先学习复数态向量。

English

SDK 1.0.8a · `6eff6362`