galgebra icon indicating copy to clipboard operation
galgebra copied to clipboard

diff and pdiff method of class Mv throws exception when differentiate by a coordinate symbol

Open mammalwong opened this issue 10 months ago • 1 comments

x is a coordinate symbol (a plain sympy Symbol object) and ex is a Mv instance of a Ga basis symbol. I tried to invoke (x*ex).diff(x) and the method throws exception. From the exception stack frame below, it looks like Mv.diff passed self.obj to Ga.pDiff and pDiff try to resolve .obj again from obj.


AttributeError Traceback (most recent call last) in <cell line: 1>() ----> 1 (x*ex).diff(x)

1 frames /usr/local/lib/python3.10/dist-packages/galgebra/mv.py in diff(self, coord) 1070 obj += tmp1 * tmp2 1071 else: -> 1072 obj = self.Ga.pDiff(self.obj, coord) 1073 return Mv(obj, ga=self.Ga) 1074

/usr/local/lib/python3.10/dist-packages/galgebra/ga.py in pDiff(self, A, coord) 2050 # variable, but including case of non-constant basis vectors 2051 -> 2052 dA = self.mv(expand(diff(A.obj, coord))) 2053 2054 if self.connect_flg and self.dslot == -1 and not A.is_scalar(): # Basis blades are function of coordinates

AttributeError: 'Mul' object has no attribute 'obj'

mammalwong avatar Apr 23 '24 09:04 mammalwong

pdiff method of Mv class also throws the same exception when invoking (x*ex).pdiff(x).


AttributeError Traceback (most recent call last) in <cell line: 1>() ----> 1 (x*ex).pdiff(x)

1 frames /usr/local/lib/python3.10/dist-packages/galgebra/ga.py in pDiff(self, A, coord) 2050 # variable, but including case of non-constant basis vectors 2051 -> 2052 dA = self.mv(expand(diff(A.obj, coord))) 2053 2054 if self.connect_flg and self.dslot == -1 and not A.is_scalar(): # Basis blades are function of coordinates

AttributeError: 'Mul' object has no attribute 'obj'

mammalwong avatar Apr 24 '24 02:04 mammalwong

@mammalwong Can you also post minimal working example for this issue? Thanks!

utensil avatar May 09 '24 14:05 utensil

In version 0.5.1

x,y,z = coords = S.symbols('x y z', real=True)
ga = Ga('e', g=[1,1,1], coords=coords, wedge=False)
ex,ey,ez = ga.mv()
(x*ex).diff(x)

raise exception:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
[<ipython-input-9-4979ad157f80>](https://localhost:8080/#) in <cell line: 4>()
      2 ga = Ga('e', g=[1,1,1], coords=coords, wedge=False)
      3 ex,ey,ez = ga.mv()
----> 4 (x*ex).diff(x)

1 frames
[/usr/local/lib/python3.10/dist-packages/galgebra/mv.py](https://localhost:8080/#) in diff(self, coord)
   1070                         obj += tmp1 * tmp2
   1071         else:
-> 1072             obj = self.Ga.pDiff(self.obj, coord)
   1073         return Mv(obj, ga=self.Ga)
   1074 

[/usr/local/lib/python3.10/dist-packages/galgebra/ga.py](https://localhost:8080/#) in pDiff(self, A, coord)
   2050         # variable, but including case of non-constant basis vectors
   2051 
-> 2052         dA = self.mv(expand(diff(A.obj, coord)))
   2053 
   2054         if self.connect_flg and self.dslot == -1 and not A.is_scalar():  # Basis blades are function of coordinates

AttributeError: 'Mul' object has no attribute 'obj'

Another related issue:

x,y,z = coords = S.symbols('x y z', real=True)
ga = Ga('e', g=[1,1,1], coords=coords, wedge=False)
ex,ey,ez = ga.mv()
(x*ex).pdiff(x) # notice this is pdiff() not diff() this time

raise exception:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
[<ipython-input-10-5767979f98eb>](https://localhost:8080/#) in <cell line: 4>()
      2 ga = Ga('e', g=[1,1,1], coords=coords, wedge=False)
      3 ex,ey,ez = ga.mv()
----> 4 (x*ex).pdiff(x)

1 frames
[/usr/local/lib/python3.10/dist-packages/galgebra/mv.py](https://localhost:8080/#) in pdiff(self, var)
   1074 
   1075     def pdiff(self, var) -> 'Mv':
-> 1076         return Mv(self.Ga.pDiff(self.obj, var), ga=self.Ga)
   1077 
   1078     def Grad(self, coords, mode: str = '*', left: bool = True) -> 'Mv':

[/usr/local/lib/python3.10/dist-packages/galgebra/ga.py](https://localhost:8080/#) in pDiff(self, A, coord)
   2050         # variable, but including case of non-constant basis vectors
   2051 
-> 2052         dA = self.mv(expand(diff(A.obj, coord)))
   2053 
   2054         if self.connect_flg and self.dslot == -1 and not A.is_scalar():  # Basis blades are function of coordinates

AttributeError: 'Mul' object has no attribute 'obj'

mammalwong avatar May 09 '24 14:05 mammalwong

Thank you, @mammalwong , the fix should be in master now as #510 is now merged.

utensil avatar May 15 '24 02:05 utensil