Ticket #10714: trac_10714-rows-sparse-matrices.patch

File trac_10714-rows-sparse-matrices.patch, 2.9 KB (added by rbeezer, 10 years ago)
  • sage/matrix/matrix1.pyx

    # HG changeset patch
    # User Rob Beezer <beezer@ups.edu>
    # Date 1296358404 28800
    # Node ID 26b3b72f4acd716605463bccf140713cb9223949
    # Parent  063ffd2a1aa7c0aaf2f7548513dc8ee546a0a108
    10714: rows of sparse matrices with no rows
    
    diff -r 063ffd2a1aa7 -r 26b3b72f4acd sage/matrix/matrix1.pyx
    a b  
    781781            return C
    782782
    783783    def sparse_rows(self, copy=True):
    784         """
    785         Return list of the sparse rows of self.
     784        r"""
     785        Return list of the rows of ``self`` as vectors (or free module elements).
    786786
    787787        INPUT:
    788788
     
    804804            sage: m[0,0] = 10
    805805            sage: m.sparse_rows()
    806806            [(10, 1, 2), (3, 4, 5), (6, 7, 8)]
     807           
     808        TESTS:   
     809           
     810        Rows of sparse matrices having no rows were fixed on Trac #10714.  ::
     811           
     812            sage: m = matrix(0, 10, sparse=True)
     813            sage: m.nrows()
     814            0
     815            sage: m.rows()
     816            []
    807817        """
    808818        x = self.fetch('sparse_rows')
    809819        if not x is None:
    810820            if copy: return list(x)
    811821            return x
     822       
     823        cdef Py_ssize_t i, j
     824        R = []
     825        if self._nrows > 0:
     826            F = sage.modules.free_module.FreeModule(self._base_ring, self._ncols, sparse=True)
    812827
    813         F = sage.modules.free_module.FreeModule(self._base_ring, self._ncols, sparse=True)
     828            k = 0
     829            entries = {}
     830            for i, j in self.nonzero_positions(copy=False):
     831                if i > k:
     832                    # new row -- emit vector
     833                    while len(R) < k:
     834                        R.append(F(0))
     835                    R.append(F(entries, coerce=False, copy=False, check=False))
     836                    entries = {}
     837                    k = i
     838                entries[j] = self.get_unsafe(i, j)
    814839
    815         R = []
    816         k = 0
    817         entries = {}
    818         cdef Py_ssize_t i, j
     840            # finish up
     841            while len(R) < k:
     842                R.append(F(0))
     843            R.append(F(entries, coerce=False, copy=False, check=False))
     844            while len(R) < self._nrows:
     845                R.append(F(0))
    819846
    820         for i, j in self.nonzero_positions(copy=False):
    821             if i > k:
    822                 # new row -- emit vector
    823                 while len(R) < k:
    824                     R.append(F(0))
    825                 R.append(F(entries, coerce=False, copy=False, check=False))
    826                 entries = {}
    827                 k = i
    828             entries[j] = self.get_unsafe(i, j)
    829 
    830         # finish up
    831         while len(R) < k:
    832             R.append(F(0))
    833         R.append(F(entries, coerce=False, copy=False, check=False))
    834         while len(R) < self._nrows:
    835             R.append(F(0))
    836 
    837         # cache result
     847        # cache and return result
    838848        self.cache('sparse_rows', R)
    839849        if copy:
    840850            return list(R)