Hostname: page-component-77f85d65b8-8v9h9 Total loading time: 0 Render date: 2026-04-22T10:24:27.978Z Has data issue: false hasContentIssue false

CSOLNP: Numerical Optimization Engine for Solving Non-linearly Constrained Problems

Published online by Cambridge University Press:  24 May 2017

Mahsa Zahery*
Affiliation:
Department of Computer Science, Virginia Commonwealth University, Richmond, Virginia, USA
Hermine H. Maes
Affiliation:
Department of Psychiatry, Virginia Commonwealth University, Richmond, Virginia, USA
Michael C. Neale
Affiliation:
Department of Psychiatry, Virginia Commonwealth University, Richmond, Virginia, USA
*
address for correspondence: Mahsa Zahery, Department of Computer Science, Virginia Commonwealth University, Richmond, VA 23284, USA. E-mail: zaherym@vcu.edu

Abstract

We introduce the optimizer CSOLNP, which is a C++ implementation of the R package RSOLNP (Ghalanos & Theussl, 2012, Rsolnp: General non-linear optimization using augmented Lagrange multiplier method. R package version, 1) alongside some improvements. CSOLNP solves non-linearly constrained optimization problems using a Sequential Quadratic Programming (SQP) algorithm. CSOLNP, NPSOL (a very popular implementation of SQP method in FORTRAN (Gill et al., 1986, User's guide for NPSOL (version 4.0): A Fortran package for nonlinear programming (No. SOL-86-2). Stanford, CA: Stanford University Systems Optimization Laboratory), and SLSQP (another SQP implementation available as part of the NLOPT collection (Johnson, 2014, The NLopt nonlinear-optimization package. Retrieved from http://ab-initio.mit.edu/nlopt)) are three optimizers available in OpenMx package. These optimizers are compared in terms of runtimes, final objective values, and memory consumption. A Monte Carlo analysis of the performance of the optimizers was performed on ordinal and continuous models with five variables and one or two factors. While the relative difference between the objective values is less than 0.5%, CSOLNP is in general faster than NPSOL and SLSQP for ordinal analysis. As for continuous data, none of the optimizers performs consistently faster than the others. In terms of memory usage, we used Valgrind's heap profiler tool, called Massif, on one-factor threshold models. CSOLNP and NPSOL consume the same amount of memory, while SLSQP uses 71 MB more memory than the other two optimizers.

Information

Type
Articles
Copyright
Copyright © The Author(s) 2017 
Figure 0

FIGURE 1 A flowchart of CSOLNP's algorithm. Starting with initial set of free variables x0, and Lagrange multipliers u0, the search directions dkx and dku are found by solving a QP sub-problem. Finding an appropriate step length α, CSOLNP updates the free variables and Lagrange multipliers. If the difference between the current objective value and the previous objective value is less than the optimality tolerance, the point estimates are considered to be converged, and CSOLNP reports the final set of free variables as the optimum. Otherwise, the Hessian matrix H is updated, and CSOLNP continues with the next iteration.

Figure 1

FIGURE 2 Runtimes of CSOLNP, NPSOL, and SLSQP in logarithmic scale for threshold models with (a) five variables and one factor, and (b) five variables and two factors for a sample of size of 1,000. Runtimes are averaged over 250 different runs.

Figure 2

FIGURE 3 Runtimes of CSOLNP, NPSOL, and SLSQP in logarithmic scale for threshold models with (a) five variables and one factor, and (b) five variables and two factors for a sample of size of 10,000. Runtimes are averaged over 250 different runs.

Figure 3

FIGURE 4 Runtimes of CSOLNP, NPSOL, and SLSQP in logarithmic scale for threshold models with (a) five variables and one factor, and (b) five variables and two factors for a sample of size of 20,000. Runtimes are averaged over 250 different runs.

Figure 4

FIGURE 5 Runtimes of CSOLNP, NPSOL, and SLSQP in logarithmic scale for continuous models with (a) five variables and one factor, and (b) five variables and two factors for samples of sizes 1,000, 10,000, and 20,000. Runtimes are averaged over 250 different runs.