# Redefine Method in Sage class

I am using the a class to manipulate vector fields of $\mathbb{R}^n$. I am using an other convention on the lie brackets : to compute $XY=[X,Y]$ I have to enter $XY=-X.bracket(Y)$.

I would like to redefine the method "bracket()" so that I include this minus sign in the redefinition.

Of course I can each time put a minus sign in front all my definition or call Y.bracket(X) to compute [X,Y] but I don't want to use them (the display is then not adapted ...).

Here is my code

 from sage import *
reset()

def mybracket(A,B):
return B.bracket(A)

M.<x,y> = EuclideanSpace()
X = M.vector_field(0,1-y*x^2, name='X')
Y = M.vector_field(-(y-1),x, name='Y')

YX = Y.mybracket(X)


AttributeError: 'VectorFieldFreeModule_with_category.element_class' object has no attribute 'mybracket'

Thanks

edit retag close merge delete

Sort by » oldest newest most voted

It suffices to attach the function mybracket that you have defined to the vector field class, which is VectorField. You have to import the latter first:

from sage.manifolds.differentiable.vectorfield import VectorField
VectorField.mybracket = mybracket


So the whole code becomes:

from sage.manifolds.differentiable.vectorfield import VectorField
def mybracket(A, B):
return B.bracket(A)
VectorField.mybracket = mybracket


Then

M.<x,y> = EuclideanSpace()
X = M.vector_field(0,1-y*x^2, name='X')
Y = M.vector_field(-(y-1),x, name='Y')
X.mybracket(Y).display()


yields

[Y,X] = (-x^2*y + 1) e_x + (-x^3 + 2*x*y^2 - 2*x*y) e_y


and

X.mybracket(Y) == -X.bracket(Y)


gives

True

more

Out of curiosity, could you do something similar for cython (pyx) files (i mean without creating a new class that inherits from the previous) ?