# HG changeset patch # User John W. Eaton # Date 1454097320 18000 # Node ID 8ad3907b8fad29630286e25357cd4a90d1c6a68e # Parent bfd5e48c41a192cef3204d9e3649c88826a6a307 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. diff -r bfd5e48c41a1 -r 8ad3907b8fad libinterp/dldfcn/dmperm.cc --- 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); } diff -r bfd5e48c41a1 -r 8ad3907b8fad liboctave/numeric/SparseCmplxQR.cc --- 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 (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(buf), b_nr); -#else - CXSPARSE_ZNAME (_ipvec) - (b_nr, S->Pinv, bvec + idx, reinterpret_cast(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(buf), nr); -#else - CXSPARSE_ZNAME (_ipvec) - (nr, S->Pinv, bvec, reinterpret_cast(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 (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(Xx), buf, nr); -#else - CXSPARSE_ZNAME (_ipvec) - (nr, q.S ()->Pinv, reinterpret_cast(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 (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(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(Xx), buf, nr); -#else - CXSPARSE_ZNAME (_pvec) - (nr, q.S ()->Q, reinterpret_cast(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(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(Xx), buf, nr); -#else - CXSPARSE_ZNAME (_ipvec) - (nr, q.S ()->Pinv, reinterpret_cast(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(Xx), nc); -#else - CXSPARSE_ZNAME (_ipvec) - (nc, q.S ()->Q, buf, reinterpret_cast(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(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(Xx), buf, nr); -#else - CXSPARSE_ZNAME (_pvec) - (nr, q.S ()->Q, reinterpret_cast(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(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(Xx), nc); -#else - CXSPARSE_ZNAME (_pvec) - (nc, q.S ()->Pinv, buf, reinterpret_cast(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 (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 (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(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(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(Xx), buf, nr); -#else - CXSPARSE_ZNAME (_ipvec) - (nr, q.S ()->Pinv, reinterpret_cast(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(Xx), nc); -#else - CXSPARSE_ZNAME (_ipvec) - (nc, q.S ()->Q, buf, reinterpret_cast(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(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(Xx), buf, nr); -#else - CXSPARSE_ZNAME (_pvec) - (nr, q.S ()->Q, reinterpret_cast(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(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(Xx), nc); -#else - CXSPARSE_ZNAME (_pvec) - (nc, q.S ()->Pinv, buf, reinterpret_cast(Xx)); -#endif END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; for (octave_idx_type j = 0; j < nc; j++) diff -r bfd5e48c41a1 -r 8ad3907b8fad liboctave/numeric/SparseQR.cc --- 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(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++) diff -r bfd5e48c41a1 -r 8ad3907b8fad liboctave/numeric/sparse-dmsolve.cc --- 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(a.cidx ()); csm.i = const_cast(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; diff -r bfd5e48c41a1 -r 8ad3907b8fad liboctave/util/oct-sparse.h --- 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 #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) \