Thanks Oscar. Great to have the default (latest) version of the docs in the
new, Furo format.

The release notes
<https://github.com/sympy/sympy/wiki/Release-Notes-for-1.11> include

> SymPy 1.11 has not been released yet.
>
Would you like me to update that to

> SymPy 1.11 was released on 23rd August 2022.
>
or would you like to (or is some automation supposed to do that)?

Best,

Jeremy

On Wed, Aug 24, 2022 at 11:39 AM Peter Stahlecker <
[email protected]> wrote:

> Dear Oscar,
>
> Thanks to your explanations, I managed  to use solve_ivp when I used
> cse=True in  lambdify in one of my programs. ( just convert the list to an
> np.ndarray of the correct shape)
> The increase in speed in the integration was remarkable:
> From around 8.5 sec with cse=False to around 0.13 sec with cse=True, 65
> times faster!
> Thanks! Peter
>
>
> On Wed 24. Aug 2022 at 14:48 Peter Stahlecker <[email protected]>
> wrote:
>
>> Dear Oscar,
>>
>> my expressions into lambdify are of sm.Matrix type.
>> With cse=False, the output of lambdify is a numpy.ndarray of the same
>> shape as the sm.Matrix.
>> With cse=True, the output is is list.
>> (I guess, this is what you said, would happen.)
>>
>> Does this mean, if I somehow manage to convert the lists into ndarrays of
>> the correct shape, the code should run with cse=True, too?
>>
>> Thanks, Peter
>>
>> On Wed 24. Aug 2022 at 14:26 Oscar Benjamin <[email protected]>
>> wrote:
>>
>>> On Wed, 24 Aug 2022 at 08:55, Peter Stahlecker
>>> <[email protected]> wrote:
>>> >
>>> > I have upgraded to sympy 1.11
>>> > I wanted to try the cse keyword.
>>> >
>>> > If I set cse = False, all seems to work fine.
>>> > If I set cse = True, lambdify(..) seems to work fine, but
>>> solve_ivp(..) gives and error.
>>>
>>> It looks like cse=True doesn't work properly when lambdifying a Matrix:
>>>
>>> In [3]: lambdify((x,), Matrix([[x**2, 0], [0, x**2]]), cse=False)(1)
>>> Out[3]:
>>> array([[1, 0],
>>>        [0, 1]])
>>>
>>> In [4]: lambdify((x,), Matrix([[x**2, 0], [0, x**2]]), cse=True)(1)
>>> Out[4]:
>>> [array([[1, 0],
>>>         [0, 1]])]
>>>
>>> Note that with cse=True the Matrix is in a list of length 1. If the
>>> matrix doesn't have any nontrivial subexpressions then it doesn't
>>> happen:
>>>
>>> In [6]: lambdify((x,), Matrix([[x, 0], [0, x]]), cse=True)(1)
>>> Out[6]:
>>> array([[1, 0],
>>>        [0, 1]])
>>>
>>> Looking at the generated code we have:
>>>
>>> In [11]: print(inspect.getsource(lambdify((x,), Matrix([[x**2, 0], [0,
>>> x**2]]), cse=True)))
>>> def _lambdifygenerated(x):
>>>     x0 = x**2
>>>     return [array([[x0, 0], [0, x0]])]
>>>
>>> In [12]: print(inspect.getsource(lambdify((x,), Matrix([[x**2, 0], [0,
>>> x**2]]), cse=False)))
>>> def _lambdifygenerated(x):
>>>     return array([[x**2, 0], [0, x**2]])
>>>
>>> So for some reason the generated code puts the output in a list. Looks
>>> like this code is responsible:
>>>
>>> https://github.com/sympy/sympy/blob/5eb59bdad2f4e1a675acb31e7f0c72c8abca708c/sympy/utilities/lambdify.py#L1114-L1126
>>>
>>> It seems to presume that expr (which in this case is a Matrix) is
>>> supposed to be a list or tuple. First it tries to add a list to it and
>>> then if that fails it tries to add a tuple and then if that fails it
>>> just puts expr into a list (expr = [expr]). I wish I could just ban
>>> the use of try/except in the sympy codebase because it's almost never
>>> used in a good way.
>>>
>>> Basically that code will fail any time expr is not a tuple or a list
>>> e.g.:
>>>
>>> In [3]: lambdify(x, x**2 + y*x**2, cse=True)(1)
>>> Out[3]: [y + 1]
>>>
>>> A workaround is just to extract the element from the list:
>>>
>>> In [4]: lambdify(x, x**2 + y*x**2, cse=True)(1)[0]
>>> Out[4]: y + 1
>>>
>>> The bug comes from here:
>>> https://github.com/sympy/sympy/pull/23538
>>>
>>> --
>>> Oscar
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "sympy" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected].
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/sympy/CAHVvXxSoDEGZLfZ%3D0JYkdoQ%3D0Dq%3DSVP_MqnmOvp9%2Bp7Q__uxSg%40mail.gmail.com
>>> .
>>>
>> --
>> Best regards,
>>
>> Peter Stahlecker
>>
> --
> Best regards,
>
> Peter Stahlecker
>
> --
> You received this message because you are subscribed to the Google Groups
> "sympy" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/sympy/CABKqA0YKmQ3RwByJMwmtXKS5rXi-SZ42tGeQrjChk%3D_UQ90Q9Q%40mail.gmail.com
> <https://groups.google.com/d/msgid/sympy/CABKqA0YKmQ3RwByJMwmtXKS5rXi-SZ42tGeQrjChk%3D_UQ90Q9Q%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sympy/CAO00iLhC9Np7PtbAKe4RiuyA2gCYrG5XDHbYSpf1LDnh3sjUiA%40mail.gmail.com.

Reply via email to