chiark / gitweb /
Merge pull request #73 from jschueller/tests
authorJulien Schueller <schueller@phimeca.com>
Thu, 14 Jul 2016 09:12:12 +0000 (11:12 +0200)
committerGitHub <noreply@github.com>
Thu, 14 Jul 2016 09:12:12 +0000 (11:12 +0200)
Update tests

.travis.yml
CMakeLists.txt
cmake/FindGuile.cmake
octave/CMakeLists.txt
swig/CMakeLists.txt
test/CMakeLists.txt
test/t_guile.scm [new file with mode: 0644]
test/t_octave.m [new file with mode: 0644]
test/t_python.py [new file with mode: 0644]
test/test_std.py [deleted file]

index 92021c4cecc4fdf56ebe15d0c462351619c5d579..d1f8a36cc048b88792d508ccfa75a9284575f680 100644 (file)
@@ -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
index 1cf877f9684476d04fa2c73823d5ea6fd642aa5b..3fa727cc02c0057fe0c39103aa7498458303bf10 100644 (file)
@@ -26,6 +26,7 @@ option (WITH_CXX "enable cxx routines" OFF)
 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
@@ -272,7 +273,12 @@ if (BUILD_OCTAVE)
   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
index c2862d0cc17f0184c660c1e2fc7f96a451f29d67..48cdf44c201e068b91061036a7abc0e30b76d56f 100644 (file)
@@ -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)
index 54534623c26f52578f828f70ec9732a100976a16..0c8e6f3d3d87efd023d986903147a255c21542ed 100644 (file)
@@ -1,25 +1,31 @@
 
-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 ()
index 6eb98737ad04b0a9b65cbda1b52cf520dfd169f4..fafb5124c78e6eb7a3ad1b88c61837d65ccea39e 100644 (file)
@@ -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})
index 4b5ae239b6f239d547fd607f5437d20dfbfdfd6f..50dfb178507711e456a4a456b22054047a3570ff 100644 (file)
@@ -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
diff --git a/test/t_guile.scm b/test/t_guile.scm
new file mode 100644 (file)
index 0000000..99f3577
--- /dev/null
@@ -0,0 +1,36 @@
+(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)
diff --git a/test/t_octave.m b/test/t_octave.m
new file mode 100644 (file)
index 0000000..f9d863b
--- /dev/null
@@ -0,0 +1,31 @@
+
+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])
diff --git a/test/t_python.py b/test/t_python.py
new file mode 100644 (file)
index 0000000..8dee3db
--- /dev/null
@@ -0,0 +1,30 @@
+#!/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())
diff --git a/test/test_std.py b/test/test_std.py
deleted file mode 100644 (file)
index f7bfca6..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/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)