R/010_settings.R

Defines functions .apply_std_params solver_default_param

Documented in solver_default_param

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

## CVXPY SOURCE: cvxpy/settings.py
## Global settings and constants for CVXR

# -- Solver names ------------------------------------------------------

#' Solver Name Constants
#'
#' Character string constants identifying the available solvers.
#'
#' @name solver-constants
#' @returns A character string.
NULL

#' @rdname solver-constants
#' @export
SCS_SOLVER <- "SCS"
#' @rdname solver-constants
#' @export
OSQP_SOLVER <- "OSQP"
#' @rdname solver-constants
#' @export
CLARABEL_SOLVER <- "CLARABEL"
#' @rdname solver-constants
#' @export
HIGHS_SOLVER <- "HIGHS"
#' @rdname solver-constants
#' @export
MOSEK_SOLVER <- "MOSEK"
#' @rdname solver-constants
#' @export
GUROBI_SOLVER <- "GUROBI"
#' @rdname solver-constants
#' @export
GLPK_SOLVER <- "GLPK"
#' @rdname solver-constants
#' @export
GLPK_MI_SOLVER <- "GLPK_MI"
#' @rdname solver-constants
#' @export
ECOS_SOLVER <- "ECOS"
#' @rdname solver-constants
#' @export
ECOS_BB_SOLVER <- "ECOS_BB"
#' @rdname solver-constants
#' @export
CPLEX_SOLVER <- "CPLEX"
#' @rdname solver-constants
#' @export
CVXOPT_SOLVER <- "CVXOPT"
#' @rdname solver-constants
#' @export
PIQP_SOLVER <- "PIQP"

# -- DCP curvature strings --------------------------------------------

AFFINE <- "AFFINE"
CONVEX <- "CONVEX"
CONCAVE <- "CONCAVE"
UNKNOWN_CURVATURE <- "UNKNOWN"

# -- Sign strings -----------------------------------------------------

ZERO_SIGN <- "ZERO"
NONNEG_SIGN <- "NONNEGATIVE"
NONPOS_SIGN <- "NONPOSITIVE"
UNKNOWN_SIGN <- "UNKNOWN"

# -- Status strings ---------------------------------------------------

#' Solution Status Constants
#'
#' Character string constants representing the possible solution statuses
#' returned by \code{\link{problem_status}}.
#'
#' @name status-constants
#' @returns A character string.
#' @seealso \code{\link{status}}, \code{\link{psolve}}
NULL

#' @rdname status-constants
#' @export
OPTIMAL <- "optimal"
#' @rdname status-constants
#' @export
INFEASIBLE <- "infeasible"
#' @rdname status-constants
#' @export
UNBOUNDED <- "unbounded"
#' @rdname status-constants
#' @export
SOLVER_ERROR <- "solver_error"
#' @rdname status-constants
#' @export
OPTIMAL_INACCURATE <- "optimal_inaccurate"
#' @rdname status-constants
#' @export
INFEASIBLE_INACCURATE <- "infeasible_inaccurate"
#' @rdname status-constants
#' @export
UNBOUNDED_INACCURATE <- "unbounded_inaccurate"

# -- Numerical tolerances ---------------------------------------------

EIGVAL_TOL <- 1e-10
PSD_NSD_PROJECTION_TOL <- 1e-8
SPARSE_NNZFRAC <- 0.1  # below this fraction, treat as sparse
ATOM_EVAL_TOL <- 1e-4   # tolerance for atom numeric evaluation (CVXPY settings.py)

# -- Naming prefixes ------------------------------------------------
## CVXPY SOURCE: settings.py lines 37-38

VAR_PREFIX <- "var"
PARAM_PREFIX <- "param"

# -- Curvature string (extra) ---------------------------------------
## CVXPY SOURCE: settings.py line 173

CONSTANT_CURV <- "CONSTANT"

# -- Projection tolerances ------------------------------------------
## CVXPY SOURCE: settings.py lines 204-206

GENERAL_PROJECTION_TOL <- 1e-10
SPARSE_PROJECTION_TOL <- 1e-10

# -- Constraint type IDs ------------------------------------------
## CVXPY SOURCE: settings.py line 125
## EQ, LEQ, SOC, SOC_EW, PSD, EXP, BOOL, INT = range(8)

