"""Project a typed QUBO problem into a Pauli cost Hamiltonian.

The projection keeps variable order, offset, term coefficients, and source
identity explicit. It prepares the cost operator used by QAOA or VQE without
running an optimizer and without claiming a hardware 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:
    """Build one QUBO, project it, and evaluate a known 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()
