diff --git a/code/exp_users_csi.py b/code/exp_users_csi.py index 4d4a4dc..ed058e6 100644 --- a/code/exp_users_csi.py +++ b/code/exp_users_csi.py @@ -27,6 +27,7 @@ sys.path.insert(0, str(Path(__file__).resolve().parent)) import sse_lib as L from sse_lib import DATA, DEVICE, rayleigh_gain, snr_to_sigma2, eval_ser_sse from exp_full import (main_model, base_keys, get_model, eve_wrong_mask, + oma_ser_keylen, eval_ser_eve, mean_abs_xcorr, MAIN_D) SNR = 10.0 @@ -112,12 +113,15 @@ def main(): ew = eve_wrong_mask(U, Lp, seed=20260813) ev = eval_ser_eve(m, ew, [SNR], frames=FRAMES)[0] xc = mean_abs_xcorr(m.masks().detach()) - rows.append((U, "%.6f" % lg, "%.6f" % ev, "%.6f" % xc)) + # OMA gets its own d/U dimensions per user at this load + oma = oma_ser_keylen(MAIN_D // U, SNR) + rows.append((U, "%.6f" % lg, "%.6f" % ev, "%.6f" % xc, + "%.6f" % oma)) print(" U=%2d legit %.4f eve %.5f xcorr %.2e" % (U, lg, ev, xc), flush=True) with open(DATA / "users.csv", "w", newline="") as f: w = csv.writer(f) - w.writerow(["users", "legit_ser", "eve_ser", "mask_xcorr"]) + w.writerow(["users", "legit_ser", "eve_ser", "mask_xcorr", "oma"]) w.writerows(rows) print("[csv]", DATA / "users.csv", flush=True) diff --git a/code/replot_security.py b/code/replot_security.py index 4e67e45..8b74a0e 100644 --- a/code/replot_security.py +++ b/code/replot_security.py @@ -347,7 +347,6 @@ def fig_jam(): ax.set_xlabel("JSR (dB)") ax.set_ylabel("SER") ax.set_xlim(min(x), max(x)) - ax.set_ylim(0.0, 1.02) # keep the reference line off the spine place_legend(ax) save(fig, "fig_sec_jam") @@ -386,11 +385,11 @@ def fig_brute(): x = col(r, "K") fig, ax = plt.subplots() ax.semilogx(x, col(r, "ser_perm"), color=C_EVE, marker="s", ls="--", - label=LBL["perm"], **UNDER) + markevery=(0, 3), label=LBL["perm"], **UNDER) ax.semilogx(x, col(r, "ser_pad"), color=C_PUB, marker="v", ls="-.", - label=LBL["pad"], **OVER) + markevery=(1, 3), label=LBL["pad"], **OVER) ax.semilogx(x, col(r, "ser_mask"), color=C_LEGIT, marker="o", ls="-", - label=LBL["mask"]) + markevery=(2, 3), label=LBL["mask"]) legit = main_legit() ax.axhline(legit, color=C_OMA, ls=(0, (4, 2)), lw=0.9, label=LBL["legit"]) @@ -430,16 +429,18 @@ def fig_kpa(): fig, ax = plt.subplots() sty = {0.0: (C_LEGIT, "o"), 10.0: (C_EVE, "s"), 20.0: (C_PUB, "v")} - for snr, (c, mk) in sty.items(): + for off, (snr, (c, mk)) in enumerate(sty.items()): rows = [row for row in r if float(row["snr_db"]) == snr] n = [float(row["n_frames"]) for row in rows] ser = [float(row["eve_ser"]) for row in rows] ax.semilogx(n, ser, color=c, marker=mk, ls="-", + markevery=(off, 4), markerfacecolor="none" if off else c, label=LBL["mask"] + f", {int(snr)} dB") try: p = load("pkpa.csv") ax.semilogx(col(p, "n_frames"), col(p, "eve_ser"), color=C_MATCH, - marker="P", ls="--", label=LBL["perm"] + ", 20 dB") + marker="P", ls="--", markevery=(3, 4), + label=LBL["perm"] + ", 20 dB") except FileNotFoundError: print("[skip] pkpa.csv not present yet") # legitimate reference measured with the SAME estimator as the diff --git a/code/verify_math.py b/code/verify_math.py index eb6264c..7d854df 100644 --- a/code/verify_math.py +++ b/code/verify_math.py @@ -130,7 +130,7 @@ def v3_leakage_vs_correlation(): corrs.append(abs((m @ mt) / D)) emp = float(np.mean(corrs)) claim = float(np.sqrt(2.0 / (np.pi * D))) - ok_b = report("V3b random mask E|corr|", claim, emp, 0.1 * claim) + ok_b = report("V3b random mask E|corr|", claim, emp, 0.03 * claim) return lin_ok and ok_b @@ -158,7 +158,7 @@ def v4_blind_jammer_spread(): # full contribution scales this by (hJ^2/hu^2) rho. ok2 = report("V4b blind jammer projection variance", float(np.mean(var_cl)), float(np.mean(var_emp)), - 0.05 * float(np.mean(var_cl))) + 0.01 * float(np.mean(var_cl))) return ok1 and ok2 @@ -282,10 +282,10 @@ def v8_cross_period_terms(): diag = float((a ** 2).sum()) rel.append((float((a.sum(0) ** 2).sum()) - diag) / diag) mean = sum(rel) / len(rel) - ok = abs(mean) < 0.01 + ok = abs(mean) < 0.0005 print("V8 cross-period remainder, mean %+.4f of the retained term" % mean) ROWS.append(("V8 cross-period remainder", "0.0", "%.6f" % mean, - "%.6f" % abs(mean), "0.01", "PASS" if ok else "FAIL")) + "%.6f" % abs(mean), "0.0005", "PASS" if ok else "FAIL")) return ok diff --git a/fig/fig_sec_brute.pdf b/fig/fig_sec_brute.pdf index 060d6bc..910f2e1 100644 Binary files a/fig/fig_sec_brute.pdf and b/fig/fig_sec_brute.pdf differ diff --git a/fig/fig_sec_jam.pdf b/fig/fig_sec_jam.pdf index 116fdd9..9e4875a 100644 Binary files a/fig/fig_sec_jam.pdf and b/fig/fig_sec_jam.pdf differ diff --git a/fig/fig_sec_keylen.pdf b/fig/fig_sec_keylen.pdf index a6005f9..96d3345 100644 Binary files a/fig/fig_sec_keylen.pdf and b/fig/fig_sec_keylen.pdf differ diff --git a/fig/fig_sec_kpa.pdf b/fig/fig_sec_kpa.pdf index 9e90f84..2121a2f 100644 Binary files a/fig/fig_sec_kpa.pdf and b/fig/fig_sec_kpa.pdf differ diff --git a/fig/fig_sec_real.pdf b/fig/fig_sec_real.pdf index f4787a4..8f78693 100644 Binary files a/fig/fig_sec_real.pdf and b/fig/fig_sec_real.pdf differ diff --git a/fig/fig_sec_sens.pdf b/fig/fig_sec_sens.pdf index 1172134..e43c078 100644 Binary files a/fig/fig_sec_sens.pdf and b/fig/fig_sec_sens.pdf differ diff --git a/fig/fig_sec_snr.pdf b/fig/fig_sec_snr.pdf index 54a0c1e..76752c2 100644 Binary files a/fig/fig_sec_snr.pdf and b/fig/fig_sec_snr.pdf differ