Ejemplo n.º 1
0
def render_maass_waveforms(level=0, weight=-1, character=-1, r1=0, r2=0, **kwds):
    info = get_args_mwf(level=level, weight=weight, character=character, r1=r1, r2=r2, **kwds)

    info["credit"] = ""
    info["learnmore"] = learnmore_list()
    mwf_logger.debug("args=%s" % request.args)
    mwf_logger.debug("method=%s" % request.method)
    mwf_logger.debug("req.form=%s" % request.form)
    mwf_logger.debug("info=%s" % info)
    mwf_logger.debug("level,weight,char={0},{1},{2}".format(level, weight, character))
    if info.get('maass_id', None) and info.get('db', None):
        return render_one_maass_waveform_wp(**info)
    if info['search'] or (info['browse'] and int(info['weight']) != 0):
        search = get_search_parameters(info)
        mwf_logger.debug("search=%s" % search)
        return render_search_results_wp(info, search)
    if info['browse']:
        mwf_logger.debug("browse info=%s" % info)
        return render_browse_all_eigenvalues(**info)

    info['cur_character'] = character
    if level > 0:
        info['maass_weight'] = maass_db.weights(int(level))
        info['cur_level'] = level

    if weight > -1:
        info['cur_weight'] = weight
        if level > 0:
            info['maass_character'] = maass_db.characters(int(level), float(weight))
    if character > - 1:
        info['cur_character'] = character

    if level > 0 or weight > -1 or character > -1:
        search = get_search_parameters(info)
        mwf_logger.debug("info=%s" % info)
        mwf_logger.debug("search=%s" % search)
        return render_search_results_wp(info, search)
    title = 'Maass Forms'
    info['list_of_levels'] = maass_db.levels()
    if info['list_of_levels']:
        info['max_level'] = max(info['list_of_levels'])
    else:
        info['max_level'] = 0
    mwf_logger.debug("info3=%s" % info)
    bread = [('Modular Forms', url_for('mf.modular_form_main_page')),
             ('Maass Forms', url_for('.render_maass_waveforms'))]
    info['bread'] = bread
    info['title'] = title
    maass_db.set_table()
    maass_db.table['ncols'] = 10
    info['DB'] = maass_db
    info['dbcount'] = maass_db.count()
    info['limit'] = maxNumberOfResultsToShow
    return render_template("mwf_navigate.html", **info)
Ejemplo n.º 2
0
 def __init__(self, skip=[0, 0], limit=[6, 10], keys=['Level', 'Eigenvalue'], weight=0):
     r"""
     Skip tells you how many chunks of data you want to skip (from the beginning) and limit tells you how large each chunk is.
     """
     self.keys = keys
     if not isinstance(skip, list):
         self.skip = [skip, skip]
     if not isinstance(limit, list):
         self.limit = [limit, limit]
     mwf_logger.debug("count={0}".format(maass_db.count()))
     self.title = ''
     self.table = []
     self.wt = weight
     self.paging = []
Ejemplo n.º 3
0
 def __init__(self, skip=[0, 0], limit=[6, 10], keys=['Level', 'Eigenvalue'], weight=0):
     r"""
     Skip tells you how many chunks of data you want to skip (from the beginning) and limit tells you how large each chunk is.
     """
     self.keys = keys
     if not isinstance(skip, list):
         self.skip = [skip, skip]
     if not isinstance(limit, list):
         self.limit = [limit, limit]
     mwf_logger.debug("count={0}".format(maass_db.count()))
     self.title = ''
     self.table = []
     self.wt = weight
     self.paging = []
Ejemplo n.º 4
0
def render_maass_waveforms(level=0,
                           weight=-1,
                           character=-1,
                           r1=0,
                           r2=0,
                           **kwds):
    info = get_args_mwf(level=level,
                        weight=weight,
                        character=character,
                        r1=r1,
                        r2=r2,
                        **kwds)
    info[
        "credit"] = u"Data computed by Stefan Lemurell and Fredrik Str\u00f6mberg."
    info["bread"] = [('Modular Forms', url_for('mf.modular_form_main_page')),
                     ('Maass Forms', url_for('.render_maass_waveforms'))]
    info["learnmore"] = learnmore_list()
    mwf_logger.debug("args=%s" % request.args)
    mwf_logger.debug("method=%s" % request.method)
    mwf_logger.debug("req.form=%s" % request.form)
    mwf_logger.debug("info=%s" % info)
    mwf_logger.debug("level,weight,char={0},{1},{2}".format(
        level, weight, character))
    if info.get('maass_id', None) and info.get('db', None):
        return render_one_maass_waveform_wp(**info)
    if info['search'] or (info['browse'] and int(info['weight']) != 0):
        # This isn't the right place to do input validation, but it is easier to flash errors here (this is a hack to address issue #1820)
        if info.get('level_range'):
            if not re.match(POSINT_RE, info['level_range']):
                if "-" in info['level_range']:
                    info['level_range'] = "..".join(
                        info['level_range'].split("-"))
                if not re.match(POSINT_RANGE_RE, info['level_range']):
                    flash_error(
                        "%s is not a level, please specify a positive integer <span style='color:black'>n</span> or postivie integer range <span style='color:black'>m..n</span>.",
                        info['level_range'])
                    return render_template('mwf_navigate.html', **info)
        if info['character'] != -1:
            if info['character'] == '1' or info['character'] == '1.1':
                info['character'] = '1'
            else:
                try:
                    N = int(info.get('level_range', '0'))
                except:
                    flash_error(
                        "Only the trivial character can be specified in combination with a range of levels.",
                        info['character'])
                    return render_template('mwf_navigate.html', **info)
                if re.match(POSINT_RE, info['character']):
                    if N == 0:
                        flash_error(
                            "Character %s is ambiguous. Please either specify a level or use a character label of the form <span style='color:black'>q.n</span>, where q specifies the level.",
                            info['character'])
                        return render_template('mwf_navigate.html', **info)
                    n = int(info['character'])
                    if gcd(N, n) != 1:
                        flash_error(
                            "Character %s is not coprime to the level %s.",
                            info['character'], str(N))
                        return render_template('mwf_navigate.html', **info)
                else:
                    if not re.match(r'^[1-9][0-9]*\.[1-9][0-9]*$',
                                    info['character']):
                        flash_error(
                            "%s is not a valid label for a Dirichlet character.  It should be either be 1 (for the trivial character) or of the form <span style='color:black'>q.n</span>, where q and n are coprime positive integers with n < q, or q=n=1.",
                            info['character'])
                        return render_template('mwf_navigate.html', **info)
                    s = info['character'].split('.')
                    q, n = int(s[0]), int(s[1])
                    if n > q or gcd(q, n) != 1:
                        flash_error(
                            "%s is not a valid label for a Dirichlet character.  It should be of the form <span style='color:black'>q.n</span>, where q and n are coprime positive integers with n < q, or q=n=1.",
                            info['character'])
                        return render_template('mwf_navigate.html', **info)
                    if N > 0 and q != N:
                        flash_error(
                            "The specified character %s is not compatible with the level %s.",
                            info['character'], info['level'])
                        return render_template('mwf_navigate.html', **info)
                    info['level_range'] = str(q)
                    info['character'] = str(n)
        if info['weight'] != -1:
            if not re.match(INT_RE, info['weight']):
                flash_error(
                    "%s is not a valid weight.  It should be a nonnegative integer.",
                    info['weight'])
                return render_template('mwf_navigate.html', **info)
        if info.get('ev_range'):
            if not re.match(FLOAT_RE, info['ev_range']):
                if "-" in info['ev_range']:
                    info['ev_range'] = "..".join(info['ev_range'].split("-"))
                s = info['ev_range'].split("..")
                if len(s) != 2:
                    flash_error(
                        "%s is not a valid eigenvalue range.  It should be postive real interval.",
                        info['ev_range'])
                    return render_template('mwf_navigate.html', **info)
                if not re.match(FLOAT_RE, s[0]) or not re.match(
                        FLOAT_RE, s[1]):
                    flash_error(
                        "%s is not a valid eigenvalue range.  It should be postive real interval.",
                        info['ev_range'])
                    return render_template('mwf_navigate.html', **info)
        search = get_search_parameters(info)
        mwf_logger.debug("search=%s" % search)
        return render_search_results_wp(info, search)
    if info['browse']:
        mwf_logger.debug("browse info=%s" % info)
        return render_browse_all_eigenvalues(**info)

    info['cur_character'] = character
    if level > 0:
        info['maass_weight'] = maass_db.weights(int(level))
        info['cur_level'] = level

    if weight > -1:
        info['cur_weight'] = weight
        if level > 0:
            info['maass_character'] = maass_db.characters(
                int(level), float(weight))
    if character > -1:
        info['cur_character'] = character

    if level > 0 or weight > -1 or character > -1:
        search = get_search_parameters(info)
        mwf_logger.debug("info=%s" % info)
        mwf_logger.debug("search=%s" % search)
        return render_search_results_wp(info, search)
    title = 'Maass Forms'
    info['list_of_levels'] = maass_db.levels()
    if info['list_of_levels']:
        info['max_level'] = max(info['list_of_levels'])
    else:
        info['max_level'] = 0
    mwf_logger.debug("info3=%s" % info)
    bread = [('Modular Forms', url_for('mf.modular_form_main_page')),
             ('Maass Forms', url_for('.render_maass_waveforms'))]
    info['bread'] = bread
    info['title'] = title
    maass_db.set_table()
    maass_db.table['ncols'] = 10
    info['DB'] = maass_db
    info['dbcount'] = maass_db.count()
    info['limit'] = maxNumberOfResultsToShow
    return render_template("mwf_navigate.html", **info)
Ejemplo n.º 5
0
def evs_table2(search, twodarray=False, limit=50, offset=0):
    r"""
    Returns an object containing the results of a search for Maass forms.
    """
    table = []
    nrows = 0
    fs = maass_db.get_Maass_forms(search, limit=limit, offset=offset)
    mwf_logger.debug("numrec:{0}".format(len(fs)))
    for f in fs:  # indices:
        row = {}
        R = f.get('Eigenvalue', None)
        N = f.get('Level', None)
        k = f.get('Weight', None)
        if R is None or N is None or k is None:
            continue
        row['R'] = R
        row['N'] = N
        if k == 0 or k == 1:
            row['k'] = int(k)
        else:
            row['k'] = k
        ##
        chi = f.get('Character', 0)
        ## Now get the COnrey number.
        ## First the character
        if k == 0:
            url = url_for('characters.render_Dirichletwebpage',
                          modulus=N,
                          number=chi)
            s = "<a href={0}>{1}</a>".format(url, chi)
            row['ch'] = s
        else:
            row['ch'] = "eta"
        st = f.get('Symmetry', -1)
        if st == 1:
            st = "odd"
        elif st == 0:
            st = "even"
        else:
            st = "n/a"
        row['symmetry'] = st
        er = f.get('Error', 0)
        if er > 0:
            er = "{0:1.0e}".format(float(er))
        else:
            er = "unknown"
        row['err'] = er
        dim = f.get('Dim', 0)
        if dim is None:
            dim = 1  # "undefined"
        row['dim'] = dim
        numc = f.get('Numc', 0)
        row['numc'] = numc
        cev = f.get('Cusp_evs', [])
        row['fricke'] = 'n/a'
        row['cuspevs'] = 'n/a'
        if row['k'] == 0 and isinstance(cev, list):
            if len(cev) > 1:
                fricke = cev[1]
                row['fricke'] = fricke
                s = '{0}'.format(cev[0])
                for j in range(1, len(cev)):
                    s += ",{0}".format(cev[j])
            elif len(cev) == 1:
                s = str(cev[0])
            elif len(cev) == 0:
                s = 'n/a'
            row['cuspevs'] = s

        url = url_for('mwf.render_one_maass_waveform',
                      maass_id=f.get('maass_id'))
        row['url'] = url
        nrows += 1
        if twodarray:
            s = '<a href="{0}">{1}</a>'.format(row['url'], row['R'])
            rowr = [
                row['N'], row['k'], row['ch'], s, row['symmetry'], row['err'],
                row['dim'], row['numc'], row['fricke'], row['cuspevs']
            ]
            table.append(rowr)
        else:
            # row=row.values()
            table.append(row)
    mwf_logger.debug("nrows:".format(nrows))
    evs = {'table': {}}
    evs['table']['data'] = table
    evs['table']['nrows'] = nrows
    evs['table']['ncols'] = 10
    evs['table']['colheads'] = []
    knowls = [
        'mf.maass.mwf.level', 'mf.maass.mwf.weight', 'mf.maass.mwf.character',
        'mf.maass.mwf.eigenvalue', 'mf.maass.mwf.symmetry',
        'mf.maass.mwf.precision', 'mf.maass.mwf.dimension',
        'mf.maass.mwf.ncoefficients', 'cmf.fricke', 'cmf.atkin-lehner'
    ]
    titles = [
        'Level', 'Weight', 'Char', 'Eigenvalue', 'Symmetry', 'Precision',
        'Mult.', 'Coeff.', 'Fricke', 'Atkin-Lehner'
    ]
    for i in range(10):
        evs['table']['colheads'].append((knowls[i], titles[i]))
    if 'limit' in search:
        search.pop('limit')
    if 'skip' in search:
        search.pop('skip')
    evs['totalrecords'] = maass_db.count(search)
    evs['totalrecords_filtered'] = len(fs)

    return evs
Ejemplo n.º 6
0
def render_one_maass_waveform_wp(info, prec=9):
    r"""
    Render the webpage of one Maass waveform.

    The precision kwarg `prec` is passed to the coefficient table, and
    indicates to round to 0 when the difference is less than 1e-`prec`.
    """
    info["check"] = []
    maass_id = info['maass_id']
    mwf_logger.debug("id1={0}".format(maass_id))
    try:
        MF = WebMaassForm(maass_id)
    except KeyError:
        return flask.abort(404)
    info['MF'] = MF
    info['title'] = "Maass Form"
    info['bread'] = [('Modular Forms', url_for('mf.modular_form_main_page')),
                     ('Maass Forms', url_for('.render_maass_waveforms'))]
    if hasattr(MF, 'level'):
        info['bread'].append(('Level {0}'.format(MF.level),
                              url_for('.render_maass_waveforms',
                                      level=MF.level)))
        info['title'] += r" on \(\Gamma_{0}( %s )\)" % info['MF'].level
        if hasattr(MF, 'R') and MF.R:
            info['title'] += r" with \(R=%s\)" % info['MF'].R

    # make sure all the expected attributes of a WebMaassForm are actually present
    missing = [
        attr for attr in ['level', 'dim', 'num_coeff', 'R', 'character']
        if not hasattr(MF, attr)
    ]
    if missing:
        mwf_logger.critical(
            "Unable to render Maass form {0}; required attributes {1} missing from database record."
            .format(maass_id, missing))
        info['explain'] = "Unable to render Maass form {0} because the following required attributes were missing from the database record:".format(maass_id) \
                      + "<ul>" + "".join(["<li>"+attr+"</li>" for attr in missing]) + "</ul>"
        return render_template("problem.html", **info)

    level = info['MF'].level
    dim = info['MF'].dim
    # numc = info['MF'].num_coeff # never used
    # if info['MF'].has_plot(): # and level == 1: # Bara level = 1 har rätt format för tillfället //Lemurell
    #    info['plotlink'] = url_for('mwf.plot_maassform', maass_id=maass_id)
    # Create the link to the L-function (put in '/L' at the beginning and '/' before '?'
    Llink = "/L" + url_for('mwf.render_one_maass_waveform',
                           maass_id=maass_id)  # + '/?db=' + info['db']
    if dim == 1:
        info["friends"] = [("L-function", Llink)]

    # Navigation to previous and next form
    # next_form_id = info['MF'].next_maassform_id()
    # if next_form_id:
    #    next_data = ('next', r"$f_{\text next}$", url_for('mwf.render_one_maass_waveform', maass_id = next_form_id) )
    # else:
    #    next_data = ('','','')
    # prev_form_id = info['MF'].prev_maassform_id()
    # if prev_form_id:
    #    prev_data = ('previous', r"$f_{\text prev}$", url_for('mwf.render_one_maass_waveform', maass_id = prev_form_id) )
    # else:
    #    prev_data = ('','','')

    # info['navi'] = ( prev_data, next_data )

    info["downloads"] = [('All stored data of the form',
                          url_for('mwf.render_one_maass_waveform',
                                  maass_id=maass_id,
                                  download='all')),
                         ('All coefficients of the form',
                          url_for('mwf.render_one_maass_waveform',
                                  maass_id=maass_id,
                                  download='coefficients'))]
    mwf_logger.debug("count={0}".format(maass_db.count()))
    ch = info['MF'].character
    s = r"\( \chi_{" + str(level) + "}(" + str(ch) + r",\cdot) \)"
    # Q: Is it possible to get the knowls into the properties?
    # A: Not in a nice way and this is not done elsewhere in the LMFDB; the knowls should appear on labels in the template
    # knowls = {'level': 'mf.maass.mwf.level',
    #                   'weight': 'mf.maass.mwf.weight',
    #                   'char': 'mf.maass.mwf.character',
    #                   'R': 'mf.maass.mwf.eigenvalue',
    #                   'sym': 'mf.maass.mwf.symmetry',
    #                   'prec': 'mf.maass.mwf.precision',
    #                   'mult': 'mf.maass.mwf.dimension',
    #                   'ncoeff': 'mf.maass.mwf.ncoefficients',
    #                   'fricke': 'cmf.fricke',
    #                   'atkinlehner': 'cmf.atkin-lehner'}
    properties = [
        ('Level', [info['MF'].level]),
        ('Symmetry', [info['MF'].even_odd()]),
        ('Weight', [info['MF'].the_weight()]),
        ('Character', [s]),
        ('Multiplicity', [dim]),
        ('Precision', [info['MF'].precision()]),
        ('Fricke Eigenvalue', [info['MF'].fricke()]),
        ('Atkin-Lehner Eigenvalues', [info['MF'].atkinlehner()]),
    ]
    if dim > 1 and info['MF'].the_character() == "trivial":
        properties.append(("Possibly oldform", []))
    info['properties'] = properties

    # The precision in set_table indicates which coefficients to set to zero.
    # For instance, if the imaginary part is less than the precision in
    # absolute value, then it is set to 0 in set_table.
    # The value 1e-9 is chosen arbitrarily, as recommended in issue #2076.
    info['MF'].set_table(prec=prec)
    cols = [{
        "aaSorting": "asc",
        "sWidth": "10%",
        "bSortable": "true",
        "bSearchable": "false",
        "sType": "numeric"
    }]
    negc = info['MF'].table.get('negc', 0)
    for j in range(dim):
        if not negc:
            col = {
                "bSortable": "false",
                "bSearchable": "true",
                "sClass": "alignLeft",
                "fnRender": "text-align:left",
                "sType": "numeric"
            }
            cols.append(col)
        else:
            col1 = {
                "bSortable": "false",
                "bSearchable": "true",
                "sClass": "alignLeft",
                "fnRender": "text-align:left",
                "sType": "numeric"
            }
            col2 = {
                "bSortable": "false",
                "bSearchable": "true",
                "sClass": "alignLeft",
                "fnRender": "text-align:left",
                "sType": "numeric"
            }
            cols.append(col1)
            cols.append(col2)
    info['credit'] = info['MF'].contributor_name
    info['coeff_aoColumns'] = cols  # json.dumps(cols)
    mwf_logger.debug("col={0}".format(cols))
    return render_template("mwf_one_form.html", **info)
Ejemplo n.º 7
0
def render_maass_waveforms(level=0,
                           weight=-1,
                           character=-1,
                           r1=0,
                           r2=0,
                           **kwds):
    info = get_args_mwf(level=level,
                        weight=weight,
                        character=character,
                        r1=r1,
                        r2=r2,
                        **kwds)

    info["credit"] = ""
    info["learnmore"] = []
    mwf_logger.debug("args=%s" % request.args)
    mwf_logger.debug("method=%s" % request.method)
    mwf_logger.debug("req.form=%s" % request.form)
    mwf_logger.debug("info=%s" % info)
    mwf_logger.debug("level,weight,char={0},{1},{2}".format(
        level, weight, character))
    if info.get('maass_id', None) and info.get('db', None):
        return render_one_maass_waveform_wp(**info)
    if info['search'] or (info['browse'] and int(info['weight']) != 0):
        search = get_search_parameters(info)
        mwf_logger.debug("search=%s" % search)
        return render_search_results_wp(info, search)
    if info['browse']:
        mwf_logger.debug("browse info=%s" % info)
        return render_browse_all_eigenvalues(**info)

    info['cur_character'] = character
    if level > 0:
        info['maass_weight'] = maass_db.weights(int(level))
        info['cur_level'] = level

    if weight > -1:
        info['cur_weight'] = weight
        if level > 0:
            info['maass_character'] = maass_db.characters(
                int(level), float(weight))
    if character > -1:
        info['cur_character'] = character

    if level > 0 or weight > -1 or character > -1:
        search = get_search_parameters(info)
        mwf_logger.debug("info=%s" % info)
        mwf_logger.debug("search=%s" % search)
        return render_search_results_wp(info, search)
    title = 'Maass Forms'
    info['list_of_levels'] = maass_db.levels()
    if info['list_of_levels']:
        info['max_level'] = max(info['list_of_levels'])
    else:
        info['max_level'] = 0
    mwf_logger.debug("info3=%s" % info)
    bread = [('Modular Forms', url_for('mf.modular_form_main_page')),
             ('Maass Forms', url_for('.render_maass_waveforms'))]
    info['bread'] = bread
    info['title'] = title
    maass_db.set_table()
    maass_db.table['ncols'] = 10
    info['DB'] = maass_db
    info['dbcount'] = maass_db.count()
    info['limit'] = maxNumberOfResultsToShow
    return render_template("mwf_navigate.html", **info)
