R/166_reductions_dcp2cone_canonicalizers_quad_form_canon.R

Defines functions quad_form_canon

#####
## DO NOT EDIT THIS FILE!! EDIT THE SOURCE INSTEAD: rsrc_tree/reductions/dcp2cone/canonicalizers/quad_form_canon.R
#####

## CVXPY SOURCE: reductions/dcp2cone/canonicalizers/quad_form_canon.py
## Decomposes P via eigenvalues, then uses sum_squares -> quad_over_lin_canon


quad_form_canon <- function(expr, args, solver_context = NULL) {
  result <- decomp_quad(value(args[[2L]]))
  scale <- result$scale
  M1 <- result$M1
  M2 <- result$M2

  ## Special case: P == 0
  if (ncol(M1) == 0L && ncol(M2) == 0L) {
    return(list(Constant(0), list()))
  }

  if (ncol(M1) > 0L) {
    qexpr <- sum_squares(Constant(t(M1)) %*% args[[1L]])
  }
  if (ncol(M2) > 0L) {
    scale <- -scale
    qexpr <- sum_squares(Constant(t(M2)) %*% args[[1L]])
  }
  qol_result <- quad_over_lin_canon(qexpr, qexpr@args)
  list(scale * qol_result[[1L]], qol_result[[2L]])
}

method(dcp_canonicalize, QuadForm) <- quad_form_canon
method(has_dcp_canon, QuadForm) <- function(expr) TRUE

Try the CVXR package in your browser

Any scripts or data that you put into this service are public.

CVXR documentation built on March 6, 2026, 9:10 a.m.