R/184_reductions_complex2real_canonicalizers_variable_canon.R

Defines functions c2r_variable_canon

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

## CVXPY SOURCE: reductions/complex2real/canonicalizers/variable_canon.py
## Canonicalize complex variables -> real/imag variable pairs

c2r_variable_canon <- function(expr, real_args, imag_args, real2imag) {
  if (is_real(expr)) {
    ## Purely real
    return(list(expr, NULL))
  } else if (is_imag(expr)) {
    ## Purely imaginary
    imag_var <- Variable(expr@shape, var_id = real2imag[[as.character(expr@id)]])
    return(list(NULL, imag_var))
  } else if (is_complex(expr) && is_hermitian(expr)) {
    ## Hermitian variable: real part symmetric, imag part skew-symmetric
    n <- expr@shape[1L]
    real_var <- Variable(c(n, n), var_id = expr@id, symmetric = TRUE)
    if (n > 1L) {
      imag_var <- Variable(c((n * (n - 1L)) %/% 2L, 1L),
                           var_id = real2imag[[as.character(expr@id)]])
      imag_upper_tri <- vec_to_upper_tri(imag_var, strict = TRUE)
      ## upper_tri - upper_tri^T to make skew-symmetric
      imag_mat <- skew_symmetric_wrap(imag_upper_tri - t(imag_upper_tri))
    } else {
      imag_mat <- Constant(matrix(0, 1L, 1L))
    }
    return(list(real_var, imag_mat))
  } else {
    ## General complex
    real_var <- Variable(expr@shape, var_id = expr@id)
    imag_var <- Variable(expr@shape, var_id = real2imag[[as.character(expr@id)]])
    return(list(real_var, imag_var))
  }
}

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.