Skip to main content

Python library for building indexed linear and mixed-integer programs in polars; assembles into HiGHS, exportable as MPS.

Project description

polar-high

PyPI Python versions License tests docs Ruff

A Python library for building and solving large indexed linear and mixed-integer programs. Variables and parameters are polars DataFrames, expressions are joined and grouped lazily, and the matrix is assembled directly through HiGHS — or exported as MPS for any other LP solver. The kernel is intentionally domain-free: it has no opinions about energy systems, supply chains, or any specific application.

Install

pip install polar-high

Requires Python 3.11+. HiGHS ships in highspy, no separate install.

Quickstart

A tiny dispatch LP — wind + coal over three hours, minimise cost subject to capacity and per-hour demand.

import polars as pl
from polar_high import Problem, Param, Sum

p = Problem()

v_idx = pl.DataFrame({
    "unit": ["wind", "wind", "wind", "coal", "coal", "coal"],
    "hour": [1, 2, 3, 1, 2, 3],
})
v_production = p.add_var("v_production", dims=("unit", "hour"),
                         index=v_idx, lower=0.0)

cost = Param(("unit",),
             pl.DataFrame({"unit": ["wind", "coal"],
                           "value": [2.0, 8.0]}))

cap = Param(("unit", "hour"), pl.DataFrame({
    "unit":  ["wind", "wind", "wind", "coal", "coal", "coal"],
    "hour":  [1, 2, 3, 1, 2, 3],
    "value": [3.0, 1.0, 4.0, 10.0, 10.0, 10.0],
}))

demand = Param(("hour",),
               pl.DataFrame({"hour": [1, 2, 3], "value": [5.0, 6.0, 4.0]}))

p.set_objective(cost * v_production, sense="min")

p.add_cstr("capacity", over=v_idx, sense="<=",
           lhs_terms={"production": v_production},
           rhs_terms={"cap": cap})

p.add_cstr("demand_balance",
           over=v_idx.select("hour").unique().sort("hour"),
           sense="==",
           lhs_terms={"production": Sum(v_production, over=("unit",))},
           rhs_terms={"demand": demand})

sol = p.solve()
print(sol.obj, sol.value("v_production"))

Documentation

Full docs at https://nodal-tools.fi/polar-high/ — published with MkDocs + mike for per-version reads.

  • Concepts — the indexed-frame mental model (Var, Param, Sum, Where, Lag, broadcasting/join semantics).
  • Guide — warm-starting, Lagrangian decomposition, performance tuning, debugging.
  • API reference — autogenerated from docstrings.
  • Compare — how polar-high relates to Pyomo, JuMP, gurobipy, linopy, and GNU MathProg.

Build locally: pip install -e ".[docs]" && mkdocs serve.

Used by

polar-high is the build engine behind the FlexTool energy-system modelling toolkit (not in master branch yet). FlexTool's test fleet — comparing the new implementation against the earlier GNU MathProg one across many scenarios — has been used as validation for the kernel in addition to kernel's own testing.

License

Apache-2.0 — see LICENSE and NOTICE. Changelog: CHANGELOG.md.

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

polar_high-1.1.0.tar.gz (50.4 kB view details)

Uploaded Source

Built Distribution

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

polar_high-1.1.0-py3-none-any.whl (41.8 kB view details)

Uploaded Python 3

File details

Details for the file polar_high-1.1.0.tar.gz.

File metadata

  • Download URL: polar_high-1.1.0.tar.gz
  • Upload date:
  • Size: 50.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for polar_high-1.1.0.tar.gz
Algorithm Hash digest
SHA256 c2eb083a794058adb4a5fa0234a99b7dee2214f1bb59450ea2668e0b91f2dbac
MD5 83805c269c276c13d22784d1ea402fb7
BLAKE2b-256 fdd4f3d4bdd5d14e849f230f3d69a529411ea4f77fde01f647328f17dabf4127

See more details on using hashes here.

Provenance

The following attestation bundles were made for polar_high-1.1.0.tar.gz:

Publisher: release.yml on nodal-tools/polar-high

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

File details

Details for the file polar_high-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: polar_high-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 41.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for polar_high-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7a440e00abfa50161c151735d9524f7ffe2a356a61b6c9156720ca5cfca65423
MD5 934939ba8f6097e4ab0ed3a48964398b
BLAKE2b-256 1bf35df83fd0fd51650e2a58224c193f7e8372da8c52b16f850e344b3d598251

See more details on using hashes here.

Provenance

The following attestation bundles were made for polar_high-1.1.0-py3-none-any.whl:

Publisher: release.yml on nodal-tools/polar-high

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