Skip to content
Snippets Groups Projects
Commit 12dbee2c authored by André Anjos's avatar André Anjos :speech_balloon:
Browse files

All scatter tests are now passing

parent e1498574
Branches
Tags
No related merge requests found
......@@ -266,9 +266,7 @@ Reference: `<http://home.online.no/~pjacklam/notes/invnorm/>`_\n\
PyDoc_STRVAR(s_scatter_str, "scatter");
PyDoc_STRVAR(s_scatter_doc,
"scatter(a) -> (array, array)\n\
scatter(a, s) -> array\n\
scatter(a, s, m) -> None\n\
"scatter(a, [s, [m]]) -> tuple\n\
\n\
Computes the scatter matrix of a 2D array *considering data is organized\n\
row-wise* (each sample is a row, each feature is a column). The\n\
......@@ -302,9 +300,7 @@ float arrays as input.\n\
PyDoc_STRVAR(s_scatters_str, "scatters");
PyDoc_STRVAR(s_scatters_doc,
"scatters(data) -> (array, array, array)\n\
scatters(data, sw, sb) -> array\n\
scatters(data, sw, sb, m) -> None\n\
"scatters(data, [sw, [sb, [m]]]) -> tuple\n\
\n\
Computes the within-class (``sw``) and between-class (``sb``) scatter\n\
matrices of a set of 2D arrays considering data is organized row-wise\n\
......
......@@ -22,7 +22,7 @@ PyObject* py_scatter (PyObject*, PyObject* args, PyObject* kwds) {
PyBlitzArrayObject* m = 0;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&|O&O&",
kwlist,
kwlist,
&PyBlitzArray_Converter, &a,
&PyBlitzArray_OutputConverter, &s,
&PyBlitzArray_OutputConverter, &m
......@@ -99,23 +99,12 @@ PyObject* py_scatter (PyObject*, PyObject* args, PyObject* kwds) {
int returns = 2 - (user_s + user_m);
if (!returns) {
Py_DECREF(s);
Py_DECREF(m);
Py_RETURN_NONE;
}
// if you get here, it means the user is interested on stuff to be returned
PyObject* retval = PyTuple_New(returns);
if (!retval) {
Py_DECREF(s);
Py_DECREF(m);
}
// fill from the back
if (!user_m) PyTuple_SET_ITEM(--retval, returns, (PyObject*)m);
if (!user_m) PyTuple_SET_ITEM(retval, --returns, (PyObject*)m);
else Py_DECREF(m);
if (!user_s) PyTuple_SET_ITEM(--retval, returns, (PyObject*)s);
if (!user_s) PyTuple_SET_ITEM(retval, --returns, (PyObject*)s);
else Py_DECREF(s);
return retval;
......@@ -341,7 +330,7 @@ PyObject* py_scatters (PyObject*, PyObject* args, PyObject* kwds) {
case NPY_FLOAT32:
{
std::vector<blitz::Array<float,2>> cxxdata;
for (Py_ssize_t i=1; i<PyTuple_GET_SIZE(data); ++i) {
for (Py_ssize_t i=0; i<PyTuple_GET_SIZE(data); ++i) {
cxxdata.push_back(*PyBlitzArrayCxx_AsBlitz<float,2>
((PyBlitzArrayObject*)PyTuple_GET_ITEM(data,i)));
bob::math::scatters(cxxdata,
......@@ -356,7 +345,7 @@ PyObject* py_scatters (PyObject*, PyObject* args, PyObject* kwds) {
case NPY_FLOAT64:
{
std::vector<blitz::Array<double,2>> cxxdata;
for (Py_ssize_t i=1; i<PyTuple_GET_SIZE(data); ++i) {
for (Py_ssize_t i=0; i<PyTuple_GET_SIZE(data); ++i) {
cxxdata.push_back(*PyBlitzArrayCxx_AsBlitz<double,2>
((PyBlitzArrayObject*)PyTuple_GET_ITEM(data,i)));
bob::math::scatters(cxxdata,
......@@ -389,27 +378,14 @@ PyObject* py_scatters (PyObject*, PyObject* args, PyObject* kwds) {
int returns = 3 - (user_sw + user_sb + user_m);
if (!returns) {
Py_DECREF(sw);
Py_DECREF(sb);
Py_DECREF(m);
Py_RETURN_NONE;
}
// if you get here, it means the user is interested on stuff to be returned
PyObject* retval = PyTuple_New(returns);
if (!retval) {
Py_DECREF(sw);
Py_DECREF(sb);
Py_DECREF(m);
}
// fill from the back
if (!user_m) PyTuple_SET_ITEM(--retval, returns, (PyObject*)m);
if (!user_m) PyTuple_SET_ITEM(retval, --returns, (PyObject*)m);
else Py_DECREF(m);
if (!user_sb) PyTuple_SET_ITEM(--retval, returns, (PyObject*)sb);
if (!user_sb) PyTuple_SET_ITEM(retval, --returns, (PyObject*)sb);
else Py_DECREF(sb);
if (!user_sw) PyTuple_SET_ITEM(--retval, returns, (PyObject*)sw);
if (!user_sw) PyTuple_SET_ITEM(retval, --returns, (PyObject*)sw);
else Py_DECREF(sw);
return retval;
......
......@@ -44,6 +44,8 @@ def test_scatter():
# This test demonstrates how to use the scatter matrix function of bob.
S, M = scatter(data.T)
S = S.as_ndarray()
M = M.as_ndarray()
S /= (data.shape[1]-1)
# Do the same with numpy and compare. Note that with numpy we are computing
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment