from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
import numpy as np
import random


simulator = AerSimulator()
SHOTS = 200000


# =====================================
# CIRCUIT
# =====================================

def create_ghz_circuit(measure_q0=False,pre=False):

    # 5 qubits, 5 classical bits
    circuit = QuantumCircuit(5, 5)

    # current test circuit
    circuit.x(0)
    circuit.x(3)

    circuit.h(1)
    circuit.h(2)
    #circuit.h(3)
    #circuit.h(4)
    circuit.cx(1, 0)

    circuit.cx(1, 3)
    circuit.ccx(1, 2, 4)

    circuit.cx(2, 3)
    circuit.cx(2, 0)

    circuit.barrier()

    return circuit


# =====================================
# CHSH BASIS
# =====================================

def measure_in_basis(circuit, qubit, angle):
    circuit.ry(-2 * angle, qubit)


# =====================================
# SPLIT q0
# =====================================

def split_counts_by_q0(counts):
    q0_0 = {}
    q0_1 = {}

    for key, value in counts.items():
        # qiskit order: c4 c3 c2 c1 c0
        q2q1 = key[2:4]          # c2 c1
        q0 = key[4]               # c0

        if q0 == "0":
            q0_0[q2q1] = q0_0.get(q2q1, 0) + value
        else:
            q0_1[q2q1] = q0_1.get(q2q1, 0) + value

    return q0_0, q0_1


# =====================================
# CORRELATION
# =====================================

def calculate_correlation(counts):
    total = sum(counts.values())
    if total == 0:
        return 0

    corr = 0
    for key, value in counts.items():
        q2 = key[0]
        q1 = key[1]
        if q1 == q2:
            corr += value
        else:
            corr -= value

    return corr / total


# =====================================
# TABLE
# =====================================

def print_table(rows):
    print("\n")
    print("=" * 110)
    print(
        f"{'TEST':8}"
        f"{'q0':5}"
        f"{'00':7}"
        f"{'01':7}"
        f"{'10':7}"
        f"{'11':7}"
        f"{'N':8}"
        f"{'E(q1,q2)':12}"
    )
    print("-" * 110)

    for r in rows:
        print(
            f"{r['test']:8}"
            f"{r['q0']:5}"
            f"{r['00']:7}"
            f"{r['01']:7}"
            f"{r['10']:7}"
            f"{r['11']:7}"
            f"{r['N']:8}"
            f"{r['corr']:12.6f}"
        )
    print("=" * 110)


# =====================================
# CHSH SETTINGS
# =====================================

bases = [
    ("A0B0", 0, np.pi / 8),
    ("A0B1", 0, -np.pi / 8),
    ("A1B0", np.pi / 4, np.pi / 8),
    ("A1B1", np.pi / 4, -np.pi / 8)
]


# =====================================
# RUN
# =====================================

def run_chsh(measure_q0, pre):

    results_all = []
    results_q0_0 = []
    results_q0_1 = []
    table = []

    print("\n")
    print("=" * 40)
    if measure_q0:
        print("q0 MEASURED")
    else:
        print("q0 NOT MEASURED")
    print("=" * 40)

    for name, a, b in bases:

        circuit = create_ghz_circuit(measure_q0, pre)

        meas = measure_q0
        # measure the new ancillas q3 and q4 (optional, for checking)
        if pre:
            circuit.measure(3, 3)

            # measure q0 if requested
            if meas:
                circuit.measure(0, 0)

        circuit.measure(4, 4)

        circuit.barrier()

        # measurement bases on q1 and q2
        measure_in_basis(circuit, 1, a)
        measure_in_basis(circuit, 2, b)

        circuit.barrier()

        # measure q1 and q2
        circuit.measure(1, 1)
        circuit.barrier()
        circuit.measure(2, 2)
        circuit.barrier()

        # measure the new ancillas q3 and q4 (optional, for checking)
        if not pre:
            circuit.measure(3, 3)

            # measure q0 if requested
            if meas:
                circuit.measure(0, 0)


        print("\n", name)
        print(circuit.draw())

        result = simulator.run(circuit, shots=SHOTS).result()
        counts = result.get_counts()

        # =====================================
        # CHECK q0=1 AND q3=1
        # =====================================

        q0_q3_11 = 0

        total_shots = 0
        for key, value in counts.items():
            q0 = key[4]
            q3 = key[1]

            if q0 == "1":
                total_shots += value
                if q3 == "1":
                    q0_q3_11 += value

        if total_shots > 0:
            print(
                f"q0=1 -> q3=1: {q0_q3_11} / {total_shots}"
                f"  ({100*q0_q3_11/total_shots:.4f}%)"
            )
        else:
            print("\nq0 ALWAYS 0")

        print("\nCOUNTS")
        print(counts)

        # --- total correlation on q1,q2 ---
        clean = {}
        for k, v in counts.items():
            # take only bits of q2 and q1 (positions 2 and 1 in the 5-bit string)
            q2q1 = k[2:4]
            clean[q2q1] = clean.get(q2q1, 0) + v

        corr = calculate_correlation(clean)
        results_all.append(corr)

        if not meas:
            table.append({
                "test": name,
                "q0": "--",
                "00": clean.get("00", 0),
                "01": clean.get("01", 0),
                "10": clean.get("10", 0),
                "11": clean.get("11", 0),
                "N": sum(clean.values()),
                "corr": corr
            })

        if meas:
            c0, c1 = split_counts_by_q0(counts)

            corr0 = calculate_correlation(c0)
            corr1 = calculate_correlation(c1)

            results_q0_0.append(corr0)
            results_q0_1.append(corr1)

            for label, c in [("0", c0), ("1", c1)]:
                table.append({
                    "test": name,
                    "q0": label,
                    "00": c.get("00", 0),
                    "01": c.get("01", 0),
                    "10": c.get("10", 0),
                    "11": c.get("11", 0),
                    "N": sum(c.values()),
                    "corr": calculate_correlation(c)
                })

    print_table(table)

    # Total CHSH
    S = results_all[0] + results_all[1] + results_all[2] - results_all[3]
    print("\nTotal CHSH =", S)

    if measure_q0:
        S0 = results_q0_0[0] + results_q0_0[1] + results_q0_0[2] - results_q0_0[3]
        S1 = results_q0_1[0] + results_q0_1[1] + results_q0_1[2] - results_q0_1[3]

        print("\nConditional CHSH")
        print("q0=0 :", S0)
        print("q0=1 :", S1)

        S0_alt = -results_q0_0[0] - results_q0_0[1] + results_q0_0[2] - results_q0_0[3]
        print("\nAlternative CHSH q0=0")
        print("S0_alt =", S0_alt)
        print("2*sqrt(2) =", 2 * np.sqrt(2))


