codex/permanent-independent-choice-probability.py

permanent-independent-choice-probability.py
"""Original independent-choice probability inventory; PNG basename to CWD."""
from fractions import Fraction
from itertools import product
from pathlib import Path

import matplotlib.pyplot as plt
from matplotlib.patches import Patch
import numpy as np


def main():
    rows = [(Fraction(3, 4), Fraction(1, 4)),
            (Fraction(1, 5), Fraction(4, 5))]
    outcomes = list(product(range(2), repeat=2))
    probabilities = [rows[0][i]*rows[1][j] for i, j in outcomes]
    distinct = [i != j for i, j in outcomes]
    assert sum(probabilities) == 1
    assert sum(p for p, valid in zip(probabilities, distinct) if valid) == Fraction(13, 20)
    fig, ax = plt.subplots(figsize=(7.6, 4.5), dpi=120)
    fig.patch.set_facecolor("white")
    values = [float(p) for p in probabilities]
    colors = ["#28865b" if valid else "#999999" for valid in distinct]
    xs = np.arange(4)
    ax.bar(xs, values, color=colors, width=.63)
    for i, probability in enumerate(probabilities):
        ax.text(i, float(probability)+.018,
                f"{probability} = {float(probability):.2f}",
                ha="center", fontsize=11)
    ax.set_xticks(xs, [str(tuple(x+1 for x in outcome)) for outcome in outcomes])
    ax.set_ylim(0, .73)
    ax.set_xlabel("Ordered choices (first person, second person)", fontsize=11)
    ax.set_ylabel("Probability", fontsize=11)
    ax.grid(axis="y", alpha=.17)
    ax.set_axisbelow(True)
    ax.spines[["top", "right"]].set_visible(False)
    ax.legend(handles=[Patch(color="#28865b", label="Distinct: total 0.65"),
                       Patch(color="#999999", label="Same label: total 0.35")],
              fontsize=11, frameon=False, loc="upper right")
    fig.suptitle("The permanent adds the distinct-choice probabilities",
                 fontsize=14, y=.98)
    ax.set_title("Independent choices: first (3/4, 1/4), second (1/5, 4/5)",
                 fontsize=11.5, pad=12)
    fig.subplots_adjust(left=.1, right=.98, top=.78, bottom=.19)
    fig.savefig(Path.cwd()/Path(__file__).with_suffix(".png").name,
                facecolor="white", transparent=False)
    plt.close(fig)


if __name__ == "__main__":
    main()