R/096_atoms_symbolic_quad_form.R

#####
## DO NOT EDIT THIS FILE!! EDIT THE SOURCE INSTEAD: rsrc_tree/atoms/symbolic_quad_form.R
#####

## CVXPY SOURCE: atoms/quad_form.py lines 134-184
## SymbolicQuadForm -- placeholder for quadratic form in QP path
##
## Created by quad canonicalizers when quad_obj=TRUE. Delegates all DCP
## queries to original_expression. Replaced by dummy Variable during
## P matrix extraction in coeff_quad_form.


SymbolicQuadForm <- new_class("SymbolicQuadForm", parent = Atom, package = "CVXR",
  properties = list(
    original_expression = class_any,  # the original atom (QuadForm, Power, etc.)
    block_indices       = class_any   # list of index vectors or NULL
  ),
  constructor = function(x, P, expr, block_indices = NULL, id = NULL) {
    if (is.null(id)) id <- next_expr_id()
    x <- as_expr(x)
    P <- as_expr(P)
    shape <- expr@shape

    new_object(S7_object(),
      id                  = as.integer(id),
      .cache              = new.env(parent = emptyenv()),
      args                = list(x, P),
      shape               = shape,
      original_expression = expr,
      block_indices       = block_indices
    )
  }
)

# -- get_data: for expr_copy reconstruction -----------------------
## Returns extra constructor args beyond x and P
method(get_data, SymbolicQuadForm) <- function(x) {
  list(x@original_expression, x@block_indices)
}

# -- shape: delegate to original expression ----------------------
method(shape_from_args, SymbolicQuadForm) <- function(x) {
  shape_from_args(x@original_expression)
}

# -- sign: delegate to original expression -----------------------
method(sign_from_args, SymbolicQuadForm) <- function(x) {
  sign_from_args(x@original_expression)
}

# -- curvature: delegate to original expression ------------------
method(is_atom_convex, SymbolicQuadForm) <- function(x) {
  is_atom_convex(x@original_expression)
}

method(is_atom_concave, SymbolicQuadForm) <- function(x) {
  is_atom_concave(x@original_expression)
}

# -- monotonicity: delegate to original expression ---------------
method(is_incr, SymbolicQuadForm) <- function(x, idx, ...) {
  is_incr(x@original_expression, idx)
}

method(is_decr, SymbolicQuadForm) <- function(x, idx, ...) {
  is_decr(x@original_expression, idx)
}

# -- quadratic analysis ------------------------------------------
method(is_quadratic, SymbolicQuadForm) <- function(x) TRUE

# -- numeric: not needed (replaced before evaluation) ------------
method(numeric_value, SymbolicQuadForm) <- function(x, values, ...) {
  cli_abort("{.cls SymbolicQuadForm} cannot be evaluated numerically.")
}

# -- graph_implementation: should never be called ----------------
method(graph_implementation, SymbolicQuadForm) <- function(x, arg_objs, shape, data = NULL, ...) {
  cli_abort("{.cls SymbolicQuadForm} should be replaced before canonicalization.")
}

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.