AC_SUBST(GUILE_LIBS)
AM_CONDITIONAL(WITH_GUILE, test x"$GUILE_CONFIG" != "xunknown")
+dnl Python:
+AM_PATH_PYTHON([],[have_python=yes],[have_python=no])
+if test $have_python = yes; then
+ pdir=`dirname $pythondir | sed 's,/lib/,/include/,'`
+ pdir=`eval echo $pdir`
+ AC_MSG_CHECKING([for Python include directory])
+ for PYTHON_INCLUDE_DIR in "$pdir" /usr/include/python$PYTHON_VERSION /usr/local/include/python$PYTHON_VERSION unknown; do
+ test -d "$PYTHON_INCLUDE_DIR" && break
+ done
+ AC_MSG_RESULT([$PYTHON_INCLUDE_DIR])
+ if test "x$PYTHON_INCLUDE_DIR" = xunknown; then
+ AC_MSG_WARN([disabling Python wrappers])
+ have_python=no
+ fi
+ AC_SUBST(PYTHON_INCLUDE_DIR)
+fi
+AM_CONDITIONAL(WITH_PYTHON, test x"$have_python" = "xyes")
+
dnl -----------------------------------------------------------------------
dnl Compiling Octave plug-in
SWIG_SRC = nlopt.i nlopt-exceptions.i nlopt-enum-renames.i
-EXTRA_DIST = $(SWIG_SRC) nlopt-guile.i nlopt-python.i nlopt.scm.in
+EXTRA_DIST = $(SWIG_SRC) nlopt-guile.i nlopt-python.i nlopt.scm.in nlopt.py
-BUILT_SOURCES = nlopt-guile.cpp nlopt-enum-renames.i nlopt.scm.in
+BUILT_SOURCES = nlopt-guile.cpp nlopt-python.cpp nlopt-enum-renames.i nlopt.scm.in
HDR = $(top_builddir)/api/nlopt.hpp
guilelib = libnlopt@NLOPT_SUFFIX@_guile.la
endif
+##############################################################################
+# Python wrapper
+
+libnlopt_python_la_SOURCES = nlopt-python.cpp
+libnlopt_python_la_LIBADD = ../libnlopt@NLOPT_SUFFIX@.la
+libnlopt_python_la_LDFLAGS = -no-undefined -version-info @SHARED_VERSION_INFO@
+libnlopt_python_la_CPPFLAGS = -I$(PYTHON_INCLUDE_DIR) -I$(top_builddir)/api
+if WITH_PYTHON
+python_PYTHON = nlopt.py
+pyexec_LTLIBRARIES = libnlopt_python.la
+endif
##############################################################################
+
lib_LTLIBRARIES = $(guilelib)
##############################################################################
$3 = free_guilefunc;
$4 = dup_guilefunc;
}
-%typecheck(SWIG_TYPECHECK_POINTER)(nlopt::vfunc vf, void *f_data) {
+%typecheck(SWIG_TYPECHECK_POINTER)(nlopt::vfunc vf, void *f_data, nlopt_munge md, nlopt_munge mc) {
$1 = SCM_NFALSEP(scm_procedure_p($input));
}
(PyArrayObject* array=NULL, int is_new_object=0, std::vector<double> arrayv)
{
npy_intp size[1] = { -1 };
- array = obj_to_array_allow_conversion($input, DATA_TYPECODE, &is_new_object);
+ array = obj_to_array_allow_conversion($input, NPY_DOUBLE, &is_new_object);
if (!array || !require_dimensions(array, 1) ||
!require_size(array, size, 1)) SWIG_fail;
arrayv = std::vector<double>(array_size(array,0));
static double func_python(unsigned n, const double *x, double *grad, void *f)
{
- npy_intp sz = npy_intp(n), sz0 = 0;
- PyObject *xpy = PyArray_SimpleNewFromData(1, &sz, NPY_DOUBLE, x);
+ npy_intp sz = npy_intp(n), sz0 = 0, stride1 = 1;
+ PyObject *xpy = PyArray_New(&PyArray_Type, 1, &sz, NPY_DOUBLE, &stride1,
+ const_cast<double*>(x), // not NPY_WRITEABLE
+ 0, NPY_C_CONTIGUOUS | NPY_ALIGNED, NULL);
PyObject *gradpy = grad ? PyArray_SimpleNew(1, &sz0, NPY_DOUBLE)
: PyArray_SimpleNewFromData(1, &sz, NPY_DOUBLE, grad);
$3 = free_pyfunc;
$4 = dup_pyfunc;
}
-%typecheck(SWIG_TYPECHECK_POINTER)(nlopt::func f, void *f_data) {
+%typecheck(SWIG_TYPECHECK_POINTER)(nlopt::func f, void *f_data, nlopt_munge md, nlopt_munge mc) {
$1 = PyCallable_Check($input);
}