codex/total-correlation-noisy-parity-distributions.py

total-correlation-noisy-parity-distributions.py
"""Plot exact stipulated noisy-parity laws; output matching PNG to CWD."""

from itertools import product
from pathlib import Path

import matplotlib

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


def main():
    patterns = list(product((0, 1), repeat=3))
    labels = ["".join(map(str, p)) for p in patterns]
    colors = ["#28628e" if sum(p) % 2 == 0 else "#d0872e" for p in patterns]
    fig, axes = plt.subplots(3, 1, figsize=(9.5, 6.4), dpi=120,
        sharex=True, sharey=True, facecolor="white")
    for ax, epsilon in zip(axes, (0, 0.25, 0.5)):
        masses = [(1 - epsilon) / 4 if sum(p) % 2 == 0 else epsilon / 4
            for p in patterns]
        assert sum(masses) == 1
        ax.bar(range(8), masses, color=colors, width=0.66)
        ax.axhline(1 / 8, linestyle="--", color="#757575", linewidth=1)
        ax.set(ylim=(0, 0.30), yticks=(0, 0.125, 0.25), ylabel="Probability")
        ax.set_title(f"Parity-flip probability ε = {epsilon:g}", fontsize=11, loc="left")
        ax.grid(axis="y", alpha=0.15)
    axes[-1].set_xticks(range(8), labels, family="monospace", fontsize=11)
    axes[-1].set_xlabel("Joint outcome XYZ")
    fig.suptitle("Joint structure changes while every pair stays independent", fontsize=16)
    fig.text(0.5, 0.017,
        "Blue: even parity; orange: odd parity. Dashed line: independent three-bit law (1/8 per outcome).",
        ha="center", fontsize=10)
    fig.tight_layout(rect=(0, 0.05, 1, 0.96))
    fig.savefig(Path(__file__).stem + ".png", facecolor="white")
    plt.close(fig)


if __name__ == "__main__":
    main()