- os: osx
install:
- brew tap homebrew/python
- - brew install swig python
+ - brew tap homebrew/science
+ - brew update
+ - brew install swig numpy octave guile
script:
- mkdir build && pushd build
- cmake -DCMAKE_INSTALL_PREFIX=~/.local -DWITH_CXX=ON ..
- - make install && make tests && ctest --output-on-failure
\ No newline at end of file
+ - make install && make tests && ctest --output-on-failure
option (BUILD_SHARED_LIBS "Build NLOPT as a shared library" ON)\r
option (BUILD_PYTHON "build python bindings" ON)\r
option (BUILD_OCTAVE "build octave bindings" ON)\r
+option (BUILD_MATLAB "build matlab bindings" OFF)\r
option (BUILD_GUILE "build guile bindings" ON)\r
option (USE_SWIG "use SWIG to build bindings" ON)\r
\r
find_package (Octave)\r
endif ()\r
\r
-if (OCTAVE_FOUND)\r
+if (BUILD_MATLAB)\r
+ cmake_minimum_required (VERSION 3.3) # for the matlab_add_mex macro\r
+ find_package (Matlab)\r
+endif ()\r
+\r
+if (OCTAVE_FOUND OR Matlab_FOUND)\r
add_subdirectory (octave)\r
endif ()\r
\r
endif ()
+find_program(GUILE_EXECUTABLE
+ NAMES guile
+ )
+
find_program(GUILE_CONFIG_EXECUTABLE
NAMES guile-config
)
execute_process (COMMAND ${GUILE_CONFIG_EXECUTABLE} info prefix
OUTPUT_VARIABLE GUILE_ROOT_DIR
OUTPUT_STRIP_TRAILING_WHITESPACE)
-
+
execute_process (COMMAND ${GUILE_CONFIG_EXECUTABLE} info sitedir
OUTPUT_VARIABLE GUILE_SITE_DIR
OUTPUT_STRIP_TRAILING_WHITESPACE)
-file (WRITE ${CMAKE_CURRENT_BINARY_DIR}/nlopt_optimize_usage.h "#define NLOPT_OPTIMIZE_USAGE \\\n")
-file (STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/nlopt_optimize.m INPUT_LINES)
-foreach (INPUT_LINE ${INPUT_LINES})
- string (REGEX REPLACE "^% " "" INPUT_LINE ${INPUT_LINE})
- string (REGEX REPLACE "^%" "" INPUT_LINE ${INPUT_LINE})
- foreach (repl_expr "tolerance" "help NLOPT_LN_SBPLX" "population")
- string (REGEX REPLACE "\"${repl_expr}\"" "${repl_expr}" INPUT_LINE "${INPUT_LINE}")
+if (OCTAVE_FOUND)
+ file (WRITE ${CMAKE_CURRENT_BINARY_DIR}/nlopt_optimize_usage.h "#define NLOPT_OPTIMIZE_USAGE \\\n")
+ file (STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/nlopt_optimize.m INPUT_LINES)
+ foreach (INPUT_LINE ${INPUT_LINES})
+ string (REGEX REPLACE "^% " "" INPUT_LINE ${INPUT_LINE})
+ string (REGEX REPLACE "^%" "" INPUT_LINE ${INPUT_LINE})
+ foreach (repl_expr "tolerance" "help NLOPT_LN_SBPLX" "population")
+ string (REGEX REPLACE "\"${repl_expr}\"" "${repl_expr}" INPUT_LINE "${INPUT_LINE}")
+ endforeach ()
+ file (APPEND ${CMAKE_CURRENT_BINARY_DIR}/nlopt_optimize_usage.h "\"${INPUT_LINE}\\n\" \\\n")
endforeach ()
- file (APPEND ${CMAKE_CURRENT_BINARY_DIR}/nlopt_optimize_usage.h "\"${INPUT_LINE}\\n\" \\\n")
-endforeach ()
-file (APPEND ${CMAKE_CURRENT_BINARY_DIR}/nlopt_optimize_usage.h "\n")
+ file (APPEND ${CMAKE_CURRENT_BINARY_DIR}/nlopt_optimize_usage.h "\n")
-include_directories (${OCTAVE_INCLUDE_DIRS})
-include_directories (${CMAKE_CURRENT_BINARY_DIR})
-octave_add_oct (nlopt_optimize SOURCES nlopt_optimize-oct.cc ${CMAKE_CURRENT_BINARY_DIR}/nlopt_optimize_usage.h LINK_LIBRARIES ${nlopt_lib})
+ include_directories (${OCTAVE_INCLUDE_DIRS})
+ include_directories (${CMAKE_CURRENT_BINARY_DIR})
+ octave_add_oct (nlopt_optimize SOURCES nlopt_optimize-oct.cc ${CMAKE_CURRENT_BINARY_DIR}/nlopt_optimize_usage.h LINK_LIBRARIES ${nlopt_lib})
-file (RELATIVE_PATH PKG_OCTAVE_OCT_SITE_DIR ${OCTAVE_ROOT_DIR} ${OCTAVE_OCT_SITE_DIR})
-install (TARGETS nlopt_optimize DESTINATION ${PKG_OCTAVE_OCT_SITE_DIR})
+ file (RELATIVE_PATH PKG_OCTAVE_OCT_SITE_DIR ${OCTAVE_ROOT_DIR} ${OCTAVE_OCT_SITE_DIR})
+ install (TARGETS nlopt_optimize DESTINATION ${PKG_OCTAVE_OCT_SITE_DIR})
-set (MFILES NLOPT_GN_DIRECT.m NLOPT_GN_DIRECT_L.m NLOPT_GN_DIRECT_L_RAND.m NLOPT_GN_DIRECT_NOSCAL.m NLOPT_GN_DIRECT_L_NOSCAL.m NLOPT_GN_DIRECT_L_RAND_NOSCAL.m NLOPT_GN_ORIG_DIRECT.m NLOPT_GN_ORIG_DIRECT_L.m NLOPT_GD_STOGO.m NLOPT_GD_STOGO_RAND.m NLOPT_LD_LBFGS_NOCEDAL.m NLOPT_LD_LBFGS.m NLOPT_LN_PRAXIS.m NLOPT_LD_VAR1.m NLOPT_LD_VAR2.m NLOPT_LD_TNEWTON.m NLOPT_LD_TNEWTON_RESTART.m NLOPT_LD_TNEWTON_PRECOND.m NLOPT_LD_TNEWTON_PRECOND_RESTART.m NLOPT_GN_CRS2_LM.m NLOPT_GN_MLSL.m NLOPT_GD_MLSL.m NLOPT_GN_MLSL_LDS.m NLOPT_GD_MLSL_LDS.m NLOPT_LD_MMA.m NLOPT_LN_COBYLA.m NLOPT_LN_NEWUOA.m NLOPT_LN_NEWUOA_BOUND.m NLOPT_LN_NELDERMEAD.m NLOPT_LN_SBPLX.m NLOPT_LN_AUGLAG.m NLOPT_LD_AUGLAG.m NLOPT_LN_AUGLAG_EQ.m NLOPT_LD_AUGLAG_EQ.m NLOPT_LN_BOBYQA.m NLOPT_GN_ISRES.m NLOPT_AUGLAG.m NLOPT_AUGLAG_EQ.m NLOPT_G_MLSL.m NLOPT_G_MLSL_LDS.m NLOPT_LD_SLSQP.m NLOPT_LD_CCSAQ.m NLOPT_GN_ESCH.m)
-set (M_DATA ${MFILES} nlopt_minimize.m nlopt_minimize_constrained.m nlopt_optimize.m)
+ set (MFILES NLOPT_GN_DIRECT.m NLOPT_GN_DIRECT_L.m NLOPT_GN_DIRECT_L_RAND.m NLOPT_GN_DIRECT_NOSCAL.m NLOPT_GN_DIRECT_L_NOSCAL.m NLOPT_GN_DIRECT_L_RAND_NOSCAL.m NLOPT_GN_ORIG_DIRECT.m NLOPT_GN_ORIG_DIRECT_L.m NLOPT_GD_STOGO.m NLOPT_GD_STOGO_RAND.m NLOPT_LD_LBFGS_NOCEDAL.m NLOPT_LD_LBFGS.m NLOPT_LN_PRAXIS.m NLOPT_LD_VAR1.m NLOPT_LD_VAR2.m NLOPT_LD_TNEWTON.m NLOPT_LD_TNEWTON_RESTART.m NLOPT_LD_TNEWTON_PRECOND.m NLOPT_LD_TNEWTON_PRECOND_RESTART.m NLOPT_GN_CRS2_LM.m NLOPT_GN_MLSL.m NLOPT_GD_MLSL.m NLOPT_GN_MLSL_LDS.m NLOPT_GD_MLSL_LDS.m NLOPT_LD_MMA.m NLOPT_LN_COBYLA.m NLOPT_LN_NEWUOA.m NLOPT_LN_NEWUOA_BOUND.m NLOPT_LN_NELDERMEAD.m NLOPT_LN_SBPLX.m NLOPT_LN_AUGLAG.m NLOPT_LD_AUGLAG.m NLOPT_LN_AUGLAG_EQ.m NLOPT_LD_AUGLAG_EQ.m NLOPT_LN_BOBYQA.m NLOPT_GN_ISRES.m NLOPT_AUGLAG.m NLOPT_AUGLAG_EQ.m NLOPT_G_MLSL.m NLOPT_G_MLSL_LDS.m NLOPT_LD_SLSQP.m NLOPT_LD_CCSAQ.m NLOPT_GN_ESCH.m)
+ set (M_DATA ${MFILES} nlopt_minimize.m nlopt_minimize_constrained.m nlopt_optimize.m)
-file (RELATIVE_PATH PKG_OCTAVE_M_SITE_DIR ${OCTAVE_ROOT_DIR} ${OCTAVE_M_SITE_DIR})
-install (FILES ${M_DATA} DESTINATION ${PKG_OCTAVE_M_SITE_DIR})
+ file (RELATIVE_PATH PKG_OCTAVE_M_SITE_DIR ${OCTAVE_ROOT_DIR} ${OCTAVE_M_SITE_DIR})
+ install (FILES ${M_DATA} DESTINATION ${PKG_OCTAVE_M_SITE_DIR})
+endif ()
+
+if (Matlab_FOUND)
+ matlab_add_mex (NAME nlopt_optimize-mex SRC nlopt_optimize-mex.c OUTPUT_NAME nlopt_optimize LINK_TO ${nlopt_lib})
+endif ()
configure_file (${CMAKE_CURRENT_SOURCE_DIR}/nlopt.scm.in ${CMAKE_CURRENT_BINARY_DIR}/nlopt.scm @ONLY)
endif ()
- set (SWIG_MODULE_nlopt_guile_REAL_NAME nlopt_guile)
+ set (SWIG_MODULE_nlopt_guile_REAL_NAME nlopt${NLOPT_SUFFIX}_guile)
add_library (${SWIG_MODULE_nlopt_guile_REAL_NAME} MODULE ${guile_cpp_source})
target_link_libraries(${SWIG_MODULE_nlopt_guile_REAL_NAME} ${nlopt_lib})
target_link_libraries(${SWIG_MODULE_nlopt_guile_REAL_NAME} ${GUILE_LIBRARIES})
if (algo_index STREQUAL 10)
set (enable_ FALSE)
endif ()
+ # LN_NEWUOA_BOUND timeouts on msvc
+ if (algo_index STREQUAL 27)
+ set (enable_ FALSE)
+ endif ()
if (enable_)
add_test (NAME testopt_algo${algo_index}_obj${obj_index} COMMAND testopt -a ${algo_index} -o ${obj_index})
endif ()
set (PYINSTALLCHECK_ENVIRONMENT "LD_LIBRARY_PATH=${INSTALL_DESTDIR}${INSTALL_LIB_DIR}:$ENV{LD_LIBRARY_PATH}"
"PYTHONPATH=${INSTALL_DESTDIR}${CMAKE_INSTALL_PREFIX}/${PYTHON_MODULE_PATH}${PATH_SEP}$ENV{PYTHONPATH}"
)
- add_test (NAME test_std_python COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_std.py)
- set_tests_properties (test_std_python PROPERTIES ENVIRONMENT "${PYINSTALLCHECK_ENVIRONMENT}")
+ add_test (NAME test_python COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/t_python.py)
+ set_tests_properties (test_python PROPERTIES ENVIRONMENT "${PYINSTALLCHECK_ENVIRONMENT}")
+endif ()
+
+if (OCTAVE_FOUND)
+ add_test (NAME test_octave COMMAND ${OCTAVE_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/t_octave.m ${CMAKE_SOURCE_DIR}/octave ${CMAKE_BINARY_DIR}/octave)
endif ()
+
+if (GUILE_FOUND AND ((SWIG_FOUND AND SWIG_VERSION VERSION_GREATER 2.0.9) OR (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/nlopt-guile.cpp)))
+ set (GUILECHECK_ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/swig"
+ "GUILE_LOAD_PATH=${CMAKE_BINARY_DIR}/swig"
+ )
+ add_test (NAME test_guile COMMAND ${GUILE_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/t_guile.scm)
+ set_tests_properties (test_guile PROPERTIES ENVIRONMENT "${GUILECHECK_ENVIRONMENT}")
+endif ()
\ No newline at end of file
--- /dev/null
+(use-modules (nlopt))
+
+(define (myfunc x grad)
+ (if grad
+ (begin
+ (vector-set! grad 0 0.0)
+ (vector-set! grad 1 (/ 0.5 (sqrt (vector-ref x 1))))))
+ (sqrt (vector-ref x 1)))
+
+(define (myconstraint x grad a b)
+ (let ((x0 (vector-ref x 0)) (x1 (vector-ref x 1)))
+ (if grad
+ (begin
+ (vector-set! grad 0 (* 3 a (expt (+ (* a x0) b) 2)))
+ (vector-set! grad 1 -1.0)))
+ (- (expt (+ (* a x0) b) 3) x1)))
+
+(define opt (new-nlopt-opt NLOPT-LD-MMA 2))
+(nlopt-opt-set-lower-bounds opt (vector (- (inf)) 0))
+(nlopt-opt-set-min-objective opt myfunc)
+(nlopt-opt-add-inequality-constraint opt (lambda (x grad)
+ (myconstraint x grad 2 0))
+ 1e-8)
+(nlopt-opt-add-inequality-constraint opt (lambda (x grad)
+ (myconstraint x grad -1 1))
+ 1e-8)
+(nlopt-opt-set-xtol-rel opt 1e-4)
+(define x (nlopt-opt-optimize opt (vector 1.234 5.678)))
+(define minf (nlopt-opt-last-optimum-value opt))
+(define result (nlopt-opt-last-optimize-result opt))
+(display "x=")
+(display x)
+(newline)
+(display "minf=")
+(display minf)
+(newline)
--- /dev/null
+
+arg_list = argv ();
+for i = 1:nargin
+ loadpath = arg_list{i};
+ printf ('-- adding path: %s\n', loadpath);
+ addpath (loadpath);
+endfor
+
+function [val, gradient] = myfunc(x)
+ val = sqrt(x(2));
+ if (nargout > 1)
+ gradient = [0, 0.5 / val];
+ end
+endfunction
+
+function [val, gradient] = myconstraint(x,a,b)
+ val = (a*x(1) + b)^3 - x(2);
+ if (nargout > 1)
+ gradient = [3*a*(a*x(1) + b)^2, -1];
+ end
+endfunction
+
+
+opt.algorithm = NLOPT_LD_MMA
+% opt.algorithm = NLOPT_LN_COBYLA
+opt.lower_bounds = [-inf, 0]
+opt.min_objective = @myfunc
+opt.fc = { (@(x) myconstraint(x,2,0)), (@(x) myconstraint(x,-1,1)) }
+opt.fc_tol = [1e-8, 1e-8];
+opt.xtol_rel = 1e-4
+[xopt, fmin, retcode] = nlopt_optimize(opt, [1.234 5.678])
--- /dev/null
+#!/usr/bin/env python
+
+from __future__ import print_function
+import nlopt
+import numpy as np
+
+
+def myfunc(x, grad):
+ if grad.size > 0:
+ grad[0] = 0.0
+ grad[1] = 0.5 / np.sqrt(x[1])
+ return np.sqrt(x[1])
+
+def myconstraint(x, grad, a, b):
+ if grad.size > 0:
+ grad[0] = 3 * a * (a*x[0] + b)**2
+ grad[1] = -1.0
+ return (a*x[0] + b)**3 - x[1]
+
+opt = nlopt.opt(nlopt.LD_MMA, 2)
+opt.set_lower_bounds([-float('inf'), 0])
+opt.set_min_objective(myfunc)
+opt.add_inequality_constraint(lambda x,grad: myconstraint(x,grad,2,0), 1e-8)
+opt.add_inequality_constraint(lambda x,grad: myconstraint(x,grad,-1,1), 1e-8)
+opt.set_xtol_rel(1e-4)
+x = opt.optimize([1.234, 5.678])
+minf = opt.last_optimum_value()
+print('optimum at ', x[0],x[1])
+print('minimum value = ', minf)
+print('result code = ', opt.last_optimize_result())
+++ /dev/null
-#!/usr/bin/env python
-
-from __future__ import print_function
-import nlopt
-import numpy as np
-
-print ('nlopt version=', nlopt.__version__)
-
-def f(x, grad):
- F, L, E, I = x
- D=F*L**3/(3.*E*I)
- return D
-
-n = 4
-opt = nlopt.opt(nlopt.LN_COBYLA, n)
-opt.set_min_objective(f)
-lb = np.array([40., 50., 30e3, 1.])
-ub = np.array([60., 60., 40e3, 10.])
-x = (lb+ub)/2.
-opt.set_lower_bounds(lb)
-opt.set_upper_bounds(ub)
-opt.set_xtol_rel(1e-3)
-opt.set_ftol_rel(1e-3)
-xopt = opt.optimize(x)
-
-opt_val = opt.last_optimum_value()
-result = opt.last_optimize_result()
-print ('opt_result=', result)
-print ('optimizer=', xopt)
-print ('opt_val=', opt_val)