Hybrid MINLP solver combining Rust and JAX
Project description
discopt
A hybrid Mixed-Integer Nonlinear Programming (MINLP) solver combining a Rust backend, JAX automatic differentiation, and Python orchestration. Solves MINLP problems via NLP-based spatial Branch and Bound with JIT-compiled objective/gradient/Hessian evaluation.
Features
- Algebraic modeling API -- continuous, binary, and integer variables with operator overloading
- Spatial Branch and Bound -- Rust-powered node pool, branching, and pruning
- JIT-compiled NLP evaluation -- objective, gradient, Hessian, and constraint Jacobian via JAX
- Three NLP backends -- POUNCE (pure-Rust Ipopt port; default for single solves), pure-JAX interior-point method (vmap-batched B&B node engine), cyipopt (Ipopt)
- Convex relaxations -- McCormick envelopes (28 functions including sigmoid/softplus/tanh and the trig/inverse-trig/
erffamilies), piecewise McCormick, alphaBB underestimators - Neural network embedding -- embed trained feedforward networks (ReLU, sigmoid, tanh, softplus) as MINLP constraints via big-M, full-space, and reduced-space strategies; interval arithmetic bound propagation; ONNX import (
pip install discopt[nn]) - Generalized disjunctive programming --
BooleanVar, propositional logic operators (land,lor,lnot,atleast,atmost,exactly),either_or(),if_then(); reformulated via big-M, multiple big-M (LP-tightened), hull, or Logic-based Outer Approximation (gdp_method="loa") - Complementarity / MPEC --
Model.complementarity(x, y)reformulated via GDP disjunction (default), Scholtes regularization, or SOS1 - Specialized problem classes -- pooling problem (pq-formulation), geometric programming (posynomial detection + log-space convex reformulation), AC optimal power flow (rectangular QCQP)
- Robust & multi-objective optimization -- uncertainty sets with affine decision rules; scalarization (weighted-sum, ε-constraint, Tchebycheff, NBI, NNC) with Pareto-front analysis
- Parameter estimation & MBDoE -- weighted-least-squares estimation and model-based design of experiments (D/A/E-optimality, identifiability, model discrimination) with exact JAX Fisher-information Jacobians
- Presolve -- FBBT (interval arithmetic, probing, Big-M simplification, integrality-aware snapping, periodic-variable reduction), OBBT with LP warm-start
- Cutting planes -- reformulation-linearization (RLT, a first-class
rlt_cuts=Trueoption), PSD/SOC cuts for QCQP, and outer approximation (OA);cuts='auto'by default - Primal heuristics -- multi-start NLP, feasibility pump, diving, RINS, local branching
- Infeasibility diagnosis -- irreducible infeasible subsystem (
compute_iis) and conflict analysis / no-good cuts - GNN branching policy -- bipartite graph-neural-network scaffold for learned branching (experimental; ships untrained, see #236)
- Differentiable optimization -- parameter sensitivity via envelope theorem and KKT implicit differentiation, including differentiable MILP/MIQP (fix-and-differentiate)
- .nl file import -- read AMPL-format models via Rust parser
- Pyomo solver plugin -- use discopt from existing Pyomo models via
SolverFactory("discopt")(pip install discopt[pyomo]); see docs/pyomo_solver.md - Dynamic optimization -- DAE collocation (Radau/Legendre) and finite differences for optimal control, parameter estimation, and PDE-constrained optimization
- CUTEst interface -- NLP benchmarking against the CUTEst test set
- LLM integration (optional) -- conversational model building, diagnostics, and reformulation suggestions
- Extensive test suite -- 339 Rust + 3,700+ Python test functions
Quick Start
from discopt import Model
m = Model("example")
x = m.continuous("x", lb=0, ub=5)
y = m.continuous("y", lb=0, ub=5)
z = m.binary("z")
m.minimize(x**2 + y**2 + z)
m.subject_to(x + y >= 1)
m.subject_to(x**2 + y <= 3)
result = m.solve()
print(result.status) # "optimal"
print(result.objective) # 0.5
print(result.x) # {"x": 0.5, "y": 0.5, "z": 0.0}
Architecture
Model.solve() --> Python orchestrator --> Rust TreeManager (B&B engine)
| |
JAX NLPEvaluator Node pool / branching / pruning
NLP backends: Zero-copy numpy arrays (PyO3)
pounce (pure-Rust Ipopt port) [default single solve]
ipm (pure-JAX, vmap batch) [B&B node relaxations]
cyipopt (Ipopt)
Rust backend (crates/discopt-core): Expression IR, Branch and Bound tree (node pool, branching, pruning), .nl file parser, FBBT/presolve (interval arithmetic, probing, Big-M simplification).
Rust-Python bindings (crates/discopt-python): PyO3 bindings with zero-copy numpy array transfer for the B&B tree manager, expression IR, batch dispatch, and .nl parser.
JAX layer (python/discopt/_jax): DAG compiler mapping modeling expressions to JAX primitives, JIT-compiled NLP evaluator (objective, gradient, Hessian, constraint Jacobian), McCormick convex/concave relaxations (28 functions), and a relaxation compiler with vmap support.
Solver wrappers (python/discopt/solvers): POUNCE (pure-Rust Ipopt port), cyipopt NLP wrapper for Ipopt, HiGHS LP and MILP wrappers with warm-start support.
CUTEst interface (python/discopt/interfaces/cutest.py): PyCUTEst-based evaluator for NLP benchmarking against the CUTEst test set.
Orchestrator (python/discopt/solver.py): End-to-end Model.solve() connecting all components. At each B&B node: solve continuous NLP relaxation with tightened bounds, prune infeasible nodes, fathom integer-feasible solutions, branch on most fractional variable.
NLP Backends
| Backend | Implementation | Use Case |
|---|---|---|
pounce (default) |
Pure-Rust Ipopt port | Single-problem NLP; fastest wall-clock |
ipm |
Pure-JAX IPM | B&B inner loop; GPU-batched via jax.vmap |
cyipopt |
Ipopt via cyipopt | Single-problem NLP; most robust |
For single continuous solves the default NLP backend resolves to a KKT-valid
solver -- POUNCE when installed, falling back to cyipopt, then to the pure-JAX
IPM. The pure-JAX ipm remains the vmap-batched engine for B&B node relaxations.
result = model.solve() # default: POUNCE when installed
result = model.solve(nlp_solver="pounce") # POUNCE (pure-Rust Ipopt port)
result = model.solve(nlp_solver="ipm") # Pure-JAX IPM
result = model.solve(nlp_solver="cyipopt") # Ipopt
Benchmarks
Performance measured on Apple M4 Pro (CPU, JAX 0.8.2). "Warm" times exclude JIT compilation. All solvers produce matching objective values.
| Problem Class | discopt | Comparison | Notes |
|---|---|---|---|
| LP (n=100) | 0.015s warm | HiGHS 0.002s, scipy 0.002s | Algebraic extraction, no autodiff |
| QP (n=100) | 0.04s warm | scipy SLSQP 0.02s | Was 66s before algebraic extraction |
| MILP (n=25) | 0.002s | HiGHS MIP 0.002s | B&B + LP relaxation, correct objectives |
| MIQP (n=10) | 0.004s | NLP path 4.9s | QP-specialized path: 1000x+ speedup |
| NLP (n=20, Rosenbrock) | IPM 1.1s warm, POUNCE 0.42s, Ipopt 0.43s | -- | POUNCE fastest single-solve; IPM best for batched B&B |
| MINLP (n=10) | 0.9s (batch=1) | 0.9s (batch=16) | vmap batching helps with deeper B&B trees |
See the benchmark notebooks for full scaling plots and details:
- Benchmarks by Problem Class -- LP, QP, MILP, MIQP, NLP (3 backends), MINLP
- IPM vs POUNCE vs Ipopt -- detailed NLP backend comparison (incl. vmap-batched IPM for B&B inner loops)
Installation
Requires Rust 1.84+ and Python 3.10+. POUNCE (the default single-solve NLP backend) is a pure-Rust Ipopt port with no system dependencies; cyipopt is an optional fallback that needs the Ipopt C library.
# Install the POUNCE NLP backend (pure-Rust Ipopt port)
pip install pounce-solver
# Optional cyipopt fallback (needs the Ipopt C library; macOS: brew install ipopt)
pip install "discopt[ipopt]"
# Build Rust-Python bindings
cd crates/discopt-python && maturin develop && cd ../..
# Run the fast default PR battery
cargo test -p discopt-core
JAX_PLATFORMS=cpu JAX_ENABLE_X64=1 make test
make test matches the PR CI gate: ordinary non-slow tests plus the
pr_correctness subset. Full correctness, integration, and benchmark markers
remain available through the explicit Make targets.
Solving nonconvex MINLPs with AMP
For problems with nonconvex nonlinearities (bilinear, trilinear, signomial, trig), the default branch-and-bound path only certifies optimality when the relaxation is convex. The Adaptive Multivariate Partitioning (AMP) solver gives discopt a certified-global path for these problems:
import discopt.modeling as dm
m = dm.Model("concave_qp")
c = [-1.0, 0.5, 1.5]
xs = [m.continuous(f"x{i}", lb=-2.0, ub=2.0) for i in range(3)]
m.subject_to(sum(xs) >= -1.0)
m.subject_to(sum(xs) <= 3.0)
m.minimize(sum(-((xs[i] - c[i]) ** 2) for i in range(3))) # concave
result = m.solve(solver="amp", rel_gap=1e-4)
print(result.status, result.objective, result.gap)
AMP iterates a piecewise-McCormick / convex-hull MILP relaxation against an
NLP subproblem (Ipopt) and refines the partition where the relaxation gap is
largest. At every iteration LB_k <= global_opt <= UB_k, so termination at
gap <= rel_gap yields a certified global optimum.
Common tuning knobs (all keyword-only on Model.solve(solver="amp", ...)):
| Option | Default | Effect |
|---|---|---|
rel_gap |
1e-4 |
Relative optimality gap stop criterion |
max_iter |
100 |
Hard cap on partition-refinement iterations |
n_init_partitions |
4 |
Initial partitions per discretized variable |
convhull_formulation |
"disaggregated" |
"sos2" or "facet" for tighter relaxations |
convhull_ebd |
False |
Logarithmic Gray-code embedded SOS2 binaries |
presolve_bt |
True |
OBBT/FBBT bound tightening before the first MILP |
obbt_at_root |
True |
Strengthen variable bounds at the root |
milp_solver |
"auto" |
MILP master backend: "auto", "highs", "pounce", "simplex", or "gurobi" |
partition_method |
"adaptive" |
How to pick which variable/interval to refine |
Gurobi can be used as AMP's MILP-master subsolver without changing the global algorithm:
result = m.solve(solver="amp", milp_solver="gurobi", rel_gap=1e-4)
This does not translate general nonlinear expressions into Gurobi nonlinear constraints; discopt still builds and certifies the global MINLP relaxation.
A worked end-to-end example with a non-trivially nonconvex model and the
tuning knobs above is in docs/notebooks/amp_global_minlp.ipynb.
AMP Test Suites
Routine AMP development uses a fast default regression battery. The fast
environment uses solver-independent checks plus HiGHS-backed MILP relaxations,
and excludes optional cyipopt, longer Alpine, MINLPTests, and incidence-style
AMP benchmark coverage. AMP and PR-fast Make targets run pytest through
scripts/run_memory_capped_pytest.sh, which applies a 32 GB address-space cap
with prlimit when available. Override with PYTEST_MEMORY_LIMIT_MB=..., or
set PYTEST_MEMORY_LIMIT_MB=0 to disable the cap. The broad make test-quick
dev-loop target remains uncapped and excludes memory_heavy tests.
make test-amp-fast
Alpine-reference, MINLPTests, cyipopt, and incidence-style AMP checks are opt-in because they can require optional solvers and longer solve budgets:
# Uses a fresh .venv and pixi-provided solver libraries rather than a local Python env.
pixi exec -s python=3.12 -s ipopt -s pkg-config -s c-compiler -s cxx-compiler -s gfortran -- \
uv venv --allow-existing .venv
source .venv/bin/activate
uv pip install maturin pytest pytest-timeout numpy scipy jax jaxlib highspy cyipopt
uv pip install -e ".[dev,ipopt,highs]"
maturin develop
make test-amp-integration
For WSL or memory-constrained machines, keep PR-fast AMP/JAX runs capped and
use a bounded xdist worker count rather than -n auto. For the single-process
AMP integration suite, disable the virtual-address cap to avoid XLA
std::bad_alloc aborts from address-space reservations:
PYTEST_MEMORY_LIMIT_MB=32768 PYTEST_XDIST_WORKERS=2 make test
PYTEST_MEMORY_LIMIT_MB=0 make test-amp-integration
WSL users should also set explicit memory and swap limits in .wslconfig so a
single uncapped compile-heavy test cannot restart the host session. A stricter
12 GB cap is useful for reproducing memory pressure, but the current JAX/XLA
CPU stack can reserve more than 12 GB of virtual address space during AMP runs;
use the memory_heavy marker selection when running with tighter caps.
The full Python test suite remains available with make test-all.
Command-Line Interface
After installation, the discopt command is available on your PATH:
discopt about # Version and installation info
discopt test # Smoke-test the install
discopt convert in.gms out.nl
discopt install-skills # Install Claude Code slash commands and agents
discopt doe ... # Model-based design of experiments (5-verb loop)
DoE from the command line
discopt doe drives a model-based design-of-experiments loop around a
single .xlsx workbook that travels between the lab bench and the CLI.
Five verbs cover the full cycle:
# 1. List the built-in templates (linear, polynomial-1d,
# response-surface-2d, response-surface-3d).
discopt doe templates
# 2. Generate an initial optimal design.
discopt doe new response-surface-2d \
--input temp:50:100 --input ph:3:9 \
--response yield --error 0.5 --n 6 -o campaign.xlsx
# 3. (Run the experiments; fill the `yield` column in campaign.xlsx; save.)
discopt doe status campaign.xlsx
# 4. Fit parameters from the completed runs (writes parameters + FIM sheets).
discopt doe fit campaign.xlsx
# 5. Append a next batch of D-optimal runs that reuse the fitted FIM.
discopt doe extend campaign.xlsx --n 4
Every verb also takes --json for LLM agent or GUI consumption. The
workbook is the single source of truth — status, fit, and
extend only need the file path. An --module pkg.mod:MyExperiment
escape hatch on new swaps the template for any custom Experiment
subclass. Install the optional dependency with
pip install discopt[doe].
A Streamlit GUI over the same workflow ships under
pip install 'discopt[doe-gui]':
discopt doe gui # blank slate; create or open from sidebar
discopt doe gui campaign.xlsx # drop straight into an existing campaign
The GUI binds directly to the same do_* functions the CLI uses, so
both surfaces stay in lockstep automatically.
A separate discopt-dev script ships developer-only commands used from inside
a discopt source checkout (literature scanner, adversary tester, the arXiv /
OpenAlex search helpers and the report writer they call):
# Search arXiv for recent papers
discopt-dev search-arxiv 'all:"spatial branch and bound"' --max-results 10 --start-date 2026-01-01
# Search OpenAlex
discopt-dev search-openalex "McCormick relaxation" --from-date 2026-01-01 --to-date 2026-03-31
# Write a report from stdin
echo "report content" | discopt-dev write-report reports/output.md
All discopt-dev search subcommands output structured JSON. The /discoptbot
literature-scanner slash command uses them to automatically find and summarize
relevant new papers from arXiv and OpenAlex.
Documentation
Tutorial notebooks are available in docs/notebooks/:
- Quickstart -- basic modeling and solving
- MINLP Examples -- mixed-integer nonlinear programs
- Advanced Features -- relaxations, presolve, cutting planes, branching policies
- Global Optimization -- which problems discopt can and can't certify as global
- IPM vs Ipopt -- backend comparison (incl. vmap-batched IPM)
- Dynamic Optimization -- DAE collocation for optimal control, parameter estimation, and PDEs
- Neural Network Embedding -- optimize over trained ML surrogates as MINLP constraints
- Decision-Focused Learning -- differentiable optimization in ML pipelines
- GDP Tutorial -- disjunctive programming, logical constraints, big-M/hull/LOA reformulations
Full documentation is built with Jupyter Book: jupyter-book build docs/
Project Statistics
Last updated: 2026-06-18
| Category | Count |
|---|---|
Python source (python/discopt/) |
226 files, ~103,700 lines |
Rust source (crates/) |
55 files, ~29,000 lines |
Test code (python/tests/) |
222 files, ~72,100 lines |
| Total source + tests | ~500 files, ~205,000 lines |
| Python tests | 3,700+ |
| Rust tests | 339 |
Tutorial notebooks (docs/notebooks/) |
63 |
Development History
See ROADMAP.md for the full development roadmap and task history.
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file discopt-0.5.0.tar.gz.
File metadata
- Download URL: discopt-0.5.0.tar.gz
- Upload date:
- Size: 2.6 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c000ff693883e4882d782193d0a467e9f4ce312d96a0bf9812bbca0985adf1d8
|
|
| MD5 |
b83ef88fe3699b47cb07f3f6739d3eaf
|
|
| BLAKE2b-256 |
2a322f82b0470625a2d62a02f4643b0d9f5acbd98f5611dff0baa9203222ceb5
|
Provenance
The following attestation bundles were made for discopt-0.5.0.tar.gz:
Publisher:
release.yml on jkitchin/discopt
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
discopt-0.5.0.tar.gz -
Subject digest:
c000ff693883e4882d782193d0a467e9f4ce312d96a0bf9812bbca0985adf1d8 - Sigstore transparency entry: 2047487832
- Sigstore integration time:
-
Permalink:
jkitchin/discopt@95672def5b406555dcf6fa1dfa272d940620c0d1 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/jkitchin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@95672def5b406555dcf6fa1dfa272d940620c0d1 -
Trigger Event:
push
-
Statement type:
File details
Details for the file discopt-0.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: discopt-0.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 4.2 MB
- Tags: CPython 3.13, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
50d1d828d49bf9a48fabf8c8ecb56ba1cb4b191e0d02cf281a2864af1c5b1ed1
|
|
| MD5 |
8db18afc0e064483330343236e557ab7
|
|
| BLAKE2b-256 |
47b3250ac48e260894dfc5edb878ceb8c00232f557fd61c8f803b9e0529d4e47
|
Provenance
The following attestation bundles were made for discopt-0.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
release.yml on jkitchin/discopt
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
discopt-0.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
50d1d828d49bf9a48fabf8c8ecb56ba1cb4b191e0d02cf281a2864af1c5b1ed1 - Sigstore transparency entry: 2047487921
- Sigstore integration time:
-
Permalink:
jkitchin/discopt@95672def5b406555dcf6fa1dfa272d940620c0d1 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/jkitchin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@95672def5b406555dcf6fa1dfa272d940620c0d1 -
Trigger Event:
push
-
Statement type:
File details
Details for the file discopt-0.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: discopt-0.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 4.1 MB
- Tags: CPython 3.13, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
508eb1fe8200e6825fb453df200b95a6072f64bf41c3019f6ce43f88dd9a338b
|
|
| MD5 |
d13e60666b03795d6466e6527479a2b2
|
|
| BLAKE2b-256 |
5001a6c3052f23a3b1e44cae33bbc9fed81d24e63d8f465c02e54fbb155b02f2
|
Provenance
The following attestation bundles were made for discopt-0.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:
Publisher:
release.yml on jkitchin/discopt
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
discopt-0.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl -
Subject digest:
508eb1fe8200e6825fb453df200b95a6072f64bf41c3019f6ce43f88dd9a338b - Sigstore transparency entry: 2047487883
- Sigstore integration time:
-
Permalink:
jkitchin/discopt@95672def5b406555dcf6fa1dfa272d940620c0d1 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/jkitchin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@95672def5b406555dcf6fa1dfa272d940620c0d1 -
Trigger Event:
push
-
Statement type:
File details
Details for the file discopt-0.5.0-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: discopt-0.5.0-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 4.0 MB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f9488fabe632f4034cee5dfcc096cc24af7ce58a5fb531b85202df03d6ffe887
|
|
| MD5 |
1344179247e3716ea734a2fb80a76780
|
|
| BLAKE2b-256 |
ff37439814aa10f4b965bbb378fddf7a39838e21751d145a186b553e364023ac
|
Provenance
The following attestation bundles were made for discopt-0.5.0-cp312-cp312-win_amd64.whl:
Publisher:
release.yml on jkitchin/discopt
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
discopt-0.5.0-cp312-cp312-win_amd64.whl -
Subject digest:
f9488fabe632f4034cee5dfcc096cc24af7ce58a5fb531b85202df03d6ffe887 - Sigstore transparency entry: 2047487968
- Sigstore integration time:
-
Permalink:
jkitchin/discopt@95672def5b406555dcf6fa1dfa272d940620c0d1 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/jkitchin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@95672def5b406555dcf6fa1dfa272d940620c0d1 -
Trigger Event:
push
-
Statement type:
File details
Details for the file discopt-0.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: discopt-0.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 4.2 MB
- Tags: CPython 3.12, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6777941afbbb74517e4c8e68cbefaa39c9de9f6b9ea70a20abe69141bcb3d0ac
|
|
| MD5 |
4dd27a3737f2c45556276227d1443a1e
|
|
| BLAKE2b-256 |
75b662b120052edb4f2f5652a87fdacda135d54b02effe0689bbb12ee75d3320
|
Provenance
The following attestation bundles were made for discopt-0.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
release.yml on jkitchin/discopt
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
discopt-0.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
6777941afbbb74517e4c8e68cbefaa39c9de9f6b9ea70a20abe69141bcb3d0ac - Sigstore transparency entry: 2047487906
- Sigstore integration time:
-
Permalink:
jkitchin/discopt@95672def5b406555dcf6fa1dfa272d940620c0d1 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/jkitchin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@95672def5b406555dcf6fa1dfa272d940620c0d1 -
Trigger Event:
push
-
Statement type:
File details
Details for the file discopt-0.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: discopt-0.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 4.1 MB
- Tags: CPython 3.12, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
21cccc04f3eb5fe72b5db09a598b1ce301bdca81294c15332c563bc338f350f8
|
|
| MD5 |
f81fb85ba197b36eaba74500493a2e86
|
|
| BLAKE2b-256 |
df8a16861f3dbf46b6458c7fb0872caa88ba731d1b7d4af5dd8a0a3e8d244d04
|
Provenance
The following attestation bundles were made for discopt-0.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:
Publisher:
release.yml on jkitchin/discopt
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
discopt-0.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl -
Subject digest:
21cccc04f3eb5fe72b5db09a598b1ce301bdca81294c15332c563bc338f350f8 - Sigstore transparency entry: 2047487936
- Sigstore integration time:
-
Permalink:
jkitchin/discopt@95672def5b406555dcf6fa1dfa272d940620c0d1 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/jkitchin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@95672def5b406555dcf6fa1dfa272d940620c0d1 -
Trigger Event:
push
-
Statement type:
File details
Details for the file discopt-0.5.0-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: discopt-0.5.0-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 4.1 MB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2d24ca057f6f8c79a96d88d40d177ec60ac5778b7371517513b70a6a44df763c
|
|
| MD5 |
8808ad8187bbe6d460f515c1ba054652
|
|
| BLAKE2b-256 |
50e81a560d301f24049226dec194f7931f4000b359cbba18f87d7979e5955864
|
Provenance
The following attestation bundles were made for discopt-0.5.0-cp312-cp312-macosx_11_0_arm64.whl:
Publisher:
release.yml on jkitchin/discopt
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
discopt-0.5.0-cp312-cp312-macosx_11_0_arm64.whl -
Subject digest:
2d24ca057f6f8c79a96d88d40d177ec60ac5778b7371517513b70a6a44df763c - Sigstore transparency entry: 2047487957
- Sigstore integration time:
-
Permalink:
jkitchin/discopt@95672def5b406555dcf6fa1dfa272d940620c0d1 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/jkitchin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@95672def5b406555dcf6fa1dfa272d940620c0d1 -
Trigger Event:
push
-
Statement type:
File details
Details for the file discopt-0.5.0-cp312-cp312-macosx_10_12_x86_64.whl.
File metadata
- Download URL: discopt-0.5.0-cp312-cp312-macosx_10_12_x86_64.whl
- Upload date:
- Size: 4.1 MB
- Tags: CPython 3.12, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a601e64c166be0e6742cf83184542795ebb03b38e650d500370df7e09eadba27
|
|
| MD5 |
5e9e8b0bb6c00171ab1140743c900fd1
|
|
| BLAKE2b-256 |
4e029c22a21669ce07f52a4da21da0bc1b7af25cd29372b3e5a175053d527c44
|
Provenance
The following attestation bundles were made for discopt-0.5.0-cp312-cp312-macosx_10_12_x86_64.whl:
Publisher:
release.yml on jkitchin/discopt
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
discopt-0.5.0-cp312-cp312-macosx_10_12_x86_64.whl -
Subject digest:
a601e64c166be0e6742cf83184542795ebb03b38e650d500370df7e09eadba27 - Sigstore transparency entry: 2047487899
- Sigstore integration time:
-
Permalink:
jkitchin/discopt@95672def5b406555dcf6fa1dfa272d940620c0d1 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/jkitchin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@95672def5b406555dcf6fa1dfa272d940620c0d1 -
Trigger Event:
push
-
Statement type:
File details
Details for the file discopt-0.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: discopt-0.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 4.2 MB
- Tags: CPython 3.11, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
259f306dd9fec6f3424b60654f080c49133fd63b4b12f324d4817ef05e51e36e
|
|
| MD5 |
b37f4670dd23ec0c404f92a56b352423
|
|
| BLAKE2b-256 |
ad5cde679c101535f15ed43aa189000b896669b8df90c3228fdd8a9779c4c539
|
Provenance
The following attestation bundles were made for discopt-0.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
release.yml on jkitchin/discopt
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
discopt-0.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
259f306dd9fec6f3424b60654f080c49133fd63b4b12f324d4817ef05e51e36e - Sigstore transparency entry: 2047487947
- Sigstore integration time:
-
Permalink:
jkitchin/discopt@95672def5b406555dcf6fa1dfa272d940620c0d1 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/jkitchin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@95672def5b406555dcf6fa1dfa272d940620c0d1 -
Trigger Event:
push
-
Statement type:
File details
Details for the file discopt-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: discopt-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 4.1 MB
- Tags: CPython 3.11, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b877980d479c7eea17ec1f3902cedd94a1a50c881db68b3498ab47e7b5563621
|
|
| MD5 |
949ba380da680fc3cacd7b4bce9313e3
|
|
| BLAKE2b-256 |
550398607ce6e9c6f375be34db652cebce904cd0e85ab31d757338bf51508652
|
Provenance
The following attestation bundles were made for discopt-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:
Publisher:
release.yml on jkitchin/discopt
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
discopt-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl -
Subject digest:
b877980d479c7eea17ec1f3902cedd94a1a50c881db68b3498ab47e7b5563621 - Sigstore transparency entry: 2047487869
- Sigstore integration time:
-
Permalink:
jkitchin/discopt@95672def5b406555dcf6fa1dfa272d940620c0d1 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/jkitchin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@95672def5b406555dcf6fa1dfa272d940620c0d1 -
Trigger Event:
push
-
Statement type:
File details
Details for the file discopt-0.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: discopt-0.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 4.2 MB
- Tags: CPython 3.10, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8aacf34f948b2f01d921632d5fad661e355c037cdfa63ff5763aba5635845844
|
|
| MD5 |
dd970edf974335cbcb9fd68dc0c45ce5
|
|
| BLAKE2b-256 |
e56fc3355297ad1087e55831b6f1f880e095e17f5d5cc164be8adf83ec4a5c2e
|
Provenance
The following attestation bundles were made for discopt-0.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
release.yml on jkitchin/discopt
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
discopt-0.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
8aacf34f948b2f01d921632d5fad661e355c037cdfa63ff5763aba5635845844 - Sigstore transparency entry: 2047487862
- Sigstore integration time:
-
Permalink:
jkitchin/discopt@95672def5b406555dcf6fa1dfa272d940620c0d1 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/jkitchin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@95672def5b406555dcf6fa1dfa272d940620c0d1 -
Trigger Event:
push
-
Statement type:
File details
Details for the file discopt-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: discopt-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 4.1 MB
- Tags: CPython 3.10, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
88c000af4887fa884d559bb5f68a7ab5363a6cceee421c9ceb9f7eed9b628d86
|
|
| MD5 |
e69ed122cb353b607c1985bd6612e5e7
|
|
| BLAKE2b-256 |
491fa071dad46cdb266204228a43805de4906c49005c6881f209d378f5e0fdc5
|
Provenance
The following attestation bundles were made for discopt-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:
Publisher:
release.yml on jkitchin/discopt
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
discopt-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl -
Subject digest:
88c000af4887fa884d559bb5f68a7ab5363a6cceee421c9ceb9f7eed9b628d86 - Sigstore transparency entry: 2047487843
- Sigstore integration time:
-
Permalink:
jkitchin/discopt@95672def5b406555dcf6fa1dfa272d940620c0d1 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/jkitchin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@95672def5b406555dcf6fa1dfa272d940620c0d1 -
Trigger Event:
push
-
Statement type: