lap 0.5.13


pip install lap

  Latest version

Released: Feb 23, 2026

Project Links

Meta
Author: gatagat, rathaROG, and co.
Requires Python: >=3.7

Classifiers

Development Status
  • 4 - Beta

Environment
  • Console

Intended Audience
  • Developers
  • Education
  • Science/Research

Programming Language
  • Python :: 3
  • Python :: 3.7
  • Python :: 3.8
  • Python :: 3.9
  • Python :: 3.10
  • Python :: 3.11
  • Python :: 3.12
  • Python :: 3.13
  • Python :: 3.14

Topic
  • Education
  • Education :: Testing
  • Scientific/Engineering
  • Scientific/Engineering :: Mathematics
  • Software Development
  • Scientific/Engineering
  • Scientific/Engineering :: Artificial Intelligence
  • Scientific/Engineering :: Image Recognition

Operating System
  • Microsoft :: Windows
  • POSIX
  • Unix
  • MacOS

Test Simple Test Full Benchmark Test PyPI Build Publish to PyPI

lap: Linear Assignment Problem Solver

lap is a linear assignment problem solver using Jonker-Volgenant algorithm for dense LAPJV¹ or sparse LAPMOD² matrices. Both algorithms are implemented from scratch based solely on the papers¹˒² and the public domain Pascal implementation provided by A. Volgenant³. The LAPMOD implementation seems to be faster than the LAPJV implementation for matrices with a side of more than ~5000 and with less than 50% finite coefficients.

¹ R. Jonker and A. Volgenant, "A Shortest Augmenting Path Algorithm for Dense and Sparse Linear Assignment Problems", Computing 38, 325-340 (1987)
² A. Volgenant, "Linear and Semi-Assignment Problems: A Core Oriented Approach", Computer Ops Res. 23, 917-932 (1996)
³ http://www.assignmentproblems.com/LAPJV.htm | [archive.org]

💽 Installation

Install from PyPI:

PyPI version Downloads Downloads

pip install lap
PyPI Wheels 🛞 Windows Linux macOS
Python 3.7 AMD64 x86_64/aarch64 x86_64
Python 3.8 AMD64 x86_64/aarch64 x86_64/arm64
Python 3.9-3.14 ¹ AMD64/ARM64 ² x86_64/aarch64 x86_64/arm64

¹ v0.5.13 supports both numpy 1.x and 2.x for Python 3.8-3.14. 🆕
² Windows ARM64 is experimental.

Other options

Install from GitHub repo (requires C++ compiler):

pip install git+https://github.com/gatagat/lap.git

Build and install (requires C++ compiler):

git clone https://github.com/gatagat/lap.git
cd lap
pip install "setuptools>=67.8.0"
pip install wheel build
python -m build --wheel
cd dist

🧪 Usage

import lap
import numpy as np
print(lap.lapjv(np.random.rand(4, 5), extend_cost=True))
More details

cost, x, y = lap.lapjv(C)

The function lapjv(C) returns the assignment cost cost and two arrays x and y. If cost matrix C has shape NxM, then x is a size-N array specifying to which column each row is assigned, and y is a size-M array specifying to which row each column is assigned. For example, an output of x = [1, 0] indicates that row 0 is assigned to column 1 and row 1 is assigned to column 0. Similarly, an output of x = [2, 1, 0] indicates that row 0 is assigned to column 2, row 1 is assigned to column 1, and row 2 is assigned to column 0.

Note that this function does not return the assignment matrix (as done by scipy's linear_sum_assignment and lapsolver's solve dense). The assignment matrix can be constructed from x as follows: A = np.zeros((N, M)) for i in range(N): A[i, x[i]] = 1

Equivalently, we could construct the assignment matrix from y:

A = np.zeros((N, M))
for j in range(M):
    A[y[j], j] = 1

Finally, note that the outputs are redundant: we can construct x from y, and vise versa:

x = [np.where(y == i)[0][0] for i in range(N)]
y = [np.where(x == j)[0][0] for j in range(M)]

License

Released under the 2-clause BSD license, see LICENSE.

Copyright (C) 2012-2025, Tomas Kazmar

Contributors (in alphabetic order):

  • Benjamin Eysenbach
  • Léo Duret
  • Pieter Lenaerts
  • Raphael Reme
  • Ratha Siv
  • Robert Wen
  • Steven
  • Tom White
  • Tomas Kazmar
  • Wok

Wheel compatibility matrix

Platform CPython 3.7 CPython 3.8 CPython 3.9 CPython 3.10 CPython 3.11 CPython 3.12 CPython 3.13 CPython 3.14
macosx_10_13_x86_64
macosx_10_15_x86_64
macosx_10_9_x86_64
macosx_11_0_arm64
manylinux1_x86_64
manylinux2014_aarch64
manylinux2014_x86_64
manylinux_2_17_aarch64
manylinux_2_17_x86_64
manylinux_2_28_aarch64
manylinux_2_28_x86_64
manylinux_2_5_x86_64
musllinux_1_2_aarch64
musllinux_1_2_x86_64
win_amd64
win_arm64

Files in release

