R/188_reductions_dcp2cone_canonicalizers_quad_quad_form_canon.R

Defines functions quad_form_quad_canon

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

## CVXPY SOURCE: reductions/dcp2cone/canonicalizers/quad/quad_form_canon.py
## If x is a Variable, wrap directly. Otherwise add equality constraint.


quad_form_quad_canon <- function(expr, args, solver_context = NULL) {
  affine_expr <- args[[1L]]
  P <- args[[2L]]
  ## CVXPY v1.9.3 fix: #3384 -- a variable with a dim-reducing attribute
  ## (symmetric/PSD/NSD/diag/sparsity) is substituted by an affine expression
  ## in CvxAttr2Constr, so it must go through the auxiliary variable.
  if (.s7_is(affine_expr, Variable) && !.cvxattr_has_dim_reducing_attr(affine_expr)) {
    list(SymbolicQuadForm(affine_expr, P, expr), list())
  } else {
    t <- Variable(shape = .shape(affine_expr))
    list(SymbolicQuadForm(t, P, expr), list(affine_expr == t))
  }
}

method(quad_canonicalize, QuadForm) <- quad_form_quad_canon

## Membership marker for the CSE cache: `affine_above` is part of a subtree's
## cache key only when the quad branch could fire inside it
## (`.affine_above_relevant`, dcp2cone.R). CVXPY reads this off its
## `quad_canon_methods` dict; CVXR needs an explicit predicate per class.
method(has_quad_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 Oct. 19, 2026, 5:07 p.m.