diff --git a/pyomo/common/formatting.py b/pyomo/common/formatting.py index 71798565417..d9699c39d96 100644 --- a/pyomo/common/formatting.py +++ b/pyomo/common/formatting.py @@ -102,7 +102,7 @@ def tostr(value, quote_str=False): } -def tabular_writer(ostream, prefix, data, header, row_generator): +def tabular_writer(ostream, prefix, data, header, row_generator, sort_rows=True): """Output data in tabular form Parameters @@ -121,7 +121,8 @@ def tabular_writer(ostream, prefix, data, header, row_generator): returns either a tuple defining the entries for a single row, or a generator that returns a sequence of table rows to be output for the specified `key` - + sort_rows: bool + sets if rows should be sorted using robust_sort, default (True) """ prefix = tostr(prefix) @@ -186,7 +187,11 @@ def tabular_writer(ostream, prefix, data, header, row_generator): if any(' ' in r[-1] for x in _rows.values() if x is not None for r in x): _width[-1] = '%s' - for _key in sorted_robust(_rows): + if sort_rows: + _sorted_rows = sorted_robust(_rows) + else: + _sorted_rows = _rows + for _key in _sorted_rows: _rowSet = _rows[_key] if not _rowSet: _rowSet = [[_key] + [None] * (len(_width) - 1)] diff --git a/pyomo/common/tests/test_formatting.py b/pyomo/common/tests/test_formatting.py index 0798a80589c..3d1cd00402a 100644 --- a/pyomo/common/tests/test_formatting.py +++ b/pyomo/common/tests/test_formatting.py @@ -129,6 +129,25 @@ def _data_gen(i, j): """ self.assertEqual(ref.strip(), os.getvalue().strip()) + def test_multiline_generator_user_sorted(self): + os = StringIO() + data = {"b": 0, "a": 1, "c": 3} + + def _data_gen(i, j): + for n in range(j): + yield (n, chr(ord("a") + n) * j) + + tabular_writer(os, "", data.items(), ["i", "j"], _data_gen, sort_rows=False) + ref = """ +Key : i : j + b : None : None + a : 0 : a + c : 0 : aaa + : 1 : bbb + : 2 : ccc +""" + self.assertEqual(ref.strip(), os.getvalue().strip()) + def test_multiline_generator_exception(self): os = StringIO() data = {'a': 0, 'b': 1, 'c': 3}