Skip to content

Commit

Permalink
Build separate GSL/native Python modules.
Browse files Browse the repository at this point in the history
  • Loading branch information
stevencwilliams committed Jan 10, 2011
1 parent 32e682c commit 27db9e4
Show file tree
Hide file tree
Showing 4 changed files with 571 additions and 163 deletions.
13 changes: 8 additions & 5 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
CXXFLAGS = -Wall
# OUTPUT_OPTION = -o .obj/$@
swig_flags = -Wall -c++ -python
swig_flags = -Wall -c++ -python -outputtuple
objects = assortativity.o \
betweenness_bin.o \
betweenness_wei.o \
Expand Down Expand Up @@ -90,9 +90,12 @@ libbct.a: $(objects)
$(AR) rcs libbct.a $(objects)

swig: $(objects)
swig $(swig_flags) -o bct_wrap.cpp bct.i
$(CXX) $(CXXFLAGS) -c -I$(python_dir) bct_wrap.cpp
$(CXX) $(CXXFLAGS) -lgsl -lgslcblas $(swig_lib_flags) -o _bct.so $(objects) bct_wrap.o
swig $(swig_flags) -o bct_gsl_wrap.cpp bct_gsl.i
swig $(swig_flags) -o bct_py_wrap.cpp bct_py.i
$(CXX) $(CXXFLAGS) -c -I$(python_dir) bct_gsl_wrap.cpp
$(CXX) $(CXXFLAGS) -c -I$(python_dir) bct_py_wrap.cpp
$(CXX) $(CXXFLAGS) -lgsl -lgslcblas $(swig_lib_flags) -o _bct_gsl.so $(objects) bct_gsl_wrap.o
$(CXX) $(CXXFLAGS) -lgsl -lgslcblas $(swig_lib_flags) -o _bct_py.so $(objects) bct_py_wrap.o

$(objects): matlab/matlab.h bct.h

Expand All @@ -115,4 +118,4 @@ uninstall:
-rm $(install_dir)/lib/libbct.a

clean:
-rm _bct.so bct.py bct.pyc bct_swig.o bct_wrap.cpp bct_wrap.o libbct.a $(objects)
-rm _bct_gsl.so _bct_py.so bct_gsl.py bct_py.py bct_gsl.pyc bct_py.pyc bct_gsl_wrap.cpp bct_py_wrap.cpp bct_gsl_wrap.o bct_py_wrap.o libbct.a $(objects)
177 changes: 19 additions & 158 deletions bct.i → bct_gsl.i
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
%module bct
%module bct_gsl
%include "std_string.i"
%include "swig.i"
%include "typemaps.i"
%feature("autodoc", "1");

%{
#include "bct.h"
%}

%apply int* OUTPUT { int* qstop, int* K };
%apply double* OUTPUT { double* radius, double* diameter, double* eta, double* fs };

Expand All @@ -12,157 +17,6 @@
%typemap(in, numinputs = 0) gsl_matrix** (gsl_matrix* temp) { $1 = &temp; }
%typemap(argout) gsl_matrix** { %append_output(SWIG_NewPointerObj(*$1, $descriptor(gsl_matrix*), 0)); }

