Skip to main content

A library to compute gradients for convex optimization problems

Project description

Build Status

diffcp

diffcp is a Python package for computing the derivative of a convex cone program, with respect to its problem data. The derivative is implemented as an abstract linear map, with methods for its forward application and its adjoint.

The implementation is based on the calculations in our paper Differentiating through a cone program.

Installation

diffcp is available on PyPI, as a source distribution. Install it with

pip install diffcp

You will need a C++11-capable compiler to build diffcp.

diffcp requires:

diffcp uses Eigen; Eigen operations can be automatically vectorized by compilers. To enable vectorization, install with

MARCH_NATIVE=1 pip install diffcp

OpenMP can be enabled by passing extra arguments to your compiler. For example, on linux, you can tell gcc to activate the OpenMP extension by specifying the flag "-fopenmp":

OPENMP_FLAG="-fopenmp" pip install diffcp

To enable both vectorization and OpenMP (on linux), use

MARCH_NATIVE=1 OPENMP_FLAG="-fopenmp" pip install diffcp

Cone programs

diffcp differentiates through a primal-dual cone program pair. The primal problem must be expressed as

minimize        c'x + x'Px
subject to      Ax + s = b
                s in K

where x and s are variables, A, b, c and P (optional) are the user-supplied problem data, and K is a user-defined convex cone. The corresponding dual problem is

minimize        b'y + x'Px
subject to      Px + A'y + c == 0
                y in K^*

with dual variable y.

Usage

diffcp exposes the function

solve_and_derivative(A, b, c, cone_dict, warm_start=None, solver=None, P=None, **kwargs).

This function returns a primal-dual solution x, y, and s, along with functions for evaluating the derivative and its adjoint (transpose). These functions respectively compute right and left multiplication of the derivative of the solution map at A, b, c and P by a vector. The solver argument determines which solver to use; the available solvers are solver="SCS", solver="ECOS", and solver="Clarabel". If no solver is specified, diffcp will choose the solver itself. In the case that the problem is not solved, i.e. the solver fails for some reason, we will raise a SolverError Exception.

Arguments

The arguments A, b, c and P correspond to the problem data of a cone program.

  • A must be a SciPy sparse CSC matrix.
  • b and c must be NumPy arrays.
  • cone_dict is a dictionary that defines the convex cone K.
  • warm_start is an optional tuple (x, y, s) at which to warm-start. (Note: this is only available for the SCS solver).
  • P is an optional SciPy sparse CSC matrix. (Note: this is currently only available for the Clarabel and SCS solvers, paired with LPGD differentiation mode).
  • **kwargs are keyword arguments to forward to the solver (e.g., verbose=False).

These inputs must conform to the SCS convention for problem data. The keys in cone_dict correspond to the cones, with

  • diffcp.ZERO for the zero cone,
  • diffcp.POS for the positive orthant,
  • diffcp.SOC for a product of SOC cones,
  • diffcp.PSD for a product of PSD cones, and
  • diffcp.EXP for a product of exponential cones.

The values in cone_dict denote the sizes of each cone; the values of diffcp.SOC, diffcp.PSD, and diffcp.EXP should be lists. The order of the rows of A must match the ordering of the cones given above. For more details, consult the SCS documentation.

To enable Lagrangian Proximal Gradient Descent (LPGD) differentiation of the conic program based on efficient finite-differences, provide one of the mode=[lpgd, lpgd_left, lpgd_right] options along with the argument derivative_kwargs=dict(tau=0.1, rho=0.1) to specify the perturbation and regularization strength. Alternatively, the derivative kwargs can also be passed directly to the returned derivative and adjoint_derivative function.

Return value

The function solve_and_derivative returns a tuple

(x, y, s, derivative, adjoint_derivative)
  • x, y, and s are a primal-dual solution.

  • derivative is a function that applies the derivative at (A, b, c, P) to perturbations dA, db, dc and dP (optional). It has the signature derivative(dA, db, dc, dP=None) -> dx, dy, ds, where dA is a SciPy sparse CSC matrix with the same sparsity pattern as A, db and dc are NumPy arrays, and dP is an optional SciPy sparse CSC matrix with the same sparsity pattern as P (Note: currently only supported for LPGD differentiation mode). dx, dy, and ds are NumPy arrays, approximating the change in the primal-dual solution due to the perturbation.

  • adjoint_derivative is a function that applies the adjoint of the derivative to perturbations dx, dy, ds. It has the signature adjoint_derivative(dx, dy, ds, return_dP=False) -> dA, db, dc, (dP), where dx, dy, and ds are NumPy arrays. dP is only returned when setting return_dP=True (Note: currently only supported for LPGD differentiation mode).

Example

import numpy as np
from scipy import sparse

import diffcp

def random_cone_prog(m, n, cone_dict):
    """Returns the problem data of a random cone program."""
    cone_list = diffcp.cones.parse_cone_dict(cone_dict)
    z = np.random.randn(m)
    s_star = diffcp.cones.pi(z, cone_list, dual=False)
    y_star = s_star - z
    A = sparse.csc_matrix(np.random.randn(m, n))
    x_star = np.random.randn(n)
    b = A @ x_star + s_star
    c = -A.T @ y_star
    return A, b, c

cone_dict = {
    diffcp.ZERO: 3,
    diffcp.POS: 3,
    diffcp.SOC: [5]
}

m = 3 + 3 + 5
n = 5

A, b, c = random_cone_prog(m, n, cone_dict)
x, y, s, D, DT = diffcp.solve_and_derivative(A, b, c, cone_dict)

# evaluate the derivative
nonzeros = A.nonzero()
data = 1e-4 * np.random.randn(A.size)
dA = sparse.csc_matrix((data, nonzeros), shape=A.shape)
db = 1e-4 * np.random.randn(m)
dc = 1e-4 * np.random.randn(n)
dx, dy, ds = D(dA, db, dc)

# evaluate the adjoint of the derivative
dx = c
dy = np.zeros(m)
ds = np.zeros(m)
dA, db, dc = DT(dx, dy, ds)

For more examples, including the SDP example described in the paper, and examples of using LPGD differentiation, see the examples directory.

Citing

If you wish to cite diffcp, please use the following BibTex:

@article{diffcp2019,
    author       = {Agrawal, A. and Barratt, S. and Boyd, S. and Busseti, E. and Moursi, W.},
    title        = {Differentiating through a Cone Program},
    journal      = {Journal of Applied and Numerical Optimization},
    year         = {2019},
    volume       = {1},
    number       = {2},
    pages        = {107--115},
}

