On Thu, Jan 10, 2013 at 3:01 PM, Vinzenz Bargsten
<[email protected]> wrote:
> Hi,
>
> I would like to use sympy expressions with multiprocessing. This requires
> the expressions to be pickled. As this is currently not possible with
> functions included in the expressions, I tried using srepr and str to
> convert the expressions to strings and then hand them over to other
> processes. However, I observed that my expressions are not correctly
> restored (first using srepr, eval), especially if the cache is cleared (also
> in other processes). Currently, I use str / S and do not clear the cache.
> Note: I removed all assumptions from my symbols. Find some test output and
> script below.
>
> 1. Are there better options than this to transfer such expressions to other
> processes?

You could try to get around the pickling issues by writing a custom
pickler.  See for example
https://code.google.com/p/sympy/issues/detail?id=2587 and associated
pull request https://github.com/sympy/sympy-live/pull/46.  I don't
know what would be required to make this work for Functions. There
might be some hints at
https://code.google.com/p/sympy/issues/detail?id=1198, which explains
why it doesn't work.  Actually, there's a trick in that issue that
works some of the time, but not all of the time (setting __module__).
You could see if that works for you.

Or we could try to actually fix the problem and rewrite Function in a
way that is pickable already.

> 2. Is it intended that clearing the cache has this effect?

No, that's a bug.

If you turn the cache off completely, you get False for everything. I
think the core of the issue is
https://code.google.com/p/sympy/issues/detail?id=1612 (and related
issue 440).

Actually, my old fix at seems to work (with it, your script gives all
True).  I created a pull request with the fix at
https://github.com/sympy/sympy/pull/1710. We'll see if there are
issues still.

> 3. Did the 0.7.1 version have some problem with srepr ?

It wasn't an issue with srepr(), which returned the same thing.  The
issues are are with the subtleties of how __eq__ works in the core.

Anyway, let's not worry about 0.7.1.  That was released over a year
ago, and we have a hard enough time managing the bugs that are
current.

Aaron Meurer

>
> Thanks and kind regards,
> Vinzenz
> ------------------------------------------------------------------------
> :~> python3.2 sympy_strrepr_test.py
> Version:  0.7.1-git
> srepr(x):  Function('x')(Symbol('t'))
> str(x):  x(t)
> x==S(srepr(x)):  False
> x==eval(srepr(x))):  False
> x==S(str(x)):  True
> x(t)
> Clearing cache...
> x(t)
> x==S(srepr(x)):  False
> x==eval(srepr(x))):  False
> x==S(str(x)):  False
> -------------------------------------------------------------------------
> :~> python2.7 sympy_strrepr_test.py
> Version:  0.7.2
> srepr(x):  Function('x')(Symbol('t'))
> str(x):  x(t)
> x==S(srepr(x)):  True
> x==eval(srepr(x))):  True
> x==S(str(x)):  True
> x(t)
> Clearing cache...
> x(t)
> x==S(srepr(x)):  False
> x==eval(srepr(x))):  False
> x==S(str(x)):  False
> -------------------------------------------------------------------------
> :~> python2.7 sympy_strrepr_test.py
> Version:  0.7.1-git
> srepr(x):  Function('x')(Symbol('t'))
> str(x):  x(t)
> x==S(srepr(x)):  False
> x==eval(srepr(x))):  False
> x==S(str(x)):  True
> x(t)
> Clearing cache...
> x(t)
> x==S(srepr(x)):  False
> x==eval(srepr(x))):  False
> x==S(str(x)):  False
> -------------------------------------------------------------------------
>
>
> This is the script I use:
> from __future__ import print_function
> from sympy import *
> from sympy import __version__ as sympyver
> print("Version: ", sympyver)
> x=S('x(t)')
> print("srepr(x): ", srepr(x))
> print("str(x): ", str(x))
>
> print("x==S(srepr(x)): ",x==S(srepr(x)))
> print("x==eval(srepr(x))): ",x==eval(srepr(x)))
> print("x==S(str(x)): ",x==S(str(x)))
> print(x)
> print("Clearing cache...")
> cache.clear_cache()
> print(x)
> print("x==S(srepr(x)): ",x==S(srepr(x)))
> print("x==eval(srepr(x))): ",x==eval(srepr(x)))
> print("x==S(str(x)): ",x==S(str(x)))
>
>
> --
> You received this message because you are subscribed to the Google Groups
> "sympy" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> For more options, visit this group at
> http://groups.google.com/group/sympy?hl=en.
>

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sympy?hl=en.

Reply via email to