On Tue, Jan 5, 2010 at 3:31 AM, Dag Sverre Seljebotn <da...@student.matnat.uio.no> wrote: > Dag Sverre Seljebotn wrote: >> I'm in the process of writing a PermutationMatrix class (applications: >> friendly interface to permuted decompositions, etc.): >> >> sage: P = permutation_matrix([0, 2, 1]); P >> [1 0 0] >> [0 0 1] >> [0 1 0] >> sage: parent(P) >> Full MatrixSpace of 3 by 3 sparse matrices over Integer Ring >> sage: P * A # calls A.matrix_from_rows([0, 2, 1]) >> ...and so on >> >> >> My goal is to allow to treat a permutation (stored efficiently) as much >> as possible like an (immutable) sparse matrix. When doing this I'm >> growing aware of some issues with matrices and mutability. >> >> 1) A matrix transpose() is currently always mutable in all >> implementations. This is a rather huge issue here. Would it be OK to >> have the transpose of an immutable matrix always be immutable, unless >> mutable=True is passed?
Yes, I think that would be fine. >> Having P.transpose() be mutable requires conversion to a less efficient >> mutable matrix loosing the permutation-ness. This has a few other >> applications as well (caching transposes, automatically making use of >> matrix decompositions already computed for the transpose). >> >> 2) In the same spirit, change_ring sometimes returns an immutable matrix >> (if no change was needed and self is returned), and sometimes not: >> >> Always returns a copy (unless self is immutable, in which case >> returns self). >> >> This is hardly a useful IMO -- would it be OK to change it so that one >> had to pass mutable=True to get a mutable matrix, and otherwise it was >> always immutable? This would allow PermutationMatrix to change rings to >> another permutation matrix. > > Essential correction: A.change_ring(..) would always return a matrix > with the same mutability status as A, unless the mutable flag is set. > > This makes it consistent with my proposal for transpose. That also sounds good to me. -- william > > Dag Sverre > >> >> 3) Perhaps more controversial: Allow immutability to propagate. >> Currently, "2*P*A" can be much slower than "2*(P*A)" because "2*P" must >> be a mutable matrix. If the product of two immutable matrices, or an >> immutable matrix with a scalar, was itself immutable, this would be >> trivial to speed up (2*P would be a new "permutation matrix" simply >> returning 2 instead of 1). >> >> Again, this might have applications to cached matrix decompositions >> (transform existing decompositions rather than recompute), though I'm >> not sure if that is useful. I'm also not opposed to this. Since there is always an easy way to get a mutable copy of a matrix from an immutable one, preferring immutability often isn't a problem. William >> > > > -- > Dag Sverre > > -- > To post to this group, send an email to sage-devel@googlegroups.com > To unsubscribe from this group, send an email to > sage-devel+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/sage-devel > URL: http://www.sagemath.org > -- William Stein Associate Professor of Mathematics University of Washington http://wstein.org -- To post to this group, send an email to sage-devel@googlegroups.com To unsubscribe from this group, send an email to sage-devel+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/sage-devel URL: http://www.sagemath.org