changeset 21152:8ad3907b8fad

require CXSparse 2.2 or later * oct-sparse.h: Require CXSparse 2.2 or later. * dmperm.cc, SparseCmplxQR.cc, SparseQR.cc, sparse-dmsolve.cc: Assume CXSparse 2.2 or later.
author John W. Eaton <jwe@octave.org>
date Fri, 29 Jan 2016 14:55:20 -0500
parents bfd5e48c41a1
children 9c61ab1f7588
files libinterp/dldfcn/dmperm.cc liboctave/numeric/SparseCmplxQR.cc liboctave/numeric/SparseQR.cc liboctave/numeric/sparse-dmsolve.cc liboctave/util/oct-sparse.h
diffstat 5 files changed, 35 insertions(+), 315 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/dldfcn/dmperm.cc	Fri Jan 29 11:32:23 2016 -0800
+++ b/libinterp/dldfcn/dmperm.cc	Fri Jan 29 14:55:20 2016 -0500
@@ -84,11 +84,7 @@
 
   if (nargout <= 1 || rank)
     {
-#if defined (CS_VER) && (CS_VER >= 2)
       octave_idx_type *jmatch = CXSPARSE_NAME (_maxtrans) (&csm, 0);
-#else
-      octave_idx_type *jmatch = CXSPARSE_NAME (_maxtrans) (&csm);
-#endif
       if (rank)
         {
           octave_idx_type r = 0;
@@ -103,21 +99,13 @@
     }
   else
     {
-#if defined (CS_VER) && (CS_VER >= 2)
       CXSPARSE_NAME (d) *dm = CXSPARSE_NAME(_dmperm) (&csm, 0);
-#else
-      CXSPARSE_NAME (d) *dm = CXSPARSE_NAME(_dmperm) (&csm);
-#endif
 
       //retval(5) = put_int (dm->rr, 5);
       //retval(4) = put_int (dm->cc, 5);
-#if defined (CS_VER) && (CS_VER >= 2)
       retval = ovl (put_int (dm->p, nr), put_int (dm->q, nc),
                     put_int (dm->r, dm->nb+1), put_int (dm->s, dm->nb+1));
-#else
-      retval = ovl (put_int (dm->P, nr), put_int (dm->Q, nc),
-                    put_int (dm->R, dm->nb+1), put_int (dm->S, dm->nb+1));
-#endif
+
       CXSPARSE_NAME (_dfree) (dm);
     }
 
--- a/liboctave/numeric/SparseCmplxQR.cc	Fri Jan 29 11:32:23 2016 -0800
+++ b/liboctave/numeric/SparseCmplxQR.cc	Fri Jan 29 14:55:20 2016 -0500
@@ -29,25 +29,6 @@
 #include "SparseCmplxQR.h"
 #include "oct-locbuf.h"
 
-#if defined (CS_VER) && (((CS_VER == 2) && (CS_SUBVER < 2)) || (CS_VER < 2))
-typedef double _Complex cs_complex_t;
-
-// Why did g++ 4.x stl_vector.h make
-//   OCTAVE_LOCAL_BUFFER (cs_complex_t, buf, n)
-// an error ?
-#define OCTAVE_C99_COMPLEX(buf, n) \
-  OCTAVE_LOCAL_BUFFER (double, buf ## tmp, (2 * (n))); \
-  cs_complex_t *buf = reinterpret_cast<cs_complex_t *> (buf ## tmp);
-
-#define OCTAVE_C99_ZERO (0. + 0.iF)
-#define OCTAVE_C99_ONE (1. + 0.iF)
-#else
-#define OCTAVE_C99_COMPLEX(buf, n) \
-  OCTAVE_LOCAL_BUFFER (cs_complex_t, buf, (n));
-#define OCTAVE_C99_ZERO cs_complex_t(0., 0.);
-#define OCTAVE_C99_ONE cs_complex_t(1., 0.);
-#endif
-
 SparseComplexQR::SparseComplexQR_rep::SparseComplexQR_rep
   (OCTAVE_UNUSED const SparseComplexMatrix& a, OCTAVE_UNUSED int order)
   : count (1), nrows (0)
@@ -69,11 +50,7 @@
                                    (a.data ()));
   A.nz = -1;
   BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
   S = CXSPARSE_ZNAME (_sqr) (order, &A, 1);
-#else
-  S = CXSPARSE_ZNAME (_sqr) (&A, order - 1, 1);
-#endif
   N = CXSPARSE_ZNAME (_qr) (&A, S);
   END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
   if (! N)
@@ -132,11 +109,7 @@
 #ifdef HAVE_CXSPARSE
   ColumnVector ret(N->L->m);
   for (octave_idx_type i = 0; i < N->L->m; i++)
-#if defined (CS_VER) && (CS_VER >= 2)
     ret.xelem (i) = S->pinv[i];
-#else
-    ret.xelem (i) = S->Pinv[i];
-#endif
   return ret;
 #else
   return ColumnVector ();
@@ -149,11 +122,7 @@
 #ifdef HAVE_CXSPARSE
   ColumnVector ret(N->L->m);
   for (octave_idx_type i = 0; i < N->L->m; i++)
-#if defined (CS_VER) && (CS_VER >= 2)
     ret.xelem (S->pinv[i]) = i;
-#else
-    ret.xelem (S->Pinv[i]) = i;
-#endif
   return ret;
 #else
   return ColumnVector ();
@@ -215,13 +184,8 @@
           octave_quit ();
           volatile octave_idx_type nm = (nr < nc ? nr : nc);
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_ZNAME (_ipvec)
             (S->pinv, bvec + idx, reinterpret_cast<cs_complex_t *>(buf), b_nr);
-#else
-          CXSPARSE_ZNAME (_ipvec)
-            (b_nr, S->Pinv, bvec + idx, reinterpret_cast<cs_complex_t *>(buf));
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           for (volatile octave_idx_type i = 0; i < nm; i++)
             {
@@ -256,23 +220,18 @@
     ret = ComplexMatrix (nc, nr, Complex (0.0, 0.0));
   else
     {
-      OCTAVE_C99_COMPLEX (bvec, nr);
+      OCTAVE_LOCAL_BUFFER (cs_complex_t, bvec, nr);
       for (octave_idx_type i = 0; i < nr; i++)
-        bvec[i] = OCTAVE_C99_ZERO;
+        bvec[i] = cs_complex_t (0.0, 0.0);
       OCTAVE_LOCAL_BUFFER (Complex, buf, S->m2);
       for (volatile octave_idx_type j = 0, idx = 0; j < nr; j++, idx+=nr)
         {
           octave_quit ();
-          bvec[j] = OCTAVE_C99_ONE;
+          bvec[j] = cs_complex_t (1.0, 0.0);
           volatile octave_idx_type nm = (nr < nc ? nr : nc);
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_ZNAME (_ipvec)
             (S->pinv, bvec, reinterpret_cast<cs_complex_t *>(buf), nr);
-#else
-          CXSPARSE_ZNAME (_ipvec)
-            (nr, S->Pinv, bvec, reinterpret_cast<cs_complex_t *>(buf));
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           for (volatile octave_idx_type i = 0; i < nm; i++)
             {
@@ -284,7 +243,7 @@
             }
           for (octave_idx_type i = 0; i < nr; i++)
             vec[i+idx] = buf[i];
-          bvec[j] = OCTAVE_C99_ZERO;
+          bvec[j] = cs_complex_t (0.0, 0.0);
         }
     }
   return ret.hermitian ();
@@ -317,7 +276,7 @@
         return ComplexMatrix ();
       x.resize (nc, b_nc);
       cs_complex_t *vec = reinterpret_cast<cs_complex_t *> (x.fortran_vec ());
-      OCTAVE_C99_COMPLEX (buf, q.S ()->m2);
+      OCTAVE_LOCAL_BUFFER (cs_complex_t, buf, q.S ()->m2);
       OCTAVE_LOCAL_BUFFER (Complex, Xx, b_nr);
       for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc)
         {
@@ -325,15 +284,10 @@
           for (octave_idx_type j = 0; j < b_nr; j++)
             Xx[j] = b.xelem (j,i);
           for (octave_idx_type j = nr; j < q.S ()->m2; j++)
-            buf[j] = OCTAVE_C99_ZERO;
+            buf[j] = cs_complex_t (0.0, 0.0);
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_ZNAME (_ipvec)
             (q.S ()->pinv, reinterpret_cast<cs_complex_t *>(Xx), buf, nr);
-#else
-          CXSPARSE_ZNAME (_ipvec)
-            (nr, q.S ()->Pinv, reinterpret_cast<cs_complex_t *>(Xx), buf);
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           for (volatile octave_idx_type j = 0; j < nc; j++)
             {
@@ -344,11 +298,7 @@
             }
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           CXSPARSE_ZNAME (_usolve) (q.N ()->U, buf);
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_ZNAME (_ipvec) (q.S ()->q, buf, vec + idx, nc);
-#else
-          CXSPARSE_ZNAME (_ipvec) (nc, q.S ()->Q, buf, vec + idx);
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
         }
       info = 0;
@@ -362,53 +312,32 @@
       x.resize (nc, b_nc);
       cs_complex_t *vec = reinterpret_cast<cs_complex_t *> (x.fortran_vec ());
       volatile octave_idx_type nbuf = (nc > q.S ()->m2 ? nc : q.S ()->m2);
-      OCTAVE_C99_COMPLEX (buf, nbuf);
+      OCTAVE_LOCAL_BUFFER (cs_complex_t, buf, nbuf);
       OCTAVE_LOCAL_BUFFER (Complex, Xx, b_nr);
-#if defined (CS_VER) && (((CS_VER == 2) && (CS_SUBVER >= 2)) || (CS_VER > 2))
       OCTAVE_LOCAL_BUFFER (double, B, nr);
       for (octave_idx_type i = 0; i < nr; i++)
         B[i] = q.N ()->B[i];
-#else
-      OCTAVE_LOCAL_BUFFER (Complex, B, nr);
-      for (octave_idx_type i = 0; i < nr; i++)
-        B[i] = conj (reinterpret_cast<Complex *>(q.N ()->B)[i]);
-#endif
       for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc)
         {
           octave_quit ();
           for (octave_idx_type j = 0; j < b_nr; j++)
             Xx[j] = b.xelem (j,i);
           for (octave_idx_type j = nr; j < nbuf; j++)
-            buf[j] = OCTAVE_C99_ZERO;
+            buf[j] = cs_complex_t (0.0, 0.0);
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_ZNAME (_pvec)
             (q.S ()->q, reinterpret_cast<cs_complex_t *>(Xx), buf, nr);
-#else
-          CXSPARSE_ZNAME (_pvec)
-            (nr, q.S ()->Q, reinterpret_cast<cs_complex_t *>(Xx), buf);
-#endif
           CXSPARSE_ZNAME (_utsolve) (q.N ()->U, buf);
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           for (volatile octave_idx_type j = nr-1; j >= 0; j--)
             {
               octave_quit ();
               BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-
-#if defined (CS_VER) && (((CS_VER == 2) && (CS_SUBVER >= 2)) || (CS_VER > 2))
               CXSPARSE_ZNAME (_happly) (q.N ()->L, j, B[j], buf);
-#else
-              CXSPARSE_ZNAME (_happly)
-                (q.N ()->L, j, reinterpret_cast<cs_complex_t *>(B)[j], buf);
-#endif
               END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
             }
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_ZNAME (_pvec) (q.S ()->pinv, buf, vec + idx, nc);
-#else
-          CXSPARSE_ZNAME (_pvec) (nc, q.S ()->Pinv, buf, vec + idx);
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
         }
       info = 0;
@@ -449,22 +378,17 @@
       x_nz = b.nnz ();
       ii = 0;
       OCTAVE_LOCAL_BUFFER (Complex, Xx, (b_nr > nc ? b_nr : nc));
-      OCTAVE_C99_COMPLEX (buf, q.S ()->m2);
+      OCTAVE_LOCAL_BUFFER (cs_complex_t, buf, q.S ()->m2);
       for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc)
         {
           octave_quit ();
           for (octave_idx_type j = 0; j < b_nr; j++)
             Xx[j] = b.xelem (j,i);
           for (octave_idx_type j = nr; j < q.S ()->m2; j++)
-            buf[j] = OCTAVE_C99_ZERO;
+            buf[j] = cs_complex_t (0.0, 0.0);
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_ZNAME (_ipvec)
             (q.S ()->pinv, reinterpret_cast<cs_complex_t *>(Xx), buf, nr);
-#else
-          CXSPARSE_ZNAME (_ipvec)
-            (nr, q.S ()->Pinv, reinterpret_cast<cs_complex_t *>(Xx), buf);
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           for (volatile octave_idx_type j = 0; j < nc; j++)
             {
@@ -475,13 +399,8 @@
             }
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           CXSPARSE_ZNAME (_usolve) (q.N ()->U, buf);
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_ZNAME (_ipvec)
             (q.S ()->q, buf, reinterpret_cast<cs_complex_t *>(Xx), nc);
-#else
-          CXSPARSE_ZNAME (_ipvec)
-            (nc, q.S ()->Q, buf, reinterpret_cast<cs_complex_t *>(Xx));
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
 
           for (octave_idx_type j = 0; j < nc; j++)
@@ -517,54 +436,34 @@
       ii = 0;
       volatile octave_idx_type nbuf = (nc > q.S ()->m2 ? nc : q.S ()->m2);
       OCTAVE_LOCAL_BUFFER (Complex, Xx, (b_nr > nc ? b_nr : nc));
-      OCTAVE_C99_COMPLEX (buf, nbuf);
+      OCTAVE_LOCAL_BUFFER (cs_complex_t, buf, nbuf);
 
-#if defined (CS_VER) && (((CS_VER == 2) && (CS_SUBVER >= 2)) || (CS_VER > 2))
       OCTAVE_LOCAL_BUFFER (double, B, nr);
       for (octave_idx_type i = 0; i < nr; i++)
         B[i] = q.N ()->B[i];
-#else
-      OCTAVE_LOCAL_BUFFER (Complex, B, nr);
-      for (octave_idx_type i = 0; i < nr; i++)
-        B[i] = conj (reinterpret_cast<Complex *>(q.N ()->B)[i]);
-#endif
+
       for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc)
         {
           octave_quit ();
           for (octave_idx_type j = 0; j < b_nr; j++)
             Xx[j] = b.xelem (j,i);
           for (octave_idx_type j = nr; j < nbuf; j++)
-            buf[j] = OCTAVE_C99_ZERO;
+            buf[j] = cs_complex_t (0.0, 0.0);
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_ZNAME (_pvec)
             (q.S ()->q, reinterpret_cast<cs_complex_t *>(Xx), buf, nr);
-#else
-          CXSPARSE_ZNAME (_pvec)
-            (nr, q.S ()->Q, reinterpret_cast<cs_complex_t *>(Xx), buf);
-#endif
           CXSPARSE_ZNAME (_utsolve) (q.N ()->U, buf);
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           for (volatile octave_idx_type j = nr-1; j >= 0; j--)
             {
               octave_quit ();
               BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (((CS_VER == 2) && (CS_SUBVER >= 2)) || (CS_VER > 2))
               CXSPARSE_ZNAME (_happly) (q.N ()->L, j, B[j], buf);
-#else
-              CXSPARSE_ZNAME (_happly)
-                (q.N ()->L, j, reinterpret_cast<cs_complex_t *>(B)[j], buf);
-#endif
               END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
             }
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_ZNAME (_pvec)
             (q.S ()->pinv, buf, reinterpret_cast<cs_complex_t *>(Xx), nc);
-#else
-          CXSPARSE_ZNAME (_pvec)
-            (nc, q.S ()->Pinv, buf, reinterpret_cast<cs_complex_t *>(Xx));
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
 
           for (octave_idx_type j = 0; j < nc; j++)
@@ -624,19 +523,15 @@
       x.resize (nc, b_nc);
       cs_complex_t *vec = reinterpret_cast<cs_complex_t *>
                           (x.fortran_vec ());
-      OCTAVE_C99_COMPLEX (buf, q.S ()->m2);
+      OCTAVE_LOCAL_BUFFER (cs_complex_t, buf, q.S ()->m2);
       for (volatile octave_idx_type i = 0, idx = 0, bidx = 0; i < b_nc;
            i++, idx+=nc, bidx+=b_nr)
         {
           octave_quit ();
           for (octave_idx_type j = nr; j < q.S ()->m2; j++)
-            buf[j] = OCTAVE_C99_ZERO;
+            buf[j] = cs_complex_t (0.0, 0.0);
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_ZNAME (_ipvec) (q.S ()->pinv, bvec + bidx, buf, nr);
-#else
-          CXSPARSE_ZNAME (_ipvec) (nr, q.S ()->Pinv, bvec + bidx, buf);
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           for (volatile octave_idx_type j = 0; j < nc; j++)
             {
@@ -647,11 +542,7 @@
             }
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           CXSPARSE_ZNAME (_usolve) (q.N ()->U, buf);
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_ZNAME (_ipvec) (q.S ()->q, buf, vec + idx, nc);
-#else
-          CXSPARSE_ZNAME (_ipvec) (nc, q.S ()->Q, buf, vec + idx);
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
         }
       info = 0;
@@ -665,48 +556,29 @@
       x.resize (nc, b_nc);
       cs_complex_t *vec = reinterpret_cast<cs_complex_t *> (x.fortran_vec ());
       volatile octave_idx_type nbuf = (nc > q.S ()->m2 ? nc : q.S ()->m2);
-      OCTAVE_C99_COMPLEX (buf, nbuf);
-#if defined (CS_VER) && (((CS_VER == 2) && (CS_SUBVER >= 2)) || (CS_VER > 2))
+      OCTAVE_LOCAL_BUFFER (cs_complex_t, buf, nbuf);
       OCTAVE_LOCAL_BUFFER (double, B, nr);
       for (octave_idx_type i = 0; i < nr; i++)
         B[i] = q.N ()->B[i];
-#else
-      OCTAVE_LOCAL_BUFFER (Complex, B, nr);
-      for (octave_idx_type i = 0; i < nr; i++)
-        B[i] = conj (reinterpret_cast<Complex *>(q.N ()->B)[i]);
-#endif
       for (volatile octave_idx_type i = 0, idx = 0, bidx = 0; i < b_nc;
            i++, idx+=nc, bidx+=b_nr)
         {
           octave_quit ();
           for (octave_idx_type j = nr; j < nbuf; j++)
-            buf[j] = OCTAVE_C99_ZERO;
+            buf[j] = cs_complex_t (0.0, 0.0);
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_ZNAME (_pvec) (q.S ()->q, bvec + bidx, buf, nr);
-#else
-          CXSPARSE_ZNAME (_pvec) (nr, q.S ()->Q, bvec + bidx, buf);
-#endif
           CXSPARSE_ZNAME (_utsolve) (q.N ()->U, buf);
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           for (volatile octave_idx_type j = nr-1; j >= 0; j--)
             {
               octave_quit ();
               BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (((CS_VER == 2) && (CS_SUBVER >= 2)) || (CS_VER > 2))
               CXSPARSE_ZNAME (_happly) (q.N ()->L, j, B[j], buf);
-#else
-              CXSPARSE_ZNAME (_happly)
-                (q.N ()->L, j, reinterpret_cast<cs_complex_t *>(B)[j], buf);
-#endif
               END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
             }
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_ZNAME (_pvec) (q.S ()->pinv, buf, vec + idx, nc);
-#else
-          CXSPARSE_ZNAME (_pvec) (nc, q.S ()->Pinv, buf, vec + idx);
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
         }
       info = 0;
@@ -747,22 +619,17 @@
       x_nz = b.nnz ();
       ii = 0;
       OCTAVE_LOCAL_BUFFER (Complex, Xx, (b_nr > nc ? b_nr : nc));
-      OCTAVE_C99_COMPLEX (buf, q.S ()->m2);
+      OCTAVE_LOCAL_BUFFER (cs_complex_t, buf, q.S ()->m2);
       for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc)
         {
           octave_quit ();
           for (octave_idx_type j = 0; j < b_nr; j++)
             Xx[j] = b.xelem (j,i);
           for (octave_idx_type j = nr; j < q.S ()->m2; j++)
-            buf[j] = OCTAVE_C99_ZERO;
+            buf[j] = cs_complex_t (0.0, 0.0);
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_ZNAME (_ipvec)
             (q.S ()->pinv, reinterpret_cast<cs_complex_t *>(Xx), buf, nr);
-#else
-          CXSPARSE_ZNAME (_ipvec)
-            (nr, q.S ()->Pinv, reinterpret_cast<cs_complex_t *>(Xx), buf);
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           for (volatile octave_idx_type j = 0; j < nc; j++)
             {
@@ -773,13 +640,8 @@
             }
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           CXSPARSE_ZNAME (_usolve) (q.N ()->U, buf);
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_ZNAME (_ipvec)
             (q.S ()->q, buf, reinterpret_cast<cs_complex_t *>(Xx), nc);
-#else
-          CXSPARSE_ZNAME (_ipvec)
-            (nc, q.S ()->Q, buf, reinterpret_cast<cs_complex_t *>(Xx));
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
 
           for (octave_idx_type j = 0; j < nc; j++)
@@ -815,53 +677,32 @@
       ii = 0;
       volatile octave_idx_type nbuf = (nc > q.S ()->m2 ? nc : q.S ()->m2);
       OCTAVE_LOCAL_BUFFER (Complex, Xx, (b_nr > nc ? b_nr : nc));
-      OCTAVE_C99_COMPLEX (buf, nbuf);
-#if defined (CS_VER) && (((CS_VER == 2) && (CS_SUBVER >= 2)) || (CS_VER > 2))
+      OCTAVE_LOCAL_BUFFER (cs_complex_t, buf, nbuf);
       OCTAVE_LOCAL_BUFFER (double, B, nr);
       for (octave_idx_type i = 0; i < nr; i++)
         B[i] = q.N ()->B[i];
-#else
-      OCTAVE_LOCAL_BUFFER (Complex, B, nr);
-      for (octave_idx_type i = 0; i < nr; i++)
-        B[i] = conj (reinterpret_cast<Complex *>(q.N ()->B)[i]);
-#endif
       for (volatile octave_idx_type i = 0, idx = 0; i < b_nc; i++, idx+=nc)
         {
           octave_quit ();
           for (octave_idx_type j = 0; j < b_nr; j++)
             Xx[j] = b.xelem (j,i);
           for (octave_idx_type j = nr; j < nbuf; j++)
-            buf[j] = OCTAVE_C99_ZERO;
+            buf[j] = cs_complex_t (0.0, 0.0);
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_ZNAME (_pvec)
             (q.S ()->q, reinterpret_cast<cs_complex_t *>(Xx), buf, nr);
-#else
-          CXSPARSE_ZNAME (_pvec)
-            (nr, q.S ()->Q, reinterpret_cast<cs_complex_t *>(Xx), buf);
-#endif
           CXSPARSE_ZNAME (_utsolve) (q.N ()->U, buf);
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           for (volatile octave_idx_type j = nr-1; j >= 0; j--)
             {
               octave_quit ();
               BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (((CS_VER == 2) && (CS_SUBVER >= 2)) || (CS_VER > 2))
               CXSPARSE_ZNAME (_happly) (q.N ()->L, j, B[j], buf);
-#else
-              CXSPARSE_ZNAME (_happly)
-                (q.N ()->L, j, reinterpret_cast<cs_complex_t *>(B)[j], buf);
-#endif
               END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
             }
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_ZNAME (_pvec)
             (q.S ()->pinv, buf, reinterpret_cast<cs_complex_t *>(Xx), nc);
-#else
-          CXSPARSE_ZNAME (_pvec)
-            (nc, q.S ()->Pinv, buf, reinterpret_cast<cs_complex_t *>(Xx));
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
 
           for (octave_idx_type j = 0; j < nc; j++)
--- a/liboctave/numeric/SparseQR.cc	Fri Jan 29 11:32:23 2016 -0800
+++ b/liboctave/numeric/SparseQR.cc	Fri Jan 29 14:55:20 2016 -0500
@@ -48,11 +48,7 @@
   A.x = const_cast<double *>(a.data ());
   A.nz = -1;
   BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
   S = CXSPARSE_DNAME (_sqr) (order, &A, 1);
-#else
-  S = CXSPARSE_DNAME (_sqr) (&A, order - 1, 1);
-#endif
 
   N = CXSPARSE_DNAME (_qr) (&A, S);
   END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
@@ -112,11 +108,7 @@
 #ifdef HAVE_CXSPARSE
   ColumnVector ret(N->L->m);
   for (octave_idx_type i = 0; i < N->L->m; i++)
-#if defined (CS_VER) && (CS_VER >= 2)
     ret.xelem (i) = S->pinv[i];
-#else
-    ret.xelem (i) = S->Pinv[i];
-#endif
   return ret;
 #else
   return ColumnVector ();
@@ -129,11 +121,7 @@
 #ifdef HAVE_CXSPARSE
   ColumnVector ret(N->L->m);
   for (octave_idx_type i = 0; i < N->L->m; i++)
-#if defined (CS_VER) && (CS_VER >= 2)
     ret.xelem (S->pinv[i]) = i;
-#else
-    ret.xelem (S->Pinv[i]) = i;
-#endif
   return ret;
 #else
   return ColumnVector ();
@@ -198,11 +186,7 @@
             buf[i] = 0.;
           volatile octave_idx_type nm = (nr < nc ? nr : nc);
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_DNAME (_ipvec) (S->pinv, bvec + idx, buf, b_nr);
-#else
-          CXSPARSE_DNAME (_ipvec) (b_nr, S->Pinv, bvec + idx, buf);
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
 
           for (volatile octave_idx_type i = 0; i < nm; i++)
@@ -249,11 +233,7 @@
             buf[i] = 0.;
           volatile octave_idx_type nm = (nr < nc ? nr : nc);
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_DNAME (_ipvec) (S->pinv, bvec, buf, nr);
-#else
-          CXSPARSE_DNAME (_ipvec) (nr, S->Pinv, bvec, buf);
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
 
           for (volatile octave_idx_type i = 0; i < nm; i++)
@@ -307,11 +287,7 @@
           for (octave_idx_type j = nr; j < q.S ()->m2; j++)
             buf[j] = 0.;
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_DNAME (_ipvec) (q.S ()->pinv, bvec + bidx, buf, nr);
-#else
-          CXSPARSE_DNAME (_ipvec) (nr, q.S ()->Pinv, bvec + bidx, buf);
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           for (volatile octave_idx_type j = 0; j < nc; j++)
             {
@@ -322,11 +298,7 @@
             }
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           CXSPARSE_DNAME (_usolve) (q.N ()->U, buf);
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_DNAME (_ipvec) (q.S ()->q, buf, vec + idx, nc);
-#else
-          CXSPARSE_DNAME (_ipvec) (nc, q.S ()->Q, buf, vec + idx);
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
         }
       info = 0;
@@ -348,11 +320,7 @@
           for (octave_idx_type j = nr; j < nbuf; j++)
             buf[j] = 0.;
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_DNAME (_pvec) (q.S ()->q, bvec + bidx, buf, nr);
-#else
-          CXSPARSE_DNAME (_pvec) (nr, q.S ()->Q, bvec + bidx, buf);
-#endif
           CXSPARSE_DNAME (_utsolve) (q.N ()->U, buf);
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           for (volatile octave_idx_type j = nr-1; j >= 0; j--)
@@ -363,11 +331,7 @@
               END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
             }
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_DNAME (_pvec) (q.S ()->pinv, buf, vec + idx, nc);
-#else
-          CXSPARSE_DNAME (_pvec) (nc, q.S ()->Pinv, buf, vec + idx);
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
         }
       info = 0;
@@ -416,11 +380,7 @@
           for (octave_idx_type j = nr; j < q.S ()->m2; j++)
             buf[j] = 0.;
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_DNAME (_ipvec) (q.S ()->pinv, Xx, buf, nr);
-#else
-          CXSPARSE_DNAME (_ipvec) (nr, q.S ()->Pinv, Xx, buf);
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           for (volatile octave_idx_type j = 0; j < nc; j++)
             {
@@ -431,11 +391,7 @@
             }
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           CXSPARSE_DNAME (_usolve) (q.N ()->U, buf);
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_DNAME (_ipvec) (q.S ()->q, buf, Xx, nc);
-#else
-          CXSPARSE_DNAME (_ipvec) (nc, q.S ()->Q, buf, Xx);
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
 
           for (octave_idx_type j = 0; j < nc; j++)
@@ -480,11 +436,7 @@
           for (octave_idx_type j = nr; j < nbuf; j++)
             buf[j] = 0.;
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_DNAME (_pvec) (q.S ()->q, Xx, buf, nr);
-#else
-          CXSPARSE_DNAME (_pvec) (nr, q.S ()->Q, Xx, buf);
-#endif
           CXSPARSE_DNAME (_utsolve) (q.N ()->U, buf);
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           for (volatile octave_idx_type j = nr-1; j >= 0; j--)
@@ -495,11 +447,7 @@
               END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
             }
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_DNAME (_pvec) (q.S ()->pinv, buf, Xx, nc);
-#else
-          CXSPARSE_DNAME (_pvec) (nc, q.S ()->Pinv, buf, Xx);
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
 
           for (octave_idx_type j = 0; j < nc; j++)
@@ -570,11 +518,7 @@
           for (octave_idx_type j = nr; j < q.S ()->m2; j++)
             buf[j] = 0.;
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_DNAME (_ipvec) (q.S ()->pinv, Xx, buf, nr);
-#else
-          CXSPARSE_DNAME (_ipvec) (nr, q.S ()->Pinv, Xx, buf);
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           for (volatile octave_idx_type j = 0; j < nc; j++)
             {
@@ -585,18 +529,10 @@
             }
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           CXSPARSE_DNAME (_usolve) (q.N ()->U, buf);
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_DNAME (_ipvec) (q.S ()->q, buf, Xx, nc);
-#else
-          CXSPARSE_DNAME (_ipvec) (nc, q.S ()->Q, buf, Xx);
-#endif
           for (octave_idx_type j = nr; j < q.S ()->m2; j++)
             buf[j] = 0.;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_DNAME (_ipvec) (q.S ()->pinv, Xz, buf, nr);
-#else
-          CXSPARSE_DNAME (_ipvec) (nr, q.S ()->Pinv, Xz, buf);
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           for (volatile octave_idx_type j = 0; j < nc; j++)
             {
@@ -607,11 +543,7 @@
             }
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           CXSPARSE_DNAME (_usolve) (q.N ()->U, buf);
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_DNAME (_ipvec) (q.S ()->q, buf, Xz, nc);
-#else
-          CXSPARSE_DNAME (_ipvec) (nc, q.S ()->Q, buf, Xz);
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           for (octave_idx_type j = 0; j < nc; j++)
             vec[j+idx] = Complex (Xx[j], Xz[j]);
@@ -642,11 +574,7 @@
           for (octave_idx_type j = nr; j < nbuf; j++)
             buf[j] = 0.;
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_DNAME (_pvec) (q.S ()->q, Xx, buf, nr);
-#else
-          CXSPARSE_DNAME (_pvec) (nr, q.S ()->Q, Xx, buf);
-#endif
           CXSPARSE_DNAME (_utsolve) (q.N ()->U, buf);
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           for (volatile octave_idx_type j = nr-1; j >= 0; j--)
@@ -657,20 +585,12 @@
               END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
             }
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_DNAME (_pvec) (q.S ()->pinv, buf, Xx, nc);
-#else
-          CXSPARSE_DNAME (_pvec) (nc, q.S ()->Pinv, buf, Xx);
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           for (octave_idx_type j = nr; j < nbuf; j++)
             buf[j] = 0.;
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_DNAME (_pvec) (q.S ()->q, Xz, buf, nr);
-#else
-          CXSPARSE_DNAME (_pvec) (nr, q.S ()->Q, Xz, buf);
-#endif
           CXSPARSE_DNAME (_utsolve) (q.N ()->U, buf);
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           for (volatile octave_idx_type j = nr-1; j >= 0; j--)
@@ -681,11 +601,7 @@
               END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
             }
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_DNAME (_pvec) (q.S ()->pinv, buf, Xz, nc);
-#else
-          CXSPARSE_DNAME (_pvec) (nc, q.S ()->Pinv, buf, Xz);
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           for (octave_idx_type j = 0; j < nc; j++)
             vec[j+idx] = Complex (Xx[j], Xz[j]);
@@ -742,11 +658,7 @@
           for (octave_idx_type j = nr; j < q.S ()->m2; j++)
             buf[j] = 0.;
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_DNAME (_ipvec) (q.S ()->pinv, Xx, buf, nr);
-#else
-          CXSPARSE_DNAME (_ipvec) (nr, q.S ()->Pinv, Xx, buf);
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           for (volatile octave_idx_type j = 0; j < nc; j++)
             {
@@ -757,20 +669,12 @@
             }
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           CXSPARSE_DNAME (_usolve) (q.N ()->U, buf);
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_DNAME (_ipvec) (q.S ()->q, buf, Xx, nc);
-#else
-          CXSPARSE_DNAME (_ipvec) (nc, q.S ()->Q, buf, Xx);
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           for (octave_idx_type j = nr; j < q.S ()->m2; j++)
             buf[j] = 0.;
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_DNAME (_ipvec) (q.S ()->pinv, Xz, buf, nr);
-#else
-          CXSPARSE_DNAME (_ipvec) (nr, q.S ()->Pinv, Xz, buf);
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           for (volatile octave_idx_type j = 0; j < nc; j++)
             {
@@ -781,11 +685,7 @@
             }
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           CXSPARSE_DNAME (_usolve) (q.N ()->U, buf);
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_DNAME (_ipvec) (q.S ()->q, buf, Xz, nc);
-#else
-          CXSPARSE_DNAME (_ipvec) (nc, q.S ()->Q, buf, Xz);
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
 
           for (octave_idx_type j = 0; j < nc; j++)
@@ -835,11 +735,7 @@
           for (octave_idx_type j = nr; j < nbuf; j++)
             buf[j] = 0.;
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_DNAME (_pvec) (q.S ()->q, Xx, buf, nr);
-#else
-          CXSPARSE_DNAME (_pvec) (nr, q.S ()->Q, Xx, buf);
-#endif
           CXSPARSE_DNAME (_utsolve) (q.N ()->U, buf);
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           for (volatile octave_idx_type j = nr-1; j >= 0; j--)
@@ -850,20 +746,12 @@
               END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
             }
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_DNAME (_pvec) (q.S ()->pinv, buf, Xx, nc);
-#else
-          CXSPARSE_DNAME (_pvec) (nc, q.S ()->Pinv, buf, Xx);
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           for (octave_idx_type j = nr; j < nbuf; j++)
             buf[j] = 0.;
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_DNAME (_pvec) (q.S ()->q, Xz, buf, nr);
-#else
-          CXSPARSE_DNAME (_pvec) (nr, q.S ()->Q, Xz, buf);
-#endif
           CXSPARSE_DNAME (_utsolve) (q.N ()->U, buf);
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
           for (volatile octave_idx_type j = nr-1; j >= 0; j--)
@@ -874,11 +762,7 @@
               END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
             }
           BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-#if defined (CS_VER) && (CS_VER >= 2)
           CXSPARSE_DNAME (_pvec) (q.S ()->pinv, buf, Xz, nc);
