提交 cfa6abb9 编写于 作者: J Julien Schueller 提交者: GitHub

Merge pull request #73 from jschueller/tests

Update tests
......@@ -33,8 +33,10 @@ matrix:
- 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
......@@ -26,6 +26,7 @@ option (WITH_CXX "enable cxx routines" OFF)
option (BUILD_SHARED_LIBS "Build NLOPT as a shared library" ON)
option (BUILD_PYTHON "build python bindings" ON)
option (BUILD_OCTAVE "build octave bindings" ON)
option (BUILD_MATLAB "build matlab bindings" OFF)
option (BUILD_GUILE "build guile bindings" ON)
option (USE_SWIG "use SWIG to build bindings" ON)
......@@ -272,7 +273,12 @@ if (BUILD_OCTAVE)
find_package (Octave)
endif ()
if (OCTAVE_FOUND)
if (BUILD_MATLAB)
cmake_minimum_required (VERSION 3.3) # for the matlab_add_mex macro
find_package (Matlab)
endif ()
if (OCTAVE_FOUND OR Matlab_FOUND)
add_subdirectory (octave)
endif ()
......
......@@ -62,6 +62,10 @@ if (GUILE_INCLUDE_DIR)
endif ()
find_program(GUILE_EXECUTABLE
NAMES guile
)
find_program(GUILE_CONFIG_EXECUTABLE
NAMES guile-config
)
......@@ -71,7 +75,7 @@ if (GUILE_CONFIG_EXECUTABLE)
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 ()
......@@ -58,7 +58,7 @@ if (GUILE_FOUND AND ((SWIG_FOUND AND SWIG_VERSION VERSION_GREATER 2.0.9) OR (EXI
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})
......
......@@ -18,6 +18,10 @@ foreach (algo_index RANGE 29)# 42
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 ()
......@@ -28,6 +32,18 @@ if (NUMPY_FOUND AND PYTHONLIBS_FOUND AND (SWIG_FOUND OR (EXISTS ${CMAKE_SOURCE_D
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
(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)
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])
#!/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())
#!/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)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册