def index_Q(): if len(request.args) != 0: return genus2_curve_search(**request.args) info = {'counts' : g2cstats().counts()} info["stats_url"] = url_for(".statistics") info["curve_url"] = lambda dbc: url_for_label(dbc['label']) info["browse_curves"] = [ g2cdb().curves.find_one({"label":"169.a.169.1"}), g2cdb().curves.find_one({"label":"1116.a.214272.1"}), g2cdb().curves.find_one({"label":"1152.a.147456.1"}), g2cdb().curves.find_one({"label":"1369.a.50653.1"}), g2cdb().curves.find_one({"label":"12500.a.12500.1"}), ] info["conductor_list"] = ['1-499', '500-999', '1000-99999','100000-1000000' ] info["discriminant_list"] = ['1-499', '500-999', '1000-99999','100000-1000000' ] info["st_group_list"] = st_group_list info["st_group_dict"] = st_group_dict info["real_geom_end_alg_list"] = real_geom_end_alg_list info["real_geom_end_alg_to_ST0_dict"] = real_geom_end_alg_to_ST0_dict info["aut_grp_list"] = aut_grp_list info["aut_grp_dict"] = aut_grp_dict info["geom_aut_grp_list"] = geom_aut_grp_list info["geom_aut_grp_dict"] = geom_aut_grp_dict title = 'Genus 2 curves over $\Q$' bread = [('Genus 2 Curves', url_for(".index")), ('$\Q$', ' ')] return render_template("browse_search_g2.html", info=info, credit=credit_string, title=title, learnmore=learnmore_list(), bread=bread)
def index_Q(): curve_count = db_g2c().curves.count() if len(request.args) != 0: return genus2_curve_search(**request.args) info = {'count' : curve_count} info["curve_url"] = lambda dbc: url_for_label(dbc['label']) info["browse_curves"] = [ db_g2c().curves.find_one({"label":"169.a.169.1"}), db_g2c().curves.find_one({"label":"1152.a.147456.1"}), db_g2c().curves.find_one({"label":"12500.a.12500.1"}), db_g2c().curves.find_one({"label":"23552.a.23552.1"}) ] info["conductor_list"] = ['1-499', '500-999', '1000-99999','100000-1000000' ] info["discriminant_list"] = ['1-499', '500-999', '1000-99999','100000-1000000' ] info["st_group_list"] = st_group_list info["st_group_dict"] = st_group_dict info["real_geom_end_alg_list"] = real_geom_end_alg_list info["real_geom_end_alg_dict"] = real_geom_end_alg_dict info["aut_grp_list"] = aut_grp_list info["aut_grp_dict"] = aut_grp_dict info["geom_aut_grp_list"] = geom_aut_grp_list info["geom_aut_grp_dict"] = geom_aut_grp_dict credit = credit_string title = 'Genus 2 curves over $\Q$' bread = [('Genus 2 Curves', url_for(".index")), ('$\Q$', ' ')] return render_template("browse_search_g2.html", info=info, credit=credit, title=title, bread=bread)
def genus2_curve_search(**args): info = to_dict(args) if 'download' in info and info['download'] == '1': return download_search(info) info["st_group_list"] = st_group_list info["st_group_dict"] = st_group_dict info["real_geom_end_alg_list"] = real_geom_end_alg_list info["real_geom_end_alg_to_ST0_dict"] = real_geom_end_alg_to_ST0_dict info["aut_grp_list"] = aut_grp_list info["aut_grp_dict"] = aut_grp_dict info["geom_aut_grp_list"] = geom_aut_grp_list info["geom_aut_grp_dict"] = geom_aut_grp_dict query = {} # database callable bread = [('Genus 2 Curves', url_for(".index")), ('$\Q$', url_for(".index_Q")), ('Search Results', '.')] #if 'SearchAgain' in args: # return rational_genus2_curves() if 'jump' in args: curve_label_regex = re.compile(r'\d+\.[a-z]+.\d+.\d+$') if curve_label_regex.match(info["jump"].strip()): data = render_curve_webpage_by_label(info["jump"].strip()) else: class_label_regex = re.compile(r'\d+\.[a-z]+$') if class_label_regex.match(info["jump"].strip()): data = render_isogeny_class(info["jump"].strip()) else: class_label_regex = re.compile(r'#\d+$') if class_label_regex.match(info["jump"].strip()) and ZZ(info["jump"][1:]) < 2**61: c = g2cdb().isogeny_classes.find_one({'hash':int(info["jump"][1:])}) if c: data = render_isogeny_class(c["label"]) else: data = "Hash not found" else: data = "Invalid label" if isinstance(data,str): flash(Markup(data + " <span style='color:black'>%s</span>"%(info["jump"])),"error") return redirect(url_for(".index")) return data try: parse_ints(info,query,'abs_disc','absolute discriminant') parse_bool(info,query,'is_gl2_type') parse_bool(info,query,'has_square_sha') parse_bool(info,query,'locally_solvable') parse_bracketed_posints(info, query, 'torsion', 'torsion structure', maxlength=4,check_divisibility="increasing") parse_ints(info,query,'cond','conductor') parse_ints(info,query,'num_rat_wpts','Weierstrass points') parse_ints(info,query,'torsion_order') parse_ints(info,query,'two_selmer_rank','2-Selmer rank') parse_ints(info,query,'analytic_rank','analytic rank') # G2 invariants and drop-list items don't require parsing -- they are all strings (supplied by us, not the user) if info.get('g20') and info.get('g21') and info.get('g22'): query['g2inv'] = [ info['g20'], info['g21'], info['g22'] ] for fld in ('st_group', 'real_geom_end_alg', 'aut_grp_id', 'geom_aut_grp_id'): if info.get(fld): query[fld] = info[fld] except ValueError as err: info['err'] = str(err) return render_template("search_results_g2.html", info=info, title='Genus 2 Curves Search Input Error', bread=bread, credit=credit_string) info["query"] = dict(query) count = parse_count(info, 50) start = parse_start(info) cursor = g2cdb().curves.find(query) nres = cursor.count() if(start >= nres): start -= (1 + (start - nres) / count) * count if(start < 0): start = 0 res = cursor.sort([("cond", pymongo.ASCENDING), ("class", pymongo.ASCENDING), ("disc_key", pymongo.ASCENDING), ("label", pymongo.ASCENDING)]).skip(start).limit(count) nres = res.count() 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 res_clean = [] for v in res: v_clean = {} v_clean["label"] = v["label"] v_clean["isog_label"] = v["class"] isogeny_class = g2cdb().isogeny_classes.find_one({'label' : isog_label(v["label"])}) v_clean["is_gl2_type"] = isogeny_class["is_gl2_type"] if isogeny_class["is_gl2_type"] == True: v_clean["is_gl2_type_display"] = '✔' #checkmark else: v_clean["is_gl2_type_display"] = '' v_clean["equation_formatted"] = list_to_min_eqn(v["min_eqn"]) v_clean["st_group_name"] = st_group_name(isogeny_class['st_group']) v_clean["st_group_href"] = st_group_href(isogeny_class['st_group']) v_clean["analytic_rank"] = v["analytic_rank"] res_clean.append(v_clean) info["curves"] = res_clean info["curve_url"] = lambda dbc: url_for_label(dbc['label']) info["isog_url"] = lambda dbc: isog_url_for_label(dbc['label']) info["start"] = start info["count"] = count info["more"] = int(start+count<nres) credit = credit_string title = 'Genus 2 Curves search results' return render_template("search_results_g2.html", info=info, credit=credit,learnmore=learnmore_list(), bread=bread, title=title)
def genus2_curve_search(**args): info = to_dict(args) query = {} # database callable bread = [('Genus 2 Curves', url_for(".index")), ('$\Q$', url_for(".index_Q")), ('Search Results', '.')] #if 'SearchAgain' in args: # return rational_genus2_curves() if 'jump' in args: return render_curve_webpage_by_label(info["jump"]) if info.get("disc"): field = "abs_disc" ran = info["disc"] ran = ran.replace('..', '-').replace(' ','') # Past input check dlist = parse_discs(ran) tmp = g2_list_to_query(dlist) if len(tmp) == 1: tmp = tmp[0] else: query[tmp[0][0]] = tmp[0][1] tmp = tmp[1] print tmp # work around syntax for $or # we have to foil out multiple or conditions if tmp[0] == '$or' and '$or' in query: newors = [] for y in tmp[1]: oldors = [dict.copy(x) for x in query['$or']] for x in oldors: x.update(y) newors.extend(oldors) tmp[1] = newors query[tmp[0]] = tmp[1] if info.get("is_gl2_type"): query['is_gl2_type']=bool(info['is_gl2_type']) for fld in ['aut_grp', 'geom_aut_grp','st_group','real_geom_end_alg']: if info.get(fld): query[fld] = info[fld] for fld in ['aut_grp', 'geom_aut_grp']: if info.get(fld): query[fld] = eval(info[fld]) if info.get("cond"): field = "cond" ran = str(info[field]) ran = ran.replace('..', '-').replace(' ','') # Past input check tmp = parse_range2(ran, field) print tmp # work around syntax for $or # we have to foil out multiple or conditions if tmp[0] == '$or' and '$or' in query: newors = [] for y in tmp[1]: oldors = [dict.copy(x) for x in query['$or']] for x in oldors: x.update(y) newors.extend(oldors) tmp[1] = newors query[tmp[0]] = tmp[1] if info.get("count"): try: count = int(info["count"]) except: count = 100 else: count = 100 info["query"] = dict(query) #res = db_g2c().curves.find(query).sort([("cond", pymongo.ASCENDING), #("label", pymongo.ASCENDING)]).limit(count) res = db_g2c().curves.find(query).sort([("cond", pymongo.ASCENDING), ("class", pymongo.ASCENDING), ("disc_key", pymongo.ASCENDING), ("label", pymongo.ASCENDING)]) nres = res.count() if nres == 1: info["report"] = "unique match" else: if nres > count: info["report"] = "displaying first %s of %s matches" % (count, nres) else: info["report"] = "displaying all %s matches" % nres res_clean = [] for v in res: v_clean = {} v_clean["label"] = v["label"] v_clean["isog_label"] = v["class"] isogeny_class = db_g2c().isogeny_classes.find_one({'label' : isog_label(v["label"])}) v_clean["is_gl2_type"] = isogeny_class["is_gl2_type"] v_clean["equation_formatted"] = list_to_min_eqn(v["min_eqn"]) res_clean.append(v_clean) info["curves"] = res_clean info["curve_url"] = lambda dbc: url_for_label(dbc['label']) info["isog_url"] = lambda dbc: isog_url_for_label(dbc['label']) credit = 'Genus 2 Team' title = 'Genus 2 Curves search results' return render_template("search_results_g2.html", info=info, credit=credit, bread=bread, title=title)
def genus2_curve_search(**args): info = to_dict(args) info["st_group_list"] = st_group_list info["st_group_dict"] = st_group_dict info["real_geom_end_alg_list"] = real_geom_end_alg_list info["real_geom_end_alg_dict"] = real_geom_end_alg_dict info["aut_grp_list"] = aut_grp_list info["aut_grp_dict"] = aut_grp_dict info["geom_aut_grp_list"] = geom_aut_grp_list info["geom_aut_grp_dict"] = geom_aut_grp_dict query = {} # database callable bread = [('Genus 2 Curves', url_for(".index")), ('$\Q$', url_for(".index_Q")), ('Search Results', '.')] #if 'SearchAgain' in args: # return rational_genus2_curves() if 'jump' in args: return render_curve_webpage_by_label(info["jump"]) if info.get("disc"): field = "abs_disc" ran = info["disc"] ran = ran.replace('..', '-').replace(' ','') # Past input check dlist = parse_discs(ran) tmp = g2_list_to_query(dlist) if len(tmp) == 1: tmp = tmp[0] else: query[tmp[0][0]] = tmp[0][1] tmp = tmp[1] # work around syntax for $or # we have to foil out multiple or conditions if tmp[0] == '$or' and '$or' in query: newors = [] for y in tmp[1]: oldors = [dict.copy(x) for x in query['$or']] for x in oldors: x.update(y) newors.extend(oldors) tmp[1] = newors query[tmp[0]] = tmp[1] if info.get("is_gl2_type"): if info['is_gl2_type'] == "True": query['is_gl2_type']= True elif info['is_gl2_type'] == "False": query['is_gl2_type']= False for fld in ['st_group', 'real_geom_end_alg']: if info.get(fld): query[fld] = info[fld] for fld in ['aut_grp', 'geom_aut_grp','torsion','igusa_clebsch']: if info.get(fld): query[fld] = map(int,info[fld].strip()[1:-1].split(",")) if info.get('ic0'): query['igusa_clebsch']=[info['ic0'], info['ic1'], info['ic2'], info['ic3'] ] for fld in ["cond", "num_rat_wpts", "torsion_order", "two_selmer_rank"]: if info.get(fld): field = fld ran = str(info[field]) ran = ran.replace('..', '-').replace(' ','') # Past input check tmp = parse_range2(ran, field) # work around syntax for $or # we have to foil out multiple or conditions if tmp[0] == '$or' and '$or' in query: newors = [] for y in tmp[1]: oldors = [dict.copy(x) for x in query['$or']] for x in oldors: x.update(y) newors.extend(oldors) tmp[1] = newors query[tmp[0]] = tmp[1] info["query"] = dict(query) count_default = 50 if info.get('count'): try: count = int(info['count']) except: count = count_default else: count = count_default info['count'] = count start_default = 0 if info.get('start'): try: start = int(info['start']) if(start < 0): start += (1 - (start + 1) / count) * count except: start = start_default else: start = start_default cursor = db_g2c().curves.find(query) nres = cursor.count() if(start >= nres): start -= (1 + (start - nres) / count) * count if(start < 0): start = 0 res = cursor.sort([("cond", pymongo.ASCENDING), ("class", pymongo.ASCENDING), ("disc_key", pymongo.ASCENDING), ("label", pymongo.ASCENDING)]).skip(start).limit(count) nres = res.count() 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 res_clean = [] for v in res: v_clean = {} v_clean["label"] = v["label"] v_clean["isog_label"] = v["class"] isogeny_class = db_g2c().isogeny_classes.find_one({'label' : isog_label(v["label"])}) v_clean["is_gl2_type"] = isogeny_class["is_gl2_type"] if isogeny_class["is_gl2_type"] == True: v_clean["is_gl2_type_display"] = '✔' #checkmark else: v_clean["is_gl2_type_display"] = '' v_clean["equation_formatted"] = list_to_min_eqn(v["min_eqn"]) v_clean["st_group_name"] = st_group_name(isogeny_class['st_group']) res_clean.append(v_clean) info["curves"] = res_clean info["curve_url"] = lambda dbc: url_for_label(dbc['label']) info["isog_url"] = lambda dbc: isog_url_for_label(dbc['label']) info["start"] = start info["count"] = count info["more"] = int(start+count<nres) credit = credit_string title = 'Genus 2 Curves search results' return render_template("search_results_g2.html", info=info, credit=credit, bread=bread, title=title)
def genus2_curve_search(**args): info = to_dict(args) info["st_group_list"] = st_group_list info["st_group_dict"] = st_group_dict info["real_geom_end_alg_list"] = real_geom_end_alg_list info["real_geom_end_alg_dict"] = real_geom_end_alg_dict info["aut_grp_list"] = aut_grp_list info["aut_grp_dict"] = aut_grp_dict info["geom_aut_grp_list"] = geom_aut_grp_list info["geom_aut_grp_dict"] = geom_aut_grp_dict query = {} # database callable bread = [('Genus 2 Curves', url_for(".index")), ('$\Q$', url_for(".index_Q")), ('Search Results', '.')] #if 'SearchAgain' in args: # return rational_genus2_curves() if 'jump' in args: return render_curve_webpage_by_label(info["jump"]) if info.get("disc"): field = "abs_disc" ran = info["disc"] ran = ran.replace('..', '-').replace(' ','') # Past input check dlist = parse_discs(ran) tmp = g2_list_to_query(dlist) if len(tmp) == 1: tmp = tmp[0] else: query[tmp[0][0]] = tmp[0][1] tmp = tmp[1] # work around syntax for $or # we have to foil out multiple or conditions if tmp[0] == '$or' and '$or' in query: newors = [] for y in tmp[1]: oldors = [dict.copy(x) for x in query['$or']] for x in oldors: x.update(y) newors.extend(oldors) tmp[1] = newors query[tmp[0]] = tmp[1] if info.get("is_gl2_type"): if info['is_gl2_type'] == "True": query['is_gl2_type']= True elif info['is_gl2_type'] == "False": query['is_gl2_type']= False for fld in ['st_group', 'real_geom_end_alg']: if info.get(fld): query[fld] = info[fld] for fld in ['aut_grp', 'geom_aut_grp','igusa_clebsch']: if info.get(fld): query[fld] = map(int,info[fld].strip()[1:-1].split(",")) if info.get('torsion'): res = parse_torsion_structure(info['torsion'],4) if 'Error' in res: # no error handling of malformed input yet! info['torsion'] = '' #info['err'] = res #return search_input_error(info, bread) else: #update info for repeat searches info['torsion'] = str(res).replace(' ','') query['torsion'] = [int(r) for r in res] if info.get('ic0'): query['igusa_clebsch']=[info['ic0'], info['ic1'], info['ic2'], info['ic3'] ] for fld in ["cond", "num_rat_wpts", "torsion_order", "two_selmer_rank"]: if info.get(fld): field = fld ran = str(info[field]) ran = ran.replace('..', '-').replace(' ','') # Past input check tmp = parse_range2(ran, field) # work around syntax for $or # we have to foil out multiple or conditions if tmp[0] == '$or' and '$or' in query: newors = [] for y in tmp[1]: oldors = [dict.copy(x) for x in query['$or']] for x in oldors: x.update(y) newors.extend(oldors) tmp[1] = newors query[tmp[0]] = tmp[1] info["query"] = dict(query) count_default = 50 if info.get('count'): try: count = int(info['count']) except: count = count_default else: count = count_default info['count'] = count start_default = 0 if info.get('start'): try: start = int(info['start']) if(start < 0): start += (1 - (start + 1) / count) * count except: start = start_default else: start = start_default cursor = db_g2c().curves.find(query) nres = cursor.count() if(start >= nres): start -= (1 + (start - nres) / count) * count if(start < 0): start = 0 res = cursor.sort([("cond", pymongo.ASCENDING), ("class", pymongo.ASCENDING), ("disc_key", pymongo.ASCENDING), ("label", pymongo.ASCENDING)]).skip(start).limit(count) nres = res.count() 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 res_clean = [] for v in res: v_clean = {} v_clean["label"] = v["label"] v_clean["isog_label"] = v["class"] isogeny_class = db_g2c().isogeny_classes.find_one({'label' : isog_label(v["label"])}) v_clean["is_gl2_type"] = isogeny_class["is_gl2_type"] if isogeny_class["is_gl2_type"] == True: v_clean["is_gl2_type_display"] = '✔' #checkmark else: v_clean["is_gl2_type_display"] = '' v_clean["equation_formatted"] = list_to_min_eqn(v["min_eqn"]) v_clean["st_group_name"] = st_group_name(isogeny_class['st_group']) res_clean.append(v_clean) info["curves"] = res_clean info["curve_url"] = lambda dbc: url_for_label(dbc['label']) info["isog_url"] = lambda dbc: isog_url_for_label(dbc['label']) info["start"] = start info["count"] = count info["more"] = int(start+count<nres) credit = credit_string title = 'Genus 2 Curves search results' return render_template("search_results_g2.html", info=info, credit=credit, bread=bread, title=title)
def genus2_curve_search(**args): info = to_dict(args) print "info", info info["st_group_list"] = st_group_list info["st_group_dict"] = st_group_dict info["real_geom_end_alg_list"] = real_geom_end_alg_list info["real_geom_end_alg_to_ST0_dict"] = real_geom_end_alg_to_ST0_dict info["aut_grp_list"] = aut_grp_list info["aut_grp_dict"] = aut_grp_dict info["geom_aut_grp_list"] = geom_aut_grp_list info["geom_aut_grp_dict"] = geom_aut_grp_dict query = {} # database callable bread = [('Genus 2 Curves', url_for(".index")), ('$\Q$', url_for(".index_Q")), ('Search Results', '.')] #if 'SearchAgain' in args: # return rational_genus2_curves() if 'jump' in args: label_regex = re.compile(r'\d+\.[a-z]+.\d+.\d+') if label_regex.match(info["jump"].strip()): data = render_curve_webpage_by_label(info["jump"].strip()) else: data = "Invalid label" print data if data == "Invalid label": flash(Markup("The label <span style='color:black'>%s</span> is invalid."%(info["jump"])),"error") return redirect(url_for(".index")) if data == "Data for curve not found": flash(Markup("No genus 2 curve with label <span style='color:black'>%s</span> was found in the database."%(info["jump"])),"error") return redirect(url_for(".index")) return data try: parse_ints(info,query,'abs_disc','absolute discriminant') parse_bool(info,query,'is_gl2_type') parse_bool(info,query,'has_square_sha') parse_bool(info,query,'locally_solvable') for fld in ('st_group', 'real_geom_end_alg'): if info.get(fld): query[fld] = info[fld] for fld in ('aut_grp', 'geom_aut_grp'): #Encoded into a GAP ID. parse_bracketed_posints(info,query,fld,exactlength=2) # igusa and igusa_clebsch invariants not currently searchable parse_bracketed_posints(info, query, 'torsion', 'torsion structure', maxlength=4,check_divisibility="increasing") parse_ints(info,query,'cond','conductor') parse_ints(info,query,'num_rat_wpts','Weierstrass points') parse_ints(info,query,'torsion_order') parse_ints(info,query,'two_selmer_rank','2-Selmer rank') parse_ints(info,query,'analytic_rank','analytic rank') except ValueError as err: info['err'] = str(err) return render_template("search_results_g2.html", info=info, title='Genus 2 Curves Search Input Error', bread=bread, credit=credit_string) info["query"] = dict(query) print "query", info["query"] print "info", info count = parse_count(info, 50) start = parse_start(info) cursor = db_g2c().curves.find(query) nres = cursor.count() if(start >= nres): start -= (1 + (start - nres) / count) * count if(start < 0): start = 0 res = cursor.sort([("cond", pymongo.ASCENDING), ("class", pymongo.ASCENDING), ("disc_key", pymongo.ASCENDING), ("label", pymongo.ASCENDING)]).skip(start).limit(count) nres = res.count() 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 res_clean = [] for v in res: v_clean = {} v_clean["label"] = v["label"] v_clean["isog_label"] = v["class"] isogeny_class = db_g2c().isogeny_classes.find_one({'label' : isog_label(v["label"])}) v_clean["is_gl2_type"] = isogeny_class["is_gl2_type"] if isogeny_class["is_gl2_type"] == True: v_clean["is_gl2_type_display"] = '✔' #checkmark else: v_clean["is_gl2_type_display"] = '' v_clean["equation_formatted"] = list_to_min_eqn(v["min_eqn"]) v_clean["st_group_name"] = st_group_name(isogeny_class['st_group']) v_clean["analytic_rank"] = v["analytic_rank"] res_clean.append(v_clean) info["curves"] = res_clean info["curve_url"] = lambda dbc: url_for_label(dbc['label']) info["isog_url"] = lambda dbc: isog_url_for_label(dbc['label']) info["start"] = start info["count"] = count info["more"] = int(start+count<nres) credit = credit_string title = 'Genus 2 Curves search results' return render_template("search_results_g2.html", info=info, credit=credit,learnmore=learnmore_list(), bread=bread, title=title) credit = credit_string title = 'Genus 2 curves over $\Q$' bread = [('Genus 2 Curves', url_for(".index")), ('$\Q$', ' ')]
def genus2_curve_search(**args): info = to_dict(args) if 'download' in info and info['download'] == '1': return download_search(info) info["st_group_list"] = st_group_list info["st_group_dict"] = st_group_dict info["real_geom_end_alg_list"] = real_geom_end_alg_list info["real_geom_end_alg_to_ST0_dict"] = real_geom_end_alg_to_ST0_dict info["aut_grp_list"] = aut_grp_list info["aut_grp_dict"] = aut_grp_dict info["geom_aut_grp_list"] = geom_aut_grp_list info["geom_aut_grp_dict"] = geom_aut_grp_dict query = {} # database callable bread = [('Genus 2 Curves', url_for(".index")), ('$\Q$', url_for(".index_Q")), ('Search Results', '.')] #if 'SearchAgain' in args: # return rational_genus2_curves() if 'jump' in args: label_regex = re.compile(r'\d+\.[a-z]+.\d+.\d+') if label_regex.match(info["jump"].strip()): data = render_curve_webpage_by_label(info["jump"].strip()) else: data = "Invalid label" if data == "Invalid label": flash( Markup( "The label <span style='color:black'>%s</span> is invalid." % (info["jump"])), "error") return redirect(url_for(".index")) if data == "Data for curve not found": flash( Markup( "No genus 2 curve with label <span style='color:black'>%s</span> was found in the database." % (info["jump"])), "error") return redirect(url_for(".index")) return data try: parse_ints(info, query, 'abs_disc', 'absolute discriminant') parse_bool(info, query, 'is_gl2_type') parse_bool(info, query, 'has_square_sha') parse_bool(info, query, 'locally_solvable') for fld in ('st_group', 'real_geom_end_alg'): if info.get(fld): query[fld] = info[fld] for fld in ('aut_grp', 'geom_aut_grp'): parse_bracketed_posints(info, query, fld, exactlength=2) #Encoded into a GAP ID. # igusa and igusa_clebsch invariants not currently searchable parse_bracketed_posints(info, query, 'torsion', 'torsion structure', maxlength=4, check_divisibility="increasing") parse_ints(info, query, 'cond', 'conductor') parse_ints(info, query, 'num_rat_wpts', 'Weierstrass points') parse_ints(info, query, 'torsion_order') parse_ints(info, query, 'two_selmer_rank', '2-Selmer rank') parse_ints(info, query, 'analytic_rank', 'analytic rank') except ValueError as err: info['err'] = str(err) return render_template("search_results_g2.html", info=info, title='Genus 2 Curves Search Input Error', bread=bread, credit=credit_string) info["query"] = dict(query) count = parse_count(info, 50) start = parse_start(info) cursor = db_g2c().curves.find(query) nres = cursor.count() if (start >= nres): start -= (1 + (start - nres) / count) * count if (start < 0): start = 0 res = cursor.sort([("cond", pymongo.ASCENDING), ("class", pymongo.ASCENDING), ("disc_key", pymongo.ASCENDING), ("label", pymongo.ASCENDING)]).skip(start).limit(count) nres = res.count() 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 res_clean = [] for v in res: v_clean = {} v_clean["label"] = v["label"] v_clean["isog_label"] = v["class"] isogeny_class = db_g2c().isogeny_classes.find_one( {'label': isog_label(v["label"])}) v_clean["is_gl2_type"] = isogeny_class["is_gl2_type"] if isogeny_class["is_gl2_type"] == True: v_clean["is_gl2_type_display"] = '✔' #checkmark else: v_clean["is_gl2_type_display"] = '' v_clean["equation_formatted"] = list_to_min_eqn(v["min_eqn"]) v_clean["st_group_name"] = st_group_name(isogeny_class['st_group']) v_clean["analytic_rank"] = v["analytic_rank"] res_clean.append(v_clean) info["curves"] = res_clean info["curve_url"] = lambda dbc: url_for_label(dbc['label']) info["isog_url"] = lambda dbc: isog_url_for_label(dbc['label']) info["start"] = start info["count"] = count info["more"] = int(start + count < nres) credit = credit_string title = 'Genus 2 Curves search results' return render_template("search_results_g2.html", info=info, credit=credit, learnmore=learnmore_list(), bread=bread, title=title)
def genus2_curve_search(**args): info = to_dict(args) query = {} # database callable bread = [('Genus 2 Curves', url_for(".index")), ('$\Q$', url_for(".index_Q")), ('Search Results', '.')] #if 'SearchAgain' in args: # return rational_genus2_curves() if 'jump' in args: return render_curve_webpage_by_label(info["jump"]) if info.get("disc"): field = "abs_disc" ran = info["disc"] ran = ran.replace('..', '-').replace(' ', '') # Past input check dlist = parse_discs(ran) tmp = g2_list_to_query(dlist) if len(tmp) == 1: tmp = tmp[0] else: query[tmp[0][0]] = tmp[0][1] tmp = tmp[1] print tmp # work around syntax for $or # we have to foil out multiple or conditions if tmp[0] == '$or' and '$or' in query: newors = [] for y in tmp[1]: oldors = [dict.copy(x) for x in query['$or']] for x in oldors: x.update(y) newors.extend(oldors) tmp[1] = newors query[tmp[0]] = tmp[1] if info.get("is_gl2_type"): query['is_gl2_type'] = bool(info['is_gl2_type']) for fld in ['aut_grp', 'geom_aut_grp', 'st_group', 'real_geom_end_alg']: if info.get(fld): query[fld] = info[fld] for fld in ['aut_grp', 'geom_aut_grp']: if info.get(fld): query[fld] = eval(info[fld]) if info.get("cond"): field = "cond" ran = str(info[field]) ran = ran.replace('..', '-').replace(' ', '') # Past input check tmp = parse_range2(ran, field) print tmp # work around syntax for $or # we have to foil out multiple or conditions if tmp[0] == '$or' and '$or' in query: newors = [] for y in tmp[1]: oldors = [dict.copy(x) for x in query['$or']] for x in oldors: x.update(y) newors.extend(oldors) tmp[1] = newors query[tmp[0]] = tmp[1] if info.get("count"): try: count = int(info["count"]) except: count = 100 else: count = 100 info["query"] = dict(query) #res = db_g2c().curves.find(query).sort([("cond", pymongo.ASCENDING), #("label", pymongo.ASCENDING)]).limit(count) res = db_g2c().curves.find(query).sort([("cond", pymongo.ASCENDING), ("class", pymongo.ASCENDING), ("disc_key", pymongo.ASCENDING), ("label", pymongo.ASCENDING)]) nres = res.count() if nres == 1: info["report"] = "unique match" else: if nres > count: info["report"] = "displaying first %s of %s matches" % (count, nres) else: info["report"] = "displaying all %s matches" % nres res_clean = [] for v in res: v_clean = {} v_clean["label"] = v["label"] v_clean["isog_label"] = v["class"] isogeny_class = db_g2c().isogeny_classes.find_one( {'label': isog_label(v["label"])}) v_clean["is_gl2_type"] = isogeny_class["is_gl2_type"] v_clean["equation_formatted"] = list_to_min_eqn(v["min_eqn"]) res_clean.append(v_clean) info["curves"] = res_clean info["curve_url"] = lambda dbc: url_for_label(dbc['label']) info["isog_url"] = lambda dbc: isog_url_for_label(dbc['label']) credit = credit_string title = 'Genus 2 Curves search results' return render_template("search_results_g2.html", info=info, credit=credit, bread=bread, title=title)