codex/past-exam-of-the-computer-science-course-of-the-university-of-oxford/2023/artificial-intelligence-full-constraints.py

past-exam-of-the-computer-science-course-of-the-university-of-oxford/2023/artificial-intelligence-full-constraints.py
"""Draw the unreduced allocation constraint graph; Python 3.14.4, Matplotlib 3.10.7.

Run from any directory; the opaque PNG is written to the current directory.
"""

from itertools import combinations
from pathlib import Path

import matplotlib

matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np


def main():
    names = list("ABCDE")
    angles = np.linspace(np.pi / 2, np.pi / 2 - 2 * np.pi, 5, endpoint=False)
    positions = {name: (np.cos(a), np.sin(a)) for name, a in zip(names, angles)}
    fig, ax = plt.subplots(figsize=(4.4, 3.6), dpi=120, facecolor="white")
    ax.set_facecolor("white")
    for left, right in combinations(names, 2):
        x, y = zip(positions[left], positions[right])
        ax.plot(x, y, color="#526476", linewidth=1.5, zorder=1)
    for name, (x, y) in positions.items():
        ax.scatter([x], [y], s=1000, color="#e6f1fa", edgecolor="#1c5580", zorder=2)
        ax.text(x, y, name, ha="center", va="center", fontsize=16, zorder=3)
    ax.set_title("Before domain restriction: $K_5$", fontsize=13, pad=12)
    ax.set_aspect("equal")
    ax.set_xlim(-1.3, 1.3)
    ax.set_ylim(-1.25, 1.3)
    ax.axis("off")
    fig.tight_layout(pad=0.8)
    fig.savefig(Path.cwd() / (Path(__file__).stem + ".png"), facecolor="white", transparent=False)
    plt.close(fig)


if __name__ == "__main__":
    main()