@misc{diffcp,
    author       = {Agrawal, A. and Barratt, S. and Boyd, S. and Busseti, E. and Moursi, W.},
    title        = {{diffcp}: differentiating through a cone program, version 1.0},
    howpublished = {\url{https://github.com/cvxgrp/diffcp}},
    year         = 2019
}

The following thesis concurrently derived the mathematics behind differentiating cone programs.

@phdthesis{amos2019differentiable,
  author       = {Brandon Amos},
  title        = {{Differentiable Optimization-Based Modeling for Machine Learning}},
  school       = {Carnegie Mellon University},
  year         = 2019,
  month        = May,
}

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

diffcp-1.1.9.tar.gz (2.1 MB view details)

Uploaded Source

Built Distributions

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

diffcp-1.1.9-cp313-cp313-musllinux_1_2_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

diffcp-1.1.9-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (254.2 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

diffcp-1.1.9-cp313-cp313-macosx_11_0_arm64.whl (222.9 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

diffcp-1.1.9-cp313-cp313-macosx_10_13_x86_64.whl (237.1 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

diffcp-1.1.9-cp312-cp312-musllinux_1_2_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

diffcp-1.1.9-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (254.2 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

diffcp-1.1.9-cp312-cp312-macosx_11_0_arm64.whl (222.8 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

diffcp-1.1.9-cp312-cp312-macosx_10_13_x86_64.whl (237.1 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

diffcp-1.1.9-cp311-cp311-musllinux_1_2_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

diffcp-1.1.9-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (253.7 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

diffcp-1.1.9-cp311-cp311-macosx_11_0_arm64.whl (220.3 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

diffcp-1.1.9-cp311-cp311-macosx_10_9_x86_64.whl (233.2 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

diffcp-1.1.9-cp310-cp310-musllinux_1_2_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

diffcp-1.1.9-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (252.8 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

diffcp-1.1.9-cp310-cp310-macosx_11_0_arm64.whl (219.2 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

diffcp-1.1.9-cp310-cp310-macosx_10_9_x86_64.whl (231.8 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

File details

Details for the file diffcp-1.1.9.tar.gz.

File metadata

  • Download URL: diffcp-1.1.9.tar.gz
  • Upload date:
  • Size: 2.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for diffcp-1.1.9.tar.gz
Algorithm Hash digest
SHA256 10016ef0aa221d3d7875210179dffb3dd6010ebd2328efab582e84178b539e2b
MD5 9a1940b791264a5fb0e73d9c2cd401ae
BLAKE2b-256 bc30348599fbc2a3e64b412a026cd1464d0f9feb3ec3a3558cdcb72da54c891f

See more details on using hashes here.

Provenance

The following attestation bundles were made for diffcp-1.1.9.tar.gz:

Publisher: build.yml on cvxgrp/diffcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file diffcp-1.1.9-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for diffcp-1.1.9-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 bad860d16c631380a68dfea6cd8016dbb00b5c4dc235edac7b890d3bb294c32f
MD5 b88757784bd4be3988c717bcac40f7f0
BLAKE2b-256 90679a9a7b3d3257da380a42a2281f28e912f72989c8b18919f00174a249d04b

See more details on using hashes here.

Provenance

The following attestation bundles were made for diffcp-1.1.9-cp313-cp313-musllinux_1_2_x86_64.whl:

Publisher: build.yml on cvxgrp/diffcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file diffcp-1.1.9-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for diffcp-1.1.9-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2e793a15616008ceb642f4faf884201dbab760d38b6c3c1b10594a1e85c131ea
MD5 6d3b51f3c12f6e37a69935c1ca90bbaf
BLAKE2b-256 db7cb697f573fe6c96e337ad2fe45aa03ec83a72117df411b2368aa711430e2d

See more details on using hashes here.

Provenance

The following attestation bundles were made for diffcp-1.1.9-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build.yml on cvxgrp/diffcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file diffcp-1.1.9-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for diffcp-1.1.9-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f44e641564926ea426e6091e569b16e4f5065cafe8d85f7bb323fbd18b3e6f5b
MD5 96d206591efa2cf9cf05c6d34131bc7f
BLAKE2b-256 0c6eeb7e3f51bb5bcb5b833a7f8e04dd246c6e4cff80d06e2143812f44662724

See more details on using hashes here.

Provenance

The following attestation bundles were made for diffcp-1.1.9-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: build.yml on cvxgrp/diffcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file diffcp-1.1.9-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for diffcp-1.1.9-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 eff2b1366f14fee2a9592844376680d85929fbbb2b6a875874f709aea1450965
MD5 2eb5d65661f94a5e6eea5dfc5d524b1c
BLAKE2b-256 abf74570b4c428c2ee3cb7ec447fc07f908c4d6c1129fb0d00d3141b86f88ed6

See more details on using hashes here.

Provenance

The following attestation bundles were made for diffcp-1.1.9-cp313-cp313-macosx_10_13_x86_64.whl:

Publisher: build.yml on cvxgrp/diffcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file diffcp-1.1.9-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for diffcp-1.1.9-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 625b9c3ddcd642ab95a3740b95e90414b7ca98846b360bfb5af464a9de9d0ce6
MD5 600a979f8e977f6ef3c037c3656bd52a
BLAKE2b-256 04d88891f8b7cb347c02073a9e46dd8d628e07b18876cd7c5b7d811518e3623b

See more details on using hashes here.

Provenance

The following attestation bundles were made for diffcp-1.1.9-cp312-cp312-musllinux_1_2_x86_64.whl:

Publisher: build.yml on cvxgrp/diffcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file diffcp-1.1.9-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for diffcp-1.1.9-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f9000e723e9b6ed5e04822e615f8d435fe7311fbe9f4d53ed0e8af9cb3da6622
MD5 b45589f6d04118e54f984d60328a27cb
BLAKE2b-256 ded54648d974e880fdb0a6b128f057cc3e7fff423a802ded9bf342246e16e931

See more details on using hashes here.

Provenance

The following attestation bundles were made for diffcp-1.1.9-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build.yml on cvxgrp/diffcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file diffcp-1.1.9-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for diffcp-1.1.9-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 230f23c64ce698fc67b0ef1a80807c6dcd4c7711fdad9e103e0b88609a871394
MD5 62eaa02a10ded15978187af31529ab45
BLAKE2b-256 802c4576b3046503909b26b0ae8c8d80b8b68f709159fed7a9345ad72ca9eefc

See more details on using hashes here.

Provenance

The following attestation bundles were made for diffcp-1.1.9-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: build.yml on cvxgrp/diffcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file diffcp-1.1.9-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for diffcp-1.1.9-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 0d9e65ef27e8d62974c56836df0e197567de0ac45a8514a23a8fde88ea623113
MD5 3f1f529473b0c0c3cdb1848a62c53e4f
BLAKE2b-256 29fd252eb87439b89d74fb9963bdd82b4af7b112352eae3cb1ec456db51cbd89

See more details on using hashes here.

Provenance

The following attestation bundles were made for diffcp-1.1.9-cp312-cp312-macosx_10_13_x86_64.whl:

Publisher: build.yml on cvxgrp/diffcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file diffcp-1.1.9-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for diffcp-1.1.9-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 26df9f992aefa4583fca40167f8d10687c2c0283a8cbc7f7c43b69bccad0677c
MD5 c6d1729abcb4495a5ccfcf1bff01c3ad
BLAKE2b-256 6585493f09afbddba5ed8b1fa00b269c76e629fd337267722c101d7aee47a307

See more details on using hashes here.

Provenance

The following attestation bundles were made for diffcp-1.1.9-cp311-cp311-musllinux_1_2_x86_64.whl:

Publisher: build.yml on cvxgrp/diffcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file diffcp-1.1.9-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for diffcp-1.1.9-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3c79243d9cb4aec4e344961ec76d216213d477bbfb7d92f0f443a2de6c408ce0
MD5 bd478b1c9f969c2544ff62b9cb571ea3
BLAKE2b-256 8d515bd5e1893e24c04476a3a7aef763eeb16128ecf14eb3abd64ee45233a29c

See more details on using hashes here.

Provenance

The following attestation bundles were made for diffcp-1.1.9-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build.yml on cvxgrp/diffcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file diffcp-1.1.9-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for diffcp-1.1.9-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a602f01aa7b3fc48a58511541eccedebde5369d52aeb27e3f82a6fe60e0eb770
MD5 e49d746477c619a49cce8b33ab6efb3e
BLAKE2b-256 21b42f7c02b41dbfdbbef34d96e6e962a16ba8fd659a8bb44b734c8046a80ca8

See more details on using hashes here.

Provenance

The following attestation bundles were made for diffcp-1.1.9-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: build.yml on cvxgrp/diffcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file diffcp-1.1.9-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for diffcp-1.1.9-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 01ba3fad254fdbeb0fcb14767d1c61175d69757902528fb7a6ee124e65b86864
MD5 f1f5101cbac0b41d56e69ccbf4d79d87
BLAKE2b-256 56913e3f99e4bc62a16ab1d17ab774317ed5ba4bf545acff739ba0c9fc8434f2

See more details on using hashes here.

Provenance

The following attestation bundles were made for diffcp-1.1.9-cp311-cp311-macosx_10_9_x86_64.whl:

Publisher: build.yml on cvxgrp/diffcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file diffcp-1.1.9-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for diffcp-1.1.9-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 dcaa95ff46158ce8094a2a70111b72c097313d689ccfdacd3706aab9ab5648dc
MD5 5d3b63584f97c655906aadd85cf56646
BLAKE2b-256 0e010e5596cad6c0a78e62978fa25855a792c7ce459302f8db7150bc5994fa93

See more details on using hashes here.

Provenance

The following attestation bundles were made for diffcp-1.1.9-cp310-cp310-musllinux_1_2_x86_64.whl:

Publisher: build.yml on cvxgrp/diffcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file diffcp-1.1.9-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for diffcp-1.1.9-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b4abd4ae9cfa40203a6eaeab71b456f8a9917aeac4cbe1e5ed5f1eb40e3d04a1
MD5 0ea348656cfb70c1115e946671635599
BLAKE2b-256 31631d2d8bb8cb3466a0fe115e0ef3fbf09337bfd3f0817fe53d06e51a50477b

See more details on using hashes here.

Provenance

The following attestation bundles were made for diffcp-1.1.9-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build.yml on cvxgrp/diffcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file diffcp-1.1.9-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for diffcp-1.1.9-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7f20e699e4308024fb23ac0a19435d21100fff353457e27edd32793e25d1054f
MD5 f3e00b27f842874423f4d7be55e4a055
BLAKE2b-256 54cdcf2106bd0f7172b39bbbf3773b6f0135482f50a44b4fd7d8bb2a06154af0

See more details on using hashes here.

Provenance

The following attestation bundles were made for diffcp-1.1.9-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: build.yml on cvxgrp/diffcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file diffcp-1.1.9-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for diffcp-1.1.9-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 01a8506a8442ad64379f4e53e607f68e0ae4d0d00656eb2b72ca9357cf0fab2f
MD5 22ebddaad51188749cc5894b2cba44c1
BLAKE2b-256 ed02f937c2ca2e9996167a592a8b716f689c8a245da42ea0b2cf81bdb3e65034

See more details on using hashes here.

Provenance

The following attestation bundles were made for diffcp-1.1.9-cp310-cp310-macosx_10_9_x86_64.whl:

Publisher: build.yml on cvxgrp/diffcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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