[Scipy-svn] r5006 - in trunk/scipy/cluster: . src tests

scipy-svn@scip... scipy-svn@scip...
Fri Nov 7 13:41:46 CST 2008


Author: damian.eads
Date: 2008-11-07 13:41:42 -0600 (Fri, 07 Nov 2008)
New Revision: 5006

Modified:
   trunk/scipy/cluster/hierarchy.py
   trunk/scipy/cluster/src/common.h
   trunk/scipy/cluster/src/hierarchy.c
   trunk/scipy/cluster/src/hierarchy_wrap.c
   trunk/scipy/cluster/tests/test_hierarchy.py
Log:
Added tests for from_mlab_linkage function.

Modified: trunk/scipy/cluster/hierarchy.py
===================================================================
--- trunk/scipy/cluster/hierarchy.py	2008-11-07 19:02:46 UTC (rev 5005)
+++ trunk/scipy/cluster/hierarchy.py	2008-11-07 19:41:42 UTC (rev 5006)
@@ -1033,7 +1033,7 @@
        - ZS : ndarray
            A linkage matrix compatible with this library.
     """
-    Z = np.asarray(Z, order='c')
+    Z = np.asarray(Z, dtype=np.double, order='c')
     Zs = Z.shape
 
     # If it's empty, return it.
@@ -1047,16 +1047,13 @@
     if Zs[0] == 0:
         return Z.copy()
 
-    Zpart = Z[:,0:2]
-    Zd = Z[:,2].reshape(Zs[0], 1)
-    if Zpart.min() != 1.0 and Zpart.max() != 2 * Zs[0]:
+    Zpart = Z.copy()
+    if Zpart[:, 0:2].min() != 1.0 and Zpart[:, 0:2].max() != 2 * Zs[0]:
         raise ValueError('The format of the indices is not 1..N');
-    CS = np.zeros((Zs[0], 1), dtype=np.double)
-    Zpart = Zpart - 1
-    _hierarchy_wrap.calculate_cluster_sizes_wrap(np.hstack([Zpart, \
-                                                             Zd]).copy(), \
-                                               CS, int(Zs[0]) + 1)
-    return np.hstack([Zpart, Zd, CS]).copy()
+    Zpart[:, 0:2] -= 1.0
+    CS = np.zeros((Zs[0],), dtype=np.double)
+    _hierarchy_wrap.calculate_cluster_sizes_wrap(Zpart, CS, int(Zs[0]) + 1)
+    return np.hstack([Zpart, CS.reshape(Zs[0], 1)])
 
 def to_mlab_linkage(Z):
     """

Modified: trunk/scipy/cluster/src/common.h
===================================================================
--- trunk/scipy/cluster/src/common.h	2008-11-07 19:02:46 UTC (rev 5005)
+++ trunk/scipy/cluster/src/common.h	2008-11-07 19:41:42 UTC (rev 5006)
@@ -60,7 +60,6 @@
                             ((double)((x)/(y))) ? ((x)/(y)) : ((x)/(y) + 1))
 #endif
 
-
 #ifdef CPY_DEBUG
 #define CPY_DEBUG_MSG(...) fprintf(stderr, __VA_ARGS__)
 #else

Modified: trunk/scipy/cluster/src/hierarchy.c
===================================================================
--- trunk/scipy/cluster/src/hierarchy.c	2008-11-07 19:02:46 UTC (rev 5005)
+++ trunk/scipy/cluster/src/hierarchy.c	2008-11-07 19:41:42 UTC (rev 5006)
@@ -1067,7 +1067,7 @@
 }
 
 void calculate_cluster_sizes(const double *Z, double *CS, int n) {
-  int i, j, k;
+  int i, j, k, q;
   const double *row;
   for (k = 0; k < n - 1; k++) {
     row = Z + (k * 3);
@@ -1075,21 +1075,23 @@
     j = (int)row[CPY_LIN_RIGHT];
     /** If the left node is a non-singleton, add its count. */
     if (i >= n) {
-      CS[k] = CS[i - n];
+      q = i - n;
+      CS[k] += CS[q];
     }
     /** Otherwise just add 1 for the leaf. */
     else {
-      CS[k] = 1.0;
+      CS[k] += 1.0;
     }
     /** If the right node is a non-singleton, add its count. */
     if (j >= n) {
-      CS[k] = CS[k] + CS[j - n];
+      q = j - n;
+      CS[k] += CS[q];
     }
     /** Otherwise just add 1 for the leaf. */
     else {
-      CS[k] = CS[k] + 1.0;
+      CS[k] += 1.0;
     }
-    /**    CPY_DEBUG_MSG("i=%d, j=%d, CS[%d]=%d\n", i, j, n+k, (int)CS[k]);**/
+    CPY_DEBUG_MSG("i=%d, j=%d, CS[%d]=%d\n", i, j, k, (int)CS[k]);
   }
 }
 

Modified: trunk/scipy/cluster/src/hierarchy_wrap.c
===================================================================
--- trunk/scipy/cluster/src/hierarchy_wrap.c	2008-11-07 19:02:46 UTC (rev 5005)
+++ trunk/scipy/cluster/src/hierarchy_wrap.c	2008-11-07 19:41:42 UTC (rev 5006)
@@ -122,7 +122,7 @@
     return 0;
   }
   calculate_cluster_sizes((const double*)Z->data, (double*)CS_->data, n);
-  return Py_BuildValue("d", 0.0);
+  return Py_BuildValue("");
 }
 
 extern PyObject *get_max_dist_for_each_cluster_wrap(PyObject *self,

Modified: trunk/scipy/cluster/tests/test_hierarchy.py
===================================================================
--- trunk/scipy/cluster/tests/test_hierarchy.py	2008-11-07 19:02:46 UTC (rev 5005)
+++ trunk/scipy/cluster/tests/test_hierarchy.py	2008-11-07 19:41:42 UTC (rev 5006)
@@ -202,6 +202,20 @@
         ZP = from_mlab_linkage(Z)
         return self.failUnless((ZP == expectedZP).all())
 
+    def test_from_mlab_linkage_multiple_rows(self):
+        "Testing from_mlab_linkage on linkage array with multiple rows."
+        Z = np.asarray([[3, 6, 138], [4, 5, 219],
+                        [1, 8, 255], [2, 9, 268], [7, 10, 295]])
+        expectedZS = np.array([[   2.,    5.,  138.,    2.],
+                               [   3.,    4.,  219.,    2.],
+                               [   0.,    7.,  255.,    3.],
+                               [   1.,    8.,  268.,    4.],
+                               [   6.,    9.,  295.,    6.]],
+                              dtype=np.double)
+        ZS = from_mlab_linkage(Z)
+        print expectedZS, ZS
+        self.failUnless((expectedZS == ZS).all())
+
 def help_single_inconsistent_depth(self, i):
     Y = squareform(_tdist)
     Z = linkage(Y, 'single')



More information about the Scipy-svn mailing list