Skip to main content

ADMM - Automatic Decomposition Method by MindOpt

Project description

ADMM: Automatic Decomposition Method by MindOpt

PyPI version Documentation Status License: MIT Build and Publish

ADMM (Automatic Decomposition Method by MindOpt) is a Python library for building and solving structured optimization models. You describe objectives and constraints in a natural mathematical style, and ADMM turns that model into an efficient numerical solve through automatic canonicalization, decomposition, and a high-performance C++ backend.

The core idea is simple: model the problem, not the solver internals. ADMM is designed for formulations that combine linear or quadratic terms, smooth fitting losses, nonsmooth regularization, affine constraints, matrix structure, and custom proximal terms.

For convex models, ADMM targets the global optimum. Through user-defined proximal extensions, it also supports selected nonconvex formulations such as exact sparsity, rank constraints, and manifold-style projections, where the solver acts as a practical local method.

Features

  • Model-first optimization workflow: Write the mathematics directly and let ADMM handle canonicalization, decomposition, and solver orchestration automatically.
  • Rich structured problem support: Combine linear and quadratic objectives, smooth losses, nonsmooth regularizers, affine constraints, and matrix-valued structure such as symmetry and PSD constraints.
  • Beyond standard convex modeling: 48 ready-to-use UDF classes ship out of the box — from L0 sparsity and rank constraints to Cauchy, Welsch, and Tukey robust losses, KL divergence, logistic regression, and graph Laplacian smoothing. For any new smooth loss, supply just eval + grad and the C++ backend solves the proximal subproblem automatically.
  • Built for real applications: Use the same interface for portfolio optimization, sparse and regularized learning, covariance estimation, semidefinite modeling, compressed sensing, and signal or image processing.
  • NumPy-friendly Python API: Work naturally with scalars, vectors, and matrices in a concise Python interface instead of hand-coding low-level updates.
  • Fast backend, practical deployment: Run on a C++ backend with Python bindings across Linux, macOS, and Windows.

When to Use ADMM

ADMM is a strong fit when your model combines several structured ingredients in one formulation, such as:

  • linear or quadratic objectives
  • smooth fitting terms such as least squares, logistic regression, or Huber loss
  • nonsmooth regularization such as L1 or nuclear norm
  • affine equality or inequality constraints
  • structural constraints on variables such as nonnegativity, symmetry, or PSD
  • matrix-valued objectives such as trace, log-determinant, or Frobenius norm
  • custom proximal terms for advanced nonconvex modeling
  • custom smooth losses via gradient-based UDFs (Cauchy, log-cosh, quantile regression, etc.)

Installation

From PyPI

pip install admm

This will automatically install all dependencies including admmlib (the pre-built admm C++ core dependency library).

From Source

git clone https://github.com/alibaba-damo-academy/admm.git
cd admm
pip install . -r requirements.txt

Quick Start

The following example shows a mean-variance portfolio optimization problem:

min    -mu^T w + gamma * w^T Sigma w
s.t.   sum(w) = 1,   w >= 0

The corresponding ADMM code:

import admm
import numpy as np

n = 20
mu = np.abs(np.random.randn(n))
F = np.random.randn(n + 3, n)              # random factor matrix
Sigma = F.T @ F + 0.1 * np.eye(n)          # covariance matrix (PSD)
gamma = 0.5                                # risk-aversion parameter

model = admm.Model()
w = admm.Var("w", n)
model.setObjective(-mu.T @ w + gamma * (w.T @ Sigma @ w))
model.addConstr(admm.sum(w) == 1)
model.addConstr(w >= 0)
model.optimize()

print(f"status: {model.StatusString}")
print(f"obj:    {model.ObjVal:.6f}")

Examples

The examples/ folder contains 40 standalone scripts covering every documented use case — from basic LP/QP to UDF-based nonconvex models and gradient-based smooth losses. Each script runs independently:

python examples/portfolio_optimization.py
python examples/sparse_logistic_regression.py
python examples/udf_l0_norm.py

See examples/README.md for the full list.

User-Defined Proximal Functions

The udf/ folder ships 48 ready-to-use UDF classes — 15 proximal operators for nonconvex and convex penalties (L0, rank, manifold projections, etc.) and 33 gradient-based smooth losses covering robust M-estimators (Cauchy, Welsch, Tukey, Geman-McClure, etc.), classification losses (logistic, hinge, cross-entropy), divergences (KL, Itakura-Saito, χ²), barriers (log barrier, negative entropy), and structural penalties (smooth TV, graph Laplacian) — that go beyond standard convex modeling tools.

ADMM supports two UDF paths — supply the proximal operator (argmin) or just the gradient (grad):