Ejemplo n.º 8
0
 def set_table(self, data={}):
     # data = maass_db.get_search_parameters(data,kwds
     mwf_logger.debug("set table, data =  {0}".format(data))
     mwf_logger.debug("skip= {0}".format(self.skip))
     mwf_logger.debug("limit= {0}".format(self.limit))
     self.table = []
     data['skip'] = self.skip
     data['limit'] = self.limit
     l1 = self.keys.index('Level')
     level_ll = (self.skip[l1]) * self.limit[l1]
     level_ul = (self.skip[l1] + 1) * self.limit[l1]
     ev_limit = self.limit[self.keys.index('Eigenvalue')]
     ev_skip = self.skip[self.keys.index('Eigenvalue')] * ev_limit
     new_cols = []
     levels = maass_db.levels()
     mwf_logger.debug("levels= {0}".format(levels))
     cur_level = data.get('level', None)
     cur_wt = data.get('weight', None)
     print("cur_level=", cur_level)
     print("cur_wt=", cur_wt)
     for N in levels:
         if cur_level and cur_level != N:
             continue
         N = int(N)
         if N < level_ll or N > level_ul:
             continue
         print("N=", N)
         weights = maass_db.weights(N)
         print("weights=", weights)
         self.wt = weights
         for k in weights:
             if cur_wt is not None and cur_wt != k:
                 continue
             print("k=", k)
             k = int(k)
             evs = []
             query = {'Level': N, 'Weight': k}
             totalc = maass_db.count(query)
             finds = maass_db.get_Maass_forms(query,
                                              limit=ev_limit,
                                              offset=ev_skip)
             for rec in finds:
                 row = {}
                 maass_id = rec.get('_id', None)
                 row['R'] = rec.get('Eigenvalue', None)
                 row['st'] = rec.get("Symmetry")
                 row['cusp_evs'] = rec.get("Cusp_evs")
                 row['err'] = rec.get('Error', 0)
                 row['url'] = url_for('mwf.render_one_maass_waveform',
                                      maass_id=maass_id)
                 row['numc'] = rec.get('Numc', 0)
                 evs.append(row)
             kmax = int(totalc / ev_limit)
             paging = []
             for j in range(ev_skip, kmax):
                 k0 = (j) * ev_limit
                 k1 = (j + 1) * ev_limit
                 url = url_for('mwf.render_maass_waveforms',
                               level=N,
                               weight=k,
                               skip=ev_skip + j,
                               limit=ev_limit)
                 skip = {
                     'url': url,
                     'k0': k0,
                     'k1': k1,
                     'cur_skip': ev_skip,
                     'cur_limit': ev_limit,
                     "skip": j
                 }
                 paging.append(skip)
             # s+="]"
             self.paging = paging
             smalltbl = {'N': N, 'k': k, 'evs': evs, 'paging': paging}
             if len(evs) > 0:
                 self.table.append(smalltbl)
     print("table=", self.table)
     self.cols = new_cols
Ejemplo n.º 9
0
 def set_table(self, data={}):
     # data = maass_db.get_search_parameters(data,kwds
     mwf_logger.debug("set table, data =  {0}".format(data))
     mwf_logger.debug("skip= {0}".format(self.skip))
     mwf_logger.debug("limit= {0}".format(self.limit))
     self.table = []
     data['skip'] = self.skip
     data['limit'] = self.limit
     l1 = self.keys.index('Level')
     level_ll = (self.skip[l1]) * self.limit[l1]
     level_ul = (self.skip[l1] + 1) * self.limit[l1]
     ev_limit = self.limit[self.keys.index('Eigenvalue')]
     ev_skip = self.skip[self.keys.index('Eigenvalue')] * ev_limit
     new_cols = []
     levels = maass_db.levels()
     mwf_logger.debug("levels= {0}".format(levels))
     cur_level = data.get('level', None)
     cur_wt = data.get('weight', None)
     print "cur_level=", cur_level
     print "cur_wt=", cur_wt
     for N in levels:
         if cur_level and cur_level != N:
             continue
         N = int(N)
         if N < level_ll or N > level_ul:
             continue
         print "N=", N
         weights = maass_db.weights(N)
         print "weights=", weights
         self.wt = weights
         for k in weights:
             if cur_wt is not None and cur_wt != k:
                 continue
             print "k=", k
             k = int(k)
             evs = []
             query = {'Level': N, 'Weight': k}
             totalc = maass_db.count(query)
             finds = maass_db.get_Maass_forms(query, limit=ev_limit, offset=ev_skip)
             for rec in finds:
                 row = {}
                 maass_id = rec.get('_id', None)
                 row['R'] = rec.get('Eigenvalue', None)
                 row['st'] = rec.get("Symmetry")
                 row['cusp_evs'] = rec.get("Cusp_evs")
                 row['err'] = rec.get('Error', 0)
                 row['url'] = url_for('mwf.render_one_maass_waveform', maass_id=maass_id)
                 row['numc'] = rec.get('Numc', 0)
                 evs.append(row)
             kmax = int(totalc / ev_limit)
             paging = []
             for j in range(ev_skip, kmax):
                 k0 = (j) * ev_limit
                 k1 = (j + 1) * ev_limit
                 url = url_for(
                     'mwf.render_maass_waveforms', level=N, weight=k, skip=ev_skip + j, limit=ev_limit)
                 skip = {'url': url, 'k0': k0, 'k1': k1, 'cur_skip': ev_skip,
                         'cur_limit': ev_limit, "skip": j}
                 paging.append(skip)
             # s+="]"
             self.paging = paging
             smalltbl = {'N': N, 'k': k, 'evs': evs, 'paging': paging}
             if len(evs) > 0:
                 self.table.append(smalltbl)
     print "table=", self.table
     self.cols = new_cols
