Saving large symbolic expressions

29 views
Skip to first unread message

Ash

unread,
Aug 14, 2019, 5:54:13 AM8/14/19
to sympy
Hello,
I have derived the equations of motion of a dynamic system symbolically. To evaluate the Mass Matrix and Coriolis Vector which contain several derivative terms, the program takes around 14 sec. These two are to be used for various other places. I tried saving and loading using 'dill'

import dill
MassMatrix, Coriolis = get_mc()
dill.dump(MassMatrix, open("MassMatrix", "wb"))
# dill.dump(Coriolis, open("Coriolis", "wb"))

The above results in
Traceback (most recent call last):
  File "/snap/pycharm-professional/147/helpers/pydev/_pydevd_bundle/pydevd_exec2.py", line 3, in Exec
    exec(exp, global_vars, local_vars)
  File "<input>", line 1, in <module>
  File "/home/ar0058/Ash/venv3.6/lib/python3.6/site-packages/dill/_dill.py", line 287, in dump
    pik.dump(obj)
  File "/usr/lib/python3.6/pickle.py", line 409, in dump
    self.save(obj)
  File "/usr/lib/python3.6/pickle.py", line 521, in save
    self.save_reduce(obj=obj, *rv)
  File "/usr/lib/python3.6/pickle.py", line 610, in save_reduce
    save(args)
  File "/usr/lib/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib/python3.6/pickle.py", line 736, in save_tuple
    save(element)
  File "/usr/lib/python3.6/pickle.py", line 521, in save
    self.save_reduce(obj=obj, *rv)
  File "/usr/lib/python3.6/pickle.py", line 610, in save_reduce
    save(args)
  File "/usr/lib/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib/python3.6/pickle.py", line 751, in save_tuple
    save(element)
  File "/usr/lib/python3.6/pickle.py", line 521, in save
    self.save_reduce(obj=obj, *rv)
  File "/usr/lib/python3.6/pickle.py", line 610, in save_reduce
    save(args)
  File "/usr/lib/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib/python3.6/pickle.py", line 736, in save_tuple
    save(element)
  File "/usr/lib/python3.6/pickle.py", line 521, in save
    self.save_reduce(obj=obj, *rv)
  File "/usr/lib/python3.6/pickle.py", line 610, in save_reduce
    save(args)
  File "/usr/lib/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib/python3.6/pickle.py", line 736, in save_tuple
    save(element)
  File "/usr/lib/python3.6/pickle.py", line 521, in save
    self.save_reduce(obj=obj, *rv)
  File "/usr/lib/python3.6/pickle.py", line 610, in save_reduce
    save(args)
  File "/usr/lib/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib/python3.6/pickle.py", line 751, in save_tuple
    save(element)
  File "/usr/lib/python3.6/pickle.py", line 521, in save
    self.save_reduce(obj=obj, *rv)
  File "/usr/lib/python3.6/pickle.py", line 610, in save_reduce
    save(args)
  File "/usr/lib/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib/python3.6/pickle.py", line 736, in save_tuple
    save(element)
  File "/usr/lib/python3.6/pickle.py", line 521, in save
    self.save_reduce(obj=obj, *rv)
  File "/usr/lib/python3.6/pickle.py", line 610, in save_reduce
    save(args)
  File "/usr/lib/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib/python3.6/pickle.py", line 736, in save_tuple
    save(element)
  File "/usr/lib/python3.6/pickle.py", line 521, in save
    self.save_reduce(obj=obj, *rv)
  File "/usr/lib/python3.6/pickle.py", line 610, in save_reduce
    save(args)
  File "/usr/lib/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib/python3.6/pickle.py", line 736, in save_tuple
    save(element)
  File "/usr/lib/python3.6/pickle.py", line 521, in save
    self.save_reduce(obj=obj, *rv)
  File "/usr/lib/python3.6/pickle.py", line 610, in save_reduce
    save(args)
  File "/usr/lib/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib/python3.6/pickle.py", line 736, in save_tuple
    save(element)
  File "/usr/lib/python3.6/pickle.py", line 521, in save
    self.save_reduce(obj=obj, *rv)
  File "/usr/lib/python3.6/pickle.py", line 609, in save_reduce
    save(func)
  File "/usr/lib/python3.6/pickle.py", line 476, in save
    f(self, obj) # Call unbound method with explicit self
  File "/home/ar0058/Ash/venv3.6/lib/python3.6/site-packages/dill/_dill.py", line 1338, in save_type
    StockPickler.save_global(pickler, obj)
  File "/usr/lib/python3.6/pickle.py", line 922, in save_global
    (obj, module_name, name))
_pickle.PicklingError: Can't pickle q1: it's not found as __main__.q1


Could someone suggest a way to save properly?

Thanks

Oscar Benjamin

unread,
Aug 14, 2019, 6:33:52 AM8/14/19
to sympy
This seems to be a bug. I think I can reproduce it with:

In [9]: import pickle

In [10]: from sympy.physics.mechanics import dynamicsymbols

In [11]: q1 = dynamicsymbols('q1')

In [12]: pickle.dumps(q1)
---------------------------------------------------------------------------
PicklingError Traceback (most recent call last)
<ipython-input-12-6285d23b0ca4> in <module>
----> 1 pickle.dumps(q1)

PicklingError: Can't pickle q1: it's not the same object as __main__.q1

Although the final error message is slightly different. Normal Symbol
works so it is to do with dynamicsymbol in some way.

Digging further:

In [13]: q1 = Function('q1')(Symbol('t'))

In [14]: pickle.dumps(q1)
---------------------------------------------------------------------------
PicklingError Traceback (most recent call last)
<ipython-input-14-6285d23b0ca4> in <module>
----> 1 pickle.dumps(q1)

PicklingError: Can't pickle q1: it's not the same object as __main__.q1

In [15]: q1 = Function('q1')

In [16]: pickle.dumps(q1)
Out[16]: b'\x80\x03c__main__\nq1\nq\x00.'

That pickle for the unapplied function is too short. I think something
is wrong with pickling functions.


To fix your problem substitute the dynamicsymbols for normal symbols.


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 sympy+un...@googlegroups.com.
> To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/bc15fc9f-8b3b-42f3-824c-69b475d947ad%40googlegroups.com.

Aaron Meurer

unread,
Aug 14, 2019, 12:36:35 PM8/14/19
to sympy
There are lots of issues with pickling and SymPy unfortunately.
Functions in particular have issues because they are dynamically
created classes. The best way to save expressions right now is to use
srepr/sympify.

Aaron Meurer
> To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/CAHVvXxQe%2BYpg-tTO-tpZbjE36AaBPYBdbUGRsXXneVGO7hXrXA%40mail.gmail.com.

Jason Moore

unread,
Aug 14, 2019, 1:15:41 PM8/14/19
to sympy
You can also replace the functions of t with symbols before pickling.

Jason

Ash

unread,
Aug 14, 2019, 1:33:28 PM8/14/19
to sympy
Thanks Oscar, Aaron and Jason for you replies. I will try both srepr & converting f(t) to symbols and report the progress here
Reply all
Reply to author
Forward
0 new messages