-#else
-          CXSPARSE_DNAME (_pvec) (nc, q.S ()->Pinv, buf, Xz);
-#endif
           END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
 
           for (octave_idx_type j = 0; j < nc; j++)
--- a/liboctave/numeric/sparse-dmsolve.cc	Fri Jan 29 11:32:23 2016 -0800
+++ b/liboctave/numeric/sparse-dmsolve.cc	Fri Jan 29 14:55:20 2016 -0500
@@ -322,15 +322,10 @@
       csm.p = const_cast<octave_idx_type *>(a.cidx ());
       csm.i = const_cast<octave_idx_type *>(a.ridx ());
 
-#if defined (CS_VER) && (CS_VER >= 2)
       CXSPARSE_DNAME (d) *dm = CXSPARSE_DNAME(_dmperm) (&csm, 0);
       octave_idx_type *p = dm->p;
       octave_idx_type *q = dm->q;
-#else
-      CXSPARSE_DNAME (d) *dm = CXSPARSE_DNAME(_dmperm) (&csm);
-      octave_idx_type *p = dm->P;
-      octave_idx_type *q = dm->Q;
-#endif
+
       OCTAVE_LOCAL_BUFFER (octave_idx_type, pinv, nr);
       for (octave_idx_type i = 0; i < nr; i++)
         pinv[p[i]] = i;
--- a/liboctave/util/oct-sparse.h	Fri Jan 29 11:32:23 2016 -0800
+++ b/liboctave/util/oct-sparse.h	Fri Jan 29 14:55:20 2016 -0500
@@ -83,6 +83,18 @@
 #include <cs.h>
 #endif
 
+// Yes, it would be better to use a configure script check for
+// required CXSparse features, but that seems more trouble than it is
+// worth in this case.
+
+#if (defined (HAVE_CXSPARSE)                    \
+     && (! defined (CS_VER) \
+         || CS_VER < 2 \
+         || (CS_VER == 2 && CS_SUBVER < 2)))
+#error "Octave requires CXSparse version 2.2 or later"
+#error "Upgrade CXSparse (SuiteSparse) or configure Octave with --disable-cxsparse"
+#endif
+
 #if (defined (HAVE_SUITESPARSE_CHOLMOD_H) \
      || defined (HAVE_UFSPARSE_CHOLMOD_H) \
      || defined (HAVE_CHOLMOD_CHOLMOD_H) \