# =====================================
# MAIN
# =====================================

run_chsh(False, True)
run_chsh(True, True)

run_chsh(False, False)
run_chsh(True, False)


=========================
=  PYTHON CODE OUTPUT   =
=========================


========================================
q0 NOT MEASURED
========================================

 A0B0
     ┌───┐┌───┐               ┌───┐ ░        ░              ░     ░     ░ 
q_0: ┤ X ├┤ X ├───────────────┤ X ├─░────────░──────────────░─────░─────░─
     ├───┤└─┬─┘               └─┬─┘ ░        ░  ┌───────┐   ░ ┌─┐ ░     ░ 
q_1: ┤ H ├──■────■────■─────────┼───░────────░──┤ Ry(0) ├───░─┤M├─░─────░─
     ├───┤       │    │         │   ░        ░ ┌┴───────┴─┐ ░ └╥┘ ░ ┌─┐ ░ 
q_2: ┤ H ├───────┼────■────■────■───░────────░─┤ Ry(-π/4) ├─░──╫──░─┤M├─░─
     ├───┤     ┌─┴─┐  │  ┌─┴─┐      ░ ┌─┐    ░ └──────────┘ ░  ║  ░ └╥┘ ░ 
q_3: ┤ X ├─────┤ X ├──┼──┤ X ├──────░─┤M├────░──────────────░──╫──░──╫──░─
     └───┘     └───┘┌─┴─┐└───┘      ░ └╥┘┌─┐ ░              ░  ║  ░  ║  ░ 
q_4: ───────────────┤ X ├───────────░──╫─┤M├─░──────────────░──╫──░──╫──░─
                    └───┘           ░  ║ └╥┘ ░              ░  ║  ░  ║  ░ 
c: 5/══════════════════════════════════╩══╩════════════════════╩═════╩════
                                       3  4                    1     2    

q0 ALWAYS 0

COUNTS
{'00110': 7326, '11110': 42871, '11010': 7275, '00100': 42717, '00000': 7313, '00010': 42514, '01100': 7268, '01000': 42716}

 A0B1
     ┌───┐┌───┐               ┌───┐ ░        ░             ░     ░     ░ 
q_0: ┤ X ├┤ X ├───────────────┤ X ├─░────────░─────────────░─────░─────░─
     ├───┤└─┬─┘               └─┬─┘ ░        ░  ┌───────┐  ░ ┌─┐ ░     ░ 
q_1: ┤ H ├──■────■────■─────────┼───░────────░──┤ Ry(0) ├──░─┤M├─░─────░─
     ├───┤       │    │         │   ░        ░ ┌┴───────┴┐ ░ └╥┘ ░ ┌─┐ ░ 
q_2: ┤ H ├───────┼────■────■────■───░────────░─┤ Ry(π/4) ├─░──╫──░─┤M├─░─
     ├───┤     ┌─┴─┐  │  ┌─┴─┐      ░ ┌─┐    ░ └─────────┘ ░  ║  ░ └╥┘ ░ 
q_3: ┤ X ├─────┤ X ├──┼──┤ X ├──────░─┤M├────░─────────────░──╫──░──╫──░─
     └───┘     └───┘┌─┴─┐└───┘      ░ └╥┘┌─┐ ░             ░  ║  ░  ║  ░ 
q_4: ───────────────┤ X ├───────────░──╫─┤M├─░─────────────░──╫──░──╫──░─
                    └───┘           ░  ║ └╥┘ ░             ░  ║  ░  ║  ░ 
c: 5/══════════════════════════════════╩══╩═══════════════════╩═════╩════
                                       3  4                   1     2    

q0 ALWAYS 0

COUNTS
{'00110': 7393, '00100': 42871, '11010': 7457, '01100': 7264, '01000': 42280, '00000': 7287, '00010': 42788, '11110': 42660}

 A1B0
     ┌───┐┌───┐               ┌───┐ ░        ░              ░     ░     ░ 
q_0: ┤ X ├┤ X ├───────────────┤ X ├─░────────░──────────────░─────░─────░─
     ├───┤└─┬─┘               └─┬─┘ ░        ░ ┌──────────┐ ░ ┌─┐ ░     ░ 
q_1: ┤ H ├──■────■────■─────────┼───░────────░─┤ Ry(-π/2) ├─░─┤M├─░─────░─
     ├───┤       │    │         │   ░        ░ ├──────────┤ ░ └╥┘ ░ ┌─┐ ░ 
q_2: ┤ H ├───────┼────■────■────■───░────────░─┤ Ry(-π/4) ├─░──╫──░─┤M├─░─
     ├───┤     ┌─┴─┐  │  ┌─┴─┐      ░ ┌─┐    ░ └──────────┘ ░  ║  ░ └╥┘ ░ 
q_3: ┤ X ├─────┤ X ├──┼──┤ X ├──────░─┤M├────░──────────────░──╫──░──╫──░─
     └───┘     └───┘┌─┴─┐└───┘      ░ └╥┘┌─┐ ░              ░  ║  ░  ║  ░ 
q_4: ───────────────┤ X ├───────────░──╫─┤M├─░──────────────░──╫──░──╫──░─
                    └───┘           ░  ║ └╥┘ ░              ░  ║  ░  ║  ░ 
c: 5/══════════════════════════════════╩══╩════════════════════╩═════╩════
                                       3  4                    1     2    

q0 ALWAYS 0

COUNTS
{'00100': 7253, '11010': 3615, '11000': 3668, '11100': 21477, '01010': 21565, '01110': 3669, '00110': 42312, '11110': 21498, '01000': 21325, '01100': 3754, '00010': 7362, '00000': 42502}

 A1B1
     ┌───┐┌───┐               ┌───┐ ░        ░              ░     ░     ░ 
q_0: ┤ X ├┤ X ├───────────────┤ X ├─░────────░──────────────░─────░─────░─
     ├───┤└─┬─┘               └─┬─┘ ░        ░ ┌──────────┐ ░ ┌─┐ ░     ░ 
q_1: ┤ H ├──■────■────■─────────┼───░────────░─┤ Ry(-π/2) ├─░─┤M├─░─────░─
     ├───┤       │    │         │   ░        ░ ├─────────┬┘ ░ └╥┘ ░ ┌─┐ ░ 
q_2: ┤ H ├───────┼────■────■────■───░────────░─┤ Ry(π/4) ├──░──╫──░─┤M├─░─
     ├───┤     ┌─┴─┐  │  ┌─┴─┐      ░ ┌─┐    ░ └─────────┘  ░  ║  ░ └╥┘ ░ 
q_3: ┤ X ├─────┤ X ├──┼──┤ X ├──────░─┤M├────░──────────────░──╫──░──╫──░─
     └───┘     └───┘┌─┴─┐└───┘      ░ └╥┘┌─┐ ░              ░  ║  ░  ║  ░ 
q_4: ───────────────┤ X ├───────────░──╫─┤M├─░──────────────░──╫──░──╫──░─
                    └───┘           ░  ║ └╥┘ ░              ░  ║  ░  ║  ░ 
c: 5/══════════════════════════════════╩══╩════════════════════╩═════╩════
                                       3  4                    1     2    

q0 ALWAYS 0

COUNTS
{'11010': 3708, '01110': 3677, '11000': 3651, '11110': 21292, '00110': 7226, '00010': 42639, '00000': 7383, '01100': 3535, '01000': 21279, '01010': 21436, '00100': 42768, '11100': 21406}


==============================================================================================================
TEST    q0   00     01     10     11     N       E(q1,q2)    
--------------------------------------------------------------------------------------------------------------
A0B0    --     50029  49789  49985  50197  200000    0.002260
A0B1    --     49567  50245  50135  50053  200000   -0.003800
A1B0    --     67495  32542  32484  67479  200000    0.349740
A1B1    --     32313  67783  67709  32195  200000   -0.354920
==============================================================================================================

Total CHSH = 0.70312


========================================
q0 MEASURED
========================================

 A0B0
     ┌───┐┌───┐               ┌───┐ ░    ┌─┐    ░              ░     ░     ░ 
q_0: ┤ X ├┤ X ├───────────────┤ X ├─░────┤M├────░──────────────░─────░─────░─
     ├───┤└─┬─┘               └─┬─┘ ░    └╥┘    ░  ┌───────┐   ░ ┌─┐ ░     ░ 
q_1: ┤ H ├──■────■────■─────────┼───░─────╫─────░──┤ Ry(0) ├───░─┤M├─░─────░─
     ├───┤       │    │         │   ░     ║     ░ ┌┴───────┴─┐ ░ └╥┘ ░ ┌─┐ ░ 
q_2: ┤ H ├───────┼────■────■────■───░─────╫─────░─┤ Ry(-π/4) ├─░──╫──░─┤M├─░─
     ├───┤     ┌─┴─┐  │  ┌─┴─┐      ░ ┌─┐ ║     ░ └──────────┘ ░  ║  ░ └╥┘ ░ 
q_3: ┤ X ├─────┤ X ├──┼──┤ X ├──────░─┤M├─╫─────░──────────────░──╫──░──╫──░─
     └───┘     └───┘┌─┴─┐└───┘      ░ └╥┘ ║ ┌─┐ ░              ░  ║  ░  ║  ░ 
q_4: ───────────────┤ X ├───────────░──╫──╫─┤M├─░──────────────░──╫──░──╫──░─
                    └───┘           ░  ║  ║ └╥┘ ░              ░  ║  ░  ║  ░ 
c: 5/══════════════════════════════════╩══╩══╩════════════════════╩═════╩════
                                       3  0  4                    1     2    
q0=1 -> q3=1: 100261 / 100261  (100.0000%)

COUNTS
{'00110': 7310, '01101': 7258, '01001': 42898, '11011': 7228, '11111': 42877, '00100': 42531, '00000': 7291, '00010': 42607}

 A0B1
     ┌───┐┌───┐               ┌───┐ ░    ┌─┐    ░             ░     ░     ░ 
q_0: ┤ X ├┤ X ├───────────────┤ X ├─░────┤M├────░─────────────░─────░─────░─
     ├───┤└─┬─┘               └─┬─┘ ░    └╥┘    ░  ┌───────┐  ░ ┌─┐ ░     ░ 
q_1: ┤ H ├──■────■────■─────────┼───░─────╫─────░──┤ Ry(0) ├──░─┤M├─░─────░─
     ├───┤       │    │         │   ░     ║     ░ ┌┴───────┴┐ ░ └╥┘ ░ ┌─┐ ░ 
q_2: ┤ H ├───────┼────■────■────■───░─────╫─────░─┤ Ry(π/4) ├─░──╫──░─┤M├─░─
     ├───┤     ┌─┴─┐  │  ┌─┴─┐      ░ ┌─┐ ║     ░ └─────────┘ ░  ║  ░ └╥┘ ░ 
q_3: ┤ X ├─────┤ X ├──┼──┤ X ├──────░─┤M├─╫─────░─────────────░──╫──░──╫──░─
     └───┘     └───┘┌─┴─┐└───┘      ░ └╥┘ ║ ┌─┐ ░             ░  ║  ░  ║  ░ 
q_4: ───────────────┤ X ├───────────░──╫──╫─┤M├─░─────────────░──╫──░──╫──░─
                    └───┘           ░  ║  ║ └╥┘ ░             ░  ║  ░  ║  ░ 
c: 5/══════════════════════════════════╩══╩══╩═══════════════════╩═════╩════
                                       3  0  4                   1     2    
q0=1 -> q3=1: 99937 / 99937  (100.0000%)

COUNTS
{'01101': 7234, '00110': 7416, '11011': 7152, '11111': 42588, '00100': 42654, '01001': 42963, '00000': 7527, '00010': 42466}

 A1B0
     ┌───┐┌───┐               ┌───┐ ░    ┌─┐    ░              ░     ░     ░ 
q_0: ┤ X ├┤ X ├───────────────┤ X ├─░────┤M├────░──────────────░─────░─────░─
     ├───┤└─┬─┘               └─┬─┘ ░    └╥┘    ░ ┌──────────┐ ░ ┌─┐ ░     ░ 
q_1: ┤ H ├──■────■────■─────────┼───░─────╫─────░─┤ Ry(-π/2) ├─░─┤M├─░─────░─
     ├───┤       │    │         │   ░     ║     ░ ├──────────┤ ░ └╥┘ ░ ┌─┐ ░ 
q_2: ┤ H ├───────┼────■────■────■───░─────╫─────░─┤ Ry(-π/4) ├─░──╫──░─┤M├─░─
     ├───┤     ┌─┴─┐  │  ┌─┴─┐      ░ ┌─┐ ║     ░ └──────────┘ ░  ║  ░ └╥┘ ░ 
q_3: ┤ X ├─────┤ X ├──┼──┤ X ├──────░─┤M├─╫─────░──────────────░──╫──░──╫──░─
     └───┘     └───┘┌─┴─┐└───┘      ░ └╥┘ ║ ┌─┐ ░              ░  ║  ░  ║  ░ 
q_4: ───────────────┤ X ├───────────░──╫──╫─┤M├─░──────────────░──╫──░──╫──░─
                    └───┘           ░  ║  ║ └╥┘ ░              ░  ║  ░  ║  ░ 
