Решил я поучаствовать в соревновании и понадобилось для него использовать пакеты для решения задач оптимизации. Выбрал гугловский инструмент or-tools, который представляет из себя интерфейс для разных решателей (или решал? solverов?). Он содержит в себе несколько инструментов оптимизации, но создателями заявляется поддержка нескольких внешних пакетом, в том числе коммерческих Gurobi и CPLEX. Однако люди мы небогатые, и использовать будем бесплатные SCIP и GLPK (от отечественного разработчика, между прочим). На моё удивление ни одной инструкции о том, как заставить всё это великолепие работать в виртуальном окружении питона, на просторах как нашего, так и англоязычного сегментов интернета я не нашёл и пришлось немного повозиться. Для тех, кто очень спешит, читайте сразу тут, остальным предлагаю познакомиться с сомнительного качества моей графоманией, описывающей перипетии установки гугловского софта. Да, забыл сразу сказать, что устанавливалось всё в Manjaro Linux.
Все три пакета существуют в репозитории питона, поэтому ставим из через pip.
У каждого из них свой интерфейс, а or-tools был выбран как раз для того, чтобы пробовать различные пакеты, без существенного переписывания программы, поэтому задача в том, чтобы or-tools подцепил эти решатели и дал их запускать через себя. И что вы думаете? Установленный через pip or-tools не видит установленные через pip решатели, а они не видят его (кто бы мог подумать). Значит, надо всё таки глянуть, что пишут в документации.
В доках пишут, что нужно собирать из исходников, чтобы or-tools подцепил внешние пакеты. Пробуем собрать, и ничего не выходит, потому что установленные через pip решатели не видно.
Соответственно самые простые способы установки всех пакетов через pip не работают, потому что or-tools не подтягивает решатели, решатели не ставят библиотеки так, как того хочет or-tools, все сыпят в тебя ошибками, называют тупым и всячески смеются.
Далее в доках пишут, что надо собирать решатели из исходников, затем из исходников собирать сам or-tools. Сказано-сделано! Установил SCIP, установил GLPK, но встал не описанный в документации вопрос как же поставить or-tools в виртуальное окружение.
Единственная прописанная в доках команда make python устанавливает пакет глобально в систему (удивительно, да?).
Однако мне повезло: в процессе инженерного поиска методом бесконечных обезьян я случайно набрал команду make help, и мне выдало список всех вариантов сборки or-tools, среди которых оказалась возможность собрать wheel пакет. Это команда make python_package, если что (я повторю её ещё раз в конце). Ну так что, пришло время собирать и запускать?
Ничего не работает на этапе сборки or-tools, он ругается на плохие библиотеки GLPK.
Сборка со SCIP с параметрами из документации проходит успешно, но or-tools всё равно отказывается работать на моменте импорта.
Самостоятельно решения этим проблемам я не нашёл, поэтому направился в гитхаб к разработчикам, спрашивать, почему установка по их инструкции выдаёт ошибки где-то внутри их кода.
Хмм, спасибо, за разъяснения
Пока ждал ответа на гитхабе, шарился по интернетам, в надежде отыскать что-то, что мне поможет. И как это не удивительно, отыскал. Это был блог тимлида проекта, где он писал о том, как связать GLPK с or-tools. И этот способ наконец сработал! Теперь, если собирать всё без SCIP, но с GLPK, то с этим даже можно работать. Уже прогресс.
Однако тимлид команды or-tools не советовал использовать GLPK, говоря, что результаты от показывает неважнецкие, да и хочется всё таки победить SCIP и заставить его работать. Соседний пост в блоге натолкнул на мысль, что гугловский пакет работает с конкретными версиями. Смотрим список изменений релизов и видим там явное указание версии 6.0.0. Не смотря на то, что в мэйкфайле указана версия 6.0.2, пробуем установить более старую версию и вуаля!
А теперь ещё раз рабочая последовательность действий.
Первые шаги
Все три пакета существуют в репозитории питона, поэтому ставим из через pip.
У каждого из них свой интерфейс, а or-tools был выбран как раз для того, чтобы пробовать различные пакеты, без существенного переписывания программы, поэтому задача в том, чтобы or-tools подцепил эти решатели и дал их запускать через себя. И что вы думаете? Установленный через pip or-tools не видит установленные через pip решатели, а они не видят его (кто бы мог подумать). Значит, надо всё таки глянуть, что пишут в документации.
В доках пишут, что нужно собирать из исходников, чтобы or-tools подцепил внешние пакеты. Пробуем собрать, и ничего не выходит, потому что установленные через pip решатели не видно.
Соответственно самые простые способы установки всех пакетов через pip не работают, потому что or-tools не подтягивает решатели, решатели не ставят библиотеки так, как того хочет or-tools, все сыпят в тебя ошибками, называют тупым и всячески смеются.
Далее в доках пишут, что надо собирать решатели из исходников, затем из исходников собирать сам or-tools. Сказано-сделано! Установил SCIP, установил GLPK, но встал не описанный в документации вопрос как же поставить or-tools в виртуальное окружение.
Единственная прописанная в доках команда make python устанавливает пакет глобально в систему (удивительно, да?).
Однако мне повезло: в процессе инженерного поиска методом бесконечных обезьян я случайно набрал команду make help, и мне выдало список всех вариантов сборки or-tools, среди которых оказалась возможность собрать wheel пакет. Это команда make python_package, если что (я повторю её ещё раз в конце). Ну так что, пришло время собирать и запускать?
Ищем проблему
Ничего не работает на этапе сборки or-tools, он ругается на плохие библиотеки GLPK.
Сборка со SCIP с параметрами из документации проходит успешно, но or-tools всё равно отказывается работать на моменте импорта.
Самостоятельно решения этим проблемам я не нашёл, поэтому направился в гитхаб к разработчикам, спрашивать, почему установка по их инструкции выдаёт ошибки где-то внутри их кода.
Хмм, спасибо, за разъяснения
Пока ждал ответа на гитхабе, шарился по интернетам, в надежде отыскать что-то, что мне поможет. И как это не удивительно, отыскал. Это был блог тимлида проекта, где он писал о том, как связать GLPK с or-tools. И этот способ наконец сработал! Теперь, если собирать всё без SCIP, но с GLPK, то с этим даже можно работать. Уже прогресс.
Однако тимлид команды or-tools не советовал использовать GLPK, говоря, что результаты от показывает неважнецкие, да и хочется всё таки победить SCIP и заставить его работать. Соседний пост в блоге натолкнул на мысль, что гугловский пакет работает с конкретными версиями. Смотрим список изменений релизов и видим там явное указание версии 6.0.0. Не смотря на то, что в мэйкфайле указана версия 6.0.2, пробуем установить более старую версию и вуаля!
А теперь ещё раз рабочая последовательность действий.
Последовательность установки
- Скачать архив SCIP, убедившись, что тут явно указана поддержка той версии, которую вы скачиваете (в моём случае developers.google.com/optimization/support/release_notes#support-for-scip-6.0.0) и распаковать.
- Скачать GLPK (на момент поста последняя версия 4.65) и распаковать.
- Установить SCIP командой
make GMP=false READLINE=false TPI=tny ZIMPL=false scipoptlib install INSTALLDIR=<path>/scipoptsuite-6.0.0
- Установить GLPK командой:
./configure --prefix=<install_path> --with-pic --enable-shared make make install
- Скачать OR-Tools с гитхаба
git clone https://github.com/google/or-tools
- Установить OR-Tools командами:
make third_party make python_package
Если последняя команда не срабатывает установить wheel командой:
pip install wheel
- Активировать виртуальное окружение перейти в папку с питоновским пакетом и установить его оттуда.
Если нужно установить не в виртуальное окружение, а глобально для всей системы вместо:
make python_package
выполнить команду:
make python