运行第一个实验¶
完成环境安装后,先运行一次旋转并查看测量结果。实验从 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 的概率应为一。不能从这个单量子比特例子推断双量子比特结果的位序;需要读取那次运行自己的位序元数据。