c: 5/══════════════════════════════════╩══╩══╩════════════════════╩═════╩════
                                       3  0  4                    1     2    
q0=1 -> q3=1: 99657 / 99657  (100.0000%)

COUNTS
{'11011': 3684, '11001': 3642, '01001': 21250, '00100': 7400, '11111': 21417, '01101': 3633, '00110': 42608, '01111': 3680, '00000': 43012, '00010': 7323, '11101': 21242, '01011': 21109}

 A1B1
     ┌───┐┌───┐               ┌───┐ ░    ┌─┐    ░              ░     ░     ░ 
q_0: ┤ X ├┤ X ├───────────────┤ X ├─░────┤M├────░──────────────░─────░─────░─
     ├───┤└─┬─┘               └─┬─┘ ░    └╥┘    ░ ┌──────────┐ ░ ┌─┐ ░     ░ 
q_1: ┤ H ├──■────■────■─────────┼───░─────╫─────░─┤ Ry(-π/2) ├─░─┤M├─░─────░─
     ├───┤       │    │         │   ░     ║     ░ ├─────────┬┘ ░ └╥┘ ░ ┌─┐ ░ 
q_2: ┤ H ├───────┼────■────■────■───░─────╫─────░─┤ Ry(π/4) ├──░──╫──░─┤M├─░─
     ├───┤     ┌─┴─┐  │  ┌─┴─┐      ░ ┌─┐ ║     ░ └─────────┘  ░  ║  ░ └╥┘ ░ 
q_3: ┤ X ├─────┤ X ├──┼──┤ X ├──────░─┤M├─╫─────░──────────────░──╫──░──╫──░─
     └───┘     └───┘┌─┴─┐└───┘      ░ └╥┘ ║ ┌─┐ ░              ░  ║  ░  ║  ░ 
q_4: ───────────────┤ X ├───────────░──╫──╫─┤M├─░──────────────░──╫──░──╫──░─
                    └───┘           ░  ║  ║ └╥┘ ░              ░  ║  ░  ║  ░ 
c: 5/══════════════════════════════════╩══╩══╩════════════════════╩═════╩════
                                       3  0  4                    1     2    
q0=1 -> q3=1: 100000 / 100000  (100.0000%)

COUNTS
{'01101': 3766, '00110': 7288, '11011': 3644, '11001': 3661, '01001': 21438, '00010': 42846, '00000': 7305, '01111': 3557, '11101': 21240, '01011': 21452, '11111': 21242, '00100': 42561}


==============================================================================================================
TEST    q0   00     01     10     11     N       E(q1,q2)    
--------------------------------------------------------------------------------------------------------------
A0B0    0       7291  42607  42531   7310   99739   -0.707216
A0B0    1      42898   7228   7258  42877  100261    0.711034
A0B1    0       7527  42466  42654   7416  100063   -0.701328
A0B1    1      42963   7152   7234  42588   99937    0.712099
A1B0    0      43012   7323   7400  42608  100343    0.706547
A1B0    1      24892  24793  24875  25097   99657    0.003221
A1B1    0       7305  42846  42561   7288  100000   -0.708140
A1B1    1      25099  25096  25006  24799  100000   -0.002040
==============================================================================================================

Total CHSH = 0.7198800000000001

Conditional CHSH
q0=0 : 0.00614254876732534
q0=1 : 1.428393871063332

Alternative CHSH q0=0
S0_alt = 2.8232305419315775
2*sqrt(2) = 2.8284271247461903


========================================
q0 NOT MEASURED
========================================

 A0B0
     ┌───┐┌───┐               ┌───┐ ░     ░              ░     ░     ░    
q_0: ┤ X ├┤ X ├───────────────┤ X ├─░─────░──────────────░─────░─────░────
     ├───┤└─┬─┘               └─┬─┘ ░     ░  ┌───────┐   ░ ┌─┐ ░     ░    
q_1: ┤ H ├──■────■────■─────────┼───░─────░──┤ Ry(0) ├───░─┤M├─░─────░────
     ├───┤       │    │         │   ░     ░ ┌┴───────┴─┐ ░ └╥┘ ░ ┌─┐ ░    
q_2: ┤ H ├───────┼────■────■────■───░─────░─┤ Ry(-π/4) ├─░──╫──░─┤M├─░────
     ├───┤     ┌─┴─┐  │  ┌─┴─┐      ░     ░ └──────────┘ ░  ║  ░ └╥┘ ░ ┌─┐
q_3: ┤ X ├─────┤ X ├──┼──┤ X ├──────░─────░──────────────░──╫──░──╫──░─┤M├
     └───┘     └───┘┌─┴─┐└───┘      ░ ┌─┐ ░              ░  ║  ░  ║  ░ └╥┘
q_4: ───────────────┤ X ├───────────░─┤M├─░──────────────░──╫──░──╫──░──╫─
                    └───┘           ░ └╥┘ ░              ░  ║  ░  ║  ░  ║ 
