Skip to main content

Optyx

Optimization that reads like Python.

PyPI Python 3.12+ License: MIT CI Docs

📚 Documentation · 🚀 Quickstart · 💡 Examples

With Optyx With SciPy
from optyx import Variable, Problem

x = Variable("x", lb=0)
y = Variable("y", lb=0)

solution = (
    Problem()
    .minimize(x**2 + y**2)
    .subject_to(x + y >= 1)
    .solve()
)
# x=0.5, y=0.5
from scipy.optimize import minimize
import numpy as np

def objective(v):
    return v[0]**2 + v[1]**2

def gradient(v):  # manual!
    return np.array([2*v[0], 2*v[1]])

result = minimize(
    objective, x0=[1, 1], jac=gradient,
    method='SLSQP',
    bounds=[(0, None), (0, None)],
    constraints={'type': 'ineq',
                 'fun': lambda v: v[0]+v[1]-1}
)

Your optimization code should read like your math. With Optyx, x + y >= 1 is exactly that—not a lambda buried in a constraint dictionary.


Why Optyx?

Python has excellent optimization libraries. SciPy provides algorithms. CVXPY handles convex problems. Pyomo scales to industrial applications.

Optyx takes a different path: radical simplicity.

  • Write problems as you think them — x**2 + y**2 not lambda v: v[0]**2 + v[1]**2
  • Never compute gradients by hand — symbolic autodiff handles derivatives
  • Skip solver configuration — sensible defaults, automatic solver selection

Being Honest

Optyx is young and opinionated. It's not a replacement for specialized tools:

Need Use Instead
Large-scale MILP with custom branching Pyomo, OR-Tools, Gurobi
Convex guarantees CVXPY
Maximum performance Raw solver APIs

Optyx does support MILP (via HiGHS), sparse LPs with 100k+ variables, and solver callbacks—but if you need industrial-grade MIP with cutting planes, a dedicated solver is the right choice.


Installation

pip install optyx

Requires Python 3.12+, NumPy ≥2.0, SciPy ≥1.7.


Quick Examples

Constrained Quadratic

from optyx import Variable, Problem

x = Variable("x", lb=0)
y = Variable("y", lb=0)

solution = (
    Problem()
    .minimize(x**2 + y**2)
    .subject_to(x + y >= 1)
    .solve()
)
# x=0.5, y=0.5, objective=0.5

Portfolio Optimization

from optyx import Variable, Problem

# Asset weights
tech = Variable("tech", lb=0, ub=1)
energy = Variable("energy", lb=0, ub=1)
finance = Variable("finance", lb=0, ub=1)

# Expected returns and risk (simplified)
returns = 0.12*tech + 0.08*energy + 0.10*finance
risk = tech**2 + energy**2 + finance**2  # variance proxy

solution = (
    Problem()
    .minimize(risk)
    .subject_to(returns >= 0.09)              # minimum return
    .subject_to((tech + energy + finance).eq(1))  # fully invested
    .solve()
)

Autodiff Just Works

from optyx import Variable
from optyx.core.autodiff import gradient

x = Variable("x")
f = x**3 + 2*x**2 - 5*x + 3

df = gradient(f, x)  # Symbolic: 3x² + 4x - 5
print(df.evaluate({"x": 2.0}))  # 15.0

Mixed-Integer Programming

from optyx import BinaryVariable, Problem

# Decision: pick an item (1) or leave it out (0)
x1 = BinaryVariable("x1")
x2 = BinaryVariable("x2")
x3 = BinaryVariable("x3")
x4 = BinaryVariable("x4")
x5 = BinaryVariable("x5")

value = 10*x1 + 20*x2 + 15*x3 + 25*x4 + 30*x5
weight = 5*x1 + 10*x2 + 8*x3 + 12*x4 + 15*x5

solution = (
    Problem()
    .maximize(value)
    .subject_to(weight <= 30)
    .solve()
)
# Automatically routes to a MILP solver

Features at a Glance

Feature Description
Natural syntax x + y >= 1 instead of constraint dictionaries
Automatic gradients Symbolic differentiation—no manual derivatives
Smart solver selection HiGHS for LP/MILP, SLSQP/BFGS for NLP
Mixed-integer programming BinaryVariable, IntegerVariable, automatic MILP routing
Vector & matrix variables VectorVariable, MatrixVariable, VariableDict for scalable models
Sparse LP support subject_to(A @ x <= b) with `as_matrix(..., storage="auto"
Solver callbacks Monitor progress, enforce time limits, early termination
LP format export Problem.write("model.lp") for interop with other solvers
Solution serialization to_json() / from_json() for logging and auditing
Fast re-solve Cached compilation + warm starts, up to 900x speedup
Debuggable Inspect expression trees, understand your model

See the documentation for the full API reference, tutorials, and real-world examples.


What's Next

Optyx is actively evolving:

  • MIQP / MINLP support — Quadratic and nonlinear MIP via native HiGHS or Gurobi
  • MPS format I/O — Import and export MPS files for solver interop
  • More solvers — IPOPT integration for large-scale NLP
  • Better debugging — Infeasibility diagnostics and model inspection

See the roadmap for details.


Contributing

git clone https://github.com/optyx-dev/optyx.git
cd optyx
uv sync
uv run pytest

Contributions welcome! See our contributing guide.


License

MIT

Metadata

Release files for optyx 1.3.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for optyx 1.3.2
File Size Uploaded
optyx-1.3.2.tar.gz 128.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for optyx 1.3.2
File Interpreter ABI Platform
optyx-1.3.2-py3-none-any.whl Python 3 none any Details

Total release size: 269.3 kB

Release files / optyx-1.3.2.tar.gz

Download URL optyx-1.3.2.tar.gz
Size 128.1 kB
Tags Source
SHA-256 checksum
How to use checksums
5c20b1b84cf741fa497bd52e787ece0efc4166e1544a6c9341e0a5c4040e5f0b
BLAKE2b-256 checksum
How to use checksums
9c7e12021547381c1999b42f86fcb4cb2f2db4c9c261279c13b248401368257b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.11 {"installer":{"name":"uv","version":"0.12.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / optyx-1.3.2-py3-none-any.whl

Download URL optyx-1.3.2-py3-none-any.whl
Size 141.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
cd4333a01181baa2be57023dab8a2dfdbc3967a95409ae0351bd8d8055a291f8
BLAKE2b-256 checksum
How to use checksums
0d139d6b5c2228acf0e806382793cb74b001d56f48b29237784b1d1c2178d298
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.11 {"installer":{"name":"uv","version":"0.12.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

This release

1.3.2 This release

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.2.4

2 release files

1.2.3

2 release files

1.2.2

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.1

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page