Ejemplo n.º 10
0
def evs_table2(search, twodarray=False, limit=50, offset=0):
    r"""
    Returns an object containing the results of a search for Maass forms.
    """
    table = []
    nrows = 0
    fs = maass_db.get_Maass_forms(search, limit=limit, offset=offset)
    mwf_logger.debug("numrec:{0}".format(len(fs)))
    for f in fs:  # indices:
        row = {}
        R = f.get('Eigenvalue', None)
        N = f.get('Level', None)
        k = f.get('Weight', None)
        if R is None or N is None or k is None:
            continue
        row['R'] = R
        row['N'] = N
        if k == 0 or k == 1:
            row['k'] = int(k)
        else:
            row['k'] = k
        ##
        chi = f.get('Character', 0)
        ## Now get the COnrey number.
        ## First the character
        if k == 0:
            url = url_for('characters.render_Dirichletwebpage', modulus=N, number=chi)
            s = "<a href={0}>{1}</a>".format(url, chi)
            row['ch'] = s
        else:
            row['ch'] = "eta"
        st = f.get('Symmetry', -1)
        if st == 1:
            st = "odd"
        elif st == 0:
            st = "even"
        else:
            st = "n/a"
        row['symmetry'] = st
        er = f.get('Error', 0)
        if er > 0:
            er = "{0:1.0e}".format(float(er))
        else:
            er = "unknown"
        row['err'] = er
        dim = f.get('Dim', 0)
        if dim is None:
            dim = 1  # "undefined"
        row['dim'] = dim
        numc = f.get('Numc', 0)
        row['numc'] = numc
        cev = f.get('Cusp_evs', [])
        row['fricke'] = 'n/a'
        row['cuspevs'] = 'n/a'
        if row['k'] == 0 and isinstance(cev, list):
            if len(cev) > 1:
                fricke = cev[1]
                row['fricke'] = fricke
                s = '{0}'.format(cev[0])
                for j in range(1, len(cev)):
                    s += ",{0}".format(cev[j])
            elif len(cev) == 1:
                s = str(cev[0])
            elif len(cev) == 0:
                s = 'n/a'
            row['cuspevs'] = s

        url = url_for('mwf.render_one_maass_waveform', maass_id=f.get('maass_id'))
        row['url'] = url
        nrows += 1
        if twodarray:
            s = '<a href="{0}">{1}</a>'.format(row['url'], row['R'])
            rowr = [row['N'], row['k'], row['ch'], s,
                    row['symmetry'], row['err'], row['dim'], row['numc'],
                    row['fricke'], row['cuspevs']]
            table.append(rowr)
        else:
            # row=row.values()
            table.append(row)
    mwf_logger.debug("nrows:".format(nrows))
    evs = {'table': {}}
    evs['table']['data'] = table
    evs['table']['nrows'] = nrows
    evs['table']['ncols'] = 10
    evs['table']['colheads'] = []
    knowls = ['mf.maass.mwf.level', 'mf.maass.mwf.weight', 'mf.maass.mwf.character',
              'mf.maass.mwf.eigenvalue', 'mf.maass.mwf.symmetry',
              'mf.maass.mwf.precision', 'mf.maass.mwf.dimension',
              'mf.maass.mwf.ncoefficients', 'mf.maass.mwf.fricke',
              'mf.maass.mwf.atkinlehner']
    titles = ['Level', 'Weight', 'Char',
              'Eigenvalue', 'Symmetry',
              'Precision', 'Mult.',
              'Coeff.', 'Fricke', 'Atkin-Lehner']
    for i in range(10):
        evs['table']['colheads'].append((knowls[i], titles[i]))
    if 'limit' in search:
        search.pop('limit')
    if 'skip' in search:
        search.pop('skip')
    evs['totalrecords'] = maass_db.count(search)
    evs['totalrecords_filtered'] = len(fs)

    return evs
