This code implements a sequential quadratic programming (SQP) algorithm for nonlinearly constrained gradient-based optimization, and was originally written by Dieter Kraft and described in: Dieter Kraft, "A software package for sequential quadratic programming", Technical Report DFVLR-FB 88-28, Institut für Dynamik der Flugsysteme, Oberpfaffenhofen, July 1988. Dieter Kraft, "Algorithm 733: TOMP–Fortran modules for optimal control calculations," ACM Transactions on Mathematical Software, vol. 20, no. 3, pp. 262-281 (1994). (I believe that SLSQP stands for something like Sequential Least-Squares Quadratic Programming, because the problem is treated as a sequence of constrained least-squared problems, but such a least-squares problem is equivalent to a QP.) The actual Fortran file was obtained from the SciPy project, who are responsible for obtaining permission to distribute it under a free-software (3-clause BSD) license (see the permission email from ACM at the top of slsqp.c, and also projects.scipy.org/scipy/ticket/1056). The code was modified for inclusion in NLopt by S. G. Johnson in 2010, with the following changes. The code was converted to C and manually cleaned up. It was modified to be re-entrant, preserving the reverse-communication interface but explicitly saving the state in a data structure. The reverse-communication interface was wrapped with an NLopt-style inteface, with NLopt stopping conditions. The inexact line search was modified to evaluate the functions including gradients for the first step, since this removes the need to evaluate the function+gradient a second time for the same point in the common case when the inexact line search concludes after a single step, since NLopt's interface combines the function and gradient computations. Since roundoff errors sometimes pushed SLSQP's parameters slightly outside the bound constraints (not allowed by NLopt), we added checks to force the parameters within the bounds. Fixed a bug in LSEI (use of uninitialized variables) for the case where the number of equality constraints equals the dimension of the problem. The LSQ subroutine was modified to handle infinite lower/upper bounds (in which case those constraints are omitted). The exact line-search option is currently disabled; if we want to re-enable this (although exact line-search is usually overkill in these kinds of algorithms), we plan to do so using a recursive call to NLopt. (This will allow a user-specified line-search algorithm to be used, and will allow the gradient to be exploited in the exact line search, in contrast to the routine provided with SLSQP.)