Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Trying to assign Matrix expressions to N or Q fails #141

Open
ivanistheone opened this issue Jan 16, 2020 · 5 comments
Open

Trying to assign Matrix expressions to N or Q fails #141

ivanistheone opened this issue Jan 16, 2020 · 5 comments

Comments

@ivanistheone
Copy link
Contributor

While browsing this page in the docs, I saw that trying to assign a Matrix object to N fails.

clickable

>>> M = Matrix([0, 0, 1])  # works
>>> N = Matrix([0, 1, 1])  # fails
Exception in SymPy Live of type 
<class 'sympy.core.sympify.SympifyError'>
for reference the last 5 stack trace entries are
Traceback (most recent call last):
  File "/base/data/home/apps/s~sympy-live-hrd/20200105t193609.423659059328302322/shell.py", line 781, in post
    live.evaluate(statement, session, printer, stream)
  File "/base/data/home/apps/s~sympy-live-hrd/20200105t193609.423659059328302322/shell.py", line 453, in evaluate
    if name not in old_globals or val != old_globals[name]:
  File "/base/data/home/apps/s~sympy-live-hrd/20200105t193609.423659059328302322/sympy/sympy/matrices/matrices.py", line 2360, in __ne__
    return not self == other
  File "/base/data/home/apps/s~sympy-live-hrd/20200105t193609.423659059328302322/sympy/sympy/matrices/dense.py", line 47, in __eq__
    other = sympify(other)
  File "/base/data/home/apps/s~sympy-live-hrd/20200105t193609.423659059328302322/sympy/sympy/core/sympify.py", line 387, in sympify
    raise SympifyError('could not parse %r' % a, exc)
SympifyError: Sympify of expression 'could not parse u'<function N at 0x3e1746e06668>'' failed, because of exception being raised:
SyntaxError: invalid syntax (<string>, line 1)

Interestingly if you try to assign something simpler like 2 or 2*x it works:

>>> N = 2
>>> N
2

and also after the initial assignment, you can assign the Matrix expression to N w/o a problem:

>>> N = Matrix([0, 1, 1])  # now it works

So it seems there is some issue only when parsing the initial assignment statement N = Matrix([0, 1, 1]) when N is the builtin function.

Further testing

I tried some of the other one-letter builtins and these work fine:

>>> C = Matrix([0, 1, 1])  # ok
... O = Matrix([0, 1, 1])  # ok
... S = Matrix([0, 1, 1])  # ok
... I = Matrix([0, 1, 1])  # ok
... E = Matrix([0, 1, 1])  # ok

But Q fails the same way as N:

>>> Q = Matrix([0, 1, 1])  # fails
Exception in SymPy Live of type 
<class 'sympy.core.sympify.SympifyError'>
for reference the last 5 stack trace entries are
Traceback (most recent call last):
  File "/base/data/home/apps/s~sympy-live-hrd/20200105t193609.423659059328302322/shell.py", line 781, in post
    live.evaluate(statement, session, printer, stream)
  File "/base/data/home/apps/s~sympy-live-hrd/20200105t193609.423659059328302322/shell.py", line 453, in evaluate
    if name not in old_globals or val != old_globals[name]:
  File "/base/data/home/apps/s~sympy-live-hrd/20200105t193609.423659059328302322/sympy/sympy/matrices/matrices.py", line 2360, in __ne__
    return not self == other
  File "/base/data/home/apps/s~sympy-live-hrd/20200105t193609.423659059328302322/sympy/sympy/matrices/dense.py", line 47, in __eq__
    other = sympify(other)
  File "/base/data/home/apps/s~sympy-live-hrd/20200105t193609.423659059328302322/sympy/sympy/core/sympify.py", line 387, in sympify
    raise SympifyError('could not parse %r' % a, exc)
SympifyError: Sympify of expression 'could not parse u'<sympy.assumptions.ask.AssumptionKeys object at 0x3e1746cabfd0>'' failed, because of exception being raised:
SyntaxError: invalid syntax (<string>, line 1)

Even more weirdness

Trying to define a regular Python function called N when N is currently defined as a Matrix fails:

clickable

