py-lapsolver
py-lapsolver implements a Linear sum Assignment Problem (LAP) solver for dense matrices based on shortest path augmentation in Python. In practice, it solves 5000x5000 problems in around 3 seconds.
Install
pip install [--pre] lapsolver
Windows binary wheels are provided for Python 3.5/3.6. Source wheels otherwise.
Install from source
Clone this repository
git clone --recursive https://github.com/cheind/py-lapsolver.git
Then build the project and exectute tests
python setup.py develop
python setup.py test
Executing the tests requires pytest and optionally pytest-benchmark for generating benchmarks.
Usage
import numpy as np from lapsolver import solve_dense costs = np.array([ [6, 9, 1], [10, 3, 2], [8, 7, 4.] ], dtype=np.float32) rids, cids = solve_dense(costs) for r,c in zip(rids, cids): print(r,c) # Row/column pairings """ 0 2 1 1 2 0 """
You may also want to mark certain pairings impossible
# Matrix with non-allowed pairings costs = np.array([ [5, 9, np.nan], [10, np.nan, 2], [8, 7, 4.]] ) rids, cids = solve_dense(costs) for r,c in zip(rids, cids): print(r,c) # Row/column pairings """ 0 0 1 2 2 1 """
Benchmarks
Comparisons below are generated by scripts in ./lapsolver/benchmarks.
Currently, the following solvers are tested
lapjv- https://github.com/gatagat/lapmunkres- http://software.clapper.org/munkres/ortools- https://github.com/google/or-tools **scipy- https://github.com/scipy/scipy/tree/master/scipylapsolver- this project
**reduced performance due to costly dense matrix to graph conversion. If you know a better way, please let me know.
Please note that the x-axis is scaled logarithmically. Missing bars indicate excessive runtime or errors in returned result.

Additional Benchmarks
Berhane performs an in depth analysis of Python3 linear assignment problem solver at https://github.com/berhane/LAP-solvers
References
py-lapsolver heavily relies on code published by @jaehyunp at https://github.com/jaehyunp/