diff --git a/CHANGELOG.rst b/CHANGELOG.rst index bdc2c670..75157052 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -6,6 +6,7 @@ Changelog =========================== - Lock pandas to 2.1.4 or later - Capital Investment result calculation fixed +- Add HiGHS as a solver Version 1.1.2 ============= diff --git a/docs/_static/otoole_figures.drawio b/docs/_static/otoole_figures.drawio index e0a3be79..4ac2fc71 100644 --- a/docs/_static/otoole_figures.drawio +++ b/docs/_static/otoole_figures.drawio @@ -1 +1,281 @@ -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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/_static/overview_v2.png b/docs/_static/overview_v2.png index b96fb672..8889aeb7 100644 Binary files a/docs/_static/overview_v2.png and b/docs/_static/overview_v2.png differ diff --git a/docs/_static/workflow.png b/docs/_static/workflow.png index a26e2dab..fcd1f77e 100644 Binary files a/docs/_static/workflow.png and b/docs/_static/workflow.png differ diff --git a/docs/convert.rst b/docs/convert.rst index 2333d976..bc7eae24 100644 --- a/docs/convert.rst +++ b/docs/convert.rst @@ -23,7 +23,7 @@ See :py:func:`otoole.convert.convert` for more details Converting solver results to a folder of CSV files -------------------------------------------------- -The ``convert_results`` function creates a folder of CSV result files from a CBC_, CLP_, +The ``convert_results`` function creates a folder of CSV result files from a CBC_, CLP_, HiGHS_, Gurobi_ or CPLEX_ solution file:: >>> from otoole import convert_results @@ -34,7 +34,7 @@ See :func:`otoole.convert.convert_results` for more details Reading solver results into a dict of Pandas DataFrames ------------------------------------------------------- -The ``read_results`` function reads a CBC_, CLP_, +The ``read_results`` function reads a CBC_, CLP_, HiGHS_, Gurobi_ or CPLEX_ solution file into memory:: >>> from otoole import read_results @@ -68,3 +68,4 @@ You can use the :py:func:`otoole.convert.write` function to write data out to di .. _CLP: https://github.com/coin-or/Clp .. _CPLEX: https://www.ibm.com/products/ilog-cplex-optimization-studio/cplex-optimizer .. _Gurobi: https://www.gurobi.com/ +.. _HiGHS: https://ergo-code.github.io/HiGHS/dev/ diff --git a/docs/examples.rst b/docs/examples.rst index aec99b71..47349f64 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -21,9 +21,9 @@ Solver Setup Objective ~~~~~~~~~ -Install GLPK_ (required) and CBC_ (optional) to use in the otoole examples. -While ``otoole`` does not require a solver, these examples will use the free -and open source solvers GLPK_ and CBC_. +Install GLPK_ (required), CBC_ (optional), and HiGHS_ (optional) to use in the otoole +examples. While ``otoole`` does not require a solver, these examples will use the free +and open source solvers GLPK_, CBC_, and HiGHS_. 1. Install GLPK ~~~~~~~~~~~~~~~~ @@ -50,8 +50,6 @@ your Python packages, you can install GLPK via the command:: $ conda install -c conda-forge glpk -2. Test the GLPK install -~~~~~~~~~~~~~~~~~~~~~~~~ Once installed, you should be able to call the ``glpsol`` command:: $ glpsol @@ -61,7 +59,7 @@ Once installed, you should be able to call the ``glpsol`` command:: .. TIP:: See the `GLPK Wiki`_ for more information on the ``glpsol`` command -3. Install CBC +2. Install CBC ~~~~~~~~~~~~~~ CBC_ is a free and open-source mixed integer linear programming solver. Full @@ -84,8 +82,6 @@ your Python packages, you can install CBC via the command:: $ conda install -c conda-forge coincbc -4. Test the CBC install -~~~~~~~~~~~~~~~~~~~~~~~ Once installed, you should be able to directly call CBC:: $ cbc @@ -99,6 +95,60 @@ Once installed, you should be able to directly call CBC:: You can exit the solver by typing ``quit`` +3. Install HiGHS +~~~~~~~~~~~~~~~~ + +HiGHS_ is a free and open-source mixed integer linear programming solver. HiGHS_ can be +run through the command line or through one of their +`API interfaces `_. See the +`HiGHS install instructions `_ for full +details on both methods. Here we will cover abbreviated instructions for CLI and Python +execution. + +CLI Install ++++++++++++ + +To install the HiGHS executable, install a pre-compiled binary as directed by +the `HiGHS install documentation `_. + +Extract the binary with the following command on MacOS/Linux:: + + $ tar -xzf filename.tar.gz + +Navigate to the ``./bin/`` folder and run HiGHS from the command line:: + + $ ./highs + +.. TIP:: + To call HiGHS_ from anywhere in the command line, add the path to the execultable + to your environment variables. + +Once installed, you should be able to directly call HiGHS_:: + + $ highs + Please specify filename in .mps|.lp|.ems format. + +Python Install +++++++++++++++ + +In Python, simple install HiGHS through pip with:: + + $ pip install highspy + +Once installed, you should be able to see ``highspy`` in your environment:: + + $ pip show highspy + Name: highspy + Version: 1.5.3 + Summary: Python interface to HiGHS + Home-page: https://github.com/ergo-code/highs + Author: + Author-email: + License: MIT + Location: /home/xxx/.local/lib/python3.10/site-packages + Requires: + Required-by: + Input Data Conversion --------------------- @@ -145,7 +195,7 @@ Process Solutions from Different Solvers Objective ~~~~~~~~~ -Process solutions from GLPK_, CBC_, Gurobi_, and CPLEX_. This example assumes +Process solutions from GLPK_, CBC_, HiGHS_, Gurobi_, and CPLEX_. This example assumes you have an existing GNU MathProg datafile called ``simplicity.txt`` (from the previous example). @@ -175,7 +225,62 @@ save the solution as ``simplicity.sol``. Use otoole to create a folder of CSV re $ otoole results cbc csv simplicity.sol results csv data config.yaml -3. Process a solution from Gurobi +3. Process a solution from HiGHS (CLI) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Use GLPK_ to build the model and save the problem as ``simplicity.lp``. Use HiGHS_ to solve the model and +save the solution as ``simplicity.sol``. Use otoole to create a folder of CSV results called ``results/``. + +HiGHS_ has the ability to write solutions in a variety of formats; ``otoole`` will process the +``kSolutionStylePretty`` solution style. We pass this into the HiGHS_ solver through an +`options file `_. First, create the options file:: + + $ touch highs_options.txt + +And add the following option to the file:: + + write_solution_style = 1 + +Next, we can follow a similar process to processing results from other solvers:: + + $ glpsol -m OSeMOSYS.txt -d simplicity.txt --wlp simplicity.lp --check + + $ highs --model_file simplicity.lp --solution_file simplicity.sol --options_file="highs_options.txt" + + $ otoole results highs csv simplicity.sol results csv data config.yaml + +.. NOTE:: + Run the following command to see all the options available to pass into highs in the options file:: + + $ highs --options_file="" + +4. Process a solution from HiGHS (Python) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Use `HiGHS Python API`_ to solve a model, and use otoole's Python API to create a folder of CSV results called ``results/``. +HiGHS can process models in both ``.mlp`` and CPLEX ``.lp`` format. This example will assume you have a model file called ``simplicity.lp`` +already created. This can be created through GLPK following the first command in the previous example. + +First, install HiGHS and otoole into your Python environment:: + + $ pip install highspy + $ pip install otoole + +Next, use HiGHS to solve the model and write a solution file:: + + import highspy + h = highspy.Highs() + h.readModel("simplicity.lp") + h.run() + h.writeSolution("simplicity.sol", 1) + +.. warning:: + The HiGHS_ solution style **must be** solution style ``1`` (ie. ``kSolutionStylePretty``) + +Finally, use otoole to convert the solution file into a folder of result CSVs:: + + from otoole import convert_results + convert_results("config.yaml", "highs", "csv", "simplicity.sol", "results", "csv", "data") + +1. Process a solution from Gurobi ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Use GLPK_ to build the model and save the problem as ``simplicity.lp``. Use Gurobi_ to solve the model and save the solution as ``simplicity.sol``. Use otoole to create a folder of CSV results called ``results/`` from the solution file:: @@ -186,7 +291,7 @@ save the solution as ``simplicity.sol``. Use otoole to create a folder of CSV re $ otoole results gurobi csv simplicity.sol results csv data config.yaml -4. Process a solution from CPLEX +6. Process a solution from CPLEX ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Use GLPK_ to build the model and save the problem as ``simplicity.lp``. Use CPLEX_ to solve the model and save the solution as ``simplicity.sol``. Use otoole to create a folder of CSV results called ``results/`` from the solution file:: @@ -504,3 +609,5 @@ will also flag it as an isolated fuel. This means the fuel is unconnected from t .. _Anaconda: https://www.anaconda.com/ .. _Gurobi: https://www.gurobi.com/ .. _graphviz: https://www.graphviz.org/download/ +.. _HiGHS: https://ergo-code.github.io/HiGHS/dev/ +.. _HiGHS Python API: https://ergo-code.github.io/HiGHS/dev/interfaces/python/ diff --git a/docs/functionality.rst b/docs/functionality.rst index 503fc899..4d184abc 100644 --- a/docs/functionality.rst +++ b/docs/functionality.rst @@ -11,7 +11,7 @@ to turbo-charge your modelling, are described on this page! As shown in the diagram, ``otoole`` deals primarily with data before and after OSeMOSYS. Data work prior to the generation of a datafile, which is read in by GLPK_, is called pre-processing. Anything that happens with the immediate outputs of a solver, such as -the recommended open-source solvers GLPK_, CBC_, or the proprietary solvers CPLEX_ and +the recommended open-source solvers GLPK_, CBC_, HiGHS_, or the commercial solvers CPLEX_ and Gurobi_, is called results and post-processing. .. image:: _static/workflow.png @@ -71,11 +71,10 @@ Overview With small OSeMOSYS models, it is normally fine to use the free open-source GLPK_ solver. If you do, then OSeMOSYS will write out a full set of results as a folder of CSV files. As you progress to larger models, the performance constraints of GLPK_ quickly become -apparent. CBC_ is an alternative open-source solver which offers better performance than -GLPK_ and can handle much larger models. However, CBC_ has no way of knowing how to write -out the CSV files you were used to dealing with when using GLPK_. ``otoole`` to the rescue! +apparent. CBC_ and HiGHS_ are alternative open-source solvers which offer better performance than +GLPK_ and can handle much larger models. -``otoole`` currently supports using GLPK_, CBC_, CPLEX_ or Gurobi_ with all versions of +``otoole`` currently supports using GLPK_, CBC_, HiGHS_, CPLEX_ or Gurobi_ with all versions of GNU MathProg OSeMOSYS - the long, short and fast versions. The long version includes all results as variables within the formulation, so the @@ -94,21 +93,21 @@ Gurobi_ or CPLEX_ solution file together with the input data:: $ otoole results --help usage: otoole results [-h] [--glpk_model GLPK_MODEL] [--write_defaults] - {cbc,cplex,gurobi} {csv} from_path to_path {csv,datafile,excel} input_path config + {cbc,cplex,glpk,gurobi,highs} {csv} from_path to_path {csv,datafile,excel} input_path config positional arguments: - {cbc,cplex,glpk,gurobi} Result data format to convert from - {csv} Result data format to convert to - from_path Path to file or folder to convert from - to_path Path to file or folder to convert to - {csv,datafile,excel} Input data format - input_path Path to input_data - config Path to config YAML file - - optional arguments: - -h, --help show this help message and exit - --glpk_model GLPK_MODEL GLPK model file required for processing GLPK results - --write_defaults Writes default values + {cbc,cplex,glpk,gurobi,highs} Result data format to convert from + {csv} Result data format to convert to + from_path Path to solver solution file + to_path Path to file or folder to convert to + {csv,datafile,excel} Input data format + input_path Path to input_data + config Path to config YAML file + + options: + -h, --help show this help message and exit + --glpk_model GLPK_MODEL GLPK model file required for processing GLPK results + --write_defaults Writes default values .. versionadded:: v1.0.0 The ``config`` positional argument is now required @@ -218,3 +217,4 @@ the rest of the model:: .. _Gurobi: https://www.gurobi.com/ .. _`OSeMOSYS Repository`: https://github.com/OSeMOSYS/OSeMOSYS_GNU_MathProg/tree/master/scripts .. _graphviz: https://graphviz.org/ +.. _HiGHS: https://ergo-code.github.io/HiGHS/dev/