>>> N = 2                      # workaround to make the next line work
>>> N = Matrix([0, 1, 1])      # works since N=2 just before
>>> N0⎤
⎢1⎥
⎣1>>> def N(x):                  # fails
...     return 42
Exception in SymPy Live of type 
<class 'sympy.core.sympify.SympifyError'>
for reference the last 5 stack trace entries are
Traceback (most recent call last):
  File "/base/data/home/apps/s~sympy-live-hrd/20200105t193609.423659059328302322/shell.py", line 781, in post
    live.evaluate(statement, session, printer, stream)
  File "/base/data/home/apps/s~sympy-live-hrd/20200105t193609.423659059328302322/shell.py", line 453, in evaluate
    if name not in old_globals or val != old_globals[name]:
  File "/base/data/home/apps/s~sympy-live-hrd/20200105t193609.423659059328302322/sympy/sympy/matrices/matrices.py", line 2360, in __ne__
    return not self == other
  File "/base/data/home/apps/s~sympy-live-hrd/20200105t193609.423659059328302322/sympy/sympy/matrices/dense.py", line 47, in __eq__
    other = sympify(other)
  File "/base/data/home/apps/s~sympy-live-hrd/20200105t193609.423659059328302322/sympy/sympy/core/sympify.py", line 387, in sympify
    raise SympifyError('could not parse %r' % a, exc)
SympifyError: Sympify of expression 'could not parse u'<function N at 0x3e25e073fb90>'' failed, because of exception being raised:
SyntaxError: invalid syntax (<string>, line 1)

When N is a regular int, defining a function works of course

>>> N = 2                      # works
>>> N
2
>>> def N(x):                  # works too
...     return 42
>>> N
<function N at 0x3e25e0741aa0>

Summary

It seems some part of the live shell wrapper logic is trying to parse inputs and simpify them, which works in general, but is causing bad interactions when either the left or the right side of assignment statements are Matrix objects.

@ivanistheone ivanistheone changed the title Trying to assign an non-trivial expression to N or Q fails Trying to assign Matrix expressions to N or Q fails Jan 16, 2020
@james-n-007
Copy link

yes,if we use N at first its not giving any error,later its giving error
N,Q=symbols('N Q')

N = Matrix([0, 1, 1])
if we do like this then its giving no errors for both N,Q

@james-n-007
Copy link

after these lines i have used
from sympy import *
then its showing error like this
Exception in SymPy Live of type
<class 'sympy.core.sympify.SympifyError'>
for reference the last 5 stack trace entries are
Traceback (most recent call last):
File "/base/data/home/apps/ssympy-live-hrd/20200105t193609.423659059328302322/shell.py", line 781, in post
live.evaluate(statement, session, printer, stream)
File "/base/data/home/apps/s
sympy-live-hrd/20200105t193609.423659059328302322/shell.py", line 453, in evaluate
if name not in old_globals or val != old_globals[name]:
File "/base/data/home/apps/ssympy-live-hrd/20200105t193609.423659059328302322/sympy/sympy/matrices/matrices.py", line 2360, in ne
return not self == other
File "/base/data/home/apps/s
sympy-live-hrd/20200105t193609.423659059328302322/sympy/sympy/matrices/dense.py", line 47, in eq
other = sympify(other)
File "/base/data/home/apps/s~sympy-live-hrd/20200105t193609.423659059328302322/sympy/sympy/core/sympify.py", line 387, in sympify
raise SympifyError('could not parse %r' % a, exc)
SympifyError: Sympify of expression 'could not parse u'<sympy.assumptions.ask.AssumptionKeys object at 0x3e4318a27f90>'' failed, because of exception being raised:
SyntaxError: invalid syntax (, line 1)

@james-n-007
Copy link

i would like to work towards it ,can someone help me..

@asmeurer
Copy link
Member

I guess it doesn't handle redefining names that are built in to SymPy correctly.

@ivanistheone
Copy link
Contributor Author

Just tested, and It's not just for N and Q it seems, but for any funtion/callable.

This fails:

>>> def Z(x):
        return 42
>>> Z = Matrix([1,2,3])

clickable

so it's when left side of assignment is function-like, and right is Matrix

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants