Compiling
=====================================


Dependencies
*************

ZERO requires a few external libraries to work. Most of these are managed via `Conda <https://conda.io/>`__ package manager.
A mandatory requirement to use the software as-it-is is `CMake <https://cmake.org/>`__, which will manage the integration with Conan by itself.

The required packages for ZERO are:

-  `CMake <https://cmake.org/>`__ (Version 3.14 or later)
-  `Conda <https://conda.io/>`__  (A somehow recent version)
-  `Gurobi <https://www.gurobi.com/registration/download-reg>`__ (Version 9.2 or later) as a MIP solver.
-  `PATH <http://pages.cs.wisc.edu/~ferris/path.html>`__ (Version 5.0 or later) as an LCP solver. You can get a license `here <http://pages.cs.wisc.edu/~ferris/path.html/>`__.

The following packages will be installed by Conda

-  `Armadillo <http://arma.sourceforge.net/docs.html>`__  (Version 9.8 or later) for the linear algebra.
-  `Boost <https://www.boost.org/>`__ (Version 1.72 or later) required for the shell interfaces and the unit tests.
-  `RapidJSON <http://rapidjson.org>`__ (Version 1.1.0 or later) suggested but not mandatory for easy management of JSON output files.
-  `CoinOR <https://www.coin-or.org>`__ Cgl, Osi, and Utils (Builds >= Jan 2021) for cut generation, solver interfaces and utilities.

Recommended but not mandatory for the documentation

-  `DOxygen <http://www.doxygen.nl>`__ (Version 1.8 or later) to generate the C++ documentation
-  `Sphinx <http://www.sphinx-doc.org>`__ (Version 1.8 or later) to render the HTML into a ReadTheDocs template
-  `Exhale <https://exhale.readthedocs.io/en/latest/>`__ (Version 0.2.3 or later) and `Breathe <https://breathe.readthedocs.io/en/latest/>`__ (Version 4.10 or later)  to integrate Doxygen, Sphinx and the ReadTheDocs template



Downloading and Compiling
*********************************
First, clone the repository of ZERO from GitHub with:

.. code-block:: python

   git clone https://github.com/ds4dm/ZERO

To build the targets with CMake, then:

.. code-block:: python

   cd ZERO/
   cmake .. && make

If the required packages are installed, Conda and CMake will correctly perform the installation by fetching the remaining components.

* You can supply an extra hint for the Gurobi PATH with the CMake argument `-DZERO_GUROBIHINT:STRING=/gurobi_path/distribution`
* You can disable external dependencies install through conda with the CMake argument `-DZERO_INSTALL_DEPS=OFF`