chiark / gitweb /
python plugin compiles (untested)
authorstevenj <stevenj@alum.mit.edu>
Mon, 7 Jun 2010 03:30:53 +0000 (23:30 -0400)
committerstevenj <stevenj@alum.mit.edu>
Mon, 7 Jun 2010 03:30:53 +0000 (23:30 -0400)
darcs-hash:20100607033053-c8de0-9dd5b50f08cc6ae4708bf76a1dd75dd42b84aa2b.gz

configure.ac
swig/Makefile.am
swig/nlopt-guile.i
swig/nlopt-python.i

index 760e941e6cd8ab59e3f952967280106c3c4a25b0..4782d6caad4bcbb52a820307c80869fa6025b50e 100644 (file)
@@ -123,6 +123,24 @@ AC_SUBST(GUILE_CPPFLAGS)
 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
 
index 74c061985030f2da4af522da6c3072eb4d399b0f..663442cdeebb4dc2ec82d1005ff839ddaa4fc58a 100644 (file)
@@ -1,7 +1,7 @@
 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
 
@@ -19,10 +19,22 @@ guile_DATA = nlopt.scm
 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)
 
 ##############################################################################
index 1978a130b9c275b89bb64c62702a8c5d8369adb1..f70b6e0393a567488032311ff8ea0c59e10c53a7 100644 (file)
@@ -42,7 +42,7 @@ static double func_guile(unsigned n, const double *x, double *grad, void *f) {
   $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));
 }
 
index cd46acde0eac5d72e2bbd5d867498d5dd1a4dd58..cbfe99c532b4f8c2422772c59237b7730474f04a 100644 (file)
@@ -27,7 +27,7 @@
 (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));
@@ -64,8 +64,10 @@ static void *dup_pyfunc(void *p) { Py_INCREF((PyObject*) p); return p; }
 
 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);
   
@@ -94,6 +96,6 @@ static double func_python(unsigned n, const double *x, double *grad, void *f)
   $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);
 }