1 #include <iostream> 2 3 #include "py_progress.hh" 4 #include "py_helpers.hh" 5 6 namespace cadabra { 7 namespace py = pybind11; 8 ProgressMonitor_totals_helper(ProgressMonitor & self)9 py::list ProgressMonitor_totals_helper(ProgressMonitor& self) 10 { 11 py::list list; 12 auto totals = self.totals(); 13 for (auto& total : totals) 14 list.append(total); 15 return list; 16 } 17 18 get_progress_monitor()19 ProgressMonitor *get_progress_monitor() 20 { 21 ProgressMonitor *pm = nullptr; 22 23 try { 24 pybind11::dict globals = get_globals(); 25 if (scope_has(globals, "__cdb_progress_monitor__")) { 26 pm = globals["__cdb_progress_monitor__"].cast<ProgressMonitor*>(); 27 return pm; 28 } 29 pm = new ProgressMonitor(); 30 globals["__cdb_progress_monitor__"] = pm; 31 } 32 catch (pybind11::error_already_set& ex) { 33 std::cerr << "*!?!?" << ex.what() << std::endl; 34 } 35 return pm; 36 } 37 38 init_progress_monitor(py::module & m)39 void init_progress_monitor(py::module& m) 40 { 41 py::class_<ProgressMonitor>(m, "ProgressMonitor") 42 .def("print", &ProgressMonitor::print) 43 .def("totals", &ProgressMonitor_totals_helper); 44 45 pybind11::class_<ProgressMonitor::Total>(m, "Total") 46 .def_readonly("name", &ProgressMonitor::Total::name) 47 .def_readonly("call_count", &ProgressMonitor::Total::call_count) 48 .def_readonly("total_steps", &ProgressMonitor::Total::total_steps) 49 .def("__str__", &ProgressMonitor::Total::str); 50 51 } 52 53 }