Ejemplo n.º 11
0
def render_one_maass_waveform_wp(info, prec=9):
    r"""
    Render the webpage of one Maass waveform.

    The precision kwarg `prec` is passed to the coefficient table, and
    indicates to round to 0 when the difference is less than 1e-`prec`.
    """
    info["check"] = []
    maass_id = info['maass_id']
    mwf_logger.debug("id1={0}".format(maass_id))
    try:
        MF = WebMaassForm(maass_id)
    except KeyError:
        return flask.abort(404)
    info['MF'] = MF
    info['title'] = "Maass Form"
    info['bread'] = [('Modular Forms', url_for('mf.modular_form_main_page')),
                     ('Maass Waveforms', url_for('.render_maass_waveforms'))]
    if hasattr(MF,'level'):
        info['bread'].append(('Level {0}'.format(MF.level), url_for('.render_maass_waveforms', level=MF.level)))
        info['title'] += " on \(\Gamma_{0}( %s )\)" % info['MF'].level
        if hasattr(MF, 'R') and MF.R:
            info['title'] += " with \(R=%s\)" % info['MF'].R

    # make sure all the expected attributes of a WebMaassForm are actually present
    missing = [attr for attr in ['level', 'dim', 'num_coeff', 'R', 'character'] if not hasattr(MF, attr)]
    if missing:
        mwf_logger.critical("Unable to render Maass form {0}; required attributes {1} missing from database record.".format(maass_id,missing))
        info['explain'] = "Unable to render Maass form {0} because the following required attributes were missing from the database record:".format(maass_id) \
                      + "<ul>" + "".join(["<li>"+attr+"</li>" for attr in missing]) + "</ul>"
        return render_template("problem.html", **info)

    level = info['MF'].level
    dim = info['MF'].dim
    # numc = info['MF'].num_coeff # never used
    # if info['MF'].has_plot(): # and level == 1: # Bara level = 1 har rätt format för tillfället //Lemurell
    #    info['plotlink'] = url_for('mwf.plot_maassform', maass_id=maass_id)
    # Create the link to the L-function (put in '/L' at the beginning and '/' before '?'
    Llink = "/L" + url_for('mwf.render_one_maass_waveform', maass_id=maass_id)  # + '/?db=' + info['db']
    if dim == 1:
        info["friends"] = [("L-function", Llink)]

    # Navigation to previous and next form
    next_form_id = info['MF'].next_maassform_id()
    if next_form_id:
        next_data = ('next', r"$f_{\text next}$", url_for('mwf.render_one_maass_waveform',
                                                                maass_id = next_form_id) )
    else:
        next_data = ('','','')
    prev_form_id = info['MF'].prev_maassform_id()
    if prev_form_id:
        prev_data = ('previous', r"$f_{\text prev}$", url_for('mwf.render_one_maass_waveform',
                                                                maass_id = prev_form_id) )
    else:
        prev_data = ('','','')

    info['navi'] = ( prev_data, next_data )

    info["downloads"] = [ ('All stored data of the form',
                           url_for('mwf.render_one_maass_waveform', maass_id=maass_id,
                                   download='all')),
                          ('All coefficients of the form',
                           url_for('mwf.render_one_maass_waveform', maass_id=maass_id,
                                   download='coefficients')) ]
    mwf_logger.debug("count={0}".format(maass_db.count()))
    ch = info['MF'].character
    s = "\( \chi_{" + str(level) + "}(" + str(ch) + ",\cdot) \)"
    # Q: Is it possible to get the knowls into the properties?
    # A: Not in a nice way and this is not done elsewhere in the LMFDB; the knowls should appear on labels in the template
    # knowls = {'level': 'mf.maass.mwf.level',
    #                   'weight': 'mf.maass.mwf.weight',
    #                   'char': 'mf.maass.mwf.character',
    #                   'R': 'mf.maass.mwf.eigenvalue',
    #                   'sym': 'mf.maass.mwf.symmetry',
    #                   'prec': 'mf.maass.mwf.precision',
    #                   'mult': 'mf.maass.mwf.dimension',
    #                   'ncoeff': 'mf.maass.mwf.ncoefficients',
    #                   'fricke': 'mf.maass.mwf.fricke',
    #                   'atkinlehner': 'mf.maass.mwf.atkinlehner'}
    properties = [('Level', [info['MF'].level]),
                  ('Symmetry', [info['MF'].even_odd()]),
                  ('Weight', [info['MF'].the_weight()]),
                  ('Character', [s]),
                  ('Multiplicity', [dim]),
                  ('Precision', [info['MF'].precision()]),
                  ('Fricke Eigenvalue', [info['MF'].fricke()]),
                  ('Atkin-Lehner Eigenvalues', [info['MF'].atkinlehner()]),
                  ]
    if dim > 1 and info['MF'].the_character() == "trivial":
        properties.append(("Possibly oldform", []))
    info['properties2'] = properties

    # The precision in set_table indicates which coefficients to set to zero.
    # For instance, if the imaginary part is less than the precision in
    # absolute value, then it is set to 0 in set_table.
    # The value 1e-9 is chosen arbitrarily, as recommended in issue #2076.
    info['MF'].set_table(prec=prec)
    cols = [{"aaSorting": "asc", "sWidth": "10%", "bSortable": "true", "bSearchable": "false",
             "sType": "numeric"}]
    negc = info['MF'].table.get('negc', 0)
    for j in range(dim):
        if not negc:
            col = {"bSortable": "false", "bSearchable": "true", "sClass": "alignLeft",
                   "fnRender": "text-align:left", "sType": "numeric"}
            cols.append(col)
        else:
            col1 = {"bSortable": "false", "bSearchable": "true", "sClass": "alignLeft",
                    "fnRender": "text-align:left", "sType": "numeric"}
            col2 = {"bSortable": "false", "bSearchable": "true", "sClass": "alignLeft",
                    "fnRender": "text-align:left", "sType": "numeric"}
            cols.append(col1)
            cols.append(col2)
    info['credit'] = info['MF'].contributor_name
    info['coeff_aoColumns'] = cols  # json.dumps(cols)
    mwf_logger.debug("col={0}".format(cols))
    return render_template("mwf_one_form.html", **info)
