changeset 32176:134152cf1a3f stable

sparse-qr.cc: Fix compatibility with SuiteSparse 7.1.0 / CXSparse 4.0.4. * liboctave/numeric/sparse-qr.cc (sparse_qr_rep::Q): "I" is a preprocessor macro when <complex.h> is included. Rename variable to "I_mat". (sparse_qr_rep::tall_solve, sparse_qr_rep::wide_solve): "cs_complex_t" is "double _Complex" in SuiteSparse 7.1.0 / CXSparse 4.0.4 or newer. So, it is not possible to use it as a constructor with two arguments. It was "std::complex<double>" in previous versions. Use the default one-argument constructor that works with both instead.
author Markus Mützel <markus.muetzel@gmx.de>
date Mon, 03 Jul 2023 21:23:07 +0200
parents 6ad3035405a5
children 2c9f01dc9fb5 51f4f59a51dc
files liboctave/numeric/sparse-qr.cc
diffstat 1 files changed, 21 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/liboctave/numeric/sparse-qr.cc	Mon Jul 03 18:43:40 2023 +0200
+++ b/liboctave/numeric/sparse-qr.cc	Mon Jul 03 21:23:07 2023 +0200
@@ -805,16 +805,17 @@
   cholmod_dense *q;
 
   // I is nrows x nrows identity matrix
-  cholmod_dense *I
+  cholmod_dense *I_mat
     = cholmod_l_allocate_dense (nrows, nrows, nrows, CHOLMOD_REAL, &m_cc);
 
   for (octave_idx_type i = 0; i < nrows * nrows; i++)
-    (reinterpret_cast<double *> (I->x))[i] = 0.0;
+    (reinterpret_cast<double *> (I_mat->x))[i] = 0.0;
 
   for (octave_idx_type i = 0; i < nrows; i++)
-    (reinterpret_cast<double *> (I->x))[i * nrows + i] = 1.0;
-
-  q = SuiteSparseQR_qmult<double> (SPQR_QX, m_H, m_Htau, m_HPinv, I, &m_cc);
+    (reinterpret_cast<double *> (I_mat->x))[i * nrows + i] = 1.0;
+
+  q = SuiteSparseQR_qmult<double> (SPQR_QX, m_H, m_Htau, m_HPinv, I_mat,
+                                   &m_cc);
   spqr_error_handler (&m_cc);
 
   double *q_x = reinterpret_cast<double *> (q->x);
@@ -824,7 +825,7 @@
       ret_vec[j * nrows + i] = q_x[j * nrows + i];
 
   cholmod_l_free_dense (&q, &m_cc);
-  cholmod_l_free_dense (&I, &m_cc);
+  cholmod_l_free_dense (&I_mat, &m_cc);
 
   return ret;
 
@@ -1739,17 +1740,17 @@
   cholmod_dense *q;
 
   // I is nrows x nrows identity matrix
-  cholmod_dense *I
+  cholmod_dense *I_mat
     = reinterpret_cast<cholmod_dense *>
       (cholmod_l_allocate_dense (nrows, nrows, nrows, CHOLMOD_COMPLEX, &m_cc));
 
   for (octave_idx_type i = 0; i < nrows * nrows; i++)
-    (reinterpret_cast<Complex *> (I->x))[i] = 0.0;
+    (reinterpret_cast<Complex *> (I_mat->x))[i] = 0.0;
 
   for (octave_idx_type i = 0; i < nrows; i++)
-    (reinterpret_cast<Complex *> (I->x))[i * nrows + i] = 1.0;
-
-  q = SuiteSparseQR_qmult<Complex> (SPQR_QX, m_H, m_Htau, m_HPinv, I,
+    (reinterpret_cast<Complex *> (I_mat->x))[i * nrows + i] = 1.0;
+
+  q = SuiteSparseQR_qmult<Complex> (SPQR_QX, m_H, m_Htau, m_HPinv, I_mat,
                                     &m_cc);
   spqr_error_handler (&m_cc);
 
@@ -1761,7 +1762,7 @@
       ret_vec[j * nrows + i] = q_x[j * nrows + i];
 
   cholmod_l_free_dense (&q, &m_cc);
-  cholmod_l_free_dense (&I, &m_cc);
+  cholmod_l_free_dense (&I_mat, &m_cc);
 
   return ret;
 
@@ -2073,7 +2074,7 @@
         Xx[j] = b.xelem (j, i);
 
       for (octave_idx_type j = nr; j < S->m2; j++)
-        buf[j] = cs_complex_t (0.0, 0.0);
+        buf[j] = 0.0;
 
       CXSPARSE_ZNAME (_ipvec) (S->pinv,
                                reinterpret_cast<cs_complex_t *>(Xx),
@@ -2143,7 +2144,7 @@
         Xx[j] = b.xelem (j, i);
 
       for (octave_idx_type j = nr; j < nbuf; j++)
-        buf[j] = cs_complex_t (0.0, 0.0);
+        buf[j] = 0.0;
 
       CXSPARSE_ZNAME (_pvec) (S->q, reinterpret_cast<cs_complex_t *> (Xx),
                               buf, nr);
@@ -2206,7 +2207,7 @@
         Xx[j] = b.xelem (j, i);
 
       for (octave_idx_type j = nr; j < S->m2; j++)
-        buf[j] = cs_complex_t (0.0, 0.0);
+        buf[j] = 0.0;
 
       CXSPARSE_ZNAME (_ipvec) (S->pinv,
                                reinterpret_cast<cs_complex_t *> (Xx),
@@ -2304,7 +2305,7 @@
         Xx[j] = b.xelem (j, i);
 
       for (octave_idx_type j = nr; j < nbuf; j++)
-        buf[j] = cs_complex_t (0.0, 0.0);
+        buf[j] = 0.0;
 
       CXSPARSE_ZNAME (_pvec) (S->q,
                               reinterpret_cast<cs_complex_t *> (Xx),
@@ -2392,7 +2393,7 @@
       octave_quit ();
 
       for (octave_idx_type j = nr; j < S->m2; j++)
-        buf[j] = cs_complex_t (0.0, 0.0);
+        buf[j] = 0.0;
 
       CXSPARSE_ZNAME (_ipvec) (S->pinv, bvec + bidx, buf, nr);
 
@@ -2460,7 +2461,7 @@
       octave_quit ();
 
       for (octave_idx_type j = nr; j < nbuf; j++)
-        buf[j] = cs_complex_t (0.0, 0.0);
+        buf[j] = 0.0;
 
       CXSPARSE_ZNAME (_pvec) (S->q, bvec + bidx, buf, nr);
       CXSPARSE_ZNAME (_utsolve) (N->U, buf);
@@ -2522,7 +2523,7 @@
         Xx[j] = b.xelem (j, i);
 
       for (octave_idx_type j = nr; j < S->m2; j++)
-        buf[j] = cs_complex_t (0.0, 0.0);
+        buf[j] = 0.0;
 
       CXSPARSE_ZNAME (_ipvec) (S->pinv,
                                reinterpret_cast<cs_complex_t *> (Xx),
@@ -2620,7 +2621,7 @@
         Xx[j] = b.xelem (j, i);
 
       for (octave_idx_type j = nr; j < nbuf; j++)
-        buf[j] = cs_complex_t (0.0, 0.0);
+        buf[j] = 0.0;
 
       CXSPARSE_ZNAME (_pvec) (S->q, reinterpret_cast<cs_complex_t *>(Xx),
                               buf, nr);