<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Publishing DTD v1.0 20120330//EN" "JATS-journalpublishing1.dtd">
<article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" article-type="research-article">
<front>
<journal-meta>
<journal-id journal-id-type="publisher-id">INFORMATICA</journal-id>
<journal-title-group><journal-title>Informatica</journal-title></journal-title-group>
<issn pub-type="epub">1822-8844</issn>
<issn pub-type="ppub">0868-4952</issn>
<issn-l>0868-4952</issn-l>
<publisher>
<publisher-name>Vilnius University</publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id pub-id-type="publisher-id">INFOR447</article-id>
<article-id pub-id-type="doi">10.15388/21-INFOR447</article-id>
<article-categories><subj-group subj-group-type="heading">
<subject>Research Article</subject></subj-group></article-categories>
<title-group>
<article-title>Experimental Analysis of Algebraic Modelling Languages for Mathematical Optimization</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name><surname>Jusevičius</surname><given-names>Vaidas</given-names></name><email xlink:href="vaidas.jusevicius@mif.vu.lt">vaidas.jusevicius@mif.vu.lt</email><xref ref-type="aff" rid="j_infor447_aff_001">1</xref><bio>
<p><bold>V. Jusevičius</bold> received the master’s degree in software engineering from Vilnius University, Vilnius, Lithuania, in 2011. In 2017 he started PhD studies in computer science at Vilnius University, Institute of Data Science and Digital Technologies. His thesis title “Research and Development of an Open Source System for Algebraic Modeling Languages”. He is working as a partnership associate professor in Vilnius University, Institute of Computer Science, and as a Chief Software Architect for Danske Bank A/S.</p></bio>
</contrib>
<contrib contrib-type="author">
<contrib-id contrib-id-type="orcid">https://orcid.org/0000-0002-8685-8694</contrib-id>
<name><surname>Oberdieck</surname><given-names>Richard</given-names></name><email xlink:href="oberdieck@gurobi.com">oberdieck@gurobi.com</email><xref ref-type="aff" rid="j_infor447_aff_002">2</xref><bio>
<p><bold>R. Oberdieck</bold> obtained his bachelor and MSc degrees from ETH Zurich in Switzerland (2009–1013), before pursuing a PhD in Chemical Engineering at Imperial College London, UK, which he completed in 2017. After using his knowledge in mathematical modelling and optimization in the space of renewable energies at the world leader in offshore wind energy, Ørsted A/S, he is now helping companies around the world to unlock business value through mathematical optimization as a Technical Account Manager for Gurobi Optimization, LLC.</p></bio>
</contrib>
<contrib contrib-type="author">
<contrib-id contrib-id-type="orcid">https://orcid.org/0000-0003-2057-2922</contrib-id>
<name><surname>Paulavičius</surname><given-names>Remigijus</given-names></name><email xlink:href="remigijus.paulavicius@mif.vu.lt">remigijus.paulavicius@mif.vu.lt</email><xref ref-type="aff" rid="j_infor447_aff_001">1</xref><xref ref-type="corresp" rid="cor1">∗</xref><bio>
<p><bold>R. Paulavičius</bold> received the PhD degree in computer science from Vytautas Magnus University, Kaunas, Lithuania, in 2010. He was a postdoctoral researcher with Vilnius University, Vilnius, Lithuania, and a research associate with Imperial College London, London, UK. He is currently a professor and the Head of the Blockchain Technologies Group, Institute of Data Science and Digital Technologies, Vilnius University. His research interests include optimization, distributed ledger technologies, parallel and distributed computing, machine learning, and the development and application of various operation research techniques.</p></bio>
</contrib>
<aff id="j_infor447_aff_001"><label>1</label><institution>Vilnius University Institute of Data Science and Digital Technologies</institution>, Akademijos 4, LT-08663 Vilnius, <country>Lithuania</country></aff>
<aff id="j_infor447_aff_002"><label>2</label><institution>Gurobi Optimization, LLC</institution>, <country>USA</country></aff>
</contrib-group>
<author-notes>
<corresp id="cor1"><label>∗</label>Corresponding author.</corresp>
</author-notes>
<pub-date pub-type="ppub"><year>2021</year></pub-date><pub-date pub-type="epub"><day>23</day><month>3</month><year>2021</year></pub-date>
<volume>32</volume><issue>2</issue><fpage>283</fpage><lpage>304</lpage>
<history>
<date date-type="received"><month>10</month><year>2020</year></date>
<date date-type="accepted"><month>3</month><year>2021</year></date>
</history>
<permissions><copyright-statement>© 2021 Vilnius University</copyright-statement><copyright-year>2021</copyright-year>
<license license-type="open-access" xlink:href="http://creativecommons.org/licenses/by/4.0/">
<license-p>Open access article under the <ext-link ext-link-type="uri" xlink:href="http://creativecommons.org/licenses/by/4.0/">CC BY</ext-link> license.</license-p></license></permissions>
<abstract>
<p>In this work, we perform an extensive theoretical and experimental analysis of the characteristics of five of the most prominent algebraic modelling languages (<monospace>AMPL</monospace>, <monospace>AIMMS</monospace>, <monospace>GAMS</monospace>, <monospace>JuMP</monospace>, and <monospace>Pyomo</monospace>) and modelling systems supporting them. In our theoretical comparison, we evaluate how the reviewed modern algebraic modelling languages match the current requirements. In the experimental analysis, we use a purpose-built test model library to perform extensive benchmarks. We provide insights on which algebraic modelling languages performed the best and the features that we deem essential in the current mathematical optimization landscape. Finally, we highlight possible future research directions for this work.</p>
</abstract>
<kwd-group>
<label>Key words</label>
<kwd>algebraic modelling languages</kwd>
<kwd>optimization</kwd>
<kwd>AMPL</kwd>
<kwd>AIMMS</kwd>
<kwd>GAMS</kwd>
<kwd>JuMP</kwd>
<kwd>Pyomo</kwd>
</kwd-group>
</article-meta>
</front>
<body>
<sec id="j_infor447_s_001">
<label>1</label>
<title>Introduction</title>
<p>Many real-world problems are routinely solved using modern optimization tools (e.g. Abhishek <italic>et al.</italic>, <xref ref-type="bibr" rid="j_infor447_ref_001">2010</xref>; Fragniere and Gondzio, <xref ref-type="bibr" rid="j_infor447_ref_010">2002</xref>; Groër <italic>et al.</italic>, <xref ref-type="bibr" rid="j_infor447_ref_012">2011</xref>; Paulavičius and Žilinskas, <xref ref-type="bibr" rid="j_infor447_ref_022">2014</xref>; Paulavičius <italic>et al.</italic>, <xref ref-type="bibr" rid="j_infor447_ref_025">2020a</xref>, <xref ref-type="bibr" rid="j_infor447_ref_026">2020b</xref>; Pistikopoulos <italic>et al.</italic>, <xref ref-type="bibr" rid="j_infor447_ref_027">2015</xref>). Internally, these tools use the combination of a mathematical model with an appropriate solution algorithm (e.g. Cosma <italic>et al.</italic>, <xref ref-type="bibr" rid="j_infor447_ref_003">2020</xref>; Fernández <italic>et al.</italic>, <xref ref-type="bibr" rid="j_infor447_ref_006">2020</xref>; Gómez <italic>et al.</italic>, <xref ref-type="bibr" rid="j_infor447_ref_013">2019</xref>; Lee <italic>et al.</italic>, <xref ref-type="bibr" rid="j_infor447_ref_019">2019</xref>; Paulavičius and Žilinskas, <xref ref-type="bibr" rid="j_infor447_ref_022">2014</xref>; Paulavičius <italic>et al.</italic>, <xref ref-type="bibr" rid="j_infor447_ref_024">2014</xref>; Paulavičius and Adjiman, <xref ref-type="bibr" rid="j_infor447_ref_023">2020</xref>; Stripinis <italic>et al.</italic>, <xref ref-type="bibr" rid="j_infor447_ref_030">2019</xref>, <xref ref-type="bibr" rid="j_infor447_ref_031">2021</xref>) to solve the problem at hand. Thus, the way mathematical models are formulated is critical to the impact of optimization in real life.</p>
<p>Mathematical modelling is the process of translating real-world business problems into mathematical formulations whose theoretical and numerical analysis can provide insight, answers, and guidance beneficial for the originating application (Kallrath, <xref ref-type="bibr" rid="j_infor447_ref_018">2004</xref>), including the current Covid-19 pandemic (Rothberg, <xref ref-type="bibr" rid="j_infor447_ref_029">2020</xref>). Algebraic modelling languages (AMLs) are declarative optimization modelling languages, which bridge the gap between model formulation and the proper solution technique (Fragniere and Gondzio, <xref ref-type="bibr" rid="j_infor447_ref_010">2002</xref>). They enable the formulation of a mathematical model as a human-readable set of equations while not requiring to specify how the described model should be solved or what specific solver should be used.</p>
<p>Models written in an AML are known for the high degree of similarity to the mathematical formulation. This aspect distinguishes AMLs from other types of modelling languages, like object-oriented (e.g. <monospace>OptimJ</monospace>), solver specific (e.g. <monospace>LINGO</monospace>), or general-purpose (e.g. <monospace>TOMLAB</monospace>) modelling languages. Such an algebraic design approach allows practitioners without specific programming or modelling knowledge to be efficient in describing the problems to be solved. It is also important to note that AML is then responsible for creating a problem instance that a solution algorithm can tackle (Kallrath, <xref ref-type="bibr" rid="j_infor447_ref_018">2004</xref>). Since many AMLs are integral parts of a specific modelling system, it is essential to isolate a modelling language’s responsibilities from the overall system. In general, AMLs are sophisticated software packages that provide a crucial link between an optimization model’s mathematical concept and the complex algorithmic routines that compute optimal solutions. Typically, AML software automatically reads a model and data, generates an instance, and conveys it to a solver in the required form (Fourer, <xref ref-type="bibr" rid="j_infor447_ref_008">2013</xref>).</p>
<p>From the late 1970s, many AMLs were created (e.g., <monospace>GAMS</monospace>, McCarl <italic>et al.</italic>, <xref ref-type="bibr" rid="j_infor447_ref_021">2016</xref>, <monospace>AMPL</monospace>, Fourer, <xref ref-type="bibr" rid="j_infor447_ref_007">2003</xref>) and are still actively developed and used today. Lately, new open-source competitors to the traditional AMLs started to emerge (e.g., <monospace>Pyomo</monospace>, Hart <italic>et al.</italic>, <xref ref-type="bibr" rid="j_infor447_ref_015">2017</xref>, <xref ref-type="bibr" rid="j_infor447_ref_014">2011</xref>, <monospace>JuMP</monospace>, Dunning <italic>et al.</italic>, <xref ref-type="bibr" rid="j_infor447_ref_005">2017</xref>; Lubin and Dunning, <xref ref-type="bibr" rid="j_infor447_ref_020">2015</xref>). Therefore, we feel that a review and comparison of the traditional and emerging AMLs are needed to examine how the current landscape of AMLs looks.</p>
<p>The remainder of the paper is organized as follows. In Section <xref rid="j_infor447_s_002">2</xref>, we review the essential characteristics of AMLs and motivate our selection of AMLs for the current review. In Section <xref rid="j_infor447_s_003">3</xref>, we investigate how the requirements for a modern AML are met within each of the chosen languages. In Section <xref rid="j_infor447_s_006">4</xref>, we examine the characteristics of AMLs using an extensive benchmark. In Section <xref rid="j_infor447_s_010">5</xref>, we investigate the presolve impact on solving. Finally, we conclude the paper in Section <xref rid="j_infor447_s_013">6</xref>.</p>
</sec>
<sec id="j_infor447_s_002">
<label>2</label>
<title>Algebraic Modelling Languages</title>
<p>The first algebraic modelling languages, developed in the late 1970s, were game-changers. They allowed separating the model formulation from the implementation details (Kallrath, <xref ref-type="bibr" rid="j_infor447_ref_018">2004</xref>) while keeping the notation close to the problem’s mathematical formulation (Fragniere and Gondzio, <xref ref-type="bibr" rid="j_infor447_ref_010">2002</xref>). Since the data appears to be more volatile than the problem structure, most modelling language designers insist on the data and model structure being separated (Hürlimann, <xref ref-type="bibr" rid="j_infor447_ref_016">1999</xref>). Therefore, the central idea in modern AMLs is the differentiation between abstract models and concrete problem instances (Hart <italic>et al.</italic>, <xref ref-type="bibr" rid="j_infor447_ref_014">2011</xref>). A specific model instance is generated from an abstract model using data. This way, the model and data together specify a particular instance of an optimization problem for which a solution can be sought. This is realized by replicating every entity of an abstract model over the different elements of the data set. Such a feature often is referred to as a set-indexing ability of the AML (Fragniere and Gondzio, <xref ref-type="bibr" rid="j_infor447_ref_010">2002</xref>).</p>
<p>Essential characteristics of a modern AML could be defined in the following way (Kallrath, <xref ref-type="bibr" rid="j_infor447_ref_018">2004</xref>): 
<list>
<list-item id="j_infor447_li_001">
<label>1.</label>
<p>problems are represented in a declarative<xref ref-type="fn" rid="j_infor447_fn_001">1</xref><fn id="j_infor447_fn_001"><label><sup>1</sup></label>
<p>Specifying the problem’s properties: space, set of constraints and optimality requirements.</p></fn> way;</p>
</list-item>
<list-item id="j_infor447_li_002">
<label>2.</label>
<p>there is a clear separation between problem definition and the solution process;</p>
</list-item>
<list-item id="j_infor447_li_003">
<label>3.</label>
<p>there is a clear separation between the problem structure and its data.</p>
</list-item>
</list> 
Besides, the support for mathematical expressions and operations needed for describing non-linear models is often considered an important feature of an AML (Kallrath, <xref ref-type="bibr" rid="j_infor447_ref_018">2004</xref>). Moreover, it is worth observing that most interpreters included in today’s AMLs are based on automatic differentiation (Fragniere and Gondzio, <xref ref-type="bibr" rid="j_infor447_ref_010">2002</xref>), a process in which the modeling language can compute the derivatives of problems from the model description without the assistance of the user (Kallrath, <xref ref-type="bibr" rid="j_infor447_ref_018">2004</xref>). This motivates us to include automatic differentiation as an additional, important feature of a modern AML.</p>
<p>The algebraic expressions are useful in describing individual models and describing manipulations on models and transformations of data. Thus, almost as soon as AML became available, users started finding ways to adapt model notations to implement sophisticated solution strategies and iterative schemes. These efforts stimulated the evolution within AMLs of scripting features, including statements for looping, testing, and assignment (Fourer, <xref ref-type="bibr" rid="j_infor447_ref_008">2013</xref>). Therefore, scripting capabilities are an integral part of AMLs.</p>
<p>For this review, we have chosen five AMLs: <monospace>AIMMS</monospace>, <monospace>AMPL</monospace>, <monospace>GAMS</monospace>, <monospace>JuMP</monospace>, and <monospace>Pyomo</monospace>. The selection was based on the following criteria:</p>
<list>
<list-item id="j_infor447_li_004">
<label>•</label>
<p>AMLs which won 2012 INFORMS Impact Prize award<xref ref-type="fn" rid="j_infor447_fn_002">2</xref><fn id="j_infor447_fn_002"><label><sup>2</sup></label>
<p><ext-link ext-link-type="uri" xlink:href="https://www.informs.org/About-INFORMS/News-Room/Press-Releases/INFORMS-Impact-Prize-2012">https://www.informs.org/About-INFORMS/News-Room/Press-Releases/INFORMS-Impact-Prize-2012</ext-link>.</p></fn> dedicated to the originators of the five most important algebraic modelling languages: <monospace>AIMMS</monospace>, <monospace>AMPL</monospace>, <monospace>GAMS</monospace>, <monospace>LINDO/LINGO</monospace>, and <monospace>MPL</monospace>;</p>
</list-item>
<list-item id="j_infor447_li_005">
<label>•</label>
<p>the popularity of AMLs based on NEOS Server model input statistics for the year 2020;<xref ref-type="fn" rid="j_infor447_fn_003">3</xref><fn id="j_infor447_fn_003"><label><sup>3</sup></label>
<p>NEOS Server. Solver Access Statistics: <uri>https://neos-server.org/neos/report.html</uri>.</p></fn></p>
</list-item>
<list-item id="j_infor447_li_006">
<label>•</label>
<p>open-source options that are attractive for the academic society or in situations where budgets are tight.</p>
</list-item>
</list>
<p>We have chosen to include <monospace>GAMS</monospace> and <monospace>AMPL</monospace> based on NEOS Server popularity, respectively, with 49% and 47% share of jobs executed via the NEOS platform in 2020. <monospace>AIMMS</monospace> was added as an example of AML with a graphical application development environment. <monospace>JuMP</monospace> and <monospace>Pyomo</monospace> were included as the most prominent open-source AMLs. We have decided to exclude <monospace>MPL</monospace> since it has not been updated for the last five years. We have also excluded <monospace>LINGO</monospace> as a solver specific modelling language.</p>
</sec>
<sec id="j_infor447_s_003">
<label>3</label>
<title>Comparative Analysis of AMLs Characteristics</title>
<p>In the following section, we investigate how each of the chosen languages meets the requirements for a modern AML defined in the previous section. The websites of the AMLs and vendor documentation are used for this comparison. Any support of the identified features and capabilities are validated against the documentation the suppliers of the AMLs provide. Besides, an in-depth survey concluded by Robert Fourer in Linear Programming Software Survey (Fourer, <xref ref-type="bibr" rid="j_infor447_ref_009">2017</xref>) is also used as a reference. Later on, a more practical comparison of AML characteristics is conducted to identify the potential ease of use of AML in daily work.</p>
<sec id="j_infor447_s_004">
<label>3.1</label>
<title>Comparative Analysis of the Features</title>
<p>We start by analysing how selected AMLs satisfy the three essential characteristics defined in the previous Section <xref rid="j_infor447_s_002">2</xref>. In all reviewed AMLs, optimization problems are represented in a declarative way. Furthermore, since all of them are part of a specific modelling system, a clear separation between problem definition and the solution process in the context of the modelling system exists. The separation between the problem structure and its data is supported in all reviewed languages. It should be noted that <monospace>GAMS</monospace>, <monospace>JuMP</monospace>, and <monospace>Pyomo</monospace> also allow initiating data structures during their declaration, while <monospace>AIMMS</monospace> and <monospace>AMPL</monospace> only support it as a separate step in the model instance building process. However, while it might be convenient for building a simple model, we do not consider the lack of direct data structure initiation as an advantage since, in real-world cases, it is rarely needed. Therefore, we can conclude that all reviewed languages fulfill the essential characteristics of modern AMLs.</p>
<table-wrap id="j_infor447_tab_001">
<label>Table 1</label>
<caption>
<p>Overviewof AMLs features.</p>
</caption>
<table>
<thead>
<tr>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">Feature</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin"/>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">AIMMS</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">AMPL</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">GAMS</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">JuMP</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">Pyomo</td>
</tr>
</thead>
<tbody>
<tr>
<td style="vertical-align: top; text-align: left">Modelling</td>
<td style="vertical-align: top; text-align: left">Independent</td>
<td style="vertical-align: top; text-align: left">Yes</td>
<td style="vertical-align: top; text-align: left">Yes</td>
<td style="vertical-align: top; text-align: left">Yes</td>
<td style="vertical-align: top; text-align: left">Yes</td>
<td style="vertical-align: top; text-align: left">Yes</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left"/>
<td style="vertical-align: top; text-align: left">Scripting</td>
<td style="vertical-align: top; text-align: left">Yes</td>
<td style="vertical-align: top; text-align: left">Limited</td>
<td style="vertical-align: top; text-align: left">Limited</td>
<td style="vertical-align: top; text-align: left">Yes</td>
<td style="vertical-align: top; text-align: left">Yes</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">Data</td>
<td style="vertical-align: top; text-align: left">Input</td>
<td style="vertical-align: top; text-align: left">Yes</td>
<td style="vertical-align: top; text-align: left">Limited</td>
<td style="vertical-align: top; text-align: left">Limited</td>
<td style="vertical-align: top; text-align: left">Yes</td>
<td style="vertical-align: top; text-align: left">Yes</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left"/>
<td style="vertical-align: top; text-align: left">Manipulation</td>
<td style="vertical-align: top; text-align: left">Yes</td>
<td style="vertical-align: top; text-align: left">No</td>
<td style="vertical-align: top; text-align: left">No</td>
<td style="vertical-align: top; text-align: left">Yes</td>
<td style="vertical-align: top; text-align: left">Yes</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">Solvers</td>
<td style="vertical-align: top; text-align: left">Total</td>
<td style="vertical-align: top; text-align: left">13</td>
<td style="vertical-align: top; text-align: left">47</td>
<td style="vertical-align: top; text-align: left">35</td>
<td style="vertical-align: top; text-align: left">14</td>
<td style="vertical-align: top; text-align: left">25</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left"/>
<td style="vertical-align: top; text-align: left">Global</td>
<td style="vertical-align: top; text-align: left">1</td>
<td style="vertical-align: top; text-align: left">4</td>
<td style="vertical-align: top; text-align: left">9</td>
<td style="vertical-align: top; text-align: left">2</td>
<td style="vertical-align: top; text-align: left">1</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left"/>
<td style="vertical-align: top; text-align: left">LP</td>
<td style="vertical-align: top; text-align: left">8</td>
<td style="vertical-align: top; text-align: left">17</td>
<td style="vertical-align: top; text-align: left">21</td>
<td style="vertical-align: top; text-align: left">9</td>
<td style="vertical-align: top; text-align: left">10</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left"/>
<td style="vertical-align: top; text-align: left">MCP</td>
<td style="vertical-align: top; text-align: left">2</td>
<td style="vertical-align: top; text-align: left">1</td>
<td style="vertical-align: top; text-align: left">5</td>
<td style="vertical-align: top; text-align: left">1</td>
<td style="vertical-align: top; text-align: left">1</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left"/>
<td style="vertical-align: top; text-align: left">MINLP</td>
<td style="vertical-align: top; text-align: left">3</td>
<td style="vertical-align: top; text-align: left">6</td>
<td style="vertical-align: top; text-align: left">15</td>
<td style="vertical-align: top; text-align: left">3</td>
<td style="vertical-align: top; text-align: left">6</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left"/>
<td style="vertical-align: top; text-align: left">MIP</td>
<td style="vertical-align: top; text-align: left">5</td>
<td style="vertical-align: top; text-align: left">14</td>
<td style="vertical-align: top; text-align: left">16</td>
<td style="vertical-align: top; text-align: left">6</td>
<td style="vertical-align: top; text-align: left">8</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left"/>
<td style="vertical-align: top; text-align: left">MIQCP</td>
<td style="vertical-align: top; text-align: left">5</td>
<td style="vertical-align: top; text-align: left">5</td>
<td style="vertical-align: top; text-align: left">20</td>
<td style="vertical-align: top; text-align: left">3</td>
<td style="vertical-align: top; text-align: left">4</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left"/>
<td style="vertical-align: top; text-align: left">NLP</td>
<td style="vertical-align: top; text-align: left">6</td>
<td style="vertical-align: top; text-align: left">19</td>
<td style="vertical-align: top; text-align: left">17</td>
<td style="vertical-align: top; text-align: left">7</td>
<td style="vertical-align: top; text-align: left">10</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left"/>
<td style="vertical-align: top; text-align: left">QCP</td>
<td style="vertical-align: top; text-align: left">6</td>
<td style="vertical-align: top; text-align: left">9</td>
<td style="vertical-align: top; text-align: left">21</td>
<td style="vertical-align: top; text-align: left">6</td>
<td style="vertical-align: top; text-align: left">6</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">Presolving</td>
<td style="vertical-align: top; text-align: left"/>
<td style="vertical-align: top; text-align: left">Yes</td>
<td style="vertical-align: top; text-align: left">Yes</td>
<td style="vertical-align: top; text-align: left">No</td>
<td style="vertical-align: top; text-align: left">No</td>
<td style="vertical-align: top; text-align: left">No</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">Visualization</td>
<td style="vertical-align: top; text-align: left"/>
<td style="vertical-align: top; text-align: left">Yes</td>
<td style="vertical-align: top; text-align: left">No</td>
<td style="vertical-align: top; text-align: left">No</td>
<td style="vertical-align: top; text-align: left">No</td>
<td style="vertical-align: top; text-align: left">No</td>
</tr>
<tr>
<td rowspan="2" style="vertical-align: middle; text-align: left; border-bottom: solid thin">License</td>
<td style="vertical-align: top; text-align: left">General</td>
<td style="vertical-align: top; text-align: left">Paid</td>
<td style="vertical-align: top; text-align: left">Paid</td>
<td style="vertical-align: top; text-align: left">Paid</td>
<td style="vertical-align: top; text-align: left">Free</td>
<td style="vertical-align: top; text-align: left">Free</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">Academic</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">Paid</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">Free</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">Free</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">Free</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">Free</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>Next, in Table <xref rid="j_infor447_tab_001">1</xref>, we provide an overview of the key features each AML supports. For creating such a summary, we used the information provided by the AML vendors on their websites. All reviewed AMLs allow modelling problems in a solver independent manner. Additionally, <monospace>AIMMS</monospace>, <monospace>JuMP</monospace>, and <monospace>Pyomo</monospace> provide a more powerful way to define advanced algorithms using R, Julia, or Python programming languages. The ease of data input for the model differs among AMLs. While all of them support input from a flat file, some more advanced scenarios such as reading data from relational databases are more straightforward in <monospace>AIMMS</monospace>, <monospace>JuMP</monospace>, or <monospace>Pyomo</monospace>. <monospace>AMPL</monospace> and <monospace>GAMS</monospace> require a complicated setup instead (e.g. using ODBC drivers) to access the database. Wherein <monospace>JuMP</monospace> or <monospace>Pyomo</monospace>, a standard Julia or Python driver could be used to get data from relational and any other type of database supported by Python or Julia. Manipulation (e.g. transformation) of data is only supported by <monospace>AIMMS</monospace>, <monospace>JuMP</monospace>, and <monospace>Pyomo</monospace>.</p>
<p>When it comes to solver support, <monospace>AMPL</monospace> is the one supporting the most. However, it should be noticed that the categorization of solvers by supported problem types is different among vendors. Thus, in this comparison, we have reflected the information available from vendors harmonizing it across all of them. Solvers supported by <monospace>JuMP</monospace> and <monospace>Pyomo</monospace> require additional explanation. First, both AMLs support solvers compatible with <monospace>AMPL</monospace> (via AmplNLWriter package or ASL interface). Therefore, any solver that is equipped with an <monospace>AMPL</monospace> interface can be used by <monospace>JuMP</monospace> or <monospace>Pyomo</monospace>. This could allow us to state that <monospace>JuMP</monospace> and <monospace>Pyomo</monospace> support all <monospace>AMPL</monospace> solvers. However, we have excluded solvers supported via the <monospace>AMPL</monospace> interface. It might be needed for some commercial solvers to request a particular version from the solver’s vendor that comes with the <monospace>AMPL</monospace> interface. Second, since both AMLs are open-source, multiple third-party packages add support for specific solvers for each of AMLs. In Section <xref rid="j_infor447_tab_001">1</xref>, we counted only the solvers mentioned on the official <monospace>JuMP</monospace> and <monospace>Pyomo</monospace> websites.</p>
<p>Presolving capabilities are only available in <monospace>AIMMS</monospace> and <monospace>AMPL</monospace>. <monospace>JuMP</monospace> and <monospace>Pyomo</monospace> have programming interfaces for creating custom presolvers, however, none of them are provided out of the box. Only <monospace>AIMMS</monospace> provides a visualization of the solver results out of the box. Using Python or Julia libraries, it is possible to visualize the results produced by <monospace>Pyomo</monospace> and <monospace>JuMP</monospace>. However, it requires custom development, and none of the standard <monospace>JuMP</monospace> or <monospace>Pyomo</monospace> libraries are supporting that.</p>
<p>It is important to conclude that <monospace>JuMP</monospace> and <monospace>Pyomo</monospace> are open-source AMLs built on top of general-purpose programming languages, making them fundamentally different from the competitors. This allows researchers familiar with Julia or Python to learn, improve, and use <monospace>JuMP</monospace> or <monospace>Pyomo</monospace> much more comfortably. At the same time, it is practically impossible to introduce improvements to commercial counterparts.</p>
</sec>
<sec id="j_infor447_s_005">
<label>3.2</label>
<title>Practical Comparison of AMLs</title>
<p>For the first practical comparison of the selected AMLs, a classical Dantzig Transportation Problem was chosen (Dantzig, <xref ref-type="bibr" rid="j_infor447_ref_004">1963</xref>). In this problem, we are given the factories’ supplies and the markets’ demands for a single commodity. We have also given the unit costs of shipping the product from factories to the markets. The goal is to find the least costly shipping schedule that meets the requirements at markets and supplies at factories.</p>
<p>The transportation problem formulated as a model in all five considered AML is compared based on the following criteria:</p>
<list>
<list-item id="j_infor447_li_007">
<label>•</label>
<p>model size in bytes;</p>
</list-item>
<list-item id="j_infor447_li_008">
<label>•</label>
<p>model size in the number of code lines;</p>
</list-item>
<list-item id="j_infor447_li_009">
<label>•</label>
<p>model size in the number of language primitives used;</p>
</list-item>
<list-item id="j_infor447_li_010">
<label>•</label>
<p>model instance creation time.</p>
</list-item>
</list>
<p>Since the transportation problem is a linear programming (LP) type of problem, we have chosen to measure the model instance creation time as the time needed to export a concrete model instance to <monospace>MPS</monospace><xref ref-type="fn" rid="j_infor447_fn_004">4</xref><fn id="j_infor447_fn_004"><label><sup>4</sup></label>
<p><uri>http://lpsolve.sourceforge.net/5.5/mps-format.htm</uri>.</p></fn> format supported by most LP solvers. The following sources provided sample implementations of the transportation problem for the AMLs under consideration: 
<list>
<list-item id="j_infor447_li_011">
<label>•</label>
<p>AIMMS Wikipedia page;<xref ref-type="fn" rid="j_infor447_fn_005">5</xref><fn id="j_infor447_fn_005"><label><sup>5</sup></label>
<p><uri>https://en.wikipedia.org/w/index.php?title=AIMMS&amp;oldid=836119826</uri>.</p></fn></p>
</list-item>
<list-item id="j_infor447_li_012">
<label>•</label>
<p>AMPL model in GNU Linear Programming Kit;<xref ref-type="fn" rid="j_infor447_fn_006">6</xref><fn id="j_infor447_fn_006"><label><sup>6</sup></label>
<p><uri>https://github.com/cran/glpk/blob/master/inst/doc/transport.mod</uri>.</p></fn></p>
</list-item>
<list-item id="j_infor447_li_013">
<label>•</label>
<p>GAMS Model Library;<xref ref-type="fn" rid="j_infor447_fn_007">7</xref><fn id="j_infor447_fn_007"><label><sup>7</sup></label>
<p><uri>https://www.gams.com/latest/gamslib_ml/libhtml/index.html</uri>.</p></fn></p>
</list-item>
<list-item id="j_infor447_li_014">
<label>•</label>
<p>JuMP Examples;<xref ref-type="fn" rid="j_infor447_fn_008">8</xref><fn id="j_infor447_fn_008"><label><sup>8</sup></label>
<p><uri>https://github.com/jump-dev/JuMP.jl/tree/master/examples</uri>.</p></fn></p>
</list-item>
<list-item id="j_infor447_li_015">
<label>•</label>
<p>Pyomo Gallery.<xref ref-type="fn" rid="j_infor447_fn_009">9</xref><fn id="j_infor447_fn_009"><label><sup>9</sup></label>
<p><uri>https://github.com/Pyomo/PyomoGallery</uri>.</p></fn></p>
</list-item>
</list> 
Transportation problem models in all five AMLs are given in Appendix <xref rid="j_infor447_app_002">B</xref>, Listings <xref rid="j_infor447_fig_005">3</xref>–<xref rid="j_infor447_fig_008">6</xref>. It should be noted that the textual representation of an <monospace>AIMMS</monospace> model presents the model as a tree of attributed identifier nodes. It reflects how the model is given to the modeller in the <monospace>AIMMS</monospace> IDE and is typically generated by the <monospace>AIMMS</monospace> IDE. Moreover, it is worth noting that for the sake of simplicity, the problem model samples are concrete models, i.e. data of the model instance is described alongside the model structure.</p>
<table-wrap id="j_infor447_tab_002">
<label>Table 2</label>
<caption>
<p>Comparison of transportation problem models.</p>
</caption>
<table>
<thead>
<tr>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">Criteria</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">AIMMS</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">AMPL</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">GAMS</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">JuMP</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">Pyomo</td>
</tr>
</thead>
<tbody>
<tr>
<td style="vertical-align: top; text-align: left">Size in bytes</td>
<td style="vertical-align: top; text-align: left">2229</td>
<td style="vertical-align: top; text-align: left">683</td>
<td style="vertical-align: top; text-align: left">652</td>
<td style="vertical-align: top; text-align: left">632</td>
<td style="vertical-align: top; text-align: left">1235</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">Lines of code</td>
<td style="vertical-align: top; text-align: left">68</td>
<td style="vertical-align: top; text-align: left">24</td>
<td style="vertical-align: top; text-align: left">31</td>
<td style="vertical-align: top; text-align: left">18</td>
<td style="vertical-align: top; text-align: left">29</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">Primitives used</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">9</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">5</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">8</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">4</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">6</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>A comparison of the sample Transportation Problem model’s characteristics in all reviewed AMLs is given in Table <xref rid="j_infor447_tab_002">2</xref>. The simplification of the model implementations provided in the literature sources is made in the following way:</p>
<list>
<list-item id="j_infor447_li_016">
<label>•</label>
<p>all optional comments, explanatory texts, and documentation are removed;</p>
</list-item>
<list-item id="j_infor447_li_017">
<label>•</label>
<p>all empty lines are excluded;</p>
</list-item>
<list-item id="j_infor447_li_018">
<label>•</label>
<p>parts of the code responsible for calling the solver and displaying results are omitted;</p>
</list-item>
<list-item id="j_infor447_li_019">
<label>•</label>
<p>while counting AML primitives generic functions (<italic>sum</italic>, <italic>for</italic>), data loading directives (<italic>data</italic>), arithmetical and logical operators are excluded.</p>
</list-item>
</list>
<p>It can be seen from Table <xref rid="j_infor447_tab_002">2</xref> that models implemented in <monospace>AMPL</monospace>, <monospace>GAMS</monospace>, and <monospace>JuMP</monospace> are the most compact ones, while the model written in <monospace>AIMMS</monospace> is much more verbose, and <monospace>Pyomo</monospace> lies in the middle. <monospace>AIMMS</monospace> propagates the creation of models using a graphical user interface (GUI) while keeping the model’s source code hidden from the modeller. Naturally, there is not much focus on how the model is stored. We can argue that while the GUI-based approach might be convenient to some modellers, it enforces greater vendor lock-in and makes the model’s extensibility and maintainability harder.</p>
<p>While comparing the number of language primitives required to create a model, <monospace>JuMP</monospace> and <monospace>AMPL</monospace> showed the best results, which allows us to predict that these modelling languages might have a more gentle learning curve. Therefore, we can conclude that in the context of the reviewed algebraic modelling languages, <monospace>JuMP</monospace> allows formulating an optimization problem most concisely.</p>
<p>The creation time of the transportation problem model instance defined in each AMLs was used to measure a model loading. The process was done in the following steps: 
<list>
<list-item id="j_infor447_li_020">
<label>1.</label>
<p>loading model instance from a problem definition written in the native AML;</p>
</list-item>
<list-item id="j_infor447_li_021">
<label>2.</label>
<p>exporting model instance to MPS format;</p>
</list-item>
<list-item id="j_infor447_li_022">
<label>3.</label>
<p>measuring total execution time;</p>
</list-item>
<list-item id="j_infor447_li_023">
<label>4.</label>
<p>investigating characteristics of an instance model.</p>
</list-item>
</list> 
Since the <monospace>AIMMS</monospace> system’s creators did not respond to an academic license request, we could not include <monospace>AIMMS</monospace> in the benchmark. Generated model instances in MPS format can be found in our GitHub repository’s <monospace>models</monospace> directory (Jusevičius and Paulavičius, <xref ref-type="bibr" rid="j_infor447_ref_017">2019</xref>).</p>
<table-wrap id="j_infor447_tab_003">
<label>Table 3</label>
<caption>
<p>Characteristics of the created transportation model instances.</p>
</caption>
<table>
<thead>
<tr>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">Characteristic</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">AMPL</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">GAMS</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">JuMP</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">Pyomo</td>
</tr>
</thead>
<tbody>
<tr>
<td style="vertical-align: top; text-align: left">Constraints</td>
<td style="vertical-align: top; text-align: left">6</td>
<td style="vertical-align: top; text-align: left">6</td>
<td style="vertical-align: top; text-align: left">6</td>
<td style="vertical-align: top; text-align: left">6</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">Non zero elements</td>
<td style="vertical-align: top; text-align: left">13</td>
<td style="vertical-align: top; text-align: left">19</td>
<td style="vertical-align: top; text-align: left">13</td>
<td style="vertical-align: top; text-align: left">13</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">Variables</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">7</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">7</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">7</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">7</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>The characteristics of the created model instances can be seen in Table <xref rid="j_infor447_tab_003">3</xref>. We can conclude that all modelling languages have created a model instance using the same amount of variables and constraints. However, the definition of nonzero elements is different between <monospace>GAMS</monospace> and other modelling systems.</p>
<table-wrap id="j_infor447_tab_004">
<label>Table 4</label>
<caption>
<p>Total time of consecutive transportation model instance creation runs.</p>
</caption>
<table>
<thead>
<tr>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">No. of runs</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">AMPL</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">GAMS</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">JuMP</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">Pyomo</td>
</tr>
</thead>
<tbody>
<tr>
<td style="vertical-align: top; text-align: left">1 run</td>
<td style="vertical-align: top; text-align: left">30 ms</td>
<td style="vertical-align: top; text-align: left">170 ms</td>
<td style="vertical-align: top; text-align: left">28341 ms</td>
<td style="vertical-align: top; text-align: left">720 ms</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">10 runs</td>
<td style="vertical-align: top; text-align: left">220 ms</td>
<td style="vertical-align: top; text-align: left">1730 ms</td>
<td style="vertical-align: top; text-align: left">32199 ms</td>
<td style="vertical-align: top; text-align: left">7280 ms</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">100 runs</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">2130 ms</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">16490 ms</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">58151 ms</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">79600 ms</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>In Table <xref rid="j_infor447_tab_004">4</xref>, the benchmark results of model instance creation time are provided. We have tried to run multiple consecutive model instance creations (10 runs, 100 runs) to identify if the modelling system uses any caching. We can exhibit that <monospace>AMPL</monospace> showed significantly better results compared to others. This allows concluding that <monospace>AMPL</monospace> is the most optimized from a performance point of view. On the other hand, the poor <monospace>JuMP</monospace> performance confirms the Dunning <italic>et al.</italic> (<xref ref-type="bibr" rid="j_infor447_ref_005">2017</xref>) statement that JuMP has a noticeable start-up cost<xref ref-type="fn" rid="j_infor447_fn_010">10</xref><fn id="j_infor447_fn_010"><label><sup>10</sup></label>
<p>Start-up cost consists of the precompilation and caching time required to prepare JuMP environment.</p></fn> of a few seconds even for the smallest instances. In our case, only the initialization of the <monospace>JuMP</monospace> package took around 7 seconds. We also observed a significant speed-up in multiple consecutive model instances creation, which also confirms (Dunning <italic>et al.</italic>, <xref ref-type="bibr" rid="j_infor447_ref_005">2017</xref>) results. When a family of models is solved multiple times within a single session, this compilation cost is only paid for the first time that an instance is solved.</p>
</sec>
</sec>
<sec id="j_infor447_s_006">
<label>4</label>
<title>Performance Benchmark of AMLs</title>
<p>All examined AMLs support all types of traditional optimization problems; however, it is unclear how efficiently each AML can handle large model loading and what optimizations are applied during model instance creation. It would also be of great value to analyse how each of the modelling languages performs within an area of the specific type of optimization problems (e.g. linear, quadratic, nonlinear, mixed-integer). To give such a comparison and thoroughly examine characteristics of AMLs, a more extensive benchmark involving much larger optimization problem models is needed. Therefore, a large and extensive library of sample optimization problems for the analysed AMLs has to be used.</p>
<sec id="j_infor447_s_007">
<label>4.1</label>
<title>AMLs Testing Library</title>
<p>We have chosen the GAMS Model Library<xref ref-type="fn" rid="j_infor447_fn_011">11</xref><fn id="j_infor447_fn_011"><label><sup>11</sup></label>
<p><uri>https://www.gams.com/latest/gamslib_ml/libhtml/index.html</uri>.</p></fn> as a reference for creating such a sample optimization problem suite against which future research will be done. Automated shell script <monospace>gamslib-convert.sh</monospace> was created to build such a library. It can be found in the <monospace>tools</monospace> directory of our GitHub repository (Jusevičius and Paulavičius, <xref ref-type="bibr" rid="j_infor447_ref_017">2019</xref>). A detailed explanation of how the test library creation tool works and the issues identified in the GAMS Library are provided in Appendix <xref rid="j_infor447_app_001">A</xref>. As a result of the transformation, we compiled a library consisting of 296 sample problems in <monospace>AMPL</monospace>, <monospace>GAMS</monospace>, <monospace>JuMP</monospace>, and <monospace>Pyomo</monospace> scalar model formats.</p>
</sec>
<sec id="j_infor447_s_008">
<label>4.2</label>
<title>Model Instance Creation Time</title>
<p>The generated library was used to determine the amount of time each modelling system requires to create a model instance of a particular problem. We wrote <monospace>load-benchmark.sh</monospace> shell script available in the <monospace>tools</monospace> directory of our GitHub repository (Jusevičius and Paulavičius, <xref ref-type="bibr" rid="j_infor447_ref_017">2019</xref>), which loads each model into the particular modelling system and then exports it to the format understandable by the solvers. We have chosen the <italic>.nl</italic> (Gay, <xref ref-type="bibr" rid="j_infor447_ref_011">2005</xref>) format as the target format acceptable by the solvers, as <italic>.nl</italic> supports a wide range of optimization problem types. The benchmark measures the time the modelling system takes to perform both model instance creation and export operations.</p>
<p>We have chosen to exclude sample problems with conversion errors from the benchmark (more information about them in Appendix <xref rid="j_infor447_app_001">A</xref>). Only the models that were successfully processed by all modelling systems were compared. This reduced the scope of our benchmark to 268 models.</p>
<fig id="j_infor447_fig_001">
<label>Fig. 1</label>
<caption>
<p>Average model instance creation time.</p>
</caption>
<graphic xlink:href="infor447_g001.jpg"/>
</fig>
<fig id="j_infor447_fig_002">
<label>Fig. 2</label>
<caption>
<p>Average large model instance creation time</p>
</caption>
<graphic xlink:href="infor447_g002.jpg"/>
</fig>
<p>Benchmark methodology, hardware, and software specifications can be found in our GitHub repository (Jusevičius and Paulavičius, <xref ref-type="bibr" rid="j_infor447_ref_017">2019</xref>). Detailed results are available in the <monospace>model-loading-times.xlsx</monospace> workbook in the benchmark section of our GitHub repository (Jusevičius and Paulavičius, <xref ref-type="bibr" rid="j_infor447_ref_017">2019</xref>). We have provided a summary of the average model instance creation time split by the problem type in Fig. <xref rid="j_infor447_fig_001">1</xref>. We can see the trend exhibited in the transportation problem model benchmark persists. <monospace>AMPL</monospace> is still a definite top performer, while <monospace>JuMP</monospace> and <monospace>Pyomo</monospace> perform the worst. There are no significant variations between different optimization problem types except for <monospace>JuMP</monospace>, where the model instance creation time tends to vary significantly while working with different types of problems. Moreover, as confidence intervals show, the variation between different models of the same type is also more significant once using <monospace>JuMP</monospace> We tend to believe this is caused by Julia’s dynamic nature and the mix of run time compilation and caching of similar <monospace>JuMP</monospace> models.</p>
<p>We have observed that the average difference between <monospace>AMPL</monospace> and other contenders increases when the models become larger. Comparing instance creation times of large models (models having more than 500 equations, 8 such models in the testing library) reveals 11 times the difference between <monospace>AMPL</monospace> and <monospace>GAMS</monospace>, 38 times the difference between <monospace>AMPL</monospace> and <monospace>Pyomo</monospace>, and close to 100 times the difference between <monospace>AMPL</monospace> and <monospace>JuMP</monospace>. The difference between <monospace>GAMS</monospace> and <monospace>Pyomo</monospace> stayed roughly the same – around 3.5 times. The summary of the large model instance creation time can be seen in Fig. <xref rid="j_infor447_fig_002">2</xref>.</p>
<p>Thus, we can conclude that out of the reviewed AMLs, <monospace>AMPL</monospace> is a clear top-performing AML when it comes to the model instance creation time.</p>
</sec>
<sec id="j_infor447_s_009">
<label>4.3</label>
<title>JuMP Benchmark</title>
<p>A similar time benchmark of the model instance creation has already been conducted (Dunning <italic>et al.</italic>, <xref ref-type="bibr" rid="j_infor447_ref_005">2017</xref>), where a smaller set of large models is used. While some of the trends exhibited in our benchmark persist (<monospace>AMPL</monospace> is the fastest, <monospace>GAMS</monospace> comes second), <monospace>JuMP</monospace> performance in our and Dunning <italic>et al.</italic> (<xref ref-type="bibr" rid="j_infor447_ref_005">2017</xref>) benchmarks differs significantly. This leads us to compare the benchmark methodology and results by conducting the benchmark described by Dunning <italic>et al.</italic> (<xref ref-type="bibr" rid="j_infor447_ref_005">2017</xref>).</p>
<p>First of all, our and their time benchmark methodologies differ. In comparison, we are trying to be solver independent and instruct AML to export the generated model instance to NL file, Dunning <italic>et al.</italic> (<xref ref-type="bibr" rid="j_infor447_ref_005">2017</xref>) attempt to solve the model using <monospace>Gurobi</monospace> solver and measure the time until Gurobi reports model characteristics. We believe that while our approach can be impacted by the system’s input/output performance, using a specific solver heavily depends on how the solver interface is implemented for a particular AML.</p>
<p>In the following, we have conducted two benchmarks – one as described in the original article and the second one using our method of exporting to a NL file. Results of the benchmarks can be seen in Tables <xref rid="j_infor447_tab_005">5</xref>, <xref rid="j_infor447_tab_006">6</xref>.</p>
<table-wrap id="j_infor447_tab_005">
<label>Table 5</label>
<caption>
<p>JuMP benchmark using Dunning <italic>et al.</italic> (<xref ref-type="bibr" rid="j_infor447_ref_005">2017</xref>) method (in milliseconds).</p>
</caption>
<table>
<thead>
<tr>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">Model</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">AMPL</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">GAMS</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">Pyomo</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">JuMP (DIRECT)</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">JuMP (CACHE)</td>
</tr>
</thead>
<tbody>
<tr>
<td style="vertical-align: top; text-align: left">lqcp-500</td>
<td style="vertical-align: top; text-align: left">2093</td>
<td style="vertical-align: top; text-align: left">2271</td>
<td style="vertical-align: top; text-align: left">17000</td>
<td style="vertical-align: top; text-align: left">17388</td>
<td style="vertical-align: top; text-align: left">37317</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">lqcp-1000</td>
<td style="vertical-align: top; text-align: left">8075</td>
<td style="vertical-align: top; text-align: left">11995</td>
<td style="vertical-align: top; text-align: left">139201</td>
<td style="vertical-align: top; text-align: left">24590</td>
<td style="vertical-align: top; text-align: left">44575</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">lqcp-1500</td>
<td style="vertical-align: top; text-align: left">18222</td>
<td style="vertical-align: top; text-align: left">38813</td>
<td style="vertical-align: top; text-align: left">322604</td>
<td style="vertical-align: top; text-align: left">39370</td>
<td style="vertical-align: top; text-align: left">66566</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">lqcp-2000</td>
<td style="vertical-align: top; text-align: left">32615</td>
<td style="vertical-align: top; text-align: left">93586</td>
<td style="vertical-align: top; text-align: left">575406</td>
<td style="vertical-align: top; text-align: left">57597</td>
<td style="vertical-align: top; text-align: left">88833</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">fac-25</td>
<td style="vertical-align: top; text-align: left">407</td>
<td style="vertical-align: top; text-align: left">480</td>
<td style="vertical-align: top; text-align: left">7442</td>
<td style="vertical-align: top; text-align: left">17517</td>
<td style="vertical-align: top; text-align: left">39245</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">fac-50</td>
<td style="vertical-align: top; text-align: left">2732</td>
<td style="vertical-align: top; text-align: left">2884</td>
<td style="vertical-align: top; text-align: left">43106</td>
<td style="vertical-align: top; text-align: left">21331</td>
<td style="vertical-align: top; text-align: left">47735</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">fac-75</td>
<td style="vertical-align: top; text-align: left">9052</td>
<td style="vertical-align: top; text-align: left">12422</td>
<td style="vertical-align: top; text-align: left">150550</td>
<td style="vertical-align: top; text-align: left">31582</td>
<td style="vertical-align: top; text-align: left">57432</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">fac-100</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">20998</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">29144</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">393200</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">61326</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">93129</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>Before running the benchmarks, we had to rewrite some parts of the sample <monospace>lqcp</monospace> and <monospace>facility</monospace> JuMP models since syntax changes were introduced between JuMP v0.12 (used by Dunning <italic>et al.</italic> (<xref ref-type="bibr" rid="j_infor447_ref_005">2017</xref>)) and JuMP v0.21.5 (used by us, the latest version at the time of writing). Our benchmark was also conducted using newer versions of other AMLs–AMPL Version 20190207, GAMS v.32, Pyomo 5.7 (Python 3.8.3), Gurobi 9.0.</p>
<p>Additionally, we wanted to test JuMP’s new abstraction layer’s performance for working with solvers called MathOptInterface.jl (MOI). Therefore, we have tried both <monospace>CachingOptimizer</monospace> and <monospace>DIRECT</monospace> modes. As seen in Table <xref rid="j_infor447_tab_005">5</xref>, the <monospace>DIRECT</monospace> mode performed much better than the <monospace>CachingOptimizer</monospace> mode for both <monospace>lqcp</monospace> and <monospace>facility</monospace> models. An average difference in the instance creation time is close to two times, which leads us to suggest modellers evaluate MOI type choice based on specific use cases carefully.</p>
<table-wrap id="j_infor447_tab_006">
<label>Table 6</label>
<caption>
<p>JuMP benchmark using export to NL method (in milliseconds).</p>
</caption>
<table>
<thead>
<tr>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">Model</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">AMPL</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">GAMS</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">Pyomo</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">JuMP</td>
</tr>
</thead>
<tbody>
<tr>
<td style="vertical-align: top; text-align: left">lqcp-500</td>
<td style="vertical-align: top; text-align: left">2716</td>
<td style="vertical-align: top; text-align: left">3265</td>
<td style="vertical-align: top; text-align: left">39988</td>
<td style="vertical-align: top; text-align: left">20424</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">lqcp-1000</td>
<td style="vertical-align: top; text-align: left">10503</td>
<td style="vertical-align: top; text-align: left">14394</td>
<td style="vertical-align: top; text-align: left">161404</td>
<td style="vertical-align: top; text-align: left">80578</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">lqcp-1500</td>
<td style="vertical-align: top; text-align: left">25402</td>
<td style="vertical-align: top; text-align: left">49822</td>
<td style="vertical-align: top; text-align: left">307121</td>
<td style="vertical-align: top; text-align: left">483268</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">lqcp-2000</td>
<td style="vertical-align: top; text-align: left">42780</td>
<td style="vertical-align: top; text-align: left">125564</td>
<td style="vertical-align: top; text-align: left">&gt;10 min</td>
<td style="vertical-align: top; text-align: left">&gt;10 min</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">fac-25</td>
<td style="vertical-align: top; text-align: left">409</td>
<td style="vertical-align: top; text-align: left">502</td>
<td style="vertical-align: top; text-align: left">9420</td>
<td style="vertical-align: top; text-align: left">8163</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">fac-50</td>
<td style="vertical-align: top; text-align: left">2837</td>
<td style="vertical-align: top; text-align: left">2993</td>
<td style="vertical-align: top; text-align: left">43087</td>
<td style="vertical-align: top; text-align: left">31799</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">fac-75</td>
<td style="vertical-align: top; text-align: left">10879</td>
<td style="vertical-align: top; text-align: left">13457</td>
<td style="vertical-align: top; text-align: left">143286</td>
<td style="vertical-align: top; text-align: left">219548</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">fac-100</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">23474</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">32128</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">328170</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">&gt;10 min</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>Overall, both benchmarks confirmed our observation that <monospace>JuMP</monospace> suffers from the long warm-up time required to pre-compile JuMP libraries. Results were also consistent with the patterns exhibited during the full <monospace>gamslib</monospace> benchmark performed earlier. We could not reproduce the <monospace>JuMP</monospace> performance metrics reported by Dunning <italic>et al.</italic> (<xref ref-type="bibr" rid="j_infor447_ref_005">2017</xref>), where <monospace>JuMP</monospace> always outperforms <monospace>Pyomo</monospace>. Using the original benchmark method, <monospace>JuMP</monospace> outperformed <monospace>Pyomo</monospace> only once the model size increased. However, while using our export to NL file method, <monospace>JuMP</monospace>, on the contrary, started to fall behind <monospace>Pyomo</monospace> once model size increased.</p>
<p>The reported differences between our and the original benchmark (Dunning <italic>et al.</italic>, <xref ref-type="bibr" rid="j_infor447_ref_005">2017</xref>) might be caused by multiple factors such as different <monospace>JuMP</monospace> versions used, improved <monospace>Pyomo</monospace> performance, or different <monospace>Gurobi</monospace> versions. It is important to stress that <monospace>JuMP</monospace> is a very actively developed AML that underwent significant changes during the last years. We think that it could be valuable to explore why the performance could have degraded and the reasons for such slow I/O operations performance revealed during writing to a NL file benchmark.</p>
</sec>
</sec>
<sec id="j_infor447_s_010">
<label>5</label>
<title>Presolving Benchmark</title>
<p>Another performance-related feature of AMLs is the ability to presolve a problem before providing it to the solver. The presolver can preprocess problems and simplify, i.e. reduce the problem size or determine the unfeasible problem. Only two of the reviewed algebraic modelling languages provide presolving capabilities – <monospace>AMPL</monospace> (Fourer, <xref ref-type="bibr" rid="j_infor447_ref_007">2003</xref>) and <monospace>AIMMS</monospace>.<xref ref-type="fn" rid="j_infor447_fn_012">12</xref><fn id="j_infor447_fn_012"><label><sup>12</sup></label>
<p><ext-link ext-link-type="uri" xlink:href="https://aimms.com/english/developers/resources/webinars/webinars-demand/algorithms/aimms-presolver/">https://aimms.com/english/developers/resources/webinars/webinars-demand/algorithms/aimms-presolver/</ext-link>.</p></fn> Since we did not have the opportunity to evaluate the <monospace>AIMMS</monospace> modelling language practically, we could only examine <monospace>AMPL</monospace> presolving capabilities.</p>
<sec id="j_infor447_s_011">
<label>5.1</label>
<title>Presolving in AMPL</title>
<p>To assess <monospace>AMPL</monospace>’s presolving performance, we gathered presolving characteristics while performing the model instance creation time benchmark. We have used 286 models that were successfully converted from <monospace>GAMS</monospace> original model to the <monospace>AMPL</monospace> scalar model.</p>
<table-wrap id="j_infor447_tab_007">
<label>Table 7</label>
<caption>
<p>AMPL model presolving.</p>
</caption>
<table>
<thead>
<tr>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">Type</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin"># models</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin"># infeasible</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">Presolved (%)</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">Constraints reduced (%)</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">Variables reduced (%)</td>
</tr>
</thead>
<tbody>
<tr>
<td style="vertical-align: top; text-align: left">CNS</td>
<td style="vertical-align: top; text-align: left">4</td>
<td style="vertical-align: top; text-align: left">0</td>
<td style="vertical-align: top; text-align: left">100.00%</td>
<td style="vertical-align: top; text-align: left">14.63%</td>
<td style="vertical-align: top; text-align: left">31.39%</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">DNLP</td>
<td style="vertical-align: top; text-align: left">5</td>
<td style="vertical-align: top; text-align: left">0</td>
<td style="vertical-align: top; text-align: left">20.00%</td>
<td style="vertical-align: top; text-align: left">0.00%</td>
<td style="vertical-align: top; text-align: left">7.41%</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">LP</td>
<td style="vertical-align: top; text-align: left">57</td>
<td style="vertical-align: top; text-align: left">0</td>
<td style="vertical-align: top; text-align: left">36.84%</td>
<td style="vertical-align: top; text-align: left">17.81%</td>
<td style="vertical-align: top; text-align: left">9.66%</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">MCP</td>
<td style="vertical-align: top; text-align: left">19</td>
<td style="vertical-align: top; text-align: left">0</td>
<td style="vertical-align: top; text-align: left">89.47%</td>
<td style="vertical-align: top; text-align: left">47.00%</td>
<td style="vertical-align: top; text-align: left">8.56%</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">MINLP</td>
<td style="vertical-align: top; text-align: left">21</td>
<td style="vertical-align: top; text-align: left">1</td>
<td style="vertical-align: top; text-align: left">61.90%</td>
<td style="vertical-align: top; text-align: left">16.32%</td>
<td style="vertical-align: top; text-align: left">9.30%</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">MIP</td>
<td style="vertical-align: top; text-align: left">61</td>
<td style="vertical-align: top; text-align: left">0</td>
<td style="vertical-align: top; text-align: left">60.66%</td>
<td style="vertical-align: top; text-align: left">19.06%</td>
<td style="vertical-align: top; text-align: left">11.50%</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">MIQCP</td>
<td style="vertical-align: top; text-align: left">5</td>
<td style="vertical-align: top; text-align: left">2</td>
<td style="vertical-align: top; text-align: left">60.00%</td>
<td style="vertical-align: top; text-align: left">0.00%</td>
<td style="vertical-align: top; text-align: left">2.38%</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">MPEC</td>
<td style="vertical-align: top; text-align: left">1</td>
<td style="vertical-align: top; text-align: left">0</td>
<td style="vertical-align: top; text-align: left">100.00%</td>
<td style="vertical-align: top; text-align: left">50.00%</td>
<td style="vertical-align: top; text-align: left">0.00%</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">NLP</td>
<td style="vertical-align: top; text-align: left">101</td>
<td style="vertical-align: top; text-align: left">2</td>
<td style="vertical-align: top; text-align: left">47.52%</td>
<td style="vertical-align: top; text-align: left">9.71%</td>
<td style="vertical-align: top; text-align: left">11.55%</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">QCP</td>
<td style="vertical-align: top; text-align: left">10</td>
<td style="vertical-align: top; text-align: left">0</td>
<td style="vertical-align: top; text-align: left">60.00%</td>
<td style="vertical-align: top; text-align: left">7.10%</td>
<td style="vertical-align: top; text-align: left">2.55%</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">RMIQCP</td>
<td style="vertical-align: top; text-align: left">2</td>
<td style="vertical-align: top; text-align: left">0</td>
<td style="vertical-align: top; text-align: left">0.00%</td>
<td style="vertical-align: top; text-align: left">0.00%</td>
<td style="vertical-align: top; text-align: left">0.00%</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">Total</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">286</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">5</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">52.80%</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">18.42%</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">10.73%</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>A detailed report of the presolving applied to the specific model can be seen in the benchmark section of our GitHub repository (Jusevičius and Paulavičius, <xref ref-type="bibr" rid="j_infor447_ref_017">2019</xref>), while the summary of it can be found in Table <xref rid="j_infor447_tab_007">7</xref>. We observed that <monospace>AMPL</monospace> presolver managed to simplify the models in 52.8% of the cases, out of which 5 times it could determine that the problem solution is not feasible, thus not even requiring to call the solver. On average, once applied, the <monospace>AMPL</monospace> presolver managed to reduce the model size by removing 18.42% of constraints and 10.73% of variables.</p>
<p>We can conclude that <monospace>AMPL</monospace> presolver is an efficient way to simplify larger problems, leading to improved solution finding performance once invoking a solver with an already reduced problem model instance. Moreover, determining not feasible models can help modellers debug the problem definition process and find errors in the model definition. This allows us to argue that presolving is an important capability of any modern AML.</p>
</sec>
<sec id="j_infor447_s_012">
<label>5.2</label>
<title>Presolve Impact on Solving</title>
<p>To evaluate if <monospace>AMPL</monospace> presolving has a positive impact on problem-solving, an additional benchmark was conducted. The benchmark included 146 out of 151 models to which <monospace>AMPL</monospace> has applied presolve in the model instance creation benchmark. Five models that <monospace>AMPL</monospace> presolve determined to be not feasible were excluded from the benchmark. Shell script <monospace>solve-benchmark.sh</monospace> provided in the tools directory of our GitHub repository (Jusevičius and Paulavičius, <xref ref-type="bibr" rid="j_infor447_ref_017">2019</xref>) was created for executing such a benchmark. The script solves each model using one of the solvers and gathers output statistics to a report file.</p>
<p>We have chosen to solve the models using <monospace>Gurobi</monospace> and <monospace>BARON</monospace> solvers. <monospace>Gurobi Optimizer (v.8.1.0)</monospace> was chosen for solving <monospace>LP, MIP, QCP</monospace>, and <monospace>MIQCP</monospace> type of problems. At the same time, <monospace>BARON (v.18.11.12)</monospace> global solver was chosen for solving <monospace>NLP, MINLP, MCP, MPEC, CNS</monospace>, and <monospace>DNLP</monospace> problems. The solvers’ choice was motivated by the support for particular problem types.<xref ref-type="fn" rid="j_infor447_fn_013">13</xref><fn id="j_infor447_fn_013"><label><sup>13</sup></label>
<p>Gurobi Optimizer Reference Manual: <uri>http://www.gurobi.com</uri>; BARON User Manual: <uri>http://www.minlp.com/downloads/docs/baron%20manual.pdf</uri>.</p></fn> and the popularity of solvers based on NEOS Server statistics.<xref ref-type="fn" rid="j_infor447_fn_014">14</xref><fn id="j_infor447_fn_014"><label><sup>14</sup></label>
<p><uri>https://neos-server.org/neos/report.html</uri>.</p></fn> Two attempts to solve each model were made. One with <monospace>AMPL</monospace> presolver turned on (default setting), and the second one with <monospace>AMPL</monospace> presolver turned off. After each run, solvers statistics, including iterations count, solve time (pure solve phase execution time), and objective, were gathered.</p>
<p>It is important to note that both <monospace>BARON</monospace> and <monospace>Gurobi</monospace> solvers have their presolve mechanisms (Puranik and Sahinidis, <xref ref-type="bibr" rid="j_infor447_ref_028">2017</xref>; Achterberg <italic>et al.</italic>, <xref ref-type="bibr" rid="j_infor447_ref_002">2019</xref>). Thus the provided model is simplified by the solver too. This might result in very similar models being solved by the solver despite the <monospace>AMPL</monospace> presolve being turned on or off. However, the focus was on estimating <monospace>AMPL</monospace> presolve impact in real-life situations; therefore, a full benchmark was executed without changing the default solver behaviour. Later on, an additional benchmark was made to estimate the impact of <monospace>AMPL</monospace> presolve once solver presolve functionality is turned off.</p>
<p>Detailed <monospace>AMPL</monospace> presolve impact on solving report can be found in our GitHub repository’s (Jusevičius and Paulavičius, <xref ref-type="bibr" rid="j_infor447_ref_017">2019</xref>) file <monospace>ampl-solving-times.xlsx</monospace> sheet Benchmark 1. Table <xref rid="j_infor447_tab_008">8</xref> summarizes the positive and negative impact <monospace>AMPL</monospace> presolve had on solving the problems iteration and time-wise. Positive impact means fewer iterations or time was needed to solve a problem once the presolve was turned on. A negative impact means the opposite that more iterations or time was required. The impact is considered neutral if the number of iterations did not change or the required time was within the one-second tolerance level.</p>
<table-wrap id="j_infor447_tab_008">
<label>Table 8</label>
<caption>
<p>Summary of AMPL presolve impact on solving.</p>
</caption>
<table>
<thead>
<tr>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin"/>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">Iteration-wise</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">Time-wise</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">Iteration-wise (%)</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">Time-wise (%)</td>
</tr>
</thead>
<tbody>
<tr>
<td style="vertical-align: top; text-align: left">Positive</td>
<td style="vertical-align: top; text-align: left">37</td>
<td style="vertical-align: top; text-align: left">67</td>
<td style="vertical-align: top; text-align: left">26.43%</td>
<td style="vertical-align: top; text-align: left">47.86%</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">Neutral</td>
<td style="vertical-align: top; text-align: left">74</td>
<td style="vertical-align: top; text-align: left">40</td>
<td style="vertical-align: top; text-align: left">52.86%</td>
<td style="vertical-align: top; text-align: left">28.57%</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">Negative</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">29</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">33</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">20.71%</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">23.57%</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>During this benchmark, 6 models failed to be solved due to solver limitations. Two models were deemed to be not feasible, and two were solved during the <monospace>AMPL</monospace> presolve phase. Solvers were capable of solving 41 models during the solver’s presolve phase. Moreover, for six models, the mismatching objective was found with <monospace>AMPL</monospace> presolve turned on and off. Overall, <monospace>AMPL</monospace> presolve positively impacted 26.43% of the cases iteration-wise and 47.86% time-wise. However, it hurt 20.71% of cases iteration-wise and 23.57% time-wise.</p>
<p>As mentioned earlier, both <monospace>BARON</monospace> and <monospace>Gurobi</monospace> solvers have their presolve mechanisms. An additional benchmark was made to test the impact of <monospace>AMPL</monospace> presolve with disabled solvers presolving. Since only <monospace>Gurobi</monospace> allows the user to disable presolve functionality, a subset of models previously solved with <monospace>Gurobi</monospace> was chosen. Detailed benchmark results can be seen in our GitHub repository’s (Jusevičius and Paulavičius, <xref ref-type="bibr" rid="j_infor447_ref_017">2019</xref>) file <monospace>ampl-solving-times.xlsx</monospace> sheet <monospace>Benchmark 2</monospace>. The summary of the benchmark is provided in Tables <xref rid="j_infor447_tab_009">9</xref>, <xref rid="j_infor447_tab_010">10</xref>. <monospace>Gurobi</monospace> could not solve two <monospace>MIP</monospace> problems (<monospace>clad</monospace> and <monospace>mws</monospace>) in a reasonable time once <monospace>Gurobi</monospace>’s presolve functionality was turned off. Those models were excluded from the benchmark.</p>
<table-wrap id="j_infor447_tab_009">
<label>Table 9</label>
<caption>
<p>AMPL presolve impact with Gurobi presolve on.</p>
</caption>
<table>
<thead>
<tr>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin"/>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">Iteration-wise</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">Time-wise</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">Iteration-wise (%)</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">Time-wise (%)</td>
</tr>
</thead>
<tbody>
<tr>
<td style="vertical-align: top; text-align: left">Positive</td>
<td style="vertical-align: top; text-align: left">18</td>
<td style="vertical-align: top; text-align: left">39</td>
<td style="vertical-align: top; text-align: left">28.57%</td>
<td style="vertical-align: top; text-align: left">61.90%</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">Neutral</td>
<td style="vertical-align: top; text-align: left">34</td>
<td style="vertical-align: top; text-align: left">0</td>
<td style="vertical-align: top; text-align: left">53.97%</td>
<td style="vertical-align: top; text-align: left">0.00%</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">Negative</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">11</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">24</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">17.46%</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">38.10%</td>
</tr>
</tbody>
</table>
</table-wrap>
<table-wrap id="j_infor447_tab_010">
<label>Table 10</label>
<caption>
<p>AMPL presolve impact with Gurobi presolve off.</p>
</caption>
<table>
<thead>
<tr>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin"/>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">Iteration-wise</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">Time-wise</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">Iteration-wise (%)</td>
<td style="vertical-align: top; text-align: left; border-top: solid thin; border-bottom: solid thin">Time-wise (%)</td>
</tr>
</thead>
<tbody>
<tr>
<td style="vertical-align: top; text-align: left">Positive</td>
<td style="vertical-align: top; text-align: left">33</td>
<td style="vertical-align: top; text-align: left">44</td>
<td style="vertical-align: top; text-align: left">54.10%</td>
<td style="vertical-align: top; text-align: left">72.13%</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left">Neutral</td>
<td style="vertical-align: top; text-align: left">10</td>
<td style="vertical-align: top; text-align: left">0</td>
<td style="vertical-align: top; text-align: left">16.39%</td>
<td style="vertical-align: top; text-align: left">0.00%</td>
</tr>
<tr>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">Negative</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">18</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">17</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">29.51%</td>
<td style="vertical-align: top; text-align: left; border-bottom: solid thin">27.87%</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>As seen once comparing these results in Tables <xref rid="j_infor447_tab_009">9</xref> and <xref rid="j_infor447_tab_010">10</xref>, the AMPL presolve had a greater positive effect both iteration-wise (+25.5%) and time-wise (+10.2%) once Gurobi presolve was turned off. AMPL presolve also had a less neutral impact once the solver presolving was off, thus leading to the conclusion that during the first benchmark, some models were simplified to very similar ones before actually solving them.</p>
<p>As we can see from the benchmarks, presolving done by AML has inconclusive effects on the actual problem solving both iterations and time-wise. However, a positive impact is always more significant than the negative one, and it especially becomes evident once the solver does not have or use its problem presolving mechanisms. This allows us to conclude that the presolving capability of AML is an important feature of a modern algebraic modelling language. We can also advise choosing AML having presolving capabilities in cases the solver used to solve the problem does not have its presolving mechanism.</p>
</sec>
</sec>
<sec id="j_infor447_s_013">
<label>6</label>
<title>Conclusions and Future Work</title>
<p>From the research, we can conclude that <monospace>AMPL</monospace> allows us to formulate an optimization problem in the shortest and potentially easiest way while also providing the best performance in model instance loading times. It also leverages the power of model presolving, which helps the modellers in both problem definition and efficient solution finding processes. <monospace>GAMS</monospace> is a powerful runner-up providing very similar to <monospace>AMPL</monospace> problem formulation capabilities although running behind in the model instance creation time. <monospace>AIMMS</monospace> can be considered as being in the class of its own as it has taken a purely graphical user interface based approach. Since we could not examine the performance characteristics of <monospace>AIMMS</monospace> due to a lack of academic license, the performance aspect remains unclear. Open-source alternatives <monospace>JuMP</monospace> and <monospace>Pyomo</monospace> are on par with commercial competitors in the problem definition process. However, the performance of model instance creation is a bit behind compared to its competitors. <monospace>JuMP</monospace> suffers from noticeable environment start-up costs, while <monospace>Pyomo</monospace> performance tends to downgrade once the model’s size increases.</p>
<p>We plan to continue our research in this area by including performance comparison on automatic differentiation, adding even more large problems to our test library, and exploring the potential of parallel model instance creation support by AMLs.</p>
</sec>
</body>
<back>
<ack id="j_infor447_ack_001">
<title>Data Access Statement</title>
<p>Data underlying this article can be accessed on Zenodo at <uri>https://zenodo.org/record/4106728</uri>, and used under the Creative Commons Attribution license.</p></ack>
<app-group>
<app id="j_infor447_app_001"><label>A</label>
<title>Creation of AMLs Testing Library</title>
<p>The automated shell script <monospace>gamslib-convert.sh</monospace> is available in the <monospace>tools</monospace> directory of our GitHub repository (Jusevičius and Paulavičius, <xref ref-type="bibr" rid="j_infor447_ref_017">2019</xref>) was created to generate the AMLs testing library. The script uses <monospace>GAMS Convert tool v.32</monospace><xref ref-type="fn" rid="j_infor447_fn_015">15</xref><fn id="j_infor447_fn_015"><label><sup>15</sup></label>
<p><uri>https://www.gams.com/latest/docs/S_CONVERT.html</uri>.</p></fn> to convert the <monospace>GAMS</monospace> proprietary format model to a scalar model in <monospace>AMPL</monospace>, <monospace>GAMS</monospace>, <monospace>JuMP</monospace>, and <monospace>Pyomo</monospace> formats. Characteristics of the sample problem models (number of equations, variables, discrete variables, non-zero elements, and non-zero nonlinear elements) are automatically extracted and noted. Sample problems are also grouped based on optimization problem types.</p>
<p>The script has two execution modes – one for converting a single model and another for converting all GAMS Library models. An example of the transportation problem from GAMS Model Library<xref ref-type="fn" rid="j_infor447_fn_016">16</xref><fn id="j_infor447_fn_016"><label><sup>16</sup></label>
<p><uri>https://www.gams.com/latest/gamslib_ml/libhtml/index.html</uri>.</p></fn> converted to <monospace>GAMS</monospace> scalar format is shown in Listing <xref rid="j_infor447_fig_003">1</xref>.</p>
<fig id="j_infor447_fig_003">
<label>Listing 1</label>
<caption>
<p>Transportation problem converted to GAMS scalar model.</p>
</caption>
<graphic xlink:href="infor447_g003.jpg"/>
</fig> 
<fig id="j_infor447_fig_004">
<label>Listing 2</label>
<caption>
<p>Example of a GAMS Convert error.</p>
</caption>
<graphic xlink:href="infor447_g004.jpg"/>
</fig> 
<p>At the time of writing, there were 423 models in the GAMS Model Library. Out of them, we eliminated 66 models using <monospace>GAMS</monospace> proprietary modeling techniques (e.g. <monospace>MPSGE</monospace>, <monospace>BCH Facility</monospace>), 20 using general-purpose programming language features (e.g. cycles), four models tightly coupled to <monospace>CPLEX</monospace> and <monospace>DECIS</monospace> solvers. It is important to note that 35 models failed to be loaded by a fully licensed <monospace>GAMS Convert</monospace> tool due to execution or compilation errors. This meaning, some models in the GAMS Library are not compatible with the <monospace>GAMS</monospace> modelling system itself. While performing the model instance creation benchmark, we have identified that 12 <monospace>AMPL</monospace>, 11 <monospace>JuMP</monospace>, and 29 <monospace>Pyomo</monospace> models generated by the <monospace>GAMS Convert</monospace> tool had errors in them. Most of the <monospace>Pyomo</monospace> errors were caused by an incorrect <monospace>GAMS Convert</monospace> tool behaviour where the definition of the <monospace>Suffix</monospace> primitive uses <monospace>AMPL</monospace> but not <monospace>Pyomo</monospace> semantics. Similar issues were observed in some of the <monospace>JuMP</monospace> models. An example of what <monospace>GAMS Convert</monospace> generates and the correct <monospace>Pyomo</monospace> syntax can be seen in Listing <xref rid="j_infor447_fig_004">2</xref>.</p></app>
<app id="j_infor447_app_002"><label>B</label>
<title>Transportation Problem Models</title>
<fig id="j_infor447_fig_005">
<label>Listing 3</label>
<caption>
<p>Transportation problem defined in AMPL format.</p>
</caption>
<graphic xlink:href="infor447_g005.jpg"/>
</fig> 
<fig id="j_infor447_fig_006">
<label>Listing 4</label>
<caption>
<p>Transportation problem defined in GAMS format.</p>
</caption>
<graphic xlink:href="infor447_g006.jpg"/>
</fig> 
<fig id="j_infor447_fig_007">
<label>Listing 5</label>
<caption>
<p>Transportation problem defined in Pyomo format.</p>
</caption>
<graphic xlink:href="infor447_g007.jpg"/>
</fig> 
<fig id="j_infor447_fig_008">
<label>Listing 6</label>
<caption>
<p>Transportation problem defined in JuMP format.</p>
</caption>
<graphic xlink:href="infor447_g008.jpg"/>
</fig>
</app></app-group>
<ref-list id="j_infor447_reflist_001">
<title>References</title>
<ref id="j_infor447_ref_001">
<mixed-citation publication-type="journal"><string-name><surname>Abhishek</surname>, <given-names>K.</given-names></string-name>, <string-name><surname>Leyffer</surname>, <given-names>S.</given-names></string-name>, <string-name><surname>Linderoth</surname>, <given-names>J.</given-names></string-name> (<year>2010</year>). <article-title>FilMINT: an outer approximation-based solver for convex mixed-integer nonlinear programs</article-title>. <source>INFORMS Journal on Computing</source>, <volume>22</volume>(<issue>4</issue>), <fpage>555</fpage>–<lpage>567</lpage>. <ext-link ext-link-type="doi" xlink:href="https://doi.org/10.1287/ijoc.1090.0373" xlink:type="simple">https://doi.org/10.1287/ijoc.1090.0373</ext-link>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_002">
<mixed-citation publication-type="other"><string-name><surname>Achterberg</surname>, <given-names>T.</given-names></string-name>, <string-name><surname>Bixby</surname>, <given-names>R.E.</given-names></string-name>, <string-name><surname>Gu</surname>, <given-names>Z.</given-names></string-name>, <string-name><surname>Rothberg</surname>, <given-names>E.</given-names></string-name>, <string-name><surname>Weninger</surname>, <given-names>D.</given-names></string-name> (2019). Presolve reductions in mixed integer programming. <italic>INFORMS Journal on Computing</italic>. <ext-link ext-link-type="doi" xlink:href="https://doi.org/10.1287/ijoc.2018.0857" xlink:type="simple">https://doi.org/10.1287/ijoc.2018.0857</ext-link>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_003">
<mixed-citation publication-type="journal"><string-name><surname>Cosma</surname>, <given-names>O.</given-names></string-name>, <string-name><surname>Pop</surname>, <given-names>P.C.</given-names></string-name>, <string-name><surname>Dănciulescu</surname>, <given-names>D.</given-names></string-name> (<year>2020</year>). <article-title>A parallel algorithm for solving a two-stage fixed-charge transportation problem</article-title>. <source>Informatica</source>, <volume>31</volume>(<issue>4</issue>), <fpage>681</fpage>–<lpage>706</lpage>. <ext-link ext-link-type="doi" xlink:href="https://doi.org/10.15388/20-INFOR432" xlink:type="simple">https://doi.org/10.15388/20-INFOR432</ext-link>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_004">
<mixed-citation publication-type="chapter"><string-name><surname>Dantzig</surname>, <given-names>G.B.</given-names></string-name> (<year>1963</year>). <chapter-title>The classical transportation problem</chapter-title>. In: <source>Linear Programming and Extensions</source>. <publisher-name>Princeton University Press</publisher-name>, <publisher-loc>Princeton, NJ</publisher-loc>, pp. <fpage>299</fpage>–<lpage>315</lpage>. <ext-link ext-link-type="doi" xlink:href="https://doi.org/10.1515/9781400884179-015" xlink:type="simple">https://doi.org/10.1515/9781400884179-015</ext-link>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_005">
<mixed-citation publication-type="journal"><string-name><surname>Dunning</surname>, <given-names>I.</given-names></string-name>, <string-name><surname>Huchette</surname>, <given-names>J.</given-names></string-name>, <string-name><surname>Lubin</surname>, <given-names>M.</given-names></string-name> (<year>2017</year>). <article-title>JuMP: a modeling language for mathematical optimization</article-title>. <source>SIAM Review</source>, <volume>59</volume>(<issue>2</issue>), <fpage>295</fpage>–<lpage>320</lpage>. <ext-link ext-link-type="doi" xlink:href="https://doi.org/10.1137/15m1020575" xlink:type="simple">https://doi.org/10.1137/15m1020575</ext-link>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_006">
<mixed-citation publication-type="journal"><string-name><surname>Fernández</surname>, <given-names>P.</given-names></string-name>, <string-name><surname>Lančinskas</surname>, <given-names>A.</given-names></string-name>, <string-name><surname>Pelegrín</surname>, <given-names>B.</given-names></string-name>, <string-name><surname>Žilinskas</surname>, <given-names>J.</given-names></string-name> (<year>2020</year>). <article-title>A discrete competitive facility location model with minimal market share constraints and equity-based ties breaking rule</article-title>. <source>Informatica</source>, <volume>31</volume>(<issue>2</issue>), <fpage>205</fpage>–<lpage>224</lpage>. <ext-link ext-link-type="doi" xlink:href="https://doi.org/10.15388/20-INFOR410" xlink:type="simple">https://doi.org/10.15388/20-INFOR410</ext-link>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_007">
<mixed-citation publication-type="book"><string-name><surname>Fourer</surname>, <given-names>R.</given-names></string-name> (<year>2003</year>). <source>AMPL: A Modeling Language for Mathematical Programming</source>. <publisher-name>Thomson/Brooks/Cole</publisher-name>, <publisher-loc>Pacific Grove, CA</publisher-loc>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_008">
<mixed-citation publication-type="chapter"><string-name><surname>Fourer</surname>, <given-names>R.</given-names></string-name> (<year>2013</year>). <chapter-title>Algebraic modeling languages for optimization</chapter-title>. In: <source>Encyclopedia of Operations Research and Management Science</source>. <publisher-name>Springer</publisher-name>, <publisher-loc>US</publisher-loc>, pp. <fpage>43</fpage>–<lpage>51</lpage>. <ext-link ext-link-type="doi" xlink:href="https://doi.org/10.1007/978-1-4419-1153-7" xlink:type="simple">https://doi.org/10.1007/978-1-4419-1153-7</ext-link>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_009">
<mixed-citation publication-type="other"><string-name><surname>Fourer</surname>, <given-names>R.</given-names></string-name> (2017). Linear programming: software survey. <italic>OR/MS Today</italic>, 44(3).</mixed-citation>
</ref>
<ref id="j_infor447_ref_010">
<mixed-citation publication-type="chapter"><string-name><surname>Fragniere</surname>, <given-names>E.</given-names></string-name>, <string-name><surname>Gondzio</surname>, <given-names>J.</given-names></string-name> (<year>2002</year>). <chapter-title>Optimization modeling languages</chapter-title>. In: <source>Handbook of Applied Optimization</source>, pp. <fpage>993</fpage>–<lpage>1007</lpage>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_011">
<mixed-citation publication-type="other"><string-name><surname>Gay</surname>, <given-names>D.M.</given-names></string-name> (2005). Writing .nl files. <italic>Optimization and Uncertainty Estimation</italic>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_012">
<mixed-citation publication-type="journal"><string-name><surname>Groër</surname>, <given-names>C.</given-names></string-name>, <string-name><surname>Golden</surname>, <given-names>B.</given-names></string-name>, <string-name><surname>Wasil</surname>, <given-names>E.</given-names></string-name> (<year>2011</year>). <article-title>A parallel algorithm for the vehicle routing problem</article-title>. <source>INFORMS Journal on Computing</source>, <volume>23</volume>(<issue>2</issue>), <fpage>315</fpage>–<lpage>330</lpage>. <ext-link ext-link-type="doi" xlink:href="https://doi.org/10.1287/ijoc.1100.0402" xlink:type="simple">https://doi.org/10.1287/ijoc.1100.0402</ext-link>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_013">
<mixed-citation publication-type="journal"><string-name><surname>Gómez</surname>, <given-names>F.J.O.</given-names></string-name>, <string-name><surname>López</surname>, <given-names>G.O.</given-names></string-name>, <string-name><surname>Filatovas</surname>, <given-names>E.</given-names></string-name>, <string-name><surname>Kurasova</surname>, <given-names>O.</given-names></string-name>, <string-name><surname>Garzón</surname>, <given-names>G.E.M.</given-names></string-name> (<year>2019</year>). <article-title>Hyperspectral image classification using isomap with SMACOF</article-title>. <source>Informatica</source>, <volume>30</volume>(<issue>2</issue>), <fpage>349</fpage>–<lpage>365</lpage>. <ext-link ext-link-type="doi" xlink:href="https://doi.org/10.15388/Informatica.2019.209" xlink:type="simple">https://doi.org/10.15388/Informatica.2019.209</ext-link>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_014">
<mixed-citation publication-type="journal"><string-name><surname>Hart</surname>, <given-names>W.E.</given-names></string-name>, <string-name><surname>Watson</surname>, <given-names>J.-P.</given-names></string-name>, <string-name><surname>Woodruff</surname>, <given-names>D.L.</given-names></string-name> (<year>2011</year>). <article-title>Pyomo: modeling and solving mathematical programs in Python</article-title>. <source>Mathematical Programming Computation</source>, <volume>3</volume>(<issue>3</issue>), <fpage>219</fpage>–<lpage>260</lpage>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_015">
<mixed-citation publication-type="book"><string-name><surname>Hart</surname>, <given-names>W.E.</given-names></string-name>, <string-name><surname>Laird</surname>, <given-names>C.D.</given-names></string-name>, <string-name><surname>Watson</surname>, <given-names>J.-P.</given-names></string-name>, <string-name><surname>Woodruff</surname>, <given-names>D.L.</given-names></string-name>, <string-name><surname>Hackebeil</surname>, <given-names>G.A.</given-names></string-name>, <string-name><surname>Nicholson</surname>, <given-names>B.L.</given-names></string-name>, <string-name><surname>Siirola</surname>, <given-names>J.D.</given-names></string-name> (<year>2017</year>). <source>Pyomo–Optimization Modeling in Python</source>, Vol. <volume>67</volume>, <edition>2</edition>nd ed. <publisher-name>Springer Science &amp; Business Media</publisher-name>, <publisher-loc>US</publisher-loc>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_016">
<mixed-citation publication-type="book"><string-name><surname>Hürlimann</surname>, <given-names>T.</given-names></string-name> (<year>1999</year>). <source>Mathematical Modeling and Optimization</source>. <series><italic>Applied Optimization</italic></series>, Vol. <volume>31</volume>. <publisher-name>Springer US</publisher-name>, <publisher-loc>Boston, MA</publisher-loc>. <isbn>978-1-4419-4814-4 978-1-4757-5793-4</isbn>. <ext-link ext-link-type="doi" xlink:href="https://doi.org/10.1007/978-1-4757-5793-4" xlink:type="simple">https://doi.org/10.1007/978-1-4757-5793-4</ext-link>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_017">
<mixed-citation publication-type="other"><string-name><surname>Jusevičius</surname>, <given-names>V.</given-names></string-name>, <string-name><surname>Paulavičius</surname>, <given-names>R.</given-names></string-name> (2019). Algebraic Modeling Language Benchmark. GitHub. <uri>https://github.com/vaidasj/alg-mod-rev/</uri>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_018">
<mixed-citation publication-type="book"><string-name><surname>Kallrath</surname>, <given-names>J.</given-names></string-name> (<year>2004</year>). <source>Modeling Languages in Mathematical Optimization</source>, Vol. <volume>88</volume>. <publisher-name>Springer Science &amp; Business Media</publisher-name>, <publisher-loc>US</publisher-loc>. <ext-link ext-link-type="doi" xlink:href="https://doi.org/10.1007/978-1-4613-0215-5" xlink:type="simple">https://doi.org/10.1007/978-1-4613-0215-5</ext-link>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_019">
<mixed-citation publication-type="journal"><string-name><surname>Lee</surname>, <given-names>K.-Y.</given-names></string-name>, <string-name><surname>Lim</surname>, <given-names>J.-S.</given-names></string-name>, <string-name><surname>Ko</surname>, <given-names>S.-S.</given-names></string-name> (<year>2019</year>). <article-title>Endosymbiotic evolutionary algorithm for an integrated model of the vehicle routing and truck scheduling problem with a cross-docking system</article-title>. <source>Informatica</source>, <volume>30</volume>(<issue>3</issue>), <fpage>481</fpage>–<lpage>502</lpage>. <ext-link ext-link-type="doi" xlink:href="https://doi.org/10.15388/Informatica.2019.215" xlink:type="simple">https://doi.org/10.15388/Informatica.2019.215</ext-link>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_020">
<mixed-citation publication-type="journal"><string-name><surname>Lubin</surname>, <given-names>M.</given-names></string-name>, <string-name><surname>Dunning</surname>, <given-names>I.</given-names></string-name> (<year>2015</year>). <article-title>Computing in operations research using Julia</article-title>. <source>INFORMS Journal on Computing</source>, <volume>27</volume>(<issue>2</issue>), <fpage>238</fpage>–<lpage>248</lpage>. <ext-link ext-link-type="doi" xlink:href="https://doi.org/10.1287/ijoc.2014.0623" xlink:type="simple">https://doi.org/10.1287/ijoc.2014.0623</ext-link>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_021">
<mixed-citation publication-type="book"><string-name><surname>McCarl</surname>, <given-names>B.A.</given-names></string-name>, <string-name><surname>Meeraus</surname>, <given-names>A.</given-names></string-name>, <string-name><surname>van der Eijk</surname>, <given-names>P.</given-names></string-name>, <string-name><surname>Bussieck</surname>, <given-names>M.</given-names></string-name>, <string-name><surname>Dirkse</surname>, <given-names>S.</given-names></string-name>, <string-name><surname>Nelissen</surname>, <given-names>F.</given-names></string-name> (<year>2016</year>). <source>McCarl Expanded GAMS User Guide</source>. <publisher-name>Citeseer</publisher-name>, <publisher-loc>US</publisher-loc>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_022">
<mixed-citation publication-type="book"><string-name><surname>Paulavičius</surname>, <given-names>R.</given-names></string-name>, <string-name><surname>Žilinskas</surname>, <given-names>J.</given-names></string-name> (<year>2014</year>). <source>Simplicial Global Optimization</source>. <series><italic>SpringerBriefs in Optimization</italic></series>. <publisher-name>Springer</publisher-name>, <publisher-loc>New York</publisher-loc>. <isbn>978-1-4614-9092-0</isbn>. <ext-link ext-link-type="doi" xlink:href="https://doi.org/10.1007/978-1-4614-9093-7" xlink:type="simple">https://doi.org/10.1007/978-1-4614-9093-7</ext-link>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_023">
<mixed-citation publication-type="journal"><string-name><surname>Paulavičius</surname>, <given-names>R.</given-names></string-name>, <string-name><surname>Adjiman</surname>, <given-names>C.S.</given-names></string-name> (<year>2020</year>). <article-title>New bounding schemes and algorithmic options for the Branch-and-Sandwich algorithm</article-title>. <source>Journal of Global Optimization</source>, <volume>77</volume>(<issue>2</issue>), <fpage>197</fpage>–<lpage>225</lpage>. <ext-link ext-link-type="doi" xlink:href="https://doi.org/10.1007/s10898-020-00874-3" xlink:type="simple">https://doi.org/10.1007/s10898-020-00874-3</ext-link>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_024">
<mixed-citation publication-type="journal"><string-name><surname>Paulavičius</surname>, <given-names>R.</given-names></string-name>, <string-name><surname>Sergeyev</surname>, <given-names>Y.D.</given-names></string-name>, <string-name><surname>Kvasov</surname>, <given-names>D.E.</given-names></string-name>, <string-name><surname>Žilinskas</surname>, <given-names>J.</given-names></string-name> (<year>2014</year>). <article-title>Globally-biased DISIMPL algorithm for expensive global optimization</article-title>. <source>Journal of Global Optimization</source>, <volume>59</volume>(<issue>2-3</issue>), <fpage>545</fpage>–<lpage>567</lpage>. <ext-link ext-link-type="doi" xlink:href="https://doi.org/10.1007/s10898-014-0180-4" xlink:type="simple">https://doi.org/10.1007/s10898-014-0180-4</ext-link>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_025">
<mixed-citation publication-type="journal"><string-name><surname>Paulavičius</surname>, <given-names>R.</given-names></string-name>, <string-name><surname>Gao</surname>, <given-names>J.</given-names></string-name>, <string-name><surname>Kleniati</surname>, <given-names>P.-M.</given-names></string-name>, <string-name><surname>Adjiman</surname>, <given-names>C.S.</given-names></string-name> (<year>2020</year>a). <article-title>BASBL: branch-and-sandwich BiLevel solver: implementation and computational study with the BASBLib test set</article-title>. <source>Computers &amp; Chemical Engineering</source>, <volume>132</volume>, <fpage>106609</fpage>. <ext-link ext-link-type="doi" xlink:href="https://doi.org/10.1016/j.compchemeng.2019.106609" xlink:type="simple">https://doi.org/10.1016/j.compchemeng.2019.106609</ext-link>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_026">
<mixed-citation publication-type="journal"><string-name><surname>Paulavičius</surname>, <given-names>R.</given-names></string-name>, <string-name><surname>Sergeyev</surname>, <given-names>Y.D.</given-names></string-name>, <string-name><surname>Kvasov</surname>, <given-names>D.E.</given-names></string-name>, <string-name><surname>Žilinskas</surname>, <given-names>J.</given-names></string-name> (<year>2020</year>b). <article-title>Globally-biased BIRECT algorithm with local accelerators for expensive global optimization</article-title>. <source>Expert Systems with Applications</source>, <volume>144</volume>, <fpage>113052</fpage>. <ext-link ext-link-type="doi" xlink:href="https://doi.org/10.1016/j.eswa.2019.113052" xlink:type="simple">https://doi.org/10.1016/j.eswa.2019.113052</ext-link>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_027">
<mixed-citation publication-type="journal"><string-name><surname>Pistikopoulos</surname>, <given-names>E.N.</given-names></string-name>, <string-name><surname>Diangelakis</surname>, <given-names>N.A.</given-names></string-name>, <string-name><surname>Oberdieck</surname>, <given-names>R.</given-names></string-name>, <string-name><surname>Papathanasiou</surname>, <given-names>M.M.</given-names></string-name>, <string-name><surname>Nascu</surname>, <given-names>I.</given-names></string-name>, <string-name><surname>Sun</surname>, <given-names>M.</given-names></string-name> (<year>2015</year>). <article-title>PAROC—an integrated framework and software platform for the optimisation and advanced model-based control of process systems</article-title>. <source>Chemical Engineering Science</source>, <volume>136</volume>, <fpage>115</fpage>–<lpage>138</lpage>. <ext-link ext-link-type="doi" xlink:href="https://doi.org/10.1016/j.ces.2015.02.030" xlink:type="simple">https://doi.org/10.1016/j.ces.2015.02.030</ext-link>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_028">
<mixed-citation publication-type="journal"><string-name><surname>Puranik</surname>, <given-names>Y.</given-names></string-name>, <string-name><surname>Sahinidis</surname>, <given-names>N.V.</given-names></string-name> (<year>2017</year>). <article-title>Domain reduction techniques for global NLP and MINLP optimization</article-title>. <source>Constraints</source>, <volume>22</volume>(<issue>3</issue>), <fpage>338</fpage>–<lpage>376</lpage>. <ext-link ext-link-type="doi" xlink:href="https://doi.org/10.1007/s10601-016-9267-5" xlink:type="simple">https://doi.org/10.1007/s10601-016-9267-5</ext-link>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_029">
<mixed-citation publication-type="other"><string-name><surname>Rothberg</surname>, <given-names>E.</given-names></string-name> (2020). <italic>How A Mathematical Optimization Model Can Help Your Business Deal With Disruption</italic>. <ext-link ext-link-type="uri" xlink:href="https://forbes.com/sites/forbestechcouncil/2020/08/24/how-a-mathematical-optimization-model-can-help-your-business-deal-with-disruption">https://forbes.com/sites/forbestechcouncil/2020/08/24/how-a-mathematical-optimization-model-can-help-your-business-deal-with-disruption</ext-link>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_030">
<mixed-citation publication-type="journal"><string-name><surname>Stripinis</surname>, <given-names>L.</given-names></string-name>, <string-name><surname>Paulavičius</surname>, <given-names>R.</given-names></string-name>, <string-name><surname>Žilinskas</surname>, <given-names>J.</given-names></string-name> (<year>2019</year>). <article-title>Penalty functions and two-step selection procedure based DIRECT-type algorithm for constrained global optimization</article-title>. <source>Structural and Multidisciplinary Optimization</source>, <volume>59</volume>(<issue>6</issue>), <fpage>2155</fpage>–<lpage>2175</lpage>. <ext-link ext-link-type="doi" xlink:href="https://doi.org/10.1007/s00158-018-2181-2" xlink:type="simple">https://doi.org/10.1007/s00158-018-2181-2</ext-link>.</mixed-citation>
</ref>
<ref id="j_infor447_ref_031">
<mixed-citation publication-type="journal"><string-name><surname>Stripinis</surname>, <given-names>L.</given-names></string-name>, <string-name><surname>Žilinskas</surname>, <given-names>J.</given-names></string-name>, <string-name><surname>Casado</surname>, <given-names>L.G.</given-names></string-name>, <string-name><surname>Paulavičius</surname>, <given-names>R.</given-names></string-name> (<year>2021</year>). <article-title>On MATLAB experience in accelerating DIRECT-GLce algorithm for constrained global optimization through dynamic data structures and parallelization</article-title>. <source>Applied Mathematics and Computation</source>, <volume>390</volume>, <fpage>125596</fpage>. <ext-link ext-link-type="doi" xlink:href="https://doi.org/10.1016/j.amc.2020.125596" xlink:type="simple">https://doi.org/10.1016/j.amc.2020.125596</ext-link>.</mixed-citation>
</ref>
</ref-list>
</back>
</article>
