[octave] Add upstream patch to fix sparse matrix test crash

Orion Poplawski orion at fedoraproject.org
Thu Sep 6 17:46:59 UTC 2012


commit a33f0eddc804829e3a8c8340bd6cffc8631bab8c
Author: Orion Poplawski <orion at nwra.com>
Date:   Thu Sep 6 11:46:59 2012 -0600

    Add upstream patch to fix sparse matrix test crash

 octave-sparse.patch |  171 +++++++++++++++++++++++++++++++++++++++++++++++++++
 octave.spec         |    8 ++-
 2 files changed, 178 insertions(+), 1 deletions(-)
---
diff --git a/octave-sparse.patch b/octave-sparse.patch
new file mode 100644
index 0000000..a12038d
--- /dev/null
+++ b/octave-sparse.patch
@@ -0,0 +1,171 @@
+
+# HG changeset patch
+# User David Bateman <dbateman at free.fr>
+# Date 1337385561 -7200
+# Node ID f2e72944847b9ec7cec586faa4c72ea91eb53881
+# Parent  997e05334f71269f16017ceb06a52cf33feced18
+Ensure sparse constructors have valid ridx and data indices even if they are zero matrices (bug #36104)
+
+diff --git a/liboctave/Sparse.cc b/liboctave/Sparse.cc
+--- a/liboctave/Sparse.cc
++++ b/liboctave/Sparse.cc
+@@ -235,7 +235,7 @@
+     (*current_liboctave_error_handler)
+       ("Sparse::Sparse (const dim_vector&): dimension mismatch");
+   else
+-    rep = new typename Sparse<T>::SparseRep (dv(0), dv(1));
++    rep = new typename Sparse<T>::SparseRep (dv(0), dv(1), 0);
+ }
+ 
+ template <class T>
+@@ -301,11 +301,10 @@
+     (*current_liboctave_error_handler)
+       ("sparse: column index %d out of bound %d", r.extent (nc), nc);
+ 
+-  rep = new SparseRep (nr, nc);
++  rep = new typename Sparse<T>::SparseRep (nr, nc, (nzm > 0 ? nzm : 0));
+ 
+   dimensions = dim_vector (nr, nc);
+ 
+-
+   octave_idx_type n = a.numel (), rl = r.length (nr), cl = c.length (nc);
+   bool a_scalar = n == 1;
+   if (a_scalar)
+@@ -324,6 +323,7 @@
+       if (n == 1 && a(0) != T ())
+         {
+           change_capacity (nzm > 1 ? nzm : 1);
++          xcidx(0) = 0;
+           xridx(0) = r(0);
+           xdata(0) = a(0);
+           for (octave_idx_type j = 0; j < nc; j++)
+@@ -352,6 +352,7 @@
+             new_nz += rd[i-1] != rd[i];
+           // Allocate result.
+           change_capacity (nzm > new_nz ? nzm : new_nz);
++          xcidx (0) = 0;
+           xcidx (1) = new_nz;
+           octave_idx_type *rri = ridx ();
+           T *rrd = data ();
+@@ -494,6 +495,7 @@
+         new_nz += rd[i-1] != rd[i];
+       // Allocate result.
+       change_capacity (nzm > new_nz ? nzm : new_nz);
++      xcidx(0) = 0;
+       xcidx(1) = new_nz;
+       octave_idx_type *rri = ridx ();
+       T *rrd = data ();
+
+
+# HG changeset patch
+# User John W. Eaton <jwe at octave.org>
+# Date 1340304125 14400
+# Node ID 4663cc835c65873fe12b599bcab11ba4a8f5fb87
+# Parent  f2e72944847b9ec7cec586faa4c72ea91eb53881
+Special-case removing rows or columns from empty sparse matrices
+
+* Sparse.cc (Sparse<T>::delete_elements): Don't attempt to preserve
+  elements if nnz = 0; simply reshape if number of rows or columns is zero.
+
+diff --git a/liboctave/Sparse.cc b/liboctave/Sparse.cc
+--- a/liboctave/Sparse.cc
++++ b/liboctave/Sparse.cc
+@@ -1240,16 +1240,31 @@
+         gripe_del_index_out_of_range (false, idx_j.extent (nc), nc);
+       else if (idx_j.is_cont_range (nc, lb, ub))
+         {
+-          const Sparse<T> tmp = *this;
+-          octave_idx_type lbi = tmp.cidx(lb), ubi = tmp.cidx(ub), new_nz = nz - (ubi - lbi);
+-          *this = Sparse<T> (nr, nc - (ub - lb), new_nz);
+-          copy_or_memcpy (lbi, tmp.data (), data ());
+-          copy_or_memcpy (lbi, tmp.ridx (), ridx ());
+-          copy_or_memcpy (nz - ubi, tmp.data () + ubi, xdata () + lbi);
+-          copy_or_memcpy (nz - ubi, tmp.ridx () + ubi, xridx () + lbi);
+-          copy_or_memcpy (lb, tmp.cidx () + 1, cidx () + 1);
+-          mx_inline_sub (nc - ub, xcidx () + lb + 1,
+-                         tmp.cidx () + ub + 1, ubi - lbi);
++          if (lb == 0 && ub == nc)
++            {
++              // Delete all rows and columns.
++              *this = Sparse<T> (nr, 0);
++            }
++          else if (nz == 0)
++            {
++              // No elements to preserve; adjust dimensions.
++              *this = Sparse<T> (nr, nc - (ub - lb));
++            }
++          else
++            {
++              const Sparse<T> tmp = *this;
++              octave_idx_type lbi = tmp.cidx(lb), ubi = tmp.cidx(ub),
++                new_nz = nz - (ubi - lbi);
++
++              *this = Sparse<T> (nr, nc - (ub - lb), new_nz);
++              copy_or_memcpy (lbi, tmp.data (), data ());
++              copy_or_memcpy (lbi, tmp.ridx (), ridx ());
++              copy_or_memcpy (nz - ubi, tmp.data () + ubi, xdata () + lbi);
++              copy_or_memcpy (nz - ubi, tmp.ridx () + ubi, xridx () + lbi);
++              copy_or_memcpy (lb, tmp.cidx () + 1, cidx () + 1);
++              mx_inline_sub (nc - ub, xcidx () + lb + 1,
++                             tmp.cidx () + ub + 1, ubi - lbi);
++            }
+         }
+       else
+         *this = index (idx_i, idx_j.complement (nc));
+@@ -1262,24 +1277,40 @@
+         gripe_del_index_out_of_range (false, idx_i.extent (nr), nr);
+       else if (idx_i.is_cont_range (nr, lb, ub))
+         {
+-          // This is more memory-efficient than the approach below.
+-          const Sparse<T> tmpl = index (idx_vector (0, lb), idx_j);
+-          const Sparse<T> tmpu = index (idx_vector (ub, nr), idx_j);
+-          *this = Sparse<T> (nr - (ub - lb), nc, tmpl.nnz () + tmpu.nnz ());
+-          for (octave_idx_type j = 0, k = 0; j < nc; j++)
++          if (lb == 0 && ub == nr)
+             {
+-              for (octave_idx_type i = tmpl.cidx(j); i < tmpl.cidx(j+1); i++)
++              // Delete all rows and columns.
++              *this = Sparse<T> (0, nc);
++            }
++          else if (nz == 0)
++            {
++              // No elements to preserve; adjust dimensions.
++              *this = Sparse<T> (nr - (ub - lb), nc);
++            }
++          else
++            {
++              // This is more memory-efficient than the approach below.
++              const Sparse<T> tmpl = index (idx_vector (0, lb), idx_j);
++              const Sparse<T> tmpu = index (idx_vector (ub, nr), idx_j);
++              *this = Sparse<T> (nr - (ub - lb), nc,
++                                 tmpl.nnz () + tmpu.nnz ());
++              for (octave_idx_type j = 0, k = 0; j < nc; j++)
+                 {
+-                  xdata(k) = tmpl.data(i);
+-                  xridx(k++) = tmpl.ridx(i);
++                  for (octave_idx_type i = tmpl.cidx(j); i < tmpl.cidx(j+1);
++                       i++)
++                    {
++                      xdata(k) = tmpl.data(i);
++                      xridx(k++) = tmpl.ridx(i);
++                    }
++                  for (octave_idx_type i = tmpu.cidx(j); i < tmpu.cidx(j+1);
++                       i++)
++                    {
++                      xdata(k) = tmpu.data(i);
++                      xridx(k++) = tmpu.ridx(i) + lb;
++                    }
++
++                  xcidx(j+1) = k;
+                 }
+-              for (octave_idx_type i = tmpu.cidx(j); i < tmpu.cidx(j+1); i++)
+-                {
+-                  xdata(k) = tmpu.data(i);
+-                  xridx(k++) = tmpu.ridx(i) + lb;
+-                }
+-
+-              xcidx(j+1) = k;
+             }
+         }
+       else
+
diff --git a/octave.spec b/octave.spec
index 83b9c09..8b24e1d 100644
--- a/octave.spec
+++ b/octave.spec
@@ -9,7 +9,7 @@
 
 Name:           octave
 Version:        3.6.3
-Release:        1%{?dist}
+Release:        2%{?dist}
 Summary:        A high-level language for numerical computations
 Epoch:          6
 Group:          Applications/Engineering
@@ -24,6 +24,8 @@ Source1:        macros.octave
 # https://savannah.gnu.org/bugs/index.php?32839
 # Fix building packages from directories
 Patch2:         octave-3.4.0-pkgbuilddir.patch
+# Upstream patches to fix spase matrix handling
+Patch3:         octave-sparse.patch
 URL:            http://www.octave.org
 BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 
@@ -84,6 +86,7 @@ This package contains documentation for Octave.
 %prep
 %setup -q -n %{name}-%{version}%{?rctag}
 %patch2 -p1 -b .pkgbuilddir
+%patch3 -p1 -b .sparse
 
 # Check permissions
 find -name *.cc -exec chmod 644 {} \;
@@ -255,6 +258,9 @@ fi
 
 
 %changelog
+* Thu Sep 6 2012 Orion Poplawski <orion[AT]cora.nwra com> - 6:3.6.3-2
+- Add upstream patch to fix sparse matrix test crash
+
 * Wed Sep 5 2012 Orion Poplawski <orion[AT]cora.nwra com> - 6:3.6.3-1
 - Update to 3.6.3
 - Drop gets patch fixed upstream


More information about the scm-commits mailing list