c: 5/══════════════════════════════════╩════════════════════╩═════╩═════╩═
                                       4                    1     2     3 

q0 ALWAYS 0

COUNTS
{'11010': 7451, '00110': 7169, '11110': 42792, '01100': 7321, '01000': 42443, '00100': 42538, '00000': 7350, '00010': 42936}

 A0B1
     ┌───┐┌───┐               ┌───┐ ░     ░             ░     ░     ░    
q_0: ┤ X ├┤ X ├───────────────┤ X ├─░─────░─────────────░─────░─────░────
     ├───┤└─┬─┘               └─┬─┘ ░     ░  ┌───────┐  ░ ┌─┐ ░     ░    
q_1: ┤ H ├──■────■────■─────────┼───░─────░──┤ Ry(0) ├──░─┤M├─░─────░────
     ├───┤       │    │         │   ░     ░ ┌┴───────┴┐ ░ └╥┘ ░ ┌─┐ ░    
q_2: ┤ H ├───────┼────■────■────■───░─────░─┤ Ry(π/4) ├─░──╫──░─┤M├─░────
     ├───┤     ┌─┴─┐  │  ┌─┴─┐      ░     ░ └─────────┘ ░  ║  ░ └╥┘ ░ ┌─┐
q_3: ┤ X ├─────┤ X ├──┼──┤ X ├──────░─────░─────────────░──╫──░──╫──░─┤M├
     └───┘     └───┘┌─┴─┐└───┘      ░ ┌─┐ ░             ░  ║  ░  ║  ░ └╥┘
q_4: ───────────────┤ X ├───────────░─┤M├─░─────────────░──╫──░──╫──░──╫─
                    └───┘           ░ └╥┘ ░             ░  ║  ░  ║  ░  ║ 
c: 5/══════════════════════════════════╩═══════════════════╩═════╩═════╩═
                                       4                   1     2     3 

q0 ALWAYS 0

COUNTS
{'11010': 7316, '00110': 7250, '11110': 42629, '01100': 7201, '01000': 42776, '00100': 42883, '00000': 7358, '00010': 42587}

 A1B0
     ┌───┐┌───┐               ┌───┐ ░     ░              ░     ░     ░    
q_0: ┤ X ├┤ X ├───────────────┤ X ├─░─────░──────────────░─────░─────░────
     ├───┤└─┬─┘               └─┬─┘ ░     ░ ┌──────────┐ ░ ┌─┐ ░     ░    
q_1: ┤ H ├──■────■────■─────────┼───░─────░─┤ Ry(-π/2) ├─░─┤M├─░─────░────
     ├───┤       │    │         │   ░     ░ ├──────────┤ ░ └╥┘ ░ ┌─┐ ░    
q_2: ┤ H ├───────┼────■────■────■───░─────░─┤ Ry(-π/4) ├─░──╫──░─┤M├─░────
     ├───┤     ┌─┴─┐  │  ┌─┴─┐      ░     ░ └──────────┘ ░  ║  ░ └╥┘ ░ ┌─┐
q_3: ┤ X ├─────┤ X ├──┼──┤ X ├──────░─────░──────────────░──╫──░──╫──░─┤M├
     └───┘     └───┘┌─┴─┐└───┘      ░ ┌─┐ ░              ░  ║  ░  ║  ░ └╥┘
q_4: ───────────────┤ X ├───────────░─┤M├─░──────────────░──╫──░──╫──░──╫─
                    └───┘           ░ └╥┘ ░              ░  ║  ░  ║  ░  ║ 
c: 5/══════════════════════════════════╩════════════════════╩═════╩═════╩═
                                       4                    1     2     3 

q0 ALWAYS 0

COUNTS
{'00100': 7394, '01110': 3695, '11010': 3726, '00110': 43022, '01010': 21309, '00010': 7299, '00000': 42670, '11100': 21342, '11000': 3673, '01100': 3597, '01000': 21027, '11110': 21246}

 A1B1
     ┌───┐┌───┐               ┌───┐ ░     ░              ░     ░     ░    
q_0: ┤ X ├┤ X ├───────────────┤ X ├─░─────░──────────────░─────░─────░────
     ├───┤└─┬─┘               └─┬─┘ ░     ░ ┌──────────┐ ░ ┌─┐ ░     ░    
q_1: ┤ H ├──■────■────■─────────┼───░─────░─┤ Ry(-π/2) ├─░─┤M├─░─────░────
     ├───┤       │    │         │   ░     ░ ├─────────┬┘ ░ └╥┘ ░ ┌─┐ ░    
q_2: ┤ H ├───────┼────■────■────■───░─────░─┤ Ry(π/4) ├──░──╫──░─┤M├─░────
     ├───┤     ┌─┴─┐  │  ┌─┴─┐      ░     ░ └─────────┘  ░  ║  ░ └╥┘ ░ ┌─┐
q_3: ┤ X ├─────┤ X ├──┼──┤ X ├──────░─────░──────────────░──╫──░──╫──░─┤M├
     └───┘     └───┘┌─┴─┐└───┘      ░ ┌─┐ ░              ░  ║  ░  ║  ░ └╥┘
