sagemath / sage

Main repository of SageMath
https://www.sagemath.org
Other
1.3k stars 447 forks source link

pickled function loses its args #17558

Open a46d73b2-c70f-469a-b7c4-f2ca845e72d5 opened 9 years ago

a46d73b2-c70f-469a-b7c4-f2ca845e72d5 commented 9 years ago

The pickle process appears to forget whether an expression is a function.

sage: var('u_0 u_1')
(u_0, u_1)
sage: f2u = (1 - u_0).function(u_0, u_1)
sage: f2u(x,y)
-x + 1
sage: f2 = loads(dumps(f2u))
sage: f2(x,y)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/usr/local/src/jekyll-research/wmd_files/Selection_Gradients/maclev-2-2-adap.sage.py in <module>()
----> 1 f2(x,y)

/usr/local/sage/local/lib/python2.7/site-packages/sage/symbolic/expression.so in sage.symbolic.expression.Expression.__call__ (build/cythonized/sage/symbolic/expression.cpp:24669)()

/usr/local/sage/local/lib/python2.7/site-packages/sage/symbolic/ring.so in sage.symbolic.ring.SymbolicRing._call_element_ (build/cythonized/sage/symbolic/ring.cpp:8970)()

ValueError: the number of arguments must be less than or equal to 1
sage: f2u
(u_0, u_1) |--> -u_0 + 1
sage: f2
-u_0 + 1

Since I'm using a modular program design with intermediate results in .sobj files, this (along with some other bugs I've reported) is making it inconvenient for me to work with functions...

Component: pickling

Issue created by migration from https://trac.sagemath.org/ticket/17558

a46d73b2-c70f-469a-b7c4-f2ca845e72d5 commented 9 years ago
comment:1

Possibly related to #17503 (pickled symbolic function breaks maxima interface)

nbruin commented 9 years ago
comment:2

Replying to @sagetrac-wonder:

Possibly related to #17503 (pickled symbolic function breaks maxima interface)

Indeed, I suspect it's related in the sense that pickling of symbolic expressions seems to rely entirely one Pynac serialization and doesn't take into account the properties of the python objects involved. In particular, the difference between a callable and a normal symbolic expression seems to lie entirely in the parent:

sage: var('u_0 u_1 x y')
(u_0, u_1, x, y)
sage: f2u = (1 - u_0).function(u_0, u_1)
sage: parent(f2u)
Callable function ring with arguments (u_0, u_1)
sage: parent(f2u(u_0,u_1))
Symbolic Ring
sage: f2u(u_0,u_1).__reduce_ex__(2) == f2u.__reduce_ex__(2) #this confirms that they pickle to the same.
True