import%20marimo%0A%0A__generated_with%20%3D%20%220.15.2%22%0Aapp%20%3D%20marimo.App()%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22!%5BMOSEK%20ApS%5D(https%3A%2F%2Fwww.mosek.com%2Fstatic%2Fimages%2Fbranding%2Fwebgraphmoseklogocolor.png%20)%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%20Optimization%20for%20multiuser%20communications%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20We%20consider%20a%20multiple-input%20multiple-output%20(MIMO)%20communication%20system%20%0A%20%20%20%20with%20%24n%24%20transmitters%20and%20%24n%24%20receivers.%20Each%20transmitter%20transmits%20with%20power%20%24p_j%24%20and%20the%20%0A%20%20%20%20gain%20from%20transmitter%20%24j%24%20to%20receiver%20%24i%24%20is%20%24G_%7Bij%7D%24.%20The%20signal%20power%20from%20transmitter%20%24i%24%20to%20receiver%20%24i%24%20is%20then%0A%0A%20%20%20%20%24%24S_i%20%3D%20G_%7Bii%7D%20p_i%24%24%0A%0A%20%20%20%20and%20the%20interference%20is%0A%0A%20%20%20%20%24%24I_i%20%3D%20%5Csum_%7Bj%5Cneq%20i%7D%20G_%7Bij%7D%20p_j%20%2B%20%5Csigma_i%24%24%0A%0A%20%20%20%20where%20%24%5Csigma_i%24%20is%20an%20additive%20noise%20component.%20In%20this%20notebook%20we%20consider%20different%20strategies%20for%20optimizing%20the%20signal-to-inference-plus-noise%20ratio%20(SINR)%0A%0A%20%20%20%20%24%24s_i%20%3D%20%5Cfrac%7BG_%7Bii%7D%20p_i%7D%7B%5Csum_%7Bj%5Cneq%20i%7D%20G_%7Bij%7D%20p_j%20%2B%20%5Csigma_i%7D%24%24%0A%0A%20%20%20%20with%20a%20bound%20on%20the%20total%20transmitted%20power%20%24%5Csum_i%20p_i%20%5Cleq%20P%24.%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%23%20Minimizing%20total%20power%20for%20given%20SINRs%0A%20%20%20%20Suppose%20we%20are%20given%20lower%20bounds%20%24s_i%20%5Cgeq%20%5Cgamma_i%24.%20We%20can%20then%20minimize%20the%20required%20power%0A%0A%20%20%20%20%24%24%20%0A%20%20%20%20%5Cbegin%7Barray%7D%7Bll%7D%0A%20%20%20%20%5Ctext%7Bminimize%7D%20%20%20%26%20%5Csum_i%20p_i%20%5C%5C%0A%20%20%20%20%5Ctext%7Bsubject%20to%7D%20%26%20s_i%20%5Cgeq%20%5Cgamma_i%20%5C%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26%20%5Csum_i%20p_i%20%5Cleq%20P%2C%0A%20%20%20%20%5Cend%7Barray%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20which%20is%20equivalent%20to%20a%20linear%20optimization%20problem%0A%0A%20%20%20%20%24%24%20%0A%20%20%20%20%5Cbegin%7Barray%7D%7Bll%7D%0A%20%20%20%20%5Ctext%7Bminimize%7D%20%20%20%26%20%5Csum_i%20p_i%20%5C%5C%0A%20%20%20%20%5Ctext%7Bsubject%20to%7D%20%26%20G_%7Bii%7D%20p_i%20%5Cgeq%20%5Cgamma_i%5Cleft%20(%20%5Csum_%7Bj%5Cneq%20i%7D%20G_%7Bij%7D%20p_j%20%2B%20%5Csigma_i%20%5Cright%20)%20%5C%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26%20%5Csum_i%20p_i%20%5Cleq%20P.%0A%20%20%20%20%5Cend%7Barray%7D%0A%20%20%20%20%24%24%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%23%20Maximizing%20the%20worst%20SINR%0A%20%20%20%20Alternatively%20we%20can%20maximize%20the%20smallest%20%24s_i%24%2C%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Cbegin%7Barray%7D%7Bll%7D%0A%20%20%20%20%5Ctext%7Bmaximize%7D%20%20%20%26%20t%20%5C%5C%0A%20%20%20%20%5Ctext%7Bsubject%20to%7D%20%26%20s_i%20%5Cgeq%20t%20%5C%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26%20%5Csum_i%20p_i%20%5Cleq%20P.%0A%20%20%20%20%5Cend%7Barray%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20Equivalently%20we%20can%20minimize%20the%20inverse%2C%20%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Cbegin%7Barray%7D%7Bll%7D%0A%20%20%20%20%5Ctext%7Bminimize%7D%20%20%20%26%20t%5E%7B-1%7D%20%5C%5C%0A%20%20%20%20%5Ctext%7Bsubject%20to%7D%20%26%20t%20%5Cleft%20(%20%5Csum_%7Bj%5Cneq%20i%7D%20G_%7Bij%7D%20p_j%20%2B%20%5Csigma_i%20%5Cright%20)%20G_%7Bii%7D%5E%7B-1%7D%20p_i%5E%7B-1%7D%20%5Cleq%201%20%5C%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26%20%5Csum_i%20p_i%20%5Cleq%20P%2C%0A%20%20%20%20%5Cend%7Barray%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20which%20can%20be%20rewritten%20as%20a%20geometric%20programming%20problem%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Cbegin%7Barray%7D%7Bll%7D%0A%20%20%20%20%5Ctext%7Bminimize%7D%20%26%20-z%5C%5C%0A%20%20%20%20%5Ctext%7Bsubject%20to%7D%20%26%0A%20%20%20%20%5Clog%20%5Cleft%20(%20%5Csum_%7Bj%5Cneq%20i%7De%5E%7Bz%20%2B%20q_j%20-%20q_i%20%2B%20%5Clog(G_%7Bij%7D%2FG_%7Bii%7D)%7D%20%2B%20e%5E%7Bz%20-%20q_i%20%2B%20%5Clog(%5Csigma_i%2FG_%7Bii%7D)%7D%20%5Cright%20)%20%5Cleq%200%5C%5C%0A%20%20%20%20%26%20%5Clog%20%5Cleft%20(%20%5Csum_i%20e%5E%7Bq_i-%5Clog%20P%7D%5Cright)%20%5Cleq%200%0A%20%20%20%20%5Cend%7Barray%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20with%20%24p_i%20%3A%3D%20e%5E%7Bq_i%7D%24%20and%20%24t%20%3A%3D%20e%5Ez%24.%20To%20rewrite%20the%20geometric%20program%20into%20conic%20form%2C%20we%20note%20that%0A%0A%20%20%20%20%24%24%20%0A%20%20%20%20%5Clog%20%5Cleft(%20%5Csum_%7Bi%3D1%7D%5En%20e%5E%7Ba_i%5ET%20x%20%2B%20b_i%7D%5Cright)%20%5Cleq%200%20%5Cqquad%20%5CLongleftrightarrow%20%5Cqquad%20%0A%20%20%20%20%5Csum_i%20u_i%5Cleq%201%2C%20%5Cquad%20(u_i%2C%201%2C%20a_i%5ETx%20%2B%20b_i)%5Cin%20K_%5Ctext%7Bexp%7D%2C%20%5C%3A%20i%3D1%2C%5Cdots%20n.%0A%20%20%20%20%24%24%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20sys%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20from%20mosek.fusion%20import%20Model%2C%20Domain%2C%20Expr%2C%20ObjectiveSense%2C%20Matrix%2C%20Var%2C%20SolutionStatus%0A%0A%20%20%20%20import%20mosek.fusion.pythonic%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20return%20Domain%2C%20Expr%2C%20Model%2C%20ObjectiveSense%2C%20np%2C%20plt%2C%20sys%0A%0A%0A%40app.cell%0Adef%20_(Domain%2C%20Expr)%3A%0A%20%20%20%20def%20logsumexp(M%2C%20A%2C%20x%2C%20b)%3A%20%20%20%20%0A%20%20%20%20%20%20%20%20u%20%3D%20M.variable(A.shape%5B0%5D)%0A%20%20%20%20%20%20%20%20M.constraint(%20Expr.sum(u)%20%3C%3D%201.0)%0A%20%20%20%20%20%20%20%20M.constraint(%20Expr.hstack(u%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Expr.constTerm(A.shape%5B0%5D%2C%201.0)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20A%20%40%20x%20%2B%20b)%2C%20Domain.inPExpCone())%0A%20%20%20%20return%20(logsumexp%2C)%0A%0A%0A%40app.cell%0Adef%20_(Model%2C%20ObjectiveSense%2C%20logsumexp%2C%20np%2C%20sys)%3A%0A%20%20%20%20def%20max_worst_sinr(G%2C%20P%2C%20sigma)%3A%0A%20%20%20%20%20%20%20%20n%20%3D%20G.shape%5B0%5D%0A%20%20%20%20%20%20%20%20with%20Model('MAX_WORST_SINR')%20as%20M%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20qz%20%3D%20M.variable('qz'%2C%20n%2B1)%20%23%20concatenation%20of%20q%20and%20z%0A%20%20%20%20%20%20%20%20%20%20%20%20M.objective('Objective'%2C%20ObjectiveSense.Minimize%2C%20-qz%5Bn%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20i%20in%20range(n)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20A%20%3D%20np.zeros((n%2Cn%2B1))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20b%20%3D%20np.zeros(n)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20j%20in%20%5Bk%20for%20k%20in%20range(n)%20if%20k!%3Di%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20A%5Bj%2C%5Bi%2Cj%2Cn%5D%5D%20%3D%20%5B-1%2C%201%2C%201%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20b%5Bj%5D%20%3D%20G%5Bi%2Cj%5D%2FG%5Bi%2Ci%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20A%5Bi%2C%20%5Bi%2C%20n%5D%5D%20%3D%20%5B-1%2C%201%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20b%5Bi%5D%20%3D%20sigma%5Bi%5D%2FG%5Bi%2Ci%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20If%20any%20Gij%20%3D%3D%200%2C%20then%20we%20filter%20out%20row%20j%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20idx%20%3D%20np.nonzero(b)%5B0%5D%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20logsumexp(M%2C%20A%5Bidx%2C%3A%5D%2C%20qz%2C%20np.log(b%5Bidx%5D))%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20logsumexp(M%2C%20np.eye(n)%2C%20qz%5B%3An%5D%2C%20-np.log(P)*np.ones(n))%0A%20%20%20%20%20%20%20%20%20%20%20%20M.setLogHandler(sys.stdout)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20M.solve()%0A%20%20%20%20%20%20%20%20%20%20%20%20pt%20%3D%20np.exp(qz.level())%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20(pt%5B0%3An%5D%2C%20pt%5Bn%5D)%0A%20%20%20%20return%20(max_worst_sinr%2C)%0A%0A%0A%40app.cell%0Adef%20_(np)%3A%0A%20%20%20%20P%20%3D%200.5%0A%0A%20%20%20%20G%20%3D%20np.array(%5B%5B1.0%2C0.1%2C0.2%2C0.1%2C0.0%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B0.1%2C1.0%2C0.1%2C0.1%2C0.0%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B0.2%2C0.1%2C2.0%2C0.2%2C0.2%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B0.1%2C0.1%2C0.2%2C1.0%2C0.1%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B0.0%2C0.0%2C0.2%2C0.1%2C1.0%5D%5D)%0A%0A%20%20%20%20sigma%20%3D%200.01*np.ones(G.shape%5B0%5D)%0A%20%20%20%20return%20G%2C%20P%2C%20sigma%0A%0A%0A%40app.cell%0Adef%20_(G%2C%20P%2C%20max_worst_sinr%2C%20sigma)%3A%0A%20%20%20%20p1%2C%20t1%20%3D%20max_worst_sinr(G%2C%20P%2C%20sigma)%0A%20%20%20%20return%20p1%2C%20t1%0A%0A%0A%40app.cell%0Adef%20_(p1%2C%20t1)%3A%0A%20%20%20%20p1%2C%20t1%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(G%2C%20np%2C%20p1%2C%20sigma)%3A%0A%20%20%20%20SINR1%20%3D%20(np.diagonal(G)*p1)%2F(np.dot(G%2Cp1)%20-%20np.diagonal(G)*p1%20%2B%20sigma)%0A%20%20%20%20SINR1%0A%20%20%20%20return%20(SINR1%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%23%20Maximizing%20the%20best%20SINR%0A%20%20%20%20The%20solution%20to%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Cbegin%7Barray%7D%7Bll%7D%0A%20%20%20%20%5Ctext%7Bmaximize%7D%20%20%20%26%20t_i%20%5C%5C%0A%20%20%20%20%5Ctext%7Bsubject%20to%7D%20%26%20s_i%20%5Cleq%20t_i%20%5C%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26%20%5Csum_i%20p_i%20%5Cleq%20P%0A%20%20%20%20%5Cend%7Barray%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20is%20trivial%3B%20we%20choose%20the%20index%20%24k%24%20maximizing%20%24P_%7Bii%7D%2F%5Csigma_i%24%20and%20take%20%24p_k%3DP%24%20and%20%24p_j%3D0%2C%5C%3A%20j%5Cneq%20k%24.%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20max_best_SINR(G%2CP%2Csigma)%3A%0A%20%20%20%20GSD%20%3D%20%5BG%5Bi%5D%5Bi%5D%2Fsigma%5Bi%5D%20for%20i%20in%20range(G.shape%5B0%5D)%5D%0A%20%20%20%20P_max%20%3D%20max(GSD)%0A%20%20%20%20%23Thus%2C%20maximum%20of%20the%20best%20SINR%20is%20equal%20to...%0A%20%20%20%20return(P_max*P)%0A%0A%0A%40app.cell%0Adef%20_(G%2C%20P%2C%20sigma)%3A%0A%20%20%20%20max_best_SINR(G%2CP%2Csigma)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%23%20Maximizing%20average%20SINR%0A%20%20%20%20We%20can%20maximize%20the%20average%20SINR%20as%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Cbegin%7Barray%7D%7Bll%7D%0A%20%20%20%20%5Ctext%7Bmaximize%7D%20%20%20%26%20%5Csum_i%20t_i%20%5C%5C%0A%20%20%20%20%5Ctext%7Bsubject%20to%7D%20%26%20s_i%20%5Cgeq%20t_i%20%5C%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26%200%20%5Cleq%20p_i%20%5Cleq%20P_i%20%5C%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26%20%5Csum_i%20p_i%20%5Cleq%20P%2C%0A%20%20%20%20%5Cend%7Barray%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20which%20corresponds%20to%20an%20intractable%20non-convex%20bilinear%20optimization%20problem.%20However%2C%20in%20the%20low-SINR%20regime%2C%20we%20can%20approximate%20the%20above%20problem%20by%20maximizing%20%24%5Csum_i%20%5Clog%20t_i%24%2C%20or%20equivalently%20minimizing%20%24%5Cprod_i%20t_i%5E%7B-1%7D%24%3A%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Cbegin%7Barray%7D%7Bll%7D%0A%20%20%20%20%5Ctext%7Bminimize%7D%20%20%20%26%20%5Cprod_i%20t_i%5E%7B-1%7D%20%5C%5C%0A%20%20%20%20%5Ctext%7Bsubject%20to%7D%20%26%20t_i%20%5Cleft%20(%20%5Csum_%7Bj%5Cneq%20i%7D%20G_%7Bij%7D%20p_j%20%2B%20%5Csigma_i%20%5Cright%20)%20G_%7Bii%7D%5E%7B-1%7D%20p_i%5E%7B-1%7D%20%5Cleq%201%20%5C%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26%200%20%5Cleq%20p_i%20%5Cleq%20P_i%20%5C%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26%20%5Csum_i%20p_i%20%5Cleq%20P%2C%0A%20%20%20%20%5Cend%7Barray%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20which%20again%20corresponds%20to%20a%20geometric%20programming%20problem.%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Domain%2C%20Expr%2C%20Model%2C%20ObjectiveSense%2C%20logsumexp%2C%20np%2C%20sys)%3A%0A%20%20%20%20def%20min_Geo_mean(G%2CP%2Csigma)%3A%0A%20%20%20%20%20%20%20%20n%20%3D%20G.shape%5B0%5D%0A%20%20%20%20%20%20%20%20with%20Model('MIN_GEO_MEAN')%20as%20M%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20t%20%3D%20M.variable('t'%2Cn)%0A%20%20%20%20%20%20%20%20%20%20%20%20x%20%3D%20M.variable('x'%2Cn)%0A%20%20%20%20%20%20%20%20%20%20%20%20q%20%3D%20M.variable('q'%2Cn)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20logsumexp(M%2Cnp.eye(n)%2Cq%2C-np.log(P)*np.ones(n))%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20M.constraint(Expr.hstack(x%2C%20Expr.constTerm(n%2C%201.0)%2C%20-t)%2C%20Domain.inPExpCone())%0A%20%20%20%20%20%20%20%20%20%20%20%20M.objective('Objective'%2CObjectiveSense.Minimize%2CExpr.sum(x))%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20i%20in%20range(n)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20A%20%3D%20np.zeros((n%2Cn%2B1))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20b%20%3D%20np.zeros(n)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20j%20in%20%5Bk%20for%20k%20in%20range(n)%20if%20k!%3Di%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20A%5Bj%2C%5Bi%2Cj%2Cn%5D%5D%20%3D%20%5B-1%2C1%2C1%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20b%5Bj%5D%20%3D%20G%5Bi%2Cj%5D%2FG%5Bi%2Ci%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20A%5Bi%2C%5Bi%2Cn%5D%5D%20%3D%20%5B-1%2C1%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20b%5Bi%5D%20%3D%20sigma%5Bi%5D%2FG%5Bi%2Ci%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20idx%20%3D%20np.nonzero(b)%5B0%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20logsumexp(M%2CA%5Bidx%2C%3A%5D%2CExpr.vstack(q%2Ct%5Bi%5D)%2Cnp.log(b%5Bidx%5D))%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20M.setLogHandler(sys.stdout)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20M.solve()%0A%20%20%20%20%20%20%20%20%20%20%20%20T%20%3D%20t.level()%0A%20%20%20%20%20%20%20%20%20%20%20%20p%20%3D%20np.exp(q.level())%0A%20%20%20%20%20%20%20%20%20%20%20%20return(T%2Cp)%0A%20%20%20%20return%20(min_Geo_mean%2C)%0A%0A%0A%40app.cell%0Adef%20_(G%2C%20P%2C%20min_Geo_mean%2C%20sigma)%3A%0A%20%20%20%20t2%2Cp2%20%3D%20min_Geo_mean(G%2C%20P%2C%20sigma)%0A%20%20%20%20return%20p2%2C%20t2%0A%0A%0A%40app.cell%0Adef%20_(p2%2C%20t2)%3A%0A%20%20%20%20p2%2Ct2%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(G%2C%20np%2C%20p2%2C%20sigma)%3A%0A%20%20%20%20SINR2%20%3D%20(np.diagonal(G)*p2)%2F(np.dot(G%2Cp2)%20-%20np.diagonal(G)*p2%20%2B%20sigma)%0A%20%20%20%20SINR2%0A%20%20%20%20return%20(SINR2%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%20Comparing%20the%20SINR%20for%20the%20cases%20above...%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(G%2C%20SINR1%2C%20SINR2%2C%20np%2C%20plt)%3A%0A%20%20%20%20fig%2Cax%20%3D%20plt.subplots(figsize%20%3D%20(13%2C10))%0A%20%20%20%20bar_width%20%3D%200.35%0A%20%20%20%20p_num%20%3D%20np.arange(1%2CG.shape%5B0%5D%2B1)%0A%0A%20%20%20%20B1%20%3D%20ax.bar(p_num%2CSINR1%2Cbar_width%2Clabel%20%3D%20'Max%20Worst%20SINR')%0A%20%20%20%20B2%20%3D%20ax.bar(p_num%2Bbar_width%2CSINR2%2Cbar_width%2Clabel%20%3D%20'Max%20Average%20SINR')%0A%0A%20%20%20%20ax.set_ylabel('SINR')%0A%20%20%20%20ax.set_xticks(p_num%20%2B%20bar_width%2F2)%0A%20%20%20%20x_tiK%20%3D%20%5B'p%7B%7D'.format(i%2B1)%20for%20i%20in%20range(G.shape%5B0%5D)%5D%0A%20%20%20%20ax.set_xticklabels(x_tiK)%0A%20%20%20%20ax.set_xlabel('Transmitter')%0A%20%20%20%20ax.legend()%0A%20%20%20%20plt.show()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%3Ca%20rel%3D%22license%22%20href%3D%22http%3A%2F%2Fcreativecommons.org%2Flicenses%2Fby%2F4.0%2F%22%3E%3Cimg%20alt%3D%22Creative%20Commons%20License%22%20style%3D%22border-width%3A0%22%20src%3D%22https%3A%2F%2Fi.creativecommons.org%2Fl%2Fby%2F4.0%2F80x15.png%22%20%2F%3E%3C%2Fa%3E%3Cbr%20%2F%3EThis%20work%20is%20licensed%20under%20a%20%3Ca%20rel%3D%22license%22%20href%3D%22http%3A%2F%2Fcreativecommons.org%2Flicenses%2Fby%2F4.0%2F%22%3ECreative%20Commons%20Attribution%204.0%20International%20License%3C%2Fa%3E.%20The%20**MOSEK**%20logo%20and%20name%20are%20trademarks%20of%20%3Ca%20href%3D%22http%3A%2F%2Fmosek.com%22%3EMosek%20ApS%3C%2Fa%3E.%20The%20code%20is%20provided%20as-is.%20Compatibility%20with%20future%20release%20of%20**MOSEK**%20or%20the%20%60Fusion%20API%60%20are%20not%20guaranteed.%20For%20more%20information%20contact%20our%20%5Bsupport%5D(mailto%3Asupport%40mosek.com).%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20return%20(mo%2C)%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
243503e8d4df33b3863b156f166ef8a66cf31e876a896e24d29988d53f9b25ef