cvxrust
A Disciplined Convex Programming (DCP) library for Rust, inspired by CVXPY.
cvxrust provides a domain-specific language for specifying convex optimization problems with automatic convexity verification and solving via the Clarabel solver.
Features
- DCP Verification: Automatically verifies problem convexity using disciplined convex programming rules
- Rich Atom Library: Norms, quadratic forms, exponential/log, element-wise operations, and more
- Native QP Support: Quadratic programs are solved directly (not reformulated as SOCPs)
- Intuitive Constraint Syntax: Use
constraint!macro for natural>=,<=,==notation - Dual Variables: Access shadow prices and sensitivity information
- Sparse Matrix Support: Efficient handling of large-scale problems
Installation
Add to your Cargo.toml:
[]
= "0.1"
Quick Start
use *;
// Minimize ||x||_2 subject to sum(x) = 1, x >= 0
let x = variable;
let solution = minimize
.subject_to
.solve
.unwrap;
println!;
println!;
Building and Testing
# Build the library
# Run all tests (159 tests)
# Run a specific test
# Run tests with output visible
# Run examples
# Lint with clippy
# Generate documentation
Supported Problem Classes
| Problem Type | Objective | Constraints |
|---|---|---|
| LP | Linear | Linear equality/inequality |
| QP | Quadratic (convex) | Linear equality/inequality |
| SOCP | Linear | Second-order cone |
| Exp Cone | Exponential/log | Exponential cone |
| Mixed | Any convex | Combination of above |
Expression Atoms
Affine Operations
- Arithmetic:
+,-,*(scalar),/(scalar) - Aggregation:
sum,sum_axis,cumsum - Structural:
reshape,flatten,vstack,hstack,transpose,diag - Linear algebra:
matmul,dot,trace - Indexing:
index,slice
Convex Atoms
- Norms:
norm1,norm2,norm_inf,norm - Element-wise:
abs,pos,neg_part,exp - Aggregation:
maximum,max2 - Quadratic:
quad_form(PSD),sum_squares,quad_over_lin - Powers:
power(p >= 1 or p < 0)
Concave Atoms
- Aggregation:
minimum,min2 - Quadratic:
quad_form(NSD) - Logarithmic:
log,entropy - Powers:
power(0 < p < 1),sqrt
Variable Construction
// Simple vector variable
let x = variable;
// Matrix variable
let X = variable;
// Scalar variable
let t = variable;
// Named variable with bounds
let x = vector
.name
.nonneg // x >= 0
.build;
Constraints
cvxrust provides the constraint! macro for natural constraint syntax:
use *;
let x = variable;
// Using constraint! macro (recommended)
let constraints = ;
// Method syntax also available
let c1 = x.ge; // x >= 0
let c2 = x.le; // x <= 10
let c3 = sum.eq;
// Second-order cone constraint: ||x||_2 <= t
let t = variable;
let soc = soc;
Accessing Solutions
let solution = problem.solve?;
// Check status
assert_eq!;
// Get optimal objective value
let value = solution.value.unwrap;
// Get variable values using indexing
let x_val = &solution;
// Get scalar value
let t_val = solution.value;
// Access dual variables (shadow prices)
let duals = solution.duals;
let dual_0 = solution.constraint_dual; // Dual for first constraint
Examples
Least Squares
let x = variable;
let residual = &A * &x - &b;
let solution = minimize.solve?;
L1 Regularized Regression (Lasso)
let x = variable;
let loss = sum_squares;
let reg = norm1;
let solution = minimize.solve?;
Portfolio Optimization
let w = variable;
let risk = quad_form; // w' * Sigma * w
let solution = minimize
.subject_to
.solve?;
// Access dual variable for return constraint (shadow price)
if let Some = solution.constraint_dual
Logistic Regression
let theta = variable;
// log(1 + exp(-y * X @ theta)) using log-sum-exp
let solution = minimize
.subject_to
.solve?;
DCP Rules
cvxrust enforces Disciplined Convex Programming rules:
Objective:
minimize(convex)ormaximize(concave)
Constraints:
convex <= concaveconcave >= convexaffine == affine
Curvature is determined by DCP composition rules - for example, convex + convex = convex, and nonneg * convex = convex. See dcp.stanford.edu for a complete reference.
Problems that violate DCP rules will return a DcpError.
Architecture
Expression -> DCP Verification -> Canonicalization -> Matrix Stuffing -> Clarabel -> Solution
- Build expression trees using atoms and operator overloads
- Verify convexity via curvature and sign propagation
- Transform to canonical form (LinExpr/QuadExpr + cone constraints)
- Stuff into sparse matrices P, q, A, b
- Solve with Clarabel and map solution back to variables
License
Apache 2.0