1

I am trying to use ipycanvas in Jupyter notebook with SageMath 9.3 (I also tried 9.3.rc2) for macOS 11.4, and Python 3. When I was using SageMath 9.2 and Python 3 ipycanvas was working fine, but when I updated sage to SageMath 9.3 I started having problems.

The first thing I did was installing again ipycanvas on my mac terminal

$ sage —pip install ipycanvas

And the installation was apparently successful.

However, even running a minimal instance of ipycanvas produces type JSON serializable errors, e.g.,

canvas = Canvas(width=200, height=200)
canvas.stroke_style = 'blue'
canvas.stroke_line(0, 0, 150, 150)
canvas

enter image description here

I cannot figure out why I am getting an error this time. How do I serialize sage rationals?

The solution I found is just converting every sage number to a float. However this is a little bit annoying while typing. Am I missing something?

1 Answers1

1

TL; DR Unfortunately you will need to convert the numbers that you need to pass to ipycanvas

I think you have figured out the answer in your own question. It turns out that numbers in Sage notebooks are by default interpreted as Sage types (check out https://doc.sagemath.org/html/en/tutorial/tour_coercion.html#types-versus-parents for more info on types coercion). So when you type, say 7 it casts as Integer(7) as in the element 7 in the ring of integers Z.

The class Integer is highly optimised for algebraic computations, however it contains some methods/attributes that cannot be JSON- serialised*, which is what ipycanvas need to render javascript.

  • On a separate note, related to one of the questions you asked "in passing", all Sage rationals can be serialised with pickle. This unfortunately doesn't help with the ipycanvas situation.
Campello
  • 325
  • 1
  • 3
  • 10
  • 1
    Thank you, with sage 9.2 I only had to convert rationals to floats, but everything was ok with sage integers before. That is a bit annoying, I hope at least this question would be useful for others. – Gaston Burrull May 31 '21 at 10:14