python

Установка or-tools с SCIP и GLPK в виртуальное окружение Python 3.7 на Linux

  • суббота, 15 февраля 2020 г. в 00:25:33
https://habr.com/ru/post/488346/
  • Настройка Linux
  • Python


Решил я поучаствовать в соревновании и понадобилось для него использовать пакеты для решения задач оптимизации. Выбрал гугловский инструмент 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, пробуем установить более старую версию и вуаля!

А теперь ещё раз рабочая последовательность действий.

Последовательность установки


  1. Скачать архив SCIP, убедившись, что тут явно указана поддержка той версии, которую вы скачиваете (в моём случае developers.google.com/optimization/support/release_notes#support-for-scip-6.0.0) и распаковать.
  2. Скачать GLPK (на момент поста последняя версия 4.65) и распаковать.
  3. Установить SCIP командой

    make GMP=false READLINE=false TPI=tny ZIMPL=false scipoptlib install INSTALLDIR=<path>/scipoptsuite-6.0.0
    
  4. Установить GLPK командой:

    ./configure --prefix=<install_path> --with-pic --enable-shared
    make
    make install
    
  5. Скачать OR-Tools с гитхаба

    git clone https://github.com/google/or-tools
  6. Установить OR-Tools командами:

    make third_party
    make python_package
    

    Если последняя команда не срабатывает установить wheel командой:

    pip install wheel
  7. Активировать виртуальное окружение перейти в папку с питоновским пакетом и установить его оттуда.

    Если нужно установить не в виртуальное окружение, а глобально для всей системы вместо:

    make python_package

    выполнить команду:

    make python