lap-0.5.13-cp310-cp310-macosx_10_9_x86_64.whl (1.4MiB)
lap-0.5.13-cp310-cp310-macosx_11_0_arm64.whl (1.4MiB)
lap-0.5.13-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (1.6MiB)
lap-0.5.13-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (1.6MiB)
lap-0.5.13-cp310-cp310-musllinux_1_2_aarch64.whl (1.6MiB)
lap-0.5.13-cp310-cp310-musllinux_1_2_x86_64.whl (1.6MiB)
lap-0.5.13-cp310-cp310-win_amd64.whl (1.4MiB)
lap-0.5.13-cp310-cp310-win_arm64.whl (1.4MiB)
lap-0.5.13-cp311-cp311-macosx_10_9_x86_64.whl (1.4MiB)
lap-0.5.13-cp311-cp311-macosx_11_0_arm64.whl (1.4MiB)
lap-0.5.13-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (1.6MiB)
lap-0.5.13-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (1.6MiB)
lap-0.5.13-cp311-cp311-musllinux_1_2_aarch64.whl (1.6MiB)
lap-0.5.13-cp311-cp311-musllinux_1_2_x86_64.whl (1.6MiB)
lap-0.5.13-cp311-cp311-win_amd64.whl (1.4MiB)
lap-0.5.13-cp311-cp311-win_arm64.whl (1.4MiB)
lap-0.5.13-cp312-cp312-macosx_10_13_x86_64.whl (1.4MiB)
lap-0.5.13-cp312-cp312-macosx_11_0_arm64.whl (1.4MiB)
lap-0.5.13-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (1.7MiB)
lap-0.5.13-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (1.6MiB)
lap-0.5.13-cp312-cp312-musllinux_1_2_aarch64.whl (1.6MiB)
lap-0.5.13-cp312-cp312-musllinux_1_2_x86_64.whl (1.7MiB)
lap-0.5.13-cp312-cp312-win_amd64.whl (1.4MiB)
lap-0.5.13-cp312-cp312-win_arm64.whl (1.4MiB)
lap-0.5.13-cp313-cp313-macosx_10_13_x86_64.whl (1.4MiB)
lap-0.5.13-cp313-cp313-macosx_11_0_arm64.whl (1.4MiB)
lap-0.5.13-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (1.6MiB)
lap-0.5.13-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (1.6MiB)
lap-0.5.13-cp313-cp313-musllinux_1_2_aarch64.whl (1.6MiB)
lap-0.5.13-cp313-cp313-musllinux_1_2_x86_64.whl (1.6MiB)
lap-0.5.13-cp313-cp313-win_amd64.whl (1.4MiB)
lap-0.5.13-cp313-cp313-win_arm64.whl (1.4MiB)
lap-0.5.13-cp314-cp314-macosx_10_15_x86_64.whl (1.4MiB)
lap-0.5.13-cp314-cp314-macosx_11_0_arm64.whl (1.4MiB)
lap-0.5.13-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (1.6MiB)
lap-0.5.13-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (1.6MiB)
lap-0.5.13-cp314-cp314-musllinux_1_2_aarch64.whl (1.6MiB)
lap-0.5.13-cp314-cp314-musllinux_1_2_x86_64.whl (1.6MiB)
lap-0.5.13-cp314-cp314-win_amd64.whl (1.4MiB)
lap-0.5.13-cp314-cp314-win_arm64.whl (1.4MiB)
lap-0.5.13-cp37-cp37m-macosx_10_9_x86_64.whl (1.4MiB)
lap-0.5.13-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.6MiB)
lap-0.5.13-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6MiB)
lap-0.5.13-cp37-cp37m-musllinux_1_2_aarch64.whl (1.6MiB)
lap-0.5.13-cp37-cp37m-musllinux_1_2_x86_64.whl (1.6MiB)
lap-0.5.13-cp37-cp37m-win_amd64.whl (1.4MiB)
lap-0.5.13-cp38-cp38-macosx_10_9_x86_64.whl (1.4MiB)
lap-0.5.13-cp38-cp38-macosx_11_0_arm64.whl (1.4MiB)
lap-0.5.13-cp38-cp38-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (1.6MiB)
lap-0.5.13-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (1.6MiB)
lap-0.5.13-cp38-cp38-musllinux_1_2_aarch64.whl (1.6MiB)
lap-0.5.13-cp38-cp38-musllinux_1_2_x86_64.whl (1.6MiB)
lap-0.5.13-cp38-cp38-win_amd64.whl (1.4MiB)
lap-0.5.13-cp39-cp39-macosx_10_9_x86_64.whl (1.4MiB)
lap-0.5.13-cp39-cp39-macosx_11_0_arm64.whl (1.4MiB)
lap-0.5.13-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (1.6MiB)
lap-0.5.13-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (1.6MiB)
lap-0.5.13-cp39-cp39-musllinux_1_2_aarch64.whl (1.6MiB)
lap-0.5.13-cp39-cp39-musllinux_1_2_x86_64.whl (1.6MiB)
lap-0.5.13-cp39-cp39-win_amd64.whl (1.4MiB)
lap-0.5.13-cp39-cp39-win_arm64.whl (1.4MiB)
lap-0.5.13.tar.gz (1.5MiB)
Extras: None
Dependencies:
numpy (>=1.21.6)