# Path 1: argmin — closed-form proximal operator (nonconvex penalties, indicators)
from udf.L0Norm import L0Norm
model.setObjective(0.5 * admm.sum(admm.square(x - y)) + lam * L0Norm(x))
# Path 2: grad — gradient only (smooth custom losses)
from udf.CauchyLoss import CauchyLoss
model.setObjective(CauchyLoss(A @ x - b, c=2.0))

The grad path lets you add any differentiable custom loss without deriving a proximal formula — the C++ backend handles the proximal solve via gradient descent with backtracking line search.

See udf/README.md for the full class list, how to write your own, and how to contribute.

Documentation

Building from Source

Prerequisites

  • Python >= 3.10
  • C++ compiler (GCC, Clang, or MSVC)
  • Cython >= 0.29.0, setuptools >= 61, NumPy >= 1.20.0, SciPy >= 1.7.0
  • admmlib >= 2026.4.9 (pre-built C++ core dependency)
  • xelatex / latexmk (only needed for PDF documentation)

Supported Platforms

  • Linux: x86_64 (GCC)
  • macOS: ARM64 (Apple Silicon, Clang)
  • Windows: x86_64 (MSVC)

Build and Install

pip install . -r requirements.txt

Run Tests

pytest tests/                    # all tests
pytest tests/test_ut.py          # unit tests
pytest tests/test_admm.py        # application tests
pytest tests/test_udf.py         # user-defined function tests (argmin path)
pytest tests/test_udf_grad.py    # user-defined function tests (grad path)
pytest tests/test_doc.py         # documentation example tests

Build Documentation Locally

cd docs
bash build.sh

Open docs/_build/html/index.html in your browser. To build HTML only (without LaTeX/PDF):

pip install -r docs/requirements.txt
cd docs
python -c "import genrst; genrst.writeRst()"
python -m sphinx -b dirhtml ./ ./_build/html

Contributing

We welcome contributions! Please see CONTRIBUTING.md for guidelines, including how to contribute new user-defined proximal function classes under udf/.

Citing ADMM

If you use ADMM in your research or work, please cite:

@software{admm2026,
  title  = {{ADMM}: {A}utomatic {D}ecomposition {M}ethod by {MindOpt}},
  author = {{MindOpt Team, Alibaba DAMO Academy}},
  year   = {2026},
  url    = {https://github.com/alibaba-damo-academy/admm},
  note   = {Open-source Python library for structured optimization}
}

Troubleshooting

ImportError after installing admm

If import admm fails after a successful pip install admm, the most likely cause is that admmlib was not installed correctly. admmlib ships the native C library that admm depends on at runtime, and is normally installed automatically as a dependency.

To check whether admmlib is installed:

pip show admmlib

If it is missing, reinstall it explicitly:

pip install --force-reinstall admmlib

If the problem persists, please open an issue with the output of pip install admm -v and your platform information.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Acknowledgments

This project is maintained by the MindOpt Team at Alibaba DAMO Academy.

Support

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

admm-1.0.2604110923.tar.gz (749.5 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

admm-1.0.2604110923-cp313-cp313-win_amd64.whl (294.4 kB view details)

Uploaded CPython 3.13Windows x86-64

admm-1.0.2604110923-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

admm-1.0.2604110923-cp313-cp313-macosx_11_0_arm64.whl (308.8 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

admm-1.0.2604110923-cp312-cp312-win_amd64.whl (293.4 kB view details)

Uploaded CPython 3.12Windows x86-64

admm-1.0.2604110923-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

admm-1.0.2604110923-cp312-cp312-macosx_11_0_arm64.whl (310.9 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

admm-1.0.2604110923-cp311-cp311-win_amd64.whl (317.4 kB view details)

Uploaded CPython 3.11Windows x86-64

admm-1.0.2604110923-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

admm-1.0.2604110923-cp311-cp311-macosx_11_0_arm64.whl (319.4 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

admm-1.0.2604110923-cp310-cp310-win_amd64.whl (316.0 kB view details)

Uploaded CPython 3.10Windows x86-64

admm-1.0.2604110923-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

admm-1.0.2604110923-cp310-cp310-macosx_11_0_arm64.whl (325.0 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file admm-1.0.2604110923.tar.gz.

File metadata

  • Download URL: admm-1.0.2604110923.tar.gz
  • Upload date:
  • Size: 749.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for admm-1.0.2604110923.tar.gz
Algorithm Hash digest
SHA256 ec165380e86e02edd52d846b109f6f6f951a61d99201007e243e72aa3136a23e
MD5 6eb3ee4f9b48d8e62d2f998329c62905
BLAKE2b-256 44e3e234dd6abcb361e4a62b128658764c53c93063063682057f0a4fac95e0e7

See more details on using hashes here.

File details

Details for the file admm-1.0.2604110923-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for admm-1.0.2604110923-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 091e8b6a116d9d58c36e06c7d864e48ee887b4c9de31e02633115f4b56fd5fc0
MD5 e3912807e843b9a0564a1f292f675cc2
BLAKE2b-256 859cb91098480485107f5ee0f6dbf72e5ce68053407d629d0142817044f8cecb

See more details on using hashes here.

File details

Details for the file admm-1.0.2604110923-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for admm-1.0.2604110923-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 15dfe7668b07f5bac98fb3e95d401d586f747fdb1832efea1d500270baa68a71
MD5 918bcd03a6c7c07b8af99ca0715805c9
BLAKE2b-256 e67fcf49db323561b73b1394de493fd85597e28dcb6c10beedd503434bdb933b

See more details on using hashes here.

File details

Details for the file admm-1.0.2604110923-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for admm-1.0.2604110923-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 745f74bdadc834212ac8d3ce76fb799a6b1d4cfcfc0cf155ace67d0b944c2b85
MD5 26a9505bc4177529c06b893a2336caac
BLAKE2b-256 a2c5608d738335558e1928cd4f2302c2d561bfe26885fcc5da30f56f89769672

See more details on using hashes here.

File details

Details for the file admm-1.0.2604110923-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for admm-1.0.2604110923-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 38f297373c48eda94cf6941f9f90c1c84aaef7dbaaf1f86da0938ba779b6fc26
MD5 8fb3adf08b0a7be1c946d22f107dbd7f
BLAKE2b-256 1961847a73bfeba9f83cfd921ae2f4b625e864606252ce61e8b970f93034a679

See more details on using hashes here.

File details

Details for the file admm-1.0.2604110923-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for admm-1.0.2604110923-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0c72ad9da26c1eb60afc16eb9ebcfac8ddf4dda2364d491e09476d4031068a66
MD5 4c176709cd2586e0d4db3f854d6ba91d
BLAKE2b-256 82c8023da0495f163abb65140e42f40789ef7f69bdd4cad9588dce039960b0cb

See more details on using hashes here.

File details

Details for the file admm-1.0.2604110923-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for admm-1.0.2604110923-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 85269c76839e6e58a6ceb8cfc8cf214990f416e10311382a15b31359495add7a
MD5 dd188d3b3a0d4cbf06b6ac004fd1c743
BLAKE2b-256 7fe94281d0b1d47b8b8bf14e49a2b52888066d9a62f861d48d16f9ba79288546

See more details on using hashes here.

File details

Details for the file admm-1.0.2604110923-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for admm-1.0.2604110923-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 9afb660fe7afd0b42a6813aaa93decf0e4025a700dd06dc1e867ff156897df51
MD5 b33f070fac033bcc8777f97d5b1338e1
BLAKE2b-256 5cbb7d4e612aed835221bff3ec724133cce313b84f6617a542a4e85ed637747b

See more details on using hashes here.

File details

Details for the file admm-1.0.2604110923-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for admm-1.0.2604110923-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8064062325ffc5719171918f564c4e1d8276f7d2be15dd7e65c13ba4672975a2
MD5 a5eba3b648fd315d79e330a928de7ad7
BLAKE2b-256 dcdc43ad99cc36106f40c4e08e78ac25278ff8ea9854d82d4aa13f3fc715761f

See more details on using hashes here.

File details

Details for the file admm-1.0.2604110923-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for admm-1.0.2604110923-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4241031025c398c3c529227b70d89bc1f615c4a2c6f2ed7d01a83b79ece7e1fe
MD5 21ab6d7ebf397c289cc907525d092692
BLAKE2b-256 bb4d616f4d89363ae49508831411a0823c98cf1ef3c8a9e28964383e79ec2b85

See more details on using hashes here.

File details

Details for the file admm-1.0.2604110923-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for admm-1.0.2604110923-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 17a2cbf1d40f82366db5cd69248584fa74ff1c1e339dc588288a5e935fee9094
MD5 2d59488507d6d2e02f1ed2690604681e
BLAKE2b-256 b0b4d72531f70b00564110cb25cf1d01fe394446dcffc77d1ba0c62b60bc4fbe

See more details on using hashes here.

File details

Details for the file admm-1.0.2604110923-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for admm-1.0.2604110923-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 41fd64642cb98738a758f3a3467d6426e17578aacafec9bb607f08d2e4d5f93d
MD5 03e4463f236ab9b32b6ac5f1b2aedf19
BLAKE2b-256 6205e7d6b906a380ec545d59a17fec2c992138dd5f5504e41baa9f22cbe40a99

See more details on using hashes here.

File details

Details for the file admm-1.0.2604110923-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for admm-1.0.2604110923-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8138582f538f0e50300f6e70e088789930b028e103f82feea7f62c86050f04e2
MD5 4fd0c057365caeb59a784d81905d446d
BLAKE2b-256 cc9f3aa987a667f94735b3083eaffe1ec52af44556272cd09df9e224c5265d12

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page