diff --git a/pyomo/core/base/misc.py b/pyomo/core/base/misc.py index 07d5392fe79..4603173626b 100644 --- a/pyomo/core/base/misc.py +++ b/pyomo/core/base/misc.py @@ -14,6 +14,8 @@ import sys import types +from pyomo.core.expr import native_numeric_types + logger = logging.getLogger('pyomo.core') @@ -111,7 +113,9 @@ class _robust_sort_keyfcn(object): """ def __init__(self, key=None): - self._typemap = {tuple: (3, tuple.__name__)} + # sort all native numeric types as if they were floats + self._typemap = {t: (1, float.__name__) for t in native_numeric_types} + self._typemap[tuple] =(3, tuple.__name__) self._key = key def __call__(self, val): diff --git a/pyomo/core/tests/unit/test_base_misc.py b/pyomo/core/tests/unit/test_base_misc.py index 52d8db7747e..ea0a60d5a83 100644 --- a/pyomo/core/tests/unit/test_base_misc.py +++ b/pyomo/core/tests/unit/test_base_misc.py @@ -38,6 +38,10 @@ def test_sorted_robust(self): a = sorted_robust([3, 2, 1]) self.assertEqual(a, [1, 2, 3]) + # Testthat ints and floats are sorted as "numbers" + a = sorted_robust([3, 2.1, 1]) + self.assertEqual(a, [1, 2.1, 3]) + a = sorted_robust([3, '2', 1]) self.assertEqual(a, [1, 3, '2'])