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