codex/missing-section-ambiguity.py

missing-section-ambiguity.py
"""Original missing-observation counterexample. Python 3.14; NumPy/Matplotlib."""
from pathlib import Path
import numpy as np
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from matplotlib.patches import Rectangle

connected = np.zeros((3, 5), dtype=np.uint8)
connected[:, 2] = 1
separated = connected.copy()
separated[1, 2] = 0
observed = [0, 2]
assert np.array_equal(connected[observed], separated[observed])
assert not np.array_equal(connected, separated)
fig, axes = plt.subplots(1, 2, figsize=(7.8, 3.4), layout="constrained", facecolor="white")
for ax, values, title in zip(axes, [connected, separated], ["A: one connected column", "B: two separated parts"]):
    ax.imshow(values, origin="lower", cmap=ListedColormap(["white", "#246785"]), vmin=0, vmax=1, interpolation="nearest")
    ax.add_patch(Rectangle((-.5, .5), 5, 1, facecolor="#b3a16c", alpha=.18))
    ax.add_patch(Rectangle((-.5, .5), 5, 1, fill=False, edgecolor="#867643", linestyle="--", lw=1.7))
    ax.set_yticks([0, 1, 2], ["Recorded", "Missing", "Recorded"])
    ax.set_xticks([])
    ax.set_xticks(np.arange(-.5, 5, 1), minor=True)
    ax.set_yticks(np.arange(-.5, 3, 1), minor=True)
    ax.grid(which="minor", color="#b0b0b0", linewidth=.6)
    ax.tick_params(which="both", length=0)
    ax.set_title(title, fontsize=11)
    ax.set_xlabel("Same first and last recorded rows", fontsize=10)
fig.suptitle("Two possible specimens; identical retained observations", fontsize=12)
fig.savefig(Path("missing-section-ambiguity.png"), dpi=140, facecolor="white")