Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-munkres for openSUSE:Factory checked in at 2022-03-26 22:32:16 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-munkres (Old) and /work/SRC/openSUSE:Factory/.python-munkres.new.1900 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-munkres" Sat Mar 26 22:32:16 2022 rev:5 rq:965081 version:1.1.4 Changes: -------- --- /work/SRC/openSUSE:Factory/python-munkres/python-munkres.changes 2020-09-15 16:29:30.106666388 +0200 +++ /work/SRC/openSUSE:Factory/.python-munkres.new.1900/python-munkres.changes 2022-03-26 22:32:40.970086462 +0100 @@ -1,0 +2,10 @@ +Sat Mar 26 19:58:13 UTC 2022 - Dirk M??ller <dmuel...@suse.com> + +- update to 1.1.4: +- Switched from Nose to Pytest for testing. +- Fix to Issue #34, in which + `print_matrix` wasn't handling non-integral values. +- Various changes from `http:` URLs to `https:` URLs +- drop python-munkres-remove-nose.patch (obsolete) + +------------------------------------------------------------------- Old: ---- python-munkres-remove-nose.patch release-1.1.2.tar.gz New: ---- release-1.1.4.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-munkres.spec ++++++ --- /var/tmp/diff_new_pack.LYR7Ye/_old 2022-03-26 22:32:41.474087151 +0100 +++ /var/tmp/diff_new_pack.LYR7Ye/_new 2022-03-26 22:32:41.482087163 +0100 @@ -1,7 +1,7 @@ # # spec file for package python-munkres # -# Copyright (c) 2020 SUSE LLC +# Copyright (c) 2022 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -19,15 +19,13 @@ %define skip_python2 1 %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-munkres -Version: 1.1.2 +Version: 1.1.4 Release: 0 Summary: Munkres implementation for Python License: Apache-2.0 Group: Development/Languages/Python -URL: http://software.clapper.org/munkres/ +URL: https://software.clapper.org/munkres/ Source: https://github.com/bmc/munkres/archive/release-%{version}.tar.gz -# https://github.com/bmc/munkres/pull/32 -Patch0: python-munkres-remove-nose.patch BuildRequires: %{python_module setuptools} # SECTION test requirements BuildRequires: %{python_module pytest} @@ -50,7 +48,6 @@ %prep %setup -q -n munkres-release-%{version} -%patch0 -p1 %build %python_build ++++++ release-1.1.2.tar.gz -> release-1.1.4.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/munkres-release-1.1.2/CHANGELOG.md new/munkres-release-1.1.4/CHANGELOG.md --- old/munkres-release-1.1.2/CHANGELOG.md 2019-02-15 19:24:34.000000000 +0100 +++ new/munkres-release-1.1.4/CHANGELOG.md 2020-09-15 17:11:37.000000000 +0200 @@ -1,5 +1,21 @@ # Change Log, munkres.py +Version 1.1.4 (September, 2020) + +- Switched from Nose to Pytest for testing. Patch courtesy @kmosiejczuk, + [PR #32](https://github.com/bmc/munkres/pull/32), with some additional + cleanup by me. +- Fix to [Issue #34](https://github.com/bmc/munkres/issues/34), in which + `print_matrix` wasn't handling non-integral values. Patch courtesy @finn0, + via [PR #35](https://github.com/bmc/munkres/pull/35). +- Various changes from `http:` URLs to `https:` URLs, courtesy @finn0 + via [PR #36](https://github.com/bmc/munkres/pull/36/). + +Version 1.1.3: + +**Nonexistent**. Accidentally published before check-in. Deleted from +PyPI. Use version 1.1.4. + Version 1.1.2 (February, 2019) - Removed `NoReturn` type annotations, to allow compatibility with Python 3.5 @@ -73,7 +89,7 @@ - Added time bound to README. Addresses [Issue #15](https://github.com/bmc/munkres/issues/15). - Versioning will now adhere to - [semantic version specification](http://semver.org). + [semantic version specification](https://semver.org). Version 1.0.8 (June, 2016) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/munkres-release-1.1.2/LICENSE.md new/munkres-release-1.1.4/LICENSE.md --- old/munkres-release-1.1.2/LICENSE.md 2019-02-15 19:24:34.000000000 +0100 +++ new/munkres-release-1.1.4/LICENSE.md 2020-09-15 17:11:37.000000000 +0200 @@ -4,7 +4,7 @@ you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/munkres-release-1.1.2/PUBLISHING.md new/munkres-release-1.1.4/PUBLISHING.md --- old/munkres-release-1.1.2/PUBLISHING.md 2019-02-15 19:24:34.000000000 +0100 +++ new/munkres-release-1.1.4/PUBLISHING.md 2020-09-15 17:11:37.000000000 +0200 @@ -9,7 +9,7 @@ ``` $ pip install twine $ pip install 'readme_renderer[md]' -$ python setup.py test # run Nose tests. Make sure they pass. +$ python setup.py test # run tests. Make sure they pass. $ python setup.py docs # create API docs (for main project page) $ python setup.py sdist bdist_wheel $ twine check dist/* diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/munkres-release-1.1.2/README.md new/munkres-release-1.1.4/README.md --- old/munkres-release-1.1.2/README.md 2019-02-15 19:24:34.000000000 +0100 +++ new/munkres-release-1.1.4/README.md 2020-09-15 17:11:37.000000000 +0200 @@ -19,9 +19,9 @@ used more than once. This particular implementation is based on -<http://csclab.murraystate.edu/~bob.pilgrim/445/munkres.html>. +<https://csclab.murraystate.edu/~bob.pilgrim/445/munkres.html>. -[Hungarian algorithm]: http://en.wikipedia.org/wiki/Hungarian_algorithm +[Hungarian algorithm]: https://en.wikipedia.org/wiki/Hungarian_algorithm See the docs on the [project page][] for more details. @@ -30,7 +30,7 @@ See [the installation instructions](http://software.clapper.org/munkres/#installing) for details. -[project page]: http://software.clapper.org/munkres/ +[project page]: https://software.clapper.org/munkres/ ## Copyright diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/munkres-release-1.1.2/munkres.py new/munkres-release-1.1.4/munkres.py --- old/munkres-release-1.1.2/munkres.py 2019-02-15 19:24:34.000000000 +0100 +++ new/munkres-release-1.1.4/munkres.py 2020-09-15 17:11:37.000000000 +0200 @@ -6,7 +6,7 @@ (also called the Hungarian algorithm or the Kuhn-Munkres algorithm), useful for solving the Assignment Problem. -For complete usage documentation, see: http://software.clapper.org/munkres/ +For complete usage documentation, see: https://software.clapper.org/munkres/ """ __docformat__ = 'markdown' @@ -33,10 +33,10 @@ Matrix = NewType('Matrix', Sequence[Sequence[AnyNum]]) # Info about the module -__version__ = "1.1.2" +__version__ = "1.1.4" __author__ = "Brian Clapper, b...@clapper.org" -__url__ = "http://software.clapper.org/munkres/" -__copyright__ = "(c) 2008-2019 Brian M. Clapper" +__url__ = "https://software.clapper.org/munkres/" +__copyright__ = "(c) 2008-2020 Brian M. Clapper" __license__ = "Apache Software License" # Constants @@ -485,7 +485,7 @@ def print_matrix(matrix: Matrix, msg: Optional[str] = None) -> None: """ - Convenience function: Displays the contents of a matrix of integers. + Convenience function: Displays the contents of a matrix. **Parameters** @@ -513,8 +513,8 @@ sep = '[' for val in row: if val is DISALLOWED: - formatted = ((format + 's') % DISALLOWED_PRINTVAL) - else: formatted = ((format + 'd') % val) + val = DISALLOWED_PRINTVAL + formatted = ((format + 's') % val) sys.stdout.write(sep + formatted) sep = ', ' sys.stdout.write(']\n') @@ -545,12 +545,24 @@ [9, 7, 4]], 18), + # Square variant with floating point value + ([[10.1, 10.2, 8.3], + [9.4, 8.5, 1.6], + [9.7, 7.8, 4.9]], + 19.5), + # Rectangular variant ([[10, 10, 8, 11], [9, 8, 1, 1], [9, 7, 4, 10]], 15), + # Rectangular variant with floating point value + ([[10.01, 10.02, 8.03, 11.04], + [9.05, 8.06, 1.07, 1.08], + [9.09, 7.1, 4.11, 10.12]], + 15.2), + # Rectangular with DISALLOWED ([[4, 5, 6, DISALLOWED], [1, 9, 12, 11], @@ -558,12 +570,26 @@ [12, 12, 12, 10]], 20), + # Rectangular variant with DISALLOWED and floating point value + ([[4.001, 5.002, 6.003, DISALLOWED], + [1.004, 9.005, 12.006, 11.007], + [DISALLOWED, 5.008, 4.009, DISALLOWED], + [12.01, 12.011, 12.012, 10.013]], + 20.028), + # DISALLOWED to force pairings ([[1, DISALLOWED, DISALLOWED, DISALLOWED], [DISALLOWED, 2, DISALLOWED, DISALLOWED], [DISALLOWED, DISALLOWED, 3, DISALLOWED], [DISALLOWED, DISALLOWED, DISALLOWED, 4]], - 10)] + 10), + + # DISALLOWED to force pairings with floating point value + ([[1.1, DISALLOWED, DISALLOWED, DISALLOWED], + [DISALLOWED, 2.2, DISALLOWED, DISALLOWED], + [DISALLOWED, DISALLOWED, 3.3, DISALLOWED], + [DISALLOWED, DISALLOWED, DISALLOWED, 4.4]], + 11.0)] m = Munkres() for cost_matrix, expected_total in matrices: @@ -573,6 +599,6 @@ for r, c in indexes: x = cost_matrix[r][c] total_cost += x - print(('(%d, %d) -> %d' % (r, c, x))) - print(('lowest cost=%d' % total_cost)) + print(('(%d, %d) -> %s' % (r, c, x))) + print(('lowest cost=%s' % total_cost)) assert expected_total == total_cost diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/munkres-release-1.1.2/requirements.txt new/munkres-release-1.1.4/requirements.txt --- old/munkres-release-1.1.2/requirements.txt 2019-02-15 19:24:34.000000000 +0100 +++ new/munkres-release-1.1.4/requirements.txt 2020-09-15 17:11:37.000000000 +0200 @@ -1,2 +1,2 @@ -nose==1.3.7 +pytest==6.0.2 pdoc==0.3.2 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/munkres-release-1.1.2/setup.py new/munkres-release-1.1.4/setup.py --- old/munkres-release-1.1.2/setup.py 2019-02-15 19:24:34.000000000 +0100 +++ new/munkres-release-1.1.4/setup.py 2020-09-15 17:11:37.000000000 +0200 @@ -74,12 +74,11 @@ class Test(CommandHelper): def run(self): - import nose - try: - os.chdir('test') - nose.run() - finally: - os.chdir(here) + import pytest + os.environ['PYTHONPATH'] = '.' + rc = pytest.main(['-W', 'ignore', '-ra', '--cache-clear', 'test', '.']) + if rc != 0: + raise Exception('*** Tests failed.') # Run setup diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/munkres-release-1.1.2/test/README.md new/munkres-release-1.1.4/test/README.md --- old/munkres-release-1.1.2/test/README.md 2019-02-15 19:24:34.000000000 +0100 +++ new/munkres-release-1.1.4/test/README.md 2020-09-15 17:11:37.000000000 +0200 @@ -1,8 +1,8 @@ -The tests in this directory are intended to be run via [Nose][]. +The tests in this directory are intended to be run via [pytest][]. ``` -pip install nose -nosetests +pip install pytest +python -m pytest ``` -[Nose]: http://nose.readthedocs.io/en/latest/ +[pytest]: https://docs.pytest.org/ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/munkres-release-1.1.2/test/test_munkres.py new/munkres-release-1.1.4/test/test_munkres.py --- old/munkres-release-1.1.2/test/test_munkres.py 2019-02-15 19:24:34.000000000 +0100 +++ new/munkres-release-1.1.4/test/test_munkres.py 2020-09-15 17:11:37.000000000 +0200 @@ -1,6 +1,6 @@ from munkres import Munkres, DISALLOWED, UnsolvableMatrix import munkres -from nose.tools import assert_equals, raises +import pytest m = Munkres() @@ -16,7 +16,17 @@ [10, 3, 2], [8, 7, 4]] cost = _get_cost(matrix) - assert_equals(cost, 12) + assert cost == 12 + +def float_example(): + ''' + Test a matrix with float values + ''' + matrix = [[5.1, 9.2, 1.3], + [10.4, 3.5, 2.6], + [8.7, 7.8, 4.9]] + cost = _get_cost(matrix) + assert_almost_equal(cost, 13.5) def test_5_x_5(): matrix = [[12, 9, 27, 10, 23], @@ -25,7 +35,17 @@ [9, 28, 26, 23, 13], [16, 16, 24, 6, 9]] cost = _get_cost(matrix) - assert_equals(cost, 51) + assert cost == 51 + +def test_5_x_5_float(): + matrix = [[12.01, 9.02, 27.03, 10.04, 23.05], + [7.06, 13.07, 13.08, 30.09, 19.1], + [25.11, 18.12, 26.13, 11.14, 26.15], + [9.16, 28.17, 26.18, 23.19, 13.2], + [16.21, 16.22, 24.23, 6.24, 9.25]] + cost = _get_cost(matrix) + assert cost == pytest.approx(51.65) + def test_10_x_10(): matrix = [[37, 34, 29, 26, 19, 8, 9, 23, 19, 29], @@ -39,7 +59,21 @@ [21, 25, 23, 39, 31, 37, 32, 33, 38, 1], [17, 34, 40, 10, 29, 37, 40, 3, 25, 3]] cost = _get_cost(matrix) - assert_equals(cost, 66) + assert cost == 66 + +def test_10_x_10_float(): + matrix = [[37.001, 34.002, 29.003, 26.004, 19.005, 8.006, 9.007, 23.008, 19.009, 29.01], + [9.011, 28.012, 20.013, 8.014, 18.015, 20.016, 14.017, 33.018, 23.019, 14.02], + [15.021, 26.022, 12.023, 28.024, 6.025, 17.026, 9.027, 13.028, 21.029, 7.03], + [2.031, 8.032, 38.033, 36.034, 39.035, 5.036, 36.037, 2.038, 38.039, 27.04], + [30.041, 3.042, 33.043, 16.044, 21.045, 39.046, 7.047, 23.048, 28.049, 36.05], + [7.051, 5.052, 19.053, 22.054, 36.055, 36.056, 24.057, 19.058, 30.059, 2.06], + [34.061, 20.062, 13.063, 36.064, 12.065, 33.066, 9.067, 10.068, 23.069, 5.07], + [7.071, 37.072, 22.073, 39.074, 33.075, 39.076, 10.077, 3.078, 13.079, 26.08], + [21.081, 25.082, 23.083, 39.084, 31.085, 37.086, 32.087, 33.088, 38.089, 1.09], + [17.091, 34.092, 40.093, 10.094, 29.095, 37.096, 40.097, 3.098, 25.099, 3.1]] + cost = _get_cost(matrix) + assert cost == pytest.approx(66.505) def test_20_x_20(): matrix = [[5, 4, 3, 9, 8, 9, 3, 5, 6, 9, 4, 10, 3, 5, 6, 6, 1, 8, 10, 2], @@ -63,14 +97,50 @@ [9, 6, 3, 1, 8, 5, 7, 8, 7, 2, 1, 8, 2, 8, 3, 7, 4, 8, 7, 7], [8, 4, 4, 9, 7, 10, 6, 2, 1, 5, 8, 5, 1, 1, 1, 9, 1, 3, 5, 3]] cost = _get_cost(matrix) - assert_equals(cost, 22) + assert cost == 22 + +def test_20_x_20_float(): + matrix = [[5.0001, 4.0002, 3.0003, 9.0004, 8.0005, 9.0006, 3.0007, 5.0008, 6.0009, 9.001, 4.0011, 10.0012, 3.0013, 5.0014, 6.0015, 6.0016, 1.0017, 8.0018, 10.0019, 2.002], + [10.0021, 9.0022, 9.0023, 2.0024, 8.0025, 3.0026, 9.0027, 9.0028, 10.0029, 1.003, 7.0031, 10.0032, 8.0033, 4.0034, 2.0035, 1.0036, 4.0037, 8.0038, 4.0039, 8.004], + [10.0041, 4.0042, 4.0043, 3.0044, 1.0045, 3.0046, 5.0047, 10.0048, 6.0049, 8.005, 6.0051, 8.0052, 4.0053, 10.0054, 7.0055, 2.0056, 4.0057, 5.0058, 1.0059, 8.006], + [2.0061, 1.0062, 4.0063, 2.0064, 3.0065, 9.0066, 3.0067, 4.0068, 7.0069, 3.007, 4.0071, 1.0072, 3.0073, 2.0074, 9.0075, 8.0076, 6.0077, 5.0078, 7.0079, 8.008], + [3.0081, 4.0082, 4.0083, 1.0084, 4.0085, 10.0086, 1.0087, 2.0088, 6.0089, 4.009, 5.0091, 10.0092, 2.0093, 2.0094, 3.0095, 9.0096, 10.0097, 9.0098, 9.0099, 10.01], + [1.0101, 10.0102, 1.0103, 8.0104, 1.0105, 3.0106, 1.0107, 7.0108, 1.0109, 1.011, 2.0111, 1.0112, 2.0113, 6.0114, 3.0115, 3.0116, 4.0117, 4.0118, 8.0119, 6.012], + [1.0121, 8.0122, 7.0123, 10.0124, 10.0125, 3.0126, 4.0127, 6.0128, 1.0129, 6.013, 6.0131, 4.0132, 9.0133, 6.0134, 9.0135, 6.0136, 4.0137, 5.0138, 4.0139, 7.014], + [8.0141, 10.0142, 3.0143, 9.0144, 4.0145, 9.0146, 3.0147, 3.0148, 4.0149, 6.015, 4.0151, 2.0152, 6.0153, 7.0154, 7.0155, 4.0156, 4.0157, 3.0158, 4.0159, 7.016], + [1.0161, 3.0162, 8.0163, 2.0164, 6.0165, 9.0166, 2.0167, 7.0168, 4.0169, 8.017, 10.0171, 8.0172, 10.0173, 5.0174, 1.0175, 3.0176, 10.0177, 10.0178, 2.0179, 9.018], + [2.0181, 4.0182, 1.0183, 9.0184, 2.0185, 9.0186, 7.0187, 8.0188, 2.0189, 1.019, 4.0191, 10.0192, 5.0193, 2.0194, 7.0195, 6.0196, 5.0197, 7.0198, 2.0199, 6.02], + [4.0201, 5.0202, 1.0203, 4.0204, 2.0205, 3.0206, 3.0207, 4.0208, 1.0209, 8.021, 8.0211, 2.0212, 6.0213, 9.0214, 5.0215, 9.0216, 6.0217, 3.0218, 9.0219, 3.022], + [3.0221, 1.0222, 1.0223, 8.0224, 6.0225, 8.0226, 8.0227, 7.0228, 9.0229, 3.023, 2.0231, 1.0232, 8.0233, 2.0234, 4.0235, 7.0236, 3.0237, 1.0238, 2.0239, 4.024], + [5.0241, 9.0242, 8.0243, 6.0244, 10.0245, 4.0246, 10.0247, 3.0248, 4.0249, 10.025, 10.0251, 10.0252, 1.0253, 7.0254, 8.0255, 8.0256, 7.0257, 7.0258, 8.0259, 8.026], + [1.0261, 4.0262, 6.0263, 1.0264, 6.0265, 1.0266, 2.0267, 10.0268, 5.0269, 10.027, 2.0271, 6.0272, 2.0273, 4.0274, 5.0275, 5.0276, 3.0277, 5.0278, 1.0279, 5.028], + [5.0281, 6.0282, 9.0283, 10.0284, 6.0285, 6.0286, 10.0287, 6.0288, 4.0289, 1.029, 5.0291, 3.0292, 9.0293, 5.0294, 2.0295, 10.0296, 9.0297, 9.0298, 5.0299, 1.03], + [10.0301, 9.0302, 4.0303, 6.0304, 9.0305, 5.0306, 3.0307, 7.0308, 10.0309, 1.031, 6.0311, 8, 1.0312, 1.0313, 10.0314, 9.0315, 5.0316, 7.0317, 7.0318, 5.0319, 1.032], + [2.0321, 6.0322, 6.0323, 6.0324, 6.0325, 2.0326, 9.0327, 4.0328, 7.0329, 5.033, 3.0331, 2.0332, 10.0333, 3.0334, 4.0335, 5.0336, 10.0337, 9.0338, 1.0339, 7.034], + [5.0341, 2.0342, 4.0343, 9.0344, 8.0345, 4.0346, 8.0347, 2.0348, 4.0349, 1.035, 3.0351, 7.0352, 6.0353, 8.0354, 1.0355, 6.0356, 8.0357, 8.0358, 10.0359, 10.036], + [9.0361, 6.0362, 3.0363, 1.0364, 8.0365, 5.0366, 7.0367, 8.0368, 7.0369, 2.037, 1.0371, 8.0372, 2.0373, 8.0374, 3.0375, 7.0376, 4.0377, 8.0378, 7.0379, 7.038], + [8.0381, 4.0382, 4.0383, 9.0384, 7.0385, 10.0386, 6.0387, 2.0388, 1.0389, 5.039, 8.0391, 5.0392, 1.0393, 1.0394, 1.0395, 9.0396, 1.0397, 3.0398, 5.0399, 3.04]] + cost = _get_cost(matrix) + ''' + Here, it becomes mandatory to set "places" argument, otherwise test might + fails. It happens because float values in this example have more number of + digits after decimal point than other float examples. + ''' + assert cost == pytest.approx(20.362, rel=1e-3) def test_disallowed(): matrix = [[5, 9, DISALLOWED], [10, DISALLOWED, 2], [8, DISALLOWED, 4]] cost = _get_cost(matrix) - assert_equals(cost, 19) + assert cost == 19 + +def test_disallowed_float(): + matrix = [[5.1, 9.2, DISALLOWED], + [10.3, DISALLOWED, 2.4], + [8.5, DISALLOWED, 4.6]] + cost = _get_cost(matrix) + assert cost == pytest.approx(20.1) def test_profit(): profit_matrix = [[94, 66, 100, 18, 48], @@ -84,7 +154,21 @@ ) indices = m.compute(cost_matrix) profit = sum([profit_matrix[row][column] for row, column in indices]) - assert_equals(profit, 392) + assert profit == 392 + +def test_profit_float(): + profit_matrix = [[94.01, 66.02, 100.03, 18.04, 48.05], + [51.06, 63.07, 97.08, 79.09, 11.1], + [37.11, 53.12, 57.13, 78.14, 28.15], + [59.16, 43.17, 97.18, 88.19, 48.2], + [52.21, 19.22, 89.23, 60.24, 60.25]] + import sys + cost_matrix = munkres.make_cost_matrix( + profit_matrix, lambda cost: sys.maxsize - cost + ) + indices = m.compute(cost_matrix) + profit = sum([profit_matrix[row][column] for row, column in indices]) + assert profit == pytest.approx(362.65) def test_irregular(): matrix = [[12, 26, 17], @@ -94,7 +178,17 @@ [15, 93, 55, 80]] cost = _get_cost(matrix) - assert_equals(cost, 43) + assert cost == 43 + +def test_irregular_float(): + matrix = [[12.01, 26.02, 17.03], + [49.04, 43.05, 36.06, 10.07, 5.08], + [97.09, 9.1, 66.11, 34.12], + [52.13, 42.14, 19.15, 36.16], + [15.17, 93.18, 55.19, 80.2]] + + cost = _get_cost(matrix) + assert cost == pytest.approx(43.42) def test_rectangular(): matrix = [[34, 26, 17, 12], @@ -106,13 +200,32 @@ padded_matrix = m.pad_matrix(matrix, 0) padded_cost = _get_cost(padded_matrix) cost = _get_cost(matrix) - assert_equals(padded_cost, cost) - assert_equals(cost, 70) + assert padded_cost == cost + assert cost == 70 -@raises(UnsolvableMatrix) -def test_unsolvable(): - matrix = [[5, 9, DISALLOWED], - [10, DISALLOWED, 2], - [DISALLOWED, DISALLOWED, DISALLOWED]] - m.compute(matrix) +def test_rectangular_float(): + matrix = [[34.01, 26.02, 17.03, 12.04], + [43.05, 43.06, 36.07, 10.08], + [97.09, 47.1, 66.11, 34.12], + [52.13, 42.14, 19.15, 36.16], + [15.17, 93.18, 55.19, 80.2]] + + padded_matrix = m.pad_matrix(matrix, 0) + padded_cost = _get_cost(padded_matrix) + cost = _get_cost(matrix) + assert padded_cost == pytest.approx(cost) + assert cost == pytest.approx(70.42) +def test_unsolvable(): + with pytest.raises(UnsolvableMatrix): + matrix = [[5, 9, DISALLOWED], + [10, DISALLOWED, 2], + [DISALLOWED, DISALLOWED, DISALLOWED]] + m.compute(matrix) + +def test_unsolvable_float(): + with pytest.raises(UnsolvableMatrix): + matrix = [[5.1, 9.2, DISALLOWED], + [10.3, DISALLOWED, 2.4], + [DISALLOWED, DISALLOWED, DISALLOWED]] + m.compute(matrix)