用不同角度复用一条旋转线路¶
先声明一条 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) 可能只是浮点舍入误差。不要为了消除报错就放宽参数范围,先确认扫描本来想研究什么。