"""声明并绑定一个带类型的 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()
