Hi David, Thanks for pointing out the problem and at the same time providing a very elegant solution!
I've gone ahead and made this into #11549, and I've taken the liberty of cc-ing you and Robert Bradshaw on this (since he reviewed the original vector class). All the best, Joris On 26 jun, 12:15, David Roe <r...@math.harvard.edu> wrote: > The implementation in sage/modules/vector_symbolic_dense just inherits from > FreeModuleElement_generic_dense, without overriding any methods like _add_ > or _new_c. In particular, the arithmetic operations > in FreeModuleElement_generic_dense hard-code the class, so that arithmetic > always creates a new FreeModuleElement_generic_dense (as you're seeing). > > The simplest solution may be to change > > cdef _new_c(self, object v): > # Create a new dense free module element with minimal overhead and > # no type checking. > cdef FreeModuleElement_generic_dense x > x = PY_NEW(FreeModuleElement_generic_dense) > > in FreeModuleElement_generic_dense to > > cdef _new_c(self, object v): > # Create a new dense free module element with minimal overhead and > # no type checking. > cdef FreeModuleElement_generic_dense x > x = <FreeModuleElement_generic_dense>PY_NEW(<object>PY_TYPE(self)) > > David > > On Sat, Jun 25, 2011 at 13:56, Joris Vankerschaver < > > > > > > > > joris.vankerscha...@gmail.com> wrote: > > Dear all, > > > I'm playing around with #11335 which was included in Sage > > 4.7.1.alpha3. In this patch, I added a symbolic vector class, with > > the aim of providing simplification methods that act elementwise on > > symbolic vectors. The symbolic vector class derives from > > sage.modules.free_module_element.FreeModuleElement_generic_dense and > > so far only provides methods for simplification, so it's pretty > > simple. > > > However, it looks like this simple design is not sufficient to ensure > > that the result of simple arithmetic operators stays in the same > > vector space: > > > sage: v = vector(SR, [1]) > > sage: w = vector(SR, [x]) > > sage: type(v) > > <class 'sage.modules.vector_symbolic_dense.Vector_symbolic_dense'> > > sage: type(w) > > <class 'sage.modules.vector_symbolic_dense.Vector_symbolic_dense'> > > sage: type(v + w) > > <type > > 'sage.modules.free_module_element.FreeModuleElement_generic_dense'> > > > I have no idea what the matter is, though. The coercion model reports > > that arithmetic should be performed directly: > > > sage: cm = sage.structure.element.get_coercion_model() > > sage: cm.explain(v, w, operator.add) > > Identical parents, arithmetic performed immediately. > > Result lives in Vector space of dimension 1 over Symbolic Ring > > Vector space of dimension 1 over Symbolic Ring > > > Any idea where things went wrong? > > > Thanks! > > Joris > > > -- > > 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 -- 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