CONSTR_ID_EQ     <- 0L
CONSTR_ID_LEQ    <- 1L
CONSTR_ID_SOC    <- 2L
CONSTR_ID_SOC_EW <- 3L
CONSTR_ID_PSD    <- 4L
CONSTR_ID_EXP    <- 5L
CONSTR_ID_BOOL   <- 6L
CONSTR_ID_INT    <- 7L

# -- Cone dimension keys ------------------------------------------
## CVXPY SOURCE: settings.py lines 133-137

EQ_DIM  <- "f"
LEQ_DIM <- "l"
SOC_DIM <- "q"
PSD_DIM <- "s"
EXP_DIM <- "ep"

# -- Status groups ------------------------------------------------
## CVXPY SOURCE: settings.py lines 58-68

#' @rdname status-constants
#' @export
USER_LIMIT <- "user_limit"
#' @rdname status-constants
#' @export
INFEASIBLE_OR_UNBOUNDED <- "infeasible_or_unbounded"
SOLUTION_PRESENT <- c(OPTIMAL, OPTIMAL_INACCURATE, USER_LIMIT)
INF_OR_UNB <- c(INFEASIBLE, INFEASIBLE_INACCURATE,
                 UNBOUNDED, UNBOUNDED_INACCURATE,
                 INFEASIBLE_OR_UNBOUNDED)
INACCURATE_STATUS <- c(OPTIMAL_INACCURATE, INFEASIBLE_INACCURATE,
                        UNBOUNDED_INACCURATE, USER_LIMIT)
ERROR_STATUS <- c(SOLVER_ERROR)

# -- ECOS exit code -> CVXR status --------------------------------
## CVXPY SOURCE: ecos_conif.py lines 45-57

ECOS_STATUS_MAP <- list(
  "0"  = OPTIMAL,
  "1"  = INFEASIBLE,
  "2"  = UNBOUNDED,
  "10" = OPTIMAL_INACCURATE,
  "11" = INFEASIBLE_INACCURATE,
  "12" = UNBOUNDED_INACCURATE,
  "-1" = USER_LIMIT,
  "-2" = SOLVER_ERROR,
  "-3" = SOLVER_ERROR,
  "-4" = SOLVER_ERROR,
  "-7" = SOLVER_ERROR
)

# -- Solver data keys --------------------------------------------
## CVXPY SOURCE: settings.py lines 159-168
## Use SD_ prefix to avoid R namespace collisions (bare A, B, C shadow base R)

SD_C      <- "c"            # objective vector
SD_OFFSET <- "offset"       # objective constant
SD_P      <- "P"            # quadratic objective matrix
SD_A      <- "A"            # constraint matrix
SD_B      <- "b"            # constraint vector
SD_DIMS   <- "dims"         # cone dimensions
SD_PARAM_PROB <- "param_prob"  # parameterized problem
SD_BOOL_IDX   <- "bool_idx"   # boolean variable indices
SD_INT_IDX    <- "int_idx"    # integer variable indices

# -- Result keys -------------------------------------------------
## CVXPY SOURCE: settings.py lines 147-156

RK_STATUS      <- "status"
RK_VALUE       <- "value"
RK_OBJ_OFFSET  <- "obj_offset"
RK_PRIMAL      <- "primal"
RK_EQ_DUAL     <- "eq_dual"
RK_INEQ_DUAL   <- "ineq_dual"
RK_SOLVE_TIME  <- "solve_time"
RK_SETUP_TIME  <- "setup_time"
RK_NUM_ITERS   <- "num_iters"
RK_EXTRA_STATS <- "solver_specific_stats"

# -- Bounds keys -------------------------------------------------
## CVXPY SOURCE: settings.py lines 143-144

LOWER_BOUNDS <- "lower_bounds"
UPPER_BOUNDS <- "upper_bounds"

# -- Standard solver parameter mappings ----------------------------
## Maps standard CVXR parameter names (reltol, abstol, feastol, num_iter)
## to solver-specific parameter names and default values.
## Used by .apply_std_params() in psolve() for solver-agnostic code.

## Private store -- exposed via solver_default_param() (read-only).
.SOLVER_DEFAULT_PARAM <- list(
  CLARABEL = list(
    reltol   = list(name = "tol_gap_rel", value = 1e-8),
    abstol   = list(name = "tol_gap_abs", value = 1e-8),
    feastol  = list(name = "tol_feas",    value = 1e-8),
    num_iter = list(name = "max_iter",    value = 200L)
  ),
  OSQP = list(
    reltol   = list(name = "eps_rel",      value = 1e-5),
    abstol   = list(name = "eps_abs",      value = 1e-5),
    feastol  = list(name = "eps_prim_inf", value = 1e-4),
    num_iter = list(name = "max_iter",     value = 10000L)
  ),
  SCS = list(
    reltol   = list(name = "eps_rel",  value = 1e-5),
    abstol   = list(name = "eps_abs",  value = 1e-5),
    num_iter = list(name = "max_iters", value = 2500L)
  ),
  HIGHS = list(
    num_iter = list(name = "simplex_iteration_limit", value = 2147483647L)
  ),
  MOSEK = list(
    num_iter = list(name = "num_iter", value = 10000L)
  ),
  GUROBI = list(
    feastol  = list(name = "FeasibilityTol",  value = 1e-6),
    num_iter = list(name = "IterationLimit",  value = 10000L)
  ),
  ECOS = list(
    reltol   = list(name = "RELTOL",  value = 1e-8),
    abstol   = list(name = "ABSTOL",  value = 1e-8),
    feastol  = list(name = "FEASTOL", value = 1e-8),
    num_iter = list(name = "MAXIT",   value = 100L)
  ),
  ECOS_BB = list(
    reltol   = list(name = "RELTOL",       value = 1e-3),
    abstol   = list(name = "ABSTOL",       value = 1e-6),
    feastol  = list(name = "FEASTOL",      value = 1e-6),
    num_iter = list(name = "MI_MAX_ITERS", value = 1000L)
  ),
  CPLEX = list(
    num_iter = list(name = "itlim", value = 10000L)
  ),
  CVXOPT = list(
    abstol   = list(name = "abstol",   value = 1e-6),
    reltol   = list(name = "reltol",   value = 1e-6),
    feastol  = list(name = "feastol",  value = 1e-6),
    num_iter = list(name = "maxiters", value = 100L)
  ),
  PIQP = list(
    reltol   = list(name = "eps_rel", value = 1e-9),
    abstol   = list(name = "eps_abs", value = 1e-8),
    num_iter = list(name = "max_iter", value = 250L)
  )
  ## GLPK, GLPK_MI: no standard parameter mappings
)

#' Standard Solver Parameter Mappings
#'
#' Returns a named list mapping standard CVXR parameter names (\code{reltol},
#' \code{abstol}, \code{feastol}, \code{num_iter}) to solver-specific
#' parameter names and their default values. Used internally by
#' \code{\link{psolve}} to translate standard parameters into
#' solver-native names.
#'
#' @return A named list keyed by solver name (e.g. \code{"CLARABEL"},
#'   \code{"OSQP"}). Each element is a list of standard parameter mappings,
#'   where each mapping has \code{name} (solver-native parameter name) and
#'   \code{value} (default value).
#' @seealso \code{\link{psolve}}
#' @export
solver_default_param <- function() .SOLVER_DEFAULT_PARAM

## Translate standard params (feastol, reltol, abstol, num_iter) into
## solver-native names. Standard params do NOT override solver-native
## names already present in solver_opts.
.apply_std_params <- function(solver_name, solver_opts,
                              feastol, reltol, abstol, num_iter) {
  mapping <- .SOLVER_DEFAULT_PARAM[[solver_name]]
  if (is.null(mapping)) return(solver_opts)
  std_vals <- list(feastol = feastol, reltol = reltol,
                   abstol = abstol, num_iter = num_iter)
  for (std_name in names(std_vals)) {
    val <- std_vals[[std_name]]
    if (is.null(val)) next
    info <- mapping[[std_name]]
    if (is.null(info)) next
    ## Standard param only applies if user hasn't set the native name directly
    if (is.null(solver_opts[[info$name]])) {
      ## Coerce num_iter to integer (some solvers require integer type)
      if (std_name == "num_iter") val <- as.integer(val)
      solver_opts[[info$name]] <- val
    }
  }
  solver_opts
}

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.