changeset 20864:4c9df9f444db

2015 Code Sprint: ccolamd.cc: use ovl().
author Rik <rik@octave.org>
date Sat, 12 Dec 2015 09:27:13 -0800
parents e81276e8f481
children 4a6d4375a0ca
files libinterp/dldfcn/ccolamd.cc
diffstat 1 files changed, 266 insertions(+), 281 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/dldfcn/ccolamd.cc	Sat Dec 12 09:17:56 2015 -0800
+++ b/libinterp/dldfcn/ccolamd.cc	Sat Dec 12 09:27:13 2015 -0800
@@ -152,104 +152,91 @@
 
   if (nargout > 2 || nargin < 1 || nargin > 3)
     usage ("ccolamd: incorrect number of input and/or output arguments");
-  else
-    {
-      // Get knobs
-      OCTAVE_LOCAL_BUFFER (double, knobs, CCOLAMD_KNOBS);
-      CCOLAMD_NAME (_set_defaults) (knobs);
+
+  retval.resize (nargout == 2 ? 2 : 1);
 
-      // Check for user-passed knobs
-      if (nargin > 1)
-        {
-          NDArray User_knobs = args(1).array_value ();
-          int nel_User_knobs = User_knobs.numel ();
+  // Get knobs
+  OCTAVE_LOCAL_BUFFER (double, knobs, CCOLAMD_KNOBS);
+  CCOLAMD_NAME (_set_defaults) (knobs);
+
+  // Check for user-passed knobs
+  if (nargin > 1)
+    {
+      NDArray User_knobs = args(1).array_value ();
+      int nel_User_knobs = User_knobs.numel ();
 
-          if (nel_User_knobs > 0)
-            knobs[CCOLAMD_LU] = (User_knobs(0) != 0);
-          if (nel_User_knobs > 1)
-            knobs[CCOLAMD_DENSE_ROW] = User_knobs(1);
-          if (nel_User_knobs > 2)
-            knobs[CCOLAMD_DENSE_COL] = User_knobs(2);
-          if (nel_User_knobs > 3)
-            knobs[CCOLAMD_AGGRESSIVE] = (User_knobs(3) != 0);
-          if (nel_User_knobs > 4)
-            spumoni = (User_knobs(4) != 0);
+      if (nel_User_knobs > 0)
+        knobs[CCOLAMD_LU] = (User_knobs(0) != 0);
+      if (nel_User_knobs > 1)
+        knobs[CCOLAMD_DENSE_ROW] = User_knobs(1);
+      if (nel_User_knobs > 2)
+        knobs[CCOLAMD_DENSE_COL] = User_knobs(2);
+      if (nel_User_knobs > 3)
+        knobs[CCOLAMD_AGGRESSIVE] = (User_knobs(3) != 0);
+      if (nel_User_knobs > 4)
+        spumoni = (User_knobs(4) != 0);
 
-          // print knob settings if spumoni is set
-          if (spumoni)
-            {
-              octave_stdout << "\nccolamd version " << CCOLAMD_MAIN_VERSION << "."
-                            <<  CCOLAMD_SUB_VERSION << ", " << CCOLAMD_DATE
-                            << ":\nknobs(1): " << User_knobs(0) << ", order for ";
-              if (knobs[CCOLAMD_LU] != 0)
-                octave_stdout << "lu (A)\n";
-              else
-                octave_stdout << "chol (A'*A)\n";
-
-              if (knobs[CCOLAMD_DENSE_ROW] >= 0)
-                octave_stdout << "knobs(2): " << User_knobs(1)
-                              << ", rows with > max (16,"
-                              << knobs[CCOLAMD_DENSE_ROW]
-                              << "*sqrt (size(A,2)))"
-                              << " entries removed\n";
-              else
-                octave_stdout << "knobs(2): " << User_knobs(1)
-                              << ", no dense rows removed\n";
+      // print knob settings if spumoni is set
+      if (spumoni)
+        {
+          octave_stdout << "\nccolamd version " << CCOLAMD_MAIN_VERSION << "."
+                        <<  CCOLAMD_SUB_VERSION << ", " << CCOLAMD_DATE
+                        << ":\nknobs(1): " << User_knobs(0) << ", order for ";
+          if (knobs[CCOLAMD_LU] != 0)
+            octave_stdout << "lu (A)\n";
+          else
+            octave_stdout << "chol (A'*A)\n";
 
-              if (knobs[CCOLAMD_DENSE_COL] >= 0)
-                octave_stdout << "knobs(3): " << User_knobs(2)
-                              << ", cols with > max (16,"
-                              << knobs[CCOLAMD_DENSE_COL] << "*sqrt (size(A)))"
-                              << " entries removed\n";
-              else
-                octave_stdout << "knobs(3): " << User_knobs(2)
-                              << ", no dense columns removed\n";
+          if (knobs[CCOLAMD_DENSE_ROW] >= 0)
+            octave_stdout << "knobs(2): " << User_knobs(1)
+                          << ", rows with > max (16,"
+                          << knobs[CCOLAMD_DENSE_ROW]
+                          << "*sqrt (size(A,2)))"
+                          << " entries removed\n";
+          else
+            octave_stdout << "knobs(2): " << User_knobs(1)
+                          << ", no dense rows removed\n";
 
-              if (knobs[CCOLAMD_AGGRESSIVE] != 0)
-                octave_stdout << "knobs(4): " << User_knobs(3)
-                              << ", aggressive absorption: yes";
-              else
-                octave_stdout << "knobs(4): " << User_knobs(3)
-                              << ", aggressive absorption: no";
-
-              octave_stdout << "knobs(5): " << User_knobs(4)
-                            << ", statistics and knobs printed\n";
-            }
-        }
+          if (knobs[CCOLAMD_DENSE_COL] >= 0)
+            octave_stdout << "knobs(3): " << User_knobs(2)
+                          << ", cols with > max (16,"
+                          << knobs[CCOLAMD_DENSE_COL] << "*sqrt (size(A)))"
+                          << " entries removed\n";
+          else
+            octave_stdout << "knobs(3): " << User_knobs(2)
+                          << ", no dense columns removed\n";
 
-      octave_idx_type n_row, n_col, nnz;
-      octave_idx_type *ridx, *cidx;
-      SparseComplexMatrix scm;
-      SparseMatrix sm;
+          if (knobs[CCOLAMD_AGGRESSIVE] != 0)
+            octave_stdout << "knobs(4): " << User_knobs(3)
+                          << ", aggressive absorption: yes";
+          else
+            octave_stdout << "knobs(4): " << User_knobs(3)
+                          << ", aggressive absorption: no";
 
-      if (args(0).is_sparse_type ())
+          octave_stdout << "knobs(5): " << User_knobs(4)
+                        << ", statistics and knobs printed\n";
+        }
+    }
+
+  octave_idx_type n_row, n_col, nnz;
+  octave_idx_type *ridx, *cidx;
+  SparseComplexMatrix scm;
+  SparseMatrix sm;
+
+  if (args(0).is_sparse_type ())
+    {
+      if (args(0).is_complex_type ())
         {
-          if (args(0).is_complex_type ())
-            {
-              scm = args(0). sparse_complex_matrix_value ();
-              n_row = scm.rows ();
-              n_col = scm.cols ();
-              nnz = scm.nnz ();
-              ridx = scm.xridx ();
-              cidx = scm.xcidx ();
-            }
-          else
-            {
-              sm = args(0).sparse_matrix_value ();
-
-              n_row = sm.rows ();
-              n_col = sm.cols ();
-              nnz = sm.nnz ();
-              ridx = sm.xridx ();
-              cidx = sm.xcidx ();
-            }
+          scm = args(0). sparse_complex_matrix_value ();
+          n_row = scm.rows ();
+          n_col = scm.cols ();
+          nnz = scm.nnz ();
+          ridx = scm.xridx ();
+          cidx = scm.xcidx ();
         }
       else
         {
-          if (args(0).is_complex_type ())
-            sm = SparseMatrix (real (args(0).complex_matrix_value ()));
-          else
-            sm = SparseMatrix (args(0).matrix_value ());
+          sm = args(0).sparse_matrix_value ();
 
           n_row = sm.rows ();
           n_col = sm.cols ();
@@ -257,76 +244,89 @@
           ridx = sm.xridx ();
           cidx = sm.xcidx ();
         }
-
-      // Allocate workspace for ccolamd
-      OCTAVE_LOCAL_BUFFER (octave_idx_type, p, n_col+1);
-      for (octave_idx_type i = 0; i < n_col+1; i++)
-        p[i] = cidx[i];
+    }
+  else
+    {
+      if (args(0).is_complex_type ())
+        sm = SparseMatrix (real (args(0).complex_matrix_value ()));
+      else
+        sm = SparseMatrix (args(0).matrix_value ());
 
-      octave_idx_type Alen = CCOLAMD_NAME (_recommended) (nnz, n_row, n_col);
-      OCTAVE_LOCAL_BUFFER (octave_idx_type, A, Alen);
-      for (octave_idx_type i = 0; i < nnz; i++)
-        A[i] = ridx[i];
-
-      OCTAVE_LOCAL_BUFFER (octave_idx_type, stats, CCOLAMD_STATS);
+      n_row = sm.rows ();
+      n_col = sm.cols ();
+      nnz = sm.nnz ();
+      ridx = sm.xridx ();
+      cidx = sm.xcidx ();
+    }
 
-      if (nargin > 2)
-        {
-          NDArray in_cmember = args(2).array_value ();
-          octave_idx_type cslen = in_cmember.numel ();
-          OCTAVE_LOCAL_BUFFER (octave_idx_type, cmember, cslen);
-          for (octave_idx_type i = 0; i < cslen; i++)
-            // convert cmember from 1-based to 0-based
-            cmember[i] = static_cast<octave_idx_type>(in_cmember(i) - 1);
+  // Allocate workspace for ccolamd
+  OCTAVE_LOCAL_BUFFER (octave_idx_type, p, n_col+1);
+  for (octave_idx_type i = 0; i < n_col+1; i++)
+    p[i] = cidx[i];
+
+  octave_idx_type Alen = CCOLAMD_NAME (_recommended) (nnz, n_row, n_col);
+  OCTAVE_LOCAL_BUFFER (octave_idx_type, A, Alen);
+  for (octave_idx_type i = 0; i < nnz; i++)
+    A[i] = ridx[i];
+
+  OCTAVE_LOCAL_BUFFER (octave_idx_type, stats, CCOLAMD_STATS);
 
-          if (cslen != n_col)
-            error ("ccolamd: CMEMBER must be of length equal to #cols of A");
-          else
-            // Order the columns (destroys A)
-            if (! CCOLAMD_NAME () (n_row, n_col, Alen, A, p,
-                                   knobs, stats, cmember))
-              {
-                CCOLAMD_NAME (_report) (stats) ;
+  if (nargin > 2)
+    {
+      NDArray in_cmember = args(2).array_value ();
+      octave_idx_type cslen = in_cmember.numel ();
+      OCTAVE_LOCAL_BUFFER (octave_idx_type, cmember, cslen);
+      for (octave_idx_type i = 0; i < cslen; i++)
+        // convert cmember from 1-based to 0-based
+        cmember[i] = static_cast<octave_idx_type>(in_cmember(i) - 1);
 
-                error ("ccolamd: internal error!");
-              }
-        }
+      if (cslen != n_col)
+        error ("ccolamd: CMEMBER must be of length equal to #cols of A");
       else
-        {
-          // Order the columns (destroys A)
-          if (! CCOLAMD_NAME () (n_row, n_col, Alen, A, p, knobs, stats, 0))
-            {
-              CCOLAMD_NAME (_report) (stats) ;
+        // Order the columns (destroys A)
+        if (! CCOLAMD_NAME () (n_row, n_col, Alen, A, p,
+                               knobs, stats, cmember))
+          {
+            CCOLAMD_NAME (_report) (stats) ;
 
-              error ("ccolamd: internal error!");
-            }
-        }
+            error ("ccolamd: internal error!");
+          }
+    }
+  else
+    {
+      // Order the columns (destroys A)
+      if (! CCOLAMD_NAME () (n_row, n_col, Alen, A, p, knobs, stats, 0))
+        {
+          CCOLAMD_NAME (_report) (stats) ;
 
-      // return the permutation vector
-      NDArray out_perm (dim_vector (1, n_col));
-      for (octave_idx_type i = 0; i < n_col; i++)
-        out_perm(i) = p[i] + 1;
-
-      retval(0) = out_perm;
+          error ("ccolamd: internal error!");
+        }
+    }
 
-      // print stats if spumoni > 0
-      if (spumoni > 0)
-        CCOLAMD_NAME (_report) (stats) ;
+  // return the permutation vector
+  NDArray out_perm (dim_vector (1, n_col));
+  for (octave_idx_type i = 0; i < n_col; i++)
+    out_perm(i) = p[i] + 1;
+
+  retval(0) = out_perm;
+
+  // print stats if spumoni > 0
+  if (spumoni > 0)
+    CCOLAMD_NAME (_report) (stats) ;
 
-      // Return the stats vector
-      if (nargout == 2)
-        {
-          NDArray out_stats (dim_vector (1, CCOLAMD_STATS));
-          for (octave_idx_type i = 0 ; i < CCOLAMD_STATS ; i++)
-            out_stats(i) = stats[i] ;
-          retval(1) = out_stats;
+  // Return the stats vector
+  if (nargout == 2)
+    {
+      NDArray out_stats (dim_vector (1, CCOLAMD_STATS));
+      for (octave_idx_type i = 0 ; i < CCOLAMD_STATS ; i++)
+        out_stats(i) = stats[i] ;
+      retval(1) = out_stats;
 
-          // fix stats (5) and (6), for 1-based information on
-          // jumbled matrix.  note that this correction doesn't
-          // occur if symamd returns FALSE
-          out_stats (CCOLAMD_INFO1) ++ ;
-          out_stats (CCOLAMD_INFO2) ++ ;
-        }
+      // fix stats (5) and (6), for 1-based information on
+      // jumbled matrix.  note that this correction doesn't
+      // occur if symamd returns FALSE
+      out_stats (CCOLAMD_INFO1) ++ ;
+      out_stats (CCOLAMD_INFO2) ++ ;
     }
 
 #else
@@ -412,169 +412,154 @@
 
   if (nargout > 2 || nargin < 1 || nargin > 3)
     usage ("ccolamd: incorrect number of input and/or output arguments");
-  else
-    {
-      // Get knobs
-      OCTAVE_LOCAL_BUFFER (double, knobs, CCOLAMD_KNOBS);
-      CCOLAMD_NAME (_set_defaults) (knobs);
+
+  retval.resize (nargout == 2 ? 2 : 1);
+
+  // Get knobs
+  OCTAVE_LOCAL_BUFFER (double, knobs, CCOLAMD_KNOBS);
+  CCOLAMD_NAME (_set_defaults) (knobs);
 
-      // Check for user-passed knobs
-      if (nargin > 1)
-        {
-          NDArray User_knobs = args(1).array_value ();
-          int nel_User_knobs = User_knobs.numel ();
+  // Check for user-passed knobs
+  if (nargin > 1)
+    {
+      NDArray User_knobs = args(1).array_value ();
+      int nel_User_knobs = User_knobs.numel ();
 
-          if (nel_User_knobs > 0)
-            knobs[CCOLAMD_DENSE_ROW] = User_knobs(0);
-          if (nel_User_knobs > 0)
-            knobs[CCOLAMD_AGGRESSIVE] = User_knobs(1);
-          if (nel_User_knobs > 1)
-            spumoni = static_cast<int> (User_knobs(2));
+      if (nel_User_knobs > 0)
+        knobs[CCOLAMD_DENSE_ROW] = User_knobs(0);
+      if (nel_User_knobs > 0)
+        knobs[CCOLAMD_AGGRESSIVE] = User_knobs(1);
+      if (nel_User_knobs > 1)
+        spumoni = static_cast<int> (User_knobs(2));
 
-          // print knob settings if spumoni is set
-          if (spumoni)
-            {
-              octave_stdout << "\ncsymamd version " << CCOLAMD_MAIN_VERSION
-                            << "." << CCOLAMD_SUB_VERSION
-                            << ", " << CCOLAMD_DATE << "\n";
+      // print knob settings if spumoni is set
+      if (spumoni)
+        {
+          octave_stdout << "\ncsymamd version " << CCOLAMD_MAIN_VERSION
+                        << "." << CCOLAMD_SUB_VERSION
+                        << ", " << CCOLAMD_DATE << "\n";
 
-              if (knobs[CCOLAMD_DENSE_ROW] >= 0)
-                octave_stdout << "knobs(1): " << User_knobs(0)
-                              << ", rows/cols with > max (16,"
-                              << knobs[CCOLAMD_DENSE_ROW]
-                              << "*sqrt (size(A,2)))"
-                              << " entries removed\n";
-              else
-                octave_stdout << "knobs(1): " << User_knobs(0)
-                              << ", no dense rows/cols removed\n";
+          if (knobs[CCOLAMD_DENSE_ROW] >= 0)
+            octave_stdout << "knobs(1): " << User_knobs(0)
+                          << ", rows/cols with > max (16,"
+                          << knobs[CCOLAMD_DENSE_ROW]
+                          << "*sqrt (size(A,2)))"
+                          << " entries removed\n";
+          else
+            octave_stdout << "knobs(1): " << User_knobs(0)
+                          << ", no dense rows/cols removed\n";
 
-              if (knobs[CCOLAMD_AGGRESSIVE] != 0)
-                octave_stdout << "knobs(2): " << User_knobs(1)
-                              << ", aggressive absorption: yes";
-              else
-                octave_stdout << "knobs(2): " << User_knobs(1)
-                              << ", aggressive absorption: no";
+          if (knobs[CCOLAMD_AGGRESSIVE] != 0)
+            octave_stdout << "knobs(2): " << User_knobs(1)
+                          << ", aggressive absorption: yes";
+          else
+            octave_stdout << "knobs(2): " << User_knobs(1)
+                          << ", aggressive absorption: no";
 
 
-              octave_stdout << "knobs(3): " << User_knobs(2)
-                            << ", statistics and knobs printed\n";
-            }
+          octave_stdout << "knobs(3): " << User_knobs(2)
+                        << ", statistics and knobs printed\n";
         }
+    }
 
-      octave_idx_type n_row, n_col;
-      octave_idx_type *ridx, *cidx;
-      SparseMatrix sm;
-      SparseComplexMatrix scm;
+  octave_idx_type n_row, n_col;
+  octave_idx_type *ridx, *cidx;
+  SparseMatrix sm;
+  SparseComplexMatrix scm;
 
-      if (args(0).is_sparse_type ())
+  if (args(0).is_sparse_type ())
+    {
+      if (args(0).is_complex_type ())
         {
-          if (args(0).is_complex_type ())
-            {
-              scm = args(0).sparse_complex_matrix_value ();
-              n_row = scm.rows ();
-              n_col = scm.cols ();
-              ridx = scm.xridx ();
-              cidx = scm.xcidx ();
-            }
-          else
-            {
-              sm = args(0).sparse_matrix_value ();
-              n_row = sm.rows ();
-              n_col = sm.cols ();
-              ridx = sm.xridx ();
-              cidx = sm.xcidx ();
-            }
+          scm = args(0).sparse_complex_matrix_value ();
+          n_row = scm.rows ();
+          n_col = scm.cols ();
+          ridx = scm.xridx ();
+          cidx = scm.xcidx ();
         }
       else
         {
-          if (args(0).is_complex_type ())
-            sm = SparseMatrix (real (args(0).complex_matrix_value ()));
-          else
-            sm = SparseMatrix (args(0).matrix_value ());
-
+          sm = args(0).sparse_matrix_value ();
           n_row = sm.rows ();
           n_col = sm.cols ();
           ridx = sm.xridx ();
           cidx = sm.xcidx ();
         }
-
-      if (n_row != n_col)
-        error ("csymamd: matrix S must be square");
-
-      // Allocate workspace for symamd
-      OCTAVE_LOCAL_BUFFER (octave_idx_type, perm, n_col+1);
-      OCTAVE_LOCAL_BUFFER (octave_idx_type, stats, CCOLAMD_STATS);
+    }
+  else
+    {
+      if (args(0).is_complex_type ())
+        sm = SparseMatrix (real (args(0).complex_matrix_value ()));
+      else
+        sm = SparseMatrix (args(0).matrix_value ());
 
-      if (nargin > 2)
-        {
-          NDArray in_cmember = args(2).array_value ();
-          octave_idx_type cslen = in_cmember.numel ();
-          OCTAVE_LOCAL_BUFFER (octave_idx_type, cmember, cslen);
-          for (octave_idx_type i = 0; i < cslen; i++)
-            // convert cmember from 1-based to 0-based
-            cmember[i] = static_cast<octave_idx_type>(in_cmember(i) - 1);
+      n_row = sm.rows ();
+      n_col = sm.cols ();
+      ridx = sm.xridx ();
+      cidx = sm.xcidx ();
+    }
+
+  if (n_row != n_col)
+    error ("csymamd: matrix S must be square");
 
-          if (cslen != n_col)
-            error ("csymamd: CMEMBER must be of length equal to #cols of A");
-          else if (!CSYMAMD_NAME () (n_col, ridx, cidx, perm, knobs, stats,
-                                     &calloc, &free, cmember, -1))
-            {
-              CSYMAMD_NAME (_report) (stats) ;
+  // Allocate workspace for symamd
+  OCTAVE_LOCAL_BUFFER (octave_idx_type, perm, n_col+1);
+  OCTAVE_LOCAL_BUFFER (octave_idx_type, stats, CCOLAMD_STATS);
 
-              error ("csymamd: internal error!") ;
-            }
-        }
-      else
+  if (nargin > 2)
+    {
+      NDArray in_cmember = args(2).array_value ();
+      octave_idx_type cslen = in_cmember.numel ();
+      OCTAVE_LOCAL_BUFFER (octave_idx_type, cmember, cslen);
+      for (octave_idx_type i = 0; i < cslen; i++)
+        // convert cmember from 1-based to 0-based
+        cmember[i] = static_cast<octave_idx_type>(in_cmember(i) - 1);
+
+      if (cslen != n_col)
+        error ("csymamd: CMEMBER must be of length equal to #cols of A");
+      else if (!CSYMAMD_NAME () (n_col, ridx, cidx, perm, knobs, stats,
+                                 &calloc, &free, cmember, -1))
         {
-          if (!CSYMAMD_NAME () (n_col, ridx, cidx, perm, knobs, stats,
-                                &calloc, &free, 0, -1))
-            {
-              CSYMAMD_NAME (_report) (stats) ;
-
-              error ("csymamd: internal error!") ;
-            }
-        }
+          CSYMAMD_NAME (_report) (stats) ;
 
-      // return the permutation vector
-      NDArray out_perm (dim_vector (1, n_col));
-      for (octave_idx_type i = 0; i < n_col; i++)
-        out_perm(i) = perm[i] + 1;
-
-      retval(0) = out_perm;
+          error ("csymamd: internal error!") ;
+        }
+    }
+  else
+    {
+      if (!CSYMAMD_NAME () (n_col, ridx, cidx, perm, knobs, stats,
+                            &calloc, &free, 0, -1))
+        {
+          CSYMAMD_NAME (_report) (stats) ;
 
-      // Return the stats vector
-      if (nargout == 2)
-        {
-          NDArray out_stats (dim_vector (1, CCOLAMD_STATS));
-          for (octave_idx_type i = 0 ; i < CCOLAMD_STATS ; i++)
-            out_stats(i) = stats[i] ;
-          retval(1) = out_stats;
+          error ("csymamd: internal error!") ;
+        }
+    }
+
+  // return the permutation vector
+  NDArray out_perm (dim_vector (1, n_col));
+  for (octave_idx_type i = 0; i < n_col; i++)
+    out_perm(i) = perm[i] + 1;
 
-          // fix stats (5) and (6), for 1-based information on
-          // jumbled matrix.  note that this correction doesn't
-          // occur if symamd returns FALSE
-          out_stats (CCOLAMD_INFO1) ++ ;
-          out_stats (CCOLAMD_INFO2) ++ ;
-        }
+  retval(0) = out_perm;
 
-      // print stats if spumoni > 0
-      if (spumoni > 0)
-        CSYMAMD_NAME (_report) (stats) ;
+  // print stats if spumoni > 0
+  if (spumoni > 0)
+    CSYMAMD_NAME (_report) (stats) ;
 
-      // Return the stats vector
-      if (nargout == 2)
-        {
-          NDArray out_stats (dim_vector (1, CCOLAMD_STATS));
-          for (octave_idx_type i = 0 ; i < CCOLAMD_STATS ; i++)
-            out_stats(i) = stats[i] ;
-          retval(1) = out_stats;
+  // Return the stats vector
+  if (nargout == 2)
+    {
+      NDArray out_stats (dim_vector (1, CCOLAMD_STATS));
+      for (octave_idx_type i = 0 ; i < CCOLAMD_STATS ; i++)
+        out_stats(i) = stats[i] ;
+      retval(1) = out_stats;
 
-          // fix stats (5) and (6), for 1-based information on
-          // jumbled matrix.  note that this correction doesn't
-          // occur if symamd returns FALSE
-          out_stats (CCOLAMD_INFO1) ++ ;
-          out_stats (CCOLAMD_INFO2) ++ ;
-        }
+      // fix stats (5) and (6), for 1-based information on
+      // jumbled matrix.  note that this correction doesn't
+      // occur if symamd returns FALSE
+      out_stats (CCOLAMD_INFO1) ++ ;
+      out_stats (CCOLAMD_INFO2) ++ ;
     }
 
 #else