commit 0229c026dc760a5dc630f1a3dbc5184fe2f99626 Author: Ki-Ho Lee Date: Mon Jul 27 13:44:54 2026 +0900 Simulation code and data for the TMC submission diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b908d4c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +__pycache__/ +*.pyc +.DS_Store diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..13eb3fa --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Ki-Ho Lee + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..cf61623 --- /dev/null +++ b/README.md @@ -0,0 +1,61 @@ +# Structured Shared–Private Embedding Multiplexing + +Simulation code and data for the manuscript + +> K.-H. Lee, H.-H. Choi, and J.-R. Lee, "Structured Shared–Private +> Embedding Multiplexing for Semantic Multiple Access in Dynamic Mobile +> Networks," submitted to *IEEE Transactions on Mobile Computing*, 2026. + +Builds on the published shared-embedding multiple-access framework +(Lee, Choi, Lee, *IEEE JSAC*, vol. 44, 2026, doi 10.1109/JSAC.2025.3643816). + +## Layout + +- `code/semantic_mac.py` — core library (content model, matched-filter + front end, SR/SC/LMMSE/DR receivers, spectral structure recovery, + mobility model, affinity tracker) +- `code/exp1_theory.py` — E1: receiver theory validation (affinity and + SNR sweeps, closed-form overlays) → `data/e1_*.csv` +- `code/exp2_structure.py` — E2: embedding-structure optimization on + real BERT embeddings (spectral recovery, learned adapter, held-out + evaluation ladder) → `data/e2_*.csv`, `data/e2_exponents.txt` +- `code/exp3_mobility.py` — E3: time-varying affinity tracking under + mobility (scene traversal and speed sweep) → `data/e3_*.csv` +- `code/exp4_mismatch.py` — E4: robustness to affinity estimation + error → `data/e4_mismatch.csv` +- `code/exp5_learned.py` — E5: comparison with a trained user-wise + attention receiver → `data/e5_learned.csv`, `data/e5_train_log.csv` +- `code/check_mask_realization.py` — realized Haar-mask front end vs + the expected cross-Gram model → `data/e_mask_check.csv` +- `code/replot_all.py` — the single canonical figure generator; reads + only `data/*.csv` and writes every paper figure with a uniform + canvas geometry +- `code/lmmse_verify.py` — early derivation-check prototype for the + affinity-aware LMMSE proposition (predecessor of E1) +- `data/bert_agnews_8000.pt` — frozen `bert-base-uncased` mean-pooled + embeddings of 8,000 AG News sentences (768-dim), the real-content + pool used by E2 + +## Reproduction + +Requirements: Python 3.10+, `numpy`, `torch` (CPU is sufficient), +`matplotlib`. + +```bash +cd code +python exp1_theory.py # E1 (minutes) +python exp2_structure.py # E2 (about an hour on CPU) +python exp3_mobility.py # E3 (about an hour on CPU) +python exp4_mismatch.py # E4 (minutes) +python exp5_learned.py # E5 (minutes) +python replot_all.py # regenerate every figure from data/*.csv +``` + +Every experiment fixes its random seeds, experiment scripts write CSVs +only, and `replot_all.py` is the only script that produces figures, so +each figure in the paper is regenerable from the shipped CSVs without +rerunning the experiments. + +## License + +MIT — see `LICENSE`. diff --git a/code/check_mask_realization.py b/code/check_mask_realization.py new file mode 100644 index 0000000..7ad86e4 --- /dev/null +++ b/code/check_mask_realization.py @@ -0,0 +1,110 @@ +"""Mask-realization check: the paper's experiments generate the +matched-filter outputs from the EXPECTED cross-Gram model +(semantic_mac.matched_filter). This script draws actual Haar-mixture +masks, passes the physical superposition r = sum_v h_v M_v x_v + n +through the realized masks, applies the same receivers, and compares +the SER against the expectation-model front end on identical latents, +gains, and noise seeds. + +The realized per-entry Gram deviation is O(1/sqrt(d)); this check +quantifies its end-to-end effect at d=64 (theory/mobility setting) and +d=768 (real-embedding setting). + +Outputs: data/e_mask_check.csv +""" +import math +import os +import numpy as np + +from semantic_mac import (affinity_matrix, matched_filter, demux_sr, + demux_sc, demux_lmmse, demux_dr, + sample_latents_isotropic, random_orthogonal, + metrics) + +HERE = os.path.dirname(os.path.abspath(__file__)) +DATA = os.path.join(HERE, "..", "data") + +U = 4 +BETA = 0.5 + + +def haar_masks(B, d, rng): + """M_u = sum_k A_uk U_k with A = chol(B), U_k independent Haar.""" + A = np.linalg.cholesky(B) + Us = [random_orthogonal(d, rng) for _ in range(U)] + return [sum(A[u, k] * Us[k] for k in range(U)) for u in range(U)] + + +def physical_front_end(z, h, Ms, rho, rng): + """r = sum_v h_v M_v z_v + n (ambient AWGN), tilde_u = M_u^T r / h_u.""" + batch, Uu, d = z.shape + sigma = math.sqrt(1.0 / rho) + r = np.einsum('bv,vde,bve->bd', h, + np.stack(Ms), z) + rng.standard_normal((batch, d)) * sigma + tilde = np.stack([(r @ Ms[u]) / h[:, u][:, None] for u in range(U)], + axis=1) + return tilde + + +def run(d, d_c, batch, n_mask_draws, snr_db): + RHO = 10 ** (snr_db / 10) + a = math.sqrt(BETA) * np.ones(U) + B = affinity_matrix(a) + Vc = np.eye(d)[:, :d_c] + diffs = {m: [] for m in ("SR", "SC", "LMMSE", "DR")} + sers_r = {m: [] for m in diffs} + sers_e = {m: [] for m in diffs} + for t in range(n_mask_draws): + rng = np.random.default_rng(7700 + 10 * t) + z = sample_latents_isotropic(batch, U, d, d_c, a, rng) + hc = (rng.standard_normal((batch, U)) + + 1j * rng.standard_normal((batch, U))) / math.sqrt(2) + h = np.clip(np.abs(hc), 0.2, None) + Ms = haar_masks(B, d, rng) + gram_dev = max(np.abs(Ms[u].T @ Ms[v] - B[u, v] * np.eye(d)).max() + for u in range(U) for v in range(U)) + tilde_r = physical_front_end(z, h, Ms, RHO, rng) + # expectation-model front end on the SAME latents and gains + rng_e = np.random.default_rng(8800 + 10 * t) + tilde_e = np.einsum('uv,bvd,bv,bu->bud', B, z, h, 1.0 / h) + xi = rng_e.standard_normal((batch, U, d)) * math.sqrt(1.0 / RHO) + A = np.linalg.cholesky(B) + for b in range(batch): + tilde_e[b] += (A @ xi[b]) / h[b][:, None] + for name, tl in (("realized", tilde_r), ("expected", tilde_e)): + out = {} + out["SR"] = demux_sr(tl, B, h) + out["SC"] = demux_sc(tl, h) + out["LMMSE"], _ = demux_lmmse(tl, B, h, RHO) + out["DR"] = demux_dr(tl, B, h, RHO, a, Vc) + for m in diffs: + _, _, s = metrics(out[m], z) + (sers_r if name == "realized" else sers_e)[m].append(s) + for m in diffs: + diffs[m].append(sers_r[m][-1] - sers_e[m][-1]) + print(f"d={d} draw {t+1}/{n_mask_draws} gram_dev={gram_dev:.3f} " + + " ".join(f"{m}:d={diffs[m][-1]:+.4f}" for m in diffs)) + return {m: (float(np.mean(sers_r[m])), float(np.mean(sers_e[m])), + float(np.mean(diffs[m])), float(np.std(diffs[m]))) + for m in diffs} + + +def main(): + rows = [] + for d, d_c, batch, draws, snr_db in ((64, 16, 2000, 12, 10), + (768, 128, 400, 6, 20)): + res = run(d, d_c, batch, draws, snr_db) + for m, (sr, se, md, sd) in res.items(): + rows.append((d, snr_db, m, sr, se, md, sd)) + print(f"d={d} snr={snr_db} {m}: realized={sr:.4f} " + f"expected={se:.4f} mean_diff={md:+.5f} std={sd:.5f}") + with open(os.path.join(DATA, "e_mask_check.csv"), "w") as f: + f.write("d,snr,method,ser_realized,ser_expected,mean_diff," + "std_diff\n") + for r in rows: + f.write(",".join(str(x) for x in r) + "\n") + print("mask check done.") + + +if __name__ == "__main__": + main() diff --git a/code/exp1_theory.py b/code/exp1_theory.py new file mode 100644 index 0000000..0e14983 --- /dev/null +++ b/code/exp1_theory.py @@ -0,0 +1,107 @@ +"""E1: receiver theory verification (synthetic isotropic contents). + +Outputs: data/e1_beta.csv, data/e1_snr.csv, data/e1_endpoints.txt +(figures come from replot_all.py only) +""" +import math +import os +import numpy as np +from semantic_mac import (affinity_matrix, matched_filter, demux_sr, demux_sc, + demux_lmmse, demux_dr, lmmse_matrices, + sample_latents_isotropic, metrics, + oma_observe, demux_noma_genie) + +HERE = os.path.dirname(os.path.abspath(__file__)) +FIG = os.path.join(HERE, "..", "fig") +DATA = os.path.join(HERE, "..", "data") +os.makedirs(FIG, exist_ok=True) +os.makedirs(DATA, exist_ok=True) + +U, D, DC = 4, 64, 16 +BATCH = 4000 +NAMES = ["OMA", "NOMA", "SR", "SC", "LMMSE", "DR"] + + +def run_point(beta, rho, rng, conv_seed=0): + a = math.sqrt(beta) * np.ones(U) + B = affinity_matrix(a) + z = sample_latents_isotropic(BATCH, U, D, DC, a, rng) + tilde, h = matched_filter(z, B, rho, rng) + Vc = np.eye(D)[:, :DC] + res = {} + res["SR"] = metrics(demux_sr(tilde, B, h), z) + res["SC"] = metrics(demux_sc(tilde, h), z) + lm, cf = demux_lmmse(tilde, B, h, rho) + res["LMMSE"] = metrics(lm, z) + res["LMMSE_cf"] = float(cf.mean()) + # SR closed form: d sigma^2 [B^-1]_uu / h^2 averaged + Binv = np.diag(np.linalg.inv(B)) + res["SR_cf"] = float((D / rho) * (Binv[None, :] / h ** 2).mean()) + res["DR"] = metrics(demux_dr(tilde, B, h, rho, a, Vc), z) + # conventional baselines on a dedicated stream (keeps main draws intact) + rng_c = np.random.default_rng(90000 + conv_seed) + res["OMA"] = metrics(oma_observe(z, h, rho, rng_c), z) + res["NOMA"] = metrics(demux_noma_genie(z, h, rho, rng_c), z) + return res + + +def main(): + rng = np.random.default_rng(0) + rho_db = 10 + rho = 10 ** (rho_db / 10) + betas = [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.95, 0.99] + rows = [] + for b in betas: + r = run_point(b, rho, rng, conv_seed=int(b * 100)) + rows.append(r) + print(f"beta={b:4.2f} " + " ".join( + f"{n}:cos={r[n][0]:.3f},nmse={r[n][1]:.3f},ser={r[n][2]:.3f}" + for n in NAMES)) + with open(os.path.join(DATA, "e1_beta.csv"), "w") as f: + f.write("beta," + ",".join(f"{n}_cos,{n}_nmse,{n}_ser" for n in NAMES) + + ",LMMSE_cf,SR_cf\n") + for b, r in zip(betas, rows): + f.write(f"{b}," + ",".join( + f"{r[n][0]},{r[n][1]},{r[n][2]}" for n in NAMES) + + f",{r['LMMSE_cf']},{r['SR_cf']}\n") + + beta_mid = 0.4 + snrs = list(range(0, 21, 4)) + rows_s = [] + for s in snrs: + r = run_point(beta_mid, 10 ** (s / 10), rng, conv_seed=1000 + s) + rows_s.append(r) + print(f"snr={s} " + " ".join(f"{n}:ser={r[n][2]:.3f}" for n in NAMES)) + with open(os.path.join(DATA, "e1_snr.csv"), "w") as f: + f.write("snr," + ",".join(f"{n}_cos,{n}_nmse,{n}_ser" for n in NAMES) + "\n") + for s, r in zip(snrs, rows_s): + f.write(f"{s}," + ",".join( + f"{r[n][0]},{r[n][1]},{r[n][2]}" for n in NAMES) + "\n") + + # endpoint checks + lines = [] + a = math.sqrt(0.4) * np.ones(U) + B = affinity_matrix(a) + h = np.clip(np.abs((rng.standard_normal(U) + 1j * rng.standard_normal(U)) + / math.sqrt(2)), 0.2, None) + for rdb in (10, 40, 80): + W, _ = lmmse_matrices(B, h, 10 ** (-rdb / 10), D) + Ginv = np.linalg.inv(np.diag(1 / h) @ B @ np.diag(h)) + rel = np.linalg.norm(W - Ginv) / np.linalg.norm(Ginv) + lines.append(f"(i) rho={rdb}dB rel_diff_W_vs_Gammainv={rel:.3e}") + W0, _ = lmmse_matrices(np.eye(U), h, 0.1, D) + off = np.abs(W0 - np.diag(np.diag(W0))).max() + wiener = h ** 2 / (h ** 2 + D * 0.1) + lines.append(f"(ii) beta=0 max_offdiag={off:.3e} " + f"max_diag_minus_wiener={np.abs(np.diag(W0)-wiener).max():.3e}") + with open(os.path.join(DATA, "e1_endpoints.txt"), "w") as f: + f.write("\n".join(lines) + "\n") + print("\n".join(lines)) + + # figures are produced only by the canonical replot_all.py (uniform + # geometry); experiment scripts write CSVs exclusively. + print("E1 done. Run replot_all.py to regenerate the figures.") + + +if __name__ == "__main__": + main() diff --git a/code/exp2_structure.py b/code/exp2_structure.py new file mode 100644 index 0000000..aac2ba9 --- /dev/null +++ b/code/exp2_structure.py @@ -0,0 +1,244 @@ +"""E2: embedding-structure optimization on REAL PLM embeddings. + +Contents are real BERT AG-News embeddings (8000 x 768, from the published +shared-embedding line); the structured latent is mixed by an unknown random +orthogonal R (the frozen encoder's arbitrary basis). We compare: + + (i) LMMSE -- B-aware optimal linear receiver, no structure + (ii) DR + spectral -- closed-form shared-subspace recovery from N pairs + (iii) DR + adapter -- channel-in-the-loop learned linear refinement + (iv) DR + oracle -- true mixing basis (upper bound) + +Calibration, adapter training, and subspace/spectrum sweeps draw only from +the first 7000 pool sentences; the performance ladder is evaluated on +tuples drawn from the held-out remaining 1000 sentences. + +Outputs: data/e2_subspace_multi.csv, data/e2_spectrum_multi.csv, +data/e2_exponents.txt, data/e2_caliberr.txt, data/e2_ladder.csv +(figures come from replot_all.py only) +""" +import math +import os +import numpy as np +import torch + +from semantic_mac import (EmbeddingPool, affinity_matrix, matched_filter, + demux_lmmse, demux_dr, sample_latents_pool, + random_orthogonal, learn_structure_spectral, + subspace_error, metrics, + oma_observe, demux_noma_genie) + +HERE = os.path.dirname(os.path.abspath(__file__)) +FIG = os.path.join(HERE, "..", "fig") +DATA = os.path.join(HERE, "..", "data") +os.makedirs(FIG, exist_ok=True) +os.makedirs(DATA, exist_ok=True) + +# BERT AG-News embedding pool: shipped in data/ for the public release, +# with a fallback to the original location in the paper workspace. +POOL_PT = os.path.join(HERE, "..", "data", "bert_agnews_8000.pt") +if not os.path.exists(POOL_PT): + POOL_PT = os.path.join(HERE, "..", "..", "5. WCL-DRL", + "bert_agnews_8000.pt") +U, D, DC = 4, 768, 128 +BETA = 0.5 +N_PAIR = 200 # paired calibration samples available to the optimizer +BATCH_EVAL = 4000 +N_TRAIN_POOL = 7000 # sentences usable for calibration/adapter training +# evaluation tuples are drawn only from the held-out remainder of the pool +IDX_TRAIN = np.arange(N_TRAIN_POOL) +IDX_EVAL = np.arange(N_TRAIN_POOL, 8000) + + +def gen_clean(pool, n, a, R, rng, idx_pool=None): + z = sample_latents_pool(pool, n, U, D, DC, a, rng, idx_pool=idx_pool) + return z, z @ R.T + + +# ---------------------------------------------------------------------- +# Learned linear adapter (channel-in-the-loop refinement) +# ---------------------------------------------------------------------- +def dr_torch(tilde, B, h, rho, a, W, d_c): + """Differentiable decomposition receiver in the adapter frame W (d x d). + Returns ambient-frame estimates W^T z_hat.""" + Bt, Ut, d = tilde.shape + sigma2 = 1.0 / rho + y = tilde @ W.T # rotated MF outputs + Zs, Zp = y[:, :, :d_c], y[:, :, d_c:] + Hi = torch.diag_embed(1.0 / h) + Hm = torch.diag_embed(h) + Bb = B.unsqueeze(0).expand(Bt, Ut, Ut) + Gamma = Hi @ Bb @ Hm + Cn = sigma2 * (Hi @ Bb @ Hi) + ratio = h.unsqueeze(1) / h.unsqueeze(2) # h_v / h_u + gamma = a.view(1, 1, Ut) * Bb * ratio + gamma = gamma.sum(dim=2) - (a.view(1, Ut) * (Bb.diagonal(dim1=1, dim2=2) - 1.0)) + # gamma_u = a_u + sum_{v != u} B_uv a_v h_v/h_u (diagonal of Bb is 1) + Cn_inv = torch.linalg.inv(Cn) + gCg = torch.einsum('bu,buv,bv->b', gamma, Cn_inv, gamma).clamp_min(1e-9) + c_hat = torch.einsum('bu,buv,bvk->bk', gamma, Cn_inv, Zs) / gCg.unsqueeze(-1) + shrink_c = (1.0 / d_c) / (1.0 / d_c + 1.0 / gCg) + c_hat = c_hat * shrink_c.unsqueeze(-1) + Gp = torch.linalg.solve(Gamma, Zp) + Binv_uu = torch.linalg.inv(B).diagonal() + sig_p = (1.0 - a ** 2).clamp_min(1e-9) + err_p = (d - d_c) * sigma2 * Binv_uu.view(1, Ut) / (h ** 2) + shrink_p = sig_p.view(1, Ut) / (sig_p.view(1, Ut) + err_p) + z_hat = torch.cat([ + a.view(1, Ut, 1) * c_hat.unsqueeze(1).expand(Bt, Ut, d_c), + shrink_p.unsqueeze(-1) * Gp], dim=2) + return z_hat @ W # back to ambient frame + + +def train_adapter(x_cal, a, V_init, rng, steps=400, batch=24, lr=3e-4, + lam_orth=1.0, lam_align=0.2, seed=0): + """Refine the full rotation W (init = spectral basis) through the channel. + + x_cal: the SAME N_PAIR calibration embeddings used by the spectral + estimator (the adapter adds no data cost, as stated in the paper).""" + torch.manual_seed(seed) + W = torch.nn.Parameter(torch.tensor(V_init.T, dtype=torch.float32)) + a_t = torch.tensor(a, dtype=torch.float32) + B_np = affinity_matrix(a) + B_t = torch.tensor(B_np, dtype=torch.float32) + opt = torch.optim.Adam([W], lr=lr) + n_cal = x_cal.shape[0] + x_cal_t = torch.tensor(x_cal, dtype=torch.float32) + for it in range(steps): + idx = torch.randint(0, n_cal, (batch,)) + x = x_cal_t[idx] + snr_db = float(rng.uniform(0, 20)) + rho = 10 ** (snr_db / 10) + tilde_np, h_np = matched_filter(x.numpy().astype(np.float64), + B_np, rho, rng) + tilde = torch.tensor(tilde_np, dtype=torch.float32) + h = torch.tensor(h_np, dtype=torch.float32) + x_hat = dr_torch(tilde, B_t, h, rho, a_t, W, DC) + cosd = 1.0 - torch.nn.functional.cosine_similarity( + x_hat, x, dim=2).mean() + y = x @ W.T + s = torch.nn.functional.normalize(y[:, :, :DC], dim=2) + align = (s.unsqueeze(1) - s.unsqueeze(2)).pow(2).sum(-1).mean() + orth = (W @ W.T - torch.eye(D)).pow(2).mean() + loss = cosd + lam_align * align + lam_orth * orth + opt.zero_grad() + loss.backward() + opt.step() + if (it + 1) % 100 == 0: + print(f" adapter step {it+1}: loss={loss.item():.4f} " + f"cosd={cosd.item():.4f} align={align.item():.4f}") + with torch.no_grad(): + # re-orthonormalize + Uo, _, Vo = torch.linalg.svd(W) + Wo = Uo @ Vo + return Wo.numpy().astype(np.float64) + + +def main(): + rng = np.random.default_rng(7) + obj = torch.load(POOL_PT, map_location="cpu") + X = obj.numpy() if torch.is_tensor(obj) else np.asarray(obj) + pool = EmbeddingPool(X) + print(f"pool: {pool.N} x {pool.d}") + a = math.sqrt(BETA) * np.ones(U) + B = affinity_matrix(a) + R = random_orthogonal(D, rng) + V_true = R[:, :DC] + + # --- subspace recovery vs N for multiple user counts ------------------ + # Multi-trial averaging; the N grid starts above d_c = 128 because for + # N < d_c the empirical cross-covariance is rank-deficient in the shared + # block (at most N of the d_c shared directions are excited), which + # produces a systematic plateau rather than smooth decay. + TRIALS = 12 + Ns = [200, 400, 800, 1600, 3200, 6400] + err_multi = {} + with open(os.path.join(DATA, "e2_subspace_multi.csv"), "w") as f: + f.write("U,N,err\n") + for Um in (2, 4, 8): + a_u = math.sqrt(BETA) * np.ones(Um) + err_multi[Um] = [] + for n in Ns: + errs_t = [] + for t in range(TRIALS): + rng_t = np.random.default_rng(42000 + 1000 * Um + + 10 * n + t) + z_u = sample_latents_pool(pool, n, Um, D, DC, a_u, rng_t, + idx_pool=IDX_TRAIN) + Vh, _ = learn_structure_spectral(z_u @ R.T, DC) + errs_t.append(subspace_error(Vh, V_true)) + e_u = float(np.mean(errs_t)) + err_multi[Um].append(e_u) + f.write(f"{Um},{n},{e_u}\n") + print(f"U={Um} N={n:5d} err={e_u:.4f} " + f"(std {np.std(errs_t):.4f})") + + # power-law exponents of the subspace-error decay (quoted in the paper) + with open(os.path.join(DATA, "e2_exponents.txt"), "w") as f: + for Um in (2, 4, 8): + slope = np.polyfit(np.log(Ns), np.log(err_multi[Um]), 1)[0] + f.write(f"U={Um} exponent={slope:.3f}\n") + print(f"U={Um} power-law exponent {slope:.3f}") + + # --- eigen-spectrum for several calibration sizes (fresh rng) --------- + with open(os.path.join(DATA, "e2_spectrum_multi.csv"), "w") as f: + f.write("N,idx,eig\n") + for n in (100, 400, 1600): + rng_s = np.random.default_rng(5200 + n) + z_s = sample_latents_pool(pool, n, U, D, DC, a, rng_s, + idx_pool=IDX_TRAIN) + _, ev = learn_structure_spectral(z_s @ R.T, DC) + for i, w in enumerate(ev[:400]): + f.write(f"{n},{i+1},{w}\n") + + # --- calibration with the paper budget -------------------------------- + _, x_cal = gen_clean(pool, N_PAIR, a, R, rng, idx_pool=IDX_TRAIN) + V_spec, _ = learn_structure_spectral(x_cal, DC) + err_spec = subspace_error(V_spec, V_true) + print(f"spectral (N={N_PAIR}): subspace_err={err_spec:.4f}") + + # full basis for adapter init: complete V_spec to an orthonormal basis + Q, _ = np.linalg.qr(np.hstack([ + V_spec, rng.standard_normal((D, D - DC))])) + V_full = Q + print("training adapter (same calibration pairs as the spectral step) ...") + W_ad = train_adapter(x_cal, a, V_full, rng) + err_ad = subspace_error(W_ad.T[:, :DC], V_true) + print(f"adapter: subspace_err={err_ad:.4f}") + with open(os.path.join(DATA, "e2_caliberr.txt"), "w") as f: + f.write(f"spectral_err={err_spec}\nadapter_err={err_ad}\n") + + # --- performance ladder vs SNR (held-out pool sentences) --------------- + snrs = list(range(0, 21, 4)) + rows = [] + for s in snrs: + rho = 10 ** (s / 10) + z, x = gen_clean(pool, BATCH_EVAL, a, R, rng, idx_pool=IDX_EVAL) + tilde, h = matched_filter(x, B, rho, rng) + r = {} + lm, _ = demux_lmmse(tilde, B, h, rho) + r["LMMSE"] = metrics(lm, x) + r["DR-spec"] = metrics(demux_dr(tilde, B, h, rho, a, V_spec), x) + r["DR-adapt"] = metrics( + demux_dr(tilde, B, h, rho, a, W_ad.T[:, :DC]), x) + r["DR-oracle"] = metrics(demux_dr(tilde, B, h, rho, a, V_true), x) + rng_c = np.random.default_rng(91000 + s) + r["OMA"] = metrics(oma_observe(x, h, rho, rng_c), x) + r["NOMA"] = metrics(demux_noma_genie(x, h, rho, rng_c), x) + rows.append(r) + print(f"snr={s:2d} " + " ".join( + f"{k}:cos={v[0]:.3f},ser={v[2]:.3f}" for k, v in r.items())) + keys = ["OMA", "NOMA", "LMMSE", "DR-spec", "DR-adapt", "DR-oracle"] + with open(os.path.join(DATA, "e2_ladder.csv"), "w") as f: + f.write("snr," + ",".join(f"{k}_cos,{k}_nmse,{k}_ser" for k in keys) + "\n") + for s, r in zip(snrs, rows): + f.write(f"{s}," + ",".join( + f"{r[k][0]},{r[k][1]},{r[k][2]}" for k in keys) + "\n") + + # figures are produced only by the canonical replot_all.py (uniform + # geometry); experiment scripts write CSVs exclusively. + print("E2 done. Run replot_all.py to regenerate the figures.") + + +if __name__ == "__main__": + main() diff --git a/code/exp3_mobility.py b/code/exp3_mobility.py new file mode 100644 index 0000000..a8ee37f --- /dev/null +++ b/code/exp3_mobility.py @@ -0,0 +1,161 @@ +"""E3: dynamic mobile environment -- time-varying share coefficients a_u(t) +from random-waypoint trajectories, with sparse affinity-pilot tracking. + +Every K-th slot each user sends n_p orthogonal pilot embeddings (overhead +n_p/(K*batch) << 1); the tracker EWMA-smooths the triangulated observations. + +Methods: + DR-genie : decomposition receiver with true a_u(t) (upper ref) + DR-tracked : DR with pilot-tracked a_hat(t) (proposed) + DR-static : DR designed for the time-averaged a (no adaptation) + SR / SC / LMMSE : baselines with true B(t) + +Outputs: data/e3_timeseries.csv, data/e3_speed.csv +(figures come from replot_all.py only) +""" +import os +import numpy as np +from semantic_mac import (affinity_matrix, matched_filter, demux_sr, demux_sc, + demux_lmmse, demux_dr, sample_latents_isotropic, + mobility_trajectories, AffinityTracker, + pilot_affinity_obs, metrics, + oma_observe, demux_noma_genie) + +HERE = os.path.dirname(os.path.abspath(__file__)) +FIG = os.path.join(HERE, "..", "fig") +DATA = os.path.join(HERE, "..", "data") +os.makedirs(FIG, exist_ok=True) +os.makedirs(DATA, exist_ok=True) + +U, D, DC = 4, 64, 16 +BATCH = 320 +SNR_DB = 12 +RHO = 10 ** (SNR_DB / 10) +T = 300 +K_PILOT = 5 # pilot every K slots +N_PILOT = 64 # pilot embeddings per user per pilot slot +LAM = 0.3 +METHODS = ["DR-genie", "DR-tracked", "DR-static", "SR", "SC", "LMMSE", + "OMA", "NOMA"] +MOB = dict(box=50.0, r_scene=32.0, a_max=0.95) + + +def run_trace(a_t, rng, collect_ts=False): + Vc = np.eye(D)[:, :DC] + a_bar = a_t.mean(axis=0) + tracker = AffinityTracker(U, lam=LAM, a_init=float(a_bar.mean())) + sers = {m: [] for m in METHODS} + coss = {m: [] for m in METHODS} + a_hat_log = [] + for t in range(a_t.shape[0]): + a = a_t[t] + B = affinity_matrix(a) + z = sample_latents_isotropic(BATCH, U, D, DC, a, rng) + tilde, h = matched_filter(z, B, RHO, rng) + + if t % K_PILOT == 0: + zp = sample_latents_isotropic(N_PILOT, U, D, DC, a, rng) + hp = np.clip(np.abs((rng.standard_normal(U) + + 1j * rng.standard_normal(U)) / np.sqrt(2)), + 0.2, None) + tracker.update(pilot_affinity_obs(zp, hp, RHO, rng)) + a_hat = np.clip(tracker.a, 0.02, 0.95) + + out = {} + out["DR-genie"] = demux_dr(tilde, B, h, RHO, a, Vc) + out["DR-tracked"] = demux_dr(tilde, affinity_matrix(a_hat), h, RHO, + a_hat, Vc) + out["DR-static"] = demux_dr(tilde, affinity_matrix(a_bar), h, RHO, + a_bar, Vc) + out["SR"] = demux_sr(tilde, B, h) + out["SC"] = demux_sc(tilde, h) + out["LMMSE"], _ = demux_lmmse(tilde, B, h, RHO) + out["OMA"] = oma_observe(z, h, RHO, rng) + out["NOMA"] = demux_noma_genie(z, h, RHO, rng) + + a_hat_log.append(a_hat) + for m in METHODS: + c, _, s = metrics(out[m], z) + sers[m].append(s) + coss[m].append(c) + res = {m: (float(np.mean(coss[m])), float(np.mean(sers[m]))) + for m in METHODS} + if collect_ts: + return res, sers, np.array(a_hat_log) + return res + + +def drive_through_profile(T, peaks=(80, 110, 140, 170), width=45.0, + a_lo=0.05, a_hi=0.9): + """Scene pass-by: each user approaches the shared scene, dwells, leaves.""" + t = np.arange(T)[:, None] + pk = np.asarray(peaks)[None, :] + return a_lo + (a_hi - a_lo) * np.exp(-(t - pk) ** 2 / (2 * width ** 2)) + + +def main(): + # --- time-series: scene pass-by, averaged over REPS_TS runs ------------- + a_t = drive_through_profile(T) + REPS_TS = 5 + sers_acc = None + means_acc = {m: [] for m in METHODS} + for rep_i in range(REPS_TS): + rng = np.random.default_rng(3 + rep_i) + res_i, sers_i, a_hat_i = run_trace(a_t, rng, collect_ts=True) + if rep_i == 0: + a_hat_log = a_hat_i + if sers_acc is None: + sers_acc = {m: np.array(sers_i[m], float) for m in METHODS} + else: + for m in METHODS: + sers_acc[m] += np.array(sers_i[m], float) + for m in METHODS: + means_acc[m].append(res_i[m]) + print(f" ts rep {rep_i+1}/{REPS_TS} done") + sers = {m: (sers_acc[m] / REPS_TS).tolist() for m in METHODS} + res = {m: (float(np.mean([x[0] for x in means_acc[m]])), + float(np.mean([x[1] for x in means_acc[m]]))) + for m in METHODS} + print("time-series means:", {m: f"cos={v[0]:.3f},ser={v[1]:.3f}" + for m, v in res.items()}) + with open(os.path.join(DATA, "e3_timeseries.csv"), "w") as f: + f.write("t," + ",".join(f"a{u}" for u in range(U)) + "," + + ",".join(f"ahat{u}" for u in range(U)) + "," + + ",".join(f"{m}_ser" for m in METHODS) + "\n") + for t in range(T): + f.write(f"{t}," + ",".join(f"{a_t[t,u]:.4f}" for u in range(U)) + + "," + ",".join(f"{a_hat_log[t,u]:.4f}" for u in range(U)) + + "," + ",".join(f"{sers[m][t]:.4f}" for m in METHODS) + "\n") + + # --- speed sweep (averaged over trajectory seeds) ----------------------- + speeds = [0.5, 1.0, 2.0, 4.0, 8.0] + reps = 8 + rows = [] + for si, sp in enumerate(speeds): + acc = {m: [] for m in METHODS} + for rep in range(reps): + # disjoint seed blocks per speed point (no seed reuse across + # speeds) + rng_s = np.random.default_rng(1000 + 100 * si + rep) + a_tr = mobility_trajectories(U, T, sp, rng_s, **MOB) + r = run_trace(a_tr, rng_s) + for m in METHODS: + acc[m].append(r[m]) + rows.append({m: (float(np.mean([x[0] for x in acc[m]])), + float(np.mean([x[1] for x in acc[m]]))) + for m in METHODS}) + print(f"speed={sp} " + " ".join(f"{m}:ser={rows[-1][m][1]:.3f}" + for m in METHODS)) + with open(os.path.join(DATA, "e3_speed.csv"), "w") as f: + f.write("speed," + ",".join(f"{m}_cos,{m}_ser" for m in METHODS) + "\n") + for sp, r in zip(speeds, rows): + f.write(f"{sp}," + ",".join(f"{r[m][0]},{r[m][1]}" + for m in METHODS) + "\n") + + # figures are produced only by the canonical replot_all.py (uniform + # geometry); experiment scripts write CSVs exclusively. + print("E3 done. Run replot_all.py to regenerate the figures.") + + +if __name__ == "__main__": + main() diff --git a/code/exp4_mismatch.py b/code/exp4_mismatch.py new file mode 100644 index 0000000..947469e --- /dev/null +++ b/code/exp4_mismatch.py @@ -0,0 +1,54 @@ +"""E4: robustness of the decomposition receiver to affinity estimation error. + +DR runs with a_hat = a + delta; theory predicts O(delta^2) degradation. + +Outputs: data/e4_mismatch.csv +(figures come from replot_all.py only) +""" +import math +import os +import numpy as np +from semantic_mac import (affinity_matrix, matched_filter, demux_dr, + sample_latents_isotropic, metrics) + +HERE = os.path.dirname(os.path.abspath(__file__)) +FIG = os.path.join(HERE, "..", "fig") +DATA = os.path.join(HERE, "..", "data") +os.makedirs(FIG, exist_ok=True) +os.makedirs(DATA, exist_ok=True) + +U, D, DC = 4, 64, 16 +BATCH = 4000 +BETA = 0.5 + + +def main(): + rng = np.random.default_rng(11) + a = math.sqrt(BETA) * np.ones(U) + B = affinity_matrix(a) + Vc = np.eye(D)[:, :DC] + deltas = np.arange(-0.20, 0.201, 0.04) + rows = [] + for snr_db in (5, 10, 15): + rho = 10 ** (snr_db / 10) + z = sample_latents_isotropic(BATCH, U, D, DC, a, rng) + tilde, h = matched_filter(z, B, rho, rng) + for d0 in deltas: + a_hat = np.clip(a + d0, 0.02, 0.98) + B_hat = affinity_matrix(a_hat) + cos, _, ser = metrics( + demux_dr(tilde, B_hat, h, rho, a_hat, Vc), z) + rows.append((snr_db, float(d0), cos, ser)) + print(f"snr={snr_db} delta={d0:+.2f} cos={cos:.4f} ser={ser:.4f}") + with open(os.path.join(DATA, "e4_mismatch.csv"), "w") as f: + f.write("snr,delta,cos,ser\n") + for r in rows: + f.write(",".join(str(x) for x in r) + "\n") + + # figures are produced only by the canonical replot_all.py (uniform + # geometry); experiment scripts write CSVs exclusively. + print("E4 done. Run replot_all.py to regenerate the figures.") + + +if __name__ == "__main__": + main() diff --git a/code/exp5_learned.py b/code/exp5_learned.py new file mode 100644 index 0000000..5540e13 --- /dev/null +++ b/code/exp5_learned.py @@ -0,0 +1,125 @@ +"""E5: comparison with a trained user-wise attention receiver. + +A learned receiver representative of the end-to-end line (per-user query +attention over the matched-filter outputs, residual skip, unit +normalization) is trained at the operating SNR over uniformly random +affinities, then compared against the closed-form LMMSE and DR receivers +across the affinity sweep. The learned receiver receives no affinity side +information and must infer the coupling from data, which is the standard +setting of the learned line. + +Outputs: data/e5_learned.csv, data/e5_train_log.csv +(figures come from replot_all.py only) +""" +import math +import os +import numpy as np +import torch + +from semantic_mac import (affinity_matrix, matched_filter, + sample_latents_isotropic, demux_lmmse, demux_dr, + demux_sr, demux_sc, metrics) + +HERE = os.path.dirname(os.path.abspath(__file__)) +FIG = os.path.join(HERE, "..", "fig") +DATA = os.path.join(HERE, "..", "data") + +U, D, DC = 4, 64, 16 +SNR_DB = 10 +RHO = 10 ** (SNR_DB / 10) +STEPS = 3000 +BATCH = 64 + + +class UserWiseAttention(torch.nn.Module): + """Per-user query attention over the U matched-filter outputs.""" + + def __init__(self, U, d, dk=16, heads=4): + super().__init__() + self.U, self.d, self.dk, self.H = U, d, dk, heads + self.WK = torch.nn.Linear(d, dk * heads, bias=False) + self.WV = torch.nn.Linear(d, dk * heads, bias=False) + self.WO = torch.nn.Linear(dk * heads, d, bias=False) + self.q = torch.nn.Parameter(torch.randn(U, heads, dk) * 0.1) + self.log_eta = torch.nn.Parameter(torch.zeros(())) + + def forward(self, tilde): + B, Uu, d = tilde.shape + K = self.WK(tilde).view(B, Uu, self.H, self.dk) + V = self.WV(tilde).view(B, Uu, self.H, self.dk) + sc = torch.einsum('uhk,bihk->buih', self.q, K) / math.sqrt(self.dk) + alpha = torch.softmax(torch.exp(self.log_eta) * sc, dim=2) + ctx = torch.einsum('buih,bihk->buhk', alpha, V).reshape(B, Uu, -1) + out = self.WO(ctx) + tilde + return out / (out.norm(dim=2, keepdim=True) + 1e-12) + + +def gen_batch(rng, batch, beta): + a = math.sqrt(beta) * np.ones(U) + B = affinity_matrix(a) + z = sample_latents_isotropic(batch, U, D, DC, a, rng) + tilde, h = matched_filter(z, B, RHO, rng) + return z, tilde, h, a, B + + +def main(): + torch.manual_seed(0) + rng = np.random.default_rng(21) + net = UserWiseAttention(U, D) + n_par = sum(p.numel() for p in net.parameters()) + print(f"learned receiver parameters: {n_par}") + opt = torch.optim.Adam(net.parameters(), lr=1e-3) + train_log = [] + for it in range(STEPS): + beta = float(rng.uniform(0.05, 0.9)) + z, tilde, h, a, B = gen_batch(rng, BATCH, beta) + zt = torch.tensor(z, dtype=torch.float32) + tt = torch.tensor(tilde, dtype=torch.float32) + out = net(tt) + loss = (1.0 - (out * zt).sum(-1)).mean() + opt.zero_grad() + loss.backward() + opt.step() + if (it + 1) % 50 == 0: + train_log.append((it + 1, float(loss.item()))) + if (it + 1) % 500 == 0: + print(f" step {it+1}: loss={loss.item():.4f}") + # convergence evidence for the fixed training budget + with open(os.path.join(DATA, "e5_train_log.csv"), "w") as f: + f.write("step,loss\n") + for st, lo in train_log: + f.write(f"{st},{lo}\n") + + # evaluation across the affinity sweep + betas = [0.05, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9] + Vc = np.eye(D)[:, :DC] + rows = [] + net.eval() + rng_e = np.random.default_rng(500) + for beta in betas: + z, tilde, h, a, B = gen_batch(rng_e, 4000, beta) + with torch.no_grad(): + out_l = net(torch.tensor(tilde, dtype=torch.float32)).numpy() + r = {} + r["Learned"] = metrics(out_l.astype(np.float64), z) + lm, _ = demux_lmmse(tilde, B, h, RHO) + r["LMMSE"] = metrics(lm, z) + r["DR"] = metrics(demux_dr(tilde, B, h, RHO, a, Vc), z) + rows.append(r) + print(f"beta={beta:.2f} " + " ".join( + f"{k}:cos={v[0]:.3f},ser={v[2]:.3f}" for k, v in r.items())) + with open(os.path.join(DATA, "e5_learned.csv"), "w") as f: + keys = ["Learned", "LMMSE", "DR"] + f.write("beta," + ",".join(f"{k}_cos,{k}_nmse,{k}_ser" for k in keys) + + "\n") + for b, r in zip(betas, rows): + f.write(f"{b}," + ",".join( + f"{r[k][0]},{r[k][1]},{r[k][2]}" for k in keys) + "\n") + + # figures are produced only by the canonical replot_all.py (uniform + # geometry); experiment scripts write CSVs exclusively. + print("E5 done. Run replot_all.py to regenerate the figures.") + + +if __name__ == "__main__": + main() diff --git a/code/lmmse_verify.py b/code/lmmse_verify.py new file mode 100644 index 0000000..f41fdbc --- /dev/null +++ b/code/lmmse_verify.py @@ -0,0 +1,321 @@ +""" +Verify Proposition-candidate 1 for the 8th (TMC) paper: + + The B-aware LMMSE receiver + W*(B,H,sigma^2) = C_x Gamma^T (Gamma C_x Gamma^T + C_n)^{-1} + (i) -> Gamma^{-1} (= SR / AA-EDMA demux) as rho -> inf + (ii) -> per-user Wiener (no cross-processing) as beta -> 0 + (iii) -> coherent combining (SC / MRC) as beta -> 1 + (iv) dominates SR and SC at every (beta, rho); strict gap at intermediate beta. + +Also simulates an oracle decomposition receiver (ODR) that knows the +shared/private subspace split — the ceiling motivating structured +embedding learning. + +Self-contained: model/conventions come from the project's own +semantic_mac.py (matched filter, affinity, metrics), so this script +verifies the same library that produces the paper results. +""" +from __future__ import annotations +import math +import os +import numpy as np + +from semantic_mac import affinity_matrix, matched_filter, metrics + +HERE = os.path.dirname(os.path.abspath(__file__)) +OUT = os.path.join(HERE, "..", "fig") +os.makedirs(OUT, exist_ok=True) + +TAU = 0.45 # SER threshold, as in CL paper + + +# ---------------------------------------------------------------------- +# Structured embedding generator with a FIXED shared subspace +# (needed for the ODR ceiling; statistically identical Gram to uwca_core's +# sample_embeddings: E[] = a_u a_v) +# ---------------------------------------------------------------------- +def sample_embeddings_structured(batch, U, d, d_c, a, rng): + """Shared content c lives in the FIRST d_c coordinates (unit norm there); + private p_u are mutually orthogonal unit vectors in the remaining d-d_c. + e_u = a_u * [c; 0] + sqrt(1-a_u^2) * [0; p_u] + Returns e (batch,U,d), c (batch,d_c), p (batch,U,d-d_c).""" + a = np.broadcast_to(np.asarray(a, float), (U,)) + e = np.zeros((batch, U, d)) + c_all = np.zeros((batch, d_c)) + p_all = np.zeros((batch, U, d - d_c)) + for b in range(batch): + c = rng.standard_normal(d_c) + c /= np.linalg.norm(c) + G = rng.standard_normal((d - d_c, U)) + Q, _ = np.linalg.qr(G) # orthonormal private dirs + c_all[b] = c + for u in range(U): + p_all[b, u] = Q[:, u] + e[b, u, :d_c] = a[u] * c + e[b, u, d_c:] = math.sqrt(1.0 - a[u] ** 2) * Q[:, u] + return e, c_all, p_all + + +# ---------------------------------------------------------------------- +# Receivers (all consume the matched-filter outputs `tilde`) +# ---------------------------------------------------------------------- +def lmmse_matrices(B, h, sigma2, d): + """Return (W, Eerr) for one sample: W (U,U), Eerr (U,U) per-dim error cov.""" + H = np.diag(h) + Hi = np.diag(1.0 / h) + Gamma = Hi @ B @ H + Cx = B / d + Cn = sigma2 * (Hi @ B @ Hi) + S = Gamma @ Cx @ Gamma.T + Cn + W = Cx @ Gamma.T @ np.linalg.solve(S.T, np.eye(len(h))).T # Cx Γ^T S^{-1} + Eerr = Cx - W @ Gamma @ Cx + return W, Eerr + + +def demux_lmmse(tilde, B, h, rho): + """B-aware LMMSE. Returns (e_hat_raw, closed-form per-user MSE avg over batch).""" + batch, U, d = tilde.shape + sigma2 = 1.0 / rho + out = np.empty_like(tilde) + mse_cf = np.zeros(U) + for b in range(batch): + W, Eerr = lmmse_matrices(B, h[b], sigma2, d) + out[b] = W @ tilde[b] + mse_cf += d * np.diag(Eerr) + return out, mse_cf / batch + + +def demux_sr_raw(tilde, B, h): + """SR (AA-EDMA) without normalization, for raw-MSE comparison.""" + batch, U, d = tilde.shape + out = np.empty_like(tilde) + for b in range(batch): + H = np.diag(h[b]) + Gamma = np.linalg.inv(H) @ B @ H + out[b] = np.linalg.solve(Gamma, tilde[b]) + return out + + +def sr_mse_closed(B, h, rho, d): + """d * sigma^2 [B^{-1}]_uu / h_u^2, averaged over batch of h.""" + Binv_uu = np.diag(np.linalg.inv(B)) + return (d / rho) * (Binv_uu[None, :] / h ** 2).mean(axis=0) + + +def demux_sc_mrc(tilde, h): + """Pure combining (SC endpoint): every user gets the h^2-weighted sum of + all matched-filter outputs (MRC under the fully-shared hypothesis).""" + w = h ** 2 # (batch,U) + w = w / w.sum(axis=1, keepdims=True) + comb = np.einsum('bu,bud->bd', w, tilde) # (batch,d) + return np.repeat(comb[:, None, :], tilde.shape[1], axis=1) + + +def demux_odr(tilde, B, h, rho, a, d_c): + """Oracle decomposition receiver: knows the fixed shared subspace + (first d_c coords), a and h. + shared: BLUE-combine the U looks at c, then Wiener shrink + private: SR (Gamma^{-1}) on the complement, then Wiener shrink + recombine e_hat_u = a_u c_hat + g_hat_u.""" + batch, U, d = tilde.shape + sigma2 = 1.0 / rho + a = np.broadcast_to(np.asarray(a, float), (U,)) + out = np.empty_like(tilde) + for b in range(batch): + hb = h[b] + Hi = np.diag(1.0 / hb) + Gamma = np.diag(1.0 / hb) @ B @ np.diag(hb) + Cn = sigma2 * (Hi @ B @ Hi) # per-dim MF noise cov + # ---- shared part: z_u = gamma_u * c + n_u on first d_c dims + gamma = np.array([ + a[u] + sum(B[u, v] * a[v] * hb[v] / hb[u] for v in range(U) if v != u) + for u in range(U) + ]) + Z = tilde[b, :, :d_c] # (U, d_c) + Cn_inv = np.linalg.inv(Cn) + denom = gamma @ Cn_inv @ gamma + if denom > 1e-12: # beta=0 -> no shared part + c_hat = (gamma @ Cn_inv @ Z) / denom # BLUE, (d_c,) + # Wiener shrink: per-dim signal var 1/d_c, BLUE error var 1/denom + shrink_c = (1.0 / d_c) / (1.0 / d_c + 1.0 / denom) + c_hat = shrink_c * c_hat + else: + c_hat = np.zeros(d_c) + # ---- private part: SR on the complement + Gp = np.linalg.solve(Gamma, tilde[b, :, d_c:]) # (U, d-d_c) est of g_u + Binv = np.linalg.inv(B) + for u in range(U): + sig_p = 1.0 - a[u] ** 2 # ||g_u||^2 + err_p = (d - d_c) * sigma2 * Binv[u, u] / hb[u] ** 2 + shrink_p = sig_p / (sig_p + err_p) + out[b, u, :d_c] = a[u] * c_hat + out[b, u, d_c:] = shrink_p * Gp[u] + return out + + +# ---------------------------------------------------------------------- +# Evaluation helpers +# ---------------------------------------------------------------------- +def eval_all(e, tilde, h, B, rho, a, d_c, with_odr=True): + """Return dict name -> (nmse_raw, cos, ser) plus closed forms.""" + d = e.shape[2] + res = {} + + def add(name, e_hat_raw): + nmse = ((e_hat_raw - e) ** 2).sum(-1).mean() + e_n = e_hat_raw / (np.linalg.norm(e_hat_raw, axis=2, keepdims=True) + 1e-12) + cos, _, ser = metrics(e_n, e, tau=TAU) + res[name] = dict(nmse=float(nmse), cos=cos, ser=ser) + + add("MF (TIN)", tilde.copy()) + add("SR (AA-EDMA)", demux_sr_raw(tilde, B, h)) + add("SC (MRC)", demux_sc_mrc(tilde, h)) + lm, mse_cf = demux_lmmse(tilde, B, h, rho) + add("LMMSE (proposed)", lm) + res["LMMSE (proposed)"]["nmse_cf"] = float(mse_cf.mean()) + res["SR (AA-EDMA)"]["nmse_cf"] = float(sr_mse_closed(B, h, rho, d).mean()) + if with_odr: + add("ODR (oracle)", demux_odr(tilde, B, h, rho, a, d_c)) + return res + + +def run_sweep(betas, rho, U=4, d=64, d_c=16, batch=3000, seed=0): + rng = np.random.default_rng(seed) + rows = [] + for beta in betas: + a = math.sqrt(beta) * np.ones(U) + B = affinity_matrix(a) + e, _, _ = sample_embeddings_structured(batch, U, d, d_c, a, rng) + tilde, h = matched_filter(e, B, rho, rng, fading=True) + res = eval_all(e, tilde, h, B, rho, a, d_c) + rows.append((beta, res)) + lm, sr = res["LMMSE (proposed)"], res["SR (AA-EDMA)"] + print(f"beta={beta:4.2f} | LMMSE nmse {lm['nmse']:.4f} (cf {lm['nmse_cf']:.4f}) " + f"cos {lm['cos']:.3f} | SR nmse {sr['nmse']:.4f} (cf {sr['nmse_cf']:.4f}) " + f"cos {sr['cos']:.3f} | SC cos {res['SC (MRC)']['cos']:.3f} " + f"| ODR cos {res['ODR (oracle)']['cos']:.3f}") + return rows + + +def run_snr_sweep(beta, rhos_db, U=4, d=64, d_c=16, batch=3000, seed=1): + rng = np.random.default_rng(seed) + a = math.sqrt(beta) * np.ones(U) + B = affinity_matrix(a) + rows = [] + for rdb in rhos_db: + rho = 10 ** (rdb / 10) + e, _, _ = sample_embeddings_structured(batch, U, d, d_c, a, rng) + tilde, h = matched_filter(e, B, rho, rng, fading=True) + res = eval_all(e, tilde, h, B, rho, a, d_c) + rows.append((rdb, res)) + print(f"SNR={rdb:3d} dB | " + " | ".join( + f"{k.split(' ')[0]} cos {v['cos']:.3f} ser {v['ser']:.3f}" + for k, v in res.items())) + return rows + + +# ---------------------------------------------------------------------- +# Endpoint checks (Proposition 1 (i)-(iii)) +# ---------------------------------------------------------------------- +def endpoint_checks(U=4, d=64, seed=2): + rng = np.random.default_rng(seed) + print("\n=== Endpoint checks ===") + # (i) high SNR: W* -> Gamma^{-1} + beta = 0.4 + a = math.sqrt(beta) * np.ones(U) + B = affinity_matrix(a) + h = np.clip(np.abs((rng.standard_normal(U) + 1j * rng.standard_normal(U)) / math.sqrt(2)), 0.2, None) + for rdb in (10, 40, 80): + W, _ = lmmse_matrices(B, h, 10 ** (-rdb / 10), d) + Ginv = np.linalg.inv(np.diag(1 / h) @ B @ np.diag(h)) + rel = np.linalg.norm(W - Ginv) / np.linalg.norm(Ginv) + print(f"(i) rho={rdb:2d} dB : ||W*-Gamma^-1||_F/||Gamma^-1||_F = {rel:.2e}") + # (ii) beta=0: off-diagonal of W* vanishes, diagonal = Wiener + W0, _ = lmmse_matrices(np.eye(U), h, 0.1, d) + off = np.abs(W0 - np.diag(np.diag(W0))).max() + wiener = h ** 2 / (h ** 2 + d * 0.1) + diag_err = np.abs(np.diag(W0) - wiener).max() + print(f"(ii) beta=0 : max|offdiag W*| = {off:.2e}, max|diag - Wiener| = {diag_err:.2e}") + # (iii) beta->1: W* row ~ rank-1 combining; compare to SC weights h^2-normalized + a1 = math.sqrt(0.999) * np.ones(U) + B1 = affinity_matrix(a1) + W1, _ = lmmse_matrices(B1, h, 0.1, d) + r = W1[0] * h # undo the h_v/h_u structure: effective combining weights on h_v e_v looks + r = np.abs(r) / np.abs(r).sum() + mrc = h ** 2 / (h ** 2).sum() + print(f"(iii) beta=.999 : normalized row-0 weights {np.round(r,3)} vs MRC {np.round(mrc,3)}") + + +# ---------------------------------------------------------------------- +# Figures +# ---------------------------------------------------------------------- +def plot_all(rows_beta, rows_snr, rho_db, beta_mid): + import matplotlib + matplotlib.use("Agg") + import matplotlib.pyplot as plt + + names = ["MF (TIN)", "SR (AA-EDMA)", "SC (MRC)", "LMMSE (proposed)", "ODR (oracle)"] + styles = {"MF (TIN)": ("0.6", ":", "v"), + "SR (AA-EDMA)": ("tab:red", "--", "s"), + "SC (MRC)": ("tab:green", "-.", "^"), + "LMMSE (proposed)": ("tab:blue", "-", "o"), + "ODR (oracle)": ("k", ":", "d")} + + betas = [b for b, _ in rows_beta] + + # Fig 1: NMSE vs beta + closed-form overlays + fig, ax = plt.subplots(figsize=(6.4, 4.6)) + for n in names: + c, ls, mk = styles[n] + ax.semilogy(betas, [r[n]["nmse"] for _, r in rows_beta], ls, color=c, marker=mk, + ms=4, label=n) + ax.semilogy(betas, [r["LMMSE (proposed)"]["nmse_cf"] for _, r in rows_beta], + 'x', color="tab:blue", ms=9, mew=2, label="LMMSE closed form") + ax.semilogy(betas, [r["SR (AA-EDMA)"]["nmse_cf"] for _, r in rows_beta], + '+', color="tab:red", ms=10, mew=2, label="SR closed form") + ax.set_xlabel(r"semantic affinity $\beta$") + ax.set_ylabel("NMSE") + ax.set_title(f"NMSE vs affinity (U=4, d=64, SNR={rho_db} dB)") + ax.grid(True, which="both", alpha=0.3) + ax.legend(fontsize=8) + fig.tight_layout() + fig.savefig(os.path.join(OUT, "fig1_nmse_vs_beta.png"), dpi=160) + + # Fig 2: cosine + SER vs beta + fig, axes = plt.subplots(1, 2, figsize=(11, 4.4)) + for n in names: + c, ls, mk = styles[n] + axes[0].plot(betas, [r[n]["cos"] for _, r in rows_beta], ls, color=c, marker=mk, ms=4, label=n) + axes[1].semilogy(betas, [max(r[n]["ser"], 1e-4) for _, r in rows_beta], ls, color=c, marker=mk, ms=4, label=n) + axes[0].set_xlabel(r"$\beta$"); axes[0].set_ylabel("mean cosine"); axes[0].grid(alpha=0.3) + axes[1].set_xlabel(r"$\beta$"); axes[1].set_ylabel(f"SER (tau={TAU})"); axes[1].grid(True, which="both", alpha=0.3) + axes[0].legend(fontsize=8) + fig.suptitle(f"Cosine recovery / SER vs affinity (U=4, d=64, SNR={rho_db} dB)") + fig.tight_layout() + fig.savefig(os.path.join(OUT, "fig2_cos_ser_vs_beta.png"), dpi=160) + + # Fig 3: SNR sweep at intermediate beta + rhos = [r for r, _ in rows_snr] + fig, ax = plt.subplots(figsize=(6.4, 4.6)) + for n in names: + c, ls, mk = styles[n] + ax.semilogy(rhos, [max(r[n]["ser"], 1e-4) for _, r in rows_snr], ls, color=c, marker=mk, ms=4, label=n) + ax.set_xlabel("SNR (dB)"); ax.set_ylabel(f"SER (tau={TAU})") + ax.set_title(f"SER vs SNR at intermediate affinity beta={beta_mid}") + ax.grid(True, which="both", alpha=0.3); ax.legend(fontsize=8) + fig.tight_layout() + fig.savefig(os.path.join(OUT, "fig3_ser_vs_snr.png"), dpi=160) + print(f"\nFigures saved to {OUT}") + + +if __name__ == "__main__": + RHO_DB = 10 + BETAS = [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.95, 0.99] + print(f"=== beta sweep @ {RHO_DB} dB ===") + rows_beta = run_sweep(BETAS, 10 ** (RHO_DB / 10)) + BETA_MID = 0.4 + print(f"\n=== SNR sweep @ beta={BETA_MID} ===") + rows_snr = run_snr_sweep(BETA_MID, list(range(0, 21, 4))) + endpoint_checks() + plot_all(rows_beta, rows_snr, RHO_DB, BETA_MID) diff --git a/code/replot_all.py b/code/replot_all.py new file mode 100644 index 0000000..95de0ae --- /dev/null +++ b/code/replot_all.py @@ -0,0 +1,268 @@ +"""Regenerate all paper figures from the CSVs in ../data with +publication-quality layout (no legend/curve overlap, consistent styling, +conventional-scheme baselines included). + +This is the canonical figure generator; experiment scripts write the CSVs. +""" +import csv +import os +import numpy as np +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt + +HERE = os.path.dirname(os.path.abspath(__file__)) +FIG = os.path.join(HERE, "..", "fig") +DATA = os.path.join(HERE, "..", "data") + +plt.rcParams.update({ + "font.size": 8.5, + "axes.labelsize": 8.5, + "legend.fontsize": 6.5, + "xtick.labelsize": 8, + "ytick.labelsize": 8, + "lines.linewidth": 1.15, + "lines.markersize": 3.2, +}) + + +FIGW, FIGH = 2.9, 2.25 +AXRECT = [0.185, 0.18, 0.77, 0.7444] # exact 8:6 axes box, identical everywhere + + +def new_fig(): + """Canvas and axes rectangle identical for every figure, so every plot + box renders at exactly the same size in the paper.""" + fig = plt.figure(figsize=(FIGW, FIGH)) + ax = fig.add_axes(AXRECT) + return fig, ax + + +def load(name): + with open(os.path.join(DATA, name)) as f: + return list(csv.DictReader(f)) + + +def savefig(fig, name): + fig.savefig(os.path.join(FIG, name)) + print("saved", name) + + +S = {"OMA": ("0.45", ":", "v"), "NOMA": ("tab:brown", ":", "P"), + "SR": ("tab:red", "--", "s"), "SC": ("tab:green", "-.", "^"), + "LMMSE": ("tab:blue", "-", "o"), "DR": ("k", "-", "d")} +LBL = {"OMA": "OMA", "NOMA": "NOMA-SIC", "SR": "SR", + "SC": "SC", "LMMSE": "LMMSE", "DR": "Proposed DR"} +ORDER = ["OMA", "NOMA", "SR", "SC", "LMMSE", "DR"] + +# ---------------------------------------------------------------- E1 beta +rows = load("e1_beta.csv") +betas = [float(r["beta"]) for r in rows] + +fig, ax = new_fig() +for n in ORDER: + c, ls, mk = S[n] + ax.semilogy(betas, [float(r[f"{n}_nmse"]) for r in rows], ls, color=c, + marker=mk, label=LBL[n]) +ax.semilogy(betas, [float(r["LMMSE_cf"]) for r in rows], 'x', + color="tab:blue", ms=6.5, mew=1.5, ls="none", + label="LMMSE closed form") +ax.semilogy(betas, [float(r["SR_cf"]) for r in rows], '+', color="tab:red", + ms=7.5, mew=1.5, ls="none", label="SR closed form") +ax.set_xlabel(r"affinity $\beta$") +ax.set_ylabel("NMSE") +ax.set_ylim(6e-2, 8e6) +ax.grid(True, which="both", alpha=0.3) +ax.legend(loc="upper left", ncol=2, columnspacing=0.7, handletextpad=0.4, + labelspacing=0.3) +savefig(fig, "fig_e1_beta_nmse.pdf") + +fig, ax = new_fig() +for n in ORDER: + c, ls, mk = S[n] + ax.plot(betas, [float(r[f"{n}_cos"]) for r in rows], ls, color=c, + marker=mk, label=LBL[n]) +ax.set_xlabel(r"affinity $\beta$") +ax.set_ylabel("mean cosine recovery") +ax.set_ylim(0.0, 1.05) +ax.grid(alpha=0.3) +ax.legend(loc="upper left", ncol=2, columnspacing=0.7, handletextpad=0.4, + labelspacing=0.3) +savefig(fig, "fig_e1_beta_cos.pdf") + +# ---------------------------------------------------------------- E1 snr +rows = load("e1_snr.csv") +snrs = [float(r["snr"]) for r in rows] +fig, ax = new_fig() +for n in ORDER: + c, ls, mk = S[n] + ax.semilogy(snrs, [max(float(r[f"{n}_ser"]), 1e-4) for r in rows], ls, + color=c, marker=mk, label=LBL[n]) +ax.set_xlabel("per-user SNR (dB)") +ax.set_ylabel("semantic error rate") +ax.set_ylim(8e-4, 2.5) +ax.grid(True, which="both", alpha=0.3) +ax.legend(loc="lower left", ncol=1, fontsize=6.1, handletextpad=0.4, + labelspacing=0.25, borderpad=0.3) +savefig(fig, "fig_e1_snr.pdf") + +# ---------------------------------------------- E2 spectrum (multi-curve) +rows_s = load("e2_spectrum_multi.csv") +fig, ax = new_fig() +for n_cal, c, ls in ((100, "tab:orange", "-."), (400, "tab:green", "--"), + (1600, "tab:blue", "-")): + pts = [(int(r["idx"]), float(r["eig"])) for r in rows_s + if int(r["N"]) == n_cal] + ax.semilogy([p[0] for p in pts], + np.maximum([p[1] for p in pts], 1e-12), ls, color=c, + lw=1.15, label=f"$N{{=}}{n_cal}$") +ax.axvline(128, color="k", ls=":", lw=0.9) +ax.annotate(r"$d_c=128$", xy=(128, 1e-6), xytext=(150, 3e-7), fontsize=7.5, + arrowprops=dict(arrowstyle="-", lw=0.6, color="0.3")) +ax.set_xlabel("eigenvalue index") +ax.set_ylabel(r"eigenvalue of $\hat{\mathbf{\Sigma}}$") +ax.set_ylim(1e-8, 3e-1) +ax.grid(True, which="both", alpha=0.3) +ax.legend(loc="upper right", labelspacing=0.3) +savefig(fig, "fig_e2_spectrum.pdf") + +# ---------------------------------------------- E2 subspace (multi-curve) +rows_n = load("e2_subspace_multi.csv") +fig, ax = new_fig() +for Um, c, mk, ls in ((2, "tab:orange", "s", "-."), + (4, "tab:blue", "o", "-"), + (8, "tab:green", "^", "--")): + pts = [(int(r["N"]), float(r["err"])) for r in rows_n + if int(r["U"]) == Um] + ax.loglog([p[0] for p in pts], [p[1] for p in pts], ls, color=c, + marker=mk, label=f"$U{{=}}{Um}$") +ax.set_xlabel("paired calibration samples $N$") +ax.set_ylabel("subspace recovery error") +ax.grid(True, which="both", alpha=0.3) +ax.legend(loc="upper right", labelspacing=0.3) +savefig(fig, "fig_e2_subspace.pdf") + +# ---------------------------------------------------------------- E2 ladder +rows = load("e2_ladder.csv") +snrs = [float(r["snr"]) for r in rows] +S2 = {"OMA": ("0.45", ":", "v", "OMA"), + "NOMA": ("tab:brown", ":", "P", "NOMA-SIC"), + "LMMSE": ("tab:blue", "-", "o", "LMMSE"), + "DR-spec": ("tab:orange", "--", "s", "DR + spectral"), + "DR-adapt": ("tab:purple", "-", "^", "DR + adapter"), + "DR-oracle": ("k", ":", "d", "DR + oracle basis")} +fig, ax = new_fig() +for k, (c, ls, mk, lb) in S2.items(): + ax.semilogy(snrs, [max(float(r[f"{k}_ser"]), 1e-4) for r in rows], ls, + color=c, marker=mk, label=lb) +ax.set_xlabel("per-user SNR (dB)") +ax.set_ylabel("semantic error rate") +ax.set_ylim(3e-3, 2.7) +ax.grid(True, which="both", alpha=0.3) +ax.legend(loc="lower left", labelspacing=0.3) +savefig(fig, "fig_e2_ladder.pdf") + +# ---------------------------------------------------------------- E3 time +rows = load("e3_timeseries.csv") +T = len(rows) +t = np.arange(T) +U = 4 +METHODS = ["OMA", "NOMA", "SR", "SC", "LMMSE", "DR-static", "DR-tracked", + "DR-genie"] +S3 = {"DR-genie": ("k", ":"), "DR-tracked": ("tab:purple", "-"), + "DR-static": ("tab:orange", "--"), "SR": ("tab:red", "--"), + "SC": ("tab:green", "-."), "LMMSE": ("tab:blue", "-"), + "OMA": ("0.45", ":"), "NOMA": ("tab:brown", ":")} + + +def roll(x, w=15): + """Moving average with edge-truncated windows (no zero-padding bias: + endpoints average only the samples that exist).""" + x = np.asarray(x, float) + num = np.convolve(x, np.ones(w), mode="same") + den = np.convolve(np.ones_like(x), np.ones(w), mode="same") + return num / den + + +fig = plt.figure(figsize=(2.9, 4.2)) +_bh = 0.77 * 2.9 * 0.75 / 4.2 # same physical box height as new_fig +axes = [fig.add_axes([0.185, 0.549, 0.77, _bh]), + fig.add_axes([0.185, 0.095, 0.77, _bh])] +axes[0].tick_params(labelbottom=False) +from matplotlib.lines import Line2D +for u in range(U): + axes[0].plot(t, [float(r[f"a{u}"]) for r in rows], lw=1.1, color=f"C{u}") + axes[0].plot(t, [float(r[f"ahat{u}"]) for r in rows], lw=0.9, ls="--", + color=f"C{u}", alpha=0.75) +axes[0].set_ylabel("share coefficient $a_u(t)$") +axes[0].set_ylim(0, 1.22) +axes[0].legend(handles=[ + Line2D([], [], color="k", ls="-", lw=1.1, label="true"), + Line2D([], [], color="k", ls="--", lw=0.9, label="tracked")], + loc="upper right", ncol=2, columnspacing=0.8) +axes[0].grid(alpha=0.3) +for m in METHODS: + c, ls = S3[m] + axes[1].semilogy(t, np.clip(roll([float(r[f"{m}_ser"]) for r in rows]), + 1e-3, None), ls, color=c, label=m) +axes[1].set_xlabel("time slot $t$") +axes[1].set_ylabel("semantic error rate") +axes[1].set_ylim(2e-2, 30) +axes[1].grid(True, which="both", alpha=0.3) +axes[1].legend(loc="upper center", ncol=3, columnspacing=0.7, + handletextpad=0.4, labelspacing=0.3, fontsize=6) +savefig(fig, "fig_e3_time.pdf") + +# ---------------------------------------------------------------- E3 speed +rows = load("e3_speed.csv") +speeds = [float(r["speed"]) for r in rows] +marks = {"DR-genie": "d", "DR-tracked": "^", "DR-static": "s", + "SR": "v", "SC": "x", "LMMSE": "o", "OMA": "1", "NOMA": "P"} +fig, ax = new_fig() +for m in METHODS: + c, ls = S3[m] + ax.semilogy(speeds, [max(float(r[f"{m}_ser"]), 1e-4) for r in rows], ls, + color=c, marker=marks[m], label=m) +ax.set_xlabel("user speed (m/slot)") +ax.set_ylabel("mean semantic error rate") +ax.set_ylim(0.1, 40) +ax.grid(True, which="both", alpha=0.3) +ax.legend(loc="upper center", ncol=3, columnspacing=0.6, handletextpad=0.3, + handlelength=1.4, labelspacing=0.25, fontsize=5.8, borderpad=0.3) +savefig(fig, "fig_e3_speed.pdf") + +# ---------------------------------------------------------------- E4 +rows = load("e4_mismatch.csv") +fig, ax = new_fig() +for snr_db, c, mk in ((5, "tab:red", "s"), (10, "tab:blue", "o"), + (15, "tab:green", "^")): + pts = [(float(r["delta"]), float(r["cos"])) for r in rows + if int(r["snr"]) == snr_db] + ax.plot([p[0] for p in pts], [p[1] for p in pts], "-", color=c, + marker=mk, label=f"{snr_db} dB") +ax.set_xlabel(r"affinity estimation error $\delta$") +ax.set_ylabel("mean cosine recovery") +ax.set_ylim(0.40, 1.0) +ax.grid(alpha=0.3) +ax.legend(loc="upper center", ncol=3, columnspacing=0.9, handletextpad=0.4, + borderpad=0.3) +savefig(fig, "fig_e4_mismatch.pdf") + +# ---------------------------------------------------------------- E5 +rows = load("e5_learned.csv") +betas5 = [float(r["beta"]) for r in rows] +fig, ax = new_fig() +S5 = {"Learned": ("tab:red", "--", "s", "learned attention"), + "LMMSE": ("tab:blue", "-", "o", "LMMSE"), + "DR": ("k", "-", "d", "Proposed DR")} +for k, (c, ls, mk, lb) in S5.items(): + ax.semilogy(betas5, [max(float(r[f"{k}_ser"]), 1e-3) for r in rows], ls, + color=c, marker=mk, label=lb) +ax.set_xlabel(r"affinity $\beta$") +ax.set_ylabel("semantic error rate") +ax.set_ylim(8e-3, 3.2) +ax.grid(True, which="both", alpha=0.3) +ax.legend(loc="lower left", labelspacing=0.3) +savefig(fig, "fig_e5_learned.pdf") + +print("all figures regenerated") diff --git a/code/semantic_mac.py b/code/semantic_mac.py new file mode 100644 index 0000000..2eb0ec5 --- /dev/null +++ b/code/semantic_mac.py @@ -0,0 +1,377 @@ +""" +Core library for the TMC paper: + "Structured Shared-Private Embedding Multiplexing for Semantic Multiple + Access in Dynamic Mobile Networks" + +Builds on the published shared-embedding multiple-access framework +(Lee, Choi, Lee, IEEE JSAC 2026, doi 10.1109/JSAC.2025.3643816). + +Pipeline modeled here +--------------------- +1. Content model (shared-scene decomposition), latent frame: + z_u = a_u [c; 0] + sqrt(1-a_u^2) [0; p_u] (structured latent) + c in R^{d_c}: shared scene content, p_u in R^{d-d_c}: private content. + A frozen foundation encoder outputs RAW embeddings x_u = R z_u with an + unknown orthogonal mixing R (the encoder's arbitrary basis) -- the + structure is present but hidden in the coordinates. + +2. Matched-filter MAC front end (identical to the JSAC/AA-EDMA line): + tilde_x_u = x_u + sum_{v!=u} beta_uv (h_v/h_u) x_v + n_u, + Cov(n_u,n_w) = sigma^2 B_uw/(h_u h_w) I_d, sigma^2 = 1/rho. + +3. Receivers: SR (cancel), SC (combine), B-aware LMMSE (optimal linear, + isotropic prior), and the decomposition receiver DR that knows the + shared-subspace basis V_c: BLUE-combining on the shared block + + SR cancellation and Wiener shrinkage on the private complement. + +4. Embedding-structure optimization: closed-form spectral recovery of V_c + from the cross-covariance of paired clean embeddings (GCCA-style), and a + channel-in-the-loop learned linear adapter refining it. + +5. Mobility: time-varying a_u(t) from user trajectories around a scene, and + a decision-directed EWMA affinity tracker. +""" +from __future__ import annotations +import math +import numpy as np + +TAU = 0.45 # SER threshold on cosine (same operating definition as prior work) + + +def set_seed(seed: int): + np.random.seed(seed) + + +# ---------------------------------------------------------------------- +# Affinity utilities +# ---------------------------------------------------------------------- +def affinity_matrix(a: np.ndarray) -> np.ndarray: + """B_uv = a_u a_v (u != v), B_uu = 1.""" + a = np.asarray(a, dtype=np.float64) + B = np.outer(a, a) + np.fill_diagonal(B, 1.0) + return B + + +# ---------------------------------------------------------------------- +# Content generators +# ---------------------------------------------------------------------- +def sample_latents_isotropic(batch, U, d, d_c, a, rng): + """Structured latents with isotropic random contents (unit norm). + Returns z of shape (batch, U, d): shared block = first d_c coords.""" + a = np.broadcast_to(np.asarray(a, float), (batch, U)) \ + if np.ndim(a) > 1 or np.ndim(a) == 1 else np.full((batch, U), float(a)) + if a.shape != (batch, U): + a = np.broadcast_to(np.asarray(a, float), (batch, U)) + z = np.zeros((batch, U, d)) + c = rng.standard_normal((batch, d_c)) + c /= np.linalg.norm(c, axis=1, keepdims=True) + p = rng.standard_normal((batch, U, d - d_c)) + p /= np.linalg.norm(p, axis=2, keepdims=True) + z[:, :, :d_c] = a[:, :, None] * c[:, None, :] + z[:, :, d_c:] = np.sqrt(1.0 - a[:, :, None] ** 2) * p + return z + + +class EmbeddingPool: + """Real PLM embedding pool (e.g., BERT AG-News, 8000 x 768). + Centered + unit-normalized; provides PCA coordinates so that structured + latents can be built from real semantic content.""" + + def __init__(self, X: np.ndarray): + X = np.asarray(X, dtype=np.float64) + self.mu = X.mean(axis=0, keepdims=True) + Xc = X - self.mu + Xc /= np.linalg.norm(Xc, axis=1, keepdims=True) + self.X = Xc + # PCA basis of the (centered, normalized) pool + _, S, Vt = np.linalg.svd(Xc, full_matrices=False) + self.pca = Vt # (d, d) rows = principal directions + self.spectrum = S ** 2 / len(Xc) + self.N, self.d = Xc.shape + + def pca_coords(self, idx, k): + """Top-k PCA coordinates of pool items idx, renormalized to unit.""" + Y = self.X[idx] @ self.pca[:k].T + return Y / (np.linalg.norm(Y, axis=1, keepdims=True) + 1e-12) + + +def sample_latents_pool(pool: EmbeddingPool, batch, U, d, d_c, a, rng, + idx_pool=None): + """Structured latents whose shared/private contents are REAL embeddings: + shared c = top-d_c PCA coords of one pool sentence, private p_u = + top-(d-d_c) PCA coords of distinct other sentences. + + idx_pool: optional index array restricting which pool sentences may be + drawn (train/holdout partition); None draws from the whole pool.""" + a = np.broadcast_to(np.asarray(a, float), (U,)) + choices = np.arange(pool.N) if idx_pool is None else np.asarray(idx_pool) + idx = np.array([rng.choice(choices, size=U + 1, replace=False) + for _ in range(batch)]) + c = pool.pca_coords(idx[:, 0], d_c) # (batch, d_c) + z = np.zeros((batch, U, d)) + for u in range(U): + p = pool.pca_coords(idx[:, u + 1], d - d_c) + z[:, u, :d_c] = a[u] * c + z[:, u, d_c:] = math.sqrt(1.0 - a[u] ** 2) * p + return z + + +def random_orthogonal(d, rng): + G = rng.standard_normal((d, d)) + Q, Rr = np.linalg.qr(G) + Q *= np.sign(np.diag(Rr)) + return Q + + +# ---------------------------------------------------------------------- +# Matched-filter MAC front end (JSAC / AA-EDMA convention) +# ---------------------------------------------------------------------- +def matched_filter(e, B, rho, rng, fading=True): + """tilde_u = sum_v (h_v/h_u) B_uv e_v + n_u, + Cov(n_u,n_w) = (sigma^2 B_uw / (h_u h_w)) I_d. Returns (tilde, h).""" + batch, U, d = e.shape + sigma2 = 1.0 / rho + B = np.asarray(B, dtype=np.float64) + if B.ndim == 2: + B = np.broadcast_to(B, (batch, U, U)) + if fading: + hc = (rng.standard_normal((batch, U)) + + 1j * rng.standard_normal((batch, U))) / math.sqrt(2) + h = np.clip(np.abs(hc), 0.2, None) + else: + h = np.ones((batch, U)) + tilde = np.einsum('buv,bvd,bv,bu->bud', B, e, h, 1.0 / h) + xi = rng.standard_normal((batch, U, d)) * math.sqrt(sigma2) + for b in range(batch): + A = np.linalg.cholesky(B[b]) + tilde[b] += (A @ xi[b]) / h[b][:, None] + return tilde, h + + +# ---------------------------------------------------------------------- +# Receivers +# ---------------------------------------------------------------------- +def demux_sr(tilde, B, h): + """Similarity-rejecting closed-form demux: (Gamma^{-1} (x) I) tilde.""" + batch, U, d = tilde.shape + out = np.empty_like(tilde) + for b in range(batch): + Gamma = np.diag(1.0 / h[b]) @ B @ np.diag(h[b]) + out[b] = np.linalg.solve(Gamma, tilde[b]) + return out + + +def demux_sc(tilde, h): + """Similarity-combining endpoint: h^2-weighted MRC of all MF outputs.""" + w = h ** 2 + w = w / w.sum(axis=1, keepdims=True) + comb = np.einsum('bu,bud->bd', w, tilde) + return np.repeat(comb[:, None, :], tilde.shape[1], axis=1) + + +def lmmse_matrices(B, h, sigma2, d): + H = np.diag(h) + Hi = np.diag(1.0 / h) + Gamma = Hi @ B @ H + Cx = B / d + Cn = sigma2 * (Hi @ B @ Hi) + S = Gamma @ Cx @ Gamma.T + Cn + W = np.linalg.solve(S.T, (Cx @ Gamma.T).T).T + Eerr = Cx - W @ Gamma @ Cx + return W, Eerr + + +def demux_lmmse(tilde, B, h, rho): + """B-aware LMMSE (optimal linear receiver under isotropic prior). + Returns (estimates, closed-form per-user total MSE averaged over batch).""" + batch, U, d = tilde.shape + sigma2 = 1.0 / rho + out = np.empty_like(tilde) + mse_cf = np.zeros(U) + for b in range(batch): + W, Eerr = lmmse_matrices(B, h[b], sigma2, d) + out[b] = W @ tilde[b] + mse_cf += d * np.diag(Eerr) + return out, mse_cf / batch + + +def demux_dr(tilde, B, h, rho, a, Vc): + """Decomposition receiver (proposed). + + Vc: (d, d_c) orthonormal basis of the shared subspace (from the + embedding-structure optimizer; oracle = true mixing columns). + Shared block: BLUE-combining of the U looks at the common content, + followed by Wiener shrinkage. Private complement: SR cancellation + + per-user Wiener shrinkage. Recombine.""" + batch, U, d = tilde.shape + d_c = Vc.shape[1] + sigma2 = 1.0 / rho + a = np.broadcast_to(np.asarray(a, float), (U,)) + Binv = np.linalg.inv(B) + out = np.empty_like(tilde) + Zs = tilde @ Vc # (batch, U, d_c) shared-block obs + Zp = tilde - (Zs @ Vc.T) # complement part (in ambient frame) + for b in range(batch): + hb = h[b] + Hi = np.diag(1.0 / hb) + Gamma = Hi @ B @ np.diag(hb) + Cn = sigma2 * (Hi @ B @ Hi) + gamma = np.array([ + a[u] + sum(B[u, v] * a[v] * hb[v] / hb[u] + for v in range(U) if v != u) for u in range(U)]) + Cn_inv = np.linalg.inv(Cn) + denom = float(gamma @ Cn_inv @ gamma) + if denom > 1e-12: + c_hat = (gamma @ Cn_inv @ Zs[b]) / denom + c_hat *= (1.0 / d_c) / (1.0 / d_c + 1.0 / denom) + else: + c_hat = np.zeros(d_c) + Gp = np.linalg.solve(Gamma, Zp[b]) # SR on the complement + for u in range(U): + sig_p = 1.0 - a[u] ** 2 + err_p = (d - d_c) * sigma2 * Binv[u, u] / hb[u] ** 2 + shrink = sig_p / (sig_p + err_p) if sig_p > 0 else 0.0 + out[b, u] = a[u] * (Vc @ c_hat) + shrink * Gp[u] + return out + + +# ---------------------------------------------------------------------- +# Conventional baselines (orthogonal and power-domain multiple access) +# ---------------------------------------------------------------------- +def oma_observe(e, h, rho, rng): + """Conventional orthogonal MA (OFDMA-style): user u is confined to a + disjoint d/U-dimensional block and decoded only from that block, so it + never sees cross-user interference but its recovery is capped by the + 1/U-energy subspace (cosine ceiling ~ sqrt(1/U)).""" + batch, U, d = e.shape + blk = d // U + sigma = math.sqrt(1.0 / rho) + out = np.zeros_like(e) + for u in range(U): + sl = slice(u * blk, (u + 1) * blk) + out[:, u, sl] = e[:, u, sl] + \ + rng.standard_normal((batch, blk)) * sigma / h[:, u][:, None] + return out + + +def demux_noma_genie(e, h, rho, rng): + """Genie-aided NOMA-SIC upper bound: every user decoded from an + interference-free observation e_u + n/h_u at per-user SNR rho + (perfect cancellation, no error propagation).""" + batch, U, d = e.shape + sigma = math.sqrt(1.0 / rho) + return e + rng.standard_normal(e.shape) * sigma / h[:, :, None] + + +# ---------------------------------------------------------------------- +# Embedding-structure optimization +# ---------------------------------------------------------------------- +def learn_structure_spectral(x_clean, d_c): + """Closed-form shared-subspace recovery from N paired CLEAN embeddings. + + x_clean: (N, U, d) raw (mixed) embeddings of co-located users. + The averaged symmetrized cross-covariance has column space equal to the + shared subspace (private parts are independent and average out). + Returns Vc_hat (d, d_c), eigenvalues (d,).""" + N, U, d = x_clean.shape + M = np.zeros((d, d)) + cnt = 0 + for u in range(U): + for v in range(u + 1, U): + C = x_clean[:, u, :].T @ x_clean[:, v, :] / N + M += C + C.T + cnt += 2 + M /= cnt + w, V = np.linalg.eigh(M) + order = np.argsort(w)[::-1] + return V[:, order[:d_c]], w[order] + + +def subspace_error(Vhat, Vtrue): + """Normalized projection-Frobenius distance in [0,1].""" + P1 = Vhat @ Vhat.T + P2 = Vtrue @ Vtrue.T + k = Vtrue.shape[1] + return float(np.linalg.norm(P1 - P2) / math.sqrt(2 * k)) + + +def estimate_a_from_clean(x_clean, Vc): + """a_u estimate from clean paired data: sqrt(mean shared-block energy).""" + E = np.linalg.norm(x_clean @ Vc, axis=2) ** 2 # (N, U) + return np.sqrt(np.clip(E.mean(axis=0), 0.0, 1.0)) + + +# ---------------------------------------------------------------------- +# Mobility model and online affinity tracking +# ---------------------------------------------------------------------- +def mobility_trajectories(U, T, speed, rng, box=60.0, r_scene=28.0, + a_max=0.95, dt=1.0): + """Random-waypoint trajectories around a scene at the origin. + Returns a_t of shape (T, U): a_u(t) = a_max * exp(-d_u(t)^2 / (2 r^2)).""" + pos = rng.uniform(-box, box, size=(U, 2)) + wp = rng.uniform(-box, box, size=(U, 2)) + a_t = np.zeros((T, U)) + for t in range(T): + for u in range(U): + vec = wp[u] - pos[u] + dist = np.linalg.norm(vec) + if dist < speed * dt: + wp[u] = rng.uniform(-box, box, size=2) + else: + pos[u] += (speed * dt) * vec / dist + d2 = (pos ** 2).sum(axis=1) + a_t[t] = a_max * np.exp(-d2 / (2 * r_scene ** 2)) + return a_t + + +def pilot_affinity_obs(e_clean, h, rho, rng, a_cap=0.95): + """Affinity observation from one orthogonal pilot slot. + + Each user transmits n_p clean embeddings on an interference-free pilot + resource; the receiver observes e_u + n/h_u. Off-diagonal Gram entries + of the pilot observations are unbiased for beta_uv = a_u a_v (independent + noises), so no bias correction is needed. The share coefficients are + then the rank-one alternating-least-squares fit of the off-diagonal + Gram, which uses all pairs jointly.""" + n_p, U, d = e_clean.shape + sigma = math.sqrt(1.0 / rho) + y = e_clean + rng.standard_normal(e_clean.shape) * sigma / h[None, :, None] + G = np.einsum('bud,bvd->buv', y, y).mean(axis=0) + # rank-1 least-squares fit of the off-diagonal Gram: G_uv ~ a_u a_v. + # Alternating least squares; uses all pairs jointly (no small-denominator + # amplification, robust in low-affinity regimes). + mask = ~np.eye(U, dtype=bool) + a = np.sqrt(np.clip(np.abs(G[mask]).reshape(U, U - 1).mean(axis=1), + 1e-4, a_cap ** 2)) + for _ in range(20): + for u in range(U): + others = [v for v in range(U) if v != u] + num = sum(G[u, v] * a[v] for v in others) + den = sum(a[v] ** 2 for v in others) + 1e-9 + a[u] = np.clip(num / den, 0.0, a_cap) + return a + + +class AffinityTracker: + """EWMA tracker of the per-user share coefficients, driven by sparse + orthogonal affinity-pilot observations (every K-th slot).""" + + def __init__(self, U, lam=0.5, a_init=0.3): + self.a = np.full(U, float(a_init)) + self.lam = lam + + def update(self, obs): + self.a = (1 - self.lam) * self.a + self.lam * obs + return self.a.copy() + + +# ---------------------------------------------------------------------- +# Metrics +# ---------------------------------------------------------------------- +def metrics(e_hat, e_true, tau=TAU): + """(mean cosine, NMSE of raw estimate, SER). e_true unit-norm.""" + nmse = ((e_hat - e_true) ** 2).sum(-1).mean() + e_n = e_hat / (np.linalg.norm(e_hat, axis=2, keepdims=True) + 1e-12) + cos = (e_n * e_true).sum(-1) + return float(cos.mean()), float(nmse), float((cos < tau).mean()) diff --git a/data/bert_agnews_8000.pt b/data/bert_agnews_8000.pt new file mode 100644 index 0000000..c87fb52 Binary files /dev/null and b/data/bert_agnews_8000.pt differ diff --git a/data/e1_beta.csv b/data/e1_beta.csv new file mode 100644 index 0000000..32f7c51 --- /dev/null +++ b/data/e1_beta.csv @@ -0,0 +1,13 @@ +beta,OMA_cos,OMA_nmse,OMA_ser,NOMA_cos,NOMA_nmse,NOMA_ser,SR_cos,SR_nmse,SR_ser,SC_cos,SC_nmse,SC_ser,LMMSE_cos,LMMSE_nmse,LMMSE_ser,DR_cos,DR_nmse,DR_ser,LMMSE_cf,SR_cf +0.0,0.1518317330826309,6.586330527939255,0.959625,0.3181139435479019,23.34841450901824,0.7524375,0.3203064428538257,23.363609989171813,0.7501875,0.17164555154884942,3.0238373778749565,0.92575,0.32030644285293924,0.8764057280548786,0.7501875,0.3600089003351096,0.8456005907022793,0.6493125,0.8772111710642737,23.366080084700258 +0.1,0.15589537469644302,6.521926618788019,0.9763125,0.31997502436434877,23.225337129468034,0.754875,0.31284660475379716,23.730001190599637,0.763125,0.23544768908222563,3.4903701062781507,0.8906875,0.3286372303744752,0.8727398586878315,0.7405625,0.35720726032200956,0.8547067798024575,0.6945625,0.8715244945854621,23.72957048015672 +0.2,0.1579600361307968,6.614980306151368,0.987375,0.3185588103483156,23.508441790061838,0.751875,0.3071834075254276,25.664328592045972,0.7783125,0.3081174324577614,4.005316225325675,0.812,0.36550409107776605,0.8499929422094927,0.682125,0.40671100402630883,0.8230295356725337,0.6233125,0.8507143520638605,25.69980387077865 +0.3,0.15717310964229558,6.752916642082322,0.994,0.3164878434145981,23.696387090171708,0.7530625,0.29445075096761586,28.440139195119926,0.8049375,0.3737395538453454,4.6587701688046295,0.6950625,0.4086155050165615,0.8194653748516086,0.5948125,0.4699443359376159,0.7722928549119525,0.417875,0.8201178016615405,28.580023318985315 +0.4,0.1558822753077902,6.6437034711419605,0.978375,0.3164742195632639,23.66478210451729,0.7599375,0.2769676652160525,32.444156006235005,0.8381875,0.4418585784086807,5.390751440360708,0.5049375,0.4613567748591795,0.7761485754085672,0.4405,0.5398910109925175,0.7050765664812834,0.1525,0.7770407374526299,32.48112657790815 +0.5,0.15360527772566732,6.633239860501342,0.944625,0.31715069454661715,23.447958786145506,0.75475,0.25939760032458,37.9029280453721,0.863125,0.5089881795141582,6.112173611529999,0.295125,0.5194020166749006,0.7210471246656404,0.27625,0.6135763351967299,0.6228748060632902,0.040375,0.7210770148831555,37.706128740179714 +0.6,0.15104564175436277,6.618673493235747,0.9116875,0.3190950040803634,23.416481776933132,0.7530625,0.23746214819997877,46.35364132822288,0.9024375,0.5707667910192523,7.18280130135221,0.1493125,0.5758052496354826,0.660406791149609,0.1425625,0.6819684891445188,0.5356249676777529,0.013125,0.6599324369708673,46.1616297815643 +0.7,0.14658858300872607,6.579769667930802,0.8839375,0.32042413207660686,23.514174872716637,0.747625,0.21066438792031572,60.810052175317615,0.9381875,0.6343326125709531,8.10391365259618,0.0605,0.6363145967300298,0.5883586517475555,0.0596875,0.7510884530926762,0.4378598835689139,0.003375,0.5892740628870172,60.610239784779516 +0.8,0.14224189962411288,6.622528089700304,0.863625,0.31737825140661446,23.64121074958681,0.756625,0.17298207341260183,89.9827978067193,0.9758125,0.6877230749032447,9.765603569825602,0.024,0.6882760858443637,0.5202873216426361,0.0241875,0.8130141518262433,0.3422131407972644,0.001,0.5205576308634045,90.28865373539367 +0.9,0.13944820649328607,6.569145530014273,0.845375,0.32012185641929314,23.216830674651195,0.7480625,0.12650489700035406,175.19880610441587,0.99175,0.7479378327622059,11.000473435774282,0.0083125,0.7479995494170205,0.43557216499125984,0.008375,0.8773177840178794,0.2338632107538353,0.00025,0.4365956865370872,175.29563270069005 +0.95,0.13473445421784822,6.815045356624257,0.8416875,0.31610426991277907,23.97238509906978,0.758875,0.08894962614416471,361.0614537517205,0.9975,0.7706709862528589,12.089902333536367,0.0055625,0.7706796603551158,0.40107886284395255,0.0055,0.9057814222318477,0.18350754366484087,0.0,0.40282220832244586,360.92744714649893 +0.99,0.13406057397656254,6.568080314769884,0.8314375,0.31788730006984517,23.26036208135335,0.750875,0.04023444150109489,1749.9325770225032,0.999875,0.7935678421099195,12.769035629640939,0.0036875,0.7935677633822752,0.365692686465036,0.0036875,0.929869722575857,0.13942791833909166,0.0,0.36656833489816454,1753.2181983014361 diff --git a/data/e1_endpoints.txt b/data/e1_endpoints.txt new file mode 100644 index 0000000..fa3bbe9 --- /dev/null +++ b/data/e1_endpoints.txt @@ -0,0 +1,4 @@ +(i) rho=10dB rel_diff_W_vs_Gammainv=9.940e-01 +(i) rho=40dB rel_diff_W_vs_Gammainv=1.771e-01 +(i) rho=80dB rel_diff_W_vs_Gammainv=2.322e-05 +(ii) beta=0 max_offdiag=0.000e+00 max_diag_minus_wiener=2.776e-17 diff --git a/data/e1_snr.csv b/data/e1_snr.csv new file mode 100644 index 0000000..b0faf61 --- /dev/null +++ b/data/e1_snr.csv @@ -0,0 +1,7 @@ +snr,OMA_cos,OMA_nmse,OMA_ser,NOMA_cos,NOMA_nmse,NOMA_ser,SR_cos,SR_nmse,SR_ser,SC_cos,SC_nmse,SC_ser,LMMSE_cos,LMMSE_nmse,LMMSE_ser,DR_cos,DR_nmse,DR_ser +0,0.05350647232668011,58.85600942888945,0.99925,0.10890134987091221,233.83806869578348,0.9959375,0.09517362162512003,317.6743429018145,0.9976875,0.17927412348574373,42.90806295709593,0.98675,0.18449745469042939,0.9630179128139159,0.9833125,0.25411820225537163,0.9315293277360746,0.93525 +4,0.08456820266401209,24.38310213293538,0.9975625,0.17043345938432167,94.4298962129786,0.97325,0.14744124682792525,128.6041916804174,0.9869375,0.26844480706147605,17.938066560437775,0.918375,0.2769703001989752,0.9174622143307749,0.9055625,0.36494032979819524,0.8623869866478949,0.73975 +8,0.12847320402849005,9.94588160014589,0.9883125,0.26116503748884695,36.8529237481926,0.8645,0.22668242977056338,50.22310372984251,0.91925,0.3833396462883285,7.612540791885531,0.678625,0.39792555428763177,0.8321657950063345,0.632625,0.4841163218378676,0.7616303217248894,0.32175 +12,0.18798873630558025,4.4738249745662335,0.9569375,0.38294513861040697,14.962780371484499,0.609875,0.3370208676912972,20.316950947249193,0.7103125,0.5016307965715139,3.7178839382237685,0.3340625,0.5278359362414502,0.709593380592026,0.2794375,0.5942117410027357,0.6439496405799463,0.0543125 +16,0.2582251812343568,2.242220410434714,0.8835,0.5271717432396316,5.9432601195927495,0.3329375,0.4770268495835736,8.119497948199752,0.4200625,0.5972454380791258,2.166496018630578,0.1176875,0.6471520815297644,0.5689058943246919,0.0785,0.6887024096495977,0.5210923893293615,0.0040625 +20,0.33092058522338036,1.3274083828855985,0.7794375,0.6774072574643101,2.314718955325978,0.1501875,0.6286005332183222,3.156716159460809,0.198375,0.658990514110599,1.5281586204071873,0.038125,0.7475910751137647,0.4292425872558179,0.0154375,0.7753764048787856,0.3921981791242343,0.000125 diff --git a/data/e2_caliberr.txt b/data/e2_caliberr.txt new file mode 100644 index 0000000..c208cdc --- /dev/null +++ b/data/e2_caliberr.txt @@ -0,0 +1,2 @@ +spectral_err=0.5066663187245027 +adapter_err=0.47115266508068226 diff --git a/data/e2_exponents.txt b/data/e2_exponents.txt new file mode 100644 index 0000000..40b900d --- /dev/null +++ b/data/e2_exponents.txt @@ -0,0 +1,3 @@ +U=2 exponent=-0.355 +U=4 exponent=-0.466 +U=8 exponent=-0.506 diff --git a/data/e2_ladder.csv b/data/e2_ladder.csv new file mode 100644 index 0000000..e472035 --- /dev/null +++ b/data/e2_ladder.csv @@ -0,0 +1,7 @@ +snr,OMA_cos,OMA_nmse,OMA_ser,NOMA_cos,NOMA_nmse,NOMA_ser,LMMSE_cos,LMMSE_nmse,LMMSE_ser,DR-spec_cos,DR-spec_nmse,DR-spec_ser,DR-adapt_cos,DR-adapt_nmse,DR-adapt_ser,DR-oracle_cos,DR-oracle_nmse,DR-oracle_ser +0,0.015926856588632552,708.1410662348101,1.0,0.032366678990131355,2825.9296694091063,1.0,0.06504128995173108,0.9954549368433073,1.0,0.11363743483582082,0.9864432255544942,1.0,0.11269793069195441,0.9866853941365498,1.0,0.12461558948397138,0.9835291297200829,1.0 +4,0.02527539949479218,282.4034369499902,1.0,0.05024038177607893,1125.4082835768606,1.0,0.1017511108993672,0.9888174714074848,1.0,0.17546427522174937,0.9675286696275514,0.999875,0.17393473783073346,0.9681414367311848,0.9999375,0.19191140170951212,0.9608993709219992,1.0 +8,0.040710908014543294,110.98837975825798,1.0,0.08027572155744378,441.3279450915458,1.0,0.1616753798128203,0.971988429624148,1.0,0.2666360280147621,0.9259323237134416,0.99425,0.26479087268827234,0.9270159552407004,0.99675,0.2903226264007727,0.9118051394274336,0.98525 +12,0.06287856250955912,45.229771715034616,1.0,0.1263380541254036,178.04760341015174,0.9999375,0.24559671354120155,0.9356679370889158,0.997125,0.3759920842184834,0.8544944634682347,0.8074375,0.37444823190582976,0.8557139013732603,0.823875,0.4068568033891352,0.8293182890007151,0.67225 +16,0.09633285159207082,18.885104681139087,1.0,0.19264673455405848,72.5869101062965,0.992125,0.3564850168024069,0.8662547548440153,0.8510625,0.48656498483446015,0.7596969881164621,0.2864375,0.4858341019159984,0.7603977077146976,0.278125,0.5228884527504853,0.7225489380317694,0.146875 +20,0.1475220708435571,7.865315077959365,1.0,0.29484108980442747,28.53588215213648,0.8525,0.49229395095582795,0.7485442569919676,0.33825,0.5835687315046603,0.6570088460516684,0.033125,0.5853487711485057,0.6548171643846629,0.0274375,0.6229976583065931,0.6094375297390521,0.0100625 diff --git a/data/e2_spectrum_multi.csv b/data/e2_spectrum_multi.csv new file mode 100644 index 0000000..cc82a72 --- /dev/null +++ b/data/e2_spectrum_multi.csv @@ -0,0 +1,1201 @@ +N,idx,eig +100,1,0.05487949173446303 +100,2,0.035633382079731234 +100,3,0.0341755576396924 +100,4,0.023542387296943496 +100,5,0.020418591071194116 +100,6,0.019004393339361773 +100,7,0.01759488144723068 +100,8,0.016553719957266535 +100,9,0.01635145767697043 +100,10,0.015216308269363495 +100,11,0.013441208215676875 +100,12,0.013094950158703584 +100,13,0.011862092781861825 +100,14,0.011496952763792296 +100,15,0.010912410822149029 +100,16,0.010409754066695094 +100,17,0.01006034781699647 +100,18,0.009702453377374133 +100,19,0.009507078616568392 +100,20,0.008674189359853616 +100,21,0.00832469162798024 +100,22,0.00803579086377453 +100,23,0.007496685935429255 +100,24,0.0072605299020776105 +100,25,0.007070077040189469 +100,26,0.006862235230255562 +100,27,0.006639003042421581 +100,28,0.006474570991393156 +100,29,0.0061286772715280335 +100,30,0.005885966553808159 +100,31,0.005699632478335272 +100,32,0.0055631838530944 +100,33,0.005432994519518933 +100,34,0.005229944591709599 +100,35,0.005199046140721758 +100,36,0.005014240319524159 +100,37,0.004940369601597401 +100,38,0.0048474555403417 +100,39,0.004602096669795252 +100,40,0.004424096851724015 +100,41,0.004244341932972686 +100,42,0.004214689870044897 +100,43,0.004105643361279583 +100,44,0.004018703594033166 +100,45,0.003876503549128306 +100,46,0.0034824889643019687 +100,47,0.0034492092358658993 +100,48,0.003384384962151669 +100,49,0.003233089875631685 +100,50,0.003196491953767507 +100,51,0.003089952467183147 +100,52,0.0030121698353662825 +100,53,0.002864957140534404 +100,54,0.002766531927888392 +100,55,0.002623567621275918 +100,56,0.0026065826262062423 +100,57,0.0024766136838992848 +100,58,0.002417825781180714 +100,59,0.002346250004979494 +100,60,0.002167559970015879 +100,61,0.0021140253183356598 +100,62,0.0020656449202690374 +100,63,0.0019949952555327944 +100,64,0.0019090920128374067 +100,65,0.001859346978452031 +100,66,0.0018066780420263617 +100,67,0.0017747870431301005 +100,68,0.001710407678167325 +100,69,0.0016698423267042706 +100,70,0.0016005394036189132 +100,71,0.0015582375386739781 +100,72,0.0014602603839127517 +100,73,0.001445879927336603 +100,74,0.0013741398779978594 +100,75,0.0013443183240390998 +100,76,0.001259145637036567 +100,77,0.0012367497852458838 +100,78,0.0011676306959932815 +100,79,0.0011476734905321313 +100,80,0.0011105225581922113 +100,81,0.0010895395037978546 +100,82,0.0010643190532018307 +100,83,0.0009750625214343191 +100,84,0.0009463519180671362 +100,85,0.0009101623009452897 +100,86,0.0008813375740831844 +100,87,0.0008551128130766504 +100,88,0.0008090106135725082 +100,89,0.00077397008854935 +100,90,0.0007344781674457617 +100,91,0.0007211532828096978 +100,92,0.0006795370287767686 +100,93,0.0006342464766915822 +100,94,0.0005759334604245914 +100,95,0.0005585604226735082 +100,96,0.0005266044678338391 +100,97,0.0004993060800859323 +100,98,0.00048701803050269974 +100,99,0.0004556916117023339 +100,100,0.0003577707214802995 +100,101,3.724362470686667e-18 +100,102,3.556819937511074e-18 +100,103,3.334914064578168e-18 +100,104,3.1333500160980233e-18 +100,105,2.829890938059247e-18 +100,106,2.56467880504674e-18 +100,107,2.4909245978751835e-18 +100,108,2.3686824994656758e-18 +100,109,2.3621472396452692e-18 +100,110,2.1972091437256436e-18 +100,111,2.0765360356166876e-18 +100,112,2.0400581459683665e-18 +100,113,1.9605213780760004e-18 +100,114,1.8805316114353914e-18 +100,115,1.8389983395073127e-18 +100,116,1.7552642819813563e-18 +100,117,1.7037481484264948e-18 +100,118,1.636423683294808e-18 +100,119,1.6336174727404084e-18 +100,120,1.6329401134121772e-18 +100,121,1.5210987463435813e-18 +100,122,1.4927475481219588e-18 +100,123,1.4217567991556942e-18 +100,124,1.4211936943013726e-18 +100,125,1.396205593833736e-18 +100,126,1.3911015505009258e-18 +100,127,1.315838688822646e-18 +100,128,1.3019751397681842e-18 +100,129,1.2961046410600423e-18 +100,130,1.2851040244059768e-18 +100,131,1.2766771449067167e-18 +100,132,1.2389832058460625e-18 +100,133,1.221000304922401e-18 +100,134,1.1811195647584918e-18 +100,135,1.1698956321739046e-18 +100,136,1.1530255111332964e-18 +100,137,1.1254021569873783e-18 +100,138,1.1159245955156013e-18 +100,139,1.0679956426004036e-18 +100,140,1.0669703542249072e-18 +100,141,1.0653945577149015e-18 +100,142,1.0616987876235314e-18 +100,143,1.055169042660705e-18 +100,144,1.0327947002037584e-18 +100,145,1.027140618581269e-18 +100,146,1.0194263453626177e-18 +100,147,9.850127313553895e-19 +100,148,9.760199690745655e-19 +100,149,9.467223079272714e-19 +100,150,9.418923292670773e-19 +100,151,9.31435218394333e-19 +100,152,9.294262016725557e-19 +100,153,9.244756451960334e-19 +100,154,9.11816620149799e-19 +100,155,8.877378879948977e-19 +100,156,8.775435907323576e-19 +100,157,8.64064557957747e-19 +100,158,8.607647988562186e-19 +100,159,8.512461924429554e-19 +100,160,8.46358292656896e-19 +100,161,8.432709028104113e-19 +100,162,8.029895338619019e-19 +100,163,8.005553083693982e-19 +100,164,8.002240980642422e-19 +100,165,7.997120849927036e-19 +100,166,7.831809888431976e-19 +100,167,7.712174147843564e-19 +100,168,7.630368414701466e-19 +100,169,7.460137053955351e-19 +100,170,7.458496368517886e-19 +100,171,7.396409528605415e-19 +100,172,7.158429882793335e-19 +100,173,7.054541206854231e-19 +100,174,7.035735155213374e-19 +100,175,7.016573389704671e-19 +100,176,6.829693346054612e-19 +100,177,6.789289418738504e-19 +100,178,6.736464512566313e-19 +100,179,6.648954848387504e-19 +100,180,6.634900400033233e-19 +100,181,6.58147866382905e-19 +100,182,6.401588241025792e-19 +100,183,6.259566954726988e-19 +100,184,6.244972095392366e-19 +100,185,6.142324681786357e-19 +100,186,6.122087634106312e-19 +100,187,6.082518304330979e-19 +100,188,5.998585594406772e-19 +100,189,5.944546224440392e-19 +100,190,5.938755034671981e-19 +100,191,5.795873816553537e-19 +100,192,5.694896347737512e-19 +100,193,5.603489976970855e-19 +100,194,5.563259760373553e-19 +100,195,5.54477887826847e-19 +100,196,5.247755629546749e-19 +100,197,5.132964715572705e-19 +100,198,5.095975097112132e-19 +100,199,5.065457536685783e-19 +100,200,5.055997791807104e-19 +100,201,5.020656429596593e-19 +100,202,4.941030242484134e-19 +100,203,4.823992742854414e-19 +100,204,4.688696688674595e-19 +100,205,4.579491507608824e-19 +100,206,4.571151682419736e-19 +100,207,4.539375475967569e-19 +100,208,4.514287464721825e-19 +100,209,4.500480422775391e-19 +100,210,4.451180385646775e-19 +100,211,4.396250848761563e-19 +100,212,4.381896275255145e-19 +100,213,4.192275353321154e-19 +100,214,4.129166927593029e-19 +100,215,4.0236925861473853e-19 +100,216,3.9854048681778516e-19 +100,217,3.9088282029254924e-19 +100,218,3.891910393164192e-19 +100,219,3.7902692380805723e-19 +100,220,3.732125874963148e-19 +100,221,3.699824615514881e-19 +100,222,3.670158397244007e-19 +100,223,3.4799795880313915e-19 +100,224,3.3966333791991914e-19 +100,225,3.3306875661147524e-19 +100,226,3.247276130263573e-19 +100,227,3.154908344970494e-19 +100,228,3.152892444479366e-19 +100,229,3.0233929303376467e-19 +100,230,2.9083465440341505e-19 +100,231,2.906183693567241e-19 +100,232,2.860935764166804e-19 +100,233,2.822662864007647e-19 +100,234,2.6758156337236795e-19 +100,235,2.6248202116953265e-19 +100,236,2.592076595593214e-19 +100,237,2.4100129426444527e-19 +100,238,2.403299184210391e-19 +100,239,2.3902731325416373e-19 +100,240,2.3796816491567344e-19 +100,241,2.204385859026552e-19 +100,242,2.1430687373654583e-19 +100,243,2.1319256050213965e-19 +100,244,2.1180888435670662e-19 +100,245,2.105913369839153e-19 +100,246,2.0032526609522058e-19 +100,247,1.9712930760988992e-19 +100,248,1.9556966488955776e-19 +100,249,1.9465737814487854e-19 +100,250,1.8961660799655078e-19 +100,251,1.798709698786943e-19 +100,252,1.6178536913070814e-19 +100,253,1.604039547457813e-19 +100,254,1.5728108693691206e-19 +100,255,1.5158390503885544e-19 +100,256,1.3958895737084756e-19 +100,257,1.3617272265608994e-19 +100,258,1.3594529519691745e-19 +100,259,1.353677373178379e-19 +100,260,1.297385853849551e-19 +100,261,1.2145701947672792e-19 +100,262,1.2093479619840413e-19 +100,263,1.0428507163881713e-19 +100,264,9.833005502161457e-20 +100,265,9.263130958964933e-20 +100,266,8.570729386756676e-20 +100,267,8.2961177170155e-20 +100,268,5.581838035475691e-20 +100,269,4.5102129476133694e-20 +100,270,4.1140123449295484e-20 +100,271,3.602159850798492e-20 +100,272,3.36492262717081e-20 +100,273,3.2778543187769085e-20 +100,274,2.8166557824408715e-20 +100,275,2.4444054474268925e-20 +100,276,2.0987935516914e-20 +100,277,1.7929417008540335e-20 +100,278,1.501829978276896e-20 +100,279,8.013116952535574e-21 +100,280,1.1533269256795127e-21 +100,281,7.876803255258302e-22 +100,282,-2.7646707849368625e-23 +100,283,-8.97313938854078e-22 +100,284,-1.50320791158897e-20 +100,285,-2.980392875362793e-20 +100,286,-3.8652645538441496e-20 +100,287,-4.2957608695778035e-20 +100,288,-4.66257822345183e-20 +100,289,-6.250719969684353e-20 +100,290,-6.575488443349422e-20 +100,291,-6.981990476702633e-20 +100,292,-7.533876477340565e-20 +100,293,-8.165383120500413e-20 +100,294,-8.814580229455814e-20 +100,295,-9.068518448161284e-20 +100,296,-1.0350719002449519e-19 +100,297,-1.0578779263974706e-19 +100,298,-1.0873878134503921e-19 +100,299,-1.1196428245258879e-19 +100,300,-1.2487751652051388e-19 +100,301,-1.2913192536623829e-19 +100,302,-1.4010585876619083e-19 +100,303,-1.5198477906827522e-19 +100,304,-1.579738334285026e-19 +100,305,-1.5802292767470107e-19 +100,306,-1.6299576344142951e-19 +100,307,-1.6493230940899097e-19 +100,308,-1.6551025637316675e-19 +100,309,-1.6719769048040335e-19 +100,310,-1.939557917810449e-19 +100,311,-1.9769256591025533e-19 +100,312,-2.0985608885163207e-19 +100,313,-2.1659956137240855e-19 +100,314,-2.194740008791472e-19 +100,315,-2.237550772410081e-19 +100,316,-2.2534686505732364e-19 +100,317,-2.3416962366925123e-19 +100,318,-2.4763084552920403e-19 +100,319,-2.532309892898358e-19 +100,320,-2.5892718013738037e-19 +100,321,-2.6091946259479384e-19 +100,322,-2.611666322418839e-19 +100,323,-2.6744185091245494e-19 +100,324,-2.8421314812052657e-19 +100,325,-2.929489528458097e-19 +100,326,-2.9665918832180487e-19 +100,327,-2.9884258804588296e-19 +100,328,-2.994154919914196e-19 +100,329,-3.0312651692863404e-19 +100,330,-3.1025976632168284e-19 +100,331,-3.158666968789252e-19 +100,332,-3.2878851139938296e-19 +100,333,-3.3917801332460063e-19 +100,334,-3.409600082296123e-19 +100,335,-3.452257007097682e-19 +100,336,-3.506138581245373e-19 +100,337,-3.546207270775811e-19 +100,338,-3.5609708396857385e-19 +100,339,-3.5664255982383287e-19 +100,340,-3.669444842408945e-19 +100,341,-3.6889339682818755e-19 +100,342,-3.785786393223228e-19 +100,343,-3.8875198278759454e-19 +100,344,-3.948578371209394e-19 +100,345,-3.9579194707676863e-19 +100,346,-4.128257480801454e-19 +100,347,-4.130474595348819e-19 +100,348,-4.1432376897962475e-19 +100,349,-4.2174417472265577e-19 +100,350,-4.400674169799974e-19 +100,351,-4.43790749044005e-19 +100,352,-4.531194219376611e-19 +100,353,-4.600482868095303e-19 +100,354,-4.707466721068096e-19 +100,355,-4.7240046609938595e-19 +100,356,-4.72510127927861e-19 +100,357,-4.7481411392915245e-19 +100,358,-4.780013472219241e-19 +100,359,-4.883990210776813e-19 +100,360,-5.098043794765351e-19 +100,361,-5.109569650137696e-19 +100,362,-5.145289673871659e-19 +100,363,-5.180310604473958e-19 +100,364,-5.205507987017721e-19 +100,365,-5.402441707033868e-19 +100,366,-5.409485158266425e-19 +100,367,-5.447187407098077e-19 +100,368,-5.554275572491958e-19 +100,369,-5.690032936357188e-19 +100,370,-5.751598741677276e-19 +100,371,-5.790578438679639e-19 +100,372,-5.88058805763291e-19 +100,373,-5.8940788335953e-19 +100,374,-5.902229073180716e-19 +100,375,-6.021775456297171e-19 +100,376,-6.077448169322685e-19 +100,377,-6.248015970340636e-19 +100,378,-6.290043454411985e-19 +100,379,-6.2934646763581215e-19 +100,380,-6.317094029341188e-19 +100,381,-6.423057314026019e-19 +100,382,-6.528407873976663e-19 +100,383,-6.621718556499724e-19 +100,384,-6.680964227274417e-19 +100,385,-6.724528670132161e-19 +100,386,-6.748222599780165e-19 +100,387,-6.751975938786686e-19 +100,388,-6.995013572839487e-19 +100,389,-7.103846908464888e-19 +100,390,-7.19981033428744e-19 +100,391,-7.297316022182328e-19 +100,392,-7.358328127321991e-19 +100,393,-7.458490341039999e-19 +100,394,-7.528846880553347e-19 +100,395,-7.707303384792673e-19 +100,396,-7.822777050673604e-19 +100,397,-7.846305704811229e-19 +100,398,-7.981705727527432e-19 +100,399,-8.195158334097787e-19 +100,400,-8.359979553238304e-19 +400,1,0.04866204287444571 +400,2,0.0278694880644748 +400,3,0.026840630453250712 +400,4,0.024298866611739623 +400,5,0.01834790470823416 +400,6,0.016711311789934853 +400,7,0.014788043960356769 +400,8,0.013905567245597342 +400,9,0.011732246491199458 +400,10,0.011180345748371784 +400,11,0.010171917199502677 +400,12,0.009723107594711193 +400,13,0.009399211213138518 +400,14,0.008750103509759445 +400,15,0.00821342178858132 +400,16,0.007887645270230692 +400,17,0.00785679001583962 +400,18,0.007254365577576412 +400,19,0.006946726331520347 +400,20,0.006839007583342888 +400,21,0.006505730629313425 +400,22,0.006297610955313226 +400,23,0.0058579455336636626 +400,24,0.005830480813885759 +400,25,0.005634401816954923 +400,26,0.005413642696069291 +400,27,0.005270076772365999 +400,28,0.005076287019972576 +400,29,0.004987333243175564 +400,30,0.004779351039933714 +400,31,0.00463230972705971 +400,32,0.0045508215761485985 +400,33,0.004305591113012767 +400,34,0.004215130001192997 +400,35,0.003972883357842017 +400,36,0.003933399455926661 +400,37,0.0038786632152826373 +400,38,0.00366900871418542 +400,39,0.0036496613210398347 +400,40,0.003480733941151694 +400,41,0.003393559444495749 +400,42,0.0033366605707627365 +400,43,0.0032785227996226926 +400,44,0.0032598814795681496 +400,45,0.003152001285407583 +400,46,0.003068370804849989 +400,47,0.003002598279024857 +400,48,0.0028751198401699533 +400,49,0.0028450195088473122 +400,50,0.0027989468765602004 +400,51,0.002721081282566341 +400,52,0.0026954342342749137 +400,53,0.0026667085289899654 +400,54,0.0026245591308065148 +400,55,0.0025814364923389763 +400,56,0.00251493867793944 +400,57,0.002463983033148697 +400,58,0.0024522713332711 +400,59,0.0024207278388906988 +400,60,0.0023579840227376065 +400,61,0.0023022008928346304 +400,62,0.0022580673641679197 +400,63,0.0022392663034379147 +400,64,0.002200173921056825 +400,65,0.002127190326837001 +400,66,0.0020665047508519924 +400,67,0.00203485972614659 +400,68,0.0019928662753769338 +400,69,0.001953291207170368 +400,70,0.0019144468822810132 +400,71,0.0018912010658721041 +400,72,0.001854029459903994 +400,73,0.001824354658300269 +400,74,0.0018060653855568132 +400,75,0.0017858409349727532 +400,76,0.0017132727789463443 +400,77,0.001679815289998741 +400,78,0.0016284179686817 +400,79,0.001607998031314753 +400,80,0.0015816713051180294 +400,81,0.001534885998797504 +400,82,0.0015069498074746104 +400,83,0.0014861442195559737 +400,84,0.0014572477289355316 +400,85,0.0014226179368213797 +400,86,0.001399918848216782 +400,87,0.0013375409392867158 +400,88,0.0013215416316600514 +400,89,0.0013144770706425746 +400,90,0.00131202463853217 +400,91,0.0012821251976278592 +400,92,0.0012719365177727643 +400,93,0.0012317322036461387 +400,94,0.00118141576813494 +400,95,0.0011756457025469827 +400,96,0.001164276438838992 +400,97,0.0011346873918346879 +400,98,0.0011203064232471946 +400,99,0.001106641798881564 +400,100,0.0010783017615148816 +400,101,0.0010529036798927434 +400,102,0.0010184694221315033 +400,103,0.0010059906252784228 +400,104,0.0009712051787273986 +400,105,0.0009501784966734216 +400,106,0.0009434594818883746 +400,107,0.0009213133858500754 +400,108,0.0009123639373268272 +400,109,0.0008954059939259587 +400,110,0.0008672677154707956 +400,111,0.0008495769611015474 +400,112,0.000829546143013466 +400,113,0.0008223991407898914 +400,114,0.0007957302964015449 +400,115,0.0007780448692565314 +400,116,0.000755981620498252 +400,117,0.0007428462063092104 +400,118,0.0007093933588939126 +400,119,0.000690101394808767 +400,120,0.0006660981245694584 +400,121,0.0006583645850627091 +400,122,0.0006473719305042846 +400,123,0.0006235291443547629 +400,124,0.0006003040230183092 +400,125,0.0005875508561839313 +400,126,0.0005787596057382433 +400,127,0.0005672161074165782 +400,128,0.0005615077307069836 +400,129,0.000549197431906758 +400,130,0.0005253782677526924 +400,131,0.0005123851716236676 +400,132,0.00048251873867973904 +400,133,0.00045967853931917974 +400,134,0.00043743457733572035 +400,135,0.00041440401846553796 +400,136,0.000412171806800076 +400,137,0.00040343981995116075 +400,138,0.0003865743849542975 +400,139,0.0003692959326905289 +400,140,0.000360751690218857 +400,141,0.0003533809563242003 +400,142,0.00033527740987826857 +400,143,0.00033043891315908986 +400,144,0.0003210869994366407 +400,145,0.00030530315713381625 +400,146,0.00030279760837283875 +400,147,0.00028764018931506935 +400,148,0.0002841251305260303 +400,149,0.0002736565954230048 +400,150,0.00027185219112693123 +400,151,0.0002617819115341413 +400,152,0.0002582026253046674 +400,153,0.00025181411973057024 +400,154,0.00024633556815825637 +400,155,0.00024034393127398337 +400,156,0.00022957125997669466 +400,157,0.00022468587310414133 +400,158,0.00021592866674133434 +400,159,0.0002156092096100275 +400,160,0.0002060812698421691 +400,161,0.00019654904348347517 +400,162,0.00019591032973707238 +400,163,0.00019187591150820378 +400,164,0.00018804700322462835 +400,165,0.00018232950939738726 +400,166,0.00017818195256599266 +400,167,0.000173086082133672 +400,168,0.00016533514226734297 +400,169,0.0001637317359819974 +400,170,0.00016004195291733313 +400,171,0.0001581693205182257 +400,172,0.00015445765278751262 +400,173,0.00014915369858649276 +400,174,0.00014722267859864786 +400,175,0.00014352083385154877 +400,176,0.0001416197896321418 +400,177,0.0001391523535750528 +400,178,0.0001372322211481872 +400,179,0.00013275165312930394 +400,180,0.00012925578914571752 +400,181,0.00012647096454285406 +400,182,0.0001236258151794493 +400,183,0.00012136364921979538 +400,184,0.00012045565885321763 +400,185,0.00011939390204076106 +400,186,0.00011564281239906076 +400,187,0.000112635424928188 +400,188,0.00011150620000766478 +400,189,0.00010846071664269504 +400,190,0.00010825924506095305 +400,191,0.00010463019173926293 +400,192,0.00010170266350320702 +400,193,0.00010017715557720387 +400,194,9.743604638710189e-05 +400,195,9.72775408266654e-05 +400,196,9.545659826607767e-05 +400,197,9.348702206224698e-05 +400,198,9.235267745002487e-05 +400,199,8.979702358577679e-05 +400,200,8.736401052800753e-05 +400,201,8.580123746077821e-05 +400,202,8.558626093649945e-05 +400,203,8.20073170482472e-05 +400,204,8.047524618985139e-05 +400,205,7.780070688489389e-05 +400,206,7.751465316344662e-05 +400,207,7.684748577003939e-05 +400,208,7.406032035989857e-05 +400,209,7.218062827020198e-05 +400,210,7.170560800754422e-05 +400,211,6.99179462297079e-05 +400,212,6.822817001715462e-05 +400,213,6.796507167830086e-05 +400,214,6.707949981603775e-05 +400,215,6.557330684039911e-05 +400,216,6.387676970685909e-05 +400,217,6.243764657997043e-05 +400,218,6.152582673621198e-05 +400,219,6.029400882079667e-05 +400,220,5.7679116683811594e-05 +400,221,5.537157069512892e-05 +400,222,5.5067275378535065e-05 +400,223,5.374054466186396e-05 +400,224,5.2914731810647266e-05 +400,225,5.2026278534563455e-05 +400,226,5.1543912712691685e-05 +400,227,5.071782012160108e-05 +400,228,5.008798244170509e-05 +400,229,4.8543843743660794e-05 +400,230,4.6531334565676e-05 +400,231,4.644412514144745e-05 +400,232,4.483030749063453e-05 +400,233,4.4001014658024836e-05 +400,234,4.3210656218522285e-05 +400,235,4.30572082553652e-05 +400,236,4.1578519260177954e-05 +400,237,4.123579048740395e-05 +400,238,4.012135367331515e-05 +400,239,3.899325403881136e-05 +400,240,3.799784311527231e-05 +400,241,3.750181532220389e-05 +400,242,3.6670830206954235e-05 +400,243,3.6359192468772015e-05 +400,244,3.555628691783586e-05 +400,245,3.498668349469939e-05 +400,246,3.392637064730623e-05 +400,247,3.3764556638260446e-05 +400,248,3.2742120408132825e-05 +400,249,3.1673271649834964e-05 +400,250,3.1348640064186574e-05 +400,251,3.0442104928071607e-05 +400,252,2.9757969635204522e-05 +400,253,2.928817023833915e-05 +400,254,2.8671037336823144e-05 +400,255,2.8088252983501172e-05 +400,256,2.7495739687634487e-05 +400,257,2.6963775011023042e-05 +400,258,2.6768451378373794e-05 +400,259,2.525193623859838e-05 +400,260,2.4833124892366903e-05 +400,261,2.4489156917100914e-05 +400,262,2.4254669080312583e-05 +400,263,2.350450009324724e-05 +400,264,2.3011135793216238e-05 +400,265,2.2876263476725635e-05 +400,266,2.248727889743327e-05 +400,267,2.1612499677908204e-05 +400,268,2.1333322644081357e-05 +400,269,2.037925459741015e-05 +400,270,2.003739887347946e-05 +400,271,1.9699756027103455e-05 +400,272,1.903538312320648e-05 +400,273,1.83355877855128e-05 +400,274,1.7671496241810892e-05 +400,275,1.747797089858059e-05 +400,276,1.692043088916887e-05 +400,277,1.658144111019594e-05 +400,278,1.614344797885415e-05 +400,279,1.5796705063184614e-05 +400,280,1.535304347097619e-05 +400,281,1.4844369769444145e-05 +400,282,1.4349604067143673e-05 +400,283,1.4037984837100042e-05 +400,284,1.3367213045022795e-05 +400,285,1.3179206951147597e-05 +400,286,1.2630659899083664e-05 +400,287,1.2367981876026725e-05 +400,288,1.2237124188133845e-05 +400,289,1.1600001514217516e-05 +400,290,1.1343752503051368e-05 +400,291,1.11676947237815e-05 +400,292,1.0816773915626282e-05 +400,293,1.0640592678102977e-05 +400,294,1.0235868454192026e-05 +400,295,9.78314607624085e-06 +400,296,9.464420346093927e-06 +400,297,8.798300674733163e-06 +400,298,8.72619776255705e-06 +400,299,8.65394663569685e-06 +400,300,8.2305091245606e-06 +400,301,7.623732663608258e-06 +400,302,7.467557171540425e-06 +400,303,6.914459477420174e-06 +400,304,6.7840472511178995e-06 +400,305,6.311063367117729e-06 +400,306,6.002836755530042e-06 +400,307,5.590822150222668e-06 +400,308,5.392638621503084e-06 +400,309,5.381145311306363e-06 +400,310,5.067433599762879e-06 +400,311,4.904942843448797e-06 +400,312,4.672823539914161e-06 +400,313,4.596522862595135e-06 +400,314,4.3023751917416205e-06 +400,315,3.977296243424198e-06 +400,316,3.7497932447334383e-06 +400,317,3.532268011443017e-06 +400,318,3.2276995633385466e-06 +400,319,3.1195773044895605e-06 +400,320,2.744948833218161e-06 +400,321,2.556127997710921e-06 +400,322,2.0027343773719732e-06 +400,323,1.9037865438412777e-06 +400,324,1.7172712343646832e-06 +400,325,1.5008934946567383e-06 +400,326,1.3255018621654006e-06 +400,327,1.0844093935051933e-06 +400,328,7.468186259864946e-07 +400,329,5.980260860365452e-07 +400,330,2.462064500739504e-07 +400,331,4.9976453764199166e-08 +400,332,-1.5061387594846022e-07 +400,333,-3.660811592311598e-07 +400,334,-6.971558156884201e-07 +400,335,-8.355944325788439e-07 +400,336,-9.483215784430617e-07 +400,337,-1.1869354089880694e-06 +400,338,-1.2436724357488916e-06 +400,339,-1.4076791206792136e-06 +400,340,-1.5640007460460684e-06 +400,341,-1.6719114643911635e-06 +400,342,-1.751737709272674e-06 +400,343,-2.011417793845544e-06 +400,344,-2.1650530990888563e-06 +400,345,-2.347067346988755e-06 +400,346,-2.5131291947898984e-06 +400,347,-2.6436998718310666e-06 +400,348,-2.8443939363113463e-06 +400,349,-2.97134953666891e-06 +400,350,-3.1398428986006314e-06 +400,351,-3.2732303622091016e-06 +400,352,-3.3911449575187255e-06 +400,353,-3.426459609079551e-06 +400,354,-3.6650171185014805e-06 +400,355,-3.905151261646646e-06 +400,356,-3.956552760013529e-06 +400,357,-4.108372638795715e-06 +400,358,-4.219217973555442e-06 +400,359,-4.420455053538755e-06 +400,360,-4.692838090819456e-06 +400,361,-4.7291314240125435e-06 +400,362,-4.875539357672213e-06 +400,363,-4.911561928862495e-06 +400,364,-5.024700075876981e-06 +400,365,-5.096370049335909e-06 +400,366,-5.3050528841614e-06 +400,367,-5.3546931806645575e-06 +400,368,-5.439117314320263e-06 +400,369,-5.597589370158391e-06 +400,370,-5.663687548872962e-06 +400,371,-5.861886172522426e-06 +400,372,-5.894709779905055e-06 +400,373,-6.089963794045031e-06 +400,374,-6.139111030696224e-06 +400,375,-6.250774626168883e-06 +400,376,-6.289730102540018e-06 +400,377,-6.348770430233463e-06 +400,378,-6.569249479948393e-06 +400,379,-6.737044522018685e-06 +400,380,-6.797000258742994e-06 +400,381,-6.875288048139585e-06 +400,382,-7.004973084606226e-06 +400,383,-7.104314581175895e-06 +400,384,-7.215469718817135e-06 +400,385,-7.257615629295923e-06 +400,386,-7.4032928205933e-06 +400,387,-7.448559793723787e-06 +400,388,-7.469340386661998e-06 +400,389,-7.687928307091075e-06 +400,390,-7.893325094432611e-06 +400,391,-7.97392316249152e-06 +400,392,-8.070400243343855e-06 +400,393,-8.082791508403544e-06 +400,394,-8.286428654830217e-06 +400,395,-8.356367844511767e-06 +400,396,-8.51330021593522e-06 +400,397,-8.633505288652301e-06 +400,398,-8.692196708515839e-06 +400,399,-8.757489939164925e-06 +400,400,-8.96659412321193e-06 +1600,1,0.0471059198026128 +1600,2,0.028384496691663354 +1600,3,0.027301612408468855 +1600,4,0.02135069207881917 +1600,5,0.018646156984821995 +1600,6,0.014934487687371626 +1600,7,0.01368539398485447 +1600,8,0.01282827671230557 +1600,9,0.011592678760889737 +1600,10,0.010258520227122484 +1600,11,0.009142089175160987 +1600,12,0.009031249595860684 +1600,13,0.00802765054571237 +1600,14,0.007911729391861601 +1600,15,0.007557644902855188 +1600,16,0.006937454440520822 +1600,17,0.006610512993785467 +1600,18,0.006412191000269507 +1600,19,0.006241678746912837 +1600,20,0.005920938603368293 +1600,21,0.005647236012348512 +1600,22,0.005488814834589079 +1600,23,0.005372791925337288 +1600,24,0.005126028346553087 +1600,25,0.004952080443744024 +1600,26,0.0048621192902141164 +1600,27,0.0046561615595409715 +1600,28,0.004601825465852331 +1600,29,0.0043725404743415845 +1600,30,0.004292436054638346 +1600,31,0.004226990914111704 +1600,32,0.004050613854101715 +1600,33,0.003925169959014535 +1600,34,0.0038580699503816826 +1600,35,0.0036246030562015813 +1600,36,0.00353875696098452 +1600,37,0.003491080327516164 +1600,38,0.003442482198231235 +1600,39,0.0033258093155133107 +1600,40,0.0032729142970671947 +1600,41,0.003150487785524525 +1600,42,0.003136375049313563 +1600,43,0.003111793936641334 +1600,44,0.0029662763228518263 +1600,45,0.0029232490308927677 +1600,46,0.0028494044731555536 +1600,47,0.002748868726698415 +1600,48,0.002736398868332596 +1600,49,0.0026903125907174383 +1600,50,0.0026207936675856454 +1600,51,0.0025979176139914067 +1600,52,0.0025022017607438402 +1600,53,0.0024869122639268213 +1600,54,0.002366036359847853 +1600,55,0.002348400188119443 +1600,56,0.002312813829813152 +1600,57,0.0022913688180224994 +1600,58,0.002252868472739856 +1600,59,0.0022157734794593805 +1600,60,0.002182958037424465 +1600,61,0.0021237561948600106 +1600,62,0.0021060736818328514 +1600,63,0.002100781880204679 +1600,64,0.0020529210825505875 +1600,65,0.0019954945727624347 +1600,66,0.0019668952411206414 +1600,67,0.0019181489433036302 +1600,68,0.0019033337632733528 +1600,69,0.0018858417452095743 +1600,70,0.0018458697091454411 +1600,71,0.0018088090504182876 +1600,72,0.0017851272603997429 +1600,73,0.0017686441944776885 +1600,74,0.0017143175414348825 +1600,75,0.0016934306932551684 +1600,76,0.0016673496856815068 +1600,77,0.0016476344097707757 +1600,78,0.001619251701811153 +1600,79,0.0016091663613247277 +1600,80,0.0015926333683838093 +1600,81,0.0015628863270493024 +1600,82,0.0015471569840351245 +1600,83,0.0015419515754744942 +1600,84,0.0015109207515444346 +1600,85,0.0014994849144317464 +1600,86,0.001477825590050014 +1600,87,0.0014536912316392508 +1600,88,0.0014347196658065248 +1600,89,0.0014152114630086308 +1600,90,0.0013812743719006312 +1600,91,0.0013633103882984816 +1600,92,0.0013355542414344864 +1600,93,0.0013271170374414727 +1600,94,0.0012948715421195755 +1600,95,0.001276676521283314 +1600,96,0.0012580669726479563 +1600,97,0.0012555321212881787 +1600,98,0.0012359443394901295 +1600,99,0.001215119382942626 +1600,100,0.0012063216716878904 +1600,101,0.0011821290143983732 +1600,102,0.001159726904873955 +1600,103,0.0011476549406574392 +1600,104,0.0011270871280054382 +1600,105,0.0011030416085731206 +1600,106,0.0010767240977919204 +1600,107,0.001073551351835708 +1600,108,0.001055246675548934 +1600,109,0.0010488967787885867 +1600,110,0.001034017067758259 +1600,111,0.0010109857577971098 +1600,112,0.0009987323076154685 +1600,113,0.0009813976184337055 +1600,114,0.0009635503321392134 +1600,115,0.0009284146370821772 +1600,116,0.0009208046959796837 +1600,117,0.0009161688213699052 +1600,118,0.0009103197893129399 +1600,119,0.0008940872958832359 +1600,120,0.0008681982441695751 +1600,121,0.0008581714623446134 +1600,122,0.0008517278351977929 +1600,123,0.0008432229536074674 +1600,124,0.000837573262288705 +1600,125,0.0008028139353190646 +1600,126,0.0007905783063310826 +1600,127,0.000770798175833455 +1600,128,0.0007584803210634851 +1600,129,0.0005989472928423534 +1600,130,0.0005192241499279082 +1600,131,0.000462133577285844 +1600,132,0.00043227388305224927 +1600,133,0.0004213027844234093 +1600,134,0.00039910961309864984 +1600,135,0.0003897270411221304 +1600,136,0.00033513791982654626 +1600,137,0.0003329495326566982 +1600,138,0.00031861180830136465 +1600,139,0.0002957340489712454 +1600,140,0.0002854184305468023 +1600,141,0.0002639813560064959 +1600,142,0.0002576557186607362 +1600,143,0.0002535827183923658 +1600,144,0.00023013453005592694 +1600,145,0.000225852131398599 +1600,146,0.00022303533284698178 +1600,147,0.0002119068025310999 +1600,148,0.00020121703621885575 +1600,149,0.00019647939712793392 +1600,150,0.0001934554067115027 +1600,151,0.0001882404342447782 +1600,152,0.00018095365641808804 +1600,153,0.0001780731981834249 +1600,154,0.0001750849734787386 +1600,155,0.0001699400757190445 +1600,156,0.0001661382016012135 +1600,157,0.0001618227036051892 +1600,158,0.00015565852929802832 +1600,159,0.0001514939863720273 +1600,160,0.00014596367561581794 +1600,161,0.00014024813497187267 +1600,162,0.00013905852860590865 +1600,163,0.00013635826397877064 +1600,164,0.00013219906882266707 +1600,165,0.00013088456372795863 +1600,166,0.00012571329285006146 +1600,167,0.00012475267429772437 +1600,168,0.00012357335412091142 +1600,169,0.00011919970069672076 +1600,170,0.00011583753742796526 +1600,171,0.00011385100024903745 +1600,172,0.00011286394778578928 +1600,173,0.00011108638004413717 +1600,174,0.0001095744139645412 +1600,175,0.00010535606794434241 +1600,176,0.00010318962462770192 +1600,177,0.00010183648837680995 +1600,178,0.00010024395057965475 +1600,179,9.803442459776437e-05 +1600,180,9.738048561891631e-05 +1600,181,9.503549007083245e-05 +1600,182,9.346071356889217e-05 +1600,183,9.150612447872105e-05 +1600,184,9.02057260151734e-05 +1600,185,8.822480045137597e-05 +1600,186,8.762752678283284e-05 +1600,187,8.631964888574369e-05 +1600,188,8.376746466175844e-05 +1600,189,8.163999563892703e-05 +1600,190,7.994392964610024e-05 +1600,191,7.951582955552962e-05 +1600,192,7.632474846848486e-05 +1600,193,7.561026591556445e-05 +1600,194,7.392253088727749e-05 +1600,195,7.298520957790975e-05 +1600,196,7.255529218533196e-05 +1600,197,7.12725244028148e-05 +1600,198,7.002301094922912e-05 +1600,199,6.829087367314082e-05 +1600,200,6.79324776829251e-05 +1600,201,6.65981104217421e-05 +1600,202,6.639049708123527e-05 +1600,203,6.54150094501778e-05 +1600,204,6.352045542141838e-05 +1600,205,6.233448275183905e-05 +1600,206,6.16774864740485e-05 +1600,207,6.063664682418315e-05 +1600,208,5.9544800674136615e-05 +1600,209,5.8420846259055365e-05 +1600,210,5.780330511644374e-05 +1600,211,5.646370238994276e-05 +1600,212,5.594880551314916e-05 +1600,213,5.482007838300472e-05 +1600,214,5.381789689701408e-05 +1600,215,5.353219515877797e-05 +1600,216,5.301821382787929e-05 +1600,217,5.216042441033523e-05 +1600,218,5.098677692263593e-05 +1600,219,5.041420976827887e-05 +1600,220,4.920177221945241e-05 +1600,221,4.869614318448213e-05 +1600,222,4.803231835003643e-05 +1600,223,4.7326759554107565e-05 +1600,224,4.6931687100710734e-05 +1600,225,4.6624223151891205e-05 +1600,226,4.5684016679029934e-05 +1600,227,4.47473146179765e-05 +1600,228,4.32031454555913e-05 +1600,229,4.2624529523337386e-05 +1600,230,4.2575390769263354e-05 +1600,231,4.127006776585082e-05 +1600,232,4.0708227184778216e-05 +1600,233,3.99054776023648e-05 +1600,234,3.934620013648982e-05 +1600,235,3.8440447126689004e-05 +1600,236,3.8349830339847385e-05 +1600,237,3.741637281774431e-05 +1600,238,3.6984237550206025e-05 +1600,239,3.627981967749568e-05 +1600,240,3.5755365718673904e-05 +1600,241,3.553094696130389e-05 +1600,242,3.4833600028622054e-05 +1600,243,3.444331436697555e-05 +1600,244,3.411664656829374e-05 +1600,245,3.387928296351831e-05 +1600,246,3.322644216053537e-05 +1600,247,3.249393632224449e-05 +1600,248,3.1583136526102746e-05 +1600,249,3.1455926880941156e-05 +1600,250,3.0942937144258865e-05 +1600,251,3.049847567826007e-05 +1600,252,2.9988730822717035e-05 +1600,253,2.9810879327510024e-05 +1600,254,2.9656380887228985e-05 +1600,255,2.9149694558596036e-05 +1600,256,2.81482666883345e-05 +1600,257,2.7727444124615465e-05 +1600,258,2.7560983910792556e-05 +1600,259,2.7255235983755448e-05 +1600,260,2.7178029490376195e-05 +1600,261,2.672184855221143e-05 +1600,262,2.63146500572034e-05 +1600,263,2.608291163975579e-05 +1600,264,2.547554689832896e-05 +1600,265,2.5273434547734544e-05 +1600,266,2.4959292662697105e-05 +1600,267,2.4257810691851616e-05 +1600,268,2.398364907537078e-05 +1600,269,2.3500615785450095e-05 +1600,270,2.326017270294677e-05 +1600,271,2.3127243996957723e-05 +1600,272,2.2674886569263577e-05 +1600,273,2.2168958330245304e-05 +1600,274,2.1965043808055196e-05 +1600,275,2.167273359697713e-05 +1600,276,2.1595788817955263e-05 +1600,277,2.0945713999950113e-05 +1600,278,2.0604483821093975e-05 +1600,279,2.023503156639363e-05 +1600,280,2.0064253687887215e-05 +1600,281,2.0015833447593025e-05 +1600,282,1.9539980971233735e-05 +1600,283,1.9389281598882325e-05 +1600,284,1.928641187915121e-05 +1600,285,1.8231099701902728e-05 +1600,286,1.805317767810091e-05 +1600,287,1.797380063117547e-05 +1600,288,1.7732725375250235e-05 +1600,289,1.7628707237997442e-05 +1600,290,1.734610189334637e-05 +1600,291,1.7062910536969198e-05 +1600,292,1.6657626992412816e-05 +1600,293,1.6485190936858374e-05 +1600,294,1.6049979031689796e-05 +1600,295,1.6015672368341727e-05 +1600,296,1.5732086084663213e-05 +1600,297,1.564530037183328e-05 +1600,298,1.5272708643713214e-05 +1600,299,1.5133863361758905e-05 +1600,300,1.4950543017776924e-05 +1600,301,1.4758750550617276e-05 +1600,302,1.4328409761971667e-05 +1600,303,1.4033614579541693e-05 +1600,304,1.3975754021109157e-05 +1600,305,1.3891646718891e-05 +1600,306,1.3561241499835372e-05 +1600,307,1.3329455517070978e-05 +1600,308,1.3071990180384728e-05 +1600,309,1.2699231929532542e-05 +1600,310,1.2496797970887735e-05 +1600,311,1.2302645497480527e-05 +1600,312,1.2069682969033667e-05 +1600,313,1.2020520726077846e-05 +1600,314,1.1975641671228938e-05 +1600,315,1.1885488730209666e-05 +1600,316,1.1693759985992e-05 +1600,317,1.14058188648913e-05 +1600,318,1.1214663231790376e-05 +1600,319,1.1051439100720761e-05 +1600,320,1.0777619180676734e-05 +1600,321,1.0550499803804211e-05 +1600,322,1.0270192974449554e-05 +1600,323,1.0095997411669884e-05 +1600,324,9.951222646672263e-06 +1600,325,9.787366073360515e-06 +1600,326,9.76921337531982e-06 +1600,327,9.659673419818456e-06 +1600,328,9.543271302208966e-06 +1600,329,9.11935298566068e-06 +1600,330,8.94985109871126e-06 +1600,331,8.800333079667865e-06 +1600,332,8.632005284233745e-06 +1600,333,8.613421920542556e-06 +1600,334,8.49632126891013e-06 +1600,335,8.373776026537109e-06 +1600,336,8.228599403060537e-06 +1600,337,7.861628159386258e-06 +1600,338,7.777824131640061e-06 +1600,339,7.566941154330778e-06 +1600,340,7.386288505867474e-06 +1600,341,7.319621952751436e-06 +1600,342,7.18129011901905e-06 +1600,343,6.944818561068353e-06 +1600,344,6.797771828131714e-06 +1600,345,6.722697461151919e-06 +1600,346,6.45891940276351e-06 +1600,347,6.365210367989917e-06 +1600,348,6.337540531752553e-06 +1600,349,6.211094745926908e-06 +1600,350,5.998504385018008e-06 +1600,351,5.817452049042152e-06 +1600,352,5.793665985960186e-06 +1600,353,5.5887346655711274e-06 +1600,354,5.552942386138006e-06 +1600,355,5.404731092933463e-06 +1600,356,5.268588335046299e-06 +1600,357,5.049123850276531e-06 +1600,358,4.999408035178578e-06 +1600,359,4.812466197024347e-06 +1600,360,4.721304059134058e-06 +1600,361,4.690530663775475e-06 +1600,362,4.401635688762735e-06 +1600,363,4.28483586524031e-06 +1600,364,4.05771914105318e-06 +1600,365,4.008641980429472e-06 +1600,366,3.959938781722685e-06 +1600,367,3.7972736051698364e-06 +1600,368,3.4919580715451735e-06 +1600,369,3.482897006195642e-06 +1600,370,3.3155066165322625e-06 +1600,371,3.217963110926837e-06 +1600,372,3.1143360500635945e-06 +1600,373,2.965393660978895e-06 +1600,374,2.892584841782354e-06 +1600,375,2.736399592886063e-06 +1600,376,2.6653628405239837e-06 +1600,377,2.532383807713189e-06 +1600,378,2.467633862942849e-06 +1600,379,2.278224765870534e-06 +1600,380,2.2015483571867504e-06 +1600,381,2.094873632441556e-06 +1600,382,1.981975392349333e-06 +1600,383,1.8649672656100156e-06 +1600,384,1.7073535492246915e-06 +1600,385,1.5666357479542929e-06 +1600,386,1.5423473781927412e-06 +1600,387,1.4317368526426596e-06 +1600,388,1.2259384681922066e-06 +1600,389,1.1606372552456953e-06 +1600,390,1.0472514939875017e-06 +1600,391,9.843067580253299e-07 +1600,392,8.936820316940199e-07 +1600,393,7.863401262263226e-07 +1600,394,6.836172939056522e-07 +1600,395,4.303386282822305e-07 +1600,396,3.9640040461050976e-07 +1600,397,2.020203096416757e-07 +1600,398,1.2395132393461775e-07 +1600,399,2.685906369711361e-08 +1600,400,-4.987339819426702e-08 diff --git a/data/e2_subspace_multi.csv b/data/e2_subspace_multi.csv new file mode 100644 index 0000000..69b5d88 --- /dev/null +++ b/data/e2_subspace_multi.csv @@ -0,0 +1,19 @@ +U,N,err +2,200,0.6015688232533535 +2,400,0.5100480469623787 +2,800,0.4163137765895379 +2,1600,0.3274723671925073 +2,3200,0.24614586168567973 +2,6400,0.17418725655145126 +4,200,0.5040386164337312 +4,400,0.38630798361019253 +4,800,0.2837206544692833 +4,1600,0.20320111590214116 +4,3200,0.14395409260595776 +4,6400,0.1017848037055953 +8,200,0.415403307029665 +8,400,0.28727521612595036 +8,800,0.20027604274397937 +8,1600,0.14237997170149888 +8,3200,0.10045651014386626 +8,6400,0.07158722970583854 diff --git a/data/e3_speed.csv b/data/e3_speed.csv new file mode 100644 index 0000000..79e1cdf --- /dev/null +++ b/data/e3_speed.csv @@ -0,0 +1,6 @@ +speed,DR-genie_cos,DR-genie_ser,DR-tracked_cos,DR-tracked_ser,DR-static_cos,DR-static_ser,SR_cos,SR_ser,SC_cos,SC_ser,LMMSE_cos,LMMSE_ser,OMA_cos,OMA_ser,NOMA_cos,NOMA_ser +0.5,0.5794649360598771,0.21950748697916667,0.5739841001040412,0.23187109375,0.5664720141351067,0.2484931640625,0.33440327011050436,0.7142825520833334,0.46051384076723956,0.45970442708333337,0.5105068703916773,0.3414085286458333,0.2018708801770776,0.9102161458333333,0.3833148683402804,0.6103043619791666 +1.0,0.6166347710164346,0.15714420572916668,0.6090281513566702,0.1726455078125,0.6015407405294093,0.18871158854166667,0.3214097476604759,0.7414912109375,0.5010390265031732,0.36549576822916663,0.540881364251173,0.2731194661458333,0.18394033256730064,0.9169586588541666,0.38323034831255015,0.6104072265625 +2.0,0.5970751793253375,0.18801302083333332,0.5848245272847403,0.21389811197916667,0.5794199453050508,0.22403548177083332,0.3287948013878244,0.7263095703125,0.47766237602611283,0.4160784505208333,0.5235681251295078,0.3093792317708334,0.18301300897898432,0.9250042317708332,0.3833082213921645,0.610365234375 +4.0,0.6001377391058428,0.18024674479166666,0.5839354683364975,0.2146298828125,0.5829994680307478,0.21672916666666667,0.32796168761947786,0.7281370442708333,0.48253072400293356,0.40805566406250005,0.526849532788922,0.3038763020833333,0.18224146474411818,0.9273326822916668,0.38328927198557355,0.6105133463541667 +8.0,0.6079273767470954,0.16943294270833334,0.5910829910661712,0.2040139973958333,0.591289877824418,0.20492415364583333,0.32440369135066427,0.7352037760416665,0.49192580974071415,0.38576953125,0.5338899294845367,0.2882327473958333,0.18226056441346877,0.9237444661458333,0.3832524105168856,0.6103388671875001 diff --git a/data/e3_timeseries.csv b/data/e3_timeseries.csv new file mode 100644 index 0000000..41c1a0f --- /dev/null +++ b/data/e3_timeseries.csv @@ -0,0 +1,301 @@ +t,a0,a1,a2,a3,ahat0,ahat1,ahat2,ahat3,DR-genie_ser,DR-tracked_ser,DR-static_ser,SR_ser,SC_ser,LMMSE_ser,OMA_ser,NOMA_ser +0,0.2250,0.0928,0.0567,0.0507,0.3119,0.2561,0.4011,0.2903,0.5273,0.5888,0.5834,0.6133,0.8700,0.6125,0.9294,0.6123 +1,0.2320,0.0952,0.0572,0.0507,0.3119,0.2561,0.4011,0.2903,0.5212,0.5836,0.5794,0.6103,0.8700,0.6097,0.9291,0.6166 +2,0.2392,0.0977,0.0577,0.0508,0.3119,0.2561,0.4011,0.2903,0.5259,0.5856,0.5872,0.6130,0.8794,0.6133,0.9241,0.6170 +3,0.2466,0.1003,0.0583,0.0509,0.3119,0.2561,0.4011,0.2903,0.5252,0.5813,0.5798,0.6102,0.8719,0.6086,0.9264,0.6033 +4,0.2542,0.1030,0.0588,0.0509,0.3119,0.2561,0.4011,0.2903,0.5336,0.5897,0.5920,0.6139,0.8764,0.6125,0.9322,0.6125 +5,0.2619,0.1059,0.0594,0.0510,0.5030,0.1793,0.3190,0.2032,0.5208,0.5703,0.5789,0.6025,0.8717,0.6022,0.9308,0.6103 +6,0.2699,0.1088,0.0601,0.0511,0.5030,0.1793,0.3190,0.2032,0.5303,0.5831,0.5908,0.6148,0.8770,0.6128,0.9258,0.6038 +7,0.2780,0.1119,0.0608,0.0512,0.5030,0.1793,0.3190,0.2032,0.5386,0.5878,0.5966,0.6236,0.8736,0.6238,0.9278,0.6130 +8,0.2863,0.1151,0.0615,0.0513,0.5030,0.1793,0.3190,0.2032,0.5242,0.5745,0.5795,0.6033,0.8666,0.6034,0.9298,0.6111 +9,0.2948,0.1185,0.0623,0.0514,0.5030,0.1793,0.3190,0.2032,0.5277,0.5741,0.5800,0.6005,0.8716,0.5991,0.9255,0.6047 +10,0.3035,0.1220,0.0631,0.0515,0.4108,0.1579,0.2431,0.4273,0.5241,0.5627,0.5805,0.6028,0.8634,0.6011,0.9298,0.6086 +11,0.3124,0.1256,0.0640,0.0517,0.4108,0.1579,0.2431,0.4273,0.5330,0.5730,0.5892,0.6098,0.8692,0.6103,0.9214,0.6083 +12,0.3214,0.1294,0.0649,0.0518,0.4108,0.1579,0.2431,0.4273,0.5175,0.5573,0.5770,0.5992,0.8706,0.5977,0.9298,0.6055 +13,0.3306,0.1333,0.0658,0.0519,0.4108,0.1579,0.2431,0.4273,0.5214,0.5614,0.5775,0.6005,0.8695,0.5992,0.9269,0.6103 +14,0.3399,0.1373,0.0669,0.0521,0.4108,0.1579,0.2431,0.4273,0.5339,0.5711,0.5881,0.6158,0.8750,0.6136,0.9289,0.6072 +15,0.3495,0.1415,0.0679,0.0523,0.4012,0.1882,0.4552,0.2991,0.5292,0.5769,0.5823,0.6058,0.8677,0.6059,0.9295,0.6125 +16,0.3592,0.1459,0.0691,0.0524,0.4012,0.1882,0.4552,0.2991,0.5467,0.5944,0.5983,0.6202,0.8708,0.6175,0.9270,0.6155 +17,0.3690,0.1505,0.0703,0.0526,0.4012,0.1882,0.4552,0.2991,0.5298,0.5845,0.5883,0.6097,0.8705,0.6059,0.9270,0.6138 +18,0.3790,0.1551,0.0715,0.0528,0.4012,0.1882,0.4552,0.2991,0.5325,0.5844,0.5884,0.6083,0.8681,0.6073,0.9284,0.6131 +19,0.3892,0.1600,0.0729,0.0531,0.4012,0.1882,0.4552,0.2991,0.5262,0.5748,0.5798,0.6038,0.8688,0.6009,0.9262,0.5967 +20,0.3994,0.1650,0.0743,0.0533,0.4049,0.1317,0.6036,0.3308,0.5277,0.5783,0.5875,0.6069,0.8684,0.6033,0.9245,0.6103 +21,0.4099,0.1702,0.0758,0.0535,0.4049,0.1317,0.6036,0.3308,0.5394,0.5845,0.5913,0.6156,0.8620,0.6119,0.9273,0.6080 +22,0.4204,0.1756,0.0773,0.0538,0.4049,0.1317,0.6036,0.3308,0.5347,0.5831,0.5887,0.6070,0.8667,0.6033,0.9255,0.6025 +23,0.4311,0.1812,0.0789,0.0541,0.4049,0.1317,0.6036,0.3308,0.5403,0.5866,0.5909,0.6128,0.8655,0.6106,0.9280,0.6108 +24,0.4419,0.1869,0.0807,0.0544,0.4049,0.1317,0.6036,0.3308,0.5308,0.5802,0.5848,0.6064,0.8623,0.6011,0.9292,0.6003 +25,0.4528,0.1928,0.0825,0.0547,0.3265,0.3772,0.4360,0.2932,0.5417,0.5858,0.5961,0.6173,0.8670,0.6100,0.9353,0.6155 +26,0.4637,0.1989,0.0843,0.0551,0.3265,0.3772,0.4360,0.2932,0.5345,0.5819,0.5873,0.6089,0.8630,0.6017,0.9331,0.6089 +27,0.4748,0.2051,0.0863,0.0555,0.3265,0.3772,0.4360,0.2932,0.5502,0.5936,0.5984,0.6209,0.8606,0.6133,0.9344,0.6214 +28,0.4860,0.2116,0.0884,0.0559,0.3265,0.3772,0.4360,0.2932,0.5411,0.5923,0.6003,0.6134,0.8591,0.6067,0.9269,0.6058 +29,0.4972,0.2182,0.0906,0.0563,0.3265,0.3772,0.4360,0.2932,0.5495,0.5944,0.5973,0.6189,0.8656,0.6119,0.9283,0.6184 +30,0.5085,0.2250,0.0928,0.0567,0.4766,0.5490,0.3485,0.2317,0.5328,0.6008,0.5933,0.6148,0.8562,0.6062,0.9338,0.6098 +31,0.5198,0.2320,0.0952,0.0572,0.4766,0.5490,0.3485,0.2317,0.5447,0.6103,0.6064,0.6244,0.8631,0.6164,0.9295,0.6209 +32,0.5312,0.2392,0.0977,0.0577,0.4766,0.5490,0.3485,0.2317,0.5303,0.5992,0.5927,0.6075,0.8480,0.5983,0.9319,0.6088 +33,0.5427,0.2466,0.1003,0.0583,0.4766,0.5490,0.3485,0.2317,0.5339,0.6067,0.5964,0.6164,0.8613,0.6045,0.9302,0.6134 +34,0.5541,0.2542,0.1030,0.0588,0.4766,0.5490,0.3485,0.2317,0.5355,0.6072,0.6022,0.6194,0.8588,0.6108,0.9250,0.6134 +35,0.5656,0.2619,0.1059,0.0594,0.3811,0.6096,0.2801,0.1622,0.5230,0.5736,0.5909,0.6088,0.8556,0.5911,0.9228,0.6036 +36,0.5770,0.2699,0.1088,0.0601,0.3811,0.6096,0.2801,0.1622,0.5256,0.5731,0.5887,0.6123,0.8573,0.5986,0.9208,0.6100 +37,0.5884,0.2780,0.1119,0.0608,0.3811,0.6096,0.2801,0.1622,0.5294,0.5783,0.5988,0.6175,0.8527,0.6028,0.9170,0.6067 +38,0.5999,0.2863,0.1151,0.0615,0.3811,0.6096,0.2801,0.1622,0.5267,0.5800,0.5942,0.6159,0.8444,0.5978,0.9097,0.6155 +39,0.6113,0.2948,0.1185,0.0623,0.3811,0.6096,0.2801,0.1622,0.5228,0.5780,0.5947,0.6194,0.8447,0.5984,0.9053,0.6178 +40,0.6226,0.3035,0.1220,0.0631,0.2668,0.4267,0.1960,0.1135,0.5003,0.5559,0.5800,0.6056,0.8361,0.5806,0.9008,0.6062 +41,0.6339,0.3124,0.1256,0.0640,0.2668,0.4267,0.1960,0.1135,0.5122,0.5678,0.5927,0.6200,0.8398,0.5938,0.9005,0.6119 +42,0.6451,0.3214,0.1294,0.0649,0.2668,0.4267,0.1960,0.1135,0.4987,0.5620,0.5847,0.6202,0.8366,0.5878,0.8869,0.6164 +43,0.6562,0.3306,0.1333,0.0658,0.2668,0.4267,0.1960,0.1135,0.4970,0.5578,0.5787,0.6139,0.8289,0.5842,0.8809,0.6106 +44,0.6672,0.3399,0.1373,0.0669,0.2668,0.4267,0.1960,0.1135,0.4925,0.5522,0.5767,0.6172,0.8331,0.5837,0.8803,0.6139 +45,0.6781,0.3495,0.1415,0.0679,0.4306,0.3402,0.4222,0.1214,0.4931,0.5739,0.5825,0.6219,0.8305,0.5845,0.8722,0.6048 +46,0.6889,0.3592,0.1459,0.0691,0.4306,0.3402,0.4222,0.1214,0.4914,0.5734,0.5863,0.6280,0.8322,0.5906,0.8719,0.6147 +47,0.6996,0.3690,0.1505,0.0703,0.4306,0.3402,0.4222,0.1214,0.4875,0.5788,0.5845,0.6341,0.8200,0.5848,0.8697,0.6100 +48,0.7101,0.3790,0.1551,0.0715,0.4306,0.3402,0.4222,0.1214,0.4661,0.5564,0.5689,0.6172,0.8206,0.5650,0.8488,0.6011 +49,0.7205,0.3892,0.1600,0.0729,0.4306,0.3402,0.4222,0.1214,0.4719,0.5667,0.5809,0.6359,0.8214,0.5837,0.8528,0.6150 +50,0.7306,0.3994,0.1650,0.0743,0.5664,0.3417,0.3669,0.0850,0.4484,0.5027,0.5577,0.6147,0.8105,0.5634,0.8475,0.5945 +51,0.7406,0.4099,0.1702,0.0758,0.5664,0.3417,0.3669,0.0850,0.4636,0.5214,0.5723,0.6338,0.8109,0.5711,0.8459,0.6127 +52,0.7504,0.4204,0.1756,0.0773,0.5664,0.3417,0.3669,0.0850,0.4641,0.5225,0.5767,0.6442,0.8078,0.5802,0.8430,0.6225 +53,0.7600,0.4311,0.1812,0.0789,0.5664,0.3417,0.3669,0.0850,0.4578,0.5145,0.5698,0.6428,0.7961,0.5728,0.8362,0.6216 +54,0.7693,0.4419,0.1869,0.0807,0.5664,0.3417,0.3669,0.0850,0.4420,0.5000,0.5608,0.6377,0.7973,0.5620,0.8323,0.6159 +55,0.7784,0.4528,0.1928,0.0825,0.6815,0.3752,0.2944,0.0876,0.4284,0.4733,0.5511,0.6372,0.7795,0.5519,0.8241,0.6097 +56,0.7873,0.4637,0.1989,0.0843,0.6815,0.3752,0.2944,0.0876,0.4150,0.4553,0.5417,0.6320,0.7719,0.5384,0.8191,0.6048 +57,0.7959,0.4748,0.2051,0.0863,0.6815,0.3752,0.2944,0.0876,0.4031,0.4447,0.5275,0.6347,0.7736,0.5406,0.8194,0.6030 +58,0.8043,0.4860,0.2116,0.0884,0.6815,0.3752,0.2944,0.0876,0.4017,0.4394,0.5286,0.6353,0.7592,0.5320,0.8161,0.6022 +59,0.8123,0.4972,0.2182,0.0906,0.6815,0.3752,0.2944,0.0876,0.3917,0.4294,0.5178,0.6398,0.7673,0.5306,0.8153,0.6144 +60,0.8201,0.5085,0.2250,0.0928,0.7620,0.5266,0.2707,0.0614,0.4025,0.4367,0.5219,0.6555,0.7481,0.5284,0.8078,0.6097 +61,0.8275,0.5198,0.2320,0.0952,0.7620,0.5266,0.2707,0.0614,0.3959,0.4328,0.5194,0.6620,0.7506,0.5339,0.8100,0.6188 +62,0.8346,0.5312,0.2392,0.0977,0.7620,0.5266,0.2707,0.0614,0.3772,0.4113,0.5034,0.6430,0.7334,0.5127,0.8047,0.6066 +63,0.8415,0.5427,0.2466,0.1003,0.7620,0.5266,0.2707,0.0614,0.3656,0.4012,0.4852,0.6445,0.7181,0.5086,0.8092,0.6123 +64,0.8479,0.5541,0.2542,0.1030,0.7620,0.5266,0.2707,0.0614,0.3669,0.4002,0.4944,0.6781,0.7295,0.5186,0.8113,0.6239 +65,0.8541,0.5656,0.2619,0.1059,0.7780,0.5886,0.2782,0.1319,0.3423,0.3628,0.4720,0.6581,0.7077,0.4858,0.7975,0.6044 +66,0.8598,0.5770,0.2699,0.1088,0.7780,0.5886,0.2782,0.1319,0.3559,0.3697,0.4758,0.6737,0.7070,0.5028,0.8017,0.6109 +67,0.8653,0.5884,0.2780,0.1119,0.7780,0.5886,0.2782,0.1319,0.3431,0.3595,0.4656,0.6742,0.6959,0.4964,0.8027,0.6173 +68,0.8703,0.5999,0.2863,0.1151,0.7780,0.5886,0.2782,0.1319,0.3206,0.3348,0.4347,0.6705,0.6795,0.4675,0.7986,0.6094 +69,0.8750,0.6113,0.2948,0.1185,0.7780,0.5886,0.2782,0.1319,0.3141,0.3311,0.4333,0.6734,0.6716,0.4728,0.7978,0.6045 +70,0.8793,0.6226,0.3035,0.1220,0.8152,0.5801,0.3210,0.1262,0.3159,0.3256,0.4283,0.6806,0.6633,0.4614,0.7948,0.6214 +71,0.8832,0.6339,0.3124,0.1256,0.8152,0.5801,0.3210,0.1262,0.3111,0.3172,0.4192,0.6942,0.6588,0.4544,0.7997,0.6178 +72,0.8867,0.6451,0.3214,0.1294,0.8152,0.5801,0.3210,0.1262,0.2930,0.3045,0.3930,0.6834,0.6375,0.4402,0.8002,0.6102 +73,0.8898,0.6562,0.3306,0.1333,0.8152,0.5801,0.3210,0.1262,0.2866,0.2953,0.3877,0.6806,0.6170,0.4252,0.7989,0.5981 +74,0.8925,0.6672,0.3399,0.1373,0.8152,0.5801,0.3210,0.1262,0.2805,0.2858,0.3880,0.6878,0.6180,0.4269,0.7948,0.6006 +75,0.8948,0.6781,0.3495,0.1415,0.8280,0.6911,0.2812,0.1456,0.2850,0.2884,0.3838,0.7037,0.6061,0.4295,0.8063,0.6092 +76,0.8966,0.6889,0.3592,0.1459,0.8280,0.6911,0.2812,0.1456,0.2711,0.2786,0.3611,0.6967,0.5878,0.4047,0.7991,0.6066 +77,0.8981,0.6996,0.3690,0.1505,0.8280,0.6911,0.2812,0.1456,0.2692,0.2762,0.3602,0.7033,0.5841,0.4091,0.8008,0.6123 +78,0.8992,0.7101,0.3790,0.1551,0.8280,0.6911,0.2812,0.1456,0.2562,0.2611,0.3381,0.7055,0.5684,0.3895,0.8025,0.6100 +79,0.8998,0.7205,0.3892,0.1600,0.8280,0.6911,0.2812,0.1456,0.2658,0.2734,0.3513,0.7169,0.5609,0.3973,0.8005,0.6106 +80,0.9000,0.7306,0.3994,0.1650,0.8175,0.6832,0.3591,0.1551,0.2517,0.2598,0.3228,0.7125,0.5463,0.3734,0.7998,0.6023 +81,0.8998,0.7406,0.4099,0.1702,0.8175,0.6832,0.3591,0.1551,0.2448,0.2556,0.3212,0.7169,0.5433,0.3734,0.7989,0.6078 +82,0.8992,0.7504,0.4204,0.1756,0.8175,0.6832,0.3591,0.1551,0.2550,0.2608,0.3203,0.7284,0.5334,0.3731,0.8083,0.6119 +83,0.8981,0.7600,0.4311,0.1812,0.8175,0.6832,0.3591,0.1551,0.2270,0.2344,0.2856,0.7184,0.5056,0.3438,0.7997,0.6087 +84,0.8966,0.7693,0.4419,0.1869,0.8175,0.6832,0.3591,0.1551,0.2228,0.2322,0.2875,0.7209,0.5028,0.3439,0.8033,0.6133 +85,0.8948,0.7784,0.4528,0.1928,0.7546,0.7632,0.5098,0.1086,0.2263,0.2333,0.2809,0.7312,0.4891,0.3481,0.8028,0.6170 +86,0.8925,0.7873,0.4637,0.1989,0.7546,0.7632,0.5098,0.1086,0.2180,0.2275,0.2772,0.7378,0.4770,0.3352,0.8047,0.6158 +87,0.8898,0.7959,0.4748,0.2051,0.7546,0.7632,0.5098,0.1086,0.2167,0.2244,0.2711,0.7444,0.4778,0.3331,0.8100,0.6205 +88,0.8867,0.8043,0.4860,0.2116,0.7546,0.7632,0.5098,0.1086,0.2077,0.2128,0.2555,0.7414,0.4595,0.3242,0.8072,0.6209 +89,0.8832,0.8123,0.4972,0.2182,0.7546,0.7632,0.5098,0.1086,0.1977,0.2070,0.2437,0.7470,0.4389,0.3145,0.8105,0.5988 +90,0.8793,0.8201,0.5085,0.2250,0.8132,0.8193,0.4518,0.1791,0.1758,0.1816,0.2305,0.7377,0.4353,0.2975,0.8144,0.6045 +91,0.8750,0.8275,0.5198,0.2320,0.8132,0.8193,0.4518,0.1791,0.1733,0.1791,0.2181,0.7420,0.4148,0.2867,0.8156,0.6100 +92,0.8703,0.8346,0.5312,0.2392,0.8132,0.8193,0.4518,0.1791,0.1720,0.1777,0.2272,0.7539,0.4261,0.3005,0.8214,0.6180 +93,0.8653,0.8415,0.5427,0.2466,0.8132,0.8193,0.4518,0.1791,0.1623,0.1708,0.2125,0.7552,0.4000,0.2787,0.8219,0.6170 +94,0.8598,0.8479,0.5541,0.2542,0.8132,0.8193,0.4518,0.1791,0.1636,0.1705,0.2070,0.7620,0.3958,0.2834,0.8267,0.6202 +95,0.8541,0.8541,0.5656,0.2619,0.8405,0.8585,0.5082,0.1960,0.1519,0.1597,0.1958,0.7583,0.3752,0.2661,0.8252,0.6100 +96,0.8479,0.8598,0.5770,0.2699,0.8405,0.8585,0.5082,0.1960,0.1423,0.1447,0.1839,0.7575,0.3669,0.2577,0.8289,0.6159 +97,0.8415,0.8653,0.5884,0.2780,0.8405,0.8585,0.5082,0.1960,0.1497,0.1544,0.1891,0.7697,0.3663,0.2689,0.8350,0.6209 +98,0.8346,0.8703,0.5999,0.2863,0.8405,0.8585,0.5082,0.1960,0.1359,0.1419,0.1742,0.7605,0.3372,0.2411,0.8309,0.6025 +99,0.8275,0.8750,0.6113,0.2948,0.8405,0.8585,0.5082,0.1960,0.1331,0.1400,0.1714,0.7672,0.3372,0.2434,0.8434,0.6098 +100,0.8201,0.8793,0.6226,0.3035,0.8453,0.8563,0.5480,0.2668,0.1228,0.1212,0.1511,0.7609,0.3120,0.2172,0.8416,0.6038 +101,0.8123,0.8832,0.6339,0.3124,0.8453,0.8563,0.5480,0.2668,0.1275,0.1300,0.1583,0.7595,0.3139,0.2258,0.8395,0.6030 +102,0.8043,0.8867,0.6451,0.3214,0.8453,0.8563,0.5480,0.2668,0.1259,0.1256,0.1517,0.7677,0.3056,0.2205,0.8581,0.6172 +103,0.7959,0.8898,0.6562,0.3306,0.8453,0.8563,0.5480,0.2668,0.1328,0.1311,0.1592,0.7720,0.3153,0.2337,0.8556,0.6191 +104,0.7873,0.8925,0.6672,0.3399,0.8453,0.8563,0.5480,0.2668,0.1173,0.1169,0.1405,0.7703,0.2888,0.2075,0.8602,0.6172 +105,0.7784,0.8948,0.6781,0.3495,0.7990,0.8844,0.6222,0.2857,0.1198,0.1186,0.1377,0.7706,0.2812,0.2039,0.8589,0.6045 +106,0.7693,0.8966,0.6889,0.3592,0.7990,0.8844,0.6222,0.2857,0.1055,0.1045,0.1231,0.7655,0.2698,0.1933,0.8702,0.6097 +107,0.7600,0.8981,0.6996,0.3690,0.7990,0.8844,0.6222,0.2857,0.1133,0.1130,0.1330,0.7745,0.2722,0.2048,0.8752,0.6180 +108,0.7504,0.8992,0.7101,0.3790,0.7990,0.8844,0.6222,0.2857,0.0983,0.1000,0.1108,0.7653,0.2562,0.1861,0.8809,0.5988 +109,0.7406,0.8998,0.7205,0.3892,0.7990,0.8844,0.6222,0.2857,0.1014,0.0989,0.1197,0.7642,0.2487,0.1875,0.8803,0.6081 +110,0.7306,0.9000,0.7306,0.3994,0.6546,0.9041,0.5924,0.3644,0.0964,0.0952,0.1086,0.7709,0.2441,0.1841,0.8855,0.6081 +111,0.7205,0.8998,0.7406,0.4099,0.6546,0.9041,0.5924,0.3644,0.0986,0.0964,0.1122,0.7766,0.2450,0.1889,0.8973,0.6173 +112,0.7101,0.8992,0.7504,0.4204,0.6546,0.9041,0.5924,0.3644,0.0880,0.0872,0.0978,0.7739,0.2331,0.1766,0.9114,0.6088 +113,0.6996,0.8981,0.7600,0.4311,0.6546,0.9041,0.5924,0.3644,0.0817,0.0783,0.0873,0.7783,0.2133,0.1613,0.9067,0.6089 +114,0.6889,0.8966,0.7693,0.4419,0.6546,0.9041,0.5924,0.3644,0.0822,0.0838,0.0880,0.7781,0.2191,0.1664,0.9194,0.6012 +115,0.6781,0.8948,0.7784,0.4528,0.6431,0.9179,0.6429,0.3728,0.0777,0.0778,0.0820,0.7820,0.2239,0.1752,0.9200,0.6120 +116,0.6672,0.8925,0.7873,0.4637,0.6431,0.9179,0.6429,0.3728,0.0731,0.0764,0.0808,0.7739,0.2134,0.1694,0.9278,0.6056 +117,0.6562,0.8898,0.7959,0.4748,0.6431,0.9179,0.6429,0.3728,0.0642,0.0656,0.0652,0.7792,0.2086,0.1677,0.9341,0.6159 +118,0.6451,0.8867,0.8043,0.4860,0.6431,0.9179,0.6429,0.3728,0.0561,0.0602,0.0603,0.7816,0.1995,0.1584,0.9478,0.6147 +119,0.6339,0.8832,0.8123,0.4972,0.6431,0.9179,0.6429,0.3728,0.0533,0.0573,0.0559,0.7816,0.1975,0.1600,0.9520,0.6120 +120,0.6226,0.8793,0.8201,0.5085,0.5566,0.9275,0.7016,0.4034,0.0480,0.0509,0.0550,0.7833,0.1966,0.1541,0.9569,0.6092 +121,0.6113,0.8750,0.8275,0.5198,0.5566,0.9275,0.7016,0.4034,0.0383,0.0436,0.0458,0.7733,0.1966,0.1602,0.9630,0.6020 +122,0.5999,0.8703,0.8346,0.5312,0.5566,0.9275,0.7016,0.4034,0.0353,0.0400,0.0447,0.7839,0.1888,0.1530,0.9697,0.6166 +123,0.5884,0.8653,0.8415,0.5427,0.5566,0.9275,0.7016,0.4034,0.0328,0.0369,0.0425,0.7770,0.1881,0.1487,0.9717,0.6044 +124,0.5770,0.8598,0.8479,0.5541,0.5566,0.9275,0.7016,0.4034,0.0319,0.0366,0.0419,0.7825,0.1866,0.1561,0.9823,0.6164 +125,0.5656,0.8541,0.8541,0.5656,0.5426,0.9342,0.7029,0.4248,0.0303,0.0322,0.0409,0.7817,0.1777,0.1481,0.9866,0.6102 +126,0.5541,0.8479,0.8598,0.5770,0.5426,0.9342,0.7029,0.4248,0.0294,0.0302,0.0380,0.7758,0.1748,0.1436,0.9912,0.6072 +127,0.5427,0.8415,0.8653,0.5884,0.5426,0.9342,0.7029,0.4248,0.0295,0.0294,0.0386,0.7734,0.1728,0.1445,0.9947,0.5983 +128,0.5312,0.8346,0.8703,0.5999,0.5426,0.9342,0.7029,0.4248,0.0414,0.0434,0.0517,0.7739,0.1909,0.1572,0.9953,0.6108 +129,0.5198,0.8275,0.8750,0.6113,0.5426,0.9342,0.7029,0.4248,0.0433,0.0433,0.0534,0.7909,0.1986,0.1658,0.9973,0.6273 +130,0.5085,0.8201,0.8793,0.6226,0.5356,0.9157,0.7063,0.5244,0.0458,0.0464,0.0528,0.7773,0.1791,0.1469,0.9991,0.6067 +131,0.4972,0.8123,0.8832,0.6339,0.5356,0.9157,0.7063,0.5244,0.0481,0.0500,0.0550,0.7780,0.1855,0.1517,0.9992,0.6070 +132,0.4860,0.8043,0.8867,0.6451,0.5356,0.9157,0.7063,0.5244,0.0592,0.0642,0.0641,0.7716,0.1980,0.1597,0.9997,0.6048 +133,0.4748,0.7959,0.8898,0.6562,0.5356,0.9157,0.7063,0.5244,0.0642,0.0700,0.0653,0.7758,0.2031,0.1625,0.9998,0.6064 +134,0.4637,0.7873,0.8925,0.6672,0.5356,0.9157,0.7063,0.5244,0.0731,0.0845,0.0788,0.7803,0.2075,0.1613,0.9998,0.6131 +135,0.4528,0.7784,0.8948,0.6781,0.5315,0.9260,0.7151,0.6520,0.0722,0.0803,0.0733,0.7822,0.2139,0.1641,0.9994,0.6095 +136,0.4419,0.7693,0.8966,0.6889,0.5315,0.9260,0.7151,0.6520,0.0806,0.0900,0.0863,0.7748,0.2262,0.1794,0.9998,0.6069 +137,0.4311,0.7600,0.8981,0.6996,0.5315,0.9260,0.7151,0.6520,0.0856,0.0958,0.0908,0.7723,0.2284,0.1759,0.9997,0.6114 +138,0.4204,0.7504,0.8992,0.7101,0.5315,0.9260,0.7151,0.6520,0.0897,0.1022,0.0966,0.7694,0.2259,0.1739,1.0000,0.6072 +139,0.4099,0.7406,0.8998,0.7205,0.5315,0.9260,0.7151,0.6520,0.0994,0.1153,0.1070,0.7670,0.2386,0.1781,1.0000,0.6094 +140,0.3994,0.7306,0.9000,0.7306,0.4095,0.8086,0.7856,0.6475,0.1019,0.1095,0.1080,0.7816,0.2458,0.1844,1.0000,0.6025 +141,0.3892,0.7205,0.8998,0.7406,0.4095,0.8086,0.7856,0.6475,0.1017,0.1134,0.1113,0.7619,0.2514,0.1877,1.0000,0.6055 +142,0.3790,0.7101,0.8992,0.7504,0.4095,0.8086,0.7856,0.6475,0.1022,0.1142,0.1155,0.7670,0.2623,0.1925,1.0000,0.6173 +143,0.3690,0.6996,0.8981,0.7600,0.4095,0.8086,0.7856,0.6475,0.1095,0.1233,0.1234,0.7730,0.2714,0.1948,0.9998,0.6002 +144,0.3592,0.6889,0.8966,0.7693,0.4095,0.8086,0.7856,0.6475,0.1128,0.1269,0.1298,0.7759,0.2842,0.2064,0.9998,0.6119 +145,0.3495,0.6781,0.8948,0.7784,0.3668,0.7617,0.8349,0.6377,0.1142,0.1275,0.1344,0.7666,0.2777,0.1997,0.9997,0.6119 +146,0.3399,0.6672,0.8925,0.7873,0.3668,0.7617,0.8349,0.6377,0.1119,0.1244,0.1305,0.7595,0.2836,0.2012,0.9998,0.6047 +147,0.3306,0.6562,0.8898,0.7959,0.3668,0.7617,0.8349,0.6377,0.1175,0.1325,0.1419,0.7700,0.2923,0.2134,0.9995,0.6122 +148,0.3214,0.6451,0.8867,0.8043,0.3668,0.7617,0.8349,0.6377,0.1198,0.1367,0.1473,0.7512,0.3027,0.2114,0.9994,0.6053 +149,0.3124,0.6339,0.8832,0.8123,0.3668,0.7617,0.8349,0.6377,0.1203,0.1414,0.1509,0.7628,0.3097,0.2175,0.9988,0.6119 +150,0.3035,0.6226,0.8793,0.8201,0.4112,0.6657,0.7920,0.7314,0.1303,0.1489,0.1600,0.7612,0.3248,0.2303,0.9984,0.6103 +151,0.2948,0.6113,0.8750,0.8275,0.4112,0.6657,0.7920,0.7314,0.1336,0.1511,0.1636,0.7675,0.3395,0.2434,0.9986,0.6181 +152,0.2863,0.5999,0.8703,0.8346,0.4112,0.6657,0.7920,0.7314,0.1314,0.1500,0.1669,0.7586,0.3419,0.2395,0.9988,0.6130 +153,0.2780,0.5884,0.8653,0.8415,0.4112,0.6657,0.7920,0.7314,0.1389,0.1628,0.1792,0.7602,0.3600,0.2533,0.9980,0.6064 +154,0.2699,0.5770,0.8598,0.8479,0.4112,0.6657,0.7920,0.7314,0.1455,0.1670,0.1803,0.7602,0.3666,0.2539,0.9967,0.6109 +155,0.2619,0.5656,0.8541,0.8541,0.4023,0.6487,0.7279,0.7909,0.1444,0.1561,0.1864,0.7567,0.3900,0.2736,0.9967,0.6184 +156,0.2542,0.5541,0.8479,0.8598,0.4023,0.6487,0.7279,0.7909,0.1544,0.1683,0.1930,0.7462,0.3825,0.2703,0.9967,0.6023 +157,0.2466,0.5427,0.8415,0.8653,0.4023,0.6487,0.7279,0.7909,0.1561,0.1731,0.2031,0.7436,0.3978,0.2725,0.9961,0.5998 +158,0.2392,0.5312,0.8346,0.8703,0.4023,0.6487,0.7279,0.7909,0.1666,0.1856,0.2117,0.7436,0.3997,0.2844,0.9964,0.5995 +159,0.2320,0.5198,0.8275,0.8750,0.4023,0.6487,0.7279,0.7909,0.1833,0.2002,0.2272,0.7475,0.4266,0.3025,0.9970,0.6202 +160,0.2250,0.5085,0.8201,0.8793,0.3996,0.7391,0.6317,0.8021,0.1950,0.2144,0.2455,0.7559,0.4427,0.3178,0.9945,0.6152 +161,0.2182,0.4972,0.8123,0.8832,0.3996,0.7391,0.6317,0.8021,0.1914,0.2119,0.2384,0.7483,0.4483,0.3091,0.9933,0.6070 +162,0.2116,0.4860,0.8043,0.8867,0.3996,0.7391,0.6317,0.8021,0.2041,0.2273,0.2481,0.7394,0.4559,0.3205,0.9925,0.6189 +163,0.2051,0.4748,0.7959,0.8898,0.3996,0.7391,0.6317,0.8021,0.2064,0.2313,0.2519,0.7356,0.4667,0.3200,0.9944,0.6089 +164,0.1989,0.4637,0.7873,0.8925,0.3996,0.7391,0.6317,0.8021,0.2105,0.2370,0.2587,0.7178,0.4736,0.3278,0.9931,0.5963 +165,0.1928,0.4528,0.7784,0.8948,0.4074,0.6052,0.6518,0.8465,0.2225,0.2411,0.2802,0.7383,0.4942,0.3445,0.9923,0.6205 +166,0.1869,0.4419,0.7693,0.8966,0.4074,0.6052,0.6518,0.8465,0.2337,0.2578,0.2962,0.7292,0.4977,0.3522,0.9908,0.6125 +167,0.1812,0.4311,0.7600,0.8981,0.4074,0.6052,0.6518,0.8465,0.2188,0.2464,0.2772,0.7145,0.4944,0.3347,0.9902,0.5953 +168,0.1756,0.4204,0.7504,0.8992,0.4074,0.6052,0.6518,0.8465,0.2425,0.2695,0.3036,0.7144,0.5233,0.3644,0.9897,0.6073 +169,0.1702,0.4099,0.7406,0.8998,0.4074,0.6052,0.6518,0.8465,0.2522,0.2827,0.3130,0.7269,0.5300,0.3769,0.9898,0.6197 +170,0.1650,0.3994,0.7306,0.9000,0.3610,0.5848,0.7045,0.8047,0.2555,0.2855,0.3164,0.7114,0.5473,0.3731,0.9900,0.6013 +171,0.1600,0.3892,0.7205,0.8998,0.3610,0.5848,0.7045,0.8047,0.2678,0.2989,0.3339,0.7116,0.5625,0.3881,0.9887,0.6130 +172,0.1551,0.3790,0.7101,0.8992,0.3610,0.5848,0.7045,0.8047,0.2567,0.2941,0.3345,0.6994,0.5622,0.3795,0.9881,0.6139 +173,0.1505,0.3690,0.6996,0.8981,0.3610,0.5848,0.7045,0.8047,0.2687,0.3083,0.3483,0.7055,0.5852,0.4097,0.9866,0.6177 +174,0.1459,0.3592,0.6889,0.8966,0.3610,0.5848,0.7045,0.8047,0.2745,0.3125,0.3511,0.6942,0.5920,0.4102,0.9844,0.6072 +175,0.1415,0.3495,0.6781,0.8948,0.3609,0.5077,0.7782,0.6686,0.2787,0.3044,0.3628,0.6955,0.6058,0.4130,0.9848,0.6083 +176,0.1373,0.3399,0.6672,0.8925,0.3609,0.5077,0.7782,0.6686,0.2905,0.3195,0.3769,0.6866,0.6252,0.4309,0.9856,0.6156 +177,0.1333,0.3306,0.6562,0.8898,0.3609,0.5077,0.7782,0.6686,0.3072,0.3339,0.3930,0.6944,0.6361,0.4478,0.9870,0.6170 +178,0.1294,0.3214,0.6451,0.8867,0.3609,0.5077,0.7782,0.6686,0.3008,0.3341,0.4025,0.6878,0.6455,0.4503,0.9850,0.6223 +179,0.1256,0.3124,0.6339,0.8832,0.3609,0.5077,0.7782,0.6686,0.3078,0.3428,0.4114,0.6842,0.6467,0.4545,0.9833,0.6145 +180,0.1220,0.3035,0.6226,0.8793,0.2830,0.4513,0.6974,0.7530,0.3212,0.3528,0.4223,0.6783,0.6580,0.4555,0.9817,0.6088 +181,0.1185,0.2948,0.6113,0.8750,0.2830,0.4513,0.6974,0.7530,0.3152,0.3542,0.4234,0.6670,0.6728,0.4616,0.9831,0.6111 +182,0.1151,0.2863,0.5999,0.8703,0.2830,0.4513,0.6974,0.7530,0.3269,0.3689,0.4327,0.6723,0.6731,0.4773,0.9816,0.6137 +183,0.1119,0.2780,0.5884,0.8653,0.2830,0.4513,0.6974,0.7530,0.3366,0.3786,0.4489,0.6630,0.6878,0.4841,0.9800,0.6108 +184,0.1088,0.2699,0.5770,0.8598,0.2830,0.4513,0.6974,0.7530,0.3345,0.3830,0.4481,0.6591,0.7108,0.4878,0.9794,0.6075 +185,0.1059,0.2619,0.5656,0.8541,0.2283,0.4507,0.6742,0.7489,0.3503,0.3883,0.4627,0.6581,0.7131,0.4953,0.9811,0.6108 +186,0.1030,0.2542,0.5541,0.8479,0.2283,0.4507,0.6742,0.7489,0.3666,0.4020,0.4778,0.6595,0.7230,0.5069,0.9783,0.6095 +187,0.1003,0.2466,0.5427,0.8415,0.2283,0.4507,0.6742,0.7489,0.3625,0.4083,0.4831,0.6517,0.7219,0.5097,0.9783,0.6100 +188,0.0977,0.2392,0.5312,0.8346,0.2283,0.4507,0.6742,0.7489,0.3839,0.4247,0.4997,0.6630,0.7366,0.5247,0.9792,0.6103 +189,0.0952,0.2320,0.5198,0.8275,0.2283,0.4507,0.6742,0.7489,0.3759,0.4217,0.5020,0.6500,0.7409,0.5208,0.9769,0.6033 +190,0.0928,0.2250,0.5085,0.8201,0.2204,0.5558,0.7569,0.6387,0.3842,0.4609,0.5042,0.6461,0.7492,0.5255,0.9750,0.6073 +191,0.0906,0.2182,0.4972,0.8123,0.2204,0.5558,0.7569,0.6387,0.4127,0.4914,0.5231,0.6519,0.7656,0.5423,0.9747,0.6150 +192,0.0884,0.2116,0.4860,0.8043,0.2204,0.5558,0.7569,0.6387,0.4161,0.4811,0.5283,0.6395,0.7642,0.5358,0.9756,0.6044 +193,0.0863,0.2051,0.4748,0.7959,0.2204,0.5558,0.7569,0.6387,0.4188,0.4950,0.5341,0.6416,0.7775,0.5483,0.9730,0.6034 +194,0.0843,0.1989,0.4637,0.7873,0.2204,0.5558,0.7569,0.6387,0.4298,0.5053,0.5348,0.6389,0.7789,0.5520,0.9681,0.6080 +195,0.0825,0.1928,0.4528,0.7784,0.1563,0.3891,0.7076,0.5657,0.4384,0.4919,0.5558,0.6420,0.7900,0.5616,0.9730,0.6128 +196,0.0807,0.1869,0.4419,0.7693,0.1563,0.3891,0.7076,0.5657,0.4398,0.4961,0.5511,0.6342,0.7902,0.5597,0.9680,0.6103 +197,0.0789,0.1812,0.4311,0.7600,0.1563,0.3891,0.7076,0.5657,0.4366,0.4956,0.5480,0.6264,0.7941,0.5558,0.9714,0.6095 +198,0.0773,0.1756,0.4204,0.7504,0.1563,0.3891,0.7076,0.5657,0.4583,0.5166,0.5692,0.6366,0.8066,0.5755,0.9681,0.6161 +199,0.0758,0.1702,0.4099,0.7406,0.1563,0.3891,0.7076,0.5657,0.4570,0.5278,0.5742,0.6353,0.8100,0.5761,0.9677,0.6130 +200,0.0743,0.1650,0.3994,0.7306,0.1094,0.3187,0.5844,0.6810,0.4683,0.5158,0.5716,0.6322,0.8214,0.5753,0.9692,0.6178 +201,0.0729,0.1600,0.3892,0.7205,0.1094,0.3187,0.5844,0.6810,0.4617,0.5113,0.5602,0.6206,0.8131,0.5678,0.9644,0.6091 +202,0.0715,0.1551,0.3790,0.7101,0.1094,0.3187,0.5844,0.6810,0.4773,0.5277,0.5750,0.6303,0.8192,0.5848,0.9680,0.6095 +203,0.0703,0.1505,0.3690,0.6996,0.1094,0.3187,0.5844,0.6810,0.4764,0.5306,0.5727,0.6166,0.8142,0.5716,0.9644,0.6064 +204,0.0691,0.1459,0.3592,0.6889,0.1094,0.3187,0.5844,0.6810,0.4811,0.5361,0.5730,0.6220,0.8284,0.5828,0.9620,0.6141 +205,0.0679,0.1415,0.3495,0.6781,0.1171,0.2396,0.4780,0.7617,0.4900,0.5477,0.5775,0.6222,0.8348,0.5856,0.9691,0.6062 +206,0.0669,0.1373,0.3399,0.6672,0.1171,0.2396,0.4780,0.7617,0.5064,0.5620,0.5867,0.6256,0.8397,0.5923,0.9647,0.6081 +207,0.0658,0.1333,0.3306,0.6562,0.1171,0.2396,0.4780,0.7617,0.5139,0.5695,0.5898,0.6269,0.8344,0.5970,0.9622,0.6255 +208,0.0649,0.1294,0.3214,0.6451,0.1171,0.2396,0.4780,0.7617,0.5095,0.5716,0.5894,0.6256,0.8419,0.5934,0.9611,0.6200 +209,0.0640,0.1256,0.3124,0.6339,0.1171,0.2396,0.4780,0.7617,0.5125,0.5802,0.5948,0.6253,0.8308,0.5989,0.9616,0.6173 +210,0.0631,0.1220,0.3035,0.6226,0.0820,0.1677,0.4851,0.6187,0.5186,0.5709,0.5964,0.6256,0.8497,0.6052,0.9650,0.6172 +211,0.0623,0.1185,0.2948,0.6113,0.0820,0.1677,0.4851,0.6187,0.5139,0.5714,0.5814,0.6136,0.8414,0.5906,0.9580,0.6053 +212,0.0615,0.1151,0.2863,0.5999,0.0820,0.1677,0.4851,0.6187,0.5234,0.5822,0.5911,0.6158,0.8494,0.6025,0.9580,0.6114 +213,0.0608,0.1119,0.2780,0.5884,0.0820,0.1677,0.4851,0.6187,0.5212,0.5762,0.5894,0.6087,0.8491,0.5912,0.9531,0.6006 +214,0.0601,0.1088,0.2699,0.5770,0.0820,0.1677,0.4851,0.6187,0.5287,0.5892,0.5919,0.6122,0.8447,0.5988,0.9559,0.6109 +215,0.0594,0.1059,0.2619,0.5656,0.2902,0.1174,0.3395,0.6966,0.5250,0.5744,0.5919,0.6142,0.8552,0.5998,0.9573,0.6042 +216,0.0588,0.1030,0.2542,0.5541,0.2902,0.1174,0.3395,0.6966,0.5273,0.5772,0.5892,0.6145,0.8583,0.6022,0.9544,0.6106 +217,0.0583,0.1003,0.2466,0.5427,0.2902,0.1174,0.3395,0.6966,0.5300,0.5817,0.5861,0.6089,0.8511,0.6016,0.9534,0.6055 +218,0.0577,0.0977,0.2392,0.5312,0.2902,0.1174,0.3395,0.6966,0.5300,0.5834,0.5861,0.6086,0.8586,0.5977,0.9542,0.6047 +219,0.0572,0.0952,0.2320,0.5198,0.2902,0.1174,0.3395,0.6966,0.5170,0.5759,0.5747,0.5941,0.8530,0.5834,0.9552,0.5950 +220,0.0567,0.0928,0.2250,0.5085,0.2299,0.0822,0.3265,0.7726,0.5405,0.5991,0.5941,0.6177,0.8627,0.6083,0.9528,0.6183 +221,0.0563,0.0906,0.2182,0.4972,0.2299,0.0822,0.3265,0.7726,0.5250,0.5852,0.5806,0.6005,0.8661,0.5927,0.9475,0.5989 +222,0.0559,0.0884,0.2116,0.4860,0.2299,0.0822,0.3265,0.7726,0.5413,0.5958,0.5953,0.6120,0.8603,0.6048,0.9475,0.6062 +223,0.0555,0.0863,0.2051,0.4748,0.2299,0.0822,0.3265,0.7726,0.5408,0.6081,0.5934,0.6198,0.8642,0.6109,0.9497,0.6173 +224,0.0551,0.0843,0.1989,0.4637,0.2299,0.0822,0.3265,0.7726,0.5463,0.6025,0.5925,0.6119,0.8594,0.6048,0.9477,0.6167 +225,0.0547,0.0825,0.1928,0.4528,0.2324,0.1137,0.2285,0.5778,0.5242,0.5775,0.5778,0.6013,0.8611,0.5997,0.9495,0.6041 +226,0.0544,0.0807,0.1869,0.4419,0.2324,0.1137,0.2285,0.5778,0.5298,0.5759,0.5870,0.6044,0.8592,0.5995,0.9464,0.6095 +227,0.0541,0.0789,0.1812,0.4311,0.2324,0.1137,0.2285,0.5778,0.5370,0.5831,0.5872,0.6139,0.8667,0.6098,0.9456,0.6039 +228,0.0538,0.0773,0.1756,0.4204,0.2324,0.1137,0.2285,0.5778,0.5262,0.5827,0.5856,0.6052,0.8687,0.5986,0.9478,0.6109 +229,0.0535,0.0758,0.1702,0.4099,0.2324,0.1137,0.2285,0.5778,0.5348,0.5909,0.5902,0.6106,0.8703,0.6100,0.9389,0.6080 +230,0.0533,0.0743,0.1650,0.3994,0.1667,0.3646,0.2060,0.6158,0.5333,0.5683,0.5856,0.6083,0.8689,0.6050,0.9448,0.6006 +231,0.0531,0.0729,0.1600,0.3892,0.1667,0.3646,0.2060,0.6158,0.5364,0.5747,0.5925,0.6194,0.8692,0.6159,0.9441,0.6055 +232,0.0528,0.0715,0.1551,0.3790,0.1667,0.3646,0.2060,0.6158,0.5302,0.5672,0.5841,0.6092,0.8659,0.6056,0.9387,0.6039 +233,0.0526,0.0703,0.1505,0.3690,0.1667,0.3646,0.2060,0.6158,0.5287,0.5711,0.5822,0.6031,0.8681,0.6025,0.9406,0.6092 +234,0.0524,0.0691,0.1459,0.3592,0.1667,0.3646,0.2060,0.6158,0.5314,0.5684,0.5831,0.6077,0.8689,0.6078,0.9392,0.6175 +235,0.0523,0.0679,0.1415,0.3495,0.1167,0.4464,0.2372,0.4986,0.5280,0.5591,0.5814,0.6070,0.8725,0.6047,0.9408,0.6117 +236,0.0521,0.0669,0.1373,0.3399,0.1167,0.4464,0.2372,0.4986,0.5278,0.5594,0.5803,0.6111,0.8675,0.6105,0.9364,0.6059 +237,0.0519,0.0658,0.1333,0.3306,0.1167,0.4464,0.2372,0.4986,0.5233,0.5508,0.5745,0.5973,0.8630,0.5967,0.9389,0.5955 +238,0.0518,0.0649,0.1294,0.3214,0.1167,0.4464,0.2372,0.4986,0.5361,0.5722,0.5936,0.6155,0.8686,0.6133,0.9463,0.6055 +239,0.0517,0.0640,0.1256,0.3124,0.1167,0.4464,0.2372,0.4986,0.5198,0.5587,0.5792,0.6069,0.8684,0.6044,0.9344,0.6045 +240,0.0515,0.0631,0.1220,0.3035,0.0817,0.3125,0.3079,0.4391,0.5331,0.5697,0.5847,0.6114,0.8738,0.6095,0.9377,0.6072 +241,0.0514,0.0623,0.1185,0.2948,0.0817,0.3125,0.3079,0.4391,0.5314,0.5775,0.5905,0.6147,0.8747,0.6150,0.9306,0.6094 +242,0.0513,0.0615,0.1151,0.2863,0.0817,0.3125,0.3079,0.4391,0.5239,0.5653,0.5811,0.6022,0.8739,0.6014,0.9369,0.6103 +243,0.0512,0.0608,0.1119,0.2780,0.0817,0.3125,0.3079,0.4391,0.5141,0.5578,0.5750,0.6044,0.8664,0.6030,0.9350,0.6005 +244,0.0511,0.0601,0.1088,0.2699,0.0817,0.3125,0.3079,0.4391,0.5336,0.5787,0.5908,0.6170,0.8708,0.6153,0.9400,0.6147 +245,0.0510,0.0594,0.1059,0.2619,0.0572,0.2427,0.2155,0.4626,0.5261,0.5653,0.5867,0.6136,0.8744,0.6136,0.9350,0.6130 +246,0.0509,0.0588,0.1030,0.2542,0.0572,0.2427,0.2155,0.4626,0.5277,0.5666,0.5872,0.6164,0.8763,0.6166,0.9308,0.6141 +247,0.0509,0.0583,0.1003,0.2466,0.0572,0.2427,0.2155,0.4626,0.5284,0.5664,0.5894,0.6150,0.8739,0.6158,0.9336,0.6194 +248,0.0508,0.0577,0.0977,0.2392,0.0572,0.2427,0.2155,0.4626,0.5122,0.5523,0.5708,0.5997,0.8728,0.5989,0.9363,0.6027 +249,0.0507,0.0572,0.0952,0.2320,0.0572,0.2427,0.2155,0.4626,0.5153,0.5534,0.5798,0.6058,0.8739,0.6048,0.9336,0.6013 +250,0.0507,0.0567,0.0928,0.2250,0.0400,0.1699,0.1509,0.3238,0.5344,0.5789,0.5933,0.6208,0.8709,0.6192,0.9339,0.6147 +251,0.0506,0.0563,0.0906,0.2182,0.0400,0.1699,0.1509,0.3238,0.5233,0.5672,0.5817,0.6095,0.8742,0.6091,0.9319,0.6063 +252,0.0506,0.0559,0.0884,0.2116,0.0400,0.1699,0.1509,0.3238,0.5245,0.5664,0.5819,0.6142,0.8759,0.6153,0.9381,0.6058 +253,0.0505,0.0555,0.0863,0.2051,0.0400,0.1699,0.1509,0.3238,0.5248,0.5702,0.5830,0.6095,0.8741,0.6089,0.9334,0.6100 +254,0.0505,0.0551,0.0843,0.1989,0.0400,0.1699,0.1509,0.3238,0.5062,0.5555,0.5708,0.5986,0.8716,0.6003,0.9286,0.6075 +255,0.0504,0.0547,0.0825,0.1928,0.0280,0.1189,0.1897,0.3361,0.5295,0.5695,0.5889,0.6170,0.8780,0.6161,0.9363,0.6152 +256,0.0504,0.0544,0.0807,0.1869,0.0280,0.1189,0.1897,0.3361,0.5173,0.5611,0.5798,0.6066,0.8781,0.6064,0.9302,0.6117 +257,0.0504,0.0541,0.0789,0.1812,0.0280,0.1189,0.1897,0.3361,0.5247,0.5645,0.5830,0.6112,0.8789,0.6106,0.9300,0.6109 +258,0.0503,0.0538,0.0773,0.1756,0.0280,0.1189,0.1897,0.3361,0.5142,0.5581,0.5800,0.6130,0.8770,0.6119,0.9367,0.6070 +259,0.0503,0.0535,0.0758,0.1702,0.0280,0.1189,0.1897,0.3361,0.5133,0.5636,0.5766,0.6056,0.8764,0.6061,0.9344,0.6091 +260,0.0503,0.0533,0.0743,0.1650,0.0200,0.0832,0.1885,0.3339,0.5159,0.5437,0.5758,0.6048,0.8767,0.6050,0.9295,0.6116 +261,0.0503,0.0531,0.0729,0.1600,0.0200,0.0832,0.1885,0.3339,0.5192,0.5442,0.5808,0.6092,0.8764,0.6091,0.9316,0.6056 +262,0.0502,0.0528,0.0715,0.1551,0.0200,0.0832,0.1885,0.3339,0.5186,0.5434,0.5795,0.6073,0.8711,0.6075,0.9261,0.6131 +263,0.0502,0.0526,0.0703,0.1505,0.0200,0.0832,0.1885,0.3339,0.5220,0.5483,0.5903,0.6139,0.8783,0.6136,0.9291,0.6070 +264,0.0502,0.0524,0.0691,0.1459,0.0200,0.0832,0.1885,0.3339,0.5116,0.5403,0.5788,0.6067,0.8739,0.6070,0.9353,0.6114 +265,0.0502,0.0523,0.0679,0.1415,0.0200,0.1684,0.1319,0.5188,0.5198,0.5502,0.5834,0.6122,0.8808,0.6125,0.9284,0.6153 +266,0.0502,0.0521,0.0669,0.1373,0.0200,0.1684,0.1319,0.5188,0.5242,0.5514,0.5813,0.6100,0.8758,0.6094,0.9273,0.6156 +267,0.0502,0.0519,0.0658,0.1333,0.0200,0.1684,0.1319,0.5188,0.5142,0.5427,0.5780,0.6048,0.8742,0.6039,0.9270,0.6123 +268,0.0501,0.0518,0.0649,0.1294,0.0200,0.1684,0.1319,0.5188,0.5255,0.5523,0.5863,0.6150,0.8750,0.6152,0.9270,0.6172 +269,0.0501,0.0517,0.0640,0.1256,0.0200,0.1684,0.1319,0.5188,0.5244,0.5517,0.5894,0.6203,0.8828,0.6216,0.9314,0.6130 +270,0.0501,0.0515,0.0631,0.1220,0.0200,0.3900,0.1138,0.3818,0.5120,0.5425,0.5767,0.6039,0.8664,0.6042,0.9186,0.6020 +271,0.0501,0.0514,0.0623,0.1185,0.0200,0.3900,0.1138,0.3818,0.5250,0.5584,0.5877,0.6178,0.8770,0.6166,0.9294,0.6192 +272,0.0501,0.0513,0.0615,0.1151,0.0200,0.3900,0.1138,0.3818,0.5188,0.5520,0.5833,0.6120,0.8798,0.6120,0.9283,0.6095 +273,0.0501,0.0512,0.0608,0.1119,0.0200,0.3900,0.1138,0.3818,0.5167,0.5528,0.5828,0.6069,0.8756,0.6077,0.9295,0.6061 +274,0.0501,0.0511,0.0601,0.1088,0.0200,0.3900,0.1138,0.3818,0.5109,0.5461,0.5773,0.6073,0.8730,0.6066,0.9323,0.6122 +275,0.0501,0.0510,0.0594,0.1059,0.0545,0.2928,0.0858,0.5523,0.5194,0.5772,0.5867,0.6145,0.8770,0.6144,0.9294,0.6048 +276,0.0501,0.0509,0.0588,0.1030,0.0545,0.2928,0.0858,0.5523,0.5109,0.5653,0.5741,0.6089,0.8748,0.6078,0.9277,0.6078 +277,0.0501,0.0509,0.0583,0.1003,0.0545,0.2928,0.0858,0.5523,0.5123,0.5719,0.5819,0.6105,0.8747,0.6106,0.9273,0.6109 +278,0.0501,0.0508,0.0577,0.0977,0.0545,0.2928,0.0858,0.5523,0.5072,0.5658,0.5738,0.6061,0.8772,0.6064,0.9255,0.6003 +279,0.0500,0.0507,0.0572,0.0952,0.0545,0.2928,0.0858,0.5523,0.5072,0.5684,0.5742,0.6053,0.8781,0.6070,0.9231,0.6066 +280,0.0500,0.0507,0.0567,0.0928,0.0382,0.2502,0.1024,0.6716,0.5273,0.5736,0.5833,0.6128,0.8761,0.6120,0.9313,0.6175 +281,0.0500,0.0506,0.0563,0.0906,0.0382,0.2502,0.1024,0.6716,0.5091,0.5581,0.5716,0.6000,0.8706,0.5991,0.9278,0.6041 +282,0.0500,0.0506,0.0559,0.0884,0.0382,0.2502,0.1024,0.6716,0.5231,0.5761,0.5922,0.6194,0.8803,0.6198,0.9295,0.6234 +283,0.0500,0.0505,0.0555,0.0863,0.0382,0.2502,0.1024,0.6716,0.5228,0.5763,0.5862,0.6162,0.8772,0.6175,0.9275,0.6152 +284,0.0500,0.0505,0.0551,0.0843,0.0382,0.2502,0.1024,0.6716,0.5225,0.5736,0.5861,0.6158,0.8738,0.6159,0.9227,0.6033 +285,0.0500,0.0504,0.0547,0.0825,0.3117,0.2298,0.0717,0.5088,0.5152,0.5762,0.5867,0.6172,0.8780,0.6184,0.9289,0.6166 +286,0.0500,0.0504,0.0544,0.0807,0.3117,0.2298,0.0717,0.5088,0.5277,0.5766,0.5905,0.6214,0.8833,0.6219,0.9323,0.6152 +287,0.0500,0.0504,0.0541,0.0789,0.3117,0.2298,0.0717,0.5088,0.5191,0.5758,0.5900,0.6152,0.8752,0.6153,0.9297,0.6172 +288,0.0500,0.0503,0.0538,0.0773,0.3117,0.2298,0.0717,0.5088,0.5108,0.5709,0.5828,0.6064,0.8723,0.6067,0.9283,0.6017 +289,0.0500,0.0503,0.0535,0.0758,0.3117,0.2298,0.0717,0.5088,0.5114,0.5648,0.5777,0.6120,0.8780,0.6111,0.9305,0.6019 +290,0.0500,0.0503,0.0533,0.0743,0.2182,0.4459,0.0881,0.3906,0.5175,0.5650,0.5817,0.6072,0.8753,0.6066,0.9283,0.6153 +291,0.0500,0.0503,0.0531,0.0729,0.2182,0.4459,0.0881,0.3906,0.5117,0.5597,0.5741,0.6052,0.8777,0.6055,0.9289,0.6158 +292,0.0500,0.0502,0.0528,0.0715,0.2182,0.4459,0.0881,0.3906,0.5220,0.5675,0.5883,0.6145,0.8744,0.6152,0.9286,0.6191 +293,0.0500,0.0502,0.0526,0.0703,0.2182,0.4459,0.0881,0.3906,0.5091,0.5586,0.5772,0.6080,0.8750,0.6080,0.9305,0.6069 +294,0.0500,0.0502,0.0524,0.0691,0.2182,0.4459,0.0881,0.3906,0.5141,0.5645,0.5820,0.6125,0.8797,0.6134,0.9305,0.6167 +295,0.0500,0.0502,0.0523,0.0679,0.2238,0.3809,0.3467,0.3124,0.5167,0.5602,0.5850,0.6092,0.8788,0.6089,0.9250,0.6086 +296,0.0500,0.0502,0.0521,0.0669,0.2238,0.3809,0.3467,0.3124,0.5109,0.5570,0.5734,0.6012,0.8673,0.6009,0.9236,0.6042 +297,0.0500,0.0502,0.0519,0.0658,0.2238,0.3809,0.3467,0.3124,0.5078,0.5536,0.5766,0.6055,0.8766,0.6053,0.9266,0.6197 +298,0.0500,0.0501,0.0518,0.0649,0.2238,0.3809,0.3467,0.3124,0.5158,0.5662,0.5863,0.6148,0.8764,0.6144,0.9283,0.6155 +299,0.0500,0.0501,0.0517,0.0640,0.2238,0.3809,0.3467,0.3124,0.5097,0.5541,0.5745,0.6030,0.8756,0.6030,0.9291,0.6058 diff --git a/data/e4_mismatch.csv b/data/e4_mismatch.csv new file mode 100644 index 0000000..44cf4ae --- /dev/null +++ b/data/e4_mismatch.csv @@ -0,0 +1,34 @@ +snr,delta,cos,ser +5,-0.2,0.4677884508724716,0.3770625 +5,-0.16,0.47074996654396506,0.3646875 +5,-0.12,0.47221568564297145,0.3585 +5,-0.07999999999999999,0.47274681586669354,0.3546875 +5,-0.03999999999999998,0.4727040260626087,0.3540625 +5,2.7755575615628914e-17,0.4723086101393743,0.3544375 +5,0.040000000000000036,0.4716867416737565,0.3560625 +5,0.08000000000000004,0.4708983022750543,0.358625 +5,0.12000000000000005,0.46995373087844344,0.361125 +5,0.16000000000000006,0.468822335600813,0.3645625 +5,0.20000000000000007,0.4674351413108766,0.367375 +10,-0.2,0.6179798052512585,0.041125 +10,-0.16,0.6187075431561585,0.0384375 +10,-0.12,0.618533082797927,0.0373125 +10,-0.07999999999999999,0.6178185314696448,0.03675 +10,-0.03999999999999998,0.6167856699055824,0.0368125 +10,2.7755575615628914e-17,0.6155644218301132,0.0368125 +10,0.040000000000000036,0.6142165353508265,0.0365625 +10,0.08000000000000004,0.6127386629069682,0.0370625 +10,0.12000000000000005,0.6110461501484961,0.037 +10,0.16000000000000006,0.6089371766429155,0.0379375 +10,0.20000000000000007,0.6060394176785739,0.0390625 +15,-0.2,0.7245091508078058,0.0015625 +15,-0.16,0.7234153240110824,0.0013125 +15,-0.12,0.7218124893564858,0.0011875 +15,-0.07999999999999999,0.7198189738280861,0.0011875 +15,-0.03999999999999998,0.7175246322463084,0.0013125 +15,2.7755575615628914e-17,0.7150128180300644,0.0013125 +15,0.040000000000000036,0.7123604137122186,0.0013125 +15,0.08000000000000004,0.7096065083792866,0.00125 +15,0.12000000000000005,0.7066649657208909,0.0013125 +15,0.16000000000000006,0.7031294678603094,0.0013125 +15,0.20000000000000007,0.6978806195923507,0.0013125 diff --git a/data/e5_learned.csv b/data/e5_learned.csv new file mode 100644 index 0000000..1717c40 --- /dev/null +++ b/data/e5_learned.csv @@ -0,0 +1,11 @@ +beta,Learned_cos,Learned_nmse,Learned_ser,LMMSE_cos,LMMSE_nmse,LMMSE_ser,DR_cos,DR_nmse,DR_ser +0.05,0.25433290948687237,1.4913341816439973,0.93725,0.32438595170361917,0.8747947429055835,0.7435625,0.3540205820656546,0.8534616212824229,0.6781875 +0.1,0.27749199797372404,1.4450160042706301,0.908625,0.33083480253348796,0.8711820802419781,0.735875,0.35888325572780627,0.8530990057430331,0.688125 +0.2,0.3426674810720035,1.3146650373311757,0.77975,0.3631628334523729,0.8517214539022712,0.687125,0.4044853316884553,0.8250654987524828,0.6328125 +0.3,0.4253583486949318,1.1492833027068394,0.5225625,0.41215351640783604,0.8167696498433968,0.586125,0.4725292418961386,0.7698278981975227,0.4156875 +0.4,0.5080146696898473,0.983970660799056,0.271,0.46502203899472316,0.7724895142326921,0.437375,0.5437635339117708,0.7011047805243247,0.149 +0.5,0.5857423053374873,0.8285153890435167,0.1054375,0.5209387168440357,0.7194023005599461,0.2745625,0.6137796870171428,0.6224912193830614,0.0396875 +0.6,0.6587348306034025,0.6825303388352326,0.0335,0.5759702196998538,0.660498042533296,0.142125,0.6823004197629239,0.5355782244821032,0.0096875 +0.7,0.729104895590768,0.5417902090904868,0.009,0.6325766311277184,0.5930092881636482,0.06275,0.7489046160816174,0.44130604465985007,0.0035 +0.8,0.7969874601992837,0.40602507973579044,0.0015,0.690484275571362,0.5179034261312443,0.0218125,0.8148640111384091,0.33923716795658126,0.001 +0.9,0.8588142481772689,0.28237150365486996,0.000625,0.7456249847250824,0.43899344931929274,0.0084375,0.877125382063871,0.23450964925940807,0.0005 diff --git a/data/e5_train_log.csv b/data/e5_train_log.csv new file mode 100644 index 0000000..2f95947 --- /dev/null +++ b/data/e5_train_log.csv @@ -0,0 +1,61 @@ +step,loss +50,0.588121235370636 +100,0.3500303328037262 +150,0.6307245492935181 +200,0.5117422938346863 +250,0.6843791604042053 +300,0.33192601799964905 +350,0.6433843374252319 +400,0.4546773433685303 +450,0.16626952588558197 +500,0.5854030847549438 +550,0.2317981868982315 +600,0.2849048972129822 +650,0.2996165156364441 +700,0.7279555797576904 +750,0.6565011739730835 +800,0.20011256635189056 +850,0.1910645216703415 +900,0.5921029448509216 +950,0.4238053262233734 +1000,0.6777560710906982 +1050,0.5709654092788696 +1100,0.40542492270469666 +1150,0.38772422075271606 +1200,0.6069692373275757 +1250,0.3610105812549591 +1300,0.15966327488422394 +1350,0.4908602833747864 +1400,0.44641396403312683 +1450,0.64170902967453 +1500,0.42330288887023926 +1550,0.7351509928703308 +1600,0.46302133798599243 +1650,0.16936270892620087 +1700,0.5299801230430603 +1750,0.6421316266059875 +1800,0.6550854444503784 +1850,0.42745232582092285 +1900,0.5026284456253052 +1950,0.3039652407169342 +2000,0.16355615854263306 +2050,0.48246270418167114 +2100,0.34849074482917786 +2150,0.724970817565918 +2200,0.2711065113544464 +2250,0.34548747539520264 +2300,0.5576888918876648 +2350,0.20214445888996124 +2400,0.5585888028144836 +2450,0.41144832968711853 +2500,0.7296308875083923 +2550,0.526506781578064 +2600,0.31999582052230835 +2650,0.22167174518108368 +2700,0.7460469007492065 +2750,0.3096345067024231 +2800,0.21640630066394806 +2850,0.673500120639801 +2900,0.33546051383018494 +2950,0.45799386501312256 +3000,0.1987389326095581 diff --git a/data/e_mask_check.csv b/data/e_mask_check.csv new file mode 100644 index 0000000..395df30 --- /dev/null +++ b/data/e_mask_check.csv @@ -0,0 +1,9 @@ +d,snr,method,ser_realized,ser_expected,mean_diff,std_diff +64,10,SR,0.954875,0.8681458333333333,0.08672916666666668,0.0033621798691060795 +64,10,SC,0.47496875,0.29821875,0.17675,0.024687315400153714 +64,10,LMMSE,0.4592604166666667,0.27560416666666665,0.18365625,0.02441695774499421 +64,10,DR,0.07957291666666667,0.04014583333333333,0.039427083333333335,0.008898363955041897 +768,20,SR,0.9959375,0.9498958333333333,0.04604166666666667,0.006360140634364086 +768,20,SC,0.6002083333333333,0.36322916666666666,0.23697916666666666,0.01367125494625696 +768,20,LMMSE,0.5753125,0.33239583333333333,0.24291666666666664,0.011213288867331582 +768,20,DR,0.014895833333333336,0.007395833333333334,0.0075,0.0015728821740147395