Ejemplo n.º 12
0
def render_maass_waveforms(level=0, weight=-1, character=-1, r1=0, r2=0, **kwds):
    info = get_args_mwf(level=level, weight=weight, character=character, r1=r1, r2=r2, **kwds)
    info["credit"] = ""
    info["learnmore"] = learnmore_list()
    mwf_logger.debug("args=%s" % request.args)
    mwf_logger.debug("method=%s" % request.method)
    mwf_logger.debug("req.form=%s" % request.form)
    mwf_logger.debug("info=%s" % info)
    mwf_logger.debug("level,weight,char={0},{1},{2}".format(level, weight, character))
    if info.get('maass_id', None) and info.get('db', None):
        return render_one_maass_waveform_wp(**info)
    if info['search'] or (info['browse'] and int(info['weight']) != 0):
        # This isn't the right place to do input validation, but it is easier to flash errors here (this is a hack to address issue #1820)
        if info.get('level_range'):
            if not re.match(POSINT_RE, info['level_range']):
                if "-" in info['level_range']:
                    info['level_range'] = "..".join(info['level_range'].split("-"))
                if not re.match(POSINT_RANGE_RE, info['level_range']):
                    flash_error("%s is not a level, please specify a positive integer <span style='color:black'>n</span> or postivie integer range <span style='color:black'>m..n</span>.", info['level_range'])
                    return render_template('mwf_navigate.html', **info)
        if info['character'] != -1:
            try:
                N = int(info.get('level_range','0'))
            except:
                flash_error("Character %s cannot be specified in combination with a range of levels.", info['character'])
                return render_template('mwf_navigate.html', **info)
            if not re.match(r'^[1-9][0-9]*\.[1-9][0-9]*$', info['character']):
                flash_error("%s is not a valid label for a Dirichlet character.  It should be of the form <span style='color:black'>q.n</span>, where q and n are coprime positive integers with n < q, or q=n=1.", info['character'])
                return render_template('mwf_navigate.html', **info)
            s = info['character'].split('.')
            q,n = int(s[0]), int(s[1])
            if n > q or gcd(q,n) != 1 or (N > 0 and q != N):
                flash_error("%s is not a valid label for a Dirichlet character.  It should be of the form <span style='color:black'>q.n</span>, where q and n are coprime positive integers with n < q, or q=n=1.", info['character'])
                return render_template('mwf_navigate.html', **info)
            info['level_range'] = str(q)
            info['character'] = str(n)
        if info['weight'] != -1:
            if not re.match(INT_RE, info['weight']):
                flash_error("%s is not a valid weight.  It should be a nonnegative integer.", info['weight'])
                return render_template('mwf_navigate.html', **info)
        if info.get('ev_range'):
            if not re.match(FLOAT_RE,info['ev_range']):
                if "-" in info['ev_range']:
                    info['ev_range'] = "..".join(info['ev_range'].split("-"))
                s = info['ev_range'].split("..")
                if len(s) != 2:
                    flash_error("%s is not a valid eigenvalue range.  It should be postive real interval.", info['ev_range'])
                    return render_template('mwf_navigate.html', **info)
                if not re.match(FLOAT_RE,s[0]) or not re.match(FLOAT_RE,s[1]):
                    flash_error("%s is not a valid eigenvalue range.  It should be postive real interval.", info['ev_range'])
                    return render_template('mwf_navigate.html', **info)
        search = get_search_parameters(info)
        mwf_logger.debug("search=%s" % search)
        return render_search_results_wp(info, search)
    if info['browse']:
        mwf_logger.debug("browse info=%s" % info)
        return render_browse_all_eigenvalues(**info)

    info['cur_character'] = character
    if level > 0:
        info['maass_weight'] = maass_db.weights(int(level))
        info['cur_level'] = level

    if weight > -1:
        info['cur_weight'] = weight
        if level > 0:
            info['maass_character'] = maass_db.characters(int(level), float(weight))
    if character > - 1:
        info['cur_character'] = character

    if level > 0 or weight > -1 or character > -1:
        search = get_search_parameters(info)
        mwf_logger.debug("info=%s" % info)
        mwf_logger.debug("search=%s" % search)
        return render_search_results_wp(info, search)
    title = 'Maass Forms'
    info['list_of_levels'] = maass_db.levels()
    if info['list_of_levels']:
        info['max_level'] = max(info['list_of_levels'])
    else:
        info['max_level'] = 0
    mwf_logger.debug("info3=%s" % info)
    bread = [('Modular Forms', url_for('mf.modular_form_main_page')),
             ('Maass Forms', url_for('.render_maass_waveforms'))]
    info['bread'] = bread
    info['title'] = title
    maass_db.set_table()
    maass_db.table['ncols'] = 10
    info['DB'] = maass_db
    info['dbcount'] = maass_db.count()
    info['limit'] = maxNumberOfResultsToShow
    return render_template("mwf_navigate.html", **info)