Note
Click here to download the full example code
Complex phase retrieval¶
Model¶
We wish to infer the sparse complex signal \(x \sim \mathcal{N}_\rho(.) \in \mathbb{C}^N\) from \(y = | Fx | \in \mathbb{R}_+^M\), where \(F \in \mathbb{C}^{M \times N}\) is a Gaussian random matrix.

EP dynamics. Damping is essential !
ep_evo = scenario.ep_convergence(
metrics=["mse", "phase_mse"], max_iter=20 # no damping
)
qplot(
ep_evo, x="iter", y=["phase_mse", "v"],
y_markers=["x", "-"], y_legend=True
)
ep_evo = scenario.ep_convergence(
metrics=["mse", "phase_mse"], max_iter=70, damping=0.3
)
qplot(
ep_evo, x="iter", y=["mse", "phase_mse", "v"],
y_markers=[".", "x", "-"], y_legend=True
)
Recovered signal (up to a global phase)

Compare EP vs SE¶
See data/phase_retrieval_ep_vs_se.py for the corresponding script.
rename = {
"alpha": r"$\alpha$", "prior_mean": r"$\mu$", "prior_rho": r"$\rho$",
"n_iter": "iterations", "source=": "", "phase_mse": "p-mse",
"a0=0.1": "uninformed", "a0=1000.0": "informed"
}
ep_vs_se = pd.read_csv("data/phase_retrieval_ep_vs_se.csv")
qplot(
ep_vs_se.query("source!='mse'"), x="alpha", y="v", marker="source", column="prior_mean",
rename=rename, usetex=True
)
qplot(
ep_vs_se.query("source=='SE'"),
x="alpha", y="v", color="prior_mean",
rename=rename, usetex=True
)
qplot(
ep_vs_se.query("source=='SE'"),
x="alpha", y="n_iter", color="prior_mean",
rename=rename, usetex=True
)
Phase transition

Total running time of the script: ( 0 minutes 38.163 seconds)