Уважаемые судари и сударыни!
Небольшое уточнение по комиссии по зачёту. Она пройдёт 29 декабря (понедельник) с 10:30 до 12:30 в аудитории 515.
Пара уточнений по 5му заданию: 1. Многие спрашивают, что делать, если в алгоритме нет разделения на программные и аппаратные компоненты. В этом случае можно в файле с исходными данными задать количество аппаратных компонентов в модуле равное 1 и задать стоимость такого компонента равное 0. Тогда этот компонент не влияет на поиск решения и будут задействованы только програмные компоненты.
2. Понимаю, что несколько несвоевременно, но всё же. Если Ваши мировоззренческие идеалы не позволяют Вам писать на Python, то допускается писать алгоритм на c++. Ниже инструкции как интегрировать c++ код в python. Эти инструкции были любезно предоставлены Никитой Багровым.
Варианты интеграции: 1) python-dev. Нужно вручную задавать нужные структуры и передавать данные. Если нужно экспортировать одну простую функцию, то пользоваться им можно 2) boost-python - удобный интерфейс для экспорта классов, функций и других синтаксических конструкций с++.
Пример:
=======
enum_<FAULT_TOLERANT_SELECTORS>("FaultTolerantSelectors") .value("SELECTOR_NONE", FAULT_TOLERANT_SELECTORS::FAULT_TOLERANT_SELECTOR_NONE) .value("SELECTOR_NVP01", FAULT_TOLERANT_SELECTORS::FAULT_TOLERANT_SELECTOR_NVP01) .value("SELECTOR_NVP11", FAULT_TOLERANT_SELECTORS::FAULT_TOLERANT_SELECTOR_NVP11) .value("SELECTOR_RB11", FAULT_TOLERANT_SELECTORS::FAULT_TOLERANT_SELECTOR_RB11) .export_values() ;
enum class c++ => python enum. Работает прозрачно из питона (автоматически конвертируется)
========
def("XmlTaskParser", &parseTaskXML); - экспорт функции. Все параметры (входные и выходные) также должны конвертироваться (для базовых типов boost уже содержит конвертеры, для сложных нужно написать свой).
======== class_<CReliabilityTask>("ReliabilityTask") .add_property("maxCost", &max_cost_get, &max_cost_set) .add_property("modules", &modules_get, &modules_set) ;
Экспорт класса. Доступ к полям через специальные функции (getter, setter). Из питона это будет 1 метод (для чтения и записи). Например, a.maxCost = 520, print(a.maxCost)
=======
class_<CModule>("Module", init<std::size_t, std::size_t>()) .def("__str__", &CModule::string) .add_property("hw_num", &CModule::hw_num) .add_property("sw_num", &CModule::hw_num) .add_property("qrv", &qrv_get, &qrv_set) .add_property("qd", &qd_get, &qd_set) .add_property("qall", &qall_get, &qall_set) .def("addSelector", &CModule::addSelector) .def("delSelector", &CModule::addSelector) .def("getSelectors", &CModule::addSelector) .add_property("hw", &hw_get, &hw_set) .add_property("sw", &sw_get, &sw_set) ;
Более сложные пример - указан явно конструктор и метод __str__
3 функции - addSelector, delSelector, getSelectors
========================
boost::python::list modules_get(const CReliabilityTask &task) { boost::python::list l; std::for_each(task.modules().begin(), task.modules().end(), [&l](const CModule &m) { l.append(m); }); boost::python::incref(l.ptr()); return l; }
void modules_set(CReliabilityTask &task, const boost::python::list &l) { boost::python::ssize_t n = boost::python::len(l); task.modules().clear(); for(boost::python::ssize_t i = 0; i < n; ++i) task.modules().emplace_back(boost::python::extract<CModule>(l[i])); }
Извлечение данных из списков питона в std::vector и запись в них. Аналогично для dict.
Можно передавать shared_ptr в python - счетчики ссылок будут автоматически увеличиваться и проблем с утечками памяти быть не должно.
=======================