From 358faecc0c6eb4f9fdaf6b2a44dcd602bc4f1f0b Mon Sep 17 00:00:00 2001 From: KiHoLee Date: Mon, 17 Aug 2026 02:12:10 +0900 Subject: [PATCH] v2 design: independent masks + affinity-aware Wiener demultiplexer Redesign after the independent-mask dominance finding: the affinity now parameterizes the receiver (closed-form Wiener) instead of the mask ensemble. New Theorem 1 (spectral closed form), floors sqrt(1-b^2)/2 vs 1/2, full-cooperation bound with equality at b=1. GPU (torch) Monte Carlo backend, decision-directed SIC baseline, TikZ block diagram source, verification suite V1-V11. --- README.md | 82 ++-- code/fig_real_merged.py | 284 +++++--------- code/refine_matched.py | 259 +++++++------ code/replot_all.py | 179 +++++++++ code/replot_merged.py | 5 +- code/replot_sic.py | 43 --- code/revision_sims.py | 631 +++++++++---------------------- code/revision_sims_gpu.py | 416 ++++++++++++++++++++ code/verify_math.py | 563 +++++++++++---------------- data/bertvit_merged.csv | 22 +- data/beta_sweep_corrected.csv | 398 +++++++++---------- data/cosine_ceiling.csv | 3 + data/csi_error.csv | 14 +- data/floor_validation.csv | 70 ++-- data/mask_family_rev.csv | 20 +- data/mismatch.csv | 8 + data/multiuser_corrected.csv | 80 ++-- data/rate_corrected.csv | 115 ++++-- data/rayleigh_mse.csv | 3 + data/sic_comparison.csv | 22 +- data/theorem_check.csv | 8 +- fig/block_diagram.pdf | Bin 44321 -> 72614 bytes fig/block_diagram_src.tex | 66 ++++ fig/fig_bertvit_merged.pdf | Bin 24877 -> 23827 bytes fig/fig_beta_sweep_corrected.pdf | Bin 27887 -> 28415 bytes fig/fig_floor.pdf | Bin 42317 -> 45637 bytes fig/fig_multiuser_corrected.pdf | Bin 30400 -> 29789 bytes fig/fig_rate_corrected.pdf | Bin 23974 -> 24140 bytes fig/fig_sic.pdf | Bin 20495 -> 23615 bytes 29 files changed, 1777 insertions(+), 1514 deletions(-) create mode 100644 code/replot_all.py delete mode 100644 code/replot_sic.py create mode 100644 code/revision_sims_gpu.py create mode 100644 data/cosine_ceiling.csv create mode 100644 data/mismatch.csv create mode 100644 data/rayleigh_mse.csv create mode 100644 fig/block_diagram_src.tex diff --git a/README.md b/README.md index cd1d1aa..ea16dd0 100644 --- a/README.md +++ b/README.md @@ -10,66 +10,78 @@ This repository contains the simulation code, the raw result data, and the figure files behind every numerical claim in the paper. It is private during peer review and will be made public upon publication. +The design under test: each user applies an independent Haar +orthogonal mask, and the receiver runs a matched filter followed by +the closed-form affinity-aware Wiener demultiplexer, which harvests +the coherent interference component that the measured pairwise +affinity `beta` predicts. The affinity-blind reference sets `beta = 0` +in the same filter. + ## Layout | Folder | Contents | |---|---| -| `code/` | Simulation and plotting scripts (Python, CPU only) | +| `code/` | Simulation and plotting scripts (Python) | | `data/` | Raw results written by the scripts, one CSV per experiment | -| `fig/` | Figure PDFs included in the manuscript | +| `fig/` | Figure PDFs included in the manuscript (`block_diagram_src.tex` is the TikZ source of Fig. 1) | ## Requirements -Python 3.10 or later with `numpy` and `matplotlib`. The Fig. 4 -experiment additionally uses `torch` (CPU build is sufficient). No GPU -is required. Every script fixes the seed 2026 and writes its raw output -to `data/`, so plotting is decoupled from simulation. +Python 3.10 or later with `numpy` and `matplotlib`. The Monte Carlo +experiments in `revision_sims_gpu.py`, `fig_real_merged.py`, and +`refine_matched.py` use `torch` (CUDA when available; the scripts fall +back to CPU). All random draws come from the numpy generator with the +fixed seed 2026 — torch only accelerates QR, matrix products, and +linear solves — and every script writes its raw output to `data/`, so +plotting is fully decoupled from simulation. ## Reproducing the figures -Run the scripts from inside `code/`. +Run the scripts from inside `code/`. All plots are rendered from +`data/` only, by `replot_all.py` (Figs. 2, 3, 5, 6, 7) and +`replot_merged.py` (Fig. 4). -| Figure | Content | Script | Data | +| Figure | Content | Simulation | Data | |---|---|---|---| -| Fig. 2 | Per-user MSE and self-interference floor | `revision_sims.py E1` | `floor_validation.csv` | +| Fig. 1 | System diagram | `latexmk -pdf fig/block_diagram_src.tex` | — | +| Fig. 2 | Per-user MSE, aware vs blind floor | `revision_sims.py E1` | `floor_validation.csv` | | Fig. 3 | Effective sum rate at the CLIP affinity | `revision_sims.py E7a` | `rate_corrected.csv` | -| Fig. 4 | Cosine recovery on real BERT+ViT pairs | `fig_real_merged.py`, then `refine_matched.py`; replot with `replot_merged.py` | `bertvit_merged.csv` | -| Fig. 5 | Realizable versus genie-aided SIC | `revision_sims.py E2`; replot with `replot_sic.py` | `sic_comparison.csv` | -| Fig. 6 | Affinity sweep and crossover | `revision_sims.py E7a` | `beta_sweep_corrected.csv` | -| Fig. 7 | Multi-user scaling | `revision_sims.py E7c` | `multiuser_corrected.csv` | - -Fig. 1 is a system diagram and has no simulation behind it. +| Fig. 4 | Cosine recovery on real BERT+ViT pairs | `fig_real_merged.py`, then `refine_matched.py` | `bertvit_merged.csv` | +| Fig. 5 | Receiver comparison under Rayleigh fading | `revision_sims_gpu.py E2` | `sic_comparison.csv` | +| Fig. 6 | Value of the measured affinity | `revision_sims.py E7a` | `beta_sweep_corrected.csv` | +| Fig. 7 | Multi-user scaling (joint Wiener) | `revision_sims_gpu.py E7c` | `multiuser_corrected.csv` | Quantities quoted in the text but not plotted come from the same -driver: `revision_sims.py E0` writes `theorem_check.csv` (Theorem 1 -constants), `E4` writes `csi_error.csv` (imperfect-CSI robustness), and -`E5` writes `mask_family_rev.csv` (Walsh–Hadamard versus Haar masks). -`revision_sims.py` with no argument runs every experiment. +drivers: `revision_sims.py E0` writes `theorem_check.csv` (Theorem 1 +validation across affinities and channel phases), +`revision_sims_gpu.py E3` writes `rayleigh_mse.csv` (unconditional +Rayleigh MSE), `E4` writes `csi_error.csv` (imperfect-CSI +robustness), `E5` writes `mask_family_rev.csv` (Walsh–Hadamard versus +Haar), `E8` writes `mismatch.csv` (affinity mismatch and +quantization), and `E9` writes `cosine_ceiling.csv` (cosine-ceiling +corollary check). ## Verifying the analysis -`verify_math.py` re-derives every closed-form expression in the paper -numerically and prints one PASS/FAIL line per item, covering the -per-realization Gram identity, Theorem 1 and its self-interference -constants, the effective-SINR corollary, the MAC-consistency -proposition, the wideband limit, both crossover conditions, the -affinity-mismatch bound, the CSI-invariance identity, the multi-user -inverse formula, and the Walsh–Hadamard construction. It depends only -on `numpy`. +`verify_math.py` re-derives every closed-form claim numerically and +prints one PASS/FAIL line per item: Theorem 1 at the equal-gain point +and under random channel phases for both users, the aware and blind +error floors and the value-of-affinity ratio, the cosine-ceiling +corollary, the blind-receiver/matched-filter cosine equivalence, the +monotonicity proposition, the full-cooperation bound with its +equality case at `beta = 1`, the finite-SNR MAC-condition boundary, +the exact Walsh–Hadamard closed form, the quadratic mismatch +stationarity, and the dominated floor of the correlated-mask +alternative from the Appendix. It depends only on `numpy`. ## Conventions The scripts follow the manuscript exactly: unit per-block transmit energy `E_b = 1` per user, `rho = E_b / sigma_n^2` as the per-block SNR with per-symbol SNR `rho/d`, complex block-Rayleigh gains unless -the evaluation point `h_u = 1` is stated, real unit-norm embeddings, -and masks drawn fresh from the Haar mixture on every realization. - -`fig_real_merged.py` also produces columns for a retrained -attention-based receiver. Those columns are kept in `bertvit_merged.csv` -for completeness but are not used by any figure in the paper. -`revision_sims.py E6` covers a high-affinity combining mode that is -outside the scope of this paper. +the evaluation point `h_u = 1` is stated, real unit-norm embeddings +with the orientation ` = +beta`, and independent Haar masks +drawn fresh on every realization. ## Citation and license diff --git a/code/fig_real_merged.py b/code/fig_real_merged.py index 17fdf5e..060315d 100644 --- a/code/fig_real_merged.py +++ b/code/fig_real_merged.py @@ -1,30 +1,30 @@ """ -Merged real-data comparison figure (replaces separate Figs 4 and 5). +Real-data comparison on cached BERT (text) + ViT (image) pairs. =================================================================== -Evaluates ALL schemes on the cached real BERT (text) + ViT (image) -embedding pairs (16 pairs, d = 768, measured mean affinity ~0.028) -under the manuscript's complex block-Rayleigh channel: +Evaluates the schemes on the cached real embedding pairs +(16 pairs, d = 768, measured mean affinity ~0.028) under the +manuscript's complex block-Rayleigh channel: r = h1 M1 e1 + h2 M2 e2 + n, n ~ CN(0, sigma^2 I), h_u ~ CN(0,1), per-block energy E_b = 1, rho = 1/sigma^2 (per-block SNR). -Schemes: - 1. EDMA : per-realisation Haar-mixture masks with the per-pair - measured beta_i, closed-form demux (13). +Schemes (v2 design: independent Haar masks per user): + 1. EDMA : affinity-aware Wiener demultiplexer with the + per-pair measured beta_i. 2. OMA : equivalent-bandwidth model, noise std x sqrt(2). 3. Genie SIC : perfect removal of the other user's waveform. - 4. Attention : retrained reproduction of the learned predecessor, - d = 768, trained on parametric pairs at the measured - mean affinity with Rayleigh channels and - channel-equalised matched-filter inputs - x_u = Re(M_u^T r / h_u); evaluated on the REAL pairs. - 5. ToDMA-adapted: OMP sparse coding of the real embedding (T = 16 + 4. ToDMA-adapted: OMP sparse coding of the real embedding (T = 16 atoms, V = 1024), T slots x L = 48 signatures, per-slot OMP detection on the complex observation, genie association, true coefficients granted. -Outputs: fig/fig_bertvit_merged.pdf, data/bertvit_merged.csv. -200 fading realisations per pair -> 3,200 Monte-Carlo samples per SNR. +The hybrid (EDMA + refinement stage) curve is produced separately by +refine_matched.py (torch) and merged by replot_merged.py. + +EDMA/OMA/genie run in torch (CUDA when available, batched over the +SNR grid); the ToDMA detector runs in numpy on the CPU. Run under +WSL for GPU acceleration. Outputs: data/bertvit_merged.csv. +NFADE fading realisations per pair; ToDMA uses the first 40. Seed fixed. """ from __future__ import annotations @@ -35,38 +35,20 @@ import time from pathlib import Path import numpy as np import torch -import matplotlib -matplotlib.use("Agg") -import matplotlib.pyplot as plt ROOT = Path(__file__).resolve().parents[1] DATA = ROOT / "data" FIG = ROOT / "fig" -plt.rcParams.update({ - "font.family": "serif", - "font.serif": ["DejaVu Serif", "Times New Roman"], - "font.size": 9, "axes.labelsize": 9, "legend.fontsize": 6.6, - "xtick.labelsize": 8, "ytick.labelsize": 8, - "axes.grid": True, "grid.linestyle": "--", "grid.linewidth": 0.4, - "grid.alpha": 0.6, "lines.linewidth": 1.4, "lines.markersize": 4.0, - "figure.figsize": (3.15, 2.36), "pdf.fonttype": 42, -}) -AXES_RECT = dict(left=0.205, right=0.965, top=0.955, bottom=0.185) - SEED = 2026 rng = np.random.default_rng(SEED) torch.manual_seed(SEED) +DEV = "cuda" if torch.cuda.is_available() else "cpu" D = 768 -SNRS = np.arange(0.0, 31.0, 5.0) -NFADE = 200 # fading realisations per pair - - -def haar(d): - G = rng.standard_normal((d, d)) - Q, R = np.linalg.qr(G) - return Q * np.sign(np.diag(R)) +SNRS = np.arange(0.0, 31.0, 2.5) +NFADE = 100 # fading realisations per pair +NFADE_TOD = 40 # ToDMA heavier: first 40 draws def unit(v): @@ -87,100 +69,35 @@ def load_pairs(): return a, b, betas -# ------------------------------------------------------------------ -# attention model: trained at the measured mean affinity, d=768, -# Rayleigh channels, channel-equalised MF inputs -# ------------------------------------------------------------------ -EPS_EQ = 0.1 # regularised equalisation h*/(|h|^2+EPS_EQ): - # caps deep-fade amplification for the learned readout +def haar_t(n, gen): + G = torch.randn(n, D, D, generator=gen, device=DEV) + Q, R = torch.linalg.qr(G) + return Q * torch.sign(torch.diagonal(R, dim1=-2, dim2=-1)).unsqueeze(-2) -def train_attention(beta0, epochs=150, steps=20, batch=48, lr=5e-4, - l1=1.0, l2=0.5, l3=0.5): - print(f"=== training attention reproduction (d={D}, beta={beta0:.3f}, " - f"{epochs} epochs, Rayleigh) ===", flush=True) - gen = torch.Generator().manual_seed(SEED) - g0 = math.sqrt(1.0 - beta0**2) - - def torch_pairs(n): - e1 = torch.nn.functional.normalize( - torch.randn(n, D, generator=gen), dim=1) - w = torch.randn(n, D, generator=gen) - w = w - (w * e1).sum(1, keepdim=True) * e1 - w = torch.nn.functional.normalize(w, dim=1) - return e1, beta0 * e1 + g0 * w - - M1 = torch.nn.Parameter(torch.linalg.qr( - torch.randn(D, D, generator=gen))[0]) - M2 = torch.nn.Parameter(beta0 * M1.detach() - + g0 * torch.linalg.qr( - torch.randn(D, D, generator=gen))[0]) - Q1 = torch.nn.Parameter(torch.randn(D, D, generator=gen) / math.sqrt(D)) - Q2 = torch.nn.Parameter(torch.randn(D, D, generator=gen) / math.sqrt(D)) - opt = torch.optim.Adam([M1, M2, Q1, Q2], lr=lr) - eye = torch.eye(D) - - t0 = time.time() - for ep in range(epochs): - for _ in range(steps): - e1, e2 = torch_pairs(batch) - snr_db = 5.0 + 20.0 * torch.rand(batch, 1, generator=gen) - sig = 10 ** (-snr_db / 20.0) - hr = torch.randn(batch, 2, generator=gen) - hi = torch.randn(batch, 2, generator=gen) - # complex channel on real signals; equalised MF real part: - # x_u = Re(M_u^T r / h_u); build via real/imag components - s1 = e1 @ M1.T - s2 = e2 @ M2.T - nr = sig * torch.randn(batch, D, generator=gen) / math.sqrt(2) - ni = sig * torch.randn(batch, D, generator=gen) / math.sqrt(2) - rr = (hr[:, :1] * s1 + hr[:, 1:2] * s2) / math.sqrt(2) + nr - ri = (hi[:, :1] * s1 + hi[:, 1:2] * s2) / math.sqrt(2) + ni - outs = [] - for u, (Mu, Qu) in enumerate(((M1, Q1), (M2, Q2))): - hu_r = hr[:, u:u+1] / math.sqrt(2) - hu_i = hi[:, u:u+1] / math.sqrt(2) - mag = hu_r**2 + hu_i**2 + EPS_EQ - xr = (rr @ Mu) - xi = (ri @ Mu) - xu = (xr * hu_r + xi * hu_i) / mag # Re(h* r'/(|h|^2+eps)) - sc = (xu @ Qu.T) / math.sqrt(D) - outs.append(D * torch.softmax(sc, dim=1) * xu) - gram = ((M1.T @ M1 - eye)**2).mean() \ - + ((M2.T @ M2 - eye)**2).mean() \ - + ((M1.T @ M2 - beta0 * eye)**2).mean() - mse = ((outs[0] - e1)**2).mean() + ((outs[1] - e2)**2).mean() - cs = torch.nn.functional.cosine_similarity( - outs[0], e1, dim=1).mean() \ - + torch.nn.functional.cosine_similarity( - outs[1], e2, dim=1).mean() - loss = l1 * gram + l2 * mse + l3 * (2.0 - cs) - opt.zero_grad(); loss.backward() - torch.nn.utils.clip_grad_norm_([M1, M2, Q1, Q2], 1.0) - opt.step() - if (ep + 1) % 50 == 0: - print(f" epoch {ep+1}: loss {float(loss.detach()):.4f}", - flush=True) - print(f" trained in {time.time()-t0:.0f}s, " - f"{4*D*D/1e6:.2f}M parameters") - return (M1.detach().numpy(), M2.detach().numpy(), - Q1.detach().numpy(), Q2.detach().numpy()) +def aware_batch(t, Q, beta, c, nvar): + """Batched affinity-aware Wiener demux. t: (b,D) cfloat, Q: (D,D), + c: complex scalar, nvar: (b,) real.""" + b = t.shape[0] + g = 1.0 - beta * beta + rho = g * abs(c)**2 / D + nvar # (b,) + Qc = Q.to(torch.cfloat) + A = torch.eye(D, device=DEV, dtype=torch.cfloat) + beta * c * Qc + S = (A @ A.mH / D).unsqueeze(0) \ + + rho.view(b, 1, 1) * torch.eye(D, device=DEV, + dtype=torch.cfloat) + x = torch.linalg.solve(S, t.unsqueeze(-1)) + return (A.mH.unsqueeze(0) @ x).squeeze(-1) / D -def att_apply(model, r, h1, h2): - M1, M2, Q1, Q2 = model - outs = [] - for u, (Mu, Qu, hu) in enumerate(((M1, Q1, h1), (M2, Q2, h2))): - xu = np.real(np.conj(hu) * (Mu.T @ r)) / (abs(hu)**2 + EPS_EQ) - sc = (Qu @ xu) / math.sqrt(D) - sc = sc - sc.max() - w = np.exp(sc); w /= w.sum() - outs.append(D * w * xu) - return outs +def abscos(a, b): + """a: (b,D) cfloat, b: (D,) float -> (b,) abs cosine.""" + num = (a * b.to(torch.cfloat).conj()).sum(1).abs() + return (num / (a.norm(dim=1) * b.norm())).cpu().numpy() # ------------------------------------------------------------------ -# ToDMA-adapted on real embeddings (complex channel) +# ToDMA-adapted on real embeddings (complex channel, numpy) # ------------------------------------------------------------------ def todma_prepare(V=1024, T=16): L = D // T @@ -238,58 +155,73 @@ def todma_run(tod, codes, h, sig, noise_slots): def main(): A, B, betas = load_pairs() npairs = len(A) - model = train_attention(float(betas.mean())) tod = todma_prepare() codes = [(omp_code(tod[0], A[i], tod[3]), omp_code(tod[0], B[i], tod[3])) for i in range(npairs)] - print("[todma] sparse codes prepared") + print(f"[todma] sparse codes prepared; device = {DEV}") - keys = ("edma", "oma", "genie", "att", "att_x", "todma") - res = {k: np.zeros(len(SNRS)) for k in keys} - cnt = {k: np.zeros(len(SNRS)) for k in keys} + gen = torch.Generator(device=DEV).manual_seed(SEED) + nb = len(SNRS) + sigs_t = torch.tensor(10 ** (-SNRS / 20.0), device=DEV, + dtype=torch.float32) + keys = ("edma", "oma", "genie", "todma") + res = {k: np.zeros(nb) for k in keys} + cnt = {k: np.zeros(nb) for k in keys} t0 = time.time() for i in range(npairs): - e1, e2, bi = A[i], B[i], float(betas[i]) - gi = 1.0 - bi**2 - c1, c2 = codes[i] + bi = float(betas[i]) + e1 = torch.tensor(A[i], dtype=torch.float32, device=DEV) + e2 = torch.tensor(B[i], dtype=torch.float32, device=DEV) + c1c, c2c = codes[i] for f in range(NFADE): - U1, U2 = haar(D), haar(D) - M1 = U1 - M2 = bi * U1 + math.sqrt(gi) * U2 - h = (rng.standard_normal(2) + 1j * rng.standard_normal(2)) \ + M = haar_t(2, gen) + M1, M2 = M[0], M[1] + Q = M1.T @ M2 + h = (torch.randn(2, generator=gen, device=DEV) + + 1j * torch.randn(2, generator=gen, device=DEV)) \ / math.sqrt(2) - h1, h2 = h - r0 = h1 * (M1 @ e1) + h2 * (M2 @ e2) - n = (rng.standard_normal(D) + 1j * rng.standard_normal(D)) \ + n = (torch.randn(D, generator=gen, device=DEV) + + 1j * torch.randn(D, generator=gen, device=DEV)) \ / math.sqrt(2) - n2 = (rng.standard_normal(D) + 1j * rng.standard_normal(D)) \ + n2 = (torch.randn(D, generator=gen, device=DEV) + + 1j * torch.randn(D, generator=gen, device=DEV)) \ / math.sqrt(2) - nslots = [(rng.standard_normal(tod[4]) - + 1j * rng.standard_normal(tod[4])) / math.sqrt(2) - for _ in range(tod[3])] - # attention scheme transmits with ITS OWN trained masks - r0a = h1 * (model[0] @ e1) + h2 * (model[1] @ e2) - for k, s in enumerate(SNRS): - sig = 10 ** (-s / 20.0) - r = r0 + sig * n - t1 = M1.T @ r / h1; t2 = M2.T @ r / h2 - g1 = (t1 - bi * (h2 / h1) * t2) / gi - g2 = (t2 - bi * (h1 / h2) * t1) / gi - res["edma"][k] += 0.5 * (cosine(g1, e1) + cosine(g2, e2)) - o1 = e1 + math.sqrt(2) * sig * n / h1 - o2 = e2 + math.sqrt(2) * sig * n2 / h2 - res["oma"][k] += 0.5 * (cosine(o1, e1) + cosine(o2, e2)) - ge1 = M1.T @ (r - h2 * (M2 @ e2)) / h1 - ge2 = M2.T @ (r - h1 * (M1 @ e1)) / h2 - res["genie"][k] += 0.5 * (cosine(ge1, e1) + cosine(ge2, e2)) - a1, a2 = att_apply(model, r0a + sig * n, h1, h2) - res["att"][k] += 0.5 * (cosine(a1, e1) + cosine(a2, e2)) - res["att_x"][k] += 0.5 * (cosine(a1, e2) + cosine(a2, e1)) - for kk in ("edma", "oma", "genie", "att", "att_x"): - cnt[kk][k] += 1 - if f < 40: # ToDMA heavier: 40 fading draws - recs = todma_run(tod, (c1, c2), (h1, h2), sig, nslots) - got = [cosine(recs[j], (e1, e2)[j]) + r0 = h[0] * (M1 @ e1).to(torch.cfloat) \ + + h[1] * (M2 @ e2).to(torch.cfloat) + r = r0.unsqueeze(0) + sigs_t.view(-1, 1) * n.unsqueeze(0) + t1 = (M1.T.to(torch.cfloat) @ r.unsqueeze(-1)).squeeze(-1) / h[0] + t2 = (M2.T.to(torch.cfloat) @ r.unsqueeze(-1)).squeeze(-1) / h[1] + c1 = (h[1] / h[0]).item() + c2 = (h[0] / h[1]).item() + v1 = sigs_t**2 / h[0].abs()**2 + v2 = sigs_t**2 / h[1].abs()**2 + g1 = aware_batch(t1, Q, bi, c1, v1) + g2 = aware_batch(t2, Q.T, bi, c2, v2) + res["edma"] += 0.5 * (abscos(g1, e1) + abscos(g2, e2)) + o1 = e1.to(torch.cfloat).unsqueeze(0) \ + + math.sqrt(2) * sigs_t.view(-1, 1) * n.unsqueeze(0) / h[0] + o2 = e2.to(torch.cfloat).unsqueeze(0) \ + + math.sqrt(2) * sigs_t.view(-1, 1) * n2.unsqueeze(0) / h[1] + res["oma"] += 0.5 * (abscos(o1, e1) + abscos(o2, e2)) + ge1 = (M1.T.to(torch.cfloat) + @ (r - h[1] * (M2 @ e2).to(torch.cfloat)).unsqueeze(-1) + ).squeeze(-1) / h[0] + ge2 = (M2.T.to(torch.cfloat) + @ (r - h[0] * (M1 @ e1).to(torch.cfloat)).unsqueeze(-1) + ).squeeze(-1) / h[1] + res["genie"] += 0.5 * (abscos(ge1, e1) + abscos(ge2, e2)) + for kk in ("edma", "oma", "genie"): + cnt[kk] += 1 + if f < NFADE_TOD: + hnp = (complex(h[0].item()), complex(h[1].item())) + nslots = [(rng.standard_normal(tod[4]) + + 1j * rng.standard_normal(tod[4])) + / math.sqrt(2) for _ in range(tod[3])] + e1n, e2n = A[i], B[i] + for k, s in enumerate(SNRS): + sig = 10 ** (-s / 20.0) + recs = todma_run(tod, (c1c, c2c), hnp, sig, nslots) + got = [cosine(recs[j], (e1n, e2n)[j]) for j in range(2) if recs[j] is not None] if got: res["todma"][k] += float(np.mean(got)) @@ -299,23 +231,6 @@ def main(): for k in keys: res[k] /= np.maximum(cnt[k], 1) - fig, ax = plt.subplots() - ax.plot(SNRS, res["edma"], "o-", color="C3", label="EDMA (closed form)") - ax.plot(SNRS, res["att"], "s--", color="C0", - label="Attention-based (retrained)") - ax.plot(SNRS, res["todma"], "d-.", color="C4", label="ToDMA-adapted") - ax.plot(SNRS, res["oma"], "v:", color="C1", label="OMA") - ax.plot(SNRS, res["genie"], "-", color="gray", lw=1.0, - label="Genie-aided SIC bound") - ax.set_xlabel("Per-block SNR $\\rho$ [dB]") - ax.set_ylabel("Mean cosine similarity") - ax.set_xlim(SNRS[0], SNRS[-1]); ax.set_ylim(0, 0.85) - ax.legend(loc="upper left") - fig.subplots_adjust(**AXES_RECT) - fig.savefig(FIG / "fig_bertvit_merged.pdf") - plt.close(fig) - print(f"[OK] wrote {FIG/'fig_bertvit_merged.pdf'}") - with open(DATA / "bertvit_merged.csv", "w", newline="") as fcsv: w = csv.writer(fcsv) w.writerow(["snr_db"] + list(keys)) @@ -323,8 +238,7 @@ def main(): w.writerow([s] + [res[key][k] for key in keys]) print(f"[OK] wrote {DATA/'bertvit_merged.csv'}") for k, s in enumerate(SNRS): - print(f" {s:4.0f} dB EDMA {res['edma'][k]:.3f} " - f"ATT {res['att'][k]:.3f} (x {res['att_x'][k]:.3f}) " + print(f" {s:4.1f} dB EDMA {res['edma'][k]:.3f} " f"ToDMA {res['todma'][k]:.3f} OMA {res['oma'][k]:.3f} " f"genie {res['genie'][k]:.3f}") diff --git a/code/refine_matched.py b/code/refine_matched.py index 0c0a852..81e48b5 100644 --- a/code/refine_matched.py +++ b/code/refine_matched.py @@ -1,23 +1,23 @@ """ -Capacity-matched EDMA refinement (parameter budget equal to the -attention scheme: 4 d^2 = 2.36M at d = 768). +Refinement stage for the v2 (affinity-aware Wiener) EDMA receiver. ================================================================ -Four-head averaged gated refinement applied to the closed-form -demultiplexer output: +Trains the single-gate refinement operator - out = (1/4) sum_k D softmax(Q_k x / sqrt(D)) .* x, + out = D softmax(W z / sqrt(D)) .* z, z = Re(e_hat), -with Q_1..Q_4 in R^{D x D} (4 d^2 parameters, exactly the -attention scheme's budget). The single-gate 0.59M refiner is the -special case of four identical heads, so the family contains it -by construction. Same training recipe: demux outputs from -parametric pairs at beta = 0.028, Haar pool 32, Rayleigh -channels, complex noise, training SNR uniform in [5, 25] dB, -Adam 5e-4 with gradient clipping, batch 48, 200 epochs. +(0.59M parameters at d = 768) on aware-demultiplexer outputs, then +warm-starts a capacity-check variant with four heads (4 d^2 = 2.36M) +and fine-tunes it, so the family contains the single gate by +construction. Training data: parametric pairs at beta = 0.028, a +fixed pool of 32 independent Haar mask pairs, Rayleigh channels, +complex noise, training SNR uniform in [5, 25] dB, Adam 5e-4 with +gradient clipping, batch 48, 220 epochs (stage 2 from epoch 120 at +lr 2e-4). Evaluation on the real BERT/ViT pairs with fresh Haar masks and -200 fading draws per pair. Appends column `edma_ref2` to -data/bertvit_merged.csv and prints all-curve numbers. +NFADE fading draws per pair. Appends columns `edma_ref` (single +gate) and `edma_ref2` (four heads) to data/bertvit_merged.csv. +Requires torch (run under WSL with CUDA if available). """ from __future__ import annotations import csv @@ -26,161 +26,182 @@ import time import numpy as np import torch -from fig_real_merged import load_pairs, cosine, SNRS, NFADE, D, DATA +from fig_real_merged import load_pairs, SNRS, NFADE, D, DATA SEED = 2026 -rng = np.random.default_rng(SEED + 31) torch.manual_seed(SEED + 31) +DEV = "cuda" if torch.cuda.is_available() else "cpu" BETA0 = 0.028 G0 = 1.0 - BETA0**2 +print(f"[refine] device = {DEV}") -def haar_t(gen): - Q, R = torch.linalg.qr(torch.randn(D, D, generator=gen)) - return Q * torch.sign(torch.diagonal(R)) +def haar_t(n, gen): + G = torch.randn(n, D, D, generator=gen, device=DEV) + Q, R = torch.linalg.qr(G) + return Q * torch.sign(torch.diagonal(R, dim1=-2, dim2=-1)).unsqueeze(-2) -def train_refiner2(epochs=220, steps=20, batch=48, lr=5e-4, - l2=0.5, l3=0.5, pool=32): - """Stage 1 trains a single gate (the proven 0.59M recipe); stage 2 - warm-starts four heads from it plus small perturbations and - fine-tunes at a reduced learning rate, so the capacity-matched - family starts at the single-gate solution it contains.""" - print(f"=== training capacity-matched refinement (4-head gate, " - f"4d^2 = {4*D*D/1e6:.2f}M params, warm-started) ===", - flush=True) - gen = torch.Generator().manual_seed(SEED + 31) - masks = [] - for _ in range(pool): - U1, U2 = haar_t(gen), haar_t(gen) - masks.append((U1.numpy(), (BETA0 * U1 - + math.sqrt(G0) * U2).numpy())) - Q0 = torch.nn.Parameter(torch.randn(D, D, generator=gen) - / math.sqrt(D)) - params = [Q0] +def aware_t(t1, Q, beta, c1, nvar): + """Batched affinity-aware Wiener demux in torch (complex).""" + b = t1.shape[0] + g = 1.0 - beta * beta + rho = g * (c1.abs()**2) / D + nvar # (b,) + A = torch.eye(D, device=DEV, dtype=torch.cfloat).expand(b, D, D) \ + + beta * c1.view(b, 1, 1) * Q.to(torch.cfloat) + S = A @ A.mH / D + rho.view(b, 1, 1) \ + * torch.eye(D, device=DEV, dtype=torch.cfloat) + x = torch.linalg.solve(S, t1.unsqueeze(-1)) + return (A.mH @ x).squeeze(-1) / D + + +def train_batch(masks, Qs, gen, batch): + """Generate one training batch of aware-demux outputs (user 1).""" + e1 = torch.nn.functional.normalize( + torch.randn(batch, D, generator=gen, device=DEV), dim=1) + w = torch.randn(batch, D, generator=gen, device=DEV) + w = w - (w * e1).sum(1, keepdim=True) * e1 + w = torch.nn.functional.normalize(w, dim=1) + e2 = BETA0 * e1 + math.sqrt(G0) * w + sel = torch.randint(len(masks), (batch,), generator=gen, device=DEV) + M1 = masks[0][sel]; M2 = masks[1][sel]; Q = Qs[sel] + snr = 5.0 + 20.0 * torch.rand(batch, generator=gen, device=DEV) + sig = 10 ** (-snr / 20.0) + h = (torch.randn(batch, 2, generator=gen, device=DEV) + + 1j * torch.randn(batch, 2, generator=gen, device=DEV)) \ + / math.sqrt(2) + n = (torch.randn(batch, D, generator=gen, device=DEV) + + 1j * torch.randn(batch, D, generator=gen, device=DEV)) \ + / math.sqrt(2) + r = h[:, :1] * (M1 @ e1.unsqueeze(-1)).squeeze(-1).to(torch.cfloat) \ + + h[:, 1:2] * (M2 @ e2.unsqueeze(-1)).squeeze(-1).to(torch.cfloat) \ + + sig.view(-1, 1) * n + t1 = (M1.transpose(-1, -2).to(torch.cfloat) + @ r.unsqueeze(-1)).squeeze(-1) / h[:, :1] + c1 = h[:, 1] / h[:, 0] + nvar = sig**2 / h[:, 0].abs()**2 + g1 = aware_t(t1, Q, BETA0, c1, nvar) + return g1.real.float(), e1 + + +def train_refiners(epochs=220, steps=20, batch=48, lr=5e-4, + l2=0.5, l3=0.5, pool=32, stage2_at=120): + print(f"=== training refinement (single gate {D*D/1e6:.2f}M, " + f"then 4-head warm start {4*D*D/1e6:.2f}M) ===", flush=True) + gen = torch.Generator(device=DEV).manual_seed(SEED + 31) + U1 = haar_t(pool, gen); U2 = haar_t(pool, gen) + masks = (U1, U2) + Qs = U1.transpose(-1, -2) @ U2 + params = [torch.nn.Parameter( + torch.randn(D, D, generator=gen, device=DEV) / math.sqrt(D))] opt = torch.optim.Adam(params, lr=lr) - stage2_at = 120 # epochs of single-gate pre-training + P_single = None - def forward(x): + def forward(x, ps): outs = [D * torch.softmax((x @ Qk.T) / math.sqrt(D), dim=1) * x - for Qk in params] - return sum(outs) / len(params) + for Qk in ps] + return sum(outs) / len(ps) t0 = time.time() for ep in range(epochs): if ep == stage2_at: + P_single = params[0].detach().clone() base = params[0].detach() params = [torch.nn.Parameter( - base.clone() + 0.02 * torch.randn(D, D, generator=gen) + base.clone() + 0.02 * torch.randn(D, D, generator=gen, + device=DEV) / math.sqrt(D)) for _ in range(4)] opt = torch.optim.Adam(params, lr=2e-4) - print(f" [warm start] 4 heads initialised from the trained " - f"gate at epoch {ep}", flush=True) + print(f" [warm start] 4 heads at epoch {ep}", flush=True) for _ in range(steps): - xs, ts = [], [] - for _ in range(batch): - e1 = torch.nn.functional.normalize( - torch.randn(D, generator=gen), dim=0).numpy() - w = torch.randn(D, generator=gen).numpy() - w = w - (w @ e1) * e1 - w = w / np.linalg.norm(w) - e2 = BETA0 * e1 + math.sqrt(G0) * w - M1, M2 = masks[int(torch.randint(pool, (1,), - generator=gen))] - snr = float(5.0 + 20.0 * torch.rand(1, generator=gen)) - sig = 10 ** (-snr / 20.0) - h = (torch.randn(2, generator=gen).numpy() - + 1j * torch.randn(2, generator=gen).numpy()) \ - / math.sqrt(2) - nc = (torch.randn(D, generator=gen).numpy() - + 1j * torch.randn(D, generator=gen).numpy()) \ - / math.sqrt(2) - rc = h[0] * (M1 @ e1) + h[1] * (M2 @ e2) + sig * nc - t1 = M1.T @ rc / h[0] - t2 = M2.T @ rc / h[1] - g1 = (t1 - BETA0 * (h[1] / h[0]) * t2) / G0 - xs.append(torch.tensor(np.real(g1), dtype=torch.float32)) - ts.append(torch.tensor(e1, dtype=torch.float32)) - x = torch.stack(xs); t = torch.stack(ts) - out = forward(x) - mse = ((out - t)**2).mean() - cs = torch.nn.functional.cosine_similarity(out, t, dim=1).mean() + with torch.no_grad(): + x, tgt = train_batch(masks, Qs, gen, batch) + out = forward(x, params) + mse = ((out - tgt)**2).mean() + cs = torch.nn.functional.cosine_similarity(out, tgt, dim=1).mean() loss = l2 * mse + l3 * (1.0 - cs) opt.zero_grad(); loss.backward() torch.nn.utils.clip_grad_norm_(params, 1.0) opt.step() - if (ep + 1) % 50 == 0: + if (ep + 1) % 40 == 0: print(f" epoch {ep+1}: loss {float(loss.detach()):.4f} " f"(cos {float(cs.detach()):.3f})", flush=True) print(f" trained in {time.time()-t0:.0f}s") - return [p.detach().numpy() for p in params] + return P_single, [p.detach() for p in params] -def refine2(P, g): - x = np.real(g) - - def gate(Q, v): - sc = (Q @ v) / math.sqrt(D) - sc = sc - sc.max() - w = np.exp(sc); w /= w.sum() - return D * w * v - - return sum(gate(Qk, x) for Qk in P) / 4.0 +def refine_apply(ps, z): + """z: (b, D) real torch tensor; ps: list of gates.""" + outs = [D * torch.softmax((z @ Qk.T) / math.sqrt(D), dim=1) * z + for Qk in ps] + return sum(outs) / len(ps) def main(): A, B, betas = load_pairs() - P = train_refiner2() - ref = np.zeros(len(SNRS)); cnt = 0 + P1, P4 = train_refiners() + gen = torch.Generator(device=DEV).manual_seed(SEED + 77) + ref1 = np.zeros(len(SNRS)); ref4 = np.zeros(len(SNRS)); cnt = 0 t0 = time.time() + At = torch.tensor(A, dtype=torch.float32, device=DEV) + Bt = torch.tensor(B, dtype=torch.float32, device=DEV) for i in range(len(A)): - e1, e2, bi = A[i], B[i], float(betas[i]) - gi = 1.0 - bi**2 + bi = float(betas[i]) + e1 = At[i]; e2 = Bt[i] for f in range(NFADE): - G1 = rng.standard_normal((D, D)) - Qh, Rh = np.linalg.qr(G1) - U1 = Qh * np.sign(np.diag(Rh)) - G2 = rng.standard_normal((D, D)) - Qh, Rh = np.linalg.qr(G2) - U2 = Qh * np.sign(np.diag(Rh)) - M1 = U1 - M2 = bi * U1 + math.sqrt(gi) * U2 - h = (rng.standard_normal(2) + 1j * rng.standard_normal(2)) \ + M = haar_t(2, gen) + M1, M2 = M[0], M[1] + Q = M1.T @ M2 + h = (torch.randn(2, generator=gen, device=DEV) + + 1j * torch.randn(2, generator=gen, device=DEV)) \ / math.sqrt(2) - h1, h2 = h - r0 = h1 * (M1 @ e1) + h2 * (M2 @ e2) - n = (rng.standard_normal(D) + 1j * rng.standard_normal(D)) \ + n = (torch.randn(D, generator=gen, device=DEV) + + 1j * torch.randn(D, generator=gen, device=DEV)) \ / math.sqrt(2) - for k, s in enumerate(SNRS): - sig = 10 ** (-s / 20.0) - r = r0 + sig * n - t1 = M1.T @ r / h1; t2 = M2.T @ r / h2 - g1 = (t1 - bi * (h2 / h1) * t2) / gi - g2 = (t2 - bi * (h1 / h2) * t1) / gi - ref[k] += 0.5 * (cosine(refine2(P, g1), e1) - + cosine(refine2(P, g2), e2)) + r0 = h[0] * (M1 @ e1).to(torch.cfloat) \ + + h[1] * (M2 @ e2).to(torch.cfloat) + sigs = torch.tensor(10 ** (-SNRS / 20.0), device=DEV, + dtype=torch.float32) + nb = len(SNRS) + r = r0.unsqueeze(0) + sigs.view(-1, 1) * n.unsqueeze(0) + t1 = (M1.T.to(torch.cfloat) @ r.unsqueeze(-1)).squeeze(-1) / h[0] + t2 = (M2.T.to(torch.cfloat) @ r.unsqueeze(-1)).squeeze(-1) / h[1] + c1 = (h[1] / h[0]).expand(nb) + c2 = (h[0] / h[1]).expand(nb) + v1 = (sigs**2 / h[0].abs()**2) + v2 = (sigs**2 / h[1].abs()**2) + g1 = aware_t(t1, Q.expand(nb, D, D), bi, c1, v1).real.float() + g2 = aware_t(t2, Q.T.expand(nb, D, D), bi, c2, v2).real.float() + with torch.no_grad(): + for P, acc in ((([P1]), ref1), ((P4), ref4)): + o1 = refine_apply(P, g1) + o2 = refine_apply(P, g2) + cs1 = torch.nn.functional.cosine_similarity( + o1, e1.unsqueeze(0), dim=1).abs() + cs2 = torch.nn.functional.cosine_similarity( + o2, e2.unsqueeze(0), dim=1).abs() + acc += (0.5 * (cs1 + cs2)).cpu().numpy() cnt += 1 print(f" pair {i+1}/{len(A)} done ({time.time()-t0:.0f}s)", flush=True) - ref /= cnt + ref1 /= cnt; ref4 /= cnt rows = list(csv.DictReader(open(DATA / "bertvit_merged.csv"))) names = list(rows[0].keys()) - if "edma_ref2" not in names: - names.append("edma_ref2") + for col in ("edma_ref", "edma_ref2"): + if col not in names: + names.append(col) for k, r in enumerate(rows): - r["edma_ref2"] = f"{ref[k]}" + r["edma_ref"] = f"{ref1[k]}" + r["edma_ref2"] = f"{ref4[k]}" with open(DATA / "bertvit_merged.csv", "w", newline="") as f: w = csv.DictWriter(f, fieldnames=names) w.writeheader(); w.writerows(rows) - print("[OK] appended edma_ref2 to bertvit_merged.csv") + print("[OK] appended edma_ref / edma_ref2 to bertvit_merged.csv") for k, r in enumerate(rows): - print(f" {float(r['snr_db']):4.0f} dB " - f"EDMA {float(r['edma']):.3f} " - f"ref(0.59M) {float(r['edma_ref']):.3f} " - f"ref2(2.36M) {ref[k]:.3f} " - f"ATT(2.36M) {float(r['att']):.3f} " - f"genie {float(r['genie']):.3f}") + print(f" {float(r['snr_db']):4.1f} dB " + f"EDMA {float(r['edma']):.3f} ref {ref1[k]:.3f} " + f"ref2 {ref4[k]:.3f} genie {float(r['genie']):.3f}") if __name__ == "__main__": diff --git a/code/replot_all.py b/code/replot_all.py new file mode 100644 index 0000000..83d314d --- /dev/null +++ b/code/replot_all.py @@ -0,0 +1,179 @@ +"""Canonical figure rendering. Reads ONLY data/*.csv, writes fig/*.pdf. + +Figures: fig_floor, fig_rate_corrected, fig_beta_sweep_corrected, +fig_sic, fig_multiuser_corrected. (fig_bertvit_merged is rendered by +replot_merged.py; block_diagram.pdf comes from block_diagram_src.tex.) +One physical geometry and one label dictionary for every plot. +""" +import csv +import math +from pathlib import Path +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt + +ROOT = Path(__file__).resolve().parents[1] +DATA = ROOT / "data" +FIG = ROOT / "fig" + +plt.rcParams.update({ + "font.family": "serif", + "font.serif": ["DejaVu Serif", "Times New Roman"], + "font.size": 9, "axes.labelsize": 9, "legend.fontsize": 6.6, + "xtick.labelsize": 8, "ytick.labelsize": 8, + "axes.grid": True, "grid.linestyle": "--", "grid.linewidth": 0.4, + "grid.alpha": 0.6, "lines.linewidth": 1.4, "lines.markersize": 4.0, + "figure.figsize": (3.15, 2.36), "pdf.fonttype": 42, +}) +AXES_RECT = dict(left=0.205, right=0.965, top=0.955, bottom=0.185) + +LBL = { + "edma": "EDMA", + "blind": "Affinity-blind", + "oma": "OMA", + "genie": "Genie-aided SIC bound", + "sic": "Realizable analog SIC", + "todma": "ToDMA-adapted", + "mac": "MAC sum capacity", + "coop": "Full-cooperation bound", + "hybrid": "EDMA + refinement stage", +} + + +def rows_of(name): + return list(csv.DictReader(open(DATA / f"{name}.csv"))) + + +def col(rows, k): + return [float(r[k]) for r in rows] + + +def save(fig, name): + fig.subplots_adjust(**AXES_RECT) + fig.savefig(FIG / f"{name}.pdf") + plt.close(fig) + print(f"[OK] wrote {name}.pdf") + + +# ------------------------------------------------------ fig_floor +def fig_floor(): + rows = rows_of("floor_validation") + fig, ax = plt.subplots() + colors = {"256": "C0", "768": "C3"} + beta = 0.311 + for d in ("256", "768"): + rd = [r for r in rows if r["d"] == d or r["d"] == f"{d}.0" + or float(r["d"]) == float(d)] + snr = col(rd, "snr_db") + ax.plot(snr, col(rd, "mse_mc"), "o", ms=3.5, color=colors[d], + mfc="none", label=rf"Monte Carlo, $d={d}$") + ax.plot(snr, col(rd, "mse_theory"), "-", color=colors[d], + label=rf"Theorem 1, $d={d}$") + if d == "768": + ax.plot(snr, col(rd, "mse_blind"), "--", color="C1", lw=1.2, + label=LBL["blind"]) + g = 1.0 - beta**2 + ax.axhline(math.sqrt(g) / 2, color="gray", lw=0.8, ls="--") + ax.axhline(0.5, color="gray", lw=0.8, ls=":") + ax.annotate("blind floor $1/2$", xy=(17.0, 0.512), fontsize=7, + color="gray") + ax.annotate(r"aware floor $\sqrt{1-\beta^2}/2$", xy=(14.0, 0.432), + fontsize=7, color="gray") + ax.set_xlabel("Per-block SNR $\\rho$ [dB]") + ax.set_ylabel(r"Per-user MSE $\mathbb{E}\|\hat{\mathbf{e}}_u-\mathbf{e}_u\|_2^2$") + ax.set_xlim(0, 40); ax.set_ylim(0.4, 1.05) + ax.legend(loc="lower left", bbox_to_anchor=(0.02, 0.18)) + save(fig, "fig_floor") + + +# ------------------------------------------------ fig_rate_corrected +def fig_rate(): + rows = rows_of("rate_corrected") + snr = col(rows, "snr_db") + fig, ax = plt.subplots() + ax.plot(snr, col(rows, "edma"), "-", color="C3", label=LBL["edma"]) + ax.plot(snr, col(rows, "blind"), ":", color="C4", lw=1.2, + label=LBL["blind"]) + ax.plot(snr, col(rows, "oma"), "--", color="C1", label=LBL["oma"]) + ax.plot(snr, col(rows, "genie"), "-.", color="C0", label=LBL["genie"]) + ax.plot(snr, col(rows, "mac"), "-", color="k", lw=1.0, label=LBL["mac"]) + ax.set_xlabel("Per-block SNR $\\rho$ [dB]") + ax.set_ylabel("Effective sum rate [bps/Hz]") + ax.set_xlim(0, 40); ax.set_ylim(0, 3.2) + ax.legend(loc="upper left") + save(fig, "fig_rate_corrected") + + +# ------------------------------------------ fig_beta_sweep_corrected +def fig_beta_sweep(): + rows = rows_of("beta_sweep_corrected") + fig, ax = plt.subplots() + for s, cc in (("10", "C0"), ("20", "C3")): + rd = [r for r in rows if float(r["snr_db"]) == float(s)] + b = col(rd, "beta") + ax.plot(b, col(rd, "edma"), "-", color=cc, + label=rf"EDMA, $\rho={s}$ dB") + ax.axhline(float(rd[0]["blind"]), color=cc, ls=":", lw=1.0) + ax.axhline(float(rd[0]["oma"]), color=cc, ls="--", lw=1.0) + ax.axhline(float(rd[0]["genie"]), color=cc, ls="-.", lw=0.8) + # one legend entry per reference style (color-independent) + ax.plot([], [], ls=":", color="gray", label=LBL["blind"]) + ax.plot([], [], ls="--", color="gray", label=LBL["oma"]) + ax.plot([], [], ls="-.", color="gray", label=LBL["genie"]) + for b0 in (0.030, 0.311): + ax.axvline(b0, color="gray", ls=":", lw=0.9) + ax.set_xlabel(r"Pairwise affinity $\beta$") + ax.set_ylabel("Effective sum rate [bps/Hz]") + ax.set_xlim(0, 1); ax.set_ylim(0, 1.0) + ax.legend(loc="upper left") + save(fig, "fig_beta_sweep_corrected") + + +# ------------------------------------------------------- fig_sic +def fig_sic(): + rows = rows_of("sic_comparison") + snr = col(rows, "snr_db") + fig, ax = plt.subplots() + ax.plot(snr, col(rows, "edma"), "o-", color="C3", label=LBL["edma"]) + ax.plot(snr, col(rows, "blind"), "d:", color="C4", label=LBL["blind"]) + ax.plot(snr, col(rows, "sic"), "^-.", color="C2", label=LBL["sic"]) + ax.plot(snr, col(rows, "oma"), "v--", color="C1", label=LBL["oma"]) + ax.plot(snr, col(rows, "genie"), "-", color="gray", lw=1.0, + label=LBL["genie"]) + ax.set_xlabel("Per-block SNR $\\rho$ [dB]") + ax.set_ylabel("Mean cosine similarity") + ax.set_xlim(snr[0], snr[-1]); ax.set_ylim(0, 0.7) + ax.legend(loc="upper left") + save(fig, "fig_sic") + + +# ------------------------------------------ fig_multiuser_corrected +def fig_multiuser(): + rows = rows_of("multiuser_corrected") + fig, ax = plt.subplots() + colors = {"2": "C0", "3": "C2", "4": "C3"} + for U in ("2", "3", "4"): + rd = [r for r in rows if float(r["U"]) == float(U)] + snr = col(rd, "snr_db") + ax.plot(snr, col(rd, "edma_mc"), "-", color=colors[U], + label=rf"EDMA, $U={U}$") + ax.plot(snr, col(rd, "oma"), "--", color=colors[U], lw=1.0, + label=rf"OMA, $U={U}$") + mk = [i for i, s in enumerate(snr) if s % 5 == 0] + ax.plot([snr[i] for i in mk], [col(rd, "edma_mc")[i] for i in mk], + "o", color=colors[U], ms=4, mfc="none") + ax.set_xlabel("Per-block SNR $\\rho$ [dB]") + ax.set_ylabel("Effective sum rate [bps/Hz]") + ax.set_xlim(0, 30) + ax.legend(loc="upper left") + save(fig, "fig_multiuser_corrected") + + +if __name__ == "__main__": + import sys + todo = set(sys.argv[1:]) + ALL = {"floor": fig_floor, "rate": fig_rate, "beta": fig_beta_sweep, + "sic": fig_sic, "multi": fig_multiuser} + for name, fn in ALL.items(): + if not todo or name in todo: + fn() diff --git a/code/replot_merged.py b/code/replot_merged.py index d3d200b..f5ae413 100644 --- a/code/replot_merged.py +++ b/code/replot_merged.py @@ -1,6 +1,7 @@ """Canonical replot of fig_bertvit_merged.pdf from data/bertvit_merged.csv. Curves: EDMA, EDMA + refinement (hybrid), ToDMA-adapted, OMA, genie bound. -The attention columns remain in the CSV but are not plotted.""" +The capacity-check column edma_ref2 remains in the CSV but is not +plotted (it tracks edma_ref; quoted in the text only).""" import csv from pathlib import Path import matplotlib @@ -24,7 +25,7 @@ snr = [float(r["snr_db"]) for r in rows] col = lambda k: [float(r[k]) for r in rows] fig, ax = plt.subplots() -ax.plot(snr, col("edma"), "o-", color="C3", label="EDMA (closed form)") +ax.plot(snr, col("edma"), "o-", color="C3", label="EDMA") ax.plot(snr, col("edma_ref"), "^-", color="C2", label="EDMA + refinement stage") ax.plot(snr, col("todma"), "d-.", color="C4", label="ToDMA-adapted") diff --git a/code/replot_sic.py b/code/replot_sic.py deleted file mode 100644 index a7d633f..0000000 --- a/code/replot_sic.py +++ /dev/null @@ -1,43 +0,0 @@ -"""Canonical replot of fig_sic.pdf from data/sic_comparison.csv -(realizable analog SIC vs genie SIC vs EDMA vs OMA, beta = 0.311, -d = 512, block-Rayleigh). US-spelling labels, uniform geometry.""" -import csv -from pathlib import Path -import matplotlib -matplotlib.use("Agg") -import matplotlib.pyplot as plt - -ROOT = Path(__file__).resolve().parents[1] -plt.rcParams.update({ - "font.family": "serif", - "font.serif": ["DejaVu Serif", "Times New Roman"], - "font.size": 9, "axes.labelsize": 9, "legend.fontsize": 6.6, - "xtick.labelsize": 8, "ytick.labelsize": 8, - "axes.grid": True, "grid.linestyle": "--", "grid.linewidth": 0.4, - "grid.alpha": 0.6, "lines.linewidth": 1.4, "lines.markersize": 4.0, - "figure.figsize": (3.15, 2.36), "pdf.fonttype": 42, -}) -AXES_RECT = dict(left=0.205, right=0.965, top=0.955, bottom=0.185) - -rows = list(csv.DictReader(open(ROOT / "data" / "sic_comparison.csv"))) -snr = [float(r["snr_db"]) for r in rows] -col = lambda k: [float(r[k]) for r in rows] - -fig, ax = plt.subplots() -ax.plot(snr, col("edma"), "o-", color="C3", label="EDMA (closed form)") -ax.plot(snr, col("sic"), "^-.", color="C2", label="Realizable analog SIC") -ax.plot(snr, col("oma"), "v:", color="C1", label="OMA") -ax.plot(snr, col("genie"), "-", color="gray", lw=1.0, - label="Genie-aided SIC bound") -ax.set_xlabel("Per-block SNR $\\rho$ [dB]") -ax.set_ylabel("Mean cosine similarity") -ax.set_xlim(snr[0], snr[-1]) -ax.set_ylim(0, 0.7) -ax.legend(loc="upper left") -fig.subplots_adjust(**AXES_RECT) -fig.savefig(ROOT / "fig" / "fig_sic.pdf") -print("[OK] wrote fig_sic.pdf") -for r in rows: - print(f" {float(r['snr_db']):4.0f} dB EDMA {float(r['edma']):.3f} " - f"SIC {float(r['sic']):.3f} genie {float(r['genie']):.3f} " - f"OMA {float(r['oma']):.3f}") diff --git a/code/revision_sims.py b/code/revision_sims.py index c0ab0e6..6c48415 100644 --- a/code/revision_sims.py +++ b/code/revision_sims.py @@ -1,26 +1,45 @@ """ -Revision simulations for the EDMA TCOM resubmission. +Simulations for the EDMA TVT manuscript (v2 design). ======================================================= -Implements the per-realisation (finite-d) analysis and the corrected -energy-normalised rate accounting, plus the reviewer-requested -experiments: +Design v2: each user applies an independent orthogonal mask; the +receiver runs one matched filter per user followed by the +affinity-aware linear MMSE demultiplexer, which exploits the +coherent interference component that the pairwise affinity beta +predicts. Per-realization statistic for user 1 (c1 = h2/h1): - E0 Theorem-1 verification: exact self-interference constant C_SI - E1 fig_floor : per-user MSE vs block SNR, interference floor - E2 fig_sic : realisable SIC vs genie SIC vs EDMA vs OMA - E3 (text numbers) : Rayleigh unconditional MSE, ZF vs regularised - E4 fig_csi : imperfect-CSI robustness - E5 fig_maskfam : Walsh-Hadamard structured masks vs Haar - E6 fig_coop : high-affinity combining-mode crossover - E7 fig_rate_corrected, fig_beta_sweep_corrected, fig_multiuser_corrected + t1 = (I + beta*c1*Q) e1 + sqrt(g)*c1*Q w + n_t, Q = M1^T M2, -Conventions (identical to the revised manuscript): +and the demultiplexer is the Wiener filter + + e1_hat = (1/d) A^H (A A^H/d + (g|c1|^2/d + sig^2/|h1|^2) I)^{-1} t1, + A = I + beta*c1*Q, g = 1 - beta^2. + +Closed form (Theorem 1, d -> inf, per channel realization): + + MSE_1 = rho_e / sqrt((1 + beta^2|c1|^2 + rho_e)^2 - 4 beta^2|c1|^2), + rho_e = g|c1|^2 + d sig^2/|h1|^2; floor at |c1| = 1: sqrt(g)/2. + +The affinity-blind receiver (beta = 0 in the filter) reduces to a +scalar shrinkage of the matched filter with floor 1/2, so the entire +cosine gain of the aware receiver is attributable to the predicted +affinity. Effective SINR: eta = 1/MSE - 1 (biased MMSE convention). + +Experiments in this file (CPU, numpy): + E0 theorem_check : closed form vs Monte Carlo, both users + E1 fig_floor : per-user MSE vs block SNR, aware vs blind floor + E7a rate_corrected + beta_sweep_corrected : closed-form rate curves + +The Monte Carlo experiments E2, E3, E4, E5, E7c, E8, E9 are canonical +in revision_sims_gpu.py (torch backend, run under WSL); figures are +rendered from data/ by replot_all.py and replot_merged.py. + +Conventions (identical to the manuscript): * unit per-block transmit energy E_b = 1 per user * rho = E_b / sigma_n^2 (per-block received SNR; per-symbol SNR rho/d) * block-Rayleigh h ~ CN(0,1) unless the AWGN point |h|=1 is stated * complex AWGN CN(0, sigma^2 I_d); embeddings real, unit norm * orientation convention = +beta -Fixed seed. CSVs -> ../fig, PDFs -> ../fig_toc. +Fixed seed 2026. CSVs -> ../data, PDFs -> ../fig. """ from __future__ import annotations import csv @@ -39,13 +58,27 @@ plt.rcParams.update({ "font.family": "serif", "font.serif": ["DejaVu Serif", "Times New Roman"], "font.size": 9, "axes.labelsize": 9, "axes.titlesize": 9, - "legend.fontsize": 7.0, "xtick.labelsize": 8, "ytick.labelsize": 8, + "legend.fontsize": 6.6, "xtick.labelsize": 8, "ytick.labelsize": 8, "axes.grid": True, "grid.linestyle": "--", "grid.linewidth": 0.4, "grid.alpha": 0.6, "lines.linewidth": 1.4, "lines.markersize": 4.0, "figure.figsize": (3.15, 2.36), "pdf.fonttype": 42, }) AXES_RECT = dict(left=0.205, right=0.965, top=0.955, bottom=0.185) +# shared legend-label dictionary (single source for every figure) +LBL = { + "edma": "EDMA", + "blind": "Affinity-blind", + "oma": "OMA", + "genie": "Genie-aided SIC bound", + "sic": "Realizable analog SIC", + "todma": "ToDMA-adapted", + "mac": "MAC sum capacity", + "hybrid": "EDMA + refinement stage", + "haar": "Haar masks", + "wh": "Walsh-Hadamard masks", +} + rng = np.random.default_rng(2026) @@ -86,69 +119,80 @@ def embed_pair(d, beta): return e1, e2 -def two_user_masks(d, beta, U1=None, U2=None): - if U1 is None: U1 = haar(d) - if U2 is None: U2 = haar(d) - g = math.sqrt(1.0 - beta**2) - return U1, beta * U1 + g * U2 - - def rayleigh(n=1): return (rng.standard_normal(n) + 1j * rng.standard_normal(n)) / math.sqrt(2) -def C_SI(beta, c): - """User-1 self-interference constant (exact to O(1/d)), =+beta.""" - g = 1.0 - beta**2 - return (g**2 * abs(c)**2 + beta**2 + beta**4 * abs(c)**2 - + 2.0 * beta**4 * np.real(c)) / g - - -def C_SI2(beta, c2): - """User-2 self-interference constant (deterministic), c2 = h1/h2.""" - g = 1.0 - beta**2 - return (abs(c2)**2 + beta**2 + 2.0 * beta**2 * np.real(c2)) / g - - -def C_bar(beta): - """Symmetrised constant at |h|=1 (block-alternating mask roles).""" - return 0.5 * (C_SI(beta, 1.0 + 0j) + C_SI2(beta, 1.0 + 0j)) - - -def demux(r, M1, M2, h1, h2, beta): - """beta-aware demultiplexer (13); returns (e1_hat, e2_hat).""" - g = 1.0 - beta**2 - t1 = (M1.T @ r) / h1 - t2 = (M2.T @ r) / h2 - e1 = (t1 - beta * (h2 / h1) * t2) / g - e2 = (t2 - beta * (h1 / h2) * t1) / g - return e1, e2 +def cnoise(d): + return (rng.standard_normal(d) + 1j * rng.standard_normal(d)) / math.sqrt(2) def cosine(a, b): return abs(np.vdot(a, b)) / (np.linalg.norm(a) * np.linalg.norm(b)) +def mse_theory(beta, c1, rho_e): + """Theorem 1: per-realization MSE of the aware demultiplexer.""" + a0 = 1.0 + beta**2 * abs(c1)**2 + rho_e + return rho_e / math.sqrt(a0 * a0 - 4.0 * beta**2 * abs(c1)**2) + + +def mse_blind(c1, dsig2_h): + """Affinity-blind scalar-shrinkage MSE (beta = 0 in the filter).""" + r0 = abs(c1)**2 + dsig2_h + return r0 / (1.0 + r0) + + +def eta_of(mse): + """Effective SINR of a (possibly biased) estimator with unit signal.""" + return 1.0 / mse - 1.0 + + +def aware(t1, Q, beta, c1, nvar, d): + """Affinity-aware Wiener demultiplexer applied to t1 = M1^T r / h1. + + Uses A A^H = (1+beta^2|c1|^2) I + beta(c1 Q + conj(c1) Q^T), so the + system matrix is assembled in O(d^2) and solved with one LU.""" + g = 1.0 - beta * beta + rho = g * abs(c1)**2 / d + nvar + S = beta * (c1 * Q + np.conj(c1) * Q.T) / d + S[np.diag_indices(d)] += (1.0 + beta**2 * abs(c1)**2) / d + rho + x = np.linalg.solve(S, t1) + return (x + beta * np.conj(c1) * (Q.T @ x)) / d + + +def blind(t1, c1, nvar, d): + """Affinity-blind receiver: scalar shrinkage of the matched filter.""" + lam = (1.0 / d) / (1.0 / d + abs(c1)**2 / d + nvar) + return lam * t1 + + # ------------------------------------------------------------------ -# E0 : Theorem-1 verification +# E0 : Theorem-1 verification (both users, random phases) # ------------------------------------------------------------------ -def E0_theorem_check(d=512, betas=(0.0, 0.311, 0.5, 0.7), ntr=300): - print("\n=== E0: Theorem 1 (self-interference constant) verification ===") +def E0_theorem_check(d=512, betas=(0.0, 0.311, 0.5, 0.7), ntr=200, snr=20.0): + print("\n=== E0: Theorem 1 (aware-demultiplexer MSE) verification ===") + sig = 10 ** (-snr / 20.0) rows = [] worst = 0.0 for beta in betas: - # random unit-modulus channels (AWGN-type magnitude, random phase) - errs1, errs2 = [], [] + g = 1.0 - beta**2 + r1s, r2s = [], [] for _ in range(ntr): h1 = np.exp(1j * rng.uniform(0, 2 * np.pi)) h2 = np.exp(1j * rng.uniform(0, 2 * np.pi)) e1, e2 = embed_pair(d, beta) - M1, M2 = two_user_masks(d, beta) - r = h1 * (M1 @ e1) + h2 * (M2 @ e2) # noise-free - g1, g2 = demux(r, M1, M2, h1, h2, beta) - errs1.append(np.linalg.norm(g1 - e1)**2 / C_SI(beta, h2 / h1)) - errs2.append(np.linalg.norm(g2 - e2)**2 / C_SI2(beta, h1 / h2)) - r1, r2 = float(np.mean(errs1)), float(np.mean(errs2)) + M1, M2 = haar(d), haar(d) + Q = M1.T @ M2 + r = h1 * (M1 @ e1) + h2 * (M2 @ e2) + sig * cnoise(d) + c1, c2 = h2 / h1, h1 / h2 + g1 = aware(M1.T @ r / h1, Q, beta, c1, sig**2 / abs(h1)**2, d) + g2 = aware(M2.T @ r / h2, Q.T, beta, c2, sig**2 / abs(h2)**2, d) + th1 = mse_theory(beta, c1, g * abs(c1)**2 + d * sig**2 / abs(h1)**2) + th2 = mse_theory(beta, c2, g * abs(c2)**2 + d * sig**2 / abs(h2)**2) + r1s.append(np.linalg.norm(g1 - e1)**2 / th1) + r2s.append(np.linalg.norm(g2 - e2)**2 / th2) + r1, r2 = float(np.mean(r1s)), float(np.mean(r2s)) dev = max(abs(r1 - 1.0), abs(r2 - 1.0)) * 100 worst = max(worst, dev) print(f" beta={beta:.3f} MC/theory user1 = {r1:.4f}, user2 = {r2:.4f}" @@ -161,12 +205,11 @@ def E0_theorem_check(d=512, betas=(0.0, 0.311, 0.5, 0.7), ntr=300): # ------------------------------------------------------------------ -# E1 : interference floor (MSE vs block SNR), AWGN point |h|=1 +# E1 : MSE vs block SNR at |h|=1 -- aware floor sqrt(g)/2 vs blind 1/2 # ------------------------------------------------------------------ -def E1_floor(beta=0.311, dims=(256, 768), snr_db=np.arange(0, 41, 2.5), ntr=150): - print("\n=== E1: finite-d interference floor ===") +def E1_floor(beta=0.311, dims=(256, 768), snr_db=np.arange(0, 41, 2.5), ntr=120): + print("\n=== E1: finite-d validation, aware vs blind floor ===") g = 1.0 - beta**2 - csi = C_SI(beta, 1.0 + 0j) fig, ax = plt.subplots() colors = {256: "C0", 768: "C3"} rows = [] @@ -174,444 +217,134 @@ def E1_floor(beta=0.311, dims=(256, 768), snr_db=np.arange(0, 41, 2.5), ntr=150) mc = np.zeros(len(snr_db)) for _ in range(ntr): e1, e2 = embed_pair(d, beta) - M1, M2 = two_user_masks(d, beta) + M1, M2 = haar(d), haar(d) + Q = M1.T @ M2 r0 = (M1 @ e1) + (M2 @ e2) - n = (rng.standard_normal(d) + 1j * rng.standard_normal(d)) / math.sqrt(2) + n = cnoise(d) for k, s in enumerate(snr_db): sig = 10 ** (-s / 20.0) - g1, _ = demux(r0 + sig * n, M1, M2, 1.0, 1.0, beta) + g1 = aware(M1.T @ (r0 + sig * n), Q, beta, 1.0, sig**2, d) mc[k] += np.linalg.norm(g1 - e1)**2 mc /= ntr rho = 10 ** (snr_db / 10.0) - th = d / (rho * g) + csi - ideal = d / (rho * g) + th = np.array([mse_theory(beta, 1.0, g + d / r) for r in rho]) + bl = np.array([mse_blind(1.0, d / r) for r in rho]) ax.semilogy(snr_db, mc, "o", ms=3.5, color=colors[d], mfc="none", - label=rf"MC, $d={d}$") + label=rf"Monte Carlo, $d={d}$") ax.semilogy(snr_db, th, "-", color=colors[d], label=rf"Theorem 1, $d={d}$") if d == dims[-1]: - ax.semilogy(snr_db, ideal, ":", color="k", lw=1.1, - label="Idealized (no floor)") - for s, m, t, i in zip(snr_db, mc, th, ideal): - rows.append([d, s, m, t, i]) - onset = 10 * math.log10(d / (g * csi)) - print(f" d={d}: floor C_SI={csi:.4f}, onset ~{onset:.1f} dB, " - f"max MC/theory dev " - f"{100*max(abs(mc/th-1)):.1f}%") - ax.axhline(csi, color="gray", lw=0.8, ls="--") - ax.text(1.0, csi * 1.15, r"floor $C_{\mathrm{SI}}$", fontsize=7, color="gray") + ax.semilogy(snr_db, bl, "--", color="C1", lw=1.1, + label=LBL["blind"]) + for s, m, t, b in zip(snr_db, mc, th, bl): + rows.append([d, s, m, t, b]) + dev = 100 * max(abs(mc / th - 1)) + print(f" d={d}: max MC/theory dev {dev:.1f}%") + ax.axhline(math.sqrt(g) / 2, color="gray", lw=0.8, ls="--") + ax.axhline(0.5, color="gray", lw=0.8, ls=":") + ax.text(1.0, 0.52, r"blind floor $1/2$", fontsize=7, color="gray") + ax.text(22.0, 0.40, r"aware floor $\sqrt{1-\beta^2}/2$", + fontsize=7, color="gray") + ax.set_yscale("linear") ax.set_xlabel("Per-block SNR $\\rho$ [dB]") ax.set_ylabel(r"Per-user MSE $\mathbb{E}\|\hat{\mathbf{e}}_u-\mathbf{e}_u\|_2^2$") - ax.set_xlim(0, 40); ax.set_ylim(0.5, 2000) + ax.set_xlim(0, 40); ax.set_ylim(0.4, 1.05) ax.legend(loc="upper right", ncol=1) save_fig(fig, "fig_floor") - write_csv("floor_validation", ["d", "snr_db", "mse_mc", "mse_theory", "mse_ideal"], rows) + write_csv("floor_validation", + ["d", "snr_db", "mse_mc", "mse_theory", "mse_blind"], rows) + print(f" aware floor {math.sqrt(g)/2:.4f} vs blind floor 0.5000 " + f"(ratio {0.5/(math.sqrt(g)/2):.4f} = 1/sqrt(1-beta^2))") # ------------------------------------------------------------------ -# E2 : realisable SIC vs genie SIC vs EDMA vs OMA (Rayleigh) +# E7 : effective-rate figures (eta = 1/MSE - 1) # ------------------------------------------------------------------ -def E2_sic(beta=0.311, d=512, snr_db=np.arange(0, 31, 5), ntr=400): - print("\n=== E2: realisable vs genie SIC (Rayleigh) ===") - res = {k: np.zeros(len(snr_db)) for k in - ("edma", "oma", "genie", "sic")} - for _ in range(ntr): - e1, e2 = embed_pair(d, beta) - M1, M2 = two_user_masks(d, beta) - h1, h2 = rayleigh(2) - r0 = h1 * (M1 @ e1) + h2 * (M2 @ e2) - n = (rng.standard_normal(d) + 1j * rng.standard_normal(d)) / math.sqrt(2) - n2 = (rng.standard_normal(d) + 1j * rng.standard_normal(d)) / math.sqrt(2) - for k, s in enumerate(snr_db): - sig = 10 ** (-s / 20.0) - r = r0 + sig * n - # EDMA - g1, g2 = demux(r, M1, M2, h1, h2, beta) - res["edma"][k] += 0.5 * (cosine(g1, e1) + cosine(g2, e2)) - # OMA equivalent-bandwidth model: interference-free, noise x sqrt(2) - o1 = e1 + math.sqrt(2) * sig * n / h1 - o2 = e2 + math.sqrt(2) * sig * n2 / h2 - res["oma"][k] += 0.5 * (cosine(o1, e1) + cosine(o2, e2)) - # genie SIC: perfect removal of the other user for BOTH users - ge1 = M1.T @ (r - h2 * (M2 @ e2)) / h1 - ge2 = M2.T @ (r - h1 * (M1 @ e1)) / h2 - res["genie"][k] += 0.5 * (cosine(ge1, e1) + cosine(ge2, e2)) - # realisable SIC: stronger user first (matched filter), - # unit-norm projection as the analog decision, then subtract - if abs(h1) >= abs(h2): - hs, hw, Ms, Mw, es, ew = h1, h2, M1, M2, e1, e2 - else: - hs, hw, Ms, Mw, es, ew = h2, h1, M2, M1, e2, e1 - d_s = Ms.T @ r / hs - dec_s = d_s / np.linalg.norm(d_s) # analog decision - r_res = r - hs * (Ms @ dec_s) - d_w = Mw.T @ r_res / hw - res["sic"][k] += 0.5 * (cosine(d_s, es) + cosine(d_w, ew)) - for k in res: - res[k] /= ntr - fig, ax = plt.subplots() - ax.plot(snr_db, res["edma"], "o-", color="C3", label="EDMA") - ax.plot(snr_db, res["genie"], "s--", color="C0", label="Genie-aided SIC") - ax.plot(snr_db, res["sic"], "^-.", color="C2", label="Realisable SIC") - ax.plot(snr_db, res["oma"], "v:", color="C1", label="OMA") - ax.set_xlabel("Per-block SNR $\\rho$ [dB]") - ax.set_ylabel("Mean cosine similarity") - ax.set_xlim(snr_db[0], snr_db[-1]); ax.set_ylim(0, 1) - ax.legend(loc="upper left") - save_fig(fig, "fig_sic") - rows = [[s] + [res[k][i] for k in ("edma", "oma", "genie", "sic")] - for i, s in enumerate(snr_db)] - write_csv("sic_comparison", ["snr_db", "edma", "oma", "genie", "sic"], rows) - i20 = list(snr_db).index(20) - print(f" at 20 dB: EDMA {res['edma'][i20]:.3f}, realisable SIC " - f"{res['sic'][i20]:.3f}, genie {res['genie'][i20]:.3f}, " - f"OMA {res['oma'][i20]:.3f}") +def T_edma(rho, d, beta): + m = mse_theory(beta, 1.0, (1.0 - beta**2) + d / rho) + return 2.0 * math.log2(1.0 + eta_of(m)) -# ------------------------------------------------------------------ -# E3 : Rayleigh unconditional MSE ??ZF inversion vs regularised -# ------------------------------------------------------------------ -def E3_regularised(beta=0.311, d=512, snrs=(10, 20), ntr=4000): - print("\n=== E3: Rayleigh unconditional MSE, ZF vs regularised ===") - rows = [] - for s in snrs: - sig = 10 ** (-s / 20.0) - sig2 = sig**2 - mse_zf, mse_rg = [], [] - for _ in range(ntr): - e1, e2 = embed_pair(d, beta) - M1, M2 = two_user_masks(d, beta) - h1, h2 = rayleigh(2) - r = h1 * (M1 @ e1) + h2 * (M2 @ e2) \ - + sig * (rng.standard_normal(d) + 1j * rng.standard_normal(d)) / math.sqrt(2) - g1, _ = demux(r, M1, M2, h1, h2, beta) - mse_zf.append(np.linalg.norm(g1 - e1)**2) - # regularised inversion: 1/h -> h*/(|h|^2 + d sigma^2) - eps = d * sig2 - f1 = (abs(h1)**2 + eps) / np.conj(h1) - f2 = (abs(h2)**2 + eps) / np.conj(h2) - g1r, _ = demux(r, M1, M2, f1, f2, beta) - mse_rg.append(np.linalg.norm(g1r - e1)**2) - zf_mean, zf_med = float(np.mean(mse_zf)), float(np.median(mse_zf)) - rg_mean, rg_med = float(np.mean(mse_rg)), float(np.median(mse_rg)) - print(f" {s} dB: ZF mean {zf_mean:9.2f} (median {zf_med:6.2f}) | " - f"regularised mean {rg_mean:6.3f} (median {rg_med:6.3f})") - rows.append([s, zf_mean, zf_med, rg_mean, rg_med]) - write_csv("rayleigh_mse", ["snr_db", "zf_mean", "zf_median", - "reg_mean", "reg_median"], rows) - - -# ------------------------------------------------------------------ -# E4 : imperfect CSI -# ------------------------------------------------------------------ -def E4_csi(beta=0.311, d=512, snr=30.0, - sh2=np.array([0.0, 0.01, 0.02, 0.05, 0.1, 0.2, 0.3]), ntr=400): - """EDMA cosine is CSI-direction-invariant (h-estimates cancel in the - demux direction); realisable SIC degrades through its subtraction stage.""" - print("\n=== E4: imperfect CSI robustness (EDMA vs realisable SIC) ===") - sig = 10 ** (-snr / 20.0) - res_e = np.zeros(len(sh2)); res_s = np.zeros(len(sh2)) - for _ in range(ntr): - e1, e2 = embed_pair(d, beta) - M1, M2 = two_user_masks(d, beta) - h1, h2 = rayleigh(2) - r = h1 * (M1 @ e1) + h2 * (M2 @ e2) + sig * ( - rng.standard_normal(d) + 1j * rng.standard_normal(d)) / math.sqrt(2) - eps1, eps2 = rayleigh(2) - for j, v in enumerate(sh2): - hh1 = h1 + math.sqrt(v) * eps1 - hh2 = h2 + math.sqrt(v) * eps2 - g1, g2 = demux(r, M1, M2, hh1, hh2, beta) - res_e[j] += 0.5 * (cosine(g1, e1) + cosine(g2, e2)) - # realisable SIC with the same imperfect estimates - if abs(hh1) >= abs(hh2): - hs, hw, Ms, Mw, es, ew = hh1, hh2, M1, M2, e1, e2 - else: - hs, hw, Ms, Mw, es, ew = hh2, hh1, M2, M1, e2, e1 - d_s = Ms.T @ r / hs - dec_s = d_s / np.linalg.norm(d_s) - r_res = r - hs * (Ms @ dec_s) - d_w = Mw.T @ r_res / hw - res_s[j] += 0.5 * (cosine(d_s, es) + cosine(d_w, ew)) - res_e /= ntr; res_s /= ntr - print(f" EDMA: {res_e[0]:.4f} -> {res_e[-1]:.4f} " - f"(delta {100*(res_e[0]-res_e[-1]):.2f} points)") - print(f" SIC : {res_s[0]:.4f} -> {res_s[-1]:.4f} " - f"(delta {100*(res_s[0]-res_s[-1]):.2f} points)") - fig, ax = plt.subplots() - ax.plot(sh2, res_e, "o-", color="C3", label="EDMA") - ax.plot(sh2, res_s, "^-.", color="C2", label="Realisable SIC") - ax.set_xlabel(r"CSI error variance $\sigma_h^2$") - ax.set_ylabel("Mean cosine similarity") - ax.set_xlim(0, sh2[-1]); ax.set_ylim(0, 0.7) - ax.legend(loc="lower left") - save_fig(fig, "fig_csi") - rows = [[v, res_e[j], res_s[j]] for j, v in enumerate(sh2)] - write_csv("csi_error", ["sigma_h2", "edma", "sic"], rows) - - -# ------------------------------------------------------------------ -# E5 : Walsh-Hadamard structured masks vs Haar -# ------------------------------------------------------------------ -def hadamard(n): - H = np.array([[1.0]]) - while H.shape[0] < n: - H = np.block([[H, H], [H, -H]]) - return H / math.sqrt(n) - - -def E5_maskfam(beta=0.311, d=512, snr_db=np.arange(0, 41, 5), ntr=200): - print("\n=== E5: Walsh-Hadamard masks vs Haar mixture ===") - H = hadamard(d) - g = math.sqrt(1.0 - beta**2) - res = {"haar": np.zeros(len(snr_db)), "wh": np.zeros(len(snr_db))} - for _ in range(ntr): - e1, e2 = embed_pair(d, beta) - M1, M2 = two_user_masks(d, beta) - D1 = np.diag(rng.choice([-1.0, 1.0], d)) - D2 = np.diag(rng.choice([-1.0, 1.0], d)) - W1 = H @ D1 - W2 = beta * W1 + g * (H @ D2) - r0h = (M1 @ e1) + (M2 @ e2) - r0w = (W1 @ e1) + (W2 @ e2) - n = (rng.standard_normal(d) + 1j * rng.standard_normal(d)) / math.sqrt(2) - for k, s in enumerate(snr_db): - sig = 10 ** (-s / 20.0) - g1, _ = demux(r0h + sig * n, M1, M2, 1.0, 1.0, beta) - w1, _ = demux(r0w + sig * n, W1, W2, 1.0, 1.0, beta) - res["haar"][k] += cosine(g1, e1) - res["wh"][k] += cosine(w1, e1) - for k in res: - res[k] /= ntr - dev = 100 * np.max(np.abs(res["wh"] - res["haar"])) - print(f" max |WH - Haar| cosine deviation: {dev:.2f} points") - fig, ax = plt.subplots() - ax.plot(snr_db, res["haar"], "o-", color="C3", - label=r"Haar mixture, $\mathcal{O}(d^2)$") - ax.plot(snr_db, res["wh"], "s--", color="C0", - label=r"Walsh-Hadamard, $\mathcal{O}(d\log d)$") - ax.set_xlabel("Per-block SNR $\\rho$ [dB]") - ax.set_ylabel("Mean cosine similarity") - ax.set_xlim(snr_db[0], snr_db[-1]); ax.set_ylim(0, 0.8) - ax.legend(loc="upper left") - save_fig(fig, "fig_maskfam") - rows = [[s, res["haar"][i], res["wh"][i]] for i, s in enumerate(snr_db)] - write_csv("mask_family_rev", ["snr_db", "haar", "wh"], rows) - - -# ------------------------------------------------------------------ -# E6 : high-affinity combining mode -# ------------------------------------------------------------------ -def E6_coop(d=512, snr=20.0, betas=np.linspace(0.0, 0.98, 21), ntr=100): - print("\n=== E6: high-affinity combining-mode crossover ===") - sig = 10 ** (-snr / 20.0) - pairs = [(haar(d), haar(d)) for _ in range(ntr)] - chans = [rayleigh(2) for _ in range(ntr)] - cos_dx = np.zeros(len(betas)); cos_cb = np.zeros(len(betas)) - for j, beta in enumerate(betas): - for t in range(ntr): - U1, U2 = pairs[t] - h1, h2 = chans[t] - e1, e2 = embed_pair(d, beta) - M1, M2 = two_user_masks(d, beta, U1, U2) - r = h1 * (M1 @ e1) + h2 * (M2 @ e2) + sig * ( - rng.standard_normal(d) + 1j * rng.standard_normal(d)) / math.sqrt(2) - g1, _ = demux(r, M1, M2, h1, h2, beta) - cos_dx[j] += cosine(g1, e1) - # affinity combining: coherent weights for the e1 component - a1 = h1 + beta**2 * h2 - a2 = beta * (h1 + h2) - comb = np.conj(a1) * (M1.T @ r) + np.conj(a2) * (M2.T @ r) - cos_cb[j] += cosine(comb, e1) - cos_dx /= ntr; cos_cb /= ntr - ix = np.where(cos_cb >= cos_dx)[0] - cross = betas[ix[0]] if len(ix) else float("nan") - print(f" crossover affinity ~ {cross:.2f} at rho={snr:.0f} dB") - fig, ax = plt.subplots() - ax.plot(betas, cos_dx, "o-", color="C3", label="Separation mode (demux)") - ax.plot(betas, cos_cb, "s--", color="C0", label="Combining mode") - ax.set_xlabel(r"Pairwise affinity $\beta$") - ax.set_ylabel("Mean cosine similarity") - ax.set_xlim(0, 1); ax.set_ylim(0, 0.8) - ax.legend(loc="lower left") - save_fig(fig, "fig_coop") - rows = [[b, cos_dx[i], cos_cb[i]] for i, b in enumerate(betas)] - write_csv("coop_mode", ["beta", "cos_demux", "cos_combine"], rows) - return cross - - -# ------------------------------------------------------------------ -# E7 : corrected effective-rate figures -# ------------------------------------------------------------------ -def eta_edma(rho, d, beta, csi=None): - g = 1.0 - beta**2 - if csi is None: - csi = C_bar(beta) # symmetrised constant (alternating masks) - return 1.0 / (d / (rho * g) + csi) +def T_blind(rho, d): + return 2.0 * math.log2(1.0 + 1.0 / (1.0 + d / rho)) def E7_rates(beta=0.311, d=512): - print("\n=== E7a: corrected effective-rate comparison ===") - snr_db = np.arange(0, 31, 1.0) + print("\n=== E7a: effective-rate comparison ===") + snr_db = np.arange(0, 41, 0.5) rho = 10 ** (snr_db / 10.0) - g = 1.0 - beta**2 - T_edma = 2 * np.log2(1 + eta_edma(rho, d, beta)) - T_ideal = 2 * np.log2(1 + rho * g / d) - T_oma = 2 * np.log2(1 + rho / (2 * d)) - T_genie = 2 * np.log2(1 + rho / d) - C_mac = np.log2(1 + 2 * rho / d) + Te = np.array([T_edma(r, d, beta) for r in rho]) + Tb = np.array([T_blind(r, d) for r in rho]) + To = 2 * np.log2(1 + rho / (2 * d)) + Tg = 2 * np.log2(1 + rho / d) + Cm = np.log2(1 + 2 * rho / d) fig, ax = plt.subplots() - ax.plot(snr_db, T_edma, "-", color="C3", label="EDMA (Theorem 1)") - ax.plot(snr_db, T_ideal, ":", color="C3", lw=1.1, - label="EDMA idealized (infeasible)") - ax.plot(snr_db, T_oma, "--", color="C1", label="OMA") - ax.plot(snr_db, T_genie, "-.", color="C0", label="Genie-aided SIC bound") - ax.plot(snr_db, C_mac, "-", color="k", lw=1.0, label="MAC sum capacity") + ax.plot(snr_db, Te, "-", color="C3", label=LBL["edma"]) + ax.plot(snr_db, Tb, ":", color="C4", lw=1.2, label=LBL["blind"]) + ax.plot(snr_db, To, "--", color="C1", label=LBL["oma"]) + ax.plot(snr_db, Tg, "-.", color="C0", label=LBL["genie"]) + ax.plot(snr_db, Cm, "-", color="k", lw=1.0, label=LBL["mac"]) ax.set_xlabel("Per-block SNR $\\rho$ [dB]") ax.set_ylabel("Effective sum rate [bps/Hz]") - ax.set_xlim(0, 30); ax.set_ylim(0, 3.2) + ax.set_xlim(0, 40); ax.set_ylim(0, 3.2) ax.legend(loc="upper left") save_fig(fig, "fig_rate_corrected") - rows = [[s, T_edma[i], T_ideal[i], T_oma[i], T_genie[i], C_mac[i]] + rows = [[s, Te[i], Tb[i], To[i], Tg[i], Cm[i]] for i, s in enumerate(snr_db)] write_csv("rate_corrected", - ["snr_db", "edma", "edma_ideal", "oma", "genie", "mac"], rows) + ["snr_db", "edma", "blind", "oma", "genie", "mac"], rows) i20 = list(snr_db).index(20.0) - csi = C_bar(beta) - rho_c = d * (2 - 1 / g) / csi - print(f" at 20 dB: EDMA {T_edma[i20]:.3f}, OMA {T_oma[i20]:.3f} " - f"(gain {T_edma[i20]/T_oma[i20]:.2f}x), MAC {C_mac[i20]:.3f}, " - f"EDMA/MAC {T_edma[i20]/C_mac[i20]:.3f} (gamma={g:.3f})") - print(f" OMA re-crossover rho_c = {10*math.log10(rho_c):.1f} dB") + print(f" at 20 dB: EDMA {Te[i20]:.3f}, blind {Tb[i20]:.3f}, " + f"OMA {To[i20]:.3f} (gain {Te[i20]/To[i20]:.2f}x), " + f"MAC {Cm[i20]:.3f}, EDMA/MAC {Te[i20]/Cm[i20]:.3f}") + g = 1.0 - beta**2 + rho_c = 2 * d * (2 / math.sqrt(g) - 1) + ix = np.where(To >= Te)[0] + rc_num = snr_db[ix[0]] if len(ix) else float("nan") + print(f" OMA re-crossover: floor formula {10*math.log10(rho_c):.1f} dB, " + f"numerical {rc_num:.1f} dB " + f"(blind: {10*math.log10(2*d):.1f} dB)") - print("\n=== E7b: corrected beta sweep ===") + print("\n=== E7b: value-of-affinity sweep ===") betas = np.linspace(0.0, 0.98, 99) fig, ax = plt.subplots() rows = [] for s, col in ((10, "C0"), (20, "C3")): rho_s = 10 ** (s / 10.0) - Te = np.array([2 * np.log2(1 + eta_edma(rho_s, d, b)) for b in betas]) - To = 2 * np.log2(1 + rho_s / (2 * d)) - Tg = 2 * np.log2(1 + rho_s / d) + Te = np.array([T_edma(rho_s, d, b) for b in betas]) + Tb = T_blind(rho_s, d) + To = 2 * math.log2(1 + rho_s / (2 * d)) + Tg = 2 * math.log2(1 + rho_s / d) ax.plot(betas, Te, "-", color=col, label=rf"EDMA, $\rho={s}$ dB") - ax.axhline(To, color=col, ls="--", lw=1.0, - label=rf"OMA, $\rho={s}$ dB") - ax.axhline(Tg, color=col, ls="-.", lw=0.8, - label=rf"Genie-aided SIC, $\rho={s}$ dB") - ix = np.where(Te <= To)[0] - bstar = betas[ix[0]] if len(ix) else float("nan") - print(f" rho={s} dB: crossover beta* = {bstar:.3f} " - f"(wideband limit 1/sqrt(2)=0.707)") + ax.axhline(Tb, color=col, ls=":", lw=1.0) + ax.axhline(To, color=col, ls="--", lw=1.0) + ax.axhline(Tg, color=col, ls="-.", lw=0.8) + ixg = np.where(Te >= Tg)[0] + bg = betas[ixg[0]] if len(ixg) else float("nan") + print(f" rho={s} dB: EDMA(0)/blind = {Te[0]/Tb:.3f}, " + f"EDMA(0.311) gain over blind " + f"{Te[np.argmin(abs(betas-0.311))]/Tb:.3f}x, " + f"crosses genie at beta ~ {bg:.2f}") for i, b in enumerate(betas): - rows.append([s, b, Te[i], To, Tg]) - for b0 in (0.031, 0.311): + rows.append([s, b, Te[i], Tb, To, Tg]) + for b0 in (0.030, 0.311): ax.axvline(b0, color="gray", ls=":", lw=0.9) ax.set_xlabel(r"Pairwise affinity $\beta$") ax.set_ylabel("Effective sum rate [bps/Hz]") - ax.set_xlim(0, 1); ax.set_ylim(0, 1.02) - ax.set_yticks([0.0, 0.2, 0.4, 0.6, 0.8, 1.0]) - ax.legend(loc="upper right", ncol=1, fontsize=5.8, - handlelength=1.5, borderaxespad=0.2) + ax.set_xlim(0, 1) + ax.legend(loc="upper left") save_fig(fig, "fig_beta_sweep_corrected") write_csv("beta_sweep_corrected", - ["snr_db", "beta", "edma", "oma", "genie"], rows) - - -def E7_multiuser(beta=0.311, d=512, Us=(2, 3, 4), ntr_cal=80, ntr_mc=120): - print("\n=== E7c: corrected multi-user scaling ===") - snr_db = np.arange(0, 31, 2.5) - snr_mk = np.arange(0, 31, 5) - rho = 10 ** (snr_db / 10.0) - fig, ax = plt.subplots() - colors = {2: "C0", 3: "C2", 4: "C3"} - rows = [] - csi2 = C_SI(beta, 1.0 + 0j) - for U in Us: - B = (1 - beta) * np.eye(U) + beta * np.ones((U, U)) - Binv_uu = np.linalg.inv(B)[0, 0] - gU = 1.0 / Binv_uu - # calibrate C_SI^(U) by noise-free MC at h_u = 1 (the same - # evaluation convention as the two-user rate curves, so the - # U = 2 curve reduces exactly to T_EDMA with C_bar), - # averaged over all users (mask roles are asymmetric) - acc = 0.0 - for _ in range(ntr_cal): - A = np.linalg.cholesky(B) - Uks = [haar(d) for _ in range(U)] - Ms = [sum(A[u, k] * Uks[k] for k in range(U)) for u in range(U)] - h = np.ones(U, dtype=complex) - # symmetric equal-affinity embeddings: e_u = beta-mixed set - base = unit(rng.standard_normal(d)) - es = [] - for u in range(U): - w = rng.standard_normal(d) - w = unit(w - (w @ base) * base) - # construct so that ~ beta pairwise - es.append(unit(math.sqrt(beta) * base - + math.sqrt(1 - beta) * w)) - r = sum(h[u] * (Ms[u] @ es[u]) for u in range(U)) - Binv = np.linalg.inv(B) - # block demux e_hat_u = (1/h_u) sum_v Binv[u,v] M_v^T r - for u in range(U): - eh = sum(Binv[u, v] * (Ms[v].T @ r) for v in range(U)) / h[u] - acc += np.linalg.norm(eh - es[u])**2 - csiU = acc / (ntr_cal * U) - print(f" U={U}: C_SI^(U) = {csiU:.3f} " - f"((U-1)*C_bar = {(U-1)*C_bar(beta):.3f}), gamma_U = {gU:.3f}") - eta = 1.0 / (d * Binv_uu / rho + csiU) - T_th = U * np.log2(1 + eta) - T_oma = U * np.log2(1 + rho / (U * d)) - ax.plot(snr_db, T_th, "-", color=colors[U], label=rf"EDMA, $U={U}$") - ax.plot(snr_db, T_oma, "--", color=colors[U], lw=1.0, - label=rf"OMA, $U={U}$") - # MC markers (with noise, h_u = 1, per-realization real masks) - err_mc = np.zeros(len(snr_mk)) - for _ in range(ntr_mc): - A = np.linalg.cholesky(B) - Uks = [haar(d) for _ in range(U)] - Ms = [sum(A[u, k] * Uks[k] for k in range(U)) for u in range(U)] - h = np.ones(U, dtype=complex) - base = unit(rng.standard_normal(d)) - es = [] - for u in range(U): - w = rng.standard_normal(d) - w = unit(w - (w @ base) * base) - es.append(unit(math.sqrt(beta) * base - + math.sqrt(1 - beta) * w)) - r0 = sum(h[u] * (Ms[u] @ es[u]) for u in range(U)) - n = (rng.standard_normal(d) + 1j * rng.standard_normal(d)) / math.sqrt(2) - Binv = np.linalg.inv(B) - for k, s in enumerate(snr_mk): - sig = 10 ** (-s / 20.0) - r = r0 + sig * n - for u in range(U): - eh = sum(Binv[u, v] * (Ms[v].T @ r) for v in range(U)) / h[u] - err_mc[k] += np.linalg.norm(eh - es[u])**2 - err_mc /= ntr_mc * U - T_mc = U * np.log2(1 + 1.0 / err_mc) - ax.plot(snr_mk, T_mc, "o", color=colors[U], ms=4, mfc="none") - for i, s in enumerate(snr_db): - rows.append([U, s, T_th[i], T_oma[i]]) - i20 = list(snr_db).index(20.0) - print(f" at 20 dB: EDMA {T_th[i20]:.3f} vs OMA {T_oma[i20]:.3f} " - f"(gain {T_th[i20]/T_oma[i20]:.2f}x)") - ax.set_xlabel("Per-block SNR $\\rho$ [dB]") - ax.set_ylabel("Effective sum rate [bps/Hz]") - ax.set_xlim(0, 30); ax.set_ylim(0, 1.5) - ax.legend(loc="upper left", ncol=1, fontsize=6.2) - save_fig(fig, "fig_multiuser_corrected") - write_csv("multiuser_corrected", ["U", "snr_db", "edma", "oma"], rows) + ["snr_db", "beta", "edma", "blind", "oma", "genie"], rows) if __name__ == "__main__": import sys todo = set(sys.argv[1:]) ALL = { - "E0": E0_theorem_check, "E1": E1_floor, "E2": E2_sic, - "E3": E3_regularised, "E4": E4_csi, "E5": E5_maskfam, - "E6": E6_coop, "E7a": E7_rates, "E7c": E7_multiuser, + "E0": E0_theorem_check, "E1": E1_floor, "E7a": E7_rates, } for name, fn in ALL.items(): if not todo or name in todo: fn() - print("\nAll requested revision simulations complete.") + print("\nAll requested simulations complete.") diff --git a/code/revision_sims_gpu.py b/code/revision_sims_gpu.py new file mode 100644 index 0000000..53bf255 --- /dev/null +++ b/code/revision_sims_gpu.py @@ -0,0 +1,416 @@ +""" +GPU-accelerated Monte Carlo experiments (torch backend). +======================================================== +Computes the CSV artifacts of experiments E2, E3, E4, E5, E7c, E8 +of revision_sims.py with identical models and conventions, using +torch (CUDA when available) for the dense linear algebra. All +random draws come from the numpy generator with the documented seed +2026, so the sample stream is platform-independent; torch only +accelerates QR, matrix products, and linear solves in float32 / +complex64 precision. Figures are rendered separately by +replot_all.py, which reads only data/. + +Run under WSL: python3 revision_sims_gpu.py E2 E3 E4 E5 E7c E8 +""" +from __future__ import annotations +import csv +import math +import sys +import time +from pathlib import Path +import numpy as np +import torch + +ROOT = Path(__file__).resolve().parents[1] +CSV_DIR = ROOT / "data" + +SEED = 2026 +rng = np.random.default_rng(SEED) +DEV = "cuda" if torch.cuda.is_available() else "cpu" +print(f"[gpu] device = {DEV}") + + +def write_csv(name, header, rows): + p = CSV_DIR / f"{name}.csv" + with open(p, "w", newline="") as f: + w = csv.writer(f); w.writerow(header); w.writerows(rows) + print(f"[OK] wrote {p}") + + +def haar_g(d): + """Haar orthogonal on the GPU from a numpy Gaussian draw.""" + G = torch.tensor(rng.standard_normal((d, d)), dtype=torch.float32, + device=DEV) + Q, R = torch.linalg.qr(G) + return Q * torch.sign(torch.diagonal(R)).unsqueeze(0) + + +def embed_pair(d, beta): + e1 = rng.standard_normal(d) + e1 /= np.linalg.norm(e1) + w = rng.standard_normal(d) + w -= (w @ e1) * e1 + w /= np.linalg.norm(w) + e2 = beta * e1 + math.sqrt(1.0 - beta**2) * w + return (torch.tensor(e1, dtype=torch.float32, device=DEV), + torch.tensor(e2, dtype=torch.float32, device=DEV)) + + +def rayleigh2(): + h = (rng.standard_normal(2) + 1j * rng.standard_normal(2)) / math.sqrt(2) + return complex(h[0]), complex(h[1]) + + +def cnoise_g(d): + n = (rng.standard_normal(d) + 1j * rng.standard_normal(d)) / math.sqrt(2) + return torch.tensor(n, dtype=torch.complex64, device=DEV) + + +def aware_g(t, Q, beta, c, nvar): + """Batched aware Wiener demux. t: (b,d) cfloat, Q: (d,d) float, + c: python complex, nvar: (b,) tensor.""" + d = Q.shape[0] + b = t.shape[0] + g = 1.0 - beta * beta + rho = g * abs(c)**2 / d + nvar + A = torch.eye(d, device=DEV, dtype=torch.complex64) \ + + beta * c * Q.to(torch.complex64) + S = (A @ A.mH / d).unsqueeze(0) \ + + rho.view(b, 1, 1) * torch.eye(d, device=DEV, + dtype=torch.complex64) + x = torch.linalg.solve(S, t.unsqueeze(-1)) + return (A.mH.unsqueeze(0) @ x).squeeze(-1) / d + + +def abscos(a, e): + num = (a * e.to(a.dtype).conj()).sum(-1).abs() + return (num / (a.norm(dim=-1) * e.norm())).cpu().numpy() + + +# ------------------------------------------------------------------ +def E2_sic(beta=0.311, d=512, ntr=400): + print("\n=== E2: receiver comparison under block-Rayleigh fading ===") + snr_db = np.arange(0, 31, 2.5) + sigs = torch.tensor(10 ** (-snr_db / 20.0), dtype=torch.float32, + device=DEV) + nb = len(snr_db) + res = {k: np.zeros(nb) for k in ("edma", "blind", "oma", "genie", "sic")} + t0 = time.time() + for tr in range(ntr): + e1, e2 = embed_pair(d, beta) + M1, M2 = haar_g(d), haar_g(d) + Q = M1.T @ M2 + h1, h2 = rayleigh2() + n = cnoise_g(d); n2 = cnoise_g(d) + r0 = h1 * (M1 @ e1).to(torch.complex64) \ + + h2 * (M2 @ e2).to(torch.complex64) + r = r0.unsqueeze(0) + sigs.view(-1, 1) * n.unsqueeze(0) + t1 = (M1.T.to(torch.complex64) @ r.unsqueeze(-1)).squeeze(-1) / h1 + t2 = (M2.T.to(torch.complex64) @ r.unsqueeze(-1)).squeeze(-1) / h2 + c1, c2 = h2 / h1, h1 / h2 + v1 = sigs**2 / abs(h1)**2 + v2 = sigs**2 / abs(h2)**2 + g1 = aware_g(t1, Q, beta, c1, v1) + g2 = aware_g(t2, Q.T, beta, c2, v2) + res["edma"] += 0.5 * (abscos(g1, e1) + abscos(g2, e2)) + res["blind"] += 0.5 * (abscos(t1, e1) + abscos(t2, e2)) + o1 = e1.to(torch.complex64).unsqueeze(0) \ + + math.sqrt(2) * sigs.view(-1, 1) * n.unsqueeze(0) / h1 + o2 = e2.to(torch.complex64).unsqueeze(0) \ + + math.sqrt(2) * sigs.view(-1, 1) * n2.unsqueeze(0) / h2 + res["oma"] += 0.5 * (abscos(o1, e1) + abscos(o2, e2)) + ge1 = (M1.T.to(torch.complex64) + @ (r - h2 * (M2 @ e2).to(torch.complex64)).unsqueeze(-1) + ).squeeze(-1) / h1 + ge2 = (M2.T.to(torch.complex64) + @ (r - h1 * (M1 @ e1).to(torch.complex64)).unsqueeze(-1) + ).squeeze(-1) / h2 + res["genie"] += 0.5 * (abscos(ge1, e1) + abscos(ge2, e2)) + # realizable decision-directed SIC: the stronger user is detected + # with the same aware Wiener stage (a scalar-scaled matched-filter + # decision would re-modulate to a multiple of r itself, because + # M_s M_s^T = I, and cancel nothing), its re-modulated estimate is + # subtracted, and the weaker user is read from the residual. + if abs(h1) >= abs(h2): + hs, hw, Ms, Mw, es, ew = h1, h2, M1, M2, e1, e2 + Qsw, csw, vsw = Q, c1, v1 + else: + hs, hw, Ms, Mw, es, ew = h2, h1, M2, M1, e2, e1 + Qsw, csw, vsw = Q.T, c2, v2 + t_s = (Ms.T.to(torch.complex64) @ r.unsqueeze(-1)).squeeze(-1) / hs + dec = aware_g(t_s, Qsw, beta, csw, vsw) + r_res = r - hs * (Ms.to(torch.complex64) + @ dec.unsqueeze(-1)).squeeze(-1) + d_w = (Mw.T.to(torch.complex64) @ r_res.unsqueeze(-1)).squeeze(-1) / hw + res["sic"] += 0.5 * (abscos(dec, es) + abscos(d_w, ew)) + if (tr + 1) % 100 == 0: + print(f" {tr+1}/{ntr} ({time.time()-t0:.0f}s)", flush=True) + for k in res: + res[k] /= ntr + rows = [[s] + [res[k][i] for k in ("edma", "blind", "oma", "genie", "sic")] + for i, s in enumerate(snr_db)] + write_csv("sic_comparison", + ["snr_db", "edma", "blind", "oma", "genie", "sic"], rows) + i20 = list(snr_db).index(20) + print(f" at 20 dB: EDMA {res['edma'][i20]:.3f}, blind " + f"{res['blind'][i20]:.3f}, SIC {res['sic'][i20]:.3f}, " + f"genie {res['genie'][i20]:.3f}, OMA {res['oma'][i20]:.3f}") + + +# ------------------------------------------------------------------ +def E3_unconditional(beta=0.311, d=512, ntr=1500): + print("\n=== E3: Rayleigh unconditional MSE of the aware receiver ===") + rows = [] + for s in (10, 20): + sig = 10 ** (-s / 20.0) + mses, bl = [], [] + for _ in range(ntr): + e1, e2 = embed_pair(d, beta) + M1, M2 = haar_g(d), haar_g(d) + Q = M1.T @ M2 + h1, h2 = rayleigh2() + n = cnoise_g(d) + r = h1 * (M1 @ e1).to(torch.complex64) \ + + h2 * (M2 @ e2).to(torch.complex64) + sig * n + t1 = (M1.T.to(torch.complex64) @ r) / h1 + c1 = h2 / h1 + nv = torch.tensor([sig**2 / abs(h1)**2], device=DEV) + g1 = aware_g(t1.unsqueeze(0), Q, beta, c1, nv)[0] + mses.append(float((g1 - e1.to(torch.complex64)).norm()**2)) + lam = (1.0 / d) / (1.0 / d + abs(c1)**2 / d + sig**2 / abs(h1)**2) + b1 = lam * t1 + bl.append(float((b1 - e1.to(torch.complex64)).norm()**2)) + rows.append([s, float(np.mean(mses)), float(np.median(mses)), + float(np.mean(bl)), float(np.median(bl))]) + print(f" {s} dB: aware mean {rows[-1][1]:.4f} " + f"(median {rows[-1][2]:.4f}) | blind mean {rows[-1][3]:.4f} " + f"(median {rows[-1][4]:.4f})") + write_csv("rayleigh_mse", ["snr_db", "aware_mean", "aware_median", + "blind_mean", "blind_median"], rows) + + +# ------------------------------------------------------------------ +def E4_csi(beta=0.311, d=512, snr=30.0, ntr=400): + print("\n=== E4: imperfect CSI robustness (EDMA vs realizable SIC) ===") + sh2 = np.array([0.0, 0.01, 0.02, 0.05, 0.1, 0.2, 0.3]) + sig = 10 ** (-snr / 20.0) + res_e = np.zeros(len(sh2)); res_s = np.zeros(len(sh2)) + for _ in range(ntr): + e1, e2 = embed_pair(d, beta) + M1, M2 = haar_g(d), haar_g(d) + Q = M1.T @ M2 + h1, h2 = rayleigh2() + n = cnoise_g(d) + r = h1 * (M1 @ e1).to(torch.complex64) \ + + h2 * (M2 @ e2).to(torch.complex64) + sig * n + eps1, eps2 = rayleigh2() + for j, v in enumerate(sh2): + hh1 = h1 + math.sqrt(v) * eps1 + hh2 = h2 + math.sqrt(v) * eps2 + t1 = (M1.T.to(torch.complex64) @ r) / hh1 + t2 = (M2.T.to(torch.complex64) @ r) / hh2 + nv1 = torch.tensor([sig**2 / abs(hh1)**2], device=DEV) + nv2 = torch.tensor([sig**2 / abs(hh2)**2], device=DEV) + g1 = aware_g(t1.unsqueeze(0), Q, beta, hh2 / hh1, nv1)[0] + g2 = aware_g(t2.unsqueeze(0), Q.T, beta, hh1 / hh2, nv2)[0] + res_e[j] += 0.5 * (float(abscos(g1.unsqueeze(0), e1)[0]) + + float(abscos(g2.unsqueeze(0), e2)[0])) + if abs(hh1) >= abs(hh2): + hs, hw, Ms, Mw, es, ew = hh1, hh2, M1, M2, e1, e2 + Qsw, csw = Q, hh2 / hh1 + else: + hs, hw, Ms, Mw, es, ew = hh2, hh1, M2, M1, e2, e1 + Qsw, csw = Q.T, hh1 / hh2 + t_s = (Ms.T.to(torch.complex64) @ r) / hs + nvs = torch.tensor([sig**2 / abs(hs)**2], device=DEV) + dec = aware_g(t_s.unsqueeze(0), Qsw, beta, csw, nvs)[0] + r_res = r - hs * (Ms.to(torch.complex64) @ dec) + d_w = (Mw.T.to(torch.complex64) @ r_res) / hw + res_s[j] += 0.5 * (float(abscos(dec.unsqueeze(0), es)[0]) + + float(abscos(d_w.unsqueeze(0), ew)[0])) + res_e /= ntr; res_s /= ntr + print(f" EDMA: {res_e[0]:.4f} -> {res_e[-1]:.4f} " + f"(delta {100*(res_e[0]-res_e[-1]):.2f} points)") + print(f" SIC : {res_s[0]:.4f} -> {res_s[-1]:.4f} " + f"(delta {100*(res_s[0]-res_s[-1]):.2f} points)") + rows = [[v, res_e[j], res_s[j]] for j, v in enumerate(sh2)] + write_csv("csi_error", ["sigma_h2", "edma", "sic"], rows) + + +# ------------------------------------------------------------------ +def E5_maskfam(beta=0.311, d=512, ntr=200): + print("\n=== E5: Walsh-Hadamard diagonal variant vs Haar ===") + snr_db = np.arange(0, 41, 5) + sigs = torch.tensor(10 ** (-snr_db / 20.0), dtype=torch.float32, + device=DEV) + nb = len(snr_db) + H = np.array([[1.0]]) + while H.shape[0] < d: + H = np.block([[H, H], [H, -H]]) + Ht = torch.tensor(H / math.sqrt(d), dtype=torch.float32, device=DEV) + g = 1.0 - beta**2 + res = {"haar": np.zeros(nb), "wh": np.zeros(nb)} + exact = np.zeros(nb) + for _ in range(ntr): + e1, e2 = embed_pair(d, beta) + M1, M2 = haar_g(d), haar_g(d) + Q = M1.T @ M2 + D1 = torch.tensor(np.sign(rng.standard_normal(d)), + dtype=torch.float32, device=DEV) + D2 = torch.tensor(np.sign(rng.standard_normal(d)), + dtype=torch.float32, device=DEV) + W1, W2 = Ht * D1.unsqueeze(0), Ht * D2.unsqueeze(0) + q = D1 * D2 + n = cnoise_g(d) + r0h = (M1 @ e1 + M2 @ e2).to(torch.complex64) + r0w = (W1 @ e1 + W2 @ e2).to(torch.complex64) + rh = r0h.unsqueeze(0) + sigs.view(-1, 1) * n.unsqueeze(0) + rw = r0w.unsqueeze(0) + sigs.view(-1, 1) * n.unsqueeze(0) + t1 = (M1.T.to(torch.complex64) @ rh.unsqueeze(-1)).squeeze(-1) + g1 = aware_g(t1, Q, beta, 1.0, sigs**2) + res["haar"] += abscos(g1, e1) + tw = (W1.T.to(torch.complex64) @ rw.unsqueeze(-1)).squeeze(-1) + a = 1.0 + beta * q # (d,) + rho = g / d + sigs**2 # (nb,) + wdiag = a.unsqueeze(0) / (a.unsqueeze(0)**2 / d + + rho.view(-1, 1)) # (nb,d) + w1 = (wdiag.to(torch.complex64) / d) * tw + res["wh"] += abscos(w1, e1) + exact += ((g + d * sigs.view(-1, 1)**2) + / (a.unsqueeze(0)**2 + g + d * sigs.view(-1, 1)**2) + ).mean(1).cpu().numpy() + for k in res: + res[k] /= ntr + exact /= ntr + print(f" max |WH - Haar| cosine dev: " + f"{100*np.max(np.abs(res['wh']-res['haar'])):.2f} points; " + f"40 dB WH {res['wh'][-1]:.4f} vs Haar {res['haar'][-1]:.4f}") + rows = [[s, res["haar"][i], res["wh"][i], exact[i]] + for i, s in enumerate(snr_db)] + write_csv("mask_family_rev", ["snr_db", "haar", "wh", "wh_exact_mse"], + rows) + + +# ------------------------------------------------------------------ +def E7_multiuser(beta=0.311, d=512, ntr=100): + print("\n=== E7c: multi-user scaling (joint Wiener) ===") + snr_db = np.arange(0, 31, 2.5) + sigs = torch.tensor(10 ** (-snr_db / 20.0), dtype=torch.float32, + device=DEV) + nb = len(snr_db) + rows = [] + for U in (2, 3, 4): + B = (1 - beta) * np.eye(U) + beta * np.ones((U, U)) + A = np.linalg.cholesky(B) + Bt = torch.tensor(B, dtype=torch.float32, device=DEV) + err = np.zeros(nb) + t0 = time.time() + for _ in range(ntr): + F = rng.standard_normal((d, U)) + Fq, _ = np.linalg.qr(F) + E = (Fq @ A.T).T + Et = torch.tensor(E, dtype=torch.float32, device=DEV) + masks = [haar_g(d) for _ in range(U)] + n = cnoise_g(d) + r0 = sum(masks[u] @ Et[u] for u in range(U)).to(torch.complex64) + Qs = [masks[0].T @ masks[v] for v in range(U)] + Ret = sum(Bt[0, v] * Qs[v].T for v in range(U)) / d + S0 = sum(Bt[v, w] * (Qs[v] @ Qs[w].T) + for v in range(U) for w in range(U)) / d + r = r0.unsqueeze(0) + sigs.view(-1, 1) * n.unsqueeze(0) + t = (masks[0].T.to(torch.complex64) + @ r.unsqueeze(-1)).squeeze(-1) + S = S0.to(torch.complex64).unsqueeze(0) \ + + (sigs**2).view(-1, 1, 1) \ + * torch.eye(d, device=DEV, dtype=torch.complex64) + x = torch.linalg.solve(S, t.unsqueeze(-1)) + eh = (Ret.to(torch.complex64).unsqueeze(0) @ x).squeeze(-1) + err += ((eh - Et[0].to(torch.complex64)).norm(dim=1)**2 + ).cpu().numpy() + err /= ntr + T_mc = U * np.log2(1.0 / err) + r0v = (U - 1) + d / 10 ** (snr_db / 10.0) + T_bl = U * np.log2(1.0 + 1.0 / r0v) + T_oma = U * np.log2(1 + 10 ** (snr_db / 10.0) / (U * d)) + for i, s in enumerate(snr_db): + rows.append([U, s, T_mc[i], T_bl[i], T_oma[i], err[i]]) + i20 = list(snr_db).index(20.0) + print(f" U={U}: at 20 dB EDMA {T_mc[i20]:.3f} vs blind " + f"{T_bl[i20]:.3f} vs OMA {T_oma[i20]:.3f} " + f"(gain {T_mc[i20]/T_oma[i20]:.2f}x), floor MSE {err[-1]:.4f}" + f" [{time.time()-t0:.0f}s]") + write_csv("multiuser_corrected", + ["U", "snr_db", "edma_mc", "blind", "oma", "mse_mc"], rows) + + +# ------------------------------------------------------------------ +def E8_mismatch(beta=0.311, d=512, snr=20.0, ntr=200): + print("\n=== E8: affinity mismatch of the aware receiver ===") + sig = 10 ** (-snr / 20.0) + bhs = [b for b in (beta - 0.1, beta - 0.06, beta, beta + 0.06, + beta + 0.1, beta + 2 ** -8, 0.0) if b >= 0] + accs = np.zeros(len(bhs)); msea = np.zeros(len(bhs)) + for _ in range(ntr): + e1, e2 = embed_pair(d, beta) + M1, M2 = haar_g(d), haar_g(d) + Q = M1.T @ M2 + n = cnoise_g(d) + r = (M1 @ e1 + M2 @ e2).to(torch.complex64) + sig * n + t1 = (M1.T.to(torch.complex64) @ r) + nv = torch.tensor([sig**2], device=DEV) + for j, bh in enumerate(bhs): + g1 = aware_g(t1.unsqueeze(0), Q, bh, 1.0, nv)[0] + accs[j] += float(abscos(g1.unsqueeze(0), e1)[0]) + msea[j] += float((g1 - e1.to(torch.complex64)).norm()**2) + accs /= ntr; msea /= ntr + rows = [] + for j, bh in enumerate(bhs): + tag = ("quant b=7" if abs(bh - beta - 2**-8) < 1e-12 else + ("blind" if bh == 0.0 else f"delta={bh-beta:+.2f}")) + print(f" beta_hat={bh:.4f} ({tag}): cosine {accs[j]:.4f}, " + f"MSE {msea[j]:.4f}") + rows.append([bh, accs[j], msea[j]]) + write_csv("mismatch", ["beta_hat", "cosine", "mse"], rows) + + + + +# ------------------------------------------------------------------ +def E9_ceiling(d=512, snr=60.0, ntr=200): + print(chr(10) + '=== E9: cosine-ceiling verification (h=1) ===') + sig = 10 ** (-snr / 20.0) + rows = [] + for beta in (0.311, 0.8): + g = 1.0 - beta**2 + acc_a = 0.0; acc_b = 0.0 + for _ in range(ntr): + e1, e2 = embed_pair(d, beta) + M1, M2 = haar_g(d), haar_g(d) + Q = M1.T @ M2 + n = cnoise_g(d) + r = (M1 @ e1 + M2 @ e2).to(torch.complex64) + sig * n + t1 = (M1.T.to(torch.complex64) @ r) + nv = torch.tensor([sig**2], device=DEV) + g1 = aware_g(t1.unsqueeze(0), Q, beta, 1.0, nv)[0] + acc_a += float(abscos(g1.unsqueeze(0), e1)[0]) + acc_b += float(abscos(t1.unsqueeze(0), e1)[0]) + acc_a /= ntr; acc_b /= ntr + import math as _m + pred_a = _m.sqrt(1.0 - _m.sqrt(g) / 2.0) + pred_b = _m.sqrt(0.5) + print(f' beta={beta}: aware MC {acc_a:.4f} pred {pred_a:.4f} | ' + f'blind MC {acc_b:.4f} pred {pred_b:.4f}') + rows.append([beta, acc_a, pred_a, acc_b, pred_b]) + write_csv('cosine_ceiling', ['beta', 'aware_mc', 'aware_pred', + 'blind_mc', 'blind_pred'], rows) + + +if __name__ == "__main__": + todo = set(sys.argv[1:]) + ALL = {"E2": E2_sic, "E3": E3_unconditional, "E4": E4_csi, + "E5": E5_maskfam, "E7c": E7_multiuser, "E8": E8_mismatch, + "E9": E9_ceiling} + for name, fn in ALL.items(): + if not todo or name in todo: + fn() + print("\nAll requested GPU simulations complete.") diff --git a/code/verify_math.py b/code/verify_math.py index 0a4ccd4..b779c6d 100644 --- a/code/verify_math.py +++ b/code/verify_math.py @@ -1,70 +1,35 @@ """ -Complete numerical verification of every closed form in the manuscript. -======================================================================= -Each check implements the formula EXACTLY as printed in main.tex and -compares it against a direct Monte-Carlo or algebraic evaluation. -Prints PASS/FAIL per item with the achieved deviation. Fixed seed. +Monte Carlo verification of every closed-form claim (v2 design). +================================================================ +Independent Haar masks + affinity-aware Wiener demultiplexer. +Checks (d = 256 for speed; deviations shrink as O(1/d)): - V1 per-realization Gram identity M1^T M2 = beta I + sqrt(g) Q - V2 Theorem 1 full MSE (noise + C_SI,u) vs MC, random complex h - V3 noise-free calibration of C_SI,1 / C_SI,2 (several phases) - V4 quoted constants: C_SI,1, C_SI,2, C-bar at (0.311, h=1); - cosine ceiling 1/sqrt(1+C_SI,1) = 0.70; rho_f = 28 dB at d=768 - V5 SINR corollary eta_u = 1/MSE (per-coordinate accounting) - V6 C_SI,u >= 1 for all beta (proof identities gamma*C_SI,1 = - gamma + 4 beta^4, gamma*C_SI,2 = 1 + 3 beta^2 at h=1) - V7 Proposition (MAC consistency) on a (beta, rho) grid - V8 wideband limit T/C_MAC -> gamma - V9 beta* crossover roots at 10/20 dB (0.700 / 0.590, d=512) - V10 rho_c = d(2-1/gamma)/C-bar exact iff-condition + 25.7 dB value - V11 idealized no-floor variant crosses C_MAC at 2 beta^2 d/gamma^2 - (~21 dB at d=512, beta=0.311) - V12 mismatch identity (eq:mismatch) + bound value 8.8e-3 - V13 CSI-direction invariance: |cos| unchanged under wrong h-hat; - eq:csi-free equals eq:correct - V14 cross-moment lemma E[n^H M_u M_v^T n] = sigma^2 beta d - V15 multi-user [B^-1]_uu Sherman-Morrison formula, U = 2..6 - V16 multi-user noise-free C_SI^(U) ~ (U-1) C-bar (within 10 %) - V17 Walsh-Hadamard masks: exact orthogonality + expected cross-Gram + V1 Theorem 1 MSE formula vs MC at several (beta, SNR), h = 1 + V2 Theorem 1 under random channel phases, both users + V3 floors: aware sqrt(g)/2 vs blind 1/2, and the value ratio + V4 cosine ceiling sqrt(1 - MSE) (Corollary: cosine) + V5 blind receiver == matched filter in cosine (scalar shrinkage) + V6 monotonicity of the MSE in beta (Proposition) + V7 full-cooperation bound T <= log2(1+4 rho/d), equality at beta=1 + V8 MAC condition gamma^2 (2+k) >= 2 beta^2 k^2 boundary + V9 Walsh-Hadamard diagonal variant: exact finite-d closed form + V10 mismatch stationarity: MSE(beta_hat) - MSE(beta) = O(delta^2) + V11 correlated-mask alternative floor 1 + 4 beta^4 / gamma + (Remark and Appendix), dominated by the aware receiver + +Pure numpy, fixed seed, ~2 minutes on a laptop. """ from __future__ import annotations import math import numpy as np -def hadamard(n): - H = np.array([[1.0]]) - while H.shape[0] < n: - H = np.block([[H, H], [H, -H]]) - return H - - -def brentq(f, a, b, tol=1e-12): - fa, fb = f(a), f(b) - assert fa * fb < 0, "no sign change" - for _ in range(200): - m = 0.5 * (a + b) - fm = f(m) - if abs(fm) < tol or (b - a) < tol: - return m - if fa * fm < 0: - b, fb = m, fm - else: - a, fa = m, fm - return 0.5 * (a + b) - rng = np.random.default_rng(2026) -FAIL = [] - - -def report(name, ok, detail): - tag = "PASS" if ok else "FAIL" - if not ok: - FAIL.append(name) - print(f"[{tag}] {name}: {detail}") +D = 256 def haar(d): - Q, R = np.linalg.qr(rng.standard_normal((d, d))) + G = rng.standard_normal((d, d)) + Q, R = np.linalg.qr(G) return Q * np.sign(np.diag(R)) @@ -72,303 +37,225 @@ def unit(v): return v / np.linalg.norm(v) -def pair(d, beta): +def cosim(a, b): + return float(abs(np.vdot(a, b)) / (np.linalg.norm(a) * np.linalg.norm(b))) + + +def embed_pair(d, beta): e1 = unit(rng.standard_normal(d)) w = rng.standard_normal(d) w = unit(w - (w @ e1) * e1) - return e1, beta * e1 + math.sqrt(1 - beta**2) * w + return e1, beta * e1 + math.sqrt(1 - beta * beta) * w -def csi1(beta, c): - g = 1 - beta**2 - n2 = 1 + beta**2 * abs(c)**2 + 2 * beta**2 * np.real(c) - return (g**2 * abs(c)**2 + beta**2 * n2) / g +def cnoise(d): + return (rng.standard_normal(d) + 1j * rng.standard_normal(d)) / math.sqrt(2) -def csi2(beta, c): - g = 1 - beta**2 - return (abs(c)**2 + beta**2 + 2 * beta**2 * np.real(c)) / g +def mse_theory(beta, c1, rho_e): + a0 = 1.0 + beta**2 * abs(c1)**2 + rho_e + return rho_e / math.sqrt(a0 * a0 - 4.0 * beta**2 * abs(c1)**2) -# ---------------- V1: per-realization Gram identity ---------------- -d, beta = 256, 0.311 -g = 1 - beta**2 -U1, U2 = haar(d), haar(d) -M1, M2 = U1, beta * U1 + math.sqrt(g) * U2 -dev = np.abs(M1.T @ M2 - (beta * np.eye(d) - + math.sqrt(g) * U1.T @ U2)).max() -report("V1 Gram identity", dev < 1e-12, f"max dev {dev:.2e}") +def aware(t1, Q, beta, c1, nvar, d): + g = 1.0 - beta * beta + rho = g * abs(c1)**2 / d + nvar + S = beta * (c1 * Q + np.conj(c1) * Q.T) / d + S[np.diag_indices(d)] += (1.0 + beta**2 * abs(c1)**2) / d + rho + x = np.linalg.solve(S, t1) + return (x + beta * np.conj(c1) * (Q.T @ x)) / d -# ---------------- V2: Theorem 1 full MSE, random complex h --------- -d = 512 -for beta in (0.1, 0.311, 0.5): - g = 1 - beta**2 - h = (rng.standard_normal(2) + 1j * rng.standard_normal(2)) / math.sqrt(2) - h1, h2 = h - rho_db = 15.0 - sig = 10 ** (-rho_db / 20.0) - e1, e2 = pair(d, beta) - mc = np.zeros(2) - NT = 300 - for _ in range(NT): - U1, U2 = haar(d), haar(d) - M1, M2 = U1, beta * U1 + math.sqrt(g) * U2 - n = (rng.standard_normal(d) + 1j * rng.standard_normal(d)) \ - / math.sqrt(2) - r = h1 * (M1 @ e1) + h2 * (M2 @ e2) + sig * n - t1 = M1.T @ r / h1 - t2 = M2.T @ r / h2 - g1 = (t1 - beta * (h2 / h1) * t2) / g - g2 = (t2 - beta * (h1 / h2) * t1) / g - mc[0] += np.linalg.norm(g1 - e1)**2 - mc[1] += np.linalg.norm(g2 - e2)**2 - mc /= NT - th1 = d * sig**2 / (abs(h1)**2 * g) + csi1(beta, h2 / h1) - th2 = d * sig**2 / (abs(h2)**2 * g) + csi2(beta, h1 / h2) - dev = max(abs(mc[0] / th1 - 1), abs(mc[1] / th2 - 1)) - report(f"V2 Theorem 1 MSE (beta={beta})", dev < 0.02, - f"MC/theory dev {100*dev:.2f}% (O(1/d) at d={d})") -# ---------------- V3: noise-free C_SI calibration ------------------ -d = 512 -for phase in (0.0, math.pi / 3, math.pi): - beta = 0.311 - g = 1 - beta**2 - h1 = 1.0 + 0j - h2 = np.exp(1j * phase) - e1, e2 = pair(d, beta) - mc = np.zeros(2) - NT = 200 - for _ in range(NT): - U1, U2 = haar(d), haar(d) - M1, M2 = U1, beta * U1 + math.sqrt(g) * U2 - r = h1 * (M1 @ e1) + h2 * (M2 @ e2) - t1 = M1.T @ r / h1 - t2 = M2.T @ r / h2 - g1 = (t1 - beta * (h2 / h1) * t2) / g - g2 = (t2 - beta * (h1 / h2) * t1) / g - mc[0] += np.linalg.norm(g1 - e1)**2 - mc[1] += np.linalg.norm(g2 - e2)**2 - mc /= NT - t1v, t2v = csi1(beta, h2 / h1), csi2(beta, h1 / h2) - dev = max(abs(mc[0] / t1v - 1), abs(mc[1] / t2v - 1)) - report(f"V3 noise-free C_SI (phase={phase:.2f})", dev < 0.02, - f"dev {100*dev:.2f}%") +def run_pair(beta, sig, h1=1.0 + 0j, h2=1.0 + 0j, d=D): + e1, e2 = embed_pair(d, beta) + M1, M2 = haar(d), haar(d) + Q = M1.T @ M2 + r = h1 * (M1 @ e1) + h2 * (M2 @ e2) + sig * cnoise(d) + t1 = M1.T @ r / h1 + return e1, e2, Q, t1, M2.T @ r / h2 -# ---------------- V4: quoted constants ----------------------------- + +def check(name, ok, detail=""): + print(f"[{'PASS' if ok else 'FAIL'}] {name} {detail}") + return ok + + +allok = True + +# ---------------------------------------------------------------- V1 +devs = [] +for beta in (0.0, 0.311, 0.6): + for snr in (10.0, 20.0, 60.0): + sig = 10 ** (-snr / 20.0) + mc = 0.0 + NT = 40 + for _ in range(NT): + e1, _, Q, t1, _ = run_pair(beta, sig) + g1 = aware(t1, Q, beta, 1.0, sig * sig, D) + mc += float(np.linalg.norm(g1 - e1) ** 2) + mc /= NT + th = mse_theory(beta, 1.0, (1 - beta**2) + D * sig * sig) + devs.append(abs(mc / th - 1)) +allok &= check("V1 Theorem 1 (h=1)", max(devs) < 0.03, + f"max dev {100*max(devs):.2f}%") + +# ---------------------------------------------------------------- V2 +devs = [] +sig = 10 ** (-20.0 / 20.0) +for beta in (0.311, 0.5): + for _ in range(30): + h1 = np.exp(1j * rng.uniform(0, 2 * np.pi)) + h2 = np.exp(1j * rng.uniform(0, 2 * np.pi)) + e1, e2, Q, t1, t2 = run_pair(beta, sig, h1, h2) + c1, c2 = h2 / h1, h1 / h2 + g1 = aware(t1, Q, beta, c1, sig**2, D) + g2 = aware(t2, Q.T, beta, c2, sig**2, D) + g = 1 - beta**2 + th1 = mse_theory(beta, c1, g * abs(c1)**2 + D * sig**2) + th2 = mse_theory(beta, c2, g * abs(c2)**2 + D * sig**2) + devs.append(abs(np.linalg.norm(g1 - e1)**2 / th1 - 1)) + devs.append(abs(np.linalg.norm(g2 - e2)**2 / th2 - 1)) +allok &= check("V2 Theorem 1 (random phases, both users)", + float(np.mean(devs)) < 0.05, + f"mean dev {100*float(np.mean(devs)):.2f}%") + +# ---------------------------------------------------------------- V3 +beta = 0.6 +sig = 1e-3 +mc_a, mc_b = 0.0, 0.0 +NT = 40 +for _ in range(NT): + e1, _, Q, t1, _ = run_pair(beta, sig) + g1 = aware(t1, Q, beta, 1.0, sig * sig, D) + mc_a += float(np.linalg.norm(g1 - e1) ** 2) + lam = (1.0 / D) / (2.0 / D + sig * sig) + mc_b += float(np.linalg.norm(lam * t1 - e1) ** 2) +mc_a /= NT +mc_b /= NT +fa, fb = math.sqrt(1 - beta**2) / 2, 0.5 +allok &= check("V3 floors sqrt(g)/2 vs 1/2", + abs(mc_a - fa) < 0.02 and abs(mc_b - fb) < 0.02, + f"aware {mc_a:.4f}~{fa:.4f}, blind {mc_b:.4f}~{fb:.4f}, " + f"ratio {mc_b/mc_a:.3f}~{1/math.sqrt(1-beta**2):.3f}") + +# ---------------------------------------------------------------- V4 +acc = 0.0 +for _ in range(NT): + e1, _, Q, t1, _ = run_pair(beta, sig) + acc += cosim(aware(t1, Q, beta, 1.0, sig * sig, D), e1) +acc /= NT +pred = math.sqrt(1 - fa) +allok &= check("V4 cosine ceiling sqrt(1-MSE)", abs(acc - pred) < 0.01, + f"MC {acc:.4f} vs {pred:.4f}") + +# ---------------------------------------------------------------- V5 +e1, _, Q, t1, _ = run_pair(0.311, 0.1) +lam = 0.37 # any scalar +allok &= check("V5 blind == MF in cosine", + abs(cosim(lam * t1, e1) - cosim(t1, e1)) < 1e-12) + +# ---------------------------------------------------------------- V6 +k = D / 100.0 +vals = [mse_theory(b, 1.0, (1 - b * b) + k) + for b in np.linspace(0, 0.99, 50)] +allok &= check("V6 monotonic decrease in beta", + all(x > y for x, y in zip(vals, vals[1:]))) + +# ---------------------------------------------------------------- V7 +ok7 = True +worst = 0.0 +for rho in (1.0, 100.0, 1e4): + kk = D / rho + coop = math.log2(1 + 4 * rho / D) + for b in np.linspace(0, 1.0, 41): + m = mse_theory(b, 1.0, (1 - b * b) + kk) + T = 2 * math.log2(1 / m) + ok7 &= T <= coop + 1e-9 + worst = max(worst, T - coop) + m1 = mse_theory(1.0, 1.0, kk) + ok7 &= abs(2 * math.log2(1 / m1) - coop) < 1e-9 +allok &= check("V7 full-cooperation bound, equality at beta=1", ok7, + f"max T-coop {worst:.2e}") + +# ---------------------------------------------------------------- V8 +ok8 = True +for rho in (1.0, 10.0, 100.0, 1e3): + kk = D / rho + for b in (0.1, 0.311, 0.6, 0.9): + g = 1 - b * b + m = mse_theory(b, 1.0, g + kk) + T = 2 * math.log2(1 / m) + mac = math.log2(1 + 2 * rho / D) + lhs = g * g * (2 + kk) + rhs = 2 * b * b * kk * kk + ok8 &= (T <= mac + 1e-9) == (lhs >= rhs - 1e-9) +allok &= check("V8 MAC-condition boundary", ok8) + +# ---------------------------------------------------------------- V9 beta = 0.311 g = 1 - beta**2 -c1v, c2v = csi1(beta, 1.0 + 0j), csi2(beta, 1.0 + 0j) -cbar = (c1v + c2v) / 2 -ceil1 = 1 / math.sqrt(1 + c1v) -rho_f_db = 10 * math.log10(768 * g / c1v) -ok = (abs(cbar - 1.2349) < 5e-4 and abs(ceil1 - 0.70) < 5e-3 - and abs(rho_f_db - 28) < 0.5) -report("V4 quoted constants", ok, - f"C_SI,1 {c1v:.4f}, C_SI,2 {c2v:.4f}, C-bar {cbar:.4f} " - f"(quoted 1.2349), ceiling {ceil1:.4f} (quoted 0.70), " - f"rho_f {rho_f_db:.1f} dB (quoted 28)") +sig = 10 ** (-20.0 / 20.0) +H = np.array([[1.0]]) +while H.shape[0] < D: + H = np.block([[H, H], [H, -H]]) +H /= math.sqrt(D) +mc, th = 0.0, 0.0 +for _ in range(30): + e1, e2 = embed_pair(D, beta) + D1 = np.sign(rng.standard_normal(D)) + D2 = np.sign(rng.standard_normal(D)) + W1, W2 = H * D1[None, :], H * D2[None, :] + r = W1 @ e1 + W2 @ e2 + sig * cnoise(D) + t1 = W1.T @ r + q = D1 * D2 + a = 1.0 + beta * q + rho = g / D + sig * sig + w1 = (a / (a * a / D + rho)) * t1 / D + mc += float(np.linalg.norm(w1 - e1) ** 2) + th += float(np.mean((g + D * sig**2) / (a * a + g + D * sig**2))) +allok &= check("V9 WH exact finite-d closed form", + abs(mc / th - 1) < 0.03, f"dev {100*abs(mc/th-1):.2f}%") -# ---------------- V5: SINR = 1/MSE --------------------------------- -rho = 10 ** (15 / 10) -eta = 1 / (512 / (rho * g) + c1v) -mse = 512 / (rho * g) + c1v -report("V5 SINR corollary", abs(eta * mse - 1) < 1e-12, - f"eta*MSE = {eta*mse:.6f}") - -# ---------------- V6: C_SI >= 1 and proof identities --------------- -ok = True -worst = 1e9 -for b in np.linspace(0.0, 0.99, 200): - gg = 1 - b**2 - lhs1 = gg * csi1(b, 1.0 + 0j) - lhs2 = gg * csi2(b, 1.0 + 0j) - if abs(lhs1 - (gg + 4 * b**4)) > 1e-12: ok = False - if abs(lhs2 - (1 + 3 * b**2)) > 1e-12: ok = False - worst = min(worst, csi1(b, 1.0 + 0j), csi2(b, 1.0 + 0j)) -report("V6 C_SI >= 1 + proof identities", ok and worst >= 1 - 1e-12, - f"min C_SI over beta grid = {worst:.6f}") - -# ---------------- V7: MAC consistency on a grid -------------------- -def T_edma(b, r_, d_): - gg = 1 - b**2 - cb = (csi1(b, 1 + 0j) + csi2(b, 1 + 0j)) / 2 - return 2 * np.log2(1 + 1 / (d_ / (r_ * gg) + cb)) - -ok = True -for b in np.linspace(0, 0.95, 40): - for rdb in np.linspace(-10, 60, 60): - r_ = 10 ** (rdb / 10) - gg = 1 - b**2 - mid = np.log2(1 + 2 * r_ * gg / 512) - cmac = np.log2(1 + 2 * r_ / 512) - if T_edma(b, r_, 512) > mid + 1e-12 or mid > cmac + 1e-12: - ok = False -report("V7 MAC consistency grid", ok, "T_EDMA <= log2(1+2 rho g/d) <= C_MAC") - -# ---------------- V8: wideband limit ------------------------------- -b = 0.311 -r_ = 1e-6 * 512 -lim = T_edma(b, r_, 512) / np.log2(1 + 2 * r_ / 512) -report("V8 wideband limit", abs(lim - (1 - b**2)) < 1e-3, - f"T/C_MAC at rho/d=1e-6: {lim:.5f} vs gamma {1-b**2:.5f}") - -# ---------------- V9: beta* crossover roots ------------------------ -def beta_star(rdb, d_=512): - r_ = 10 ** (rdb / 10) - T_oma = 2 * np.log2(1 + r_ / (2 * d_)) - return brentq(lambda b: T_edma(b, r_, d_) - T_oma, 0.3, 0.9) - -b10, b20 = beta_star(10), beta_star(20) -report("V9 beta* crossover", abs(b10 - 0.700) < 5e-3 - and abs(b20 - 0.590) < 5e-3, - f"10 dB: {b10:.3f} (quoted 0.700), 20 dB: {b20:.3f} (quoted 0.590)") - -# ---------------- V10: rho_c iff-condition + value ----------------- -b = 0.311 -gg = 1 - b**2 -cb = (csi1(b, 1 + 0j) + csi2(b, 1 + 0j)) / 2 -rho_c = 512 * (2 - 1 / gg) / cb -rho_c_db = 10 * math.log10(rho_c) -eps = 1e-4 -below = T_edma(b, rho_c * (1 - eps), 512) \ - - 2 * np.log2(1 + rho_c * (1 - eps) / 1024) -above = T_edma(b, rho_c * (1 + eps), 512) \ - - 2 * np.log2(1 + rho_c * (1 + eps) / 1024) -report("V10 rho_c crossover", below > 0 > above - and abs(rho_c_db - 25.7) < 0.1, - f"rho_c {rho_c_db:.2f} dB (quoted 25.7), sign flip verified") - -# ---------------- V11: idealized-MAC crossing ---------------------- -rho_x = 2 * b**2 * 512 / gg**2 -f = lambda r_: 2 * np.log2(1 + r_ * gg / 512) - np.log2(1 + 2 * r_ / 512) -root = brentq(f, 10.0, 1e4) -report("V11 idealized crossing", abs(root / rho_x - 1) < 1e-6 - and abs(10 * math.log10(root) - 21) < 0.3, - f"root {10*math.log10(root):.2f} dB, formula 2b^2d/g^2 " - f"{10*math.log10(rho_x):.2f} dB (quoted ~21)") - -# ---------------- V12: mismatch identity + bound value ------------- -b, delta = 0.3, 0.06 -bh = b + delta -hr = 1.0 + 0j -e1, e2 = pair(64, b) -t1 = e1 + b * hr * e2 # expected-Gram surrogate outputs -t2v_ = e2 + b * np.conj(hr) * e1 -g1 = (t1 - bh * hr * t2v_) / (1 - bh**2) -lhs = g1 - e1 -rhs = delta / (1 - bh**2) * (bh * e1 - hr * e2) -dev = np.linalg.norm(lhs - rhs) -bound = delta**2 * (abs(bh) + abs(hr))**2 / (1 - bh**2)**2 -report("V12 mismatch identity", dev < 1e-12 - and abs(bound - 8.8e-3) < 2e-4, - f"identity dev {dev:.1e}, bound {bound:.4f} (quoted 8.8e-3)") - -# ---------------- V13: CSI-direction invariance -------------------- -d = 256 -b = 0.311 -g = 1 - b**2 -e1, e2 = pair(d, b) -U1, U2 = haar(d), haar(d) -M1, M2 = U1, b * U1 + math.sqrt(g) * U2 -h1, h2 = 0.7 - 0.4j, -0.2 + 1.1j -n = (rng.standard_normal(d) + 1j * rng.standard_normal(d)) / math.sqrt(2) -r = h1 * (M1 @ e1) + h2 * (M2 @ e2) + 0.1 * n -truec = (M1.T @ r / h1 - b * (h2 / h1) * (M2.T @ r / h2)) / g -csif = (M1 - b * M2).T @ r / (h1 * g) -dev1 = np.abs(truec - csif).max() -h1w = h1 * (1.5 * np.exp(0.8j)) # badly wrong estimate -wrong = (M1 - b * M2).T @ r / (h1w * g) -c_true = abs(np.vdot(truec, e1)) / (np.linalg.norm(truec)) -c_wrong = abs(np.vdot(wrong, e1)) / (np.linalg.norm(wrong)) -report("V13 CSI invariance", dev1 < 1e-12 and abs(c_true - c_wrong) < 1e-12, - f"csi-free identity dev {dev1:.1e}, |cos| unchanged " - f"({c_true:.6f} vs {c_wrong:.6f})") - -# ---------------- V14: cross-moment lemma -------------------------- -d = 256 -b = 0.311 -sig2 = 0.5 -acc = 0.0 -NT = 4000 -U1, U2 = haar(d), haar(d) -M1, M2 = U1, b * U1 + math.sqrt(1 - b**2) * U2 -for _ in range(NT): - n = math.sqrt(sig2) * (rng.standard_normal(d) - + 1j * rng.standard_normal(d)) / math.sqrt(2) - acc += np.real(np.conj(n) @ (M1 @ (M2.T @ n))) -acc /= NT -th = sig2 * b * d -report("V14 cross-moment lemma", abs(acc / th - 1) < 0.05, - f"MC {acc:.3f} vs sigma^2 beta d {th:.3f} " - f"({100*abs(acc/th-1):.1f}%)") - -# ---------------- V15: [B^-1]_uu Sherman-Morrison ------------------ -ok = True -for U in range(2, 7): - for b in (0.1, 0.311, 0.6): - B = (1 - b) * np.eye(U) + b * np.ones((U, U)) - num = 1 + (U - 2) * b - den = (1 - b) * (1 + (U - 1) * b) - if abs(np.linalg.inv(B)[0, 0] - num / den) > 1e-12: - ok = False -report("V15 [B^-1]_uu formula", ok, "U=2..6, beta grid, exact") - -# ---------------- V16: multi-user C_SI^(U) ------------------------- -d = 512 -b = 0.311 -g = 1 - b**2 -cb = (csi1(b, 1 + 0j) + csi2(b, 1 + 0j)) / 2 -for U in (3, 4): - B = (1 - b) * np.eye(U) + b * np.ones((U, U)) - Binv = np.linalg.inv(B) - es = [] - e1 = unit(rng.standard_normal(d)) - for u in range(U): - if u == 0: - es.append(e1) +# ---------------------------------------------------------------- V10 +beta = 0.3 +sig = 10 ** (-20.0 / 20.0) +base, d1, d2 = 0.0, 0.0, 0.0 +for _ in range(30): + e1, _, Q, t1, _ = run_pair(beta, sig) + for bh, tag in ((beta, "b"), (beta + 0.2, "1"), (beta + 0.4, "2")): + g1 = aware(t1, Q, bh, 1.0, sig * sig, D) + m = float(np.linalg.norm(g1 - e1) ** 2) + if tag == "b": + base += m + elif tag == "1": + d1 += m else: - w = rng.standard_normal(d) - w = unit(w - (w @ e1) * e1) - es.append(b * e1 + math.sqrt(g) * w) - mse = 0.0 - NT = 60 - for _ in range(NT): - Us = [haar(d) for _ in range(U)] - Ms = [Us[0]] - for u in range(1, U): - Ms.append(b * Us[0] + math.sqrt(g) * Us[u]) - r = sum(Ms[u] @ es[u] for u in range(U)) # h_u = 1 - t = np.stack([Ms[u].T @ r for u in range(U)]) - rec = np.einsum("uv,vd->ud", Binv, t) - mse += np.linalg.norm(rec[0] - es[0])**2 - mse /= NT - ratio = mse / ((U - 1) * cb) - report(f"V16 C_SI^(U) additivity (U={U})", abs(ratio - 1) < 0.10, - f"noise-free MSE {mse:.3f} vs (U-1)C-bar " - f"{(U-1)*cb:.3f} (ratio {ratio:.3f})") + d2 += m +base /= 30; d1 /= 30; d2 /= 30 +r_quad = (d2 - base) / max(d1 - base, 1e-12) +allok &= check("V10 quadratic mismatch (delta doubling ~ 4x)", + 2.5 < r_quad < 6.5, + f"MSE(+0)={base:.4f} MSE(+0.2)={d1:.4f} " + f"MSE(+0.4)={d2:.4f} ratio {r_quad:.2f}") -# ---------------- V17: Walsh-Hadamard masks ------------------------ -d = 256 -H = hadamard(d) / math.sqrt(d) -b = 0.311 -acc = np.zeros((d, d)) -NT = 400 -for _ in range(NT): - D1 = np.diag(rng.choice([-1.0, 1.0], d)) - D2 = np.diag(rng.choice([-1.0, 1.0], d)) - W1 = H @ D1 - W2 = b * W1 + math.sqrt(1 - b**2) * H @ D2 - acc += W1.T @ W2 / NT -orth = np.abs((H @ np.diag(rng.choice([-1.0, 1.0], d))).T - @ (H @ np.diag(rng.choice([-1.0, 1.0], d))) - @ np.ones(d) / d).max() -diag_dev = abs(np.diag(acc).mean() - b) -off = np.abs(acc - np.diag(np.diag(acc))).mean() -report("V17 WH masks", diag_dev < 0.02 and off < 0.01, - f"E[cross-Gram] diag {np.diag(acc).mean():.4f} vs beta {b}, " - f"mean |off-diag| {off:.4f}") +# ---------------------------------------------------------------- V11 +beta = 0.311 +g = 1 - beta**2 +mc = 0.0 +for _ in range(30): + e1, e2 = embed_pair(D, beta) + U1, U2 = haar(D), haar(D) + M1, M2 = U1, beta * U1 + math.sqrt(g) * U2 + r = M1 @ e1 + M2 @ e2 # noise-free -> floor + t1 = M1.T @ r + t2 = M2.T @ r + g1 = (t1 - beta * t2) / g + mc += float(np.linalg.norm(g1 - e1) ** 2) +mc /= 30 +th = 1 + 4 * beta**4 / g +allok &= check("V11 correlated-mask floor 1+4b^4/g", + abs(mc / th - 1) < 0.05, + f"MC {mc:.4f} vs {th:.4f}; aware floor " + f"{math.sqrt(g)/2:.4f} (dominated)") -print() -print("=" * 60) -print(f"RESULT: {'ALL PASS' if not FAIL else 'FAILURES: ' + ', '.join(FAIL)}") +print("\nALL CHECKS PASSED" if allok else "\nSOME CHECKS FAILED") diff --git a/data/bertvit_merged.csv b/data/bertvit_merged.csv index e5747bd..fcd2fb5 100644 --- a/data/bertvit_merged.csv +++ b/data/bertvit_merged.csv @@ -1,8 +1,14 @@ -snr_db,edma,oma,genie,att,att_x,todma,edma_ref,edma_ref2 -0.0,0.04509729548248326,0.03878942917318714,0.04510116805362887,0.06537951208185813,0.028956357115368724,0.009263779561898224,0.051216359648716556,0.05146971093667761 -5.0,0.06451154394270053,0.0507439763307109,0.06460883367368744,0.11006860490285489,0.02899092581015571,0.014985754149760718,0.08214049352367703,0.08245299246543433 -10.0,0.10340689217396296,0.07698703231946222,0.10399757263661547,0.18771051966437632,0.029096261892353006,0.03519980048035704,0.13997304338278754,0.14036958956224843 -15.0,0.17239818787681693,0.12749333352586661,0.17548648804419778,0.3057075884366212,0.029248349735797895,0.10412376981275459,0.23587541750084084,0.23652206338075601 -20.0,0.2789011314185965,0.2156999450240525,0.29264116008861335,0.4510118978738174,0.029343304376527338,0.21990683440776934,0.37242277625984427,0.37307923116081904 -25.0,0.41080176204708735,0.3530383192829985,0.45731712677712716,0.5840194131238486,0.02929760473668019,0.3162182821357606,0.5247271302425862,0.5245882651817437 -30.0,0.5301073454886365,0.5306502765434139,0.6408057261877141,0.6726967507733389,0.029179666470356736,0.3661426990593047,0.6493871028835615,0.6479461262985481 +snr_db,edma,oma,genie,todma,edma_ref,edma_ref2 +0.0,0.04467206875531701,0.0395211911102524,0.04470823034964269,0.00808752125339693,0.051258400181977776,0.051258395044569624 +2.5,0.052661077863012905,0.044328911576594694,0.05274493153032381,0.010903122079792332,0.06411670899382443,0.06411670250265161 +5.0,0.0644090429507196,0.0517221181144123,0.06458281029539649,0.0160517606871274,0.08237909885676345,0.08237909091782057 +7.5,0.08108708676882088,0.06272871624387336,0.0814530021866085,0.027431791894606004,0.1073888337527751,0.10738882329576882 +10.0,0.10398115491552744,0.07848262153333053,0.10474200704193208,0.04139025118059202,0.14060123476258013,0.14060122084221802 +12.5,0.1345052632171428,0.10035192567447666,0.13611418937449343,0.06825274948835351,0.18353674076730386,0.1835367217194289 +15.0,0.17397624759352767,0.1299769427673891,0.1774134961643722,0.11022667550692919,0.23722848522273124,0.23722846306452994 +17.5,0.22316362340701745,0.16911298831924795,0.2303875518660061,0.16441485880931841,0.30166534237214365,0.30166531551687514 +20.0,0.28155444214702585,0.21956481272354722,0.296139236476738,0.21888792063296963,0.37473849680507554,0.3747384671261534 +22.5,0.3466694929706864,0.2826504937937716,0.37431714535458016,0.27025579480204087,0.4521061575273052,0.45210612908937037 +25.0,0.41391337811248374,0.35837042205035685,0.4623712573153898,0.31270788677551076,0.5278005284816026,0.5278005079459399 +27.5,0.47757373259635644,0.4446330708428286,0.5553692922927439,0.34371633065177387,0.5959934616461396,0.5959934508893638 +30.0,0.5326515504252165,0.5369720551883802,0.6469332071393729,0.36358971142016083,0.6525999860465527,0.6525999858789145 diff --git a/data/beta_sweep_corrected.csv b/data/beta_sweep_corrected.csv index 35978b2..6a79053 100644 --- a/data/beta_sweep_corrected.csv +++ b/data/beta_sweep_corrected.csv @@ -1,199 +1,199 @@ -snr_db,beta,edma,oma,genie -10,0.0,0.054752877862610065,0.028040940629869258,0.055811993139768964 -10,0.01,0.054747350279920316,0.028040940629869258,0.055811993139768964 -10,0.02,0.054730767346147666,0.028040940629869258,0.055811993139768964 -10,0.03,0.05470312850494755,0.028040940629869258,0.055811993139768964 -10,0.04,0.05466443283160872,0.028040940629869258,0.055811993139768964 -10,0.05,0.054614679036858765,0.028040940629869258,0.055811993139768964 -10,0.06,0.05455386547218096,0.028040940629869258,0.055811993139768964 -10,0.07,0.05448199013665998,0.028040940629869258,0.055811993139768964 -10,0.08,0.05439905068534405,0.028040940629869258,0.055811993139768964 -10,0.09,0.05430504443913251,0.028040940629869258,0.055811993139768964 -10,0.1,0.054199968396186245,0.028040940629869258,0.055811993139768964 -10,0.11,0.05408381924486196,0.028040940629869258,0.055811993139768964 -10,0.12,0.053956593378173205,0.028040940629869258,0.055811993139768964 -10,0.13,0.05381828690977572,0.028040940629869258,0.055811993139768964 -10,0.14,0.053668895691484,0.028040940629869258,0.055811993139768964 -10,0.15,0.05350841533231138,0.028040940629869258,0.055811993139768964 -10,0.16,0.0533368412190459,0.028040940629869258,0.055811993139768964 -10,0.17,0.05315416853834894,0.028040940629869258,0.055811993139768964 -10,0.18,0.0529603923003942,0.028040940629869258,0.055811993139768964 -10,0.19,0.052755507364029314,0.028040940629869258,0.055811993139768964 -10,0.2,0.05253950846347685,0.028040940629869258,0.055811993139768964 -10,0.21,0.05231239023656164,0.028040940629869258,0.055811993139768964 -10,0.22,0.0520741472544757,0.028040940629869258,0.055811993139768964 -10,0.23,0.05182477405307159,0.028040940629869258,0.055811993139768964 -10,0.24,0.05156426516568283,0.028040940629869258,0.055811993139768964 -10,0.25,0.051292615157482124,0.028040940629869258,0.055811993139768964 -10,0.26,0.05100981866135644,0.028040940629869258,0.055811993139768964 -10,0.27,0.05071587041531166,0.028040940629869258,0.055811993139768964 -10,0.28,0.05041076530139947,0.028040940629869258,0.055811993139768964 -10,0.29,0.050094498386152486,0.028040940629869258,0.055811993139768964 -10,0.3,0.04976706496254393,0.028040940629869258,0.055811993139768964 -10,0.31,0.04942846059343863,0.028040940629869258,0.055811993139768964 -10,0.32,0.04907868115655627,0.028040940629869258,0.055811993139768964 -10,0.33,0.04871772289091538,0.028040940629869258,0.055811993139768964 -10,0.34,0.04834558244476425,0.028040940629869258,0.055811993139768964 -10,0.35000000000000003,0.04796225692498555,0.028040940629869258,0.055811993139768964 -10,0.36,0.04756774394795485,0.028040940629869258,0.055811993139768964 -10,0.37,0.047162041691850294,0.028040940629869258,0.055811993139768964 -10,0.38,0.04674514895039684,0.028040940629869258,0.055811993139768964 -10,0.39,0.046317065188023115,0.028040940629869258,0.055811993139768964 -10,0.4,0.04587779059641903,0.028040940629869258,0.055811993139768964 -10,0.41000000000000003,0.045427326152471775,0.028040940629869258,0.055811993139768964 -10,0.42,0.04496567367756414,0.028040940629869258,0.055811993139768964 -10,0.43,0.04449283589819911,0.028040940629869258,0.055811993139768964 -10,0.44,0.044008816507942514,0.028040940629869258,0.055811993139768964 -10,0.45,0.04351362023064087,0.028040940629869258,0.055811993139768964 -10,0.46,0.04300725288489753,0.028040940629869258,0.055811993139768964 -10,0.47000000000000003,0.04248972144976068,0.028040940629869258,0.055811993139768964 -10,0.48,0.04196103413160188,0.028040940629869258,0.055811993139768964 -10,0.49,0.041421200432142105,0.028040940629869258,0.055811993139768964 -10,0.5,0.040870231217584416,0.028040940629869258,0.055811993139768964 -10,0.51,0.04030813878880955,0.028040940629869258,0.055811993139768964 -10,0.52,0.03973493695259877,0.028040940629869258,0.055811993139768964 -10,0.53,0.039150641093819265,0.028040940629869258,0.055811993139768964 -10,0.54,0.03855526824853652,0.028040940629869258,0.055811993139768964 -10,0.55,0.03794883717799136,0.028040940629869258,0.055811993139768964 -10,0.56,0.03733136844337993,0.028040940629869258,0.055811993139768964 -10,0.5700000000000001,0.03670288448138829,0.028040940629869258,0.055811993139768964 -10,0.58,0.036063409680404356,0.028040940629869258,0.055811993139768964 -10,0.59,0.035412970457347266,0.028040940629869258,0.055811993139768964 -10,0.6,0.034751595335041165,0.028040940629869258,0.055811993139768964 -10,0.61,0.03407931502005716,0.028040940629869258,0.055811993139768964 -10,0.62,0.033396162480946456,0.028040940629869258,0.055811993139768964 -10,0.63,0.03270217302678281,0.028040940629869258,0.055811993139768964 -10,0.64,0.03199738438593123,0.028040940629869258,0.055811993139768964 -10,0.65,0.03128183678494588,0.028040940629869258,0.055811993139768964 -10,0.66,0.030555573027513647,0.028040940629869258,0.055811993139768964 -10,0.67,0.02981863857334309,0.028040940629869258,0.055811993139768964 -10,0.68,0.02907108161689106,0.028040940629869258,0.055811993139768964 -10,0.6900000000000001,0.028312953165838792,0.028040940629869258,0.055811993139768964 -10,0.7000000000000001,0.027544307119194162,0.028040940629869258,0.055811993139768964 -10,0.71,0.026765200344916605,0.028040940629869258,0.055811993139768964 -10,0.72,0.02597569275694614,0.028040940629869258,0.055811993139768964 -10,0.73,0.025175847391522434,0.028040940629869258,0.055811993139768964 -10,0.74,0.024365730482666725,0.028040940629869258,0.055811993139768964 -10,0.75,0.023545411536702542,0.028040940629869258,0.055811993139768964 -10,0.76,0.022714963405684276,0.028040940629869258,0.055811993139768964 -10,0.77,0.02187446235961152,0.028040940629869258,0.055811993139768964 -10,0.78,0.021023988157275277,0.028040940629869258,0.055811993139768964 -10,0.79,0.0201636241156152,0.028040940629869258,0.055811993139768964 -10,0.8,0.019293457177440704,0.028040940629869258,0.055811993139768964 -10,0.81,0.018413577977365713,0.028040940629869258,0.055811993139768964 -10,0.8200000000000001,0.01752408090582169,0.028040940629869258,0.055811993139768964 -10,0.8300000000000001,0.016625064170996434,0.028040940629869258,0.055811993139768964 -10,0.84,0.015716629858541303,0.028040940629869258,0.055811993139768964 -10,0.85,0.014798883988911094,0.028040940629869258,0.055811993139768964 -10,0.86,0.013871936572160262,0.028040940629869258,0.055811993139768964 -10,0.87,0.012935901660068121,0.028040940629869258,0.055811993139768964 -10,0.88,0.011990897395407239,0.028040940629869258,0.055811993139768964 -10,0.89,0.011037046058227617,0.028040940629869258,0.055811993139768964 -10,0.9,0.010074474108977324,0.028040940629869258,0.055811993139768964 -10,0.91,0.009103312228316158,0.028040940629869258,0.055811993139768964 -10,0.92,0.008123695353459515,0.028040940629869258,0.055811993139768964 -10,0.93,0.007135762710902627,0.028040940629869258,0.055811993139768964 -10,0.9400000000000001,0.006139657845366697,0.028040940629869258,0.055811993139768964 -10,0.9500000000000001,0.0051355286448144695,0.028040940629869258,0.055811993139768964 -10,0.96,0.004123527361384938,0.028040940629869258,0.055811993139768964 -10,0.97,0.0031038106281055557,0.028040940629869258,0.055811993139768964 -10,0.98,0.002076539471223253,0.028040940629869258,0.055811993139768964 -20,0.0,0.4366911765474922,0.2688526404418522,0.5147756853853035 -20,0.01,0.4366440287117167,0.2688526404418522,0.5147756853853035 -20,0.02,0.43650257394341674,0.2688526404418522,0.5147756853853035 -20,0.03,0.43626677851363305,0.2688526404418522,0.5147756853853035 -20,0.04,0.4359365863873445,0.2688526404418522,0.5147756853853035 -20,0.05,0.4355119194934469,0.2688526404418522,0.5147756853853035 -20,0.06,0.43499267810292913,0.2688526404418522,0.5147756853853035 -20,0.07,0.43437874131546467,0.2688526404418522,0.5147756853853035 -20,0.08,0.433669967654663,0.2688526404418522,0.5147756853853035 -20,0.09,0.4328661957722866,0.2688526404418522,0.5147756853853035 -20,0.1,0.4319672452617536,0.2688526404418522,0.5147756853853035 -20,0.11,0.43097291758127854,0.2688526404418522,0.5147756853853035 -20,0.12,0.4298829970870116,0.2688526404418522,0.5147756853853035 -20,0.13,0.42869725217652294,0.2688526404418522,0.5147756853853035 -20,0.14,0.42741543654296693,0.2688526404418522,0.5147756853853035 -20,0.15,0.4260372905402156,0.2688526404418522,0.5147756853853035 -20,0.16,0.424562542659194,0.2688526404418522,0.5147756853853035 -20,0.17,0.4229909111155674,0.2688526404418522,0.5147756853853035 -20,0.18,0.4213221055488418,0.2688526404418522,0.5147756853853035 -20,0.19,0.4195558288327915,0.2688526404418522,0.5147756853853035 -20,0.2,0.4176917789970004,0.2688526404418522,0.5147756853853035 -20,0.21,0.41572965125910694,0.2688526404418522,0.5147756853853035 -20,0.22,0.413669140167154,0.2688526404418522,0.5147756853853035 -20,0.23,0.411509941851192,0.2688526404418522,0.5147756853853035 -20,0.24,0.40925175638303946,0.2688526404418522,0.5147756853853035 -20,0.25,0.40689429024279106,0.2688526404418522,0.5147756853853035 -20,0.26,0.40443725889034393,0.2688526404418522,0.5147756853853035 -20,0.27,0.40188038943985416,0.2688526404418522,0.5147756853853035 -20,0.28,0.399223423434633,0.2688526404418522,0.5147756853853035 -20,0.29,0.39646611971957335,0.2688526404418522,0.5147756853853035 -20,0.3,0.3936082574077306,0.2688526404418522,0.5147756853853035 -20,0.31,0.3906496389371964,0.2688526404418522,0.5147756853853035 -20,0.32,0.3875900932138665,0.2688526404418522,0.5147756853853035 -20,0.33,0.38442947883515566,0.2688526404418522,0.5147756853853035 -20,0.34,0.3811676873891227,0.2688526404418522,0.5147756853853035 -20,0.35000000000000003,0.37780464682285725,0.2688526404418522,0.5147756853853035 -20,0.36,0.3743403248733226,0.2688526404418522,0.5147756853853035 -20,0.37,0.3707747325532069,0.2688526404418522,0.5147756853853035 -20,0.38,0.36710792768362743,0.2688526404418522,0.5147756853853035 -20,0.39,0.36334001846484065,0.2688526404418522,0.5147756853853035 -20,0.4,0.35947116707538496,0.2688526404418522,0.5147756853853035 -20,0.41000000000000003,0.35550159328936487,0.2688526404418522,0.5147756853853035 -20,0.42,0.3514315781008482,0.2688526404418522,0.5147756853853035 -20,0.43,0.3472614673436184,0.2688526404418522,0.5147756853853035 -20,0.44,0.3429916752938002,0.2688526404418522,0.5147756853853035 -20,0.45,0.3386226882421745,0.2688526404418522,0.5147756853853035 -20,0.46,0.3341550680222958,0.2688526404418522,0.5147756853853035 -20,0.47000000000000003,0.32958945547987767,0.2688526404418522,0.5147756853853035 -20,0.48,0.3249265738682723,0.2688526404418522,0.5147756853853035 -20,0.49,0.32016723215429327,0.2688526404418522,0.5147756853853035 -20,0.5,0.3153123282180963,0.2688526404418522,0.5147756853853035 -20,0.51,0.3103628519303606,0.2688526404418522,0.5147756853853035 -20,0.52,0.3053198880896007,0.2688526404418522,0.5147756853853035 -20,0.53,0.3001846192021282,0.2688526404418522,0.5147756853853035 -20,0.54,0.2949583280869223,0.2688526404418522,0.5147756853853035 -20,0.55,0.2896424002875374,0.2688526404418522,0.5147756853853035 -20,0.56,0.2842383262731147,0.2688526404418522,0.5147756853853035 -20,0.5700000000000001,0.27874770341065014,0.2688526404418522,0.5147756853853035 -20,0.58,0.27317223769083826,0.2688526404418522,0.5147756853853035 -20,0.59,0.2675137451901349,0.2688526404418522,0.5147756853853035 -20,0.6,0.26177415325210973,0.2688526404418522,0.5147756853853035 -20,0.61,0.25595550137174955,0.2688526404418522,0.5147756853853035 -20,0.62,0.2500599417670772,0.2688526404418522,0.5147756853853035 -20,0.63,0.24408973962332856,0.2688526404418522,0.5147756853853035 -20,0.64,0.238047272995916,0.2688526404418522,0.5147756853853035 -20,0.65,0.23193503235958426,0.2688526404418522,0.5147756853853035 -20,0.66,0.22575561979243286,0.2688526404418522,0.5147756853853035 -20,0.67,0.21951174778494328,0.2688526404418522,0.5147756853853035 -20,0.68,0.21320623766571534,0.2688526404418522,0.5147756853853035 -20,0.6900000000000001,0.20684201763731608,0.2688526404418522,0.5147756853853035 -20,0.7000000000000001,0.20042212041749688,0.2688526404418522,0.5147756853853035 -20,0.71,0.1939496804829589,0.2688526404418522,0.5147756853853035 -20,0.72,0.18742793091491083,0.2688526404418522,0.5147756853853035 -20,0.73,0.1808601998477949,0.2688526404418522,0.5147756853853035 -20,0.74,0.17424990652476743,0.2688526404418522,0.5147756853853035 -20,0.75,0.16760055696580017,0.2688526404418522,0.5147756853853035 -20,0.76,0.16091573925657646,0.2688526404418522,0.5147756853853035 -20,0.77,0.15419911846869444,0.2688526404418522,0.5147756853853035 -20,0.78,0.147454431224025,0.2688526404418522,0.5147756853853035 -20,0.79,0.14068547991839878,0.2688526404418522,0.5147756853853035 -20,0.8,0.13389612662207573,0.2688526404418522,0.5147756853853035 -20,0.81,0.12709028667666042,0.2688526404418522,0.5147756853853035 -20,0.8200000000000001,0.12027192201028448,0.2688526404418522,0.5147756853853035 -20,0.8300000000000001,0.11344503419488466,0.2688526404418522,0.5147756853853035 -20,0.84,0.10661365727133493,0.2688526404418522,0.5147756853853035 -20,0.85,0.0997818503699352,0.2688526404418522,0.5147756853853035 -20,0.86,0.09295369015536699,0.2688526404418522,0.5147756853853035 -20,0.87,0.0861332631266301,0.2688526404418522,0.5147756853853035 -20,0.88,0.07932465780369294,0.2688526404418522,0.5147756853853035 -20,0.89,0.07253195683359023,0.2688526404418522,0.5147756853853035 -20,0.9,0.06575922904947452,0.2688526404418522,0.5147756853853035 -20,0.91,0.059010521516665373,0.2688526404418522,0.5147756853853035 -20,0.92,0.052289851600038885,0.2688526404418522,0.5147756853853035 -20,0.93,0.04560119908714468,0.2688526404418522,0.5147756853853035 -20,0.9400000000000001,0.03894849840124009,0.2688526404418522,0.5147756853853035 -20,0.9500000000000001,0.03233563093797358,0.2688526404418522,0.5147756853853035 -20,0.96,0.025766417558755906,0.2688526404418522,0.5147756853853035 -20,0.97,0.019244611272917996,0.2688526404418522,0.5147756853853035 -20,0.98,0.012773890139589456,0.2688526404418522,0.5147756853853035 +snr_db,beta,edma,blind,oma,genie +10,0.0,0.054752877862610065,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.01,0.05475820153789551,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.02,0.05477417262711213,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.03,0.054800791320353745,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.04,0.054838057934443386,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.05,0.05488597291295555,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.06,0.054944536826228706,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.07,0.055013750371386755,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.08,0.05509361437236641,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.09,0.055184129779950464,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.1,0.05528529767180255,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.11,0.05539711925250827,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.12,0.055519595853624266,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.13,0.05565272893372537,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.14,0.055796520078463425,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.15,0.05595097100062803,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.16,0.056116083540211255,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.17,0.05629185966448005,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.18,0.05647830146804995,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.19,0.056675411172967774,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.2,0.056883191128795564,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.21,0.05710164381270159,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.22,0.0573307718295557,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.23,0.057570577912030435,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.24,0.05782106492070458,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.25,0.058082235844175524,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.26,0.05835409379917405,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.27,0.058636642030681585,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.28,0.058929883912060506,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.29,0.059233822945179315,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.3,0.059548462760553325,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.31,0.05987380711747824,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.32,0.0602098599041811,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.33,0.06055662513796847,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.34,0.060914106965381805,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.35000000000000003,0.061282309662356316,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.36,0.06166123763439134,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.37,0.06205089541671533,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.38,0.06245128767446481,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.39,0.06286241920286531,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.4,0.06328429492741498,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.41000000000000003,0.0637169199040789,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.42,0.06416029931948275,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.43,0.0646144384911171,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.44,0.06507934286754048,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.45,0.06555501802859463,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.46,0.0660414696856211,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.47000000000000003,0.06653870368168054,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.48,0.06704672599178685,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.49,0.06756554272313225,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.5,0.06809516011533256,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.51,0.06863558454066575,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.52,0.06918682250432519,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.53,0.06974888064467029,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.54,0.07032176573348846,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.55,0.07090548467626023,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.56,0.07150004451242854,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.5700000000000001,0.0721054524156766,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.58,0.07272171569420816,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.59,0.07334884179103472,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.6,0.07398683828426894,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.61,0.07463571288742164,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.62,0.07529547344970607,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.63,0.07596612795634762,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.64,0.07664768452889742,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.65,0.07734015142555628,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.66,0.07804353704149611,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.67,0.07875784990919524,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.68,0.07948309869877611,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.6900000000000001,0.08021929221834728,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.7000000000000001,0.08096643941435333,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.71,0.08172454937193066,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.72,0.08249363131526735,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.73,0.08327369460797196,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.74,0.08406474875344346,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.75,0.08486680339525016,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.76,0.08567986831752004,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.77,0.08650395344532251,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.78,0.08733906884507195,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.79,0.08818522472492742,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.8,0.08904243143520407,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.81,0.08991069946878359,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.8200000000000001,0.09079003946154299,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.8300000000000001,0.09168046219277223,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.84,0.09258197858561873,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.85,0.0934945997075168,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.86,0.09441833677064365,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.87,0.09535320113236508,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.88,0.09629920429569758,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.89,0.0972563579097737,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.9,0.09822467377031467,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.91,0.09920416382010676,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.92,0.100194840149489,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.93,0.10119671499684378,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.9400000000000001,0.10220980074909554,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.9500000000000001,0.1032341099422143,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.96,0.104269655261731,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.97,0.10531644954325302,0.054752877862610065,0.028040940629869258,0.055811993139768964 +10,0.98,0.10637450577298989,0.054752877862610065,0.028040940629869258,0.055811993139768964 +20,0.0,0.4366911765474922,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.01,0.43672694031779324,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.02,0.4368342357122561,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.03,0.43701307498298886,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.04,0.4372634785549242,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.05,0.43758547503295236,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.06,0.43797910121191785,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.07,0.4384444020894803,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.08,0.4389814308818518,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.09,0.4395902490424265,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.1,0.44027092628330783,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.11,0.44102354059974963,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.12,0.441848178297537,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.13,0.44274493402331877,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.14,0.44371391079791206,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.15,0.44475522005260776,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.16,0.4458689816685024,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.17,0.4470553240188804,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.18,0.4483143840146794,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.19,0.4496463071530782,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.2,0.4510512475692266,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.21,0.45252936809117394,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.22,0.4540808402980178,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.23,0.4557058445813321,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.24,0.4574045702099053,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.25,0.4591772153978466,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.26,0.461023987376106,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.27,0.46294510246745635,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.28,0.46494078616500706,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.29,0.46701127321428854,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.3,0.4691568076989885,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.31,0.4713776431303909,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.32,0.4736740425405888,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.33,0.4760462785795442,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.34,0.4784946336160657,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.35000000000000003,0.4810193998427861,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.36,0.4836208793852107,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.37,0.48629938441493437,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.38,0.4890552372671043,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.39,0.4918887705622219,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.4,0.49480032733238916,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.41000000000000003,0.49779026115208486,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.42,0.5008589362735847,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.43,0.5040067277671271,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.44,0.5072340216659497,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.45,0.5105412151162935,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.46,0.5139287165325166,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.47000000000000003,0.517396945757436,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.48,0.5209463342280231,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.49,0.5245773251466092,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.5,0.5282903736577237,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.51,0.5320859470307273,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.52,0.5359645248483909,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.53,0.539926599201581,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.54,0.5439726748902178,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.55,0.5481032696306882,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.56,0.5523189142698807,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.5700000000000001,0.5566201530060465,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.58,0.5610075436166748,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.59,0.5654816576935766,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.6,0.570043080885417,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.61,0.5746924131478852,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.62,0.5794302690017478,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.63,0.5842572777990267,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.64,0.5891740839975437,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.65,0.5941813474440859,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.66,0.5992797436664702,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.67,0.6044699641747866,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.68,0.609752716772098,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.6900000000000001,0.6151287258749181,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.7000000000000001,0.6205987328437688,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.71,0.6261634963241505,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.72,0.6318237925982698,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.73,0.6375804159478764,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.74,0.643434179028581,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.75,0.6493859132560444,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.76,0.6554364692044342,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.77,0.6615867170175782,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.78,0.667837546833235,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.79,0.6741898692209654,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.8,0.6806446156340422,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.81,0.6872027388759366,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.8200000000000001,0.6938652135818649,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.8300000000000001,0.7006330367159468,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.84,0.707507228084549,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.85,0.7144888308663817,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.86,0.7215789121599784,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.87,0.7287785635491948,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.88,0.7360889016873875,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.89,0.7435110689009868,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.9,0.7510462338131872,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.91,0.7586955919885129,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.92,0.7664603665990705,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.93,0.7743418091133101,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.9400000000000001,0.7823412000081834,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.9500000000000001,0.7904598495055949,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.96,0.7986990983341251,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.97,0.807060318516999,0.4366911765474922,0.2688526404418522,0.5147756853853035 +20,0.98,0.8155449141873803,0.4366911765474922,0.2688526404418522,0.5147756853853035 diff --git a/data/cosine_ceiling.csv b/data/cosine_ceiling.csv new file mode 100644 index 0000000..17bbe36 --- /dev/null +++ b/data/cosine_ceiling.csv @@ -0,0 +1,3 @@ +beta,aware_mc,aware_pred,blind_mc,blind_pred +0.311,0.7251058104634285,0.7244273905766959,0.7074751788377762,0.7071067811865476 +0.8,0.8371337348222733,0.8366600265340756,0.7081796124577522,0.7071067811865476 diff --git a/data/csi_error.csv b/data/csi_error.csv index 083ca84..e2f5d69 100644 --- a/data/csi_error.csv +++ b/data/csi_error.csv @@ -1,8 +1,8 @@ sigma_h2,edma,sic -0.0,0.5445012038424076,0.5460929325736039 -0.01,0.5445012038424075,0.5432828884753359 -0.02,0.5445012038424075,0.5408883972120776 -0.05,0.5445012038424076,0.536040175102482 -0.1,0.5445012038424076,0.5277163316448914 -0.2,0.5445012038424075,0.5169782457463995 -0.3,0.5445012038424076,0.5125870168901699 +0.0,0.5985892848856748,0.5827705618180334 +0.01,0.5970788184367121,0.5824256975366734 +0.02,0.5956342787574976,0.5820832186681218 +0.05,0.5913892493443563,0.5813290306786075 +0.1,0.5849188896268607,0.5799057619913947 +0.2,0.5753242927324027,0.5776647866773419 +0.3,0.5690016979491338,0.5756815607612953 diff --git a/data/floor_validation.csv b/data/floor_validation.csv index 2af3d95..c660659 100644 --- a/data/floor_validation.csv +++ b/data/floor_validation.csv @@ -1,35 +1,35 @@ -d,snr_db,mse_mc,mse_theory,mse_ideal -256,0.0,283.9142603214685,284.4533071258869,283.41188049318094 -256,2.5,160.10089036917105,160.41563908393022,159.37421245122425 -256,5.0,90.47776215634474,90.66413246369561,89.62270583098966 -256,7.5,51.32748447743017,51.439977796849504,50.398551164143555 -256,10.0,29.312928645832216,29.38261468202405,28.3411880493181 -256,12.5,16.934181412329476,16.978847877828375,15.937421245122422 -256,15.0,9.973810638369487,10.00369721580492,8.962270583098967 -256,17.5,6.060239200519523,6.081281749120308,5.039855116414356 -256,20.0,3.85987571082472,3.8755454376377614,2.8341188049318093 -256,22.5,2.622819942039895,2.6351687572181945,1.5937421245122423 -256,25.0,1.9273969939302285,1.9376536910158488,0.8962270583098966 -256,27.5,1.5365003821408372,1.5454121443473878,0.5039855116414356 -256,30.0,1.3168093834480725,1.3248385131991331,0.28341188049318095 -256,32.5,1.1933627827422904,1.2008008451571766,0.15937421245122424 -256,35.0,1.1240146926635879,1.131049338536942,0.08962270583098966 -256,37.5,1.085070664488797,1.0918251838700959,0.05039855116414356 -256,40.0,1.0632107739660197,1.0697678207552703,0.028341188049318098 -768,0.0,853.4623064741292,851.2770681122488,850.2356414795429 -768,2.5,480.3951698733645,479.1640639863787,478.12263735367276 -768,5.0,270.60393697803266,269.9095441256749,268.86811749296896 -768,7.5,152.62953339008442,152.23708012513663,151.19565349243067 -768,10.0,86.28755819977675,86.06499078066025,85.0235641479543 -768,12.5,48.98065441173488,48.85369036807322,47.81226373536727 -768,15.0,28.001388546341435,27.928238382002856,26.886811749296903 -768,17.5,16.203841270734593,16.160991981949017,15.119565349243066 -768,20.0,9.569563575405624,9.543783047501382,8.502356414795429 -768,22.5,5.838813072859685,5.822653006242679,4.781226373536727 -768,25.0,3.7408413998745558,3.730107807635642,2.6886811749296897 -768,27.5,2.5610528622492597,2.553383167630259,1.5119565349243067 -768,30.0,1.8975997387446928,1.8916622741854952,0.8502356414795429 -768,32.5,1.5245056756935615,1.519549270059625,0.4781226373536727 -768,35.0,1.314694250809021,1.3102947501989213,0.268868117492969 -768,37.5,1.1967047053652895,1.1926222861983828,0.15119565349243066 -768,40.0,1.1303513753850125,1.1264501968539065,0.0850235641479543 +d,snr_db,mse_mc,mse_theory,mse_blind +256,0.0,0.9958906187265965,0.9957520371754321,0.9961240310077519 +256,2.5,0.9926509086327597,0.9924951337006896,0.993148778755109 +256,5.0,0.9869671196373861,0.9868069561728815,0.9879451709874938 +256,7.5,0.9771456527581006,0.9770064578879146,0.9789579793127183 +256,10.0,0.9605855179298334,0.9605076750198117,0.9637681159420289 +256,12.5,0.9337484810109989,0.9337823722702523,0.9390092836053628 +256,15.0,0.8928736458420425,0.8930612771894957,0.9009452871484813 +256,17.5,0.8360494261292735,0.8363998816883345,0.8473840548704382 +256,20.0,0.7661668636283875,0.7666566714783413,0.7807017543859648 +256,22.5,0.691947677239615,0.6925661718278007,0.709267994905624 +256,25.0,0.6243632968967908,0.6251571720537481,0.6440702380534542 +256,27.5,0.5709153641061163,0.571972710197798,0.5927077630509127 +256,30.0,0.5331897043219835,0.53458472828743,0.5567375886524822 +256,32.5,0.5086536205122679,0.5104122867933932,0.5335732525163734 +256,35.0,0.4935273743565432,0.4956303135714446,0.5194512459464362 +256,37.5,0.4844975136532381,0.48689966319840416,0.5111276997838433 +256,40.0,0.4792009242590312,0.48184935117050987,0.5063191153238548 +768,0.0,0.9986765012793098,0.9985760128125698,0.9987012987012988 +768,2.5,0.9976163216681129,0.9974733083167204,0.9976952053744985 +768,5.0,0.9957307732307438,0.9955242936982399,0.9959160824250755 +768,7.5,0.9923981843904192,0.992095537514675,0.9927835275542491 +768,10.0,0.9865629253484912,0.9861129415585025,0.9873096446700508 +768,12.5,0.9764985106901773,0.9758221660225336,0.9778701398348755 +768,15.0,0.9595662490049409,0.9585462259188507,0.9619573584726929 +768,17.5,0.9322122252329521,0.9306888249982047,0.9361315623151921 +768,20.0,0.8907470407123728,0.8885385986762078,0.8966942148760331 +768,22.5,0.8334967999962878,0.8304680517855016,0.8417416365176289 +768,25.0,0.7637208092945489,0.759888721537542,0.7741964962231777 +768,27.5,0.6903787748107578,0.6859650675890866,0.7028866275721191 +768,30.0,0.6242938905723492,0.6196325851274082,0.638728323699422 +768,32.5,0.5725413154691661,0.5679130695479454,0.5887951848908111 +768,35.0,0.5363309035044117,0.5318795970416631,0.554141276684715 +768,37.5,0.5129687106701781,0.5087260331425658,0.5319605114462806 +768,40.0,0.498680130948561,0.4946227489687355,0.5184899845916795 diff --git a/data/mask_family_rev.csv b/data/mask_family_rev.csv index 85d8881..7b35106 100644 --- a/data/mask_family_rev.csv +++ b/data/mask_family_rev.csv @@ -1,10 +1,10 @@ -snr_db,haar,wh -0,0.05647200954133838,0.05310404690708958 -5,0.08330434028403662,0.07868202035026188 -10,0.1362057604122267,0.1321506210735374 -15,0.22743813806699198,0.22553342842896307 -20,0.3620849406777639,0.36807222557624214 -25,0.5112067973087223,0.5367516728593701 -30,0.6187704792155053,0.6693336605430739 -35,0.670208963249346,0.7373274649462636 -40,0.689340654075078,0.7636921461142663 +snr_db,haar,wh,wh_exact_mse +0,0.056410143594257535,0.055201172281522305,0.9978637042641639 +5,0.085697923428379,0.08462585555389524,0.9933106958866119 +10,0.14458728155121206,0.14321016235277056,0.9794808036088943 +15,0.24451895691454412,0.2423005321621895,0.9407034531235695 +20,0.3882001306116581,0.3829878903925419,0.8522246733307839 +25,0.540928793400526,0.5299757443368435,0.7177656385302543 +30,0.6472152987122536,0.631390101313591,0.5997132909297943 +35,0.6973008319735527,0.6793428674340248,0.5366590532660485 +40,0.7159504926204682,0.6972508707642555,0.5119321745634079 diff --git a/data/mismatch.csv b/data/mismatch.csv new file mode 100644 index 0000000..fec7a72 --- /dev/null +++ b/data/mismatch.csv @@ -0,0 +1,8 @@ +beta_hat,cosine,mse +0.211,0.3896048231422901,0.8489142748713493 +0.251,0.3904690830409527,0.8482141560316085 +0.311,0.3909398098289967,0.8478092220425606 +0.371,0.3904550792276859,0.8481874433159828 +0.41100000000000003,0.38962371706962584,0.8488810566067696 +0.31490625,0.3909368622303009,0.8478098925948143 +0.0,0.37743803575634954,0.858243175148964 diff --git a/data/multiuser_corrected.csv b/data/multiuser_corrected.csv index 2ddecf8..a357d0c 100644 --- a/data/multiuser_corrected.csv +++ b/data/multiuser_corrected.csv @@ -1,40 +1,40 @@ -U,snr_db,edma,oma -2,0.0,0.005074924495401339,0.0028163887856167778 -2,2.5,0.00900326092256961,0.005006425437490073 -2,5.0,0.015943181620258408,0.008896821012114422 -2,7.5,0.028141662406857754,0.015802100105602065 -2,10.0,0.04939420068532773,0.028040940629869258 -2,12.5,0.08585687636915751,0.04967759953004671 -2,15.0,0.14680246472845263,0.08775733805059951 -2,17.5,0.24437407492333546,0.15425664820473364 -2,20.0,0.39036168250847997,0.2688526404418522 -2,22.5,0.5882403211652596,0.46202930580118473 -2,25.0,0.8236174091640396,0.7765249721523131 -2,27.5,1.0639633374340793,1.2629750132730075 -2,30.0,1.2740371164829405,1.9659871493886203 -3,0.0,0.007166121727981404,0.002816846908845676 -3,2.5,0.012688743558228709,0.005007872928745025 -3,5.0,0.022393454021796717,0.00890139152557443 -3,7.5,0.03929335948023371,0.015816514922095765 -3,10.0,0.0682640356183996,0.028086309611073952 -3,12.5,0.11661479903052363,0.04981987507531682 -3,15.0,0.19381754610825597,0.08820067087182441 -3,17.5,0.3087986357540208,0.15562283620381148 -3,20.0,0.46347315369044484,0.27298359666177824 -3,22.5,0.6453865207846086,0.4741321857975819 -3,25.0,0.8284280872854691,0.8102498992888099 -3,27.5,0.9858586691638921,1.3502134677042328 -3,30.0,1.1039774302731393,2.1701295882547527 -4,0.0,0.009176956996801149,0.002817076044986573 -4,2.5,0.01621312884680335,0.005008597092951442 -4,5.0,0.028502070980983823,0.008903679130992838 -4,7.5,0.04967547887822116,0.015823735486660634 -4,10.0,0.08531654320798115,0.028109067575874017 -4,12.5,0.14302271741867906,0.04989142100177373 -4,15.0,0.2308213082888609,0.08842458349643963 -4,17.5,0.3525340922014516,0.15631809220986412 -4,20.0,0.5011822600084102,0.27511311194165045 -4,22.5,0.6570342137422986,0.4805054388299137 -4,25.0,0.7963620296794736,0.8286132554549862 -4,27.5,0.9042441392584162,1.4000909956579182 -4,30.0,0.9788428109037877,2.294588749973288 +U,snr_db,edma_mc,blind,oma,mse_mc +2,0.0,0.0067459622753358985,0.005619067173648297,0.0028163887856167778,0.9976647585630417 +2,2.5,0.011675481754301935,0.009969612776119413,0.005006425437490073,0.9959617620706558 +2,5.0,0.020286535908117426,0.017657570045582938,0.008896821012114422,0.9929938805103302 +2,7.5,0.035291135414103295,0.03117756291292608,0.015802100105602065,0.9878435188531876 +2,10.0,0.06125380524795852,0.054752877862610065,0.028040940629869258,0.978994796872139 +2,12.5,0.10554787426027339,0.09526158699989311,0.04967759953004671,0.9640808624029159 +2,15.0,0.17922846076711016,0.16314404591732876,0.08775733805059951,0.9397740066051483 +2,17.5,0.29671520331202866,0.27228552723458505,0.15425664820473364,0.9022770518064499 +2,20.0,0.47207515868714434,0.4366911765474922,0.2688526404418522,0.8490741294622421 +2,22.5,0.7100570759041679,0.6617728169555368,0.46202930580118473,0.7818541771173477 +2,25.0,0.9952787609812811,0.9331238669104754,0.7765249721523131,0.708264736533165 +2,27.5,1.290911785811443,1.2146443868700316,1.2629750132730075,0.639290742278099 +2,30.0,1.5545191724506118,1.4647566493411088,1.9659871493886203,0.5834740561246872 +3,0.0,0.008221550750832831,0.008412218630107837,0.002816846908845676,0.9981022214889527 +3,2.5,0.015313679039211471,0.014902926454674073,0.005007872928745025,0.9964680409431458 +3,5.0,0.028029675597543307,0.026325253299532562,0.00890139152557443,0.9935446953773499 +3,7.5,0.050514313628626004,0.04626641612972433,0.015816514922095765,0.988396560549736 +3,10.0,0.08952942310946198,0.08059981755804599,0.028086309611073952,0.9795267921686173 +3,12.5,0.15534005610649262,0.13832515321163041,0.04981987507531682,0.9647452771663666 +3,15.0,0.2615951480089572,0.2316168228614546,0.08820067087182441,0.9413490122556687 +3,17.5,0.4221435294251369,0.3731878021467334,0.15562283620381148,0.9070698082447052 +3,20.0,0.6428146293469728,0.5688074586563354,0.27298359666177824,0.8619812881946564 +3,22.5,0.9107931284704225,0.8069275801266587,0.4741321857975819,0.8102293717861175 +3,25.0,1.192151455674711,1.0559460071626627,0.8102498992888099,0.7592338293790817 +3,27.5,1.4460078396289984,1.2782661617838726,1.3502134677042328,0.7159830737113952 +3,30.0,1.6453250009668556,1.4503691419311937,2.1701295882547527,0.6837582939863205 +4,0.0,0.015142645594341335,0.011194533410694072,0.002817076044986573,0.9973794192075729 +4,2.5,0.02657168051302456,0.01980238285260359,0.005008597092951442,0.9954060631990432 +4,5.0,0.04649602868391863,0.03488813263113353,0.008903679130992838,0.9919752240180969 +4,7.5,0.0808285062062145,0.0610360844265235,0.015823735486660634,0.9860911220312119 +4,10.0,0.1387823700129495,0.10550166169718982,0.028109067575874017,0.9762377244234085 +4,12.5,0.23327828100624443,0.17872115676402342,0.04989142100177373,0.9603821069002152 +4,15.0,0.3790651258653871,0.29313196378582485,0.08842458349643963,0.9364239370822907 +4,17.5,0.5861777540534772,0.458064715640174,0.15631809220986412,0.9034117364883423 +4,20.0,0.8490808651568857,0.6702163879182615,0.27511311194165045,0.8631778705120087 +4,22.5,1.1397156040760281,0.9064855445133952,0.48050543882991376,0.8207820576429367 +4,25.0,1.4160565809869674,1.1309122590875245,0.8286132554549861,0.7824041104316711 +4,27.5,1.6433747432527392,1.3140736832668964,1.4000909956579182,0.752183369398117 +4,30.0,1.808776977801607,1.4458968914537418,2.294588749973288,0.7309303051233291 diff --git a/data/rate_corrected.csv b/data/rate_corrected.csv index d907553..386c93c 100644 --- a/data/rate_corrected.csv +++ b/data/rate_corrected.csv @@ -1,32 +1,83 @@ -snr_db,edma,edma_ideal,oma,genie,mac -0.0,0.005074922224889888,0.005085968590195728,0.0028163887856167778,0.0056300312141080765,0.005624549193878107 -1.0,0.006383905773418096,0.00640139527831988,0.003545175584028836,0.007086000682366226,0.007077321020140645 -2.0,0.008028883565814418,0.008056567110301317,0.004462402142875826,0.008917913609859949,0.008904174704705635 -3.0,0.010095150934059762,0.010138955836487416,0.005616707528960678,0.01122250279942868,0.011200762797452897 -4.0,0.012689107038928529,0.01275839279457609,0.007069235608353175,0.014121193837328306,0.014086807264803002 -5.0,0.015943159211639874,0.016052690844464874,0.008896821012114422,0.017766293841720057,0.017711931943651758 -6.0,0.02002158323181113,0.02019462550149604,0.011195969967589819,0.022348664887473,0.022262779372211397 -7.0,0.025127416528746203,0.025400572273952007,0.014087824481532864,0.028107199678235918,0.02797162021400105 -8.0,0.0315103938374857,0.03194114344476364,0.017724337286238952,0.03534046212793969,0.03512665200704765 -9.0,0.03947581013823077,0.040154209208400245,0.022295928433737136,0.044420892444668104,0.044084138042602035 -10.0,0.049393985592843845,0.05046071565802713,0.028040940629869258,0.055811993139768964,0.0552824355011896 -11.0,0.06170967643915826,0.0633837099689487,0.03525725553198444,0.07008888995333985,0.0692577754750065 -12.0,0.0769502860361166,0.07957092682607385,0.04431647029951141,0.08796257073317358,0.08666134967423425 -13.0,0.09573105092136092,0.0998211434335674,0.05568105080659391,0.11030790336846401,0.10827678933608055 -14.0,0.11875450818829247,0.12511422236562836,0.06992485602776169,0.13819516297913534,0.13503645793865676 -15.0,0.14680056444078776,0.1566442653623848,0.08775733805059951,0.17292418580683266,0.1680341158620806 -16.0,0.18070258576377174,0.19585451834583373,0.11005152164455634,0.21605933241156736,0.20853051118575192 -17.0,0.22130451408346616,0.24447152199498445,0.13787549850403957,0.26946211915160523,0.2579474779472346 -18.0,0.26939472678854465,0.3045344507753753,0.17252656142846565,0.3353166538092753,0.31784551311517 -19.0,0.3256150019555273,0.3784136758834648,0.21556617256790578,0.41614100494016715,0.38988005918955787 -20.0,0.3903482286678335,0.4688105525777229,0.2688526404418522,0.5147756853853035,0.47573343096639775 -21.0,0.4635964354662514,0.578728779073748,0.3345666611396269,0.6343391981725063,0.577022932441223 -22.0,0.5448699198657065,0.7114072599088519,0.415222874482676,0.7781410805176758,0.6951911159367629 -23.0,0.6331155105059729,0.8702063713693562,0.5136586334498267,0.949546269308418,0.8313903238477779 -24.0,0.7267127428215634,1.0584449667589202,0.6329899409936198,1.1517917856752415,0.9863786311250137 -25.0,0.8235572044540542,1.279194773017329,0.7765249721523131,1.3877675181776066,1.160445692544041 -26.0,0.9212304756826651,1.535050886559065,0.9476289515595221,1.6597852620892968,1.3533832196252402 -27.0,1.0172315400901657,1.8279087143109145,1.1495412900125348,1.9693701773560432,1.5645062768096216 -28.0,1.1092250066402953,2.158784275832778,1.385156635171699,2.3171116947925556,1.7927209139328206 -29.0,1.1952558858426987,2.5277120709526093,1.656793870330709,2.702603452084613,2.0366245350378795 -30.0,1.273891696882788,2.9337415407944656,1.9659871493886203,3.1244848484421452,2.294620748891627 +snr_db,edma,blind,oma,genie,mac +0.0,0.0061610171386374275,0.005619067173648297,0.0028163887856167778,0.0056300312141080765,0.005624549193878107 +0.5,0.00691010417674122,0.0063024511854892495,0.003159852086906414,0.006316247537633628,0.006309349361561283 +1.0,0.007749905158458553,0.007068641357914831,0.003545175584028836,0.007086000682366226,0.007077321020140645 +1.5,0.00869131183087741,0.007927592484830619,0.003977454409125839,0.007949433521018416,0.00793851300292445 +2.0,0.00974649960657886,0.008890435799551143,0.004462402142875826,0.008917913609859949,0.008904174704705635 +2.5,0.010929072665281737,0.009969612776119413,0.005006425437490073,0.010004179295885398,0.009986896036002313 +3.0,0.012254223859673589,0.011179022795476752,0.005616707528960678,0.01122250279942868,0.011200762797452897 +3.5,0.013738910514711638,0.012534185756127438,0.006301301667732704,0.012588872126580048,0.012561528941353725 +4.0,0.01540204717058254,0.014052420692277471,0.007069235608353175,0.014121193837328306,0.014086807264803002 +4.5,0.017264716236363182,0.015753041409356024,0.007930628420075834,0.015839518874396368,0.015796280141876264 +5.0,0.019350397380995952,0.017657570045582938,0.008896821012114422,0.017766293841720057,0.017711931943651758 +5.5,0.02168521627394186,0.01978996930424075,0.009980521909443284,0.019926640307263106,0.019858304805751847 +6.0,0.024298212980174518,0.022176893856949428,0.011195969967589819,0.022348664887473,0.022262779372211397 +6.5,0.02722162988947048,0.024847961072149566,0.012559115877317157,0.025063803043938227,0.02495588205804394 +7.0,0.030491218490760343,0.027836040749765856,0.014087824481532864,0.028107199678235918,0.02797162021400105 +7.5,0.0341465635567491,0.03117756291292608,0.015802100105602065,0.03151812973760773,0.03134784632526704 +8.0,0.03823142234629086,0.034912841886155954,0.017724337286238952,0.03534046212793969,0.03512665200704765 +8.5,0.04279407522246475,0.03908641383789467,0.019879599469816586,0.039623170253689395,0.03935479204579221 +9.0,0.04788768258092579,0.043747383640535986,0.022295928433737136,0.044420892444668104,0.044084138042602035 +9.5,0.053570641143065464,0.04894977525797977,0.02500468735797887,0.049794545359324184,0.049372160308651776 +10.0,0.05990693045153535,0.054752877862610065,0.028040940629869258,0.055811993139768964,0.0552824355011896 +10.5,0.0669664377781569,0.061221577467185394,0.03144387359248828,0.06254877459459882,0.06188517603089207 +11.0,0.0748252465960363,0.06842666099667345,0.03525725553198444,0.07008888995333985,0.0692577754750065 +11.5,0.08356587028013787,0.07644507639991947,0.03952994922373971,0.07852564771453559,0.07748536205722763 +12.0,0.09327740881804818,0.085360128615295,0.04431647029951141,0.08796257073317358,0.08666134967423425 +12.5,0.1040556021156975,0.09526158699989311,0.04967759953004671,0.09851435888929258,0.09688797294459299 +13.0,0.11600274911459842,0.10624567530369669,0.05568105080659391,0.11030790336846401,0.10827678933608055 +13.5,0.12922745762077448,0.11841491058649742,0.06240219710982095,0.12348334468228564,0.12094912763439147 +14.0,0.14384418580218838,0.13187775289817832,0.06992485602776169,0.13819516297913534,0.13503645793865676 +14.5,0.15997253317558566,0.14674802345073423,0.07834213536920213,0.15461328486468107,0.15068065415770782 +15.0,0.17773623713261566,0.16314404591732876,0.08775733805059951,0.17292418580683266,0.1680341158620806 +15.5,0.19726183132739222,0.18118746406341277,0.09828492364037603,0.19333196120884794,0.18725971263613045 +16.0,0.2186769253440418,0.2010016899599364,0.11005152164455634,0.21605933241156736,0.20853051118575192 +16.5,0.24210807182326322,0.2227099414890049,0.12319698872821615,0.24134854631350017,0.23202924390125249 +17.0,0.26767819847782004,0.2464328367428638,0.13787549850403957,0.26946211915160523,0.2579474779472346 +17.5,0.29550359887341515,0.27228552723458505,0.15425664820473364,0.3006833665641031,0.286484446899344 +18.0,0.3256904979371402,0.3003743724210648,0.17252656142846565,0.3353166538092753,0.31784551311517 +18.5,0.35833123589614085,0.33079318537477825,0.19288896017297896,0.373687292568455,0.35224023897161644 +19.0,0.3935001471563058,0.36361911343894837,0.21556617256790578,0.41614100494016715,0.38988005918955787 +19.5,0.4312492471566523,0.39890825744125635,0.24080003515655363,0.46304287205402317,0.4309755647476398 +20.0,0.47160387826934685,0.4366911765474922,0.2688526404418522,0.5147756853853035,0.47573343096639775 +20.5,0.5145585022781102,0.47696846992857833,0.3000068719913712,0.5717376246277998,0.5243530472781891 +21.0,0.5600728580354036,0.5197066667099397,0.3345666611396269,0.6343391981725063,0.577022932441223 +21.5,0.608068724285634,0.5648346868062688,0.37285689185605564,0.7029994019650798,0.6339170443856742 +22.0,0.6584275350393116,0.6122411513558497,0.415222874482676,0.7781410805176758,0.6951911159367629 +22.5,0.7109890845273154,0.6617728169555368,0.46202930580118473,0.8601855102446063,0.7609791636000716 +23.0,0.765551528064256,0.713234378387138,0.5136586334498267,0.949546269308418,0.8313903238477779 +23.5,0.8218728332902462,0.7663898279130165,0.5705087483681691,1.0466225079410099,0.9065061679270134 +24.0,0.8796737646698733,0.8209654765747858,0.6329899409936198,1.1517917856752415,0.9863786311250137 +24.5,0.9386423967077436,0.8766546390433925,0.7015210764944273,1.265402692864754,1.071028665954073 +25.0,0.9984400543762295,0.9331238669104754,0.7765249721523131,1.3877675181776066,1.160445692544041 +25.5,1.0587084809543992,0.9900204972902541,0.8584229962332282,1.5191552559366022,1.2545878766134282 +26.0,1.119077943176341,1.0469811771611839,0.9476289515595221,1.6597852620892968,1.3533832196252402 +26.5,1.179175910637804,1.1036409416090471,1.0445423566829937,1.80982186122357,1.4567314014163084 +27.0,1.2386358989577517,1.1596423762632002,1.1495412900125348,1.9693701773560432,1.5645062768096216 +27.5,1.29710604997724,1.2146443868700316,1.2629750132730075,2.1384734087219526,1.676558897795992 +28.0,1.354257039699666,1.268330133073086,1.385156635171699,2.3171116947925556,1.7927209139328206 +28.5,1.409788954299457,1.3204137546758452,1.516356108640114,2.5052026381166788,1.912808196396262 +29.0,1.46343685117662,1.3706456179911464,1.656793870330709,2.702603452084613,2.0366245350378795 +29.5,1.5149748174907736,1.4188159253438317,1.8066354251478791,2.9091146169321833,2.1639652711380073 +30.0,1.5642184427865493,1.4647566493411088,1.9659871493886203,3.1244848484421452,2.294620748891627 +30.5,1.611025724734185,1.5083418630206922,2.134893534015794,3.3484171235368767,2.4283794932787846 +31.0,1.655296518212399,1.5494866278103396,2.3133360179346942,3.580575468601784,2.5650310482060616 +31.5,1.69697071073413,1.5881446672671957,2.5012334757215813,3.8205922014764093,2.7043684343718026 +32.0,1.7360253572646107,1.6243050934735594,2.6984443327894785,4.068075325449263,2.8461902094614113 +32.5,1.7724710336003184,1.657988465829612,2.9047701920540088,4.322615799931558,2.990302132880585 +33.0,1.8063476712179856,1.6892424524988017,3.1199607780022283,4.58379445293828,3.1365184527185406 +33.5,1.8377201214872863,1.7181373382163942,3.3437199433889635,4.851188349616376,3.284662843916385 +34.0,1.8666736682078067,1.7447615844356081,3.5757124449541577,5.124376483511814,3.434569033973711 +34.5,1.8933096697926761,1.7692176044671448,3.8155711791720877,5.4029447084663,3.5860811564667223 +35.0,1.917741470965885,1.7916178721312395,4.062904576010332,5.686489875468202,3.7390538737997208 +35.5,1.940090682653944,1.8120814410975492,4.317303874670602,5.974623178146912,3.8933523096222302 +36.0,1.96048389087427,1.8307309159245366,4.578350045500127,6.266972741742281,4.048851828833409 +36.5,1.9790498228022666,1.8476898860934903,4.845620171250711,6.563185513116703,4.205437699605096 +37.0,1.995916971802156,1.8630808114160524,5.118693153295247,6.862928524245812,4.363004667830932 +37.5,2.0112116632055823,1.877023330764698,5.397154659675771,7.165889609632854,4.5214564701987765 +38.0,2.025056528618942,1.8896329553932965,5.68060127841664,7.471777660490731,4.680705307942014 +38.5,2.0375693477816395,1.901020102220074,5.968643879061808,7.7803224966316336,4.840671299425853 +39.0,2.048862212555602,1.911289420316504,6.260910216711984,8.09127443203426,5.001281926175381 +39.5,2.0590409665385074,1.9205393645088147,6.557046835743057,8.404403603108598,5.162471483808707 +40.0,2.0682048751549056,1.9288619725928229,6.856720345408583,8.71949912064466,5.324180546618741 +40.5,2.076446484100768,1.936342806471171,7.1596181476676515,9.036368098013284,5.486355452242227 diff --git a/data/rayleigh_mse.csv b/data/rayleigh_mse.csv new file mode 100644 index 0000000..3ec1610 --- /dev/null +++ b/data/rayleigh_mse.csv @@ -0,0 +1,3 @@ +snr_db,aware_mean,aware_median,blind_mean,blind_median +10,0.9795477778116862,0.9844803214073181,0.9812235805193583,0.9864863753318787 +20,0.86083795551459,0.8848964273929596,0.8715663189888001,0.8971874713897705 diff --git a/data/sic_comparison.csv b/data/sic_comparison.csv index 952c2f4..0857bd2 100644 --- a/data/sic_comparison.csv +++ b/data/sic_comparison.csv @@ -1,8 +1,14 @@ -snr_db,edma,oma,genie,sic -0,0.05294439072634817,0.04744227546406637,0.05379261851424639,0.05389018816321296 -5,0.07594817329319892,0.06247051502646607,0.07880139316120491,0.07881668500992306 -10,0.12217900552930536,0.09554048483563253,0.12869653017833063,0.12780141614005225 -15,0.20186260353988977,0.15862477653551696,0.21655865548824185,0.210747933448543 -20,0.3172937611389947,0.2656884406371917,0.3525261215672996,0.32788756860888746 -25,0.44561602112223075,0.4226203227111401,0.5255728405808201,0.45184034211813306 -30,0.5477712579317904,0.6069297656726085,0.6947138682844006,0.542792955511582 +snr_db,edma,blind,oma,genie,sic +0.0,0.05578717951430008,0.05400461608078331,0.04721722166286781,0.05396917013451457,0.05426549927797168 +2.5,0.065774643314071,0.06321258225478232,0.052756696401629596,0.06320590722374618,0.06361642193980516 +5.0,0.08065654144156724,0.07687171540223062,0.06147742178989574,0.07694214591756462,0.07748856123536825 +7.5,0.10187424055300653,0.09648836613399908,0.07444818876450882,0.09673152786213905,0.09735255000414327 +10.0,0.13085299325641245,0.12340473086107523,0.0929846009076573,0.1241416653757915,0.12454899992793798 +12.5,0.16899134901352228,0.15893537403084337,0.11866934722289443,0.1608496064506471,0.1604155235271901 +15.0,0.2173447159398347,0.2041423544753343,0.15335392403416337,0.20866850532591344,0.20602014526724816 +17.5,0.27592357981950044,0.2591604423709214,0.19881520241498948,0.26905467864125965,0.2615451134555042 +20.0,0.34281544568017125,0.32233451675623653,0.25661767227575183,0.34233618564903734,0.32547976134344936 +22.5,0.4138438655436039,0.38978456068784,0.3273876936547458,0.4268909978121519,0.394242920614779 +25.0,0.4831898649036884,0.45591997236013415,0.4098757527023554,0.5186095271632075,0.462635233476758 +27.5,0.5450719533115626,0.5151139491051435,0.5004852302744984,0.6114595555514097,0.5252878930792213 +30.0,0.5955657368898392,0.5634874982386827,0.593484514914453,0.6988957175612449,0.5781986298412085 diff --git a/data/theorem_check.csv b/data/theorem_check.csv index dcc48b1..bd007fc 100644 --- a/data/theorem_check.csv +++ b/data/theorem_check.csv @@ -1,5 +1,5 @@ beta,user1_mc_over_theory,user2_mc_over_theory,max_dev_pct -0.0,1.0,1.0,0.0 -0.311,1.0007005180677906,0.9999999999999998,0.07005180677905898 -0.5,0.9964527822308402,0.9999999999999998,0.3547217769159783 -0.7,0.9981870510670983,1.0,0.18129489329017368 +0.0,1.0003971986044795,0.9997756167547166,0.03971986044795095 +0.311,1.003449173346779,1.0016398632768944,0.34491733467789665 +0.5,1.0004382526911781,0.9996516691448926,0.04382526911781426 +0.7,0.9986337430756431,0.9983924640367988,0.16075359632011788 diff --git a/fig/block_diagram.pdf b/fig/block_diagram.pdf index 195519ad031cba863eb506a027f58e0dfbc37ed9..92caeb4076c2e8803b918b1264926b5d1ca502f8 100644 GIT binary patch literal 72614 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

