#!/usr/bin/env python3
"""
Capitoli 10, 12 e 13: bilancio dei gate dei due candidati finanziari su
hardware con connettività limitata (heavy-hex o reticolo quadrato).

Modello (ipotesi dichiarate, v. cap. 2, eq. macc-denso):
  QUBO denso su n variabili: uno strato di costo con swap network costa
      G_costo = 3 n (n-1) / 2  gate a due qubit;
  miscelatore XY ad anello (conserva la cardinalità): 2 gate a due qubit per
      coppia adiacente, n coppie per strato, G_mix = 2 n;
  QAOA a p strati: G = p (G_costo + G_mix);
  proposta MCMC su un modello con accoppiamenti a tutte le coppie: ogni passo
      di Trotter costa 3 n (n-1) / 2 gate; si usano 10 passi.
  Lambda = G * eps, probabilità di un'esecuzione senza errori e^{-Lambda}.
Errori per gate: 1,5e-3 (mediano dell'esperimento OLE) e 5e-4 (ipotesi di
un miglioramento di tre volte). È un limite d'ordine di grandezza: il costo
effettivo dipende dal cono causale dell'osservabile e dalla compilazione.

Produce:
    c10_tabella_bilancio.txt
"""

import math

from comune import scrivi_txt, it, it_sci


def fmt_p(x):
    return it(x, 2) if x >= 0.01 else it_sci(x, 1)


righe = []
for nome, n, G in (
        ("QAOA, p = 1", 20, 3 * 20 * 19 // 2 + 2 * 20),
        ("QAOA, p = 1", 50, 3 * 50 * 49 // 2 + 2 * 50),
        ("QAOA, p = 2", 50, 2 * (3 * 50 * 49 // 2 + 2 * 50)),
        ("QAOA, p = 1", 100, 3 * 100 * 99 // 2 + 2 * 100),
        ("QAOA, p = 1", 156, 3 * 156 * 155 // 2 + 2 * 156),
        ("proposta MCMC, 10 passi", 10, 10 * 3 * 10 * 9 // 2),
        ("proposta MCMC, 10 passi", 20, 10 * 3 * 20 * 19 // 2),
        ("proposta MCMC, 10 passi", 60, 10 * 3 * 60 * 59 // 2)):
    L1, L2 = G * 1.5e-3, G * 5e-4
    righe.append([nome, str(n), it(G, 0), it(L1, 1), fmt_p(math.exp(-L1)), it(L2, 1), fmt_p(math.exp(-L2))])
    print(nome, n, G, round(L1, 2), math.exp(-L1), round(L2, 2), math.exp(-L2))
scrivi_txt("c10_tabella_bilancio.txt",
           ["circuito", "n", "gate a due qubit", "Lambda (eps = 0,15%)", "e^-Lambda",
            "Lambda (eps = 0,05%)", "e^-Lambda"], righe,
           "swap network 3n(n-1)/2 gate per strato di interazioni a tutte le coppie; miscelatore XY 2n; Lambda = G eps")
