Opened 20 months ago

Last modified 20 months ago

#26317 new defect

Modular form plotting fails because modular forms (power series) cannot be evaluated at floats

Reported by: alexjbest Owned by:
Priority: major Milestone: sage-8.4
Component: graphics Keywords: plotting, modular forms, python types
Cc: Merged in:
Authors: Reviewers:
Report Upstream: N/A Work issues:
Branch: Commit:
Dependencies: Stopgaps:


If one tries to plot a modular form the plot code tries to evaluate the modular form as a function on floats, which fails. Essentially this boils down to floats not having a .parent() (see traceback at end).

There are two potential fixes, neither of which I had opportunity to test yet, but would like thoughts on:

  • Modify the line Q = a.parent() of src/sage/rings/power_series_poly.pyx to something like
             from sage.structure import parent
             Q = parent(a)

which might make power series a bit more resilient to being passed python types as input, this might be a change which should be made across a lot of Sage in that case?

  • Or modify plotting code (generate_plot_points) to not use floats, I guess this might come with some performance hit to plotting.
sage: modf = ModularForms(12).basis()[0]
sage: plot(modf)
AttributeError                            Traceback (most recent call last)
<ipython-input-2-f871686f0b17> in <module>()
----> 1 plot(modf)

/Users/alex/sage/local/lib/python2.7/site-packages/sage/misc/decorators.pyc in wrapper(*args, **kwds)
    565                 options['__original_opts'] = kwds
    566             options.update(kwds)
--> 567             return func(*args, **options)
    569         #Add the options specified by @options to the signature of the wrapped

/Users/alex/sage/local/lib/python2.7/site-packages/sage/plot/plot.pyc in plot(funcs, *args, **kwds)
   1954             xmin = kwds.pop('xmin', -1)
   1955             xmax = kwds.pop('xmax', 1)
-> 1956             G = _plot(funcs, (xmin, xmax), **kwds)
   1958         # if there is one extra arg, then it had better be a tuple

/Users/alex/sage/local/lib/python2.7/site-packages/sage/plot/plot.pyc in _plot(funcs, xrange, parametric, polar, fill, label, randomize, **options)
   2264         data = generate_plot_points(f, xrange, plot_points,
   2265                                     adaptive_tolerance, adaptive_recursion,
-> 2266                                     randomize)

/Users/alex/sage/local/lib/python2.7/site-packages/sage/plot/plot.pyc in generate_plot_points(f, xrange, plot_points, adaptive_tolerance, adaptive_recursion, randomize, initial_points)
   3863         try:
-> 3864             data[i] = (float(xi), float(f(xi)))
   3865             if str(data[i][1]) in ['nan', 'NaN', 'inf', '-inf']:
   3866                 msg = "Unable to compute f(%s)" % xi

/Users/alex/sage/local/lib/python2.7/site-packages/sage/modular/modform/element.pyc in __call__(self, x, prec)
    174             0
    175         """
--> 176         return self.q_expansion(prec)(x)
    178     @cached_method

/Users/alex/sage/local/lib/python2.7/site-packages/sage/rings/power_series_poly.pyx in sage.rings.power_series_poly.PowerSeries_poly.__call__ (build/cythonized/sage/rings/power_series_poly.c:5702)()
    320             return self.__f(x)
--> 322         Q = a.parent()
    324         from sage.rings.padics.padic_generic import pAdicGeneric

AttributeError: 'float' object has no attribute 'parent'

Change History (1)

comment:1 Changed 20 months ago by alexjbest

  • Summary changed from Modular form printing fails because modular forms cannot be evaluated at floats to Modular form plotting fails because modular forms (power series) cannot be evaluated at floats
Note: See TracTickets for help on using tickets.