q_4: ───────────────┤ X ├───────────░─┤M├─░──────────────░──╫──░──╫──░──╫─
                    └───┘           ░ └╥┘ ░              ░  ║  ░  ║  ░  ║ 
c: 5/══════════════════════════════════╩════════════════════╩═════╩═════╩═
                                       4                    1     2     3 

q0 ALWAYS 0

COUNTS
{'01110': 3776, '11010': 3674, '00110': 7223, '01100': 3611, '01000': 21380, '11000': 3648, '00000': 7315, '00010': 42571, '01010': 21662, '00100': 42361, '11110': 21422, '11100': 21357}


==============================================================================================================
TEST    q0   00     01     10     11     N       E(q1,q2)    
--------------------------------------------------------------------------------------------------------------
A0B0    --     49793  50387  49859  49961  200000   -0.002460
A0B1    --     50134  49903  50084  49879  200000    0.000130
A1B0    --     67370  32334  32333  67963  200000    0.353330
A1B1    --     32343  67907  67329  32421  200000   -0.352360
==============================================================================================================

Total CHSH = 0.70336


========================================
q0 MEASURED
========================================

 A0B0
     ┌───┐┌───┐               ┌───┐ ░     ░              ░     ░     ░    ┌─┐
q_0: ┤ X ├┤ X ├───────────────┤ X ├─░─────░──────────────░─────░─────░────┤M├
     ├───┤└─┬─┘               └─┬─┘ ░     ░  ┌───────┐   ░ ┌─┐ ░     ░    └╥┘
q_1: ┤ H ├──■────■────■─────────┼───░─────░──┤ Ry(0) ├───░─┤M├─░─────░─────╫─
     ├───┤       │    │         │   ░     ░ ┌┴───────┴─┐ ░ └╥┘ ░ ┌─┐ ░     ║ 
q_2: ┤ H ├───────┼────■────■────■───░─────░─┤ Ry(-π/4) ├─░──╫──░─┤M├─░─────╫─
     ├───┤     ┌─┴─┐  │  ┌─┴─┐      ░     ░ └──────────┘ ░  ║  ░ └╥┘ ░ ┌─┐ ║ 
q_3: ┤ X ├─────┤ X ├──┼──┤ X ├──────░─────░──────────────░──╫──░──╫──░─┤M├─╫─
     └───┘     └───┘┌─┴─┐└───┘      ░ ┌─┐ ░              ░  ║  ░  ║  ░ └╥┘ ║ 
q_4: ───────────────┤ X ├───────────░─┤M├─░──────────────░──╫──░──╫──░──╫──╫─
                    └───┘           ░ └╥┘ ░              ░  ║  ░  ║  ░  ║  ║ 
c: 5/══════════════════════════════════╩════════════════════╩═════╩═════╩══╩═
                                       4                    1     2     3  0 
q0=1 -> q3=1: 100030 / 100030  (100.0000%)

COUNTS
{'11011': 7328, '01101': 7348, '00110': 7424, '00000': 7335, '00010': 42513, '00100': 42698, '11111': 42901, '01001': 42453}

 A0B1
     ┌───┐┌───┐               ┌───┐ ░     ░             ░     ░     ░    ┌─┐
q_0: ┤ X ├┤ X ├───────────────┤ X ├─░─────░─────────────░─────░─────░────┤M├
     ├───┤└─┬─┘               └─┬─┘ ░     ░  ┌───────┐  ░ ┌─┐ ░     ░    └╥┘
q_1: ┤ H ├──■────■────■─────────┼───░─────░──┤ Ry(0) ├──░─┤M├─░─────░─────╫─
     ├───┤       │    │         │   ░     ░ ┌┴───────┴┐ ░ └╥┘ ░ ┌─┐ ░     ║ 
q_2: ┤ H ├───────┼────■────■────■───░─────░─┤ Ry(π/4) ├─░──╫──░─┤M├─░─────╫─
     ├───┤     ┌─┴─┐  │  ┌─┴─┐      ░     ░ └─────────┘ ░  ║  ░ └╥┘ ░ ┌─┐ ║ 
q_3: ┤ X ├─────┤ X ├──┼──┤ X ├──────░─────░─────────────░──╫──░──╫──░─┤M├─╫─
     └───┘     └───┘┌─┴─┐└───┘      ░ ┌─┐ ░             ░  ║  ░  ║  ░ └╥┘ ║ 
q_4: ───────────────┤ X ├───────────░─┤M├─░─────────────░──╫──░──╫──░──╫──╫─
                    └───┘           ░ └╥┘ ░             ░  ║  ░  ║  ░  ║  ║ 
c: 5/══════════════════════════════════╩═══════════════════╩═════╩═════╩══╩═
                                       4                   1     2     3  0 
q0=1 -> q3=1: 99609 / 99609  (100.0000%)

