def bianchi_modular_form_search(info, query): """Function to handle requests from the top page, either jump to one newform or do a search. """ for field in ['field_label', 'weight', 'level_norm', 'dimension']: if info.get(field): if field == 'weight': query['weight'] = info[field] elif field == 'field_label': parse_nf_string(info,query,field,'base number field',field) elif field == 'label': query[field] = info[field] elif field == 'dimension': query['dimension'] = int(info[field]) elif field == 'level_norm': query[field] = parse_range(info[field]) else: query[field] = info[field] if not 'sfe' in info: info['sfe'] = "any" elif info['sfe'] != "any": query['sfe'] = int(info['sfe']) if 'include_cm' in info: if info['include_cm'] == 'exclude': query['CM'] = 0 # will exclude NULL values elif info['include_cm'] == 'only': query['CM'] = {'$ne': 0} # will exclude NULL values if 'include_base_change' in info and info['include_base_change'] == 'off': query['bc'] = 0 else: info['include_base_change'] = "on"
def abelian_variety_search(info, query): parse_ints(info,query,'q',name='base field') parse_ints(info,query,'g',name='dimension') parse_bool(info,query,'simple',qfield='is_simp') parse_bool(info,query,'primitive',qfield='is_prim') parse_bool_unknown(info, query, 'jacobian', qfield='is_jac') parse_bool_unknown(info, query, 'polarizable', qfield='is_pp') parse_ints(info,query,'p_rank') parse_ints(info,query,'ang_rank') parse_newton_polygon(info,query,'newton_polygon',qfield='slps') parse_string_start(info,query,'initial_coefficients',qfield='poly_str',initial_segment=["1"]) parse_string_start(info,query,'abvar_point_count',qfield='A_cnts_str') parse_string_start(info,query,'curve_point_count',qfield='C_cnts_str',first_field='pt_cnt') if info.get('simple_quantifier') == 'contained': parse_subset(info,query,'simple_factors',qfield='simple_distinct',mode='subsets') elif info.get('simple_quantifier') == 'exactly': parse_subset(info,query,'simple_factors',qfield='simple_distinct',mode='exact') elif info.get('simple_quantifier') == 'include': parse_submultiset(info,query,'simple_factors',mode='append') for n in range(1,6): parse_ints(info,query,'dim%s_factors'%n) for n in range(1,4): parse_ints(info,query,'dim%s_distinct'%n) parse_nf_string(info,query,'number_field',qfield='nf') parse_galgrp(info,query,qfield=('galois_n','galois_t'))
def bianchi_modular_form_search(info, query): """Function to handle requests from the top page, either jump to one newform or do a search. """ for field in ['field_label', 'weight', 'level_norm', 'dimension']: if info.get(field): if field == 'weight': query['weight'] = info[field] elif field == 'field_label': parse_nf_string(info, query, field, 'base number field', field) elif field == 'label': query[field] = info[field] elif field == 'dimension': query['dimension'] = int(info[field]) elif field == 'level_norm': query[field] = parse_range(info[field]) else: query[field] = info[field] if not 'sfe' in info: info['sfe'] = "any" elif info['sfe'] != "any": query['sfe'] = int(info['sfe']) if 'include_cm' in info: if info['include_cm'] == 'exclude': query['CM'] = 0 # will exclude NULL values elif info['include_cm'] == 'only': query['CM'] = {'$ne': 0} # will exclude NULL values if 'include_base_change' in info and info['include_base_change'] == 'off': query['bc'] = 0 else: info['include_base_change'] = "on"
def elliptic_curve_search(info, query): parse_nf_string(info, query, 'field', name="base number field", qfield='field_label') if query.get('field_label') == '1.1.1.1': return redirect(url_for("ec.rational_elliptic_curves", **request.args), 301) parse_ints(info, query, 'conductor_norm') parse_noop(info, query, 'conductor_label') parse_ints(info, query, 'torsion', name='Torsion order', qfield='torsion_order') parse_bracketed_posints(info, query, 'torsion_structure', maxlength=2) if 'torsion_structure' in query and not 'torsion_order' in query: query['torsion_order'] = reduce( mul, [int(n) for n in query['torsion_structure']], 1) parse_ints(info, query, field='isodeg', qfield='isogeny_degrees') if 'jinv' in info: if info.get('field', '').strip() == '2.2.5.1': info['jinv'] = info['jinv'].replace('phi', 'a') if info.get('field', '').strip() == '2.0.4.1': info['jinv'] = info['jinv'].replace('i', 'a') parse_nf_elt(info, query, 'jinv', name='j-invariant') if query.get('jinv'): query['jinv'] = ','.join(query['jinv']) if 'include_isogenous' in info and info['include_isogenous'] == 'off': info['number'] = 1 query['number'] = 1 if 'include_base_change' in info: if info['include_base_change'] == 'off': query['base_change'] = [] if info['include_base_change'] == 'only': query['base_change'] = {'$ne': []} else: info['include_base_change'] = "on" if 'include_Q_curves' in info: if info['include_Q_curves'] == 'exclude': query['q_curve'] = False elif info['include_Q_curves'] == 'only': query['q_curve'] = True if 'include_cm' in info: if info['include_cm'] == 'exclude': query['cm'] = 0 elif info['include_cm'] == 'only': query['cm'] = {'$ne': 0} info['field_pretty'] = field_pretty info['web_ainvs'] = web_ainvs
def number_field_jump(info): query = {'label_orig': info['natural']} try: parse_nf_string(info,query,'natural',name="Label",qfield='label') return redirect(url_for(".by_label", label=query['label'])) except ValueError: query['err'] = info['err'] bread = [('Global Number Fields', url_for(".number_field_render_webpage")), ('Search Results', '.')] return search_input_error(query, bread)
def number_field_jump(info): query = {'label_orig': info['natural']} try: parse_nf_string(info, query, 'natural', name="Label", qfield='label') return redirect(url_for(".by_label", label=query['label'])) except ValueError: query['err'] = info['err'] bread = [('Global Number Fields', url_for(".number_field_render_webpage")), ('Search Results', '.')] return search_input_error(query, bread)
def abelian_variety_search(info, query): parse_ints(info,query,'q',name='base field') parse_ints(info,query,'g',name='dimension') if 'simple' in info: if info['simple'] == 'yes': query['is_simp'] = True elif info['simple'] == 'no': query['is_simp'] = False if 'primitive' in info: if info['primitive'] == 'yes': query['is_prim'] = True elif info['primitive'] == 'no': query['is_prim'] = False if 'jacobian' in info: jac = info['jacobian'] if jac == 'yes': query['is_jac'] = 1 elif jac == 'not_no': query['is_jac'] = {'$gt' : -1} elif jac == 'not_yes': query['is_jac'] = {'$lt' : 1} elif jac == 'no': query['is_jac'] = -1 if 'polarizable' in info: pol = info['polarizable'] if pol == 'yes': query['is_pp'] = 1 elif pol == 'not_no': query['is_pp'] = {'$gt' : -1} elif pol == 'not_yes': query['is_pp'] = {'$lt' : 1} elif pol == 'no': query['is_pp'] = -1 parse_ints(info,query,'p_rank') parse_ints(info,query,'ang_rank') parse_newton_polygon(info,query,'newton_polygon',qfield='slps') parse_string_start(info,query,'initial_coefficients',qfield='poly_str',initial_segment=["1"]) parse_string_start(info,query,'abvar_point_count',qfield='A_cnts_str') parse_string_start(info,query,'curve_point_count',qfield='C_cnts_str',first_field='pt_cnt') if info.get('simple_quantifier') == 'contained': parse_subset(info,query,'simple_factors',qfield='simple_distinct',mode='subsets') elif info.get('simple_quantifier') == 'exactly': parse_subset(info,query,'simple_factors',qfield='simple_distinct',mode='exact') elif info.get('simple_quantifier') == 'include': parse_submultiset(info,query,'simple_factors',mode='append') for n in range(1,6): parse_ints(info,query,'dim%s_factors'%n) for n in range(1,4): parse_ints(info,query,'dim%s_distinct'%n) parse_nf_string(info,query,'number_field',qfield='nf') parse_galgrp(info,query,qfield=('galois_n','galois_t'))
def elliptic_curve_search(info, query): parse_nf_string(info,query,'field',name="base number field",qfield='field_label') if query.get('field_label') == '1.1.1.1': return redirect(url_for("ec.rational_elliptic_curves", **request.args), 301) parse_ints(info,query,'conductor_norm') parse_noop(info,query,'conductor_label') parse_ints(info,query,'torsion',name='Torsion order',qfield='torsion_order') parse_bracketed_posints(info,query,'torsion_structure',maxlength=2) if 'torsion_structure' in query and not 'torsion_order' in query: query['torsion_order'] = reduce(mul,[int(n) for n in query['torsion_structure']],1) parse_ints(info,query,field='isodeg',qfield='isogeny_degrees') if 'jinv' in info: if info.get('field','').strip() == '2.2.5.1': info['jinv'] = info['jinv'].replace('phi','a') if info.get('field','').strip() == '2.0.4.1': info['jinv'] = info['jinv'].replace('i','a') parse_nf_elt(info,query,'jinv',name='j-invariant') if query.get('jinv'): query['jinv'] =','.join(query['jinv']) if 'include_isogenous' in info and info['include_isogenous'] == 'off': info['number'] = 1 query['number'] = 1 if 'include_base_change' in info: if info['include_base_change'] == 'off': query['base_change'] = [] if info['include_base_change'] == 'only': query['base_change'] = {'$ne':[]} else: info['include_base_change'] = "on" if 'include_Q_curves' in info: if info['include_Q_curves'] == 'exclude': query['q_curve'] = False elif info['include_Q_curves'] == 'only': query['q_curve'] = True if 'include_cm' in info: if info['include_cm'] == 'exclude': query['cm'] = 0 elif info['include_cm'] == 'only': query['cm'] = {'$ne' : 0} info['field_pretty'] = field_pretty info['web_ainvs'] = web_ainvs
def hilbert_modular_form_search(info, query): parse_nf_string(info,query,'field_label',name="Field") parse_ints(info,query,'deg', name='Field degree') parse_ints(info,query,'disc',name="Field discriminant") parse_ints(info,query,'dimension') parse_ints(info,query,'level_norm', name="Level norm") parse_hmf_weight(info,query,'weight',qfield=('parallel_weight','weight')) if 'cm' in info: if info['cm'] == 'exclude': query['is_CM'] = 'no' elif info['cm'] == 'only': query['is_CM'] = 'yes' if 'bc' in info: if info['bc'] == 'exclude': query['is_base_change'] = 'no' elif info['bc'] == 'only': query['is_base_change'] = 'yes'
def hilbert_modular_form_search(info, query): parse_nf_string(info, query, 'field_label', name="Field") parse_ints(info, query, 'deg', name='Field degree') parse_ints(info, query, 'disc', name="Field discriminant") parse_ints(info, query, 'dimension') parse_ints(info, query, 'level_norm', name="Level norm") parse_hmf_weight(info, query, 'weight', qfield=('parallel_weight', 'weight')) if 'cm' in info: if info['cm'] == 'exclude': query['is_CM'] = 'no' elif info['cm'] == 'only': query['is_CM'] = 'yes' if 'bc' in info: if info['bc'] == 'exclude': query['is_base_change'] = 'no' elif info['bc'] == 'only': query['is_base_change'] = 'yes'
def abelian_variety_search(info, query): parse_ints(info, query, 'q', name='base field') parse_ints(info, query, 'g', name='dimension') parse_bool(info, query, 'simple', qfield='is_simp') parse_bool(info, query, 'primitive', qfield='is_prim') parse_bool_unknown(info, query, 'jacobian', qfield='is_jac') parse_bool_unknown(info, query, 'polarizable', qfield='is_pp') parse_ints(info, query, 'p_rank') parse_ints(info, query, 'ang_rank') parse_newton_polygon(info, query, 'newton_polygon', qfield='slps') parse_string_start(info, query, 'initial_coefficients', qfield='poly_str', initial_segment=["1"]) parse_string_start(info, query, 'abvar_point_count', qfield='A_cnts_str') parse_string_start(info, query, 'curve_point_count', qfield='C_cnts_str', first_field='pt_cnt') if info.get('simple_quantifier') == 'contained': parse_subset(info, query, 'simple_factors', qfield='simple_distinct', mode='subsets') elif info.get('simple_quantifier') == 'exactly': parse_subset(info, query, 'simple_factors', qfield='simple_distinct', mode='exact') elif info.get('simple_quantifier') == 'include': parse_submultiset(info, query, 'simple_factors', mode='append') for n in range(1, 6): parse_ints(info, query, 'dim%s_factors' % n) for n in range(1, 4): parse_ints(info, query, 'dim%s_distinct' % n) parse_nf_string(info, query, 'number_field', qfield='nf') parse_galgrp(info, query, qfield=('galois_n', 'galois_t'))
def newform_parse(info, query): common_parse(info, query) parse_ints(info, query, 'dim', name="Dimension") parse_nf_string(info, query, 'nf_label', name="Coefficient field") parse_self_twist(info, query) parse_subset(info, query, 'cm_discs', name="CM discriminant", parse_singleton=lambda d: parse_discriminant(d, -1)) parse_subset(info, query, 'rm_discs', name="RM discriminant", parse_singleton=lambda d: parse_discriminant(d, 1)) parse_bool(info, query, 'is_twist_minimal') parse_bool_unknown(info, query, 'has_inner_twist') parse_ints(info, query, 'analytic_rank') parse_noop(info, query, 'atkin_lehner_string') parse_ints(info, query, 'fricke_eigenval') parse_bool_unknown(info, query, 'is_self_dual') parse_noop(info, query, 'projective_image') parse_noop(info, query, 'projective_image_type') parse_ints(info, query, 'artin_degree', name="Artin degree")
def hilbert_modular_form_search(**args): info = to_dict(args) # what has been entered in the search boxes if 'label' in info and info['label']: lab = info['label'].strip() info['label'] = lab try: split_full_label(lab) return hilbert_modular_form_by_label(lab) except ValueError: return redirect(url_for(".hilbert_modular_form_render_webpage")) query = {} try: parse_nf_string(info, query, 'field_label', name="Field") parse_ints(info, query, 'deg', name='Field degree') parse_ints(info, query, 'disc', name="Field discriminant") parse_ints(info, query, 'dimension') parse_ints(info, query, 'level_norm', name="Level norm") parse_hmf_weight(info, query, 'weight', qfield=('parallel_weight', 'weight')) except ValueError: return search_input_error() count = parse_count(info, 100) start = parse_start(info) info['query'] = dict(query) C = getDBConnection() res = C.hmfs.forms.find(query).sort([('deg', pymongo.ASCENDING), ('disc', pymongo.ASCENDING), ('level_norm', pymongo.ASCENDING), ('level_label', pymongo.ASCENDING), ('label_nsuffix', pymongo.ASCENDING) ]).skip(start).limit(count) nres = res.count() if (start >= nres): start -= (1 + (start - nres) / count) * count if (start < 0): start = 0 info['number'] = nres info['start'] = start info['more'] = int(start + count < nres) if nres == 1: info['report'] = 'unique match' else: if nres == 0: info['report'] = 'no matches' else: if nres > count or start != 0: info['report'] = 'displaying matches %s-%s of %s' % ( start + 1, min(nres, start + count), nres) else: info['report'] = 'displaying all %s matches' % nres res_clean = [] for v in res: v_clean = {} v_clean['field_label'] = v['field_label'] v_clean['short_label'] = v['short_label'] v_clean['label'] = v['label'] v_clean['level_ideal'] = teXify_pol(v['level_ideal']) v_clean['dimension'] = v['dimension'] res_clean.append(v_clean) info['forms'] = res_clean t = 'Hilbert Modular Form search results' bread = [('Hilbert Modular Forms', url_for(".hilbert_modular_form_render_webpage")), ('Search results', ' ')] properties = [] return render_template("hilbert_modular_form_search.html", info=info, title=t, credit=hmf_credit, properties=properties, bread=bread, learnmore=learnmore_list())
def elliptic_curve_search(info): if info.get('download') == '1' and info.get('Submit') and info.get( 'query'): return download_search(info) if not 'query' in info: info['query'] = {} bread = info.get('bread', [('Elliptic Curves', url_for(".index")), ('Search Results', '.')]) if 'jump' in info: label = info.get('label', '').replace(" ", "") # This label should be a full isogeny class label or a full # curve label (including the field_label component) try: nf, cond_label, iso_label, number = split_full_label(label.strip()) except ValueError: info['err'] = '' return search_input_error(info, bread) return redirect( url_for(".show_ecnf", nf=nf, conductor_label=cond_label, class_label=iso_label, number=number), 301) query = {} if 'jinv' in info: if info.get('field', '').strip() == '2.2.5.1': info['jinv'] = info['jinv'].replace('phi', 'a') if info.get('field', '').strip() == '2.0.4.1': info['jinv'] = info['jinv'].replace('i', 'a') try: parse_ints(info, query, 'conductor_norm') parse_noop(info, query, 'conductor_label') parse_nf_string(info, query, 'field', name="base number field", qfield='field_label') parse_nf_elt(info, query, 'jinv', name='j-invariant') parse_ints(info, query, 'torsion', name='Torsion order', qfield='torsion_order') parse_bracketed_posints(info, query, 'torsion_structure', maxlength=2) if 'torsion_structure' in query and not 'torsion_order' in query: query['torsion_order'] = reduce( mul, [int(n) for n in query['torsion_structure']], 1) parse_ints(info, query, field='isodeg', qfield='isogeny_degrees') except (TypeError, ValueError): return search_input_error(info, bread) if query.get('jinv'): query['jinv'] = ','.join(query['jinv']) if query.get('field_label') == '1.1.1.1': return redirect(url_for("ec.rational_elliptic_curves", **request.args), 301) if 'include_isogenous' in info and info['include_isogenous'] == 'off': info['number'] = 1 query['number'] = 1 if 'include_base_change' in info and info['include_base_change'] == 'off': query['base_change'] = [] else: info['include_base_change'] = "on" if 'include_Q_curves' in info: if info['include_Q_curves'] == 'exclude': query['q_curve'] = False elif info['include_Q_curves'] == 'only': query['q_curve'] = True if 'include_cm' in info: if info['include_cm'] == 'exclude': query['cm'] = 0 elif info['include_cm'] == 'only': query['cm'] = {'$ne': 0} info['query'] = query count = parse_count(info, 50) start = parse_start(info) # make the query and trim results according to start/count: cursor = db_ecnf().find(query) nres = cursor.count() if (start >= nres): start -= (1 + (start - nres) / count) * count if (start < 0): start = 0 res = cursor.sort([('field_label', ASC), ('conductor_norm', ASC), ('conductor_label', ASC), ('iso_nlabel', ASC), ('number', ASC)]).skip(start).limit(count) res = list(res) for e in res: e['numb'] = str(e['number']) e['field_knowl'] = nf_display_knowl(e['field_label'], getDBConnection(), field_pretty(e['field_label'])) info['curves'] = res # [ECNF(e) for e in res] info['number'] = nres info['start'] = start info['count'] = count info['more'] = int(start + count < nres) info['field_pretty'] = field_pretty info['web_ainvs'] = web_ainvs if nres == 1: info['report'] = 'unique match' else: if nres > count or start != 0: info['report'] = 'displaying matches %s-%s of %s' % ( start + 1, min(nres, start + count), nres) else: info['report'] = 'displaying all %s matches' % nres t = info.get('title', 'Elliptic Curve search results') return render_template("ecnf-search-results.html", info=info, credit=ecnf_credit, bread=bread, title=t)
def abelian_variety_search(**args): info = to_dict(args) if 'download' in info and info['download'] != 0: return download_search(info) bread = args.get('bread', get_bread(('Search Results', ' '))) if 'jump' in info: return by_label(info.get('label', '')) query = {} try: parse_ints(info, query, 'q') parse_ints(info, query, 'g') if 'simple' in info: if info['simple'] == 'yes': query['decomposition'] = {'$size': 1} query['decomposition.0.1'] = 1 elif info['simple'] == 'no': query['$or'] = [{ 'decomposition': { '$not': { '$size': 1 } } }, { 'decomposition.0.1': { '$gt': 1 } }] if 'primitive' in info: if info['primitive'] == 'yes': query['primitive_models'] = {'$size': 0} elif info['primitive'] == 'no': query['primitive_models'] = {'$not': {'$size': 0}} if 'jacobian' in info: if info['jacobian'] == 'yes': query['known_jacobian'] = 1 elif info['jacobian'] == 'no': query['known_jacobian'] = -1 else: info['jacobian'] = "any" if 'polarizable' in info: if info['polarizable'] == 'yes': query['principally_polarizable'] = 1 elif info['polarizable'] == 'no': query['principally_polarizable'] = -1 else: info['polarizable'] = "any" parse_ints(info, query, 'p_rank') parse_ints(info, query, 'angle_ranks') parse_newton_polygon(info, query, 'newton_polygon', qfield='slopes') parse_list_start(info, query, 'initial_coefficients', qfield='polynomial', index_shift=1) parse_list_start(info, query, 'abvar_point_count', qfield='A_counts', parse_singleton=str) parse_list_start(info, query, 'curve_point_count', qfield='C_counts', parse_singleton=str) parse_abvar_decomp(info, query, 'decomposition', av_stats=AbvarFqStats()) parse_nf_string(info, query, 'number_field') except ValueError: return search_input_error(info, bread) info['query'] = query count = parse_count(info, 50) start = parse_start(info) cursor = db().find(query) nres = cursor.count() if start >= nres: start -= (1 + (start - nres) / count) * count if start < 0: start = 0 #res = cursor.sort([]).skip(start).limit(count) res = cursor.skip(start).limit(count) res = list(res) info['abvars'] = [AbvarFq_isoclass(x) for x in res] info['number'] = nres info['start'] = start info['count'] = count info['more'] = int(start + count < nres) if nres == 1: info['report'] = 'unique match' elif nres == 0: info['report'] = 'no matches' elif nres > count or start != 0: info['report'] = 'displaying matches %s-%s of %s' % ( start + 1, min(nres, start + count), nres) else: info['report'] = 'displaying all %s matches' % nres t = 'Abelian Variety search results' return render_template("abvarfq-search-results.html", info=info, credit=abvarfq_credit, bread=bread, title=t)
def abelian_variety_search(**args): info = to_dict(args) if 'download' in info and info['download'] != 0: return download_search(info) bread = args.get('bread', get_bread(('Search Results', ' '))) if 'jump' in info: return by_label(info.get('label','')) query = {} try: parse_ints(info,query,'q',name='base field') parse_ints(info,query,'g',name='dimension') if 'simple' in info: if info['simple'] == 'yes': query['is_simp'] = True elif info['simple'] == 'no': query['is_simp'] = False if 'primitive' in info: if info['primitive'] == 'yes': query['is_prim'] = True elif info['primitive'] == 'no': query['is_prim'] = False if 'jacobian' in info: jac = info['jacobian'] if jac == 'yes': query['is_jac'] = 1 elif jac == 'not_no': query['is_jac'] = {'$gt' : -1} elif jac == 'not_yes': query['is_jac'] = {'$lt' : 1} elif jac == 'no': query['is_jac'] = -1 if 'polarizable' in info: pol = info['polarizable'] if pol == 'yes': query['is_pp'] = 1 elif pol == 'not_no': query['is_pp'] = {'$gt' : -1} elif pol == 'not_yes': query['is_pp'] = {'$lt' : 1} elif pol == 'no': query['is_pp'] = -1 parse_ints(info,query,'p_rank') parse_ints(info,query,'ang_rank') parse_newton_polygon(info,query,'newton_polygon',qfield='slps') # TODO parse_string_start(info,query,'initial_coefficients',qfield='poly',initial_segment=["1"]) parse_string_start(info,query,'abvar_point_count',qfield='A_cnts') parse_string_start(info,query,'curve_point_count',qfield='C_cnts',first_field='pt_cnt') parse_abvar_decomp(info,query,'decomposition',qfield='decomp',av_stats=AbvarFqStats()) parse_nf_string(info,query,'number_field',qfield='nf') parse_galgrp(info,query,qfield='gal') except ValueError: return search_input_error(info, bread) info['query'] = query count = parse_count(info, 50) start = parse_start(info) cursor = db().find(query) nres = cursor.count() if start >= nres: start -= (1 + (start - nres) / count) * count if start < 0: start = 0 res = cursor.sort([('sort', ASCENDING)]).skip(start).limit(count) res = list(res) info['abvars'] = [AbvarFq_isoclass(x) for x in res] info['number'] = nres info['start'] = start info['count'] = count info['more'] = int(start + count < nres) if nres == 1: info['report'] = 'unique match' elif nres == 0: info['report'] = 'no matches' elif nres > count or start != 0: info['report'] = 'displaying matches %s-%s of %s' %(start + 1, min(nres, start+count), nres) else: info['report'] = 'displaying all %s matches' % nres t = 'Abelian Variety search results' return render_template("abvarfq-search-results.html", info=info, credit=abvarfq_credit, bread=bread, title=t)
def number_field_search(**args): info = to_dict(args) info['learnmore'] = [('Global number field labels', url_for(".render_labels_page")), ('Galois group labels', url_for(".render_groups_page")), (Completename, url_for(".render_discriminants_page")), ('Quadratic imaginary class groups', url_for(".render_class_group_data"))] t = 'Global Number Field search results' bread = [('Global Number Fields', url_for(".number_field_render_webpage")), ('Search results', ' ')] # for k in info.keys(): # nf_logger.debug(str(k) + ' ---> ' + str(info[k])) # nf_logger.debug('******************* '+ str(info['search'])) if 'natural' in info: query = {'label_orig': info['natural']} try: parse_nf_string(info,query,'natural',name="Label",qfield='label') return redirect(url_for(".by_label", label= clean_input(query['label_orig']))) except ValueError: query['err'] = info['err'] return search_input_error(query, bread) query = {} try: parse_galgrp(info,query, qfield='galois') parse_ints(info,query,'degree') parse_bracketed_posints(info,query,'signature',split=False,exactlength=2) parse_signed_ints(info,query,'discriminant',qfield=('disc_sign','disc_abs_key'),parse_one=make_disc_key) parse_ints(info,query,'class_number') parse_bracketed_posints(info,query,'class_group',split=False,check_divisibility='increasing') parse_primes(info,query,'ur_primes',name='Unramified primes',qfield='ramps',mode='complement',to_string=True) # modes are now contained (in), exactly, include if 'ram_quantifier' in info and str(info['ram_quantifier']) == 'include': mode = 'append' parse_primes(info,query,'ram_primes','ramified primes','ramps',mode,to_string=True) elif 'ram_quantifier' in info and str(info['ram_quantifier']) == 'contained': parse_primes(info,query,'ram_primes','ramified primes','ramps_all','subsets',to_string=False) pass # build list else: mode = 'liststring' parse_primes(info,query,'ram_primes','ramified primes','ramps_all',mode) except ValueError: return search_input_error(info, bread) count = parse_count(info) start = parse_start(info) if info.get('paging'): try: paging = int(info['paging']) if paging == 0: start = 0 except: pass C = base.getDBConnection() # nf_logger.debug(query) info['query'] = dict(query) if 'lucky' in args: one = C.numberfields.fields.find_one(query) if one: label = one['label'] return redirect(url_for(".by_label", label=clean_input(label))) fields = C.numberfields.fields res = fields.find(query) res = res.sort([('degree', ASC), ('disc_abs_key', ASC),('disc_sign', ASC)]) if 'download' in info and info['download'] != '0': return download_search(info, res) nres = res.count() res = res.skip(start).limit(count) if(start >= nres): start -= (1 + (start - nres) / count) * count if(start < 0): start = 0 info['fields'] = res info['number'] = nres info['start'] = start if nres == 1: info['report'] = 'unique match' else: if nres > count or start != 0: info['report'] = 'displaying matches %s-%s of %s' % (start + 1, min(nres, start + count), nres) else: info['report'] = 'displaying all %s matches' % nres info['wnf'] = WebNumberField.from_data return render_template("number_field_search.html", info=info, title=t, bread=bread)
def elliptic_curve_search(**args): info = to_dict(args['data']) if 'download' in info and info['download'] != 0: return download_search(info) if not 'query' in info: info['query'] = {} bread = [('Elliptic Curves', url_for(".index")), ('Search Results', '.')] if 'jump' in info: label = info.get('label', '').replace(" ", "") # This label should be a full isogeny class label or a full # curve label (including the field_label component) try: nf, cond_label, iso_label, number = split_full_label(label.strip()) except ValueError: info['err'] = '' return search_input_error(info, bread) return show_ecnf(nf, cond_label, iso_label, number) query = {} try: parse_ints(info,query,'conductor_norm') parse_noop(info,query,'conductor_label') parse_nf_string(info,query,'field',name="base number field",qfield='field_label') parse_nf_elt(info,query,'jinv',name='j-invariant') parse_ints(info,query,'torsion',name='Torsion order',qfield='torsion_order') parse_bracketed_posints(info,query,'torsion_structure',maxlength=2) if 'torsion_structure' in query and not 'torsion_order' in query: query['torsion_order'] = reduce(mul,[int(n) for n in query['torsion_structure']],1) except ValueError: return search_input_error(info, bread) if 'include_isogenous' in info and info['include_isogenous'] == 'off': info['number'] = 1 query['number'] = 1 if 'include_base_change' in info and info['include_base_change'] == 'off': query['base_change'] = [] else: info['include_base_change'] = "on" if 'include_Q_curves' in info: if info['include_Q_curves'] == 'exclude': query['q_curve'] = False elif info['include_Q_curves'] == 'only': query['q_curve'] = True if 'include_cm' in info: if info['include_cm'] == 'exclude': query['cm'] = 0 elif info['include_cm'] == 'only': query['cm'] = {'$ne' : 0} info['query'] = query count = parse_count(info, 50) start = parse_start(info) # make the query and trim results according to start/count: cursor = db_ecnf().find(query) nres = cursor.count() if(start >= nres): start -= (1 + (start - nres) / count) * count if(start < 0): start = 0 res = cursor.sort([('field_label', ASC), ('conductor_norm', ASC), ('conductor_label', ASC), ('iso_nlabel', ASC), ('number', ASC)]).skip(start).limit(count) res = list(res) for e in res: e['numb'] = str(e['number']) e['field_knowl'] = nf_display_knowl(e['field_label'], getDBConnection(), field_pretty(e['field_label'])) info['curves'] = res # [ECNF(e) for e in res] info['number'] = nres info['start'] = start info['count'] = count info['more'] = int(start + count < nres) info['field_pretty'] = field_pretty info['web_ainvs'] = web_ainvs if nres == 1: info['report'] = 'unique match' else: if nres > count or start != 0: info['report'] = 'displaying matches %s-%s of %s' % (start + 1, min(nres, start + count), nres) else: info['report'] = 'displaying all %s matches' % nres t = 'Elliptic Curve search results' return render_template("ecnf-search-results.html", info=info, credit=ecnf_credit, bread=bread, title=t)
def bianchi_modular_form_search(**args): """Function to handle requests from the top page, either jump to one newform or do a search. """ info = to_dict(args) # what has been entered in the search boxes if 'label' in info: # The Label button has been pressed. return bianchi_modular_form_by_label(info['label']) query = {} for field in ['field_label', 'weight', 'level_norm', 'dimension']: if info.get(field): if field == 'weight': query['weight'] = info[field] elif field == 'field_label': parse_nf_string(info, query, field, 'base number field', field) elif field == 'label': query[field] = info[field] elif field == 'dimension': query['dimension'] = int(info[field]) elif field == 'level_norm': query[field] = parse_range(info[field]) else: query[field] = info[field] if not 'sfe' in info: info['sfe'] = "any" elif info['sfe'] != "any": query['sfe'] = int(info['sfe']) if 'include_cm' in info: if info['include_cm'] == 'exclude': query['CM'] = 0 elif info['include_cm'] == 'only': query['CM'] = {'$nin': [0, '?']} if 'include_base_change' in info and info['include_base_change'] == 'off': query['bc'] = 0 else: info['include_base_change'] = "on" start = 0 if 'start' in request.args: start = int(request.args['start']) count = 50 if 'count' in request.args: count = int(request.args['count']) info['query'] = dict(query) res = db_forms().find(query).sort([('level_norm', ASCENDING), ('label', ASCENDING) ]).skip(start).limit(count) nres = res.count() if nres > 0: info['field_pretty_name'] = field_pretty(res[0]['field_label']) else: info['field_pretty_name'] = '' info['number'] = nres if nres == 1: info['report'] = 'unique match' elif nres == 2: info['report'] = 'displaying both matches' else: if nres > count or start != 0: info['report'] = 'displaying items %s-%s of %s matches' % ( start + 1, min(nres, start + count), nres) else: info['report'] = 'displaying all %s matches' % nres res_clean = [] for v in res: v_clean = {} v_clean['field_label'] = v['field_label'] v_clean['short_label'] = v['short_label'] v_clean['level_label'] = v['level_label'] v_clean['label_suffix'] = v['label_suffix'] v_clean['label'] = v['label'] v_clean['level_ideal'] = teXify_pol(v['level_ideal']) v_clean['dimension'] = v['dimension'] v_clean['sfe'] = "+1" if v['sfe'] == 1 else "-1" v_clean['url'] = url_for('.render_bmf_webpage', field_label=v['field_label'], level_label=v['level_label'], label_suffix=v['label_suffix']) v_clean['bc'] = bc_info(v['bc']) v_clean['cm'] = cm_info(v['CM']) res_clean.append(v_clean) info['forms'] = res_clean info['count'] = count info['start'] = start info['more'] = int(start + count < nres) t = 'Bianchi modular form search results' bread = [('Bianchi Modular Forms', url_for(".index")), ('Search results', ' ')] properties = [] return render_template("bmf-search_results.html", info=info, title=t, properties=properties, bread=bread, learnmore=learnmore_list())
def number_field_search(**args): info = to_dict(args) info["learnmore"] = [ ("Global number field labels", url_for(".render_labels_page")), ("Galois group labels", url_for(".render_groups_page")), (Completename, url_for(".render_discriminants_page")), ("Quadratic imaginary class groups", url_for(".render_class_group_data")), ] t = "Global Number Field search results" bread = [("Global Number Fields", url_for(".number_field_render_webpage")), ("Search results", " ")] # for k in info.keys(): # nf_logger.debug(str(k) + ' ---> ' + str(info[k])) # nf_logger.debug('******************* '+ str(info['search'])) if "natural" in info: query = {"label_orig": info["natural"]} try: parse_nf_string(info, query, "natural", name="Label", qfield="label") return redirect(url_for(".by_label", label=clean_input(query["label"]))) except ValueError: query["err"] = info["err"] return search_input_error(query, bread) query = {} try: parse_galgrp(info, query, qfield="galois") parse_ints(info, query, "degree") parse_bracketed_posints(info, query, "signature", split=False, exactlength=2) parse_signed_ints(info, query, "discriminant", qfield=("disc_sign", "disc_abs_key"), parse_one=make_disc_key) parse_ints(info, query, "class_number") parse_bracketed_posints(info, query, "class_group", split=False, check_divisibility="increasing") parse_primes( info, query, "ur_primes", name="Unramified primes", qfield="ramps", mode="complement", to_string=True ) if "ram_quantifier" in info and str(info["ram_quantifier"]) == "some": mode = "append" else: mode = "exact" parse_primes(info, query, "ram_primes", "ramified primes", "ramps", mode, to_string=True) except ValueError: return search_input_error(info, bread) count = parse_count(info) start = parse_start(info) if info.get("paging"): try: paging = int(info["paging"]) if paging == 0: start = 0 except: pass C = base.getDBConnection() # nf_logger.debug(query) info["query"] = dict(query) if "lucky" in args: one = C.numberfields.fields.find_one(query) if one: label = one["label"] return redirect(url_for(".by_label", clean_input(label))) fields = C.numberfields.fields res = fields.find(query) if "download" in info and info["download"] != "0": return download_search(info, res) res = res.sort([("degree", ASC), ("disc_abs_key", ASC), ("disc_sign", ASC)]) nres = res.count() res = res.skip(start).limit(count) if start >= nres: start -= (1 + (start - nres) / count) * count if start < 0: start = 0 info["fields"] = res info["number"] = nres info["start"] = start if nres == 1: info["report"] = "unique match" else: if nres > count or start != 0: info["report"] = "displaying matches %s-%s of %s" % (start + 1, min(nres, start + count), nres) else: info["report"] = "displaying all %s matches" % nres info["wnf"] = WebNumberField.from_data return render_template("number_field_search.html", info=info, title=t, bread=bread)
def elliptic_curve_search(**args): info = to_dict(args["data"]) if "download" in info and info["download"] != 0: return download_search(info) if not "query" in info: info["query"] = {} bread = [("Elliptic Curves", url_for(".index")), ("Search Results", ".")] if "jump" in info: label = info.get("label", "").replace(" ", "") # This label should be a full isogeny class label or a full # curve label (including the field_label component) try: nf, cond_label, iso_label, number = split_full_label(label.strip()) except ValueError: info["err"] = "" return search_input_error(info, bread) return show_ecnf(nf, cond_label, iso_label, number) query = {} try: parse_ints(info, query, "conductor_norm") parse_noop(info, query, "conductor_label") parse_nf_string(info, query, "field", name="base number field", qfield="field_label") parse_nf_elt(info, query, "jinv", name="j-invariant") parse_ints(info, query, "torsion", name="Torsion order", qfield="torsion_order") parse_bracketed_posints(info, query, "torsion_structure", maxlength=2) if "torsion_structure" in query and not "torsion_order" in query: query["torsion_order"] = reduce(mul, [int(n) for n in query["torsion_structure"]], 1) except ValueError: return search_input_error(info, bread) if "include_isogenous" in info and info["include_isogenous"] == "off": info["number"] = 1 query["number"] = 1 if "include_base_change" in info and info["include_base_change"] == "off": query["base_change"] = [] else: info["include_base_change"] = "on" if "include_Q_curves" in info: if info["include_Q_curves"] == "exclude": query["q_curve"] = False elif info["include_Q_curves"] == "only": query["q_curve"] = True if "include_cm" in info: if info["include_cm"] == "exclude": query["cm"] = 0 elif info["include_cm"] == "only": query["cm"] = {"$ne": 0} info["query"] = query count = parse_count(info, 50) start = parse_start(info) # make the query and trim results according to start/count: cursor = db_ecnf().find(query) nres = cursor.count() if start >= nres: start -= (1 + (start - nres) / count) * count if start < 0: start = 0 res = ( cursor.sort( [ ("field_label", ASC), ("conductor_norm", ASC), ("conductor_label", ASC), ("iso_nlabel", ASC), ("number", ASC), ] ) .skip(start) .limit(count) ) res = list(res) for e in res: e["numb"] = str(e["number"]) e["field_knowl"] = nf_display_knowl(e["field_label"], getDBConnection(), field_pretty(e["field_label"])) info["curves"] = res # [ECNF(e) for e in res] info["number"] = nres info["start"] = start info["count"] = count info["more"] = int(start + count < nres) info["field_pretty"] = field_pretty info["web_ainvs"] = web_ainvs if nres == 1: info["report"] = "unique match" else: if nres > count or start != 0: info["report"] = "displaying matches %s-%s of %s" % (start + 1, min(nres, start + count), nres) else: info["report"] = "displaying all %s matches" % nres t = "Elliptic Curve search results" return render_template("ecnf-search-results.html", info=info, credit=ecnf_credit, bread=bread, title=t)
def number_field_search(info): info['learnmore'] = [ ('Global number field labels', url_for(".render_labels_page")), ('Galois group labels', url_for(".render_groups_page")), (Completename, url_for(".render_discriminants_page")), ('Quadratic imaginary class groups', url_for(".render_class_group_data")) ] t = 'Global Number Field search results' bread = [('Global Number Fields', url_for(".number_field_render_webpage")), ('Search results', ' ')] if 'natural' in info: query = {'label_orig': info['natural']} try: parse_nf_string(info, query, 'natural', name="Label", qfield='label') return redirect( url_for(".by_label", label=clean_input(query['label_orig']))) except ValueError: query['err'] = info['err'] return search_input_error(query, bread) if 'algebra' in info: fields = info['algebra'].split('_') fields2 = [WebNumberField.from_coeffs(a) for a in fields] for j in range(len(fields)): if fields2[j] is None: fields2[j] = WebNumberField.fakenf(fields[j]) t = 'Number field algebra' info = {} info = {'fields': fields2} return render_template("number_field_algebra.html", info=info, title=t, bread=bread) query = {} try: parse_galgrp(info, query, qfield='galois') parse_ints(info, query, 'degree') parse_bracketed_posints(info, query, 'signature', split=False, exactlength=2) parse_signed_ints(info, query, 'discriminant', qfield=('disc_sign', 'disc_abs_key'), parse_one=make_disc_key) parse_ints(info, query, 'class_number') parse_bracketed_posints(info, query, 'class_group', split=False, check_divisibility='increasing') parse_primes(info, query, 'ur_primes', name='Unramified primes', qfield='ramps', mode='complement', to_string=True) # modes are now contained (in), exactly, include if 'ram_quantifier' in info and str( info['ram_quantifier']) == 'include': mode = 'append' parse_primes(info, query, 'ram_primes', 'ramified primes', 'ramps', mode, to_string=True) elif 'ram_quantifier' in info and str( info['ram_quantifier']) == 'contained': parse_primes(info, query, 'ram_primes', 'ramified primes', 'ramps_all', 'subsets', to_string=False) pass # build list else: mode = 'liststring' parse_primes(info, query, 'ram_primes', 'ramified primes', 'ramps_all', mode) except ValueError: return search_input_error(info, bread) count = parse_count(info) start = parse_start(info) # nf_logger.debug(query) info['query'] = dict(query) if 'lucky' in info: one = nfdb().find_one(query) if one: label = one['label'] return redirect(url_for(".by_label", label=clean_input(label))) fields = nfdb() res = fields.find(query) res = res.sort([('degree', ASC), ('disc_abs_key', ASC), ('disc_sign', ASC)]) if 'download' in info and info['download'] != '0': return download_search(info, res) nres = res.count() res = res.skip(start).limit(count) if (start >= nres): start -= (1 + (start - nres) / count) * count if (start < 0): start = 0 info['fields'] = res info['number'] = nres info['start'] = start if nres == 1: info['report'] = 'unique match' else: if nres > count or start != 0: info['report'] = 'displaying matches %s-%s of %s' % ( start + 1, min(nres, start + count), nres) else: info['report'] = 'displaying all %s matches' % nres info['wnf'] = WebNumberField.from_data return render_template("number_field_search.html", info=info, title=t, bread=bread)
def number_field_search(info): info['learnmore'] = [('Global number field labels', url_for(".render_labels_page")), ('Galois group labels', url_for(".render_groups_page")), (Completename, url_for(".render_discriminants_page")), ('Quadratic imaginary class groups', url_for(".render_class_group_data"))] t = 'Global Number Field search results' bread = [('Global Number Fields', url_for(".number_field_render_webpage")), ('Search Results', ' ')] if 'natural' in info: query = {'label_orig': info['natural']} try: parse_nf_string(info,query,'natural',name="Label",qfield='label') return redirect(url_for(".by_label", label=query['label'])) except ValueError: query['err'] = info['err'] return search_input_error(query, bread) if 'algebra' in info: fields=info['algebra'].split('_') fields2=[WebNumberField.from_coeffs(a) for a in fields] for j in range(len(fields)): if fields2[j] is None: fields2[j] = WebNumberField.fakenf(fields[j]) t = 'Number field algebra' info = {} info = {'fields': fields2} return render_template("number_field_algebra.html", info=info, title=t, bread=bread) query = {} try: parse_galgrp(info,query, qfield='galois') parse_ints(info,query,'degree') parse_bracketed_posints(info,query,'signature',split=False,exactlength=2) parse_signed_ints(info,query,'discriminant',qfield=('disc_sign','disc_abs_key'),parse_one=make_disc_key) parse_ints(info,query,'class_number') parse_bracketed_posints(info,query,'class_group',split=False,check_divisibility='increasing') parse_primes(info,query,'ur_primes',name='Unramified primes',qfield='ramps',mode='complement',to_string=True) # modes are now contained (in), exactly, include if 'ram_quantifier' in info and str(info['ram_quantifier']) == 'include': mode = 'append' parse_primes(info,query,'ram_primes','ramified primes','ramps',mode,to_string=True) elif 'ram_quantifier' in info and str(info['ram_quantifier']) == 'contained': parse_primes(info,query,'ram_primes','ramified primes','ramps_all','subsets',to_string=False) pass # build list else: mode = 'liststring' parse_primes(info,query,'ram_primes','ramified primes','ramps_all',mode) except ValueError: return search_input_error(info, bread) count = parse_count(info) start = parse_start(info) # nf_logger.debug(query) info['query'] = dict(query) if 'lucky' in info: one = nfdb().find_one(query) if one: label = one['label'] return redirect(url_for(".by_label", label=clean_input(label))) fields = nfdb() res = fields.find(query) res = res.sort([('degree', ASC), ('disc_abs_key', ASC),('disc_sign', ASC)]) if 'download' in info and info['download'] != '0': return download_search(info, res) # equivalent to # nres = res.count() #if(start >= nres): # start -= (1 + (start - nres) / count) * count #if(start < 0): # start = 0 # res = res.skip(start).limit(count) try: start, nres, res = search_cursor_timeout_decorator(res, start, count); except ValueError as err: info['err'] = err; return search_input_error(info, bread) info['fields'] = res info['number'] = nres info['start'] = start if nres == 1: info['report'] = 'unique match' else: if nres > count or start != 0: info['report'] = 'displaying matches %s-%s of %s' % (start + 1, min(nres, start + count), nres) else: info['report'] = 'displaying all %s matches' % nres info['wnf'] = WebNumberField.from_data return render_template("number_field_search.html", info=info, title=t, bread=bread)
def hilbert_modular_form_search(**args): info = to_dict(args) # what has been entered in the search boxes if 'label' in info and info['label']: lab=info['label'].strip() info['label']=lab try: split_full_label(lab) return hilbert_modular_form_by_label(lab) except ValueError: return redirect(url_for(".hilbert_modular_form_render_webpage")) query = {} try: parse_nf_string(info,query,'field_label',name="Field") parse_ints(info,query,'deg', name='Field degree') parse_ints(info,query,'disc',name="Field discriminant") parse_ints(info,query,'dimension') parse_ints(info,query,'level_norm', name="Level norm") parse_hmf_weight(info,query,'weight',qfield=('parallel_weight','weight')) except ValueError: return search_input_error() count = parse_count(info,100) start = parse_start(info) info['query'] = dict(query) C = getDBConnection() res = C.hmfs.forms.find( query).sort([('deg', pymongo.ASCENDING), ('disc', pymongo.ASCENDING), ('level_norm', pymongo.ASCENDING), ('level_label', pymongo.ASCENDING), ('label_nsuffix', pymongo.ASCENDING)]).skip(start).limit(count) nres = res.count() if(start >= nres): start -= (1 + (start - nres) / count) * count if(start < 0): start = 0 info['number'] = nres info['start'] = start info['more'] = int(start + count < nres) if nres == 1: info['report'] = 'unique match' else: if nres == 0: info['report'] = 'no matches' else: if nres > count or start != 0: info['report'] = 'displaying matches %s-%s of %s' % (start + 1, min(nres, start + count), nres) else: info['report'] = 'displaying all %s matches' % nres res_clean = [] for v in res: v_clean = {} v_clean['field_label'] = v['field_label'] v_clean['short_label'] = v['short_label'] v_clean['label'] = v['label'] v_clean['level_ideal'] = teXify_pol(v['level_ideal']) v_clean['dimension'] = v['dimension'] res_clean.append(v_clean) info['forms'] = res_clean t = 'Hilbert Modular Form search results' bread = [('Hilbert Modular Forms', url_for(".hilbert_modular_form_render_webpage")), ( 'Search results', ' ')] properties = [] return render_template("hilbert_modular_form_search.html", info=info, title=t, credit=hmf_credit, properties=properties, bread=bread, learnmore=learnmore_list())
def abelian_variety_search(info, query): parse_ints(info, query, 'q', name='base field') parse_ints(info, query, 'g', name='dimension') if 'simple' in info: if info['simple'] == 'yes': query['is_simp'] = True elif info['simple'] == 'no': query['is_simp'] = False if 'primitive' in info: if info['primitive'] == 'yes': query['is_prim'] = True elif info['primitive'] == 'no': query['is_prim'] = False if 'jacobian' in info: jac = info['jacobian'] if jac == 'yes': query['is_jac'] = 1 elif jac == 'not_no': query['is_jac'] = {'$gt': -1} elif jac == 'not_yes': query['is_jac'] = {'$lt': 1} elif jac == 'no': query['is_jac'] = -1 if 'polarizable' in info: pol = info['polarizable'] if pol == 'yes': query['is_pp'] = 1 elif pol == 'not_no': query['is_pp'] = {'$gt': -1} elif pol == 'not_yes': query['is_pp'] = {'$lt': 1} elif pol == 'no': query['is_pp'] = -1 parse_ints(info, query, 'p_rank') parse_ints(info, query, 'ang_rank') parse_newton_polygon(info, query, 'newton_polygon', qfield='slps') parse_string_start(info, query, 'initial_coefficients', qfield='poly_str', initial_segment=["1"]) parse_string_start(info, query, 'abvar_point_count', qfield='A_cnts_str') parse_string_start(info, query, 'curve_point_count', qfield='C_cnts_str', first_field='pt_cnt') if info.get('simple_quantifier') == 'contained': parse_subset(info, query, 'simple_factors', qfield='simple_distinct', mode='subsets') elif info.get('simple_quantifier') == 'exactly': parse_subset(info, query, 'simple_factors', qfield='simple_distinct', mode='exact') elif info.get('simple_quantifier') == 'include': parse_submultiset(info, query, 'simple_factors', mode='append') for n in range(1, 6): parse_ints(info, query, 'dim%s_factors' % n) for n in range(1, 4): parse_ints(info, query, 'dim%s_distinct' % n) parse_nf_string(info, query, 'number_field', qfield='nf') parse_galgrp(info, query, qfield=('galois_n', 'galois_t'))
def bianchi_modular_form_search(**args): """Function to handle requests from the top page, either jump to one newform or do a search. """ info = to_dict(args) # what has been entered in the search boxes if 'label' in info: # The Label button has been pressed. label = info['label'] dat = label.split("-") if len(dat)==2: # assume field & level, display space return render_bmf_space_webpage(dat[0], dat[1]) else: # assume single newform label; will display an error if invalid return bianchi_modular_form_by_label(label) query = {} for field in ['field_label', 'weight', 'level_norm', 'dimension']: if info.get(field): if field == 'weight': query['weight'] = info[field] elif field == 'field_label': parse_nf_string(info,query,field,'base number field',field) elif field == 'label': query[field] = info[field] elif field == 'dimension': query['dimension'] = int(info[field]) elif field == 'level_norm': query[field] = parse_range(info[field]) else: query[field] = info[field] if not 'sfe' in info: info['sfe'] = "any" elif info['sfe'] != "any": query['sfe'] = int(info['sfe']) if 'include_cm' in info: if info['include_cm'] == 'exclude': query['CM'] = 0 elif info['include_cm'] == 'only': query['CM'] = {'$nin' : [0,'?']} if 'include_base_change' in info and info['include_base_change'] == 'off': query['bc'] = 0 else: info['include_base_change'] = "on" start = 0 if 'start' in request.args: start = int(request.args['start']) count = 50 if 'count' in request.args: count = int(request.args['count']) info['query'] = dict(query) res = db_forms().find(query).sort([('level_norm', ASCENDING), ('label', ASCENDING)]).skip(start).limit(count) nres = res.count() if nres > 0: info['field_pretty_name'] = field_pretty(res[0]['field_label']) else: info['field_pretty_name'] = '' info['number'] = nres if nres == 1: info['report'] = 'unique match' elif nres == 2: info['report'] = 'displaying both matches' else: if nres > count or start != 0: info['report'] = 'displaying items %s-%s of %s matches' % (start + 1, min(nres, start + count), nres) else: info['report'] = 'displaying all %s matches' % nres res_clean = [] for v in res: v_clean = {} v_clean['field_label'] = v['field_label'] v_clean['short_label'] = v['short_label'] v_clean['level_label'] = v['level_label'] v_clean['level_norm'] = v['level_norm'] v_clean['level_number'] = v['level_label'].split(".")[1] v_clean['label_suffix'] = v['label_suffix'] v_clean['label'] = v['label'] v_clean['level_ideal'] = teXify_pol(v['level_ideal']) v_clean['dimension'] = v['dimension'] v_clean['sfe'] = "+1" if v['sfe']==1 else "-1" v_clean['url'] = url_for('.render_bmf_webpage',field_label=v['field_label'], level_label=v['level_label'], label_suffix=v['label_suffix']) v_clean['bc'] = bc_info(v['bc']) v_clean['cm'] = cm_info(v['CM']) res_clean.append(v_clean) res_clean.sort(key=lambda x: [int(x['level_norm']), int(x['level_number']), x['label_suffix']]) info['forms'] = res_clean info['count'] = count info['start'] = start info['more'] = int(start + count < nres) t = 'Bianchi modular form search results' bread = [('Bianchi Modular Forms', url_for(".index")), ( 'Search Results', ' ')] properties = [] return render_template("bmf-search_results.html", info=info, title=t, properties=properties, bread=bread, learnmore=learnmore_list())
def elliptic_curve_search(**args): info = to_dict(args['data']) if 'download' in info and info['download'] != 0: return download_search(info) bread = [('Elliptic Curves', url_for(".index")), ('Search Results', '.')] if 'jump' in info: label = info.get('label', '').replace(" ", "") # This label should be a full isogeny class label or a full # curve label (including the field_label component) try: nf, cond_label, iso_label, number = split_full_label(label.strip()) except ValueError: if not 'query' in info: info['query'] = {} info['err'] = '' return search_input_error(info, bread) return show_ecnf(nf, cond_label, iso_label, number) query = {} try: parse_ints(info,query,'conductor_norm') parse_noop(info,query,'conductor_label') parse_nf_string(info,query,'field',name="base number field",qfield='field_label') parse_nf_elt(info,query,'jinv',name='j-invariant') parse_ints(info,query,'torsion',name='Torsion order',qfield='torsion_order') parse_bracketed_posints(info,query,'torsion_structure',maxlength=2) except ValueError: return search_input_error(info, bread) if 'include_isogenous' in info and info['include_isogenous'] == 'off': info['number'] = 1 query['number'] = 1 if 'include_base_change' in info and info['include_base_change'] == 'off': query['base_change'] = [] else: info['include_base_change'] = "on" info['query'] = query count = parse_count(info, 50) start = parse_start(info) # make the query and trim results according to start/count: cursor = db_ecnf().find(query) nres = cursor.count() if(start >= nres): start -= (1 + (start - nres) / count) * count if(start < 0): start = 0 res = cursor.sort([('field_label', ASC), ('conductor_norm', ASC), ('conductor_label', ASC), ('iso_nlabel', ASC), ('number', ASC)]).skip(start).limit(count) res = list(res) for e in res: e['numb'] = str(e['number']) e['field_knowl'] = nf_display_knowl(e['field_label'], getDBConnection(), field_pretty(e['field_label'])) info['curves'] = res # [ECNF(e) for e in res] info['number'] = nres info['start'] = start info['count'] = count info['more'] = int(start + count < nres) info['field_pretty'] = field_pretty info['web_ainvs'] = web_ainvs if nres == 1: info['report'] = 'unique match' else: if nres > count or start != 0: info['report'] = 'displaying matches %s-%s of %s' % (start + 1, min(nres, start + count), nres) else: info['report'] = 'displaying all %s matches' % nres t = 'Elliptic Curve search results' return render_template("ecnf-search-results.html", info=info, credit=ecnf_credit, bread=bread, title=t)
def abelian_variety_search(**args): info = to_dict(args) if 'download' in info and info['download'] != 0: return download_search(info) bread = args.get('bread', get_bread(('Search Results', ' '))) if 'jump' in info: return by_label(info.get('label','')) query = {} try: parse_ints(info,query,'q') parse_ints(info,query,'g') if 'simple' in info: if info['simple'] == 'yes': query['decomposition'] = {'$size' : 1} query['decomposition.0.1'] = 1 elif info['simple'] == 'no': query['$or'] = [{'decomposition': {'$not' : {'$size' : 1}}}, {'decomposition.0.1' : {'$gt': 1}}] if 'primitive' in info: if info['primitive'] == 'yes': query['primitive_models'] = {'$size' : 0} elif info['primitive'] == 'no': query['primitive_models'] = {'$not' : {'$size' : 0}} if 'jacobian' in info: if info['jacobian'] == 'yes': query['known_jacobian'] = 1 elif info['jacobian'] == 'no': query['known_jacobian'] = -1 else: info['jacobian'] = "any" if 'polarizable' in info: if info['polarizable'] == 'yes': query['principally_polarizable'] = 1 elif info['polarizable'] == 'no': query['principally_polarizable'] = -1 else: info['polarizable'] = "any" parse_ints(info,query,'p_rank') parse_ints(info,query,'angle_ranks') parse_newton_polygon(info,query,'newton_polygon',qfield='slopes') parse_list_start(info,query,'initial_coefficients',qfield='polynomial',index_shift=1) parse_list_start(info,query,'abvar_point_count',qfield='A_counts',parse_singleton=str) parse_list_start(info,query,'curve_point_count',qfield='C_counts',parse_singleton=str) parse_abvar_decomp(info,query,'decomposition',av_stats=AbvarFqStats()) parse_nf_string(info,query,'number_field') except ValueError: return search_input_error(info, bread) info['query'] = query count = parse_count(info, 50) start = parse_start(info) cursor = db().find(query) nres = cursor.count() if start >= nres: start -= (1 + (start - nres) / count) * count if start < 0: start = 0 #res = cursor.sort([]).skip(start).limit(count) res = cursor.skip(start).limit(count) res = list(res) info['abvars'] = [AbvarFq_isoclass(x) for x in res] info['number'] = nres info['start'] = start info['count'] = count info['more'] = int(start + count < nres) if nres == 1: info['report'] = 'unique match' elif nres == 0: info['report'] = 'no matches' elif nres > count or start != 0: info['report'] = 'displaying matches %s-%s of %s' %(start + 1, min(nres, start+count), nres) else: info['report'] = 'displaying all %s matches' % nres t = 'Abelian Variety search results' return render_template("abvarfq-search-results.html", info=info, credit=abvarfq_credit, bread=bread, title=t)
def number_field_search(**args): info = to_dict(args) info['learnmore'] = [('Global number field labels', url_for(".render_labels_page")), ('Galois group labels', url_for(".render_groups_page")), (Completename, url_for(".render_discriminants_page")), ('Quadratic imaginary class groups', url_for(".render_class_group_data"))] t = 'Global Number Field search results' bread = [('Global Number Fields', url_for(".number_field_render_webpage")), ('Search results', ' ')] # for k in info.keys(): # nf_logger.debug(str(k) + ' ---> ' + str(info[k])) # nf_logger.debug('******************* '+ str(info['search'])) if 'natural' in info: query = {'label_orig': info['natural']} try: parse_nf_string(info,query,'natural',name="Label",qfield='label') return redirect(url_for(".by_label", label= clean_input(query['label']))) except ValueError: query['err'] = info['err'] return search_input_error(query, bread) query = {} try: parse_galgrp(info,query, qfield='galois') parse_ints(info,query,'degree') parse_bracketed_posints(info,query,'signature',split=False,exactlength=2) parse_signed_ints(info,query,'discriminant',qfield=('disc_sign','disc_abs_key'),parse_one=make_disc_key) parse_ints(info,query,'class_number') parse_bracketed_posints(info,query,'class_group',split=False,check_divisibility='increasing') parse_primes(info,query,'ur_primes',name='Unramified primes',qfield='ramps',mode='complement',to_string=True) if 'ram_quantifier' in info and str(info['ram_quantifier']) == 'some': mode = 'append' else: mode = 'exact' parse_primes(info,query,'ram_primes','ramified primes','ramps',mode,to_string=True) except ValueError: return search_input_error(info, bread) count = parse_count(info) start = parse_start(info) if info.get('paging'): try: paging = int(info['paging']) if paging == 0: start = 0 except: pass C = base.getDBConnection() # nf_logger.debug(query) info['query'] = dict(query) if 'lucky' in args: one = C.numberfields.fields.find_one(query) if one: label = one['label'] return redirect(url_for(".by_label", clean_input(label))) fields = C.numberfields.fields res = fields.find(query) if 'download' in info and info['download'] != '0': return download_search(info, res) res = res.sort([('degree', ASC), ('disc_abs_key', ASC),('disc_sign', ASC)]) nres = res.count() res = res.skip(start).limit(count) if(start >= nres): start -= (1 + (start - nres) / count) * count if(start < 0): start = 0 info['fields'] = res info['number'] = nres info['start'] = start if nres == 1: info['report'] = 'unique match' else: if nres > count or start != 0: info['report'] = 'displaying matches %s-%s of %s' % (start + 1, min(nres, start + count), nres) else: info['report'] = 'displaying all %s matches' % nres info['wnf'] = WebNumberField.from_data return render_template("number_field_search.html", info=info, title=t, bread=bread)