"""描述一个小型图优化问题，并解码候选 bitstring。

程序先固定图的节点顺序、位置和边，再解码一个独立集候选；此时不会运行变分
优化器。把问题数据单独列出，后续解释 QAOA 结果时才不会混入硬件 placement 假设。
"""

from __future__ import annotations

import json

from cascaqit.problems import GraphProblemIR, decode_graph_bitstring


def main() -> None:
    """创建一个路径图并解码一个独立集候选。"""
    # Positions 是显式的问题事实，不能把它们当作自动推导的硬件 placement。
    graph = GraphProblemIR.from_edges(
        problem_id="lesson.optimization.beginner",
        positions={"a": (0.0, 0.0), "b": (5.0, 0.0), "c": (10.0, 0.0)},
        edges=(("a", "b"), ("b", "c")),
    )

    # 候选解必须使用 graph 冻结后的变量顺序。
    decoded = decode_graph_bitstring(graph, "101")
    candidates = [decode_graph_bitstring(graph, f"{value:03b}") for value in range(8)]
    feasible = [item for item in candidates if item["is_independent"]]
    maximum_size = max(item["selection_size"] for item in feasible)
    payload = {
        "track": "optimization_researcher",
        "level": "beginner",
        "lesson": "graph_problem",
        "facts": {
            "node_order": list(graph.nodes),
            "edges": [list(edge) for edge in graph.edges],
            "bitstring": decoded["bitstring"],
            "selected_nodes": list(decoded["selected_nodes"]),
            "feasible": decoded["is_independent"],
            "candidates": [
                {
                    "bitstring": item["bitstring"],
                    "size": item["selection_size"],
                    "feasible": item["is_independent"],
                    "violating_edges": item["violating_edges"],
                }
                for item in candidates
            ],
            "maximum_independent_set_size": maximum_size,
            "optimal_bitstrings": [
                item["bitstring"]
                for item in feasible
                if item["selection_size"] == maximum_size
            ],
        },
        "boundaries": {
            "hardware_execution": False,
            "cloud_execution": False,
            "network_accessed": False,
            "credentials_loaded": False,
        },
    }
    print(json.dumps(payload, sort_keys=True))


if __name__ == "__main__":
    main()
