Match figure styling and labels to the submitted manuscript
Enlarge the in-canvas fonts and line weights of the result figures so that they stay legible at the printed column width, split the Fig. 5 convergence curve into a pre-meta adaptation entry and the proposed MAML entry, and rename the autoencoder legend to match the table row. Add the analytic complexity replot behind Fig. 4, which was missing from the repository, and correct the table numbering in the README.
This commit is contained in:
+29
-11
@@ -22,7 +22,7 @@ import c13_mnist as m13
|
||||
MODELS = {
|
||||
"semantic": (m13.MnistSemanticMA, "Proposed signed joint"),
|
||||
"semantic_tf": (m13.MnistTransformerMA, "Transformer SE separation"),
|
||||
"semantic_ae": (m13.MnistPerUserAE, "Per-user AE multiple access"),
|
||||
"semantic_ae": (m13.MnistPerUserAE, "Per-user AE"),
|
||||
}
|
||||
|
||||
|
||||
@@ -202,24 +202,30 @@ def main():
|
||||
STY = {"semantic": dict(color="tab:red", marker="o", ls="-"),
|
||||
"semantic_tf": dict(color="tab:purple", marker="P", ls="-"),
|
||||
"semantic_ae": dict(color="tab:brown", marker="X", ls="-")}
|
||||
plt.rcParams.update({"font.size": 13, "axes.labelsize": 13,
|
||||
"xtick.labelsize": 12, "ytick.labelsize": 12,
|
||||
"axes.linewidth": 1.1, "grid.linewidth": 0.8,
|
||||
"xtick.major.width": 1.1, "ytick.major.width": 1.1,
|
||||
"xtick.minor.width": 0.8, "ytick.minor.width": 0.8,
|
||||
"xtick.major.size": 4.5, "ytick.major.size": 4.5})
|
||||
fig = plt.figure(figsize=(5.2, 3.9))
|
||||
ax = fig.add_axes([0.14, 0.125, 0.835, 0.845])
|
||||
ax = fig.add_axes([0.155, 0.145, 0.82, 0.82])
|
||||
xgrid = sorted({int(r["step"]) for r in rows
|
||||
if r["method"] == "semantic"})
|
||||
if "digital_genie" in floors:
|
||||
ax.semilogy(xgrid, [floors["digital_genie"]] * len(xgrid),
|
||||
label="Digital chain genie CSI", ms=3.5, lw=1.2,
|
||||
label="Digital chain genie CSI", ms=5, lw=1.7,
|
||||
color="gray", marker="^", ls="--")
|
||||
if "digital_pilot" in floors:
|
||||
ax.semilogy(xgrid, [floors["digital_pilot"]] * len(xgrid),
|
||||
label="Digital chain pilot CSI", ms=3.5, lw=1.2,
|
||||
label="Digital chain pilot CSI", ms=5, lw=1.7,
|
||||
color="k", marker="v", ls="-")
|
||||
for key in ["semantic_tf", "semantic_ae", "semantic"]:
|
||||
label = MODELS[key][1]
|
||||
pts = sorted([(int(r["step"]), float(r["ser"])) for r in rows
|
||||
if r["method"] == key])
|
||||
xs, ys = zip(*pts)
|
||||
ax.semilogy(xs, ys, label=label, ms=3.5, lw=1.3, **STY[key])
|
||||
ax.semilogy(xs, ys, label=label, ms=5, lw=1.8, **STY[key])
|
||||
# signed MAML: the deployed receiver applies the five-step
|
||||
# task-conditional adaptation at every checkpoint. During the
|
||||
# warm-start phase the adapted SER of the evolving joint model is
|
||||
@@ -239,17 +245,29 @@ def main():
|
||||
pre_pts = sorted([(int(r["step"]), float(r["ser"]))
|
||||
for r in rows if r["method"] == "semantic"
|
||||
and int(r["step"]) < warm_end])
|
||||
pts = pre_pts + meta_pts
|
||||
xs, ys = zip(*pts)
|
||||
ax.semilogy(xs, ys, label="Proposed signed MAML", ms=3.5, lw=1.3,
|
||||
color="tab:green", marker="D", ls="--")
|
||||
ax.axvline(warm_end, color="gray", ls=":", lw=1.0)
|
||||
# Left of the dotted line no meta-training has happened yet, so
|
||||
# the curve is the joint model with the same five-step
|
||||
# adaptation applied. It is drawn dashed with open markers and
|
||||
# carries its own legend entry, since it is the control
|
||||
# condition rather than the proposed MAML receiver.
|
||||
pre_seg = pre_pts + meta_pts[:1]
|
||||
xs, ys = zip(*pre_seg)
|
||||
ax.semilogy(xs, ys, label="Adaptation from joint model", ms=5,
|
||||
lw=1.8, color="tab:green", marker="D", ls="--",
|
||||
markerfacecolor="none")
|
||||
xs, ys = zip(*meta_pts)
|
||||
ax.semilogy(xs, ys, label="Proposed signed MAML", ms=5, lw=1.8,
|
||||
color="tab:green", marker="D", ls="-")
|
||||
ax.axvline(warm_end, color="gray", ls=":", lw=1.4)
|
||||
ax.set_xlabel("Training step")
|
||||
ax.set_ylabel("SER")
|
||||
if "digital_genie" in floors:
|
||||
# extra headroom below the genie floor so that the seven-entry
|
||||
# legend sits in free space instead of over the curves
|
||||
ax.set_ylim(bottom=floors["digital_genie"] * 0.5)
|
||||
ax.grid(True, which="both", alpha=0.35)
|
||||
ax.legend(fontsize=7.5, loc="center left", bbox_to_anchor=(0.02, 0.32))
|
||||
ax.legend(fontsize=9, loc="center left", bbox_to_anchor=(0.02, 0.34),
|
||||
framealpha=1.0, labelspacing=0.3, handlelength=1.8)
|
||||
out = os.path.join(args.fig_dir, "mnist_epoch_convergence.pdf")
|
||||
fig.savefig(out)
|
||||
print("saved", out)
|
||||
|
||||
Reference in New Issue
Block a user