EAq3X770yZ(Hf)DY$v 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 Lxl~nM{oS|#RH5n` literal 44321 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 QI9OP@;VCI4m89VRAC*f9CjbBd diff --git a/fig/fig_beta_sweep_corrected.pdf b/fig/fig_beta_sweep_corrected.pdf index 5950ea5a61433b03f38ecbaf3d07e383c116b5be..22c9162cc8981aa3274af0b977042b1b56d6977c 100644 GIT binary patch delta 15563 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 delta 15008 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

BMN5()p~SCGjdOicg7>bX0685Ie(r7r zBoYee?Jgd^5FHAU+jW5?K3x(D-*I4mA1RVonbDWe0GKCVYalQ6%2PQn)u%Gr`-<=Z zGYrZd;S_x#L*$JQ{zVAIU7gQM>dQ;>kc$y|QwwdUVEP*7t!GxfwE!IL|hF3J{ zY7iK z-;UsA3UAF@y~ds2%Yl3md(;u;0=2P=D&iZCdb0R>^U$pW*BZXuVk)wsfxO1QlCsPt zdW@c^QKAF}%ArR2#ZnZDE){_eL!HiAZIou4qRc!c3JPm-c8C}7F^;>OX5M{5Xuoox zn_%7zb9DJ$D73~R3-v-NVB~T8j;_mWos-`wHkMP=M5RkULQA7JW4k)4wJj&yFhf^= zt&!2lmZND->lYSLkLgm2dpS~aP)gD5m%`@#Wg0WZM0O94y)lNtPX~TAeaNLF<9vR1 zIeKbL&Wu(tb1oYA!+}t8E0&92oI=Vd<8e(%EUQ?5YYs!HL(AINhY?NNC;9|i4;Ph3 zUYR*j9jspO#F@bmJQ0j(IFd>_n33eQL6c#su#xh$jw%Wba}dE>Jps{t7g|)`!^KdV zO{evoqCR23v^C``L%4QgjJoOkgzLF;^XpHC=kGUwz1$lVbN(NwkmMU`DsWb=e}s$- z*~}Q1DljY`UK0f74}$;Kf{|=Yg9*lwoF7jK)Y<-KLEU`7;w}|WFiWyz4c=qG&rGYx zkcHOc!xQyKuNQc}ivF_@hU^*d>v`oRur(GL@N&WIlq2febX+oWoXyh|We42ks( z0~}FzXnmPUzXL4@=f)7f_|IH@Pt)nuo+})zdj?7+NQUCDrLNVv`cHu8f`{mX z+!n8E-5bG@gMDg2xbxd(*U^^irDu=p7B3FCNGZsTC+m~|KM{$56dv@43utO;UcOqd z$3blYW64}=Sx(JebwWcW0_{~_*wKkKOH+|*p8(7|n!igUxLV^{@ z3mh!Z29WKBA87$q!9o@RX1rKD;L&Ue+=Q3htl{o~j3|NR)^V{;Ef>(e&2xJsY$4r? zxv^-y&2Tf>DJr0`-g}9+8}D z2SEyzAoAIR9GgWvBofNcA8o)R>kCGm3A??v8Aqu0Obj$C!bP)3KZGS}-N=?QWL=ps zN1!%`@vhOZbz=G@>hKpZ9a@qIDNJ40!XO~bXdJxJjX*}wpka#m^}UY^2*C-SzP8Yd z8$+9?6}_335XJ%UaXKE1=0OV~G7eyF+I20W5rLLpw6n1fm74uk0VK08Q}n+i2>dJy z^m4Bc!W^A(22GJHStE2hV_dxye35>tgwfgmj@~Of93spefbdeY^}?neBqEdA2%_sW z8Lx{SC%uAuZL*4=q-1}<-!OUF3inamrHY6@6Obx`9 zJHs>y5ChKhu3Y767&P43?3s2Ao~4JEO#7;yi5>6lCA;#hmNQ(*td0{@=ne+2s;h$J z2$sjPIkN_XSAH3{M4sNRdg-ip>*22w3*lQnp5B0~?{dsxz2?KFgv8}-xX+WAVzHPU zg@`p=3EzX1y@ZoC-jQkD2pwBl$?<|d*w?u861P1?N>^H}>JFKa{FUSX}q zV_9&|pO#L#m>I5hV)Lc3x3khsaOlD?AS_|i9DIZz67)-q=2bmg`1GJ|WL5-)4GiHsg zQbTY5!lovQ*Y{}0Lbnf}hou?ild*@h!Ki{SLWfthn#^VKi^Hd3ddoh-g44oXZ%=K< z$JTC4yi|5y&jJKqhwm#p9Q8f1T8gQn|4aigY$`TAXg?I@X$oQ+YPR zLE|~*@vFtMfeRy^k5!!~cPma(XDsQBh+Jm#jiw2?!xU(E1?8(d2?a@TlL^}hTl5~4 zZ0DP0ECG_EUxa=>3t#eTc9^lI+n!TGtPI{IvX!Rpj_w4Co*Qics^3s!3HSpQ2Dx!} z>T=Zri&G?8*WU?qWA3DEvNin#qT>~ABXDrF{2EI%h4@CLFqH&0D3s)Hcd3Z;bm`*h z6&VjuFiBM3yZ2ZJVdAmJV6ft`Z+)@+L|D_te@AU=bQ;|x?1>J(VNz!qxXg`T(I}eV z_C7;-i#Yq)|0L|`y%B$12}lPB*GKE{{d=O{FrS9-9$XgsMu^j6yxOcNa>fh#Y zRI8yo91}}R<1sH!r$lc5n(3zD6eg%t^TWKZDs3=o{KDJi1qyqXHacytmC^v8d+vuq zr#gG}cG6Tofwp!LvunMG=6Enq`jEG4x7^mbMSx-2geNO=w44iI;3C85YS1aeD#hxX ztCR7dI1e2C)W#KUIVtUbpjs=QvebjYSiZ4I;JGOa$7 zFGtlgS<#kE!PXno29uKyp2jllX+*s6{LJAw^QOmE?@>5Ws{iNz@0(-)Z{J)pz=4u% z%s>urW^7>$1_I&yV|#5J)Zpx#$p!H&R7rYhs)LMpuLW~i708hCp$oWQM-l*|#16wn zdjj2PfiW7A;I*IV8SjYi4WHo_*hkC(EIn2L%&78U2|+(Yf3r-fJg{(nRz`m|&|9t<#^ zWJMlg2rhP>WIG-*6c%2#|8-lkbFw7|X_5nrTK?K8%c-B6Po1978DLv|c&NBe&$ygu zkkBeO4Naz)rc^O{7hGjSHttZJ%j|P=_?c5=aA_KR1zYTFe z-reJDhgCWFD#qz&S{v8u5Mw3cqVPGeQ?ay)>dI<-DDmZ@=__ZobqzYfV=dyMEUX#m z4RvFOu;Soh@U{5p7*D@BK;e%QHCb3!X&1z)r}2%=YIn64;>R{oVwG4|F{(WPQpvo8~hDN1duozw%IafKL^Ak6{-#}ghdGfqC|T=xbCRrGdeOl~JIqLpCB(}cc5 zQlw1~lM5WT4wGU&5Np9gK0ae>J`z7h{U^-j=R0*948{R|o0K8haxDkn#ND$>?lAkY zJ1u5UpR`*&igL*OJzUAG4zC{a5X^!&(Q_ou2(3Z$_870%;z=bsJiV{ibnVUvSu|Qc*!djg03^;eePa;}qqRgV;?^+u zm*P5Wt!kLsg--$nna*jWZ#z0wQcP={Irv3fxdzw1=QRA&ubjR+Lr^|RnzO$44TQ`j z$yNmxGZ2lCjGggK6|NkVRf>jtzs@u+=5)Q`&U&eD(Jxf1hR^88K-9%yoiLO<(dbo+ zG{+`tE0$~F0Cw4i^}Y4c$f&g%r}dc%Tz=AA9bu|=eBLfk(nuJ#%?GLB(+MzPU3-E$#LB zDJkca%pYatF-zTmqj39<;O`_>-=zQLKP)L8XuG>(1akS=>mwScw3BjDc(|#z$#oVD zJw)y8Rrg}-g_R5zepeGa=5!61(b6?=&`;hZXQl3q%7h$of|91Wy=?t-=A5@+#F926 zrKwnHlSFjpMD0^3S!6HAMx?`B8iXwz6}vTe^D3)J<4WqhX!G}{mWevArVma}Iw41* zy-C1LfR?QK5k@)3ZWV;5+Q3A7b`y$u+AdeYFKsWs0{eu@^Ly;_g|S9InzKH-0uG>@ z&%eTkji~MpXhSHql;W8x)CEtXy=mWM*-wf1M(DFwx~8@Kf{=e`7l_yn#Dh66A}1@d z4qffFz~xDAND&Y35_Q~n#B+p`%^v`t+=aI(1X6?Ah}ACjm9#H0Tm^?VsBewHUZxc2 zj!!RyJ*QAJS`~2Jt6P zM>5NFT_G~b@W}`Y@h66z7{-(%#q6qRx%|PYga+n@;NhZMas=7pysr*Ne4a zfWyVw9Gf_)fQ|c21f^eRlRaZG?75Ms-28leOZA({<9T^qOR1b6)#~eu%eexoSd2mt zzrnUGR!84ZV}G9CxD+qV6n~X!Z<1`OXOwm^Gn+wn@Re`PfJ(v(ilUOlGp0N5D8s^f zP-ej7#5U;qkX>$4r_rj}IM)*DE{$Y505ZRDkXv|F(JtlVBPOHOITuO(9IoY95B)-O zr8Yq1X&O+NP8n(F{4Y9X5j|b)bu!6qr0YbJ{^TBcBqlb{q|}3Iq{FaTPD{PMrbrbN z9E$yKY=hrKA|U^)V}#qGE)+-b%kOhV5UFguIyiSs@>jjKnjA*{*tLuz!n4qT243I3 zJsPPnc6wXvM7bzbR|I*OakuNlFNh1ea9=H1ubagUONUh@4BE&K)r#t6*bqj?Cm%B< zcp)Idn>v`NzAc5ov^WZSB_L(B09(J9L*;q9_t5wEh9dUjT89oB%Dmrf#!h}mOl9-B zJvXW^XRyfn(bfnX($oNtbMo{?J>#XrezPw=_kf=%EX?ry04k zDO-qSC1U5Ig))lz?KU9|r^riBD7FU+=l8puEb|{c<-Nq2%&bTfw}?W~=}9oevCXJq zzs(dFatDcvTs?(4dk1njw$hI_M}{ky_dT{PygRmgZls6YI^08vFK6*R0r@0;H_wT< zS?1!H8EOG*F3KO`;TZ}ltmeqyV`WvK+h4zVJiHN|3EzI48n%||kB>;VZD%YwGx+<7 zWirZd_Oniyr|j>e&kZZ#256BADUv&EyZ;%fF_4OnBuDDlefte#`ZRQ8h}!aP8@pxQ z>SAl5)=KGj>E_&7wO(`MCGc%+F4Ky)d-tGaJHY$5v)l#&BhD|wu9aJ8*99()g(WTy zk$#Eh&>pD>(V2dG6tS#gn`8){WHgd|MEQ&Q60sAFUuf<<6%S+LU%@a zSw=`zH)q8wvd9{;^e`B4oSXn56LB1b03o9Q;jkA^vz_A3p1*6g7y4D*=sE10`dFfE zgbShIfhogSegq`co4TEOGA36FhFzU@SIdD3NX_+DH1kVL3F0g|_{wi_j!kZ+Z7J6n z<9Os*d|Vy4(js&XpiG=ItpL-aEDXv_ITXe?2#Ho&6rVvmicdQs%%V&J$yO!Slt(%4 zt2PS(7EM2ocEa~mZ8!w%t$B_8E36{u!LlKI%-`RgVc(6a_;$A{+MJA$#y*(cp=3Wi zc$6OjeO7`&ZDg3+T6}EG0z~8?JTGf4QJ=Jt+&eGzq+?Ja;MV6DN!qHamFHhUpoZJ=(BCug-R52ou zWN1(bGqeu1Z-2=~?23i;PV5LaJ!Y$oUu9<$L_cjxm_tqwa5ih_9uDOL3}!fS{4Waw znEek+l%V|CfQ%Z;**r*p`=a=oKiBd4ZY8|QMxzDeBvg0fhOaCcOmMG7`6%}HFyviV zh1&=|%qf41a+z`q0GxYAS1O<-_tnShw%g}4M+Rr>`yLKt7luR+#(i@>fOW4YD#+wh z$sgWBS;il})j0bNva4>jcbjGY%w&P`xHEqlvWxB*$j%4Q?x%wTXpgJ%*@G1cj#H`V z0SV=!a`sNOneybY_XRw@CQ+dm1bSf|>!(?nj&}t59Mt>z=s1K|YEfcQVVrw*>Ml%q zVgK1N;ItTrU+g7X^AxrukHhLV&+FtzJ_!OJ-LW)H6N1mK6AREM84+@lki0ROv2jrt z5{wMIOHZS~z9#0bJxX13QD1!1c>W7(t6^@Tg?7W9oV{*rN&a*1*bo8M^J@O>;|Cn$hFsO>>Rbdic@VFCzb9zpQO^EQ{S{ zU6W|rvbdUWZO;5aFMFYJwKuD(aaANXn2Qs@eWnscf?lJs4#~HITJ@h^SiZA@TwI=i z%5D@|9$411$;syvRf3t<6|9CUUJSPFQr|DJWv;$eP0g1T#R}FOnu8Y|N7C{0MrOoN z*HkJAXD}oy(@s!RPRuU}CQP>Zo}N3WR*+8($%w6!j+X4T*w-IfO}!ElOn|Dk=IK zDh$8gtBf=xWdKR1ctI^PIT#A+si0b`P>fqJI2Jw?jfm_XSa74{9FL48d^*&s z0tKZrIt6Q(oXh}bFzM20c9v&--6t&6=Qi|vJmqT-Xj*dxKbcdC8jR(?f+6^3#`(0y zCdS79UdRv)t9U%PJb0};E*l_-h2%^rS}?BU{6Gpoh2QR9RAlRc-cde+bp6DRC3uH{ z_%+|LG^sC5QBpZClmX@MlSERo2+Zb)UCf#6+r_ zmV&>O1FvSe`1g~BHeh;hqaWxe;u*){sVDpsr)uH9vfBHOHVkV_A1e?S4>k7CLk!3V zVs7$VAVvm#ixX;c)8fwX``3qg&i2&(07yEPNUh`tX$2@zO)W{eWIk=nVq4CYunbAtf+>Gps8S@7N+USRgJPFvPIHeAsYMkx?=!=ywn!p06)n>mk=h z3#$IzRb>^}a{sCvP6&dwj~Pcriv(xt6C-rc(tSU8(G`?&t(e{(Stl{3bf8}IarCwD zTA|*rWueZ4_XyCe;Ox=975lf>kE=Jo8$clLYSp##Q={(IpWDI1t&)ph7rh7YosKo? zdK3`3pXl*hib(kUCRyl8{YoYuGwVx_@_FF3wb(tk73(U*&d1M35SZqbcV9-e_3eBj z`u^(e-tVmS@3&1fh1k@q%`Hs&ZO{3dfw89z)G`qfCW4 z_-x)GB#EM*DQyME&512-1=f2b8TX!JU%4?;V~dZ*?_b@!FxJmFjj=U>$vh;>kMua2 z(je0?FyvsqSas?zxIeF0VeP{3-1KrTX4hTGgLM8c8?dk-DmFm4l|iQCU^qKTNMlDD&m ztk>3q_lc~yqpdRb5U_5*5jt@1ti>`2kC0ExfJIhHHEAjf*W)<+A!7nP9jq5L63pPt zP6{i69jNUo*CE!mDFDJPYw-o4V(Nc`3Dm|}lf99KA5jFQps(*Eu*BDaSO_EFq;RRY zXM4l;|SJKBWoml)~$AVVzudW69C0Eqzjt?p+B;eSzsXIY@B z#A#FdHkFa@^5Jbw@TvmCty9+Yuf;)<{kT6MOIRenu@hj6AZ_5-VRT{o3;TR|eLG$~ z{#Eo%ayv3NCO5JhT@c%!*N5ZP^nRq;>=Q?CLh@56p!j$?7E2c9!Qpk-n*bDu8pzZ} z4ra^&Dg&`l8QKFN7B~6;zZ@Ow~*8geHjSJL9bll~rH} zl>5A5H*DK7Uqx+)}vHx8tyu4BsF2OA(KKg0Jjb;hVK6;fXCK#QK5GPGGov z0e*NMW>INhZ}H`KsGTGSZYuK;ajpBIj%k_j=!~(LLTrB^BHD+K9)mBaX%p_kM&m&S zw9E~e$HX^=U1eYXeLz&o{UnHR4D)OewaF^)1N=Gg8FQwn67d|0jR>Yt*H#d(s6S8l zsJ;JwFPYzTuo_Ak@Fh}HNjl2oarYre7LAv+^b+v?%S!2;@*8onWwwkd1EX>L*u51J z{2qaT6}E~7R0qONb-l<*n*k|LeQ;sI^F$Pxl=a3u!#ybi1}l#%S!Qw7lg|ghBqSs| zFbic#rG|o=f`e;}Ry)?Vefk7dMciRU1%c1<&;jbRo0U8M_caCrQOJG|6f@SA`}o~q ziT@`_8ZPR}o@q&|*AR#&#wr?1vZRCEBbL;D$7~rq1R5I)lE{PLNMYRX;&CQ_G#Mt$ z(TK(C_D^33l~Q3!b+n;r)+iQBAV#MNK(CJ9CM%a(M+WBVku@?J4q4LC(BTTAA==E5 z)gmRgR>2y|8Y+t#%z&-{hZ21qx8GG~9#vY%re4uxGi@_% z=ioYv+=#naNVEp-koEYZ8HB12(YyHvUb>cTBR&>2ZU?bbNMzD`bnxhiwVE--ke{K#DR952|7~t}}9RO9FvJ!k+VOcpk;m(5|ZV)rTC! zpP?TVz(RY@x+cQar%JU~L7`C!U{y?-y9I}4XB($snzK^SZ(bbnO}o<>*wSF)gI)}@ zIvSZu43NUWO@3?JRGCycS26uw(CPKP@$)1HCcbeJo|vcBeY2ffK~6fl=d)7S=qY&JeK-B; zomV?>u35sD>@6;L&vh`Tk4GOf3g>n(rcwL_AQL-~+9+KA!?lmg zLDh^mewn*sSt#tXx;bwI6&;6(puHyzM~$0+fF!w(HqMGnB}ZopE!V=jPti>{mPq$F zNg9?U#b~@WhwE4D`I@>_GLgouT<>uL-yUut2rRbRrqscDK1p+~!MJrlN-@_V{Shec zzuQHep#0^g;WDNQw9RRb;?2VUFspK+u8c_mS5%Z&q0Dfm-^}@E2i@FvTl5=KJE9gUa2yANmic)&JX!D-s5l8;vS4WAb?8Rr2PFhZdrWDF!Y{8%m04 zYB6jhG+3%CLVw8P=Io!2LC_sYj!+?SV5tW_S{c>ep%>x8ZGG{0*82#7|^UtYv_+92ND9}@9%akrd% zmH%lA10=OO{MxiSf+Y)L_#d|oto*ER%JYH(qG;&x4|2ICH|9 z-TFvi(J^r^-xc@pg_sZ`%Fhz&9oY`;3^J`l^%8Z+IgA+WJ@zDlouqTZqdQ!1w;!AS z6-B_bapy7?Jd`qt7DBMZbE%JfgxCBW0t`0NX*~Q}3|2s!``MDFZaqm?kInv2=^Keb z>s71ALnUDS>HeO+p7(OPH~1@8l;49yp!F>y1m@=Uf#0KQ`(M&1-qCtB(CT)AQvHoT z8M#W>@9}*10fr`yIA%Tx7EhU25hlF@T@S#~#m`P<^U#RWaFHlgs0STUO8T-{IXhv> z5an#<{5ykV;yfg@08BZVa+*|`!E$>#83h>y1^1sms`HY%QfrcH3I`)Goi@rmERLAv zBABP(CZhfvILH$N!%|m9_tcD0+3CKCRYdmVyTrj?4I0-fdYxKO^G=lwAG6!_f(A^~N@+qf5eI^qh_RxktB zlqXJGUGlrr*Ci#|-fQr9%ph)h@NX<^R1&DqGKf|+P=hqa&1qTWCK`#8R3W{tp`yn1 zQ7aYMZw`oFgG4z~J8g>N?)SVQ0>De~U;5y5E=OmOJauNUCqbq2|*oy8$_O4b|wH@rz4tn9#r62)k`m|_elb}<^`wjc+8O{`6 zud8XpnJGKp=5O0YHuP~MRzff1KdbrUduse^49d2eu5g4a0*pVxHI{WN;1)XF+%D$R zLg#(|-ouC}lXQK3OrTFd3;}-2)C>luF1idfuV{zStE%fv$v+0oGgubWsK+_ZnSFDE zLZ&ZoDo3P~B0N(VzqeouQ>U*}e~MQg0|Wj8EI9@~7seE~j!mO2p5U z*B~MwzI#%zm35L1$#*HUueSW+56Bi=Sm1{;aI~Gvp17eJw;&)bGt4kUH%PaD zAV_yNC=5tR$57IZbazQgBi)TkN(++Tc+UHN=lt}&{&QW!v!6X{?{)85GkdZ2{iq2_ zmVl&1u5LGxfvr=~%~`?^a8Z$CIC*N>2IFiG|b&NU>we#%upyENORXMp*N_0{gz zFP~qj&+WA+6%RyAqr6!;0qy8S#sPEb95Z)Bd|m~P!l-GBxbCl??3ezcE-76I?YNJB z(dm~>O(dP0+|<4;tZOXKubR{LmF#64E4wf+PLuW%SFIs!U`As;XNa32q&l`@Ao6pe zo2Lezo0>L(|1GrTolZpSJBhtBL(jI4d42=-MI#^*dh`R&`Q-VzdHus}4D9#!^X(;~ z*8?9wRxm!pJKKJ*!knV*NYMjtJ3r;odW@fruOCum^GR#NTAs=UO&AkSFFuBx)_)UF zDc0VOGq50O`;^N46u5$1(zUgRT6#Ly6q>e1*0xAC-GUNo!NRB&eO)J>bzD0w>phJk z)DjZJ>Urp+aic(St@)TqrS)g^&u^9^I^zfP%|fuJN6Cgl3llf$eDy-^NXrZ^^zjUI zv!S1+Xau_|=Dmw$JL_(9ZPE4$)@qC_}KymPUxvcaR!CFok_{ z%Uepf(ww}ZdNGVoR_MmYs#=nyCWrr0vZRk{a>ZcCHG@|1{r$=T_s6j>k>G@P>9Z)U zn3vCC%?Ul3XIJ513?`){AWF*%hC@*lxmy$*R_@CmcrNNj7Ats*YiN7@X*dk5&n$ zHXh~PJO?5 zHX2`pKg~U&GU{RZre+Ewg3}CW7c=B|c^qbfP_&=kQ`)Qt1eopHzi1v)R zghi^RF(M8!0mcBMPUFWTa;4-H3b^>VQGA7|)4@N2GlQ*PtUfIs{9f8%K&X-7Tj462JErC%@#T@u(X^+WjPIkl6Cam@-W*f+=Z3H&BwkOR zD;v!WpX1;nn8(A1lp@7I9++^ z-qV~<(X$y}`k`_6%8OSdGj^BeS~-UuxAp2VJxg_+AVL?&I-`i4@xDMI{T|w0m608? ztXhjuBAitrrHRL>cHkeCK)Ux#cJ7arMQGF+<-bc0Am}-tG_p%qu z$QV7iMKGsBC02n1EmN{kd-yqdc?7K1_oB$gq2}4v8DjQC*fW_7*l*(kIiK2lb5Yz@RWRVQ=fFor)M)0Zo&%0t?kvLX-#ZyHZaZr1o2`bqe-5 z+;fYKFuQjZRP4uw%HRTarnB;H@d9B>3m%hW^-D{1hhuPTRua_~rLP}p$zX<_W#uhK znwDU=;7n$RQ<+-Ks`EVs4gJf`I={0Ck;P2oR$GGmj{PSl^sig57|pf&aHmAC@s#h) zyiE_K^uKVn!#-AI0e&W~hzap_7~7kT1s@y`vdu{4CC}%jn2&hNNx}Pe>535<3-@-f+FC-YEO3IC%$NKR7%Ajl6;m~rE3Xm#o$4Vrew9F#- zV$ukl{#^YAM?Gs?Nq%4WeMxwxz0Jd3>CZyTh`Pg%dnd|ijrL1zyC*ip6+a9}KNQ@3 zTjV<&DH~X|sXN&I(E0Xi;&Z1!&JDqYq8+b3$}={+R->X?sawi8q4N4C7FKGNupCrPx#;Zdzeq9j^AI;jUT-x`#e&>fB6H;Qc$-qn(+i%bC0BL z(W*R9wxhc)torH@=O?2WjP$3gyg-8Q3Y|z_AKjYCYhAR;O@l-Gvzm{>d5)VOx&xBt zt#C!Ie024RxJ+;t>*x}q9&Yz85N-dN=l%TgTAle)19uvIWyLDZhhPkY){t-unUsUQ z%C!=~le8GI>ti0v&AiP1B!B#PBNzVQM+Z?12h5}WK^9kW=J4uVSQf*gL2S?~7ZowV zh3|qFZ5Gc}S-<8_%2eAqvxdTTShs4O$TQ5x7RR4H3V)@V{sA4@r`k4Vo|!RwwxF8n zaHYOSa?fMfTIL&03;RXbo4(ah{`xMZ+uvy;aHf=?E(fI?6My;{?b}~7TRam~SxEl- z{50o*Ely95kRqnp#9?9$0@W%&$YPLz#YE8QC$n{5HM7J!55CwkHwsTQA)oLq_Qcx? z2EM$b_8d2KZqkBLc2aDTr30<+Ec?{lRPkHXhkZC7#Yf(gN}HxpipR%gqK50wzteTw z?{%-8m=^k$oMU$=X?f&oZ*R|YXLHV!C%4%<=)MG*K0m0e=!a?A%+d?S$5Ivr9&Xyj z;?)~>4)>?Ux|Rpg$Q#7>MXKl3$s@ZXC|9!JciLIjSo@yNqQ{^B(!E6tp_a-U(>?=( zF{2pz-Vn*0PjR=?GsX7BR~Rzvf->x}#6=&+4PsbsH{E)j^2z6ie>UWxql+2LH+aVM zH;mc5Iva2>z=9QVzq(Dk^jZ5@VX^LZHXI60u3%wB0+4MJQ+^`Y>QUj+qqc7)HO->} zSf0}OYA;k`&?0dhKUfRdlxOh#H!j0XbyM`Se-RbMo=!x%LCnubbKjz!p=gMgGH)2D&p@LZkO4kVruPkujL~FN7k#1|t zkV|(hbA-Q}>DN8zA(Kf8O*0Se5gla2O#y~QVKl^*Dps+lSc4C0ke=w)>6_>E789)I zqFiOP#auamDp2z-5KU!~&ZyP3npoJy(^zPK^r~0VV#PTubgG-8?FZZNG#&m!9EJ2t zH!PLV^>~;;v=XEKmxaB zH?uCAsuO|;tHd&l)SH?VvRVU`8kYHtXfB}Q5U*Kk?N?!z=cCozi?=`Rp8ILURS#&H z5wHi(#`;Q6>Q?vans5MPs>g_m6sPdTVvCBWxTaubxV_%}-i5!uDR_7A>Sx%0FfFee zb=6`nC)H8l#E%+Ma4#@#uAk_bXqjl}>gbwCpMKKF#uLV)$U_q?I5dS>`M(Z&-eRClGW-?g8$7XoelDe*vj=VjBI-bFi?-e0$66(Z zP)*%BbUB_oGo|+s`+9V`ODBnaK2*H4#K7o^{@I}*sE zS)$tp>Id3OxR~ysp63wyBl~tF^1U8{ZVR1}j44>+TV`02s9^NDoUfSNmZJ*d`e;J( zjx8gyR%&%jJ#?laB2D@vn{Q;3Z;O~NkNT#P%lU7jpB+$%`D#)8wCP`Kd8XZC{-RPF z#$&xVWo(Dd+!OBvTQzg7=CA1UxXZEyMx4R2dk@y0hrIx+v4j*&xB0*cmOKu0oatl_ zU-RkbT1vb2Xj?&CMyC&0jFQ`>-3A4qs|o7JgtQ*4vy*k7M_-y-W;xd``M*5w{duS= zTQ@+KbjpJL2XWo_yAbe0145SRwv~02Tu_#o&6pg=rfAeUZ$vVbMUqgSHJ2R<{ z{AhK${YQIdyY-v)!HwmaW=uQG158@XbWCCb=FF;$sw}5;1jiPCoK>N^A=l%#OhZ!{ zC^yhtVVjA)(uL8O)rT)-8MaVx`=!mouxshU#c)zZO7oBELtC*owthEXV3pcjJXt`G zMStN3!tWvtb6IDJTTY8pWp8i@({lzs$!-CNXUcW8N_Ub7BrmVOrH;G zUN9erhu=OqF&v^bmk}2Mn!d%Y{JxHF46X+Z*7x3^*9aDKhc!o=B}bc4*u%)BTt+M-qV%B3 z)s)f~yx%9z?-n)D#fk;44h+GHo<6#-$9ML0N^Hkp8A^4+WD;Us5cW%3{M{%0(4{h2xVk#kuoHZce~^Qb z>*G@bP!un2E8e?N8+DkHY#=j^umL?INv(mv<&y5Zj-sZfDR0-I8XmgGXFNOVuN&@t z;ybz}Ht72X!f4}%Q=@M+lIoH0;gYk&U z_#IWi^D3qREC)0(X-bZe{G9%-!mcF7*;sq7ND0#*;1gec(N+F2unJXCbZum9bo~l; z!N&ylz5+XT_OA-RG;*}kpCnQh>KDE&T2!EO%|>|vctmT=DTl7prGrJbNy~1MVwquD z>ckb8_%YyRuue4$KR>{BohI1HCa~#M35W~y49X4VN!DTGoF+>um?dj?-iJRa|9QxT zjUw*FrD|+)hrm>+b`TH4*CEZFuCIDGDu<~*$3NH4>13;B?n{!-&bfwrHx?Eap|M`P z4S!u+ygS;{gRFL*N^YW4E4mZvECB8GPbDsIZ8T&;JNOoZ1vqu{f{@$9g9o8#N}}`iPbD`{KBJNsg|9 z+U`Nl7qynvsf$jVUr?g3VyS?4fly7S5jPHy8kt_0u3-b`0(07MoC}_4t?HOoVP5fw zL4Lw=U!sfVFPQZtxCe#Qm~D#b)9tot~bqUC)pE4gqv$K z)8`g|$J5hq4LlxJ!f&+)zZm;Oe{94|K8@J%5!o(C#e&UbS$Np4uF_Zka61qz`40VZ zVKa*|v*d9N?%c5PMOFxs0DS2FvnYc56kaUH#oa1}AkV9{|v8qGO@Ic{r zrW_#q%3i&hK-!9nL3V7{+dRg>&Qkv!d6T_YMclAspquO48yb=AyN#$4`n!G+yUi`T zSd7wc)GNQ(Y%or2Kcr|@fXjl5uO-L;!W6X@I;btibA#tcL~`htc*!Dwx|+g`n`s-< zJ~!c-&Mm3{cnXbEzgenqLhUi0gjXW zIhQc8^X%F~$E^GH0le-UYft+Hs$D8&>u62Glj}+Yd0+6;y|}v?CzxscdIF8IB-8Z5 z3y#IGLIZ7WG!Rw4rmf{k8d)A8%lz##%!}{{p?7WpikQBAg`M`DDn{vTObRxBdp}^` zsb3fE3Tcv!JhwUvSRJ;f@Vmx3wWcuD@*RXNR4C^ee~}W4J~!v!7^~B?=|{#QwhYXv zVo#4d8b3on!;q9Uyk>yq@c0gRA~jvnAUVX$30l1;SBWuhI@ZR!DST`YBe@0$+H+=o8qtr(xRc6KQe#U+6E^|arcu@la0^LYJ|?D{4kk+-<0iHXbWj{bF_*xIErTR*1&x2rg# zR8#-G{A5LB0Cb*M8%548p@v$-z1PMWGVCsRZ+%6IhjFhz`xYvC+_!qR_D$hO^2%EG zu&2wm(oH#5cx7l-_1WWLPtWoAhzDGl#x60;-;*8yn{0gee$y_Ma2Xu4wg0fC_!;?1 zMvvD&^>+O7O%mG?%=Y3`EvZ7TVC4wa2(o96;!0`3OS8eZ8RXuJJ@=jjLd<&bM1@i! zy(){}7}dGk_2e#ad(;a03vI7S>mw^gwhATEnU_D-2UK@jO!s{3Os1(%A(}Zb{G#ru zgMC0uez#hK{Mxwb>j3YO7b)Uz0Rh$_*atF{L*O2@4i=ASU(9bCp2jF?Xct~Ycr2on zy#{E6tq`9mbgR~SK-z95tv|MzUKti6B`aRh`<4#xY%KCmJlU9uIeC#;0`EY_8n@4X zLK-si;wS|iRdefP}stBJc&tffD^i73rQa`!Z%CfQCHa@iKs(yyw*pp#vp0 zt}$bi@z6!b-bJ3m$54eP!Xzmc>1;7MHIzg({90pbE>!49Fgl`C&)fC_8jJnA)*Kx2 zK$@gayeX)-IXK_m(L7Ou;YJuW_#LL*Da~YQpr09$PD^r6e*)hrwRiMq{Ui&zS3?SJ zT=v|mn7?E>$4$UIcYNB>jz41_;^#toau0?-D1FGHlRG*PG*jQNwi7k-%BW-@mL z4tXRk(HiE~&ATfS%!%=K#Q(M5psXRmX0qLt6;bEM4JK+oiJs2MV@CYP zcCAsgZ6QkzJ(%D&7>vx%uxI?k3C|_fAdkIQ)}x0f?_u;^yvneq4WVTQBelUslg52}vr6IlK!b+q*HE1}H1jRoq8l$k6o zD=%%>+scq(zPIDjZ!bB7HG4n`$8Pu!;yqK*8?9hrzIR3Q#~Bi@d_t8JbT)*{guTtY zNIO>iS*4G!zyXntU0d(2AZ4*jWnN|IF~-ciPah>mHpItM3;QHU%IcqdjKknn=wj-5 zLS_BQ_z^6W{c%wZlisltBnB@lD3okzpen4%>!WnIeG~r(LE>?2Y%m`C=bSDM?3c$z zWQ4pMPw*)S>f$8v3Aw7`10b)6666BNFfrdVvuzmJ`C+{0kIfQCVd3xW%-CjKzlGa9 zkcOQ%Zr$6?3j-xj^{T|?WN%5F9a6;e%F1zaCE=QLRqVtn z*tLU(%c}kIyYq>Z3>C%vaidIO$m!X}tW1xJLg;WBmh5^B1MRgrs~4)cNA$|)yT2jg z8OmTL!5^u$t0WWDb;+5e9l9(aF)4g@Cd?)Zp9%rC(^Ua+?-_-gFceLKB{m=m%f#8$mz^2Is!lcO!Uw zb5}j6%G`DCK`lPl7$LI#iM+&VMtU0{1Q>2EMTg*vBS$-PkDmnmL+bnjtxbLrX|18G zhF&nFofl{pa4&y0!~xhGe{NV|==(k-; zWI>q*A?9>*qt!q-$w_ENXj1wYxO&pFvl#+rA8J;Tf)8p_>nXtx8_V44ub`iQdN{i| zL}upQ8TMv@RVXYSP0n(^WoABMl)iN!TNsQqaV^o8J9K~Px2x12#w-Y<4SGV?cVXMu z=59&s%(e;%k4#&(e^as)y0zaBJAk74$U240AjyGY=|fzuZ#?s$#6kV+HBp@U!#sD&UHkzC`x|iWnPzCy41g(KixQEQx zQ}8K~63Z}_uG0Y~eh~`{#pk$)rPDTS*1U^X6O9KKa*-{P=96@SMkt{j%Oa_W?Om|L zHSyAfnb`3Oi;f9pyybN^zYI?CuLSmvXlZi!Qq}}5FRMPd9y_nrfZE9w$6F%8F8%7Z zz>yCek3%B$8V8O(bdp}O&{xdHJ8ygo>bu|+qH1|vVQ%;~@!<{`?dJG<7hLY05{9gT z@{1R0@S9jGI7*=L|K1M8LE+hf>i>JI8y^i14uW!ke@9jW`4Q38h&SSjh_L3z`B#MX z?#z>qWKs*{hI`_?1 zUXs}az*a0SEn4?T&Gt6Mnx?E`cF~F!m)xEc{-Gg!{js}SiKfsLuVB3!n(uB~BcpW2 ztk{z4_l_H(@0l@g#+xri<&cP(#l?%cDs_WlXjtMLNPwamA1VCKUzg93i)qC_)_hCi z754Q;i#0@2bJ5%_oKc7R#Gp*FB0Y2b$bJgBJJBL$fZ-XrN`;CAovV%`=c9bI-`Rgb zaHHaj@x@u(r;2@g`6RhZbsVMaGmXQ~%OIl=s&!{1;OOCCL~4d(me;f!vm-RMlKi98jgq#@O>=WJ3Q=~ z0Ax;KU1aqRo0X^ekaN#QruydAYW(6u*!`+X{@zRU!a_WQ;_~WNlIv7_0+YoEbl&t3 z3l82w-~CfWi2wSNlO!Xm`S(SXC#R8K-m-0N1TaV3Q;S@~qW6b4SClhsVFABXThuye zhy;+bV%T=QAO>3nN!D+1I}-Ex#edv*h}cE#>}}y?e%<0cEw8-_+1E8hc_mVo1skNA zdZlZeu>fQU)7r(NGLpl?P#?I$YQ_IWWjsM+)&?7H`JqplOwNGy(orMMP`53d{t6Hs<3ykw3k*N( zza>irFUqGTIEE_CxW$*?N2o_m;Y)ro%cs%)UPa4es`Obn>=6=;Gctu*2z^-}rDlwLN(;~Q8ff^c=C zaAPknrd|UTe7;e~F~rv4Dd_ZP9wSo;OIJILu?6TR=u zu+hW0xmst@y7xxwha4NtT5w?<{Tz^5Vp(_ohSyYCsU;O;uHK3%Q{CG&LBX8+fe+wc z0j=33E!x-*6}fL0ZDo9$5x0d9u2#2-w~7{pt=YND_OJBr+EY?_RhAZu*)=l zVyT2OS{FZeS?~?}&?ovvySmbA!X(R6MZ-ipCxLG*;hDLgRBQ^>L?K1T^!?ATQyWfR zx4|`!6J~~KO4A^Nr(CkIp_ylU)L=&66D5Eg%~D7v3@Gq*wB$l4nttAsu3@)!&Y`vK zYcJ~akST`|z$(wTBvf5+zHrBYyh4j>U*=yLIKj&doy6&7%H?k2nA6f3xE=}sM6XhxO znK=Gr4?J6XJq9j(=>o(B#hD0glDEn$7e6W_q_30cExdJ_eSPl;_UVzR z%o_bRhkD+^F=jDUX}Vhv61dg#AKU)2D|kJF)K08SGI0(&RaEg?P~;J?URLa!-jRv& z%b6JG^D)f(-ko^6OopQ~SxYSf5*M4=+2t4HBkw6n2a`*QT}-N?oNwXz3@NILK3Zqx z^LZj36VrRL^^AJO{Hr>Jh_;Ma%|u@C`M^D%pLAZR>f+Ugo1k?b$>*)Bpor+Bn$r`0 z!HV!u+082$BdZ9QO?J~tnoP`XBJf7|Hd~gE*7X?mnV<(aDMnytzA3*%eRJm#=i{h? zye;BszRmZE(dp!&tr%CwXe*u2)T73!yAu97XeuFh-c1PWm1tB5;q1vVf=Dqu5cAdB zs%V0e%}@7uqU*VLmy6yojKjxSg5@eq zvz93N24mAJCK+RMXKdxx zZ`SHLTau?0X?Q^_M+?TsT2pk-2KCQ4HjWV+9yIlY;SH2Fnlb>Q^>s2E`w#2dQF^KS zP3G@ldKfaU@QAeik1xrTpV{D{HJ#v~qfE!jE%BY&YQgjw=WN~d8COcwGh~-ac5YDX zUgU9q)heC11TP9pG+JqqWJjsAEGW*a0Wu_L9%0D=6@G;dbDkhq3 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 delta 27206 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 diff --git a/fig/fig_multiuser_corrected.pdf b/fig/fig_multiuser_corrected.pdf index bc3b7b6acff97cbd86dad4d9377a25e47fc087ad..0a2c03858917e3764551aca2e487b289b8ac52c9 100644 GIT binary patch delta 12811 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 delta 13406 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 LlvG4c6z2Z}zl`7~ delta 15379 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 Xo{1&lT}Kp#frA-_ghWJ66z2Z`ukRJS diff --git a/fig/fig_sic.pdf b/fig/fig_sic.pdf index 68c6f5240726119f154c1de21760fa5e4b416f15..fb929df08c450070921b866c81d029e6f2c76be8 100644 GIT binary patch delta 17880 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 bEqduOahPq|DO-nfzsT>sH;3?$KA z)G-z}N>u|lNOO@H0^dt@ zVGHQ{^#oe2?#V{0`nEyVXYfu?=-a=9;SY9__{MlVYEl#=BfNh8-8)JRJ;2OAJSUI$kvPoB@6x(Qt|z9^I}Lq;e` z){Hq$TiEZ$X&kHZ;J4s1&|9Mv)J+tO(wf^e(Pgy>1+6Y{ZsRGo(DLLgFRCqNdAp4b zC&w{-o0qEa9sVH9X&^q9IwdRBZI}UzW<;$_qKTFgDf2UDcE?{=PMuAASvt&KDL*c z7Uv}2_mi|sHZIBtjkeCt!VjnlVU+CqBL~smiJO=gFJaIXKj4+R1st3oH)LpzjTx6T zSsGP;a8e>!1Xq*DAwt?!*-=sJ;^YX!7#+(va+abhp!iw?@>>35<`Can;zi%fcg^33 zS%vlsiqk58Sej4$KElp1q63{7q`Nbhk_wo&a5)Shf?$C|BpIWvA4@VO?j$V6pma}W) z(SjT}k^kMs>wPY0#fK%;f8y@))XM8UXI0otmb)LdGDQFL<~@vR)2E0=Vx9W*sVA$W zSYHW*a<=3std^9))93v$#Po2^d)xZb;K@;cIK||PuHE3VJ}?P`Pd$#RJ-! z-2@AGx#Dp0Tl4#Yiy7j~2u@#>7_cA_M5~*aEv;R$eQq#ke*iVx{W>ZPFx1JMQj~Z z1w^4$+*B6wl^|PFy@Tb=l~>XTo?5p6;)e`M78f$Afl4nla3E$JZsO>+{7U@4rAc^d zY8iWLPKH}MAf<#`(Och@33EzQitLofX8ba#lQ&#rX~Oeq=_{&f$t%k%lC#rT-RHb? zv_IR^gid%NTe75bh4)!(Wiwwgj_d%bOy3Vm&iABS&c*P4R9bNtj23yOZKy?y#b+Ik zAW8eN_>%{I!M7%N{EekP1atkxJfVReE&oTHNT@;rPaGM=@7jirBDssV&SSc}Oox{C z$`Qs0StZ7sW?TjX0?q8Hm|$Z8v>he0IPu9M`{L3t?uHAlf)kBmpNf}1X!q41?O$%W zDb_KyX|Cxn37)#PO5c@HQ1E{eS6=wo?}*eU=*gBZ9c={rE zFyNJV)gS`k0UzKk;4H)FxW;gx8*qDMcyRkTp3J&Y{zlRKIy zz6d+=jfj;mBQmzrp1*O%V|fyzS*TKHCp-=izXrL+JTp4y6io3(kyvMfY>4gg>>0Md zj@NxYX09t&^Dbx^)HN-sW!%+B!{GT0q`-6_%QBka)xXka(dTO`S3r1l#n_KDMIA`N z4J1x4cs(EYb|fAz07)I_l)%ugS|SliX|^-L2D~+&vdF zZ@_n3bo-8*=Jm6o5qsFi*)}wCH2QEldBIbE0S^oEx$1?g$FKSTaTqsO=N3H$1i3+_ zY3QwY1ia6>E6ldn3VKI|FXlqwn81uz4|g+!m9WOQ)X>PYr>Lx@9=9b7rzdBq#?=eK z<;`3cv8RF&8ZhDp6=&42w!>}LfG#gSUMDUt()jwEt#BC2Ggj*eB1Ltu=l`6i{Jap^ zorZLY_7wL~638J2l@yv)Z-z7FKCQIe&f%TZbtwx~rSL@$vdwMuTX8aDOG2+H8hfeM z1tRP9BiFKI7Sq(L=p3D~vEL;598}M`*Uc8Wc}7n}i4|ksdn5>&_pX$e4^=$b78AfJ zoG;(Tzf_nZO!@?IH@vdlPgEt_gIb*zKSC(lAGEE#E~#=r)MmP1E#QtZh^G+7_q=EX zka%^;Nm|$nn3_ky%f1{hQUZzitGWZj3(|xnr=g1olsU3dOHg(d8Mh!H=FO={$XJ?~j}9Q>%V6ZZ^xcV(&4}y-u5|uBxy; zcTWNxLmX^3t95PBg`6B*)+sZ$+tz0|d(bA?_1&-v=y7L>_s~9~Uob9Xk)YqjJ9_rb z&Mi0~M{?O;t#qbZhIJFv6OU&I)~*A@YFW@>@i+xRJc1D9lqz4dSNQhiTjKsaMPZhz zoVT0Gd~*q#9vja$cEVPJ>Yy7-nHkvDfElQ5?5dV-kiCu+D zMQD~8G|N59F)P4EL(VwGFvY~IN>GM@(~RAWL$2n5?;80cDVFE>tAwRydj81noAx%% zQr3LzK)k4>|IQJ@&8;HiC`ruO<8t0Mcw`2K(s#Qbg_-HRUT3Q7p^KYB0pIizHtkAP zqB@%&%~AAzJntZ!WX;**_Zd&SxEw7{oMO{6f^b>i)|mdhF;aaMXmY>pi=0Q2fD-$@ z{pqbq?B@gp0r&SJTGe94-t6*a#!ltp217e}$Vo_*pn7m&hs>7#d2k^+$%) zjE_Qk7Q;MNfQ>BH^ws+ujWj29z0z&tP5Gi-rh`)r!yc&hr+h>=b0c+xGruWUy%4LZ z#x_6Fx~^e)m9T=PqNYOLn1)v38Ljpeo zs@(Lx@$)n|`Z&q!I)6iDSzTcC6wlOq*ojc+6pa)7zM^@h zy&UOJN9yluw2b?hD~<Szz0Ca~ni$J;$ZbO=67$9CEe2(3bktZ* zXngm5z89m*V|8Yb?HKV_<)d3=?ziKjv^z|I{z}AtWjZJq!Lv%a%N~#P40=y*{U+O4 z`H-2L`v4;SE({rcrgd(4ZK32Ce?8|RQ9a?lt8-kw$rW?oRLn<%_xJkzG;$J&KY~`? zZuPEzp+doC1sk3S@sA|b`ntu|888m*<-%xwxk>PKZ&ye^#7H2J0h+GACtnzxYzbd@ zNg@@IMeYjYmQqYhNTi;J6okxEFzy?_{JD!g&Ab#~3i8)vOqb8XQ2MK)hLX0>Tl;lu z^}@(hoz|6%UdUXCg~LPJB~3Fkrf=ujyfog(9laj7s`NCvgdc=Huvn5>Do!gMgtHVLcI-KEb%a7b-W8e=p?6kUH|Lzfv@d(3 zEoII+PFkvAm=*1*i6k^Wh!XC#q?@*4?#!fF_m8?&Rtz+3LX9^mL`^OJwDTE0Yu!a& z7q2@cB_*I@dasfS&@rbmvU*usu8k!W^dJPY=^p-35A-fLGJPsRxtEDpARM##IA^|A zzRiGj^v_k*##>(R&ojUIKy2-#IFdPKly?u-rp{FzD4@+%y{5$6xOUTGA2mKk#Pfy8 zelH8<@uQ>wN-ef^ZD(h#9gVE>E6T4cRs19rFoUk0a@25j5R5G0t9Vc6q!|vBWfnbL zuE7dbSirz&vTdJ(fn0^&wS17mL&^Pk*A==0Qpd8dH>DZ0P0Y; z9z&e;*x5{4kcl+jgNSlY#}tctD(RbaD${to%~n~@JRBjAAR-~; zemQj(Ou1>SS=1~k+R$@G){bL-b)k46kztF+JHShn1=aK_8m8ORCLN49$MYPtBsy9D z>Y%r4Y1VDh-TZuCl9-mHjc-H1Ku|$oLvSYNIH6qkR{Ioof%Pu)dZ$c15i%GEKl877wsHKo8H)ynowWR(e|Rv+TMsYA?L^g_z-`8ab9tP7>DP7< zLy}o$BwdXeT;IpVPcs{9TuaEzIF|kTNB;hy2*i74eQ9-Rc^O9jMM;L{u++Wpz=)yiAPn?cZt;Qj;uA# zY)Il?4X$_ueCo8=zjYFmMBK%!uVYsDBpX%m({#?&P--ua&?LMeUlZxu?(8lJa!})L z&Op0Wgen=IVu!t6esGaS2Y#t-#8mjXNjNF76+}z>^oa?JQ~CThbS>2%o8DrPCK+hc z;)3s-RHiyJ5rNA#R7udw5nQCQ={k7YO6Emb;oNr` zFa&nIX37&~qv~08dftNZ)iMRuo{k~C8jkvAC-Z`Z=|gTCbpzU_%cUBh*QkuuV)LjD zU!sB1?~xxWUa$A3=jWi*;J4B+?-P4fH6JQbu{UBJM3yU6pbRPlr2kwtpvImR6oxcP z+#zq^B>aaH!7|7uPJ<5pX@$vs*afNdGqmiy4qBt>%Bc{Cf*t{qrTnh>Ha5<=%*eNw z%x?|=r|yPy@I#6*(&;94fHXQfKnwzJiwWPBwa4I9Cv&0if0%c8{SpOABzw~j`IcJk zdz!G}PTc@QY&D!RWLC^YrNFxmnxUfPm@l*-f+H~wCxsA1L|m**Go0QtOa5?kx>Z?H zNS!$oYB+c2OyOFWw{x<&?jt9i;N(pi`E4)<%2>N|nfm#1AVkIG(-Qf0%vN>=eOA}< zqCTH}l75~3oxYELx4d7gQtLuXh9Ywaoy1w-z?c4*MZwvqu55WdeeR40l>B4Lb;^hN zIGai^rh)e~+_(&$L|>*qwT0|z9T!PbqfM5#^)M1hfPS&Zp$+>DS761lOrFF1932Q zY+adMKThU;Kbjou*;X!JgG4zCjy@xWbjg!$umt}f!N?}YaS2%2{>BfQV@5x;M3%qE z^u^$ixnn8$d+>=CD;TGwg4xbQN! z_p!NUqW%N*8Bt5w;P>~&3df3VBTCZMsYkGIN>@wK82A9q7{)p$MK| z|1d9&7Ia6Q$Xu^J0M)$PXipAL9V<@!D*I;WdZ}{QnErv)3QfIMfn8g+%zhN?U_iMt z1RTL!jCSl5lwmz~jcA@EPxUHn{b8^MzSpl z92D*1rO8mi^NRqbp{1fG{B}Q|tJi-J(kKrT2}lqjXRSSVf(j2u9}{WnnaR+trrJW5 z5ZFhzmk{tl0cXL1$pfgmcrQc?ORaV z{crdHEQM_@i| zhYYdn(DccWHKhor@YV5lBIBC4_O!N6Q=voeID(WP0UQjSjB7@G~a z>HVO#0!o?&OBXLjbBIT`MKs~}QGe=AiLk_r!5(xYYJxK+!z3`nVE1?<%|JQVUxV}% zp~AbN8mb`=dclhWJhlRWbKRoJc^$8Zj)j(8%1~I$;8xktrG`Nd`TDC`(nB{Qj8CM0 zy*AfB!Up}d5vpb$tUj#A7VrEn8VdMy$zF9X*W%K^OJbmpW8jvzetm4s`q}~!0|A(Q z)VN5-2J{iZZHDOIf@mC2zWwqtga*CA%5M2mOCa`!NI*J<94671-aH3CM(g`bmkD_i zp>`ZdRY54QT7zeGlDoy zB_vhsVUhSQhbg>VeWex5*}+kJqr)Omxt>mB*|XrX!wZZqe!7x<3kb{N+6H|mW{vr- zeN77S@eAcIe@NEXZW!;UW%GbNEi567ej!`V-&uuQ?_;heAovX~u*-z&*_I!ZFOaoT z147FTaasMl>#Q3Mv*KI-b8z>s0oe-?B#`Q{3Ng*bcOwOQsX~<5ULH-|-BaXk%uSbH1EhuILH_<#YrC-uFwl zov)?>C(2+NXXckQ)%NRa<=Sh^jpiU9Z!vg}c1$5+1FmufAc6ALiz~cVmfvC)ViR=l z881}TdreX~(hiB&b)MUsG@Gwx^de-SNo1G?Q_RSTX1i5EX!*@{0ww58F;AShc1seD zi+vXhUca($EU|UC)~?+}MyPh~SJGWyIL@$%BY368bs%kJ8AmKH)*`;6tzU&!C=LUm zB(~b_ufD4QD+n#%E|m3>6+|U+b&f&I&sImZeH!J0ozdrl{2RJ!KUVbDsq)w1CKW$P(Plcr zZ5uf%MSAQGSys}^;9yl5< z*3{*n5e+N59!6uuv+N-YIvs(Wta?9O%5G87a?bZ%u=#6d=$b0 zO#o3YGT}ZKuSo?RYDa+`sJVspMU$nLoY{wL_h`VWZq-_S7VPk;@`!|{oNk%7jB zkOLF};?r@k*k|xdSZD8lg(mykv8J)=QpY>QCfGk>r6URx8>7TE6#fQtF|)IB_F!5r zv9+Y|U?(O_!k`glwJm{406so{N5Vt_$4$-Do0w%@qXdY<#~cQ zVOUecmtD!nrOdK}l9^hnAAH(B_@%WHz_&|6bnQ|s!jh2uSlH1 z0Lnm)L7^wn9Nge(GfqVlX6lJaGq&lJx`_L-;_pUyu6Y0!W(uX%8){;VAn_H>7=4hO zAddNfG`^Yz&X_o0e2{$McdBWj0N|_4QanBdR3T3LtZ2zpnK2Pwgwa3AFSI(?-fx&3mO~>b%a$nnpWB9onU(#&;ghWYIP%XX*8#Gz0zbc4xPf{=c8-5U zHtzp4xq&)y7g9uUoNSz*qnsS@aj4Q?z<_aV(iC9uaaz*kpR%tsHnQI5^lYE1ob1e> z9B5poG@a^ai=B%b$icz}WM^jm9AW>QfrXXj(;x>Y2ax0Ql{RP%9AoyYpy;eN5aZqw;jM{py8t}opPC&Q`b1_y=sgpLjlNs6BD zk3JDQv3OuDBT8<>OkE-@E?AGIX#JLKNl;$7uwp@ofNe_`m(m!vMdIpGs=_zR%G=-q z>2uuPL@J)KAhhay*!jwLm>KOg+43kT4L~Os7A~Q$() z5DFL99wf5z`*=Xc=mQj;RE`VhmAE{k!DpxdjP}JeH=OU+s^~xvqJgtmu+Yytg-Nh{ z@M7DeQ#IsQc^~L0M`6!unz^;>q#lJy@bV!7yNAc020?gRjsTX4^LIHOuhS-gH+D=p zL*$3>xEH9(6{2txLUV0q=14&?x6f}G9N1Qn=dSVQJms;TRo7A0gJJ;7e0pun`_?9! z>+j>|K?Eq6-JIrroG`*Lu!G4jRMb$olshs03r=qjp^157hj@O*r3al$57>kk&|nFP zfeb)|tMvz?a<#?%;&swZz5}GX{$jhIR|}g$mgGEK@}Dv>XlT~v|+rYA|V^C zghR2W2bs~b7W$mtoZ|OxeYs9Fz*`C_!o9wU_~9Yh-i{2iN4PP|)h`M;e|^H8rw;Xh zR%li1BtYc>WJOaS|KQZyEl9NVM(9k)=N7(rbrZ0OJUZD$%-r9lyQ!#q3Od!)2iFxS z&jO9$&FX3zW-PM+LsgGqaScea0QnKa(l}G(RDjwMaT_BoPS!$_Bx}`mRWv_OEDb{^ zEBWL67O|Jx2#pMj)*`%=`9EM|1BmW4; z^gf<;D7;hDe&n@qrQs*oHl$}f!)XGOcFb?mLRfu zl{nS#^_T({?MPq{D&~Ez{vK|{+R}Ful-hOzfyIY#8IQDf;XP^NCA0qIe(J&MbgJo} z2%3=yG57bg-&tfm4^*BI7g85fjmYCX0BJyDuIK!?LYFyXKTgt+`xr;q(*lGeu=F3( z{Q)L$P+<)8Z3~dSCld{$_Dv?O2%yeETFyFjNmuU1?|50MrIlFD9$%AZd-rO8{-Qe# z{LB9A->TEeI0vsuVV-{w;3{nf0nEjxG3R#*GIBRQ2-es!gUMkRA3 z)ab4x%qwRsqoX>Tn#$`sH-J4k!wyEKgePi1Nf*`jfxgj4{U+zJk4g5=3W#xegYlU; z;Or}o=)|~!LL}O#2Sb8N;ln)-^xB;!pN;&je^JnYYI zJN$V2RZ9{-KSofN#yN6BF9{l*XFS1YC-u4h#w<;+8k7lQ;n|-kz2}P}UUDaDJg!@` zYir-{hmZ=IwF_r@raCyDq`wLla3s+s5bAo`XI+&Td-c19o?H`j4o*Z~n*HpQ7yJWQu1lqADmhi zg6)!xwC7Y9V_y=^udAFVI=97&yEMb8IpW>FS8_&q8?4f?6MTF+8VMf!yEoY{ANK5? zeIiv^69`fi>zRUwU(B&|u??5+S<$agGGVxfheeIe% zl8E%pnV#hE)XzKYO?X?wg4dX-!xvx^7MeXe=H}(V?kh@X#}*U1pHTq6+eP#o{i+~{ zwnfF^`9(N7y8n8Y5r5ruUkOJ*T|%gKI`7xr@CTx=cwVr=%G0(BuVo&_(C*XE@Tkk$ zn`>^~%CKO`ohJ|}l>j@nIn^A!XmuN!+}G|$mebAGAP&Jh|N zNn}CZF8UnDPDnyjI(Bdy^wSmOdKXvfWz+0?DR(_rDhfm1YY^3wU}O-=!u1s-5=vMg zjIMWe6mscK_XncjR_^=biU$b#oFt34LO#^%oV|XsPYeXMa+u?FFttwhIRi8V81dXu zr5nL!f~Xht&X4FM=$)fK>(|~zfo?;yL}YXJMSAM39SYm4Rf?N`*e_Hp%<=CVSDU#4 zJ=sqdETpIt-7PS~3Swwmp^NK`q1+plhTyI2!?)cC8c@O-ajjG&m{GU3u&iuTw$vlF zQ%{>s13=o)63%hqX{W_nSaOV3h>*?K@KE4$G199XH`b~k9nwW>7ah{|Ql$*Z)zYI^ zhp;!EW1E0 z)94f{>1-2!~IbEBOH&0<}5(!`J>X!>{!m_%&LtdBh?aXu*P~*VnB@+|*D{WY^HX$EB zKys!T6PK5K|L-RH$0EX0RXp+=!IJxA*8h%b+5QP)?Tz9RFuvlj{XZ$vKN%7$+rRS? z#Tq*ZQpELV_~;Q-5mpmX>3LH_3xfO9l9O(K9@2Zno#yS2&Va8f4S}`-uL7sb?Xx&? zIe@MM3orUDh?WRv-C7A;2gLp;DuY&5r~%1!O}*clvoX($k+3Ou3bV4HcI{`k-Cw5Mz$WjIrTwbqZM>rTp_ zDt$u}v60A!CiG@vWUMqlQQ`9+H|T=)J|-?pd;S*K?~B1Z3N9*UslE1ry27(}LKoEl< zSlEbgh^YiKGy9kAY!oHGXrY3QMN;O^6m}uM$z2v zR(Idd?#wsyaWDr{l4OviNitiR9cJ`1A(kkYRJMxLcvWvBcmSm1@h82Dk>op%pfR3M zh6mhYZDU?2LRYM9rb2NP zSvx|*omYri8^uh7Tpz#wd5|!yhYSWJDjDYiVrj&*6>Q+=JoEFN|`gM@SJzZeJYRwwa__?dgW7@YS9m;Gid O&k0g0UnuO>_wwI=C$~rd delta 15326 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