MCPcopy Index your code
hub / github.com/PyPSA/linopy

github.com/PyPSA/linopy @v0.8.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.8.0 ↗ · + Follow
2,856 symbols 11,308 edges 113 files 1,193 documented · 42%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

linopy: Optimization with array-like variables and constraints

PyPI License Tests doc codecov

        Linear\         Integer\         Non-linear\         Optimization in\         PYthon

linopy is an open-source python package that facilitates optimization with real world data. It builds a bridge between data analysis packages like xarray & pandas and problem solvers like cbc, gurobi (see the full list below). Linopy supports Linear, Integer, Mixed-Integer and Quadratic Programming while aiming to make linear programming in Python easy, highly-flexible and performant.

Benchmarks

linopy is designed to be fast and efficient. The following benchmark compares the performance of linopy with the alternative popular optimization packages.

Performance Benchmark

Main features

linopy is heavily based on xarray which allows for many flexible data-handling features:

  • Define (arrays of) continuous or binary variables with coordinates, e.g. time, consumers, etc.
  • Apply arithmetic operations on the variables like adding, substracting, multiplying with all the broadcasting potentials of xarray
  • Apply arithmetic operations on the linear expressions (combination of variables)
  • Group terms of a linear expression by coordinates
  • Get insight into the clear and transparent data model
  • Modify and delete assigned variables and constraints on the fly
  • Use lazy operations for large linear programs with dask
  • Choose from different commercial and non-commercial solvers
  • Fast import and export a linear model using xarray's netcdf IO

Installation

So far linopy is available on the PyPI repository

uv pip install linopy

or on conda-forge

conda install -c conda-forge linopy

In a Nutshell

Linopy aims to make optimization programs transparent and flexible. To illustrate its usage, let's consider a scenario where we aim to minimize the cost of buying apples and bananas over a week, subject to daily and weekly vitamin intake constraints.

>>> import pandas as pd
>>> import linopy

>>> m = linopy.Model()

>>> days = pd.Index(["Mon", "Tue", "Wed", "Thu", "Fri"], name="day")
>>> apples = m.add_variables(lower=0, name="apples", coords=[days])
>>> bananas = m.add_variables(lower=0, name="bananas", coords=[days])
>>> apples
Variable (day: 5)
-----------------
[Mon]: apples[Mon] ∈ [0, inf]
[Tue]: apples[Tue] ∈ [0, inf]
[Wed]: apples[Wed] ∈ [0, inf]
[Thu]: apples[Thu] ∈ [0, inf]
[Fri]: apples[Fri] ∈ [0, inf]

Add daily vitamin constraints

>>> m.add_constraints(3 * apples + 2 * bananas >= 8, name="daily_vitamins")
Constraint `daily_vitamins` (day: 5):
-------------------------------------
[Mon]: +3 apples[Mon] + 2 bananas[Mon] ≥ 8
[Tue]: +3 apples[Tue] + 2 bananas[Tue] ≥ 8
[Wed]: +3 apples[Wed] + 2 bananas[Wed] ≥ 8
[Thu]: +3 apples[Thu] + 2 bananas[Thu] ≥ 8
[Fri]: +3 apples[Fri] + 2 bananas[Fri] ≥ 8

Add weekly vitamin constraint

>>> m.add_constraints((3 * apples + 2 * bananas).sum() >= 50, name="weekly_vitamins")
Constraint `weekly_vitamins`
----------------------------
+3 apples[Mon] + 2 bananas[Mon] + 3 apples[Tue] ... +2 bananas[Thu] + 3 apples[Fri] + 2 bananas[Fri] ≥ 50

Define the prices of apples and bananas and the objective function

>>> apple_price = [1, 1.5, 1, 2, 1]
>>> banana_price = [1, 1, 0.5, 1, 0.5]
>>> m.objective = apple_price * apples + banana_price * bananas

Finally, we can solve the problem and get the optimal solution:

>>> m.solve()
>>> m.objective.value
17.166

... and display the solution as a pandas DataFrame

>>> m.solution.to_pandas()
        apples  bananas
day
Mon    2.667      0
Tue    0          4
Wed    0          9
Thu    0          4
Fri    0          4

Supported solvers

linopy supports the following solvers

Note that these do have to be installed by the user separately.

Development Setup

To set up a local development environment for linopy and to run the same tests that are run in the CI, you can run:

uv sync --extra dev --extra solvers
source .venv/bin/activate
pytest

The -e flag of the install command installs the linopy package in editable mode, which means that the virtualenv (and thus the tests) will run the code from your local checkout.

Citing Linopy

If you use Linopy in your research, please cite the following paper:

A BibTeX entry for LaTeX users is

@article{Hofmann2023,
    doi = {10.21105/joss.04823},
    url = {https://doi.org/10.21105/joss.04823},
    year = {2023}, publisher = {The Open Journal},
    volume = {8},
    number = {84},
    pages = {4823},
    author = {Fabian Hofmann},
    title = {Linopy: Linear optimization with n-dimensional labeled variables},
    journal = {Journal of Open Source Software}
}

License

Copyright 2021 Fabian Hofmann

This package is published under MIT license. See LICENSE.txt for details.

Core symbols most depended-on inside this repo

add_variables
called by 791
linopy/model.py
add_constraints
called by 332
linopy/model.py
sum
called by 229
linopy/variables.py
add_objective
called by 195
linopy/model.py
solve
called by 175
linopy/model.py
items
called by 88
linopy/variables.py
add_sos_constraints
called by 84
linopy/model.py
to_linexpr
called by 77
linopy/variables.py

Shape

Method 1,521
Function 1,057
Class 229
Route 49

Languages

Python100%

Modules by API surface

test/test_linear_expression.py259 symbols
test/test_piecewise_constraints.py214 symbols
linopy/constraints.py179 symbols
linopy/variables.py155 symbols
linopy/expressions.py155 symbols
linopy/solvers.py151 symbols
test/remote/test_oetc.py126 symbols
test/test_sos_reformulation.py105 symbols
test/test_constraint.py96 symbols
test/test_variable.py86 symbols
test/test_fix_relax.py78 symbols
test/test_alignment.py76 symbols

For agents

$ claude mcp add linopy \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact