Appendix A: A cutting plane-based algorithm for locating an interior point
To find the interior point to use as end point in the root searches in the ESH algorithm implemented in SHOT, cf., Sect. 4.4, the minimax problem Prob. (MM) is considered. An optimal or feasible interior point can be obtained with the tailor-made minimax solver described below:
Specify a maximum number of iterations and a relative (\({\epsilon _{\text {rel}}^{\text {MM}}}\)) and absolute (\({\epsilon _{\text {abs}}^{\text {MM}}}\)) termination tolerance for the objective function. Set \({{{\,\mathrm{GAP}\,}}_{\text {rel}}^{\text {MM}}}:= \infty \) and \({{{\,\mathrm{GAP}\,}}_{\text {abs}}^{\text {MM}}}:= \infty \), and determine a maximal number of iterations \(K_{\max }^{\text {MM}}\ge 2\). Set the iteration index \(k:=1\).
-
1.
Reformulate the original MINLP problem, Prob. (P), into a minimax problem of the type in Prob. (MM). Denote the function \(G({{\mathbf {x}}}) = \max _j g_j({{\mathbf {x}}})\), i.e., the maximum error of all nonlinear constraints functions in the original problem.
-
2.
Create a copy of the minimax problem without the nonlinear constraints, i.e., an LP problem.
-
3.
Solve the LP problem. If the subproblem can not be solved to optimality, set the flag MinimaxStatus to failure and go to Step 5; otherwise obtain the solution \(({{\mathbf {x}}}_1, \nu _1)\), and denote \({{\text {OBJ}}_{\text {LP}}}= \nu _1\).
-
4.
Repeat while \(k < K_{\max }^{\text {MM}}\).
-
(a)
Increase the iteration counter, i.e., set \(k:=k+1\).
-
(b)
Solve the LP problem. If the subproblem could not be solved to optimality, set MinimaxStatus to failure and go to Step 5; otherwise, obtain the solution \(({{\mathbf {x}}}_k, \nu _k)\) and set \({{\text {OBJ}}_{\text {LP}}}= \nu _k\).
-
(c)
Solve the following one-dimensional minimization problem:
$$\begin{aligned} \lambda _k = {{\,\mathrm{argmin}\,}}_{\lambda \in [0,1]} G\left( \lambda {{\mathbf {x}}}_k + (1-\lambda ){{\mathbf {x}}}_{k-1}\right) \end{aligned}$$
and calculate the solution point as \({{{\mathbf {x}}}_{\text {LS}}}= \lambda _k {{\mathbf {x}}}_k + (1-\lambda _k){{\mathbf {x}}}_{k-1}\). Calculate \({{\text {OBJ}}_{\text {LS}}}= G({{{\mathbf {x}}}_{\text {LS}}})\).
-
(d)
Calculate the absolute and relative difference in objective values between the LP and line search:
$$\begin{aligned} {{{\,\mathrm{GAP}\,}}_{\text {abs}}^{\text {MM}}}= |{{\text {OBJ}}_{\text {LP}}}-{{\text {OBJ}}_{\text {LS}}}|, \qquad \text {and} \qquad {{{\,\mathrm{GAP}\,}}_{\text {rel}}^{\text {MM}}}= \frac{|{{\text {OBJ}}_{\text {LP}}}-{{\text {OBJ}}_{\text {LS}}}|}{|{{\text {OBJ}}_{\text {LP}}}| + 10^{-10}}. \end{aligned}$$
If \({{\text {OBJ}}_{\text {LP}}}< 0\), and \({{{\,\mathrm{GAP}\,}}_{\text {rel}}^{\text {MM}}}< {\epsilon _{\text {rel}}^{\text {MM}}}\) or \({{{\,\mathrm{GAP}\,}}_{\text {abs}}^{\text {MM}}}< {\epsilon _{\text {abs}}^{\text {MM}}}\), set MinimaxStatus to success and go to Step 5.
-
(e)
Select the constraint function with the largest error in the point \({{{\mathbf {x}}}_{\text {LS}}}\), i.e., find
$$\begin{aligned} j' = {{\,\mathrm{argmax}\,}}_{j} g_j({{{\mathbf {x}}}_{\text {LS}}}) \end{aligned}$$
and add the following cutting plane to the LP problem
$$\begin{aligned} g_{j'}({{{\mathbf {x}}}_{\text {LS}}}) + \nabla g_{j'}\left( {{{\mathbf {x}}}_{\text {LS}}})\right) ^T ({{\mathbf {x}}}-{{{\mathbf {x}}}_{\text {LS}}}) \le 0. \end{aligned}$$
Note that it is also possible to generate cutting planes for more than one of the violated constraints.
-
5.
Termination: If MinimaxStatus is success, return with the status success and the interior point \({{{\mathbf {x}}}_{\text {LS}}}\), otherwise with status failure.
Appendix B: Included problems in the benchmark
The following 406 problems were used in the benchmark in Sect. 7. They are the instances that are identified as convex in MINLPLib, with at least one nonlinearity (in the objective function or constraints), and at least one discrete (binary or integer) variable. Of these, the 67 problems marked with an \(^*\) have only a quadratic objective function and no further nonlinearities in the constraints, i.e., they are MIQP problems.
alan\(^*\), ball_mk2_10, ball_mk2_30, ball_mk3_10, ball_mk3_20, ball_mk3_30, ball_mk4_05, ball_mk4_10, ball_mk4_15, batch, batch0812, batchdes, batchs101006m, batchs121208m, batchs151208m, batchs201210m, clay0203h, clay0203hfsg, clay0203m, clay0204h, clay0204hfsg, clay0204m, clay0205h, clay0205hfsg, clay0205m, clay0303h, clay0303hfsg, clay0303m, clay0304h, clay0304hfsg, clay0304m, clay0305h, clay0305hfsg, clay0305m, color_lab2_4x0\(^*\), color_lab6b_4x20\(^*\), cvxnonsep_normcon20, cvxnonsep_normcon20r, cvxnonsep_normcon30, cvxnonsep_normcon30r, cvxnonsep_normcon40, cvxnonsep_normcon40r, cvxnonsep_nsig20, cvxnonsep_nsig20r, cvxnonsep_nsig30, cvxnonsep_nsig30r, cvxnonsep_nsig40, cvxnonsep_nsig40r, cvxnonsep_pcon20, cvxnonsep_pcon20r, cvxnonsep_pcon30, cvxnonsep_pcon30r, cvxnonsep_pcon40, cvxnonsep_pcon40r, cvxnonsep_psig20, cvxnonsep_psig20r, cvxnonsep_psig30, cvxnonsep_psig30r, cvxnonsep_psig40, cvxnonsep_psig40r, du-opt\(^*\), du-opt5\(^*\), enpro48pb, enpro56pb, ex1223, ex1223a\(^*\), ex1223b, ex4\(^*\), fac1, fac2, fac3\(^*\), flay02h, flay02m, flay03h, flay03m, flay04h, flay04m, flay05h, flay05m, flay06h, flay06m, fo7, fo7_2, fo7_ar25_1, fo7_ar2_1, fo7_ar3_1, fo7_ar4_1, fo7_ar5_1, fo8, fo8_ar25_1, fo8_ar2_1, fo8_ar3_1, fo8_ar4_1, fo8_ar5_1, fo9, fo9_ar25_1, fo9_ar2_1, fo9_ar3_1, fo9_ar4_1, fo9_ar5_1, gams01, gbd\(^*\), hybriddynamic_fixed\(^*\), ibs2, jit1, m3, m6, m7, m7_ar25_1, m7_ar2_1, m7_ar3_1, m7_ar4_1, m7_ar5_1, meanvar-orl400_05_e_8\(^*\), meanvarx\(^*\), meanvarxsc\(^*\), netmod_dol1\(^*\), netmod_dol2\(^*\), netmod_kar1\(^*\), netmod_kar2\(^*\), no7_ar25_1, no7_ar2_1, no7_ar3_1, no7_ar4_1, no7_ar5_1, nvs03, nvs10, nvs11, nvs12, nvs15\(^*\), o7, o7_2, o7_ar25_1, o7_ar2_1, o7_ar3_1, o7_ar4_1, o7_ar5_1, o8_ar4_1, o9_ar4_1, pedigree_ex1058, pedigree_ex485, pedigree_ex485_2, pedigree_sim2000, pedigree_sim400, pedigree_sp_top4_250, pedigree_sp_top4_300, pedigree_sp_top4_350tr, pedigree_sp_top5_200, pedigree_sp_top5_250, portfol_buyin, portfol_card, portfol_classical050_1, portfol_classical200_2, portfol_roundlot, procurement2mot, ravempb, risk2bpb, rsyn0805h, rsyn0805hfsg, rsyn0805m, rsyn0805m02h, rsyn0805m02hfsg, rsyn0805m02m, rsyn0805m03h, rsyn0805m03hfsg, rsyn0805m03m, rsyn0805m04h, rsyn0805m04hfsg, rsyn0805m04m, rsyn0810h, rsyn0810hfsg, rsyn0810m, rsyn0810m02h, rsyn0810m02hfsg, rsyn0810m02m, rsyn0810m03h, rsyn0810m03hfsg, rsyn0810m03m, rsyn0810m04h, rsyn0810m04hfsg, rsyn0810m04m, rsyn0815h, rsyn0815hfsg, rsyn0815m, rsyn0815m02h, rsyn0815m02hfsg, rsyn0815m02m, rsyn0815m03h, rsyn0815m03hfsg, rsyn0815m03m, rsyn0815m04h, rsyn0815m04hfsg, rsyn0815m04m, rsyn0820h, rsyn0820hfsg, rsyn0820m, rsyn0820m02h, rsyn0820m02hfsg, rsyn0820m02m, rsyn0820m03h, rsyn0820m03hfsg, rsyn0820m03m, rsyn0820m04h, rsyn0820m04hfsg, rsyn0820m04m, rsyn0830h, rsyn0830hfsg, rsyn0830m, rsyn0830m02h, rsyn0830m02hfsg, rsyn0830m02m, rsyn0830m03h, rsyn0830m03hfsg, rsyn0830m03m, rsyn0830m04h, rsyn0830m04hfsg, rsyn0830m04m, rsyn0840h, rsyn0840hfsg, rsyn0840m, rsyn0840m02h, rsyn0840m02hfsg, rsyn0840m02m, rsyn0840m03h, rsyn0840m03hfsg, rsyn0840m03m, rsyn0840m04h, rsyn0840m04hfsg, rsyn0840m04m, slay04h\(^*\), slay04m\(^*\), slay05h\(^*\), slay05m\(^*\), slay06h\(^*\), slay06m\(^*\), slay07h\(^*\), slay07m\(^*\), slay08h\(^*\), slay08m\(^*\), slay09h\(^*\), slay09m\(^*\), slay10h\(^*\), slay10m\(^*\), smallinvDAXr1b010-011, smallinvDAXr1b020-022, smallinvDAXr1b050-055, smallinvDAXr1b100-110, smallinvDAXr1b150-165, smallinvDAXr1b200-220, smallinvDAXr2b010-011, smallinvDAXr2b020-022, smallinvDAXr2b050-055, smallinvDAXr2b100-110, smallinvDAXr2b150-165, smallinvDAXr2b200-220, smallinvDAXr3b010-011, smallinvDAXr3b020-022, smallinvDAXr3b050-055, smallinvDAXr3b100-110, smallinvDAXr3b150-165, smallinvDAXr3b200-220, smallinvDAXr4b010-011, smallinvDAXr4b020-022, smallinvDAXr4b050-055, smallinvDAXr4b100-110, smallinvDAXr4b150-165, smallinvDAXr4b200-220, smallinvDAXr5b010-011, smallinvDAXr5b020-022, smallinvDAXr5b050-055, smallinvDAXr5b100-110, smallinvDAXr5b150-165, smallinvDAXr5b200-220, squfl010-025\(^*\), squfl010-040\(^*\), squfl010-080\(^*\), squfl015-060\(^*\), squfl015-080\(^*\), squfl020-040\(^*\), squfl020-050\(^*\), squfl020-150\(^*\), squfl025-025\(^*\), squfl025-030\(^*\), squfl025-040\(^*\), squfl030-100\(^*\), squfl030-150\(^*\), squfl040-080\(^*\), sssd08-04, sssd12-05, sssd15-04, sssd15-06, sssd15-08, sssd16-07, sssd18-06, sssd18-08, sssd20-04, sssd20-08, sssd22-08, sssd25-04, sssd25-08, st_e14, st_miqp1\(^*\), st_miqp2\(^*\), st_miqp3\(^*\), st_miqp4\(^*\), st_miqp5\(^*\), st_test1\(^*\), st_test2\(^*\), st_test3\(^*\), st_test4\(^*\), st_test5\(^*\), st_test6\(^*\), st_test8\(^*\), st_testgr1\(^*\), st_testgr3\(^*\), st_testph4\(^*\), stockcycle, syn05h, syn05hfsg, syn05m, syn05m02h, syn05m02hfsg, syn05m02m, syn05m03h, syn05m03hfsg, syn05m03m, syn05m04h, syn05m04hfsg, syn05m04m, syn10h, syn10hfsg, syn10m, syn10m02h, syn10m02hfsg, syn10m02m, syn10m03h, syn10m03hfsg, syn10m03m, syn10m04h, syn10m04hfsg, syn10m04m, syn15h, syn15hfsg, syn15m, syn15m02h, syn15m02hfsg, syn15m02m, syn15m03h, syn15m03hfsg, syn15m03m, syn15m04h, syn15m04hfsg, syn15m04m, syn20h, syn20hfsg, syn20m, syn20m02h, syn20m02hfsg, syn20m02m, syn20m03h, syn20m03hfsg, syn20m03m, syn20m04h, syn20m04hfsg, syn20m04m, syn30h, syn30hfsg, syn30m, syn30m02h, syn30m02hfsg, syn30m02m, syn30m03h, syn30m03hfsg, syn30m03m, syn30m04h, syn30m04hfsg, syn30m04m, syn40h, syn40hfsg, syn40m, syn40m02h, syn40m02hfsg, syn40m02m, syn40m03h, syn40m03hfsg, syn40m03m, syn40m04h, syn40m04hfsg, syn40m04m, synthes1, synthes2, synthes3, tls12, tls2, tls4, tls5, tls6, tls7, unitcommit1\(^*\), unitcommit_200_100_1_mod_8\(^*\), unitcommit_200_100_2_mod_8\(^*\), unitcommit_50_20_2_mod_8\(^*\), watercontamination0202\(^*\), watercontamination0202r\(^*\), watercontamination0303\(^*\), watercontamination0303r\(^*\)
Appendix C: Used solver options in the benchmark
In the comparison in Sect. 7.1, the goal was to use the default solver options as much as possible. However, several of the solvers have certain default parameter values that makes them terminate prematurely, and these were then increased to avoid this behavior. Also convex strategies are activated for solvers supporting this, and if the solver has recommended parameters for convex problems, these were used. The used parameters listed in Table 2 are more or less the same as in [37], and are explained further there.
Table 2 The used parameters for the solvers in the benchmark