[sage-support] Re: fast slicing of matrix
Success! sage: G = graphs.GridGraph([100,100]) sage: L = G.laplacian_matrix() sage: L 1 x 1 sparse matrix over Integer Ring sage: sage: time M = L[1:] CPU times: user 21.98 s, sys: 0.01 s, total: 21.99 s Wall time: 22.93 s sage: sage: time N = L._delete_row_(0) CPU times: user 0.01 s, sys: 0.00 s, total: 0.01 s Wall time: 0.01 s sage: sage: timeit('N = L._delete_row_(0)') 25 loops, best of 3: 10.9 ms per loop I am travelling for the next several days but will follow up on this soon. Thanks a lot! On Jun 2, 10:12 pm, William Stein wrote: > On Tue, Jun 2, 2009 at 10:10 PM, davidp wrote: > > > I might be going down the wrong path, but is seems like I would want > > to add a > > > copy_mpz_vector_init > > > function to vector_integer_sparse_c.pxi that would make a copy of an > > mpz_vector. Is that overkill? > > That sounds like a good idea to me. > > William > > > > > > > My first idea was to use add_mpz_vector_init(sum, v, w, mul), which > > sets sum equal to v + mul*w, but let mul = 0. However > > add_mpz_vector_init returns the zero vector when mul = 0 ! > > > Dave > > > On Jun 2, 9:06 pm, William Stein wrote: > >> On Tue, Jun 2, 2009 at 8:45 PM, davidp wrote: > > >> > I can't figure out how to create a new sparse matrix (see below). > > >> > Sorry, > >> > Dave > > >> You can make a new matrix with the analogous parent but a different > >> shape using the new_matrix method. > > >> sage: a = random_matrix(ZZ,3,4,sparse=True) > >> sage: a.new_matrix(2,4) > >> [0 0 0 0] > >> [0 0 0 0] > > >> In your cython code you would write something like > > >> cdef Matrix_integer_sparse M = a.new_matrix(2,4) > > >> William > > >> > M = Matrix_integer_sparse.__new__(Matrix_integer_sparse, > >> > sage.matrix.matrix_space.MatrixSpace(ZZ, self._nrows-1, self._ncols, > >> > sparse=True), None, None, None) > > >> > --- > >> > ... > >> > def _delete_row_(self, Py_ssize_t row_number): > >> > cdef Py_ssize_t i > >> > cdef mpz_vector* self_row, *M_row > >> > cdef Matrix_integer_sparse M > > >> > M = Matrix_integer_sparse.__new__(Matrix_integer_sparse, > >> > sage.matrix.matrix_space.MatrixSpace(ZZ, self._nrows-1, self._ncols, > >> > sparse=True), None, None, None) > > >> > ^ > >> > > > >> > /usr/local/sage-devel/devel/sage-devel/sage/matrix/ > >> > matrix_integer_sparse.pyx:221:101: Compiler crash in > >> > AnalyseExpressionsTransform > > >> > ModuleNode.body = StatListNode(matrix_integer_sparse.pyx:23:0) > >> > StatListNode.stats[13] = StatListNode(matrix_integer_sparse.pyx:43:5) > >> > StatListNode.stats[0] = CClassDefNode(matrix_integer_sparse.pyx:43:5, > >> > as_name = u'Matrix_integer_sparse', > >> > base_class_module = u'matrix_sparse', > >> > base_class_name = u'Matrix_sparse', > >> > class_name = u'Matrix_integer_sparse', > >> > module_name = '', > >> > visibility = 'private') > >> > CClassDefNode.body = StatListNode(matrix_integer_sparse.pyx:55:4) > >> > StatListNode.stats[9] = DefNode(matrix_integer_sparse.pyx:216:4, > >> > name = u'_delete_row_', > >> > num_required_args = 2, > >> > reqd_kw_flags_cname = '0') > >> > File 'Nodes.py', line 360, in analyse_expressions: StatListNode > >> > (matrix_integer_sparse.pyx:217:8) > >> > File 'Nodes.py', line 2835, in analyse_expressions: > >> > SingleAssignmentNode(matrix_integer_sparse.pyx:221:41) > >> > File 'Nodes.py', line 2928, in analyse_types: SingleAssignmentNode > >> > (matrix_integer_sparse.pyx:221:41) > >> > File 'ExprNodes.py', line 2281, in analyse_types: SimpleCallNode > >> > (matrix_integer_sparse.pyx:221:41) > >> > File 'ExprNodes.py', line 3105, in analyse_types: TupleNode > >> > (matrix_integer_sparse.pyx:221:41, > >> > is_sequence_constructor = 1) > >> > File 'ExprNodes.py', line 2972, in analyse_types: TupleNode > >> > (matrix_integer_sparse.pyx:221:41, > >> > is_sequence_constructor = 1) > >> > File 'ExprNodes.py', line 2522, in analyse_types: GeneralCallNode > >> > (matrix_integer_sparse.pyx:221:101) > > >> > Compiler crash traceback from this point on: > >> > File "/usr/local/sage-devel/local/lib/python2.5/site-packages/Cython/ > >> > Compiler/ExprNodes.py", line 2532, in analyse_types > >> > if hasattr(self.function, 'entry') and not > >> > self.function.entry.as_variable: > >> > AttributeError: 'NoneType' object has no attribute 'as_variable' > >> > Error running command, failed with status 256. > >> > sage: There was an error installing modified sage library code. > > >> > On Jun 2, 7:28 pm, William Stein wrote: > >> >> On Tue, Jun 2, 2009 at 7:22 PM, davidp wrote: > > >> >> > I tried adding a delete_row method to matrix_integer_sparse.pyx but > >> >> > stopped after getting the error message: > > >> >> Just def your method -- do not cpdef it. You can still use Cython > >> >> code in a cpdef's method and it will be just as fast. > > >> >> Make sure that your "delete row" method
[sage-support] Re: fast slicing of matrix
On Tue, Jun 2, 2009 at 10:10 PM, davidp wrote: > > I might be going down the wrong path, but is seems like I would want > to add a > > copy_mpz_vector_init > > function to vector_integer_sparse_c.pxi that would make a copy of an > mpz_vector. Is that overkill? That sounds like a good idea to me. William > > My first idea was to use add_mpz_vector_init(sum, v, w, mul), which > sets sum equal to v + mul*w, but let mul = 0. However > add_mpz_vector_init returns the zero vector when mul = 0 ! > > Dave > > On Jun 2, 9:06 pm, William Stein wrote: >> On Tue, Jun 2, 2009 at 8:45 PM, davidp wrote: >> >> > I can't figure out how to create a new sparse matrix (see below). >> >> > Sorry, >> > Dave >> >> You can make a new matrix with the analogous parent but a different >> shape using the new_matrix method. >> >> sage: a = random_matrix(ZZ,3,4,sparse=True) >> sage: a.new_matrix(2,4) >> [0 0 0 0] >> [0 0 0 0] >> >> In your cython code you would write something like >> >> cdef Matrix_integer_sparse M = a.new_matrix(2,4) >> >> William >> >> >> >> >> >> > M = Matrix_integer_sparse.__new__(Matrix_integer_sparse, >> > sage.matrix.matrix_space.MatrixSpace(ZZ, self._nrows-1, self._ncols, >> > sparse=True), None, None, None) >> >> > --- >> > ... >> > def _delete_row_(self, Py_ssize_t row_number): >> > cdef Py_ssize_t i >> > cdef mpz_vector* self_row, *M_row >> > cdef Matrix_integer_sparse M >> >> > M = Matrix_integer_sparse.__new__(Matrix_integer_sparse, >> > sage.matrix.matrix_space.MatrixSpace(ZZ, self._nrows-1, self._ncols, >> > sparse=True), None, None, None) >> >> > ^ >> > >> >> > /usr/local/sage-devel/devel/sage-devel/sage/matrix/ >> > matrix_integer_sparse.pyx:221:101: Compiler crash in >> > AnalyseExpressionsTransform >> >> > ModuleNode.body = StatListNode(matrix_integer_sparse.pyx:23:0) >> > StatListNode.stats[13] = StatListNode(matrix_integer_sparse.pyx:43:5) >> > StatListNode.stats[0] = CClassDefNode(matrix_integer_sparse.pyx:43:5, >> > as_name = u'Matrix_integer_sparse', >> > base_class_module = u'matrix_sparse', >> > base_class_name = u'Matrix_sparse', >> > class_name = u'Matrix_integer_sparse', >> > module_name = '', >> > visibility = 'private') >> > CClassDefNode.body = StatListNode(matrix_integer_sparse.pyx:55:4) >> > StatListNode.stats[9] = DefNode(matrix_integer_sparse.pyx:216:4, >> > name = u'_delete_row_', >> > num_required_args = 2, >> > reqd_kw_flags_cname = '0') >> > File 'Nodes.py', line 360, in analyse_expressions: StatListNode >> > (matrix_integer_sparse.pyx:217:8) >> > File 'Nodes.py', line 2835, in analyse_expressions: >> > SingleAssignmentNode(matrix_integer_sparse.pyx:221:41) >> > File 'Nodes.py', line 2928, in analyse_types: SingleAssignmentNode >> > (matrix_integer_sparse.pyx:221:41) >> > File 'ExprNodes.py', line 2281, in analyse_types: SimpleCallNode >> > (matrix_integer_sparse.pyx:221:41) >> > File 'ExprNodes.py', line 3105, in analyse_types: TupleNode >> > (matrix_integer_sparse.pyx:221:41, >> > is_sequence_constructor = 1) >> > File 'ExprNodes.py', line 2972, in analyse_types: TupleNode >> > (matrix_integer_sparse.pyx:221:41, >> > is_sequence_constructor = 1) >> > File 'ExprNodes.py', line 2522, in analyse_types: GeneralCallNode >> > (matrix_integer_sparse.pyx:221:101) >> >> > Compiler crash traceback from this point on: >> > File "/usr/local/sage-devel/local/lib/python2.5/site-packages/Cython/ >> > Compiler/ExprNodes.py", line 2532, in analyse_types >> > if hasattr(self.function, 'entry') and not >> > self.function.entry.as_variable: >> > AttributeError: 'NoneType' object has no attribute 'as_variable' >> > Error running command, failed with status 256. >> > sage: There was an error installing modified sage library code. >> >> > On Jun 2, 7:28 pm, William Stein wrote: >> >> On Tue, Jun 2, 2009 at 7:22 PM, davidp wrote: >> >> >> > I tried adding a delete_row method to matrix_integer_sparse.pyx but >> >> > stopped after getting the error message: >> >> >> Just def your method -- do not cpdef it. You can still use Cython >> >> code in a cpdef's method and it will be just as fast. >> >> >> Make sure that your "delete row" method returns a *new* matrix by the >> >> way... >> >> >> William >> >> >> > + >> >> > Error converting Pyrex file to C: >> >> > >> >> > ... >> >> > add_mpz_vector_init(&M._matrix[i], &self._matrix[i], & >> >> > (right)._matrix[i], mul) >> >> > mpz_clear(mul) >> >> > return M >> >> >> > # added by David Perkinson >> >> > cpdef ModuleElement _delete_row_(self, Py_ssize_t row_number): >> >> > ^ >> >> > >> >> >> > /usr/local/sage-devel/devel/sage-devel/sage/matrix/ >> >> > matrix_integer_sparse.p
[sage-support] Re: fast slicing of matrix
I might be going down the wrong path, but is seems like I would want to add a copy_mpz_vector_init function to vector_integer_sparse_c.pxi that would make a copy of an mpz_vector. Is that overkill? My first idea was to use add_mpz_vector_init(sum, v, w, mul), which sets sum equal to v + mul*w, but let mul = 0. However add_mpz_vector_init returns the zero vector when mul = 0 ! Dave On Jun 2, 9:06 pm, William Stein wrote: > On Tue, Jun 2, 2009 at 8:45 PM, davidp wrote: > > > I can't figure out how to create a new sparse matrix (see below). > > > Sorry, > > Dave > > You can make a new matrix with the analogous parent but a different > shape using the new_matrix method. > > sage: a = random_matrix(ZZ,3,4,sparse=True) > sage: a.new_matrix(2,4) > [0 0 0 0] > [0 0 0 0] > > In your cython code you would write something like > > cdef Matrix_integer_sparse M = a.new_matrix(2,4) > > William > > > > > > > M = Matrix_integer_sparse.__new__(Matrix_integer_sparse, > > sage.matrix.matrix_space.MatrixSpace(ZZ, self._nrows-1, self._ncols, > > sparse=True), None, None, None) > > > --- > > ... > > def _delete_row_(self, Py_ssize_t row_number): > > cdef Py_ssize_t i > > cdef mpz_vector* self_row, *M_row > > cdef Matrix_integer_sparse M > > > M = Matrix_integer_sparse.__new__(Matrix_integer_sparse, > > sage.matrix.matrix_space.MatrixSpace(ZZ, self._nrows-1, self._ncols, > > sparse=True), None, None, None) > > > ^ > > > > > /usr/local/sage-devel/devel/sage-devel/sage/matrix/ > > matrix_integer_sparse.pyx:221:101: Compiler crash in > > AnalyseExpressionsTransform > > > ModuleNode.body = StatListNode(matrix_integer_sparse.pyx:23:0) > > StatListNode.stats[13] = StatListNode(matrix_integer_sparse.pyx:43:5) > > StatListNode.stats[0] = CClassDefNode(matrix_integer_sparse.pyx:43:5, > > as_name = u'Matrix_integer_sparse', > > base_class_module = u'matrix_sparse', > > base_class_name = u'Matrix_sparse', > > class_name = u'Matrix_integer_sparse', > > module_name = '', > > visibility = 'private') > > CClassDefNode.body = StatListNode(matrix_integer_sparse.pyx:55:4) > > StatListNode.stats[9] = DefNode(matrix_integer_sparse.pyx:216:4, > > name = u'_delete_row_', > > num_required_args = 2, > > reqd_kw_flags_cname = '0') > > File 'Nodes.py', line 360, in analyse_expressions: StatListNode > > (matrix_integer_sparse.pyx:217:8) > > File 'Nodes.py', line 2835, in analyse_expressions: > > SingleAssignmentNode(matrix_integer_sparse.pyx:221:41) > > File 'Nodes.py', line 2928, in analyse_types: SingleAssignmentNode > > (matrix_integer_sparse.pyx:221:41) > > File 'ExprNodes.py', line 2281, in analyse_types: SimpleCallNode > > (matrix_integer_sparse.pyx:221:41) > > File 'ExprNodes.py', line 3105, in analyse_types: TupleNode > > (matrix_integer_sparse.pyx:221:41, > > is_sequence_constructor = 1) > > File 'ExprNodes.py', line 2972, in analyse_types: TupleNode > > (matrix_integer_sparse.pyx:221:41, > > is_sequence_constructor = 1) > > File 'ExprNodes.py', line 2522, in analyse_types: GeneralCallNode > > (matrix_integer_sparse.pyx:221:101) > > > Compiler crash traceback from this point on: > > File "/usr/local/sage-devel/local/lib/python2.5/site-packages/Cython/ > > Compiler/ExprNodes.py", line 2532, in analyse_types > > if hasattr(self.function, 'entry') and not > > self.function.entry.as_variable: > > AttributeError: 'NoneType' object has no attribute 'as_variable' > > Error running command, failed with status 256. > > sage: There was an error installing modified sage library code. > > > On Jun 2, 7:28 pm, William Stein wrote: > >> On Tue, Jun 2, 2009 at 7:22 PM, davidp wrote: > > >> > I tried adding a delete_row method to matrix_integer_sparse.pyx but > >> > stopped after getting the error message: > > >> Just def your method -- do not cpdef it. You can still use Cython > >> code in a cpdef's method and it will be just as fast. > > >> Make sure that your "delete row" method returns a *new* matrix by the > >> way... > > >> William > > >> > + > >> > Error converting Pyrex file to C: > >> > > >> > ... > >> > add_mpz_vector_init(&M._matrix[i], &self._matrix[i], & > >> > (right)._matrix[i], mul) > >> > mpz_clear(mul) > >> > return M > > >> > # added by David Perkinson > >> > cpdef ModuleElement _delete_row_(self, Py_ssize_t row_number): > >> > ^ > >> > > > >> > /usr/local/sage-devel/devel/sage-devel/sage/matrix/ > >> > matrix_integer_sparse.pyx:216:10: C method '_delete_row_' not > >> > previously declared in definition part of extension type > >> > Error running command, failed with status 256. > >> > sage: There was an error installing modified sage library code. > > >> > +
[sage-support] Re: fast slicing of matrix
On Tue, Jun 2, 2009 at 8:45 PM, davidp wrote: > > I can't figure out how to create a new sparse matrix (see below). > > Sorry, > Dave You can make a new matrix with the analogous parent but a different shape using the new_matrix method. sage: a = random_matrix(ZZ,3,4,sparse=True) sage: a.new_matrix(2,4) [0 0 0 0] [0 0 0 0] In your cython code you would write something like cdef Matrix_integer_sparse M = a.new_matrix(2,4) William > > M = Matrix_integer_sparse.__new__(Matrix_integer_sparse, > sage.matrix.matrix_space.MatrixSpace(ZZ, self._nrows-1, self._ncols, > sparse=True), None, None, None) > > > --- > ... > def _delete_row_(self, Py_ssize_t row_number): > cdef Py_ssize_t i > cdef mpz_vector* self_row, *M_row > cdef Matrix_integer_sparse M > > M = Matrix_integer_sparse.__new__(Matrix_integer_sparse, > sage.matrix.matrix_space.MatrixSpace(ZZ, self._nrows-1, self._ncols, > sparse=True), None, None, None) > > ^ > > > /usr/local/sage-devel/devel/sage-devel/sage/matrix/ > matrix_integer_sparse.pyx:221:101: Compiler crash in > AnalyseExpressionsTransform > > ModuleNode.body = StatListNode(matrix_integer_sparse.pyx:23:0) > StatListNode.stats[13] = StatListNode(matrix_integer_sparse.pyx:43:5) > StatListNode.stats[0] = CClassDefNode(matrix_integer_sparse.pyx:43:5, > as_name = u'Matrix_integer_sparse', > base_class_module = u'matrix_sparse', > base_class_name = u'Matrix_sparse', > class_name = u'Matrix_integer_sparse', > module_name = '', > visibility = 'private') > CClassDefNode.body = StatListNode(matrix_integer_sparse.pyx:55:4) > StatListNode.stats[9] = DefNode(matrix_integer_sparse.pyx:216:4, > name = u'_delete_row_', > num_required_args = 2, > reqd_kw_flags_cname = '0') > File 'Nodes.py', line 360, in analyse_expressions: StatListNode > (matrix_integer_sparse.pyx:217:8) > File 'Nodes.py', line 2835, in analyse_expressions: > SingleAssignmentNode(matrix_integer_sparse.pyx:221:41) > File 'Nodes.py', line 2928, in analyse_types: SingleAssignmentNode > (matrix_integer_sparse.pyx:221:41) > File 'ExprNodes.py', line 2281, in analyse_types: SimpleCallNode > (matrix_integer_sparse.pyx:221:41) > File 'ExprNodes.py', line 3105, in analyse_types: TupleNode > (matrix_integer_sparse.pyx:221:41, > is_sequence_constructor = 1) > File 'ExprNodes.py', line 2972, in analyse_types: TupleNode > (matrix_integer_sparse.pyx:221:41, > is_sequence_constructor = 1) > File 'ExprNodes.py', line 2522, in analyse_types: GeneralCallNode > (matrix_integer_sparse.pyx:221:101) > > Compiler crash traceback from this point on: > File "/usr/local/sage-devel/local/lib/python2.5/site-packages/Cython/ > Compiler/ExprNodes.py", line 2532, in analyse_types > if hasattr(self.function, 'entry') and not > self.function.entry.as_variable: > AttributeError: 'NoneType' object has no attribute 'as_variable' > Error running command, failed with status 256. > sage: There was an error installing modified sage library code. > > > On Jun 2, 7:28 pm, William Stein wrote: >> On Tue, Jun 2, 2009 at 7:22 PM, davidp wrote: >> >> > I tried adding a delete_row method to matrix_integer_sparse.pyx but >> > stopped after getting the error message: >> >> Just def your method -- do not cpdef it. You can still use Cython >> code in a cpdef's method and it will be just as fast. >> >> Make sure that your "delete row" method returns a *new* matrix by the way... >> >> William >> >> >> >> >> >> > + >> > Error converting Pyrex file to C: >> > >> > ... >> > add_mpz_vector_init(&M._matrix[i], &self._matrix[i], & >> > (right)._matrix[i], mul) >> > mpz_clear(mul) >> > return M >> >> > # added by David Perkinson >> > cpdef ModuleElement _delete_row_(self, Py_ssize_t row_number): >> > ^ >> > >> >> > /usr/local/sage-devel/devel/sage-devel/sage/matrix/ >> > matrix_integer_sparse.pyx:216:10: C method '_delete_row_' not >> > previously declared in definition part of extension type >> > Error running command, failed with status 256. >> > sage: There was an error installing modified sage library code. >> >> > ++ >> >> > I might have to actually read the Cython documentation! >> >> > Dave >> >> > On Jun 2, 5:43 pm, Jason Grout wrote: >> >> William Stein wrote: >> >> > On Mon, Jun 1, 2009 at 5:16 PM, davidp wrote: >> >> >> Is there a fast way to create a submatrix? >> >> >> >> - >> >> >> >> sage: version() >> >> >> 'Sage Version 4.0.alpha0, Release Date: 2009-05-15' >> >> >> sage: G = graphs.GridGraph([100,100]) >> >> >> sage: L = G.laplacian_matrix() >> >> >> sage: L >> >> >> 1 x 1 sparse matrix over Integer
[sage-support] Re: fast slicing of matrix
I can't figure out how to create a new sparse matrix (see below). Sorry, Dave M = Matrix_integer_sparse.__new__(Matrix_integer_sparse, sage.matrix.matrix_space.MatrixSpace(ZZ, self._nrows-1, self._ncols, sparse=True), None, None, None) --- ... def _delete_row_(self, Py_ssize_t row_number): cdef Py_ssize_t i cdef mpz_vector* self_row, *M_row cdef Matrix_integer_sparse M M = Matrix_integer_sparse.__new__(Matrix_integer_sparse, sage.matrix.matrix_space.MatrixSpace(ZZ, self._nrows-1, self._ncols, sparse=True), None, None, None) ^ /usr/local/sage-devel/devel/sage-devel/sage/matrix/ matrix_integer_sparse.pyx:221:101: Compiler crash in AnalyseExpressionsTransform ModuleNode.body = StatListNode(matrix_integer_sparse.pyx:23:0) StatListNode.stats[13] = StatListNode(matrix_integer_sparse.pyx:43:5) StatListNode.stats[0] = CClassDefNode(matrix_integer_sparse.pyx:43:5, as_name = u'Matrix_integer_sparse', base_class_module = u'matrix_sparse', base_class_name = u'Matrix_sparse', class_name = u'Matrix_integer_sparse', module_name = '', visibility = 'private') CClassDefNode.body = StatListNode(matrix_integer_sparse.pyx:55:4) StatListNode.stats[9] = DefNode(matrix_integer_sparse.pyx:216:4, name = u'_delete_row_', num_required_args = 2, reqd_kw_flags_cname = '0') File 'Nodes.py', line 360, in analyse_expressions: StatListNode (matrix_integer_sparse.pyx:217:8) File 'Nodes.py', line 2835, in analyse_expressions: SingleAssignmentNode(matrix_integer_sparse.pyx:221:41) File 'Nodes.py', line 2928, in analyse_types: SingleAssignmentNode (matrix_integer_sparse.pyx:221:41) File 'ExprNodes.py', line 2281, in analyse_types: SimpleCallNode (matrix_integer_sparse.pyx:221:41) File 'ExprNodes.py', line 3105, in analyse_types: TupleNode (matrix_integer_sparse.pyx:221:41, is_sequence_constructor = 1) File 'ExprNodes.py', line 2972, in analyse_types: TupleNode (matrix_integer_sparse.pyx:221:41, is_sequence_constructor = 1) File 'ExprNodes.py', line 2522, in analyse_types: GeneralCallNode (matrix_integer_sparse.pyx:221:101) Compiler crash traceback from this point on: File "/usr/local/sage-devel/local/lib/python2.5/site-packages/Cython/ Compiler/ExprNodes.py", line 2532, in analyse_types if hasattr(self.function, 'entry') and not self.function.entry.as_variable: AttributeError: 'NoneType' object has no attribute 'as_variable' Error running command, failed with status 256. sage: There was an error installing modified sage library code. On Jun 2, 7:28 pm, William Stein wrote: > On Tue, Jun 2, 2009 at 7:22 PM, davidp wrote: > > > I tried adding a delete_row method to matrix_integer_sparse.pyx but > > stopped after getting the error message: > > Just def your method -- do not cpdef it. You can still use Cython > code in a cpdef's method and it will be just as fast. > > Make sure that your "delete row" method returns a *new* matrix by the way... > > William > > > > > > > + > > Error converting Pyrex file to C: > > > > ... > > add_mpz_vector_init(&M._matrix[i], &self._matrix[i], & > > (right)._matrix[i], mul) > > mpz_clear(mul) > > return M > > > # added by David Perkinson > > cpdef ModuleElement _delete_row_(self, Py_ssize_t row_number): > > ^ > > > > > /usr/local/sage-devel/devel/sage-devel/sage/matrix/ > > matrix_integer_sparse.pyx:216:10: C method '_delete_row_' not > > previously declared in definition part of extension type > > Error running command, failed with status 256. > > sage: There was an error installing modified sage library code. > > > ++ > > > I might have to actually read the Cython documentation! > > > Dave > > > On Jun 2, 5:43 pm, Jason Grout wrote: > >> William Stein wrote: > >> > On Mon, Jun 1, 2009 at 5:16 PM, davidp wrote: > >> >> Is there a fast way to create a submatrix? > > >> >> - > > >> >> sage: version() > >> >> 'Sage Version 4.0.alpha0, Release Date: 2009-05-15' > >> >> sage: G = graphs.GridGraph([100,100]) > >> >> sage: L = G.laplacian_matrix() > >> >> sage: L > >> >> 1 x 1 sparse matrix over Integer Ring > >> >> sage: time M = L[1:,1:] > >> >> CPU times: user 24.93 s, sys: 0.04 s, total: 24.97 s > >> >> Wall time: 25.27 s > > >> >> > > >> >> I am just interested in deleting a single row and column of the matrix > >> >> (not necessarily the first). > > >> >> Thanks, > > >> > There is no fast way to do that right now. One could easily add code > >> > to SAGE_ROOT/devel/sage/sage/matrix/matrix_integer_sparse.pyx that > >> > would provide blazingly fa
[sage-support] Re: fast slicing of matrix
William Stein wrote: > On Tue, Jun 2, 2009 at 7:22 PM, davidp wrote: >> I tried adding a delete_row method to matrix_integer_sparse.pyx but >> stopped after getting the error message: > > Just def your method -- do not cpdef it. You can still use Cython > code in a cpdef's method and it will be just as fast. > > Make sure that your "delete row" method returns a *new* matrix by the way... You might fold your functionality into matrix_from_rows_and_columns. That way slicing will automatically use it. Maybe you could intelligently guess from the rows and columns requested whether it is faster to just copy the matrix, then delete some rows/columns, or to build the new matrix up. For example, if I'm asking for every row and column in the matrix except one, almost surely it is faster to copy the dictionary and delete the appropriate row/column keys. Then again, I can see the advantage of just having a delete_rows or delete_columns method; it's definitely clear what you are doing. Jason --~--~-~--~~~---~--~~ To post to this group, send email to sage-support@googlegroups.com To unsubscribe from this group, send email to sage-support-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/sage-support URLs: http://www.sagemath.org -~--~~~~--~~--~--~---
[sage-support] Re: fast slicing of matrix
On Tue, Jun 2, 2009 at 7:22 PM, davidp wrote: > > I tried adding a delete_row method to matrix_integer_sparse.pyx but > stopped after getting the error message: Just def your method -- do not cpdef it. You can still use Cython code in a cpdef's method and it will be just as fast. Make sure that your "delete row" method returns a *new* matrix by the way... William > > + > Error converting Pyrex file to C: > > ... > add_mpz_vector_init(&M._matrix[i], &self._matrix[i], & > (right)._matrix[i], mul) > mpz_clear(mul) > return M > > # added by David Perkinson > cpdef ModuleElement _delete_row_(self, Py_ssize_t row_number): > ^ > > > /usr/local/sage-devel/devel/sage-devel/sage/matrix/ > matrix_integer_sparse.pyx:216:10: C method '_delete_row_' not > previously declared in definition part of extension type > Error running command, failed with status 256. > sage: There was an error installing modified sage library code. > > ++ > > I might have to actually read the Cython documentation! > > Dave > > > > On Jun 2, 5:43 pm, Jason Grout wrote: >> William Stein wrote: >> > On Mon, Jun 1, 2009 at 5:16 PM, davidp wrote: >> >> Is there a fast way to create a submatrix? >> >> >> - >> >> >> sage: version() >> >> 'Sage Version 4.0.alpha0, Release Date: 2009-05-15' >> >> sage: G = graphs.GridGraph([100,100]) >> >> sage: L = G.laplacian_matrix() >> >> sage: L >> >> 1 x 1 sparse matrix over Integer Ring >> >> sage: time M = L[1:,1:] >> >> CPU times: user 24.93 s, sys: 0.04 s, total: 24.97 s >> >> Wall time: 25.27 s >> >> >> >> >> >> I am just interested in deleting a single row and column of the matrix >> >> (not necessarily the first). >> >> >> Thanks, >> >> > There is no fast way to do that right now. One could easily add code >> > to SAGE_ROOT/devel/sage/sage/matrix/matrix_integer_sparse.pyx that >> > would provide blazingly fast deletion of a row, and reasonably fast >> > deletion of a column. Of course it would be better to implement >> > arbitrary slicing in some optimized way in matrix_integer_sparse.pyx. >> > I hope somebody does so. >> >> Just looking at the generic code, it seems that it goes through each and >> every index position in the slice, setting the new matrix entry to the >> old one. This is obviously the wrong thing to do for sparse matrices, >> and can likely trivially be made faster. I think all you may have to do >> is override the matrix_from_rows_and_columns for sparse matrices. >> >> Jason > > > -- William Stein Associate Professor of Mathematics University of Washington http://wstein.org --~--~-~--~~~---~--~~ To post to this group, send email to sage-support@googlegroups.com To unsubscribe from this group, send email to sage-support-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/sage-support URLs: http://www.sagemath.org -~--~~~~--~~--~--~---
[sage-support] Re: fast slicing of matrix
I tried adding a delete_row method to matrix_integer_sparse.pyx but stopped after getting the error message: + Error converting Pyrex file to C: ... add_mpz_vector_init(&M._matrix[i], &self._matrix[i], & (right)._matrix[i], mul) mpz_clear(mul) return M # added by David Perkinson cpdef ModuleElement _delete_row_(self, Py_ssize_t row_number): ^ /usr/local/sage-devel/devel/sage-devel/sage/matrix/ matrix_integer_sparse.pyx:216:10: C method '_delete_row_' not previously declared in definition part of extension type Error running command, failed with status 256. sage: There was an error installing modified sage library code. ++ I might have to actually read the Cython documentation! Dave On Jun 2, 5:43 pm, Jason Grout wrote: > William Stein wrote: > > On Mon, Jun 1, 2009 at 5:16 PM, davidp wrote: > >> Is there a fast way to create a submatrix? > > >> - > > >> sage: version() > >> 'Sage Version 4.0.alpha0, Release Date: 2009-05-15' > >> sage: G = graphs.GridGraph([100,100]) > >> sage: L = G.laplacian_matrix() > >> sage: L > >> 1 x 1 sparse matrix over Integer Ring > >> sage: time M = L[1:,1:] > >> CPU times: user 24.93 s, sys: 0.04 s, total: 24.97 s > >> Wall time: 25.27 s > > >> > > >> I am just interested in deleting a single row and column of the matrix > >> (not necessarily the first). > > >> Thanks, > > > There is no fast way to do that right now. One could easily add code > > to SAGE_ROOT/devel/sage/sage/matrix/matrix_integer_sparse.pyx that > > would provide blazingly fast deletion of a row, and reasonably fast > > deletion of a column. Of course it would be better to implement > > arbitrary slicing in some optimized way in matrix_integer_sparse.pyx. > > I hope somebody does so. > > Just looking at the generic code, it seems that it goes through each and > every index position in the slice, setting the new matrix entry to the > old one. This is obviously the wrong thing to do for sparse matrices, > and can likely trivially be made faster. I think all you may have to do > is override the matrix_from_rows_and_columns for sparse matrices. > > Jason --~--~-~--~~~---~--~~ To post to this group, send email to sage-support@googlegroups.com To unsubscribe from this group, send email to sage-support-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/sage-support URLs: http://www.sagemath.org -~--~~~~--~~--~--~---
[sage-support] Re: fast slicing of matrix
William Stein wrote: > On Mon, Jun 1, 2009 at 5:16 PM, davidp wrote: >> Is there a fast way to create a submatrix? >> >> - >> >> >> sage: version() >> 'Sage Version 4.0.alpha0, Release Date: 2009-05-15' >> sage: G = graphs.GridGraph([100,100]) >> sage: L = G.laplacian_matrix() >> sage: L >> 1 x 1 sparse matrix over Integer Ring >> sage: time M = L[1:,1:] >> CPU times: user 24.93 s, sys: 0.04 s, total: 24.97 s >> Wall time: 25.27 s >> >> >> >> >> I am just interested in deleting a single row and column of the matrix >> (not necessarily the first). >> >> Thanks, > > There is no fast way to do that right now. One could easily add code > to SAGE_ROOT/devel/sage/sage/matrix/matrix_integer_sparse.pyx that > would provide blazingly fast deletion of a row, and reasonably fast > deletion of a column. Of course it would be better to implement > arbitrary slicing in some optimized way in matrix_integer_sparse.pyx. > I hope somebody does so. Just looking at the generic code, it seems that it goes through each and every index position in the slice, setting the new matrix entry to the old one. This is obviously the wrong thing to do for sparse matrices, and can likely trivially be made faster. I think all you may have to do is override the matrix_from_rows_and_columns for sparse matrices. Jason --~--~-~--~~~---~--~~ To post to this group, send email to sage-support@googlegroups.com To unsubscribe from this group, send email to sage-support-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/sage-support URLs: http://www.sagemath.org -~--~~~~--~~--~--~---
[sage-support] Re: fast slicing of matrix
On Mon, Jun 1, 2009 at 5:16 PM, davidp wrote: > > Is there a fast way to create a submatrix? > > - > > > sage: version() > 'Sage Version 4.0.alpha0, Release Date: 2009-05-15' > sage: G = graphs.GridGraph([100,100]) > sage: L = G.laplacian_matrix() > sage: L > 1 x 1 sparse matrix over Integer Ring > sage: time M = L[1:,1:] > CPU times: user 24.93 s, sys: 0.04 s, total: 24.97 s > Wall time: 25.27 s > > > > > I am just interested in deleting a single row and column of the matrix > (not necessarily the first). > > Thanks, There is no fast way to do that right now. One could easily add code to SAGE_ROOT/devel/sage/sage/matrix/matrix_integer_sparse.pyx that would provide blazingly fast deletion of a row, and reasonably fast deletion of a column. Of course it would be better to implement arbitrary slicing in some optimized way in matrix_integer_sparse.pyx. I hope somebody does so. William --~--~-~--~~~---~--~~ To post to this group, send email to sage-support@googlegroups.com To unsubscribe from this group, send email to sage-support-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/sage-support URLs: http://www.sagemath.org -~--~~~~--~~--~--~---