R/180_reductions_utilities.R

Defines functions convex_attributes are_args_affine nonpos2nonneg lower_ineq_to_nonneg lower_equality group_constraints

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

## CVXPY SOURCE: reductions/utilities.py
## Utility functions for constraint lowering and grouping


# -- group_constraints ---------------------------------------------
## CVXPY SOURCE: utilities.py lines 68-84
## Group constraints by class name into a named list.

group_constraints <- function(constraints) {
  ## Named list of S7 class objects -- filter constraints by type
  cone_types <- list(Zero = Zero, NonNeg = NonNeg, SOC = SOC,
                     PSD = PSD, ExpCone = ExpCone,
                     PowCone3D = PowCone3D, PowConeND = PowConeND)
  result <- lapply(cone_types, function(cls) {
    Filter(function(con) S7_inherits(con, cls), constraints)
  })
  result
}

# -- lower_equality ------------------------------------------------
## CVXPY SOURCE: utilities.py lines 42-45
## Equality(lhs, rhs) -> Zero(lhs - rhs)
## Our Equality stores .expr = lhs - rhs, args = list(lhs, rhs)

lower_equality <- function(equality) {
  Zero(equality@args[[1L]] - equality@args[[2L]], constr_id = equality@id)
}

# -- lower_ineq_to_nonneg -----------------------------------------
## CVXPY SOURCE: utilities.py lines 36-39
## Inequality(lhs, rhs) means lhs <= rhs -> NonNeg(rhs - lhs)
## Our Inequality stores args = list(lhs, rhs)

lower_ineq_to_nonneg <- function(inequality) {
  NonNeg(inequality@args[[2L]] - inequality@args[[1L]],
         constr_id = inequality@id)
}

# -- nonpos2nonneg -------------------------------------------------
## CVXPY SOURCE: utilities.py lines 48-49
## NonPos(expr) -> NonNeg(-expr)

nonpos2nonneg <- function(nonpos) {
  NonNeg(-(nonpos@args[[1L]]), constr_id = nonpos@id)
}

# -- are_args_affine -----------------------------------------------
## CVXPY SOURCE: utilities.py lines 63-65

are_args_affine <- function(constraints) {
  all(vapply(constraints, function(c) .all_args(c, is_affine), logical(1L)))
}

# -- convex_attributes ---------------------------------------------
## CVXPY SOURCE: cvx_attr2constr.py lines 31-66
## Returns a character vector of the convex attributes present in variables.

CONVEX_ATTRIBUTES <- c("nonneg", "nonpos", "pos", "neg", "symmetric",
                        "diag", "PSD", "NSD", "bounds", "sparsity")

SYMMETRIC_ATTRIBUTES <- c("symmetric", "PSD", "NSD")

convex_attributes <- function(variables) {
  attrs <- character(0)
  for (attr_name in CONVEX_ATTRIBUTES) {
    for (v in variables) {
      val <- v@attributes[[attr_name]]
      if (!is.null(val) && !identical(val, FALSE)) {
        attrs <- c(attrs, attr_name)
        break
      }
    }
  }
  attrs
}

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.