%{
#include "bct.h"
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_vector.h>
#include <Python.h>
#include <vector>

/*
* Converts a gsl_vector* to a Python list.
*/
PyObject* from_gsl(const gsl_vector* v) {
PyObject* list = PyList_New(v->size);
for (int i = 0; i < (int)v->size; i++) {
PyObject* value = PyFloat_FromDouble(gsl_vector_get(v, i));
PyList_SetItem(list, i, value);
}
return list;
}

/*
* Converts a gsl_matrix* to a Python list of lists.
*/
PyObject* from_gsl(const gsl_matrix* m) {
PyObject* list = PyList_New(m->size1);
for (int i = 0; i < (int)m->size1; i++) {
PyObject* sublist = PyList_New(m->size2);
PyList_SetItem(list, i, sublist);
for (int j = 0; j < (int)m->size2; j++) {
PyObject* value = PyFloat_FromDouble(gsl_matrix_get(m, i, j));
PyList_SetItem(sublist, j, value);
}
}
return list;
}

/*
* Converts a std::vector<gsl_matrix*> to a Python list of lists of lists.
*/
PyObject* from_gsl(const std::vector<gsl_matrix*>& m) {
PyObject* list = PyList_New(m.size());
for (int i = 0; i < (int)m.size(); i++) {
if (m[i] == NULL) {
PyObject* sublist = PyList_New(0);
PyList_SetItem(list, i, sublist);
} else {
PyObject* sublist = PyList_New(m[i]->size1);
PyList_SetItem(list, i, sublist);
for (int j = 0; j < (int)m[i]->size1; j++) {
PyObject* subsublist = PyList_New(m[i]->size2);
PyList_SetItem(sublist, j, subsublist);
for (int k = 0; k < (int)m[i]->size2; k++) {
PyObject* value = PyFloat_FromDouble(gsl_matrix_get(m[i], j, k));
PyList_SetItem(subsublist, k, value);
}
}
}
}
return list;
}

/*
* Converts a double* to a gsl_vector*.
*/
gsl_vector* to_gslv(const double* array, int size) {
gsl_vector* v = gsl_vector_alloc(size);
for (int i = 0; i < size; i++) {
gsl_vector_set(v, i, array[i]);
}
return v;
}

/*
* Converts a double* to a gsl_matrix*.
*/
gsl_matrix* to_gslm(const double* array, int size1, int size2) {
gsl_matrix* m = gsl_matrix_alloc(size1, size2);
for (int i = 0; i < size1; i++) {
for (int j = 0; j < size2; j++) {
gsl_matrix_set(m, i, j, array[i * size2 + j]);
}
}
return m;
}

/*
* Converts a Python list to a gsl_vector*.
*/
gsl_vector* to_gslv(PyObject* list) {
int n = PyList_Size(list);
gsl_vector* v = gsl_vector_alloc(n);
for (int i = 0; i < n; i++) {
double value = PyFloat_AsDouble(PyList_GetItem(list, i));
gsl_vector_set(v, i, value);
}
return v;
}

/*
* Converts a Python list of lists to a gsl_matrix*.
*/
gsl_matrix* to_gslm(PyObject* list) {
int n_rows = PyList_Size(list);
int n_cols = PyList_Size(PyList_GetItem(list, 0));
gsl_matrix* m = gsl_matrix_alloc(n_rows, n_cols);
for (int i = 0; i < n_rows; i++) {
PyObject* sublist = PyList_GetItem(list, i);
for (int j = 0; j < n_cols; j++) {
double value = PyFloat_AsDouble(PyList_GetItem(sublist, j));
gsl_matrix_set(m, i, j, value);
}
}
return m;
}

/*
* Converts a Python list of lists of lists to a std::vector<gsl_matrix*>.
*/
std::vector<gsl_matrix*> to_gsl3dm(PyObject* list) {
int n_matrices = PyList_Size(list);
std::vector<gsl_matrix*> m(n_matrices);
for (int i = 0; i < n_matrices; i++) {
PyObject* sublist = PyList_GetItem(list, i);
int n_rows = PyList_Size(sublist);
int n_cols = PyList_Size(PyList_GetItem(sublist, 0));
if (n_rows == 0 || n_cols == 0) {
m[i] = NULL;
} else {
gsl_matrix* subm = gsl_matrix_alloc(n_rows, n_cols);
m[i] = subm;
for (int j = 0; j < n_rows; j++) {
PyObject* subsublist = PyList_GetItem(sublist, j);
for (int k = 0; k < n_cols; k++) {
double value = PyFloat_AsDouble(PyList_GetItem(subsublist, k));
gsl_matrix_set(subm, j, k, value);
}
}
}
}
return m;
}
%}

PyObject* from_gsl(const gsl_vector* v);
PyObject* from_gsl(const gsl_matrix* m);
PyObject* from_gsl(const std::vector<gsl_matrix*>& m);
gsl_vector* to_gslv(const double* array, int size);
gsl_matrix* to_gslm(const double* array, int size1, int size2);
gsl_vector* to_gslv(PyObject* list);
gsl_matrix* to_gslm(PyObject* list);
std::vector<gsl_matrix*> to_gsl3dm(PyObject* list);

namespace bct {

// Density, degree, and assortativity
Expand Down Expand Up @@ -267,12 +121,12 @@ namespace bct {
gsl_matrix* randmio_und_connected(const gsl_matrix* R, int ITER);

// Data sets
extern const double cat_all[95 * 95];
extern const double cat_ctx[52 * 52];
extern const double fve30[30 * 30];
extern const double fve32[32 * 32];
extern const double macaque47[47 * 47];
extern const double macaque71[71 * 71];
gsl_matrix* get_cat_all();
gsl_matrix* get_cat_ctx();
gsl_matrix* get_fve30();
gsl_matrix* get_fve32();
gsl_matrix* get_macaque47();
gsl_matrix* get_macaque71();

// Matrix status checking
enum status {
Expand Down Expand Up @@ -522,3 +376,10 @@ namespace matlab {
gsl_matrix* permute_columns(const gsl_permutation* p, const gsl_matrix* m);
gsl_matrix* permute_rows(const gsl_permutation* p, const gsl_matrix* m);
}

PyObject* from_gsl(const gsl_vector* v);
PyObject* from_gsl(const gsl_matrix* m);
PyObject* from_gsl(const std::vector<gsl_matrix*>& m);
gsl_vector* to_gslv(PyObject* list);
gsl_matrix* to_gslm(PyObject* list);
std::vector<gsl_matrix*> to_gsl3dm(PyObject* list);
Loading

0 comments on commit 27db9e4

Please sign in to comment.