COUNTS
{'11011': 7280, '00000': 7432, '00010': 42712, '01001': 42593, '01101': 7331, '00110': 7407, '11111': 42405, '00100': 42840}

 A1B0
     ┌───┐┌───┐               ┌───┐ ░     ░              ░     ░     ░    ┌─┐
q_0: ┤ X ├┤ X ├───────────────┤ X ├─░─────░──────────────░─────░─────░────┤M├
     ├───┤└─┬─┘               └─┬─┘ ░     ░ ┌──────────┐ ░ ┌─┐ ░     ░    └╥┘
q_1: ┤ H ├──■────■────■─────────┼───░─────░─┤ Ry(-π/2) ├─░─┤M├─░─────░─────╫─
     ├───┤       │    │         │   ░     ░ ├──────────┤ ░ └╥┘ ░ ┌─┐ ░     ║ 
q_2: ┤ H ├───────┼────■────■────■───░─────░─┤ Ry(-π/4) ├─░──╫──░─┤M├─░─────╫─
     ├───┤     ┌─┴─┐  │  ┌─┴─┐      ░     ░ └──────────┘ ░  ║  ░ └╥┘ ░ ┌─┐ ║ 
q_3: ┤ X ├─────┤ X ├──┼──┤ X ├──────░─────░──────────────░──╫──░──╫──░─┤M├─╫─
     └───┘     └───┘┌─┴─┐└───┘      ░ ┌─┐ ░              ░  ║  ░  ║  ░ └╥┘ ║ 
q_4: ───────────────┤ X ├───────────░─┤M├─░──────────────░──╫──░──╫──░──╫──╫─
                    └───┘           ░ └╥┘ ░              ░  ║  ░  ║  ░  ║  ║ 
c: 5/══════════════════════════════════╩════════════════════╩═════╩═════╩══╩═
                                       4                    1     2     3  0 
q0=1 -> q3=1: 99491 / 99491  (100.0000%)

COUNTS
{'01111': 3489, '00010': 7230, '00000': 43110, '01011': 21316, '11101': 21212, '01001': 21255, '01101': 3593, '00110': 42864, '11001': 3718, '11011': 3575, '00100': 7305, '11111': 21333}

 A1B1
     ┌───┐┌───┐               ┌───┐ ░     ░              ░     ░     ░    ┌─┐
q_0: ┤ X ├┤ X ├───────────────┤ X ├─░─────░──────────────░─────░─────░────┤M├
     ├───┤└─┬─┘               └─┬─┘ ░     ░ ┌──────────┐ ░ ┌─┐ ░     ░    └╥┘
q_1: ┤ H ├──■────■────■─────────┼───░─────░─┤ Ry(-π/2) ├─░─┤M├─░─────░─────╫─
     ├───┤       │    │         │   ░     ░ ├─────────┬┘ ░ └╥┘ ░ ┌─┐ ░     ║ 
q_2: ┤ H ├───────┼────■────■────■───░─────░─┤ Ry(π/4) ├──░──╫──░─┤M├─░─────╫─
     ├───┤     ┌─┴─┐  │  ┌─┴─┐      ░     ░ └─────────┘  ░  ║  ░ └╥┘ ░ ┌─┐ ║ 
q_3: ┤ X ├─────┤ X ├──┼──┤ X ├──────░─────░──────────────░──╫──░──╫──░─┤M├─╫─
     └───┘     └───┘┌─┴─┐└───┘      ░ ┌─┐ ░              ░  ║  ░  ║  ░ └╥┘ ║ 
q_4: ───────────────┤ X ├───────────░─┤M├─░──────────────░──╫──░──╫──░──╫──╫─
                    └───┘           ░ └╥┘ ░              ░  ║  ░  ║  ░  ║  ║ 
c: 5/══════════════════════════════════╩════════════════════╩═════╩═════╩══╩═
                                       4                    1     2     3  0 
q0=1 -> q3=1: 100023 / 100023  (100.0000%)

COUNTS
{'01111': 3642, '11001': 3699, '11011': 3622, '01001': 21213, '11101': 21516, '01011': 21290, '00000': 7206, '00010': 42424, '11111': 21446, '00100': 42964, '01101': 3595, '00110': 7383}


==============================================================================================================
TEST    q0   00     01     10     11     N       E(q1,q2)    
--------------------------------------------------------------------------------------------------------------
A0B0    0       7335  42513  42698   7424   99970   -0.704731
A0B0    1      42453   7328   7348  42901  100030    0.706568
A0B1    0       7432  42712  42840   7407  100391   -0.704376
A0B1    1      42593   7280   7331  42405   99609    0.706633
A1B0    0      43110   7230   7305  42864  100509    0.710772
A1B0    1      24973  24891  24805  24822   99491    0.000995
A1B1    0       7206  42424  42964   7383   99977   -0.708153
A1B1    1      24912  24912  25111  25088  100023   -0.000230
==============================================================================================================

Total CHSH = 0.7113

Conditional CHSH
q0=0 : 0.009817735122860105
q0=1 : 1.4144259763584974

Alternative CHSH q0=0
S0_alt = 2.828032354512611
2*sqrt(2) = 2.8284271247461903

