diff --git a/README.md b/README.md index 817300b..a00bf0d 100755 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ Each study script is self-contained and writes its JSON into inequality in the manuscript with standalone numpy code (no experiment code reused): the relevance identity, the mutual-information correlation, the subspace ceiling, the LMMSE receiver against an empirical Wiener solution -(0.1% MSE agreement; the blind form matches the OFDMA cosine to machine +(0.1% MSE agreement; the blind form matches the OMA cosine to machine precision), and the surrogate bound used in the appendix (uniform constant 0.97). Results: `experiments/verification/math_verify.json`. diff --git a/docs/EXPERIMENTS.md b/docs/EXPERIMENTS.md index b03e25d..a4529d7 100755 --- a/docs/EXPERIMENTS.md +++ b/docs/EXPERIMENTS.md @@ -36,7 +36,7 @@ evaluation uses 150-200 Monte Carlo batches of 64 per point. channel gains, the manuscript's Proposition on optimal linear receivers), and `tdma_proj` (random orthonormal 16-dim projection per user — an arbitrary orthogonal partition). -- **Key results.** lmmse_blind = OFDMA at every SNR in all scenarios +- **Key results.** lmmse_blind = OMA at every SNR in all scenarios (SER 0.509 vs 0.508 @10 dB HIGH), and tdma_proj and SFDMA coincide with them — the ceiling binds every correlation-blind receiver. HIGH @20 dB: blind 0.327 -> UWCA 0.110 -> genie 0.044, so UWCA recovers 77% of the @@ -95,16 +95,16 @@ evaluation uses 150-200 Monte Carlo batches of 64 per point. - **Setup.** Per-user integer offsets delta_u ~ U{0..Delta} symbols, Delta in {0,1,2,4,8}, shift each user's transmitted block within the frame (edge energy lost). Conditions: uncorrected reception (UWCA and - OFDMA), block-wise realignment using pilot-estimated offsets (each + OMA), block-wise realignment using pilot-estimated offsets (each user's block region shifted back individually), and realignment with a deliberately impaired estimator (+-1 symbol on 20% of users). - **Key results.** Uncorrected offsets are catastrophic for *every* - embedding-level scheme (one symbol: UWCA 0.26 -> 0.73, OFDMA 0.51 -> + embedding-level scheme (one symbol: UWCA 0.26 -> 0.73, OMA 0.51 -> 0.76), because i.i.d. embedding coordinates fully decorrelate under a one-symbol misalignment — synchronization is a shared physical-layer prerequisite, not a property of the multiple-access mechanism. With realignment the degradation is gradual (0.266 -> 0.304 @Delta=1, 0.455 - @Delta=8) and realigned UWCA stays below realigned OFDMA (0.536-0.638) + @Delta=8) and realigned UWCA stays below realigned OMA (0.536-0.638) at every offset. The impaired estimator costs 0.14 SER: whole-symbol residuals sacrifice the affected block, so timing must be held to sub-symbol accuracy (which the closed-loop timing advance provides). @@ -119,10 +119,10 @@ evaluation uses 150-200 Monte Carlo batches of 64 per point. two-layer tanh view networks g_u per user (seed 7): users share the scene s only through independent nonlinear transformations. Cases: shared scene vs independent scenes (control). Schemes: trained UWCA, - OFDMA, NOMA-SIC, and the scalar-parameterized genie LMMSE fed the + OMA, NOMA-SIC, and the scalar-parameterized genie LMMSE fed the *measured* mean pairwise cosine. - **Key results.** The linear correlation is destroyed (mean cosine - 0.006), so the genie LMMSE collapses onto the ceiling (0.515 vs OFDMA + 0.006), so the genie LMMSE collapses onto the ceiling (0.515 vs OMA 0.518 @10 dB) — no scalar or linear receiver can represent the shared structure. UWCA still attains 0.363 @10 dB / 0.220 @20 dB. The independent-scene control (UWCA 0.441) isolates the manifold-prior @@ -138,11 +138,11 @@ evaluation uses 150-200 Monte Carlo batches of 64 per point. - **Setup.** E1's trained HIGH decoder; per-sample Pearson correlation across the 64 dimensions, averaged over user pairs and 100x64 samples per SNR, for: input embeddings, decoded embeddings, and decoding - residuals r_u = e_hat_u - e_u; OFDMA decoded correlation as reference. + residuals r_u = e_hat_u - e_u; OMA decoded correlation as reference. - **Key results.** The decoded-embedding correlation rises with SNR from 0.31 toward the 0.39 input level (the shared content is delivered, not stripped), while the residual correlation falls 0.23 -> 0.14 (2.8x below - the input level) — the emergent residual orthogonality. OFDMA's decoded + the input level) — the emergent residual orthogonality. OMA's decoded correlation is 0.00 at every SNR: orthogonal access erases the inter-user semantic structure from the delivered embeddings. - **Artifacts.** `experiments/e6_residual_orth.py` -> diff --git a/experiments/make_figures.py b/experiments/make_figures.py index 9e23204..4626c68 100755 --- a/experiments/make_figures.py +++ b/experiments/make_figures.py @@ -61,11 +61,11 @@ axs = [f.add_axes([0.115, AXB, 0.365, AXH]), f.add_axes([0.615, AXB, 0.365, AXH])] for ax, sc, ttl in zip(axs, ["HIGH", "MIX"], ["(a) HIGH", "(b) MIX"]): v = d["scenarios"][sc] - ax.semilogy(snr, v["ofdma"]["ser"], "s--", color=C["ofdma"], label="OFDMA") + ax.semilogy(snr, v["ofdma"]["ser"], "s--", color=C["ofdma"], label="OMA") ax.semilogy(snr, v["lmmse_blind"]["ser"], "v-", color=C["blind"], markevery=(1, 2), label="LMMSE-blind") ax.semilogy(snr, v["noma"]["ser"], "^-.", color=C["noma"], label="NOMA-SIC") - ax.semilogy(snr, v["uwca"]["ser"], "o-", color=C["uwca"], label="UWCA (prop.)") + ax.semilogy(snr, v["uwca"]["ser"], "o-", color=C["uwca"], label="UWCA (proposed)") ax.semilogy(snr, v["lmmse_genie"]["ser"], "d:", color=C["genie"], label="LMMSE-genie") ax.set_xlabel("SNR (dB)") @@ -86,7 +86,7 @@ ax.plot(snr, d["uwca"]["rho_decoded"], "o-", color=C["uwca"], ax.plot(snr, d["uwca"]["rho_residual"], "s-", color=C["extra"], label=r"UWCA residual $\rho(\mathbf{r}_u,\mathbf{r}_v)$") ax.plot(snr, d["ofdma"]["rho_decoded"], "^:", color=C["ofdma"], - label=r"OFDMA decoded") + label=r"OMA decoded") ax.set_xlabel("SNR (dB)") ax.set_ylabel("Pearson correlation") ax.set_xlim(0, 20) @@ -122,11 +122,11 @@ cur = d["curves"] ax.plot(dm, [a[0] for a in cur["uwca_uncorrected"]["10.0"]], "o--", color=C["uwca"], alpha=0.5, label="UWCA, uncorrected") ax.plot(dm, [a[0] for a in cur["ofdma_uncorrected"]["10.0"]], "s--", - color=C["ofdma"], alpha=0.5, label="OFDMA, uncorrected") + color=C["ofdma"], alpha=0.5, label="OMA, uncorrected") ax.plot(dm, [a[0] for a in cur["uwca_corrected"]["10.0"]], "o-", color=C["uwca"], label="UWCA, realigned") ax.plot(dm, [a[0] for a in cur["ofdma_corrected"]["10.0"]], "s-", - color=C["ofdma"], label="OFDMA, realigned") + color=C["ofdma"], label="OMA, realigned") ax.plot(dm, [a[0] for a in cur["uwca_corrected_err20"]["10.0"]], "^-.", color=C["extra"], label="UWCA, realigned (20% est. err.)") ax.set_xlabel(r"maximum timing offset $\Delta$ (symbols)") diff --git a/fig/fig0_overview2.pdf b/fig/fig0_overview2.pdf index efc15e9..c6b5333 100755 Binary files a/fig/fig0_overview2.pdf and b/fig/fig0_overview2.pdf differ diff --git a/fig/fig0_overview2_tikz.tex b/fig/fig0_overview2_tikz.tex new file mode 100755 index 0000000..d5bb6b4 --- /dev/null +++ b/fig/fig0_overview2_tikz.tex @@ -0,0 +1,91 @@ +\documentclass[tikz,border=4pt]{standalone} +\usepackage{amsmath,amssymb,bm} +\usetikzlibrary{positioning,shapes.geometric,decorations.pathreplacing,calc,fit,backgrounds} +\begin{document} +\begin{tikzpicture}[ + font=\small, + box/.style={draw,rounded corners=1pt,minimum width=7.5mm,minimum height=5.5mm,inner sep=1.5pt}, + enc/.style={box,fill=yellow!35}, + chan/.style={draw,diamond,aspect=1.4,fill=gray!25,inner sep=0.8pt}, + rxb/.style={box}, + mult/.style={draw,circle,inner sep=0.4pt,minimum size=4mm}, + sum/.style={draw,rounded corners=2.5mm,fill=cyan!20,minimum width=12mm,minimum height=26mm}, + dec/.style={draw,rounded corners=2pt,minimum width=47mm,minimum height=6mm,inner sep=2pt}, + lbl/.style={font=\small\bfseries,align=center}, + arr/.style={-stealth,semithick}] + +% ---------------- left panel: transmitters / channel ---------------- +\foreach \i/\yy in {1/1.7, 2/0.45}{ + \node[box] (x\i) at (0,\yy) {$\mathbf{x}_{\i}$}; + \node[enc,right=4.5mm of x\i] (f\i) {$f_\phi$}; + \node[mult,right=5.5mm of f\i] (o\i) {$\odot$}; + \node[chan,right=5mm of o\i] (h\i) {$\tilde h_{\i}$}; + \node[rxb,right=5mm of h\i] (y\i) {$\mathbf{y}_{\i}$}; + \draw[arr] (x\i) -- (f\i); + \draw[arr] (f\i) -- node[above,font=\footnotesize]{$\mathbf{e}_{\i}$} (o\i); + \draw[arr] (o\i) -- (h\i); + \draw[arr] (h\i) -- (y\i); + \node[below=1.8mm of o\i,font=\footnotesize] (m\i) {$\mathbf{m}_{\i}$}; + \draw[arr] (m\i) -- (o\i); +} +\node[box] (xU) at (0,-1.2) {$\mathbf{x}_{U}$}; +\node[enc,right=4.5mm of xU] (fU) {$f_\phi$}; +\node[mult,right=5.5mm of fU] (oU) {$\odot$}; +\node[chan,right=5mm of oU] (hU) {$\tilde h_{U}$}; +\node[rxb,right=5mm of hU] (yU) {$\mathbf{y}_{U}$}; +\draw[arr] (xU) -- (fU); +\draw[arr] (fU) -- node[above,font=\footnotesize]{$\mathbf{e}_{U}$} (oU); +\draw[arr] (oU) -- (hU); +\draw[arr] (hU) -- (yU); +\node[below=1.8mm of oU,font=\footnotesize] (mU) {$\mathbf{m}_{U}$}; +\draw[arr] (mU) -- (oU); +\foreach \c in {x,f,o,h,y}{\node at ($(\c 2)!0.5!(\c U)$) {$\vdots$};} + +% superposition +\node[sum,right=9mm of y2.east,yshift=-3.5mm] (sig) + {$\displaystyle\sum_{v=1}^{U}$}; +\draw[arr] (y1.east) -- (y1.east -| sig.west); +\draw[arr] (y2.east) -- (y2.east -| sig.west); +\draw[arr] (yU.east) -- (yU.east -| sig.west); + +% bottom labels +\node[lbl,below=5.5mm of fU] {Transmitters\\(shared $f_\phi$)}; +\node[lbl,below=5.5mm of hU] {Rayleigh\\Channel}; +\node[lbl] at ([yshift=-4.5mm]sig.south) {Received Signal\\(Superposition $\tilde{\mathbf{y}}$)}; + +% ---------------- right panel: UWCA decoder ---------------- +\node[dec,fill=violet!15,right=15mm of sig.east,yshift=19mm] (mask) + {Soft Masks $\{\tilde{\mathbf{m}}_i\}_{i=1}^{U}$}; +\node[dec,fill=blue!12,below=2.2mm of mask,align=center] (proj) + {K/V Projection $(\mathbf{W}_K,\mathbf{W}_V)$\\[-1pt] Queries $\{\mathbf{q}_u\}$}; +\node[dec,fill=orange!30,below=2.2mm of proj,minimum height=9mm,align=center] (attn) + {Scaled Dot-Product Attention\\[-1pt] + {\footnotesize $\alpha_{u,i}=\mathrm{softmax}\big(\eta\,\mathbf{q}_u^{\top}\mathbf{k}_i/\sqrt{d_k}\big)$}}; +\node[mult,below=2.2mm of attn] (plus) {$\oplus$}; +\node[dec,fill=green!20,below=2.2mm of plus] (norm) {$\ell_2$-Normalize}; +\node[dec,fill=green!30,below=2.2mm of norm] (out) + {$\hat{\mathbf{e}}_1,\ \hat{\mathbf{e}}_2,\ \ldots,\ \hat{\mathbf{e}}_U$}; +\draw[arr] (mask) -- (proj); +\draw[arr] (proj) -- (attn); +\draw[arr] (attn) -- (plus); +\draw[arr] (plus) -- (norm); +\draw[arr] (norm) -- (out); +\draw[arr] (sig.east) -- node[above,font=\footnotesize]{$\tilde{\mathbf{y}}$} ++(6mm,0) |- (mask.west); +\draw[arr,dashed,blue] (mask.east) -- ++(4mm,0) |- (plus.east) + node[pos=0.25,right,font=\footnotesize,align=left]{skip:\\$\tilde{\mathbf{y}}\odot\tilde{\mathbf{m}}_u$}; + +% decoder panel frame +\begin{scope}[on background layer] +\node[draw=blue!60,dashed,rounded corners=2mm,fill=blue!5,fit=(mask)(out)(attn), + inner xsep=10mm,inner ysep=2.5mm] (panel) {}; +\end{scope} +\node[anchor=south,font=\small\bfseries\color{blue!60!black},inner sep=1.5pt] at (panel.north) + {UWCA Decoder (per-user, shared weights $\theta$)}; + +% MAML brace +\draw[decorate,decoration={brace,mirror,amplitude=2mm},blue!60!black,thick] + ([yshift=-1.2mm]panel.south west) -- ([yshift=-1.2mm]panel.south east) + node[midway,below=2mm,font=\small\color{blue!60!black}] + {MAML meta-training over SNR tasks $\{\mathcal{T}_k\}_{k=1}^{K}$}; +\end{tikzpicture} +\end{document} diff --git a/fig/fig_async.pdf b/fig/fig_async.pdf index 4f93c5a..9f57ab0 100755 Binary files a/fig/fig_async.pdf and b/fig/fig_async.pdf differ diff --git a/fig/fig_dynusers.pdf b/fig/fig_dynusers.pdf index 740d194..5457fe6 100755 Binary files a/fig/fig_dynusers.pdf and b/fig/fig_dynusers.pdf differ diff --git a/fig/fig_fair.pdf b/fig/fig_fair.pdf index 8075f99..5ed4721 100755 Binary files a/fig/fig_fair.pdf and b/fig/fig_fair.pdf differ diff --git a/fig/fig_realdata_c.pdf b/fig/fig_realdata_c.pdf index f7e25df..243ff3a 100755 Binary files a/fig/fig_realdata_c.pdf and b/fig/fig_realdata_c.pdf differ diff --git a/fig/fig_resorth.pdf b/fig/fig_resorth.pdf index 77c38cd..793573d 100755 Binary files a/fig/fig_resorth.pdf and b/fig/fig_resorth.pdf differ diff --git a/fig/fig_ser_all.pdf b/fig/fig_ser_all.pdf index 970f85d..4270c5c 100755 Binary files a/fig/fig_ser_all.pdf and b/fig/fig_ser_all.pdf differ diff --git a/simulation/realdata_plot.py b/simulation/realdata_plot.py index bf3c096..7046096 100755 --- a/simulation/realdata_plot.py +++ b/simulation/realdata_plot.py @@ -2,7 +2,7 @@ for HIGH/LOW/MIX, parallel to the synthetic Fig. 2. Curves per panel: - - OFDMA [division], SFDMA [feature div.], NOMA-SIC (analytical baselines) + - OMA, SFDMA, NOMA-SIC (analytical baselines) - UWCA (analytical) : oracle-beta cross-attention (relevance SUPPLIED) -- dotted - UWCA w/o MAML : decoder TRAINED on real digits, no meta-learning (from realdata_train.json) - UWCA w/ MAML : decoder TRAINED on real digits with MAML (proposed) -- hollow circles @@ -104,8 +104,8 @@ fig, ax = plt.subplots(1, 3, figsize=(11, 3.4)) betas = {s: emp_beta(SCEN[s])[~np.eye(U, dtype=bool)].mean() for s in SCEN} for j, s in enumerate(['HIGH', 'LOW', 'MIX']): a = ax[j] - a.plot(SNR, ana[s]['OFDMA'], 's--', color=COL['OFDMA'], lw=2, ms=5, label='OFDMA [division]') - a.plot(SNR, ana[s]['SFDMA'], 'v:', color=COL['SFDMA'], lw=2, ms=5, mfc='none', label='SFDMA [feature div.]') + a.plot(SNR, ana[s]['OFDMA'], 's--', color=COL['OFDMA'], lw=2, ms=5, label='OMA') + a.plot(SNR, ana[s]['SFDMA'], 'v:', color=COL['SFDMA'], lw=2, ms=5, mfc='none', label='SFDMA') a.plot(SNR, ana[s]['NOMA-SIC'], '^-.', color=COL['NOMA-SIC'], lw=2, ms=5, label='NOMA-SIC') a.plot(SNR, ana[s]['UWCA (analytical)'], ':', color=COL['UWCA (analytical)'], lw=2.4, label='UWCA (analytical)') a.plot(SNR, trained[s]['UWCA w/ MAML'], 'o-', color=COL['UWCA w/ MAML'], lw=1.6, ms=6, mfc='none', mew=1.6, label='UWCA (trained)')