"""把带类型的 QUBO 问题投影为 Pauli cost Hamiltonian。

投影结果保留变量顺序、offset、各项系数和来源标识，可直接作为 QAOA 或 VQE 的
cost operator。本例不运行优化器，也不包含硬件 embedding。
"""

from __future__ import annotations

import json

from cascaqit.algorithms import problem_to_pauli_hamiltonian
from cascaqit.problems import QUBOProblemIR, evaluate_qubo_bitstring


def main() -> None:
    """构建一个 QUBO、完成投影，并评估一个已知 bitstring。"""
    problem = QUBOProblemIR.from_terms(
        problem_id="lesson.optimization.qubo",
        variables=("x0", "x1"),
        linear_terms={"x0": -1.0, "x1": -0.5},
        quadratic_terms={("x0", "x1"): 1.25},
        offset=0.1,
    )
    hamiltonian = problem_to_pauli_hamiltonian(problem)

    payload = {
        "track": "optimization_researcher",
        "level": "foundation",
        "lesson": "qubo_hamiltonian",
        "facts": {
            "variables": list(problem.variables),
            "pauli_coefficients": {
                term.observable.name: term.coefficient for term in hamiltonian.terms
            },
            "basis_objectives": {
                bits: evaluate_qubo_bitstring(problem, bits)
                for bits in ("00", "01", "10", "11")
            },
            "term_count": len(hamiltonian.terms),
            "hamiltonian_offset": hamiltonian.constant,
            "candidate_10_value": evaluate_qubo_bitstring(problem, "10"),
            "source_hash_present": len(problem.stable_hash()) == 64,
        },
        "boundaries": {
            "hardware_execution": False,
            "cloud_execution": False,
            "network_accessed": False,
            "credentials_loaded": False,
        },
    }
    print(json.dumps(payload, sort_keys=True))


if __name__ == "__main__":
    main()
