跳转至

用不同角度复用一条旋转线路

先声明一条 RY 线路,再绑定数值角度并运行,保留原来的符号声明。随后用这份声明做一个小扫描。先学Bell 线路和量子门基础,在安装好的环境中,从仓库根目录运行。

量子比特从 |0⟩ 开始时,RY(θ) 得到 cos(θ/2)|0⟩ + sin(θ/2)|1⟩。运行前先预测 θ = 0、π/2、π 时的 P(1)。接口使用弧度。

保留可复用的声明

"""声明并绑定一个带类型的 Digital 旋转参数。

原始线路保留符号参数,``bind`` 返回新的可执行线路。示例还会检查缺少参数和未知
参数的错误,说明同一份声明可以安全地用于多组实验值。
"""

from __future__ import annotations

import json

from cascaqit import Circuit


def main() -> None:
    """绑定一个角度,并比较声明线路与可执行线路。"""
    declaration = Circuit(1, program_id="lesson.digital.parameter")
    theta = declaration.parameter("theta", lower_bound=-3.2, upper_bound=3.2)
    declaration.ry(theta, 0).measure_all()

    # 绑定返回独立线路,原始 declaration 仍保持 symbolic。
    bound = declaration.bind({"theta": 0.5})
    result = bound.run(shots=0, seed=202, return_probabilities=True)

    payload = {
        "track": "digital_developer",
        "level": "foundation",
        "lesson": "parameter_binding",
        "facts": {
            "declaration_is_bound": declaration.is_bound,
            "bound_is_bound": bound.is_bound,
            "parameter_names": [item.name for item in bound.parameters],
            "bound_angle": bound.operations[0].arguments["theta"],
            "probability_sum": round(sum((result.probabilities or {}).values()), 12),
        },
        "boundaries": {
            "hardware_execution": False,
            "cloud_execution": False,
            "network_accessed": False,
            "credentials_loaded": False,
        },
    }
    print(json.dumps(payload, sort_keys=True))


if __name__ == "__main__":
    main()

下载完整脚本

python3 examples/user/tracks/digital_developer/02_foundation_parameter_binding_zh.py

declaration.parameter("theta", ...) 创建属于这条线路的命名参数。这里的区间 [-3.2, 3.2] 包含练习中的三个角度。边界约束输入值,不改变 RY 的含义。

bind({"theta": 0.5}) 返回另一个已绑定线路,原对象仍保留符号参数,可以继续绑定。已绑定不代表不可变:后续调用线路构建方法,仍可能修改这个对象。比较参数点时,应保留独立的原始声明。

{
  "boundaries": {
    "cloud_execution": false,
    "credentials_loaded": false,
    "hardware_execution": false,
    "network_accessed": false
  },
  "facts": {
    "bound_angle": 0.5,
    "bound_is_bound": true,
    "declaration_is_bound": false,
    "parameter_names": [
      "theta"
    ],
    "probability_sum": 1.0
  },
  "lesson": "parameter_binding",
  "level": "foundation",
  "track": "digital_developer"
}

declaration_is_bound 为 false,bound_is_bound 为 true,实际门角度为 0.5。probability_sum = 1 只能检查归一化,不能单独证明旋转正确。在本地副本中加入 print(result.probabilities),用理论值 P(1) = sin²(0.25) ≈ 0.061209 核对。

示例设为 shots=0 并请求概率,会计算态演化,但不进行有限次测量采样。这条路径上 counts 为空是正常现象。

从单次运行改成扫描

声明线路后,分别绑定各个角度:

from math import pi

for angle in (0.0, pi / 2, pi):
    candidate = declaration.bind({"theta": angle})
    result = candidate.run(shots=0, return_probabilities=True)
    print(angle, result.probabilities)

1 的概率应在浮点精度范围内分别为 0、1/2 和 1。把角度与结果一起保存,不要只靠列表位置识别扫描点。

定位绑定错误

分别尝试 bind({})、bind({"thta": 0.5}) 和 bind({"theta": 4.0}),避免一次异常中止所有练习。阅读 ProgramValidationError 的消息,修正名称或数值后再运行。解释为什么增加 shots 不能修复角度越界。

核对思路

第一种缺少必填参数 theta,第二种提供了未知名称,第三种超过声明的上界。绑定与执行成功后才会采样,因此修改 shots 不能修复这些输入错误。θ = π 时,极小的残余 P(0) 可能只是浮点舍入误差。不要为了消除报错就放宽参数范围,先确认扫描本来想研究什么。

下一课是子线路与逆线路。数字线路指南列出了参数表达式支持的运算和限制。

English

SDK 1.0.8a · `8b227bff`