I am trying to use CVXPY to optimise signal-to-noise-plus interference ratio (SINR) for a visible light communication (VLC) system. I have one of my SINR constraints stated as

\begin{equation} \mathbf{h}^{\textsf{T}}_{l,u}\mathbf{p}_{l} \geq \sqrt{\gamma_{u}\sum_{j\in \mathcal{L}\backslash\lbrace l\rbrace}\left(\mathbf{h}^{\textsf{T}}_{j,u}\mathbf{p}_{j}\right)^{{2}} + \sigma_{u}^{{2}}}. \end{equation}

If I use cp.sqrt(A), where A is the term inside the square root, my constraint violates DCCP rules but when I cast it with cp.norm(A), there seems to be no violations. May somebody please clarify to me why this is the case. I doubt that simply taking cp.norm(A) is correct. I have just started learning how to use CVXPY, I appreciate any help and guide.


1 Answer 1


Based on your experience, one of (ignoring the subscripts) h or p must be a variable. Therefore h'*p is affine. After introducing subscripts, you can form the norm of the vector of these individual affine terms in compliance with CVXPY's DCP rules, because the argument of norm is affine (vector). cp.norm of the appropriate vector is correct, but not cp.norm of the argument of the square root.

When norm is used, CVXPY will recognize this constraint as a Second Order Cone Constraint, and send it to the solver accordingly.

Entering the square root directly violates the DCP rules, because concave of convex (sqrt of sum of squares) is not allowed per DCP rules, because curvature of concave if convex is not clearly determined for arbitrary concave and convex functions.

  • $\begingroup$ I agree with the last sentence of your first paragraph. If I am getting you correctly, I should take the norm of each vector individually right? So, when casting this constraint in CVXPY, I will end up having the RHS as $\gamma_u$ * (cp.norm(vector1) + cp.norm(vector2) + ... + cp.norm(vectorL) + $\sigma_u$)? Can I use the infix operators * and + here as I just did since my norms are affine? $\endgroup$
    – Supremum
    Jan 21, 2021 at 18:38
  • $\begingroup$ No. Place everything in a single vector. For instance if q is the vector [x y], then sqrt(x^2+y^2) is norm(q). The expression in your comment id not correct, because the sum of norms is different: In my simplified example, your expression would be abs(s) + abs(y), i.e., the one-norm, which is different than sqrt(x^2+y^2), i.e., the two-norm. $\endgroup$ Jan 21, 2021 at 19:11
  • $\begingroup$ Hhhmm, this seems trivial yet I am still a bit lost. What happens to $\gamma_u$ if I am to have an expression as abs(x) + abs(y) as per the convention of the given example? $\endgroup$
    – Supremum
    Jan 21, 2021 at 19:29
  • $\begingroup$ Multiply by gamma or sqrt(gamma) somewhere - I'[m not sure where, because I'm not sure whether it multiplies the sigma^2 term. Include sigma as one of the elements of the vector. $\endgroup$ Jan 21, 2021 at 22:25
  • $\begingroup$ It multiplies both the sum and sigma terms i.e gamma(sum()^2 + sigma^2). $\endgroup$
    – Supremum
    Jan 22, 2021 at 0:08

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.