diff --git a/pycode/examples/simulation/ode_seir_flows.py b/pycode/examples/simulation/ode_seir_flows.py index 4d85b39e4a..0553590c20 100644 --- a/pycode/examples/simulation/ode_seir_flows.py +++ b/pycode/examples/simulation/ode_seir_flows.py @@ -70,8 +70,8 @@ def run_ode_seir_flows_simulation(): # Run flow simulation (result, flows) = simulate_flows(0, days, dt, model) - print(result.print_table(["S", "E", "I", "R"], 16, 5)) - print(flows.print_table(["S->E", "E->I", "I->R"], 16, 5)) + result.print_table(False, ["S", "E", "I", "R"], 16, 5) + flows.print_table(False, ["S->E", "E->I", "I->R"], 16, 5) if __name__ == "__main__": diff --git a/pycode/memilio-simulation/memilio/simulation/bindings/utils/time_series.cpp b/pycode/memilio-simulation/memilio/simulation/bindings/utils/time_series.cpp index d253404c94..b73a439279 100644 --- a/pycode/memilio-simulation/memilio/simulation/bindings/utils/time_series.cpp +++ b/pycode/memilio-simulation/memilio/simulation/bindings/utils/time_series.cpp @@ -65,15 +65,23 @@ void bind_time_series(py::module_& m, std::string const& name) py::is_operator(), py::arg("index"), py::arg("v")) .def( "print_table", - [](const mio::TimeSeries& self, const std::vector& column_labels, size_t width, - size_t precision, char separator, const std::string& header_prefix) { - std::ostringstream oss; - self.print_table(oss, column_labels, width, precision, separator, header_prefix); - return oss.str(); + [](const mio::TimeSeries& self, bool return_string, const std::vector& column_labels, + size_t width, size_t precision, char separator, const std::string& header_prefix) { + if (return_string) { + std::ostringstream oss; + self.print_table(oss, column_labels, width, precision, separator, header_prefix); + return py::object(py::str(oss.str())); + } + else { + self.print_table(column_labels, width, precision, separator, header_prefix); + return py::object(py::none()); + } }, - py::arg("column_labels") = std::vector{}, py::arg("width") = 16, py::arg("precision") = 5, - py::arg("separator") = ' ', py::arg("header_prefix") = "\n") - + "Prints the TimeSeries as a formatted table. If return_string is true, the table is returned as a " + "string. Otherwise, it is printed to the console.", + py::arg("return_string") = false, py::arg("column_labels") = std::vector{}, + py::arg("width") = 16, py::arg("precision") = 5, py::arg("separator") = ' ', + py::arg("header_prefix") = "\n") .def( "export_csv", [](const mio::TimeSeries& self, const std::string& filename, diff --git a/pycode/memilio-simulation/memilio/simulation_test/test_time_series.py b/pycode/memilio-simulation/memilio/simulation_test/test_time_series.py index fca9cb429a..7cc6bd2212 100644 --- a/pycode/memilio-simulation/memilio/simulation_test/test_time_series.py +++ b/pycode/memilio-simulation/memilio/simulation_test/test_time_series.py @@ -65,7 +65,7 @@ def test_print_table(self): ts = mio.TimeSeries(1) ts.add_time_point(2, np.r_[1]) ts.add_time_point(3.5, np.r_[2]) - output = ts.print_table(["a", "b"], 2, 2) + output = ts.print_table(True, ["a", "b"], 2, 2) self.assertEqual( output, '\nTime a \n2.00 1.00\n3.50 2.00\n') @@ -74,10 +74,25 @@ def test_print_table_with_separator(self): ts = mio.TimeSeries(1) ts.add_time_point(2, np.r_[1]) ts.add_time_point(3.5, np.r_[2]) - output = ts.print_table(["a"], 4, 1, ',', "# ") + output = ts.print_table(True, ["a"], 4, 1, ',', "# ") self.assertEqual( output, '# Time,a \n 2.0, 1.0\n 3.5, 2.0\n') + def test_print_table_console_output(self): + """Test the new print_table function that prints directly to console""" + ts = mio.TimeSeries(1) + ts.add_time_point(2, np.r_[1]) + ts.add_time_point(3.5, np.r_[2]) + + # Test that print_table() without return_string parameter returns None + # (meaning it prints directly to console) + result = ts.print_table() + self.assertIsNone(result) + + # Test that print_table() with custom parameters still prints to console + result = ts.print_table(False, ["Column1"], 10, 2) + self.assertIsNone(result) + def test_export_csv(self): """Test export_csv functionality"""