Path: blob/main/scripts/hmf/import_hmf_data_gnu_phase_0.py
1448 views
# -*- coding: utf-8 -*-1Dan_test = True2import os.path34from pymongo.mongo_client import MongoClient5C = MongoClient(port=int(37010))6C['admin'].authenticate('lmfdb','lmfdb')78# Saved login procedure from old script; not working now (JV 07-2017)9# from lmfdb.lmfdb.base import getDBConnection10# C= getDBConnection()11# C['admin'].authenticate('lmfdb', 'lmfdb') # read-only1213# if Dan_test:14# import sys15# from sage.all import preparse16# # sys.path.append('/Users/d_yasaki/repos/lmfdb/lmfdb/scripts/hmf')17# else:18from sage.all import preparse19# import sage.misc.preparser20# from sage.misc.preparser import preparse2122from sage.interfaces.magma import magma2324from sage.all import ZZ, QQ, PolynomialRing2526from scripts.hmf.check_conjugates import fix_one_label27from sage.databases.cremona import class_to_int28import yaml2930# Assumes running from lmfdb root directory31pw_dict = yaml.load(open(os.path.join(os.getcwd(), "passwords.yaml")))32username = pw_dict['data']['username']33password = pw_dict['data']['password']34C['hmfs'].authenticate(username, password)3536hmf_forms = C.hmfs.forms_dan37hmf_fields = C.hmfs.fields38fields = C.numberfields.fields3940magma.eval('nice_idealstr := function(F : Bound := 10000); idealsstr := []; ideals := IdealsUpTo(Bound, F); for I in ideals do bl, g := IsPrincipal(I); if bl then s := Sprintf("[%o, %o, %o]", Norm(I), Minimum(I), F!g); else zs := Generators(I); z := zs[#zs]; m := Minimum(I); z := F![(Integers()!c) mod m : c in Eltseq(F!z)]; assert ideal<Integers(F) | [m, z]> eq I; s := Sprintf("[%o, %o, %o]", Norm(I), m, z); end if; Append(~idealsstr, s); end for; return idealsstr; end function;')4142from lmfdb.number_fields.number_field import make_disc_key43from lmfdb.hilbert_modular_forms.web_HMF import construct_full_label4445P = PolynomialRing(QQ, 3, ['w', 'e', 'x'])46w, e, x = P.gens()4748def import_all_data(n, fileprefix=None, ferrors=None, test=True):49nstr = str(n)5051if fileprefix is None:52fileprefix = "/home/jvoight/Elements/ModFrmHilDatav1.1/Data/" + nstr + "/dir.tmp"53ff = open(fileprefix, 'r')54files = ff.readlines()55files = [f[:-1] for f in files]5657files = [f for f in files if f.find('_old') == -1]58for file_name in files:59print("About to import data from file %s" % file_name)60import_data(file_name, fileprefix=fileprefix, ferrors=ferrors, test=test)616263def import_data(hmf_filename, fileprefix=None, ferrors=None, test=True):64if fileprefix is None:65fileprefix="."66hmff = open(os.path.join(fileprefix,hmf_filename))6768if ferrors is None:69if Dan_test:70ferrors = open('/Users/d_yasaki/repos/lmfdb/lmfdb/scripts/hmf/fixing-permuted-primes/import_data.err', 'a')71else:72ferrors = open('/home/jvoight/lmfdb/backups/import_data.err', 'a')7374# Parse field data75v = hmff.readline()76assert v[:9] == 'COEFFS :='77coeffs = eval(v[10:][:-2])78v = hmff.readline()79assert v[:4] == 'n :='80n = int(v[4:][:-2])81v = hmff.readline()82assert v[:4] == 'd :='83d = int(v[4:][:-2])8485magma.eval('F<w> := NumberField(Polynomial(' + str(coeffs) + '));')86magma.eval('ZF := Integers(F);')8788# Find the corresponding field in the database of number fields89dkey = make_disc_key(ZZ(d))[1]90sig = "%s,%s" % (n,0)91print("Finding field with signature %s and disc_key %s ..." % (sig,dkey))92fields_matching = fields.find({"disc_abs_key": dkey, "signature": sig})93cnt = fields_matching.count()94print("Found %s fields" % cnt)95assert cnt >= 196field_label = None97co = str(coeffs)[1:-1].replace(" ","")98for i in range(cnt):99nf = next(fields_matching)100print("Comparing coeffs %s with %s" % (nf['coeffs'], co))101if nf['coeffs'] == co:102field_label = nf['label']103assert field_label is not None104print("...found!")105106# Find the field in the HMF database107print("Finding field %s in HMF..." % field_label)108F_hmf = hmf_fields.find_one({"label": field_label})109if Dan_test:110assert F_hmf is not None # Assuming the hmf field is already there!111if F_hmf is None:112# Create list of ideals113print("...adding!")114ideals = eval(preparse(magma.eval('nice_idealstr(F);')))115ideals_str = [str(c) for c in ideals]116if test:117print("Would now insert data for %s into hmf_fields" % field_label)118else:119hmf_fields.insert_one({"label": field_label,120"degree": n,121"discriminant": d,122"ideals": ideals_str})123F_hmf = hmf_fields.find_one({"label": field_label})124else:125print("...found!")126127print("Computing ideals...")128ideals_str = F_hmf['ideals']129ideals = [eval(preparse(c)) for c in ideals_str]130ideals_norms = [c[0] for c in ideals]131magma.eval('ideals_str := [' + ''.join(F_hmf['ideals']).replace('][', '], [') + ']')132magma.eval('ideals := [ideal<ZF | {F!x : x in I}> : I in ideals_str];')133134# Add the list of primes135print("Computing primes...")136v = hmff.readline() # Skip line137v = hmff.readline()138assert v[:9] == 'PRIMES :='139primes_str = v[10:][:-2]140primes_array = [str(t) for t in eval(preparse(primes_str))]141magma.eval('primes_array := ' + primes_str)142magma.eval('primes := [ideal<ZF | {F!x : x in I}> : I in primes_array];')143magma.eval('primes_indices := [Index(ideals, pp) : pp in primes];')144try:145assert magma('&and[primes_indices[j] gt primes_indices[j-1] : j in [2..#primes_indices]]')146resort = False147except AssertionError:148print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Primes reordered!")149resort = True150magma.eval('_, sigma := Sort(primes_indices, func<x,y | x-y>);')151magma.eval('perm := [[xx : xx in x] : x in CycleDecomposition(sigma) | #x gt 1]')152# Check at least they have the same norm153magma.eval('for tau in perm do assert #{Norm(ideals[primes_indices[t]]) : t in tau} eq 1; end for;')154primes_resort = eval(magma.eval('Eltseq(sigma)'))155primes_resort = [c - 1 for c in primes_resort]156157primes_indices = eval(magma.eval('primes_indices'))158primes_str = [ideals_str[j - 1] for j in primes_indices]159assert len(primes_array) == len(primes_str)160print("...comparing...")161for i in range(len(primes_array)):162assert magma('ideal<ZF | {F!x : x in ' + primes_array[i] + '}> eq '163+ 'ideal<ZF | {F!x : x in ' + primes_str[i] + '}>;')164if resort:165# Important also to resort the list of primes themselves!166# not just the a_pp's167primes_str = [primes_str[i] for i in primes_resort]168if Dan_test:169assert 'primes' in F_hmf # DY: want to make sure the fields are not touched!170if 'primes' in F_hmf: # Nothing smart: make sure it is the same171assert F_hmf['primes'] == primes_str172else:173F_hmf['primes'] = primes_str174if test:175print("Would now save primes string %s... into hmf_fields" % primes_str[:100])176else:177hmf_fields.replace_one(F_hmf)178print("...saved!")179180# Collect levels181v = hmff.readline()182if v[:9] == 'LEVELS :=':183# Skip this line since we do not use the list of levels184v = hmff.readline()185for i in range(3):186if v[:11] != 'NEWFORMS :=':187v = hmff.readline()188else:189break190191# Finally, newforms!192print("Starting newforms!")193while v != '':194v = hmff.readline()[1:-3]195if len(v) == 0:196break197data = eval(preparse(v))198level_ideal = data[0]199level_norm = data[0][0]200label_suffix = fix_one_label(data[1])201weight = [2 for i in range(n)]202label_nsuffix = class_to_int(label_suffix)203204level_ind = int(magma('Index(ideals, ideal<ZF | {F!x : x in ' + str(level_ideal) + '}>)')205) - 1 # Magma counts starting at 1206level_ideal = ideals_str[level_ind]207assert magma('ideal<ZF | {F!x : x in ' + str(level_ideal) + '}> eq '208+ 'ideal<ZF | {F!x : x in ' + str(data[0]) + '}>;')209level_dotlabel = level_ind - ideals_norms.index(level_norm) + 1 # Start counting at 1210assert level_dotlabel > 0211level_label = str(level_norm) + '.' + str(level_dotlabel)212213label = construct_full_label(field_label, weight, level_label, label_suffix)214short_label = level_label + '-' + label_suffix215216if len(data) == 3:217hecke_polynomial = x218hecke_eigenvalues = data[2]219else:220hecke_polynomial = data[2]221hecke_eigenvalues = data[3]222223if resort:224hecke_eigenvalues = [hecke_eigenvalues[i] for i in primes_resort]225226# Constrain eigenvalues to size 2MB227hecke_eigenvalues = [str(c) for c in hecke_eigenvalues]228leftout = 0229while sum([len(s) for s in hecke_eigenvalues]) > 2000000:230hecke_eigenvalues = hecke_eigenvalues[:-1]231leftout += 1232# commented code below throws an error. use above.233# just be safe and remove one eigenvalue at a time.234# Aurel's code will adjust and remove extra when needed.235#q = primes_resort[len(hecke_eigenvalues)]236#while primes_resort[len(hecke_eigenvalues)] == q:237# # Remove all with same norm238# leftout += 1239# hecke_eigenvalues = hecke_eigenvalues[:-1]240241if leftout > 0:242print("Left out", leftout)243244info = {"label": label,245"short_label": short_label,246"field_label": field_label,247"level_norm": int(level_norm),248"level_ideal": str(level_ideal),249"level_label": level_label,250"weight": str(weight),251"label_suffix": label_suffix,252"label_nsuffix" : label_nsuffix,253"dimension": hecke_polynomial.degree(),254"hecke_polynomial": str(hecke_polynomial),255"hecke_eigenvalues": hecke_eigenvalues} # DY: don't deal with AL right now.256#,257#"AL_eigenvalues": [[str(a[0]), str(a[1])] for a in AL_eigenvalues]}258print(info['label'])259260existing_forms = hmf_forms.find({"label": label})261assert existing_forms.count() <= 1262if existing_forms.count() == 0:263if test:264print("Would now insert form data %s into hmf_forms" % info)265else:266hmf_forms.insert_one(info)267else:268existing_form = next(existing_forms)269assert info['hecke_polynomial'] == existing_form['hecke_polynomial']270try:271assert info['hecke_eigenvalues'] == existing_form['hecke_eigenvalues']272print("...duplicate")273except AssertionError:274print("...Hecke eigenvalues do not match! Checking for permutation")275assert set(info['hecke_eigenvalues'] + ['0','1','-1']) == set(existing_form['hecke_eigenvalues'] + [u'0',u'1',u'-1'])276# Add 0,1,-1 to allow for Atkin-Lehner eigenvalues, if not computed277print("As sets, ignoring 0,1,-1, the eigenvalues match!")278if test:279print("Would now replace permuted form data %s with %s" % (existing_form, info))280else:281existing_form['hecke_eigenvalues'] = info['hecke_eigenvalues']282hmf_forms.save(existing_form)283284285def repair_fields(D):286F = hmf_fields.find_one({"label": '2.2.' + str(D) + '.1'})287288P = PolynomialRing(QQ, 'w')289# P is used implicitly in the eval() calls below. When these are290# removed, this will not longer be neceesary, but until then the291# assert statement is for pyflakes.292assert P293294primes = F['primes']295primes = [[int(eval(p)[0]), int(eval(p)[1]), str(eval(p)[2])] for p in primes]296F['primes'] = primes297298hmff = open("data_2_" + (4 - len(str(D))) * '0' + str(D))299300# Parse field data301for i in range(7):302v = hmff.readline()303ideals = eval(v[10:][:-2])304ideals = [[p[0], p[1], str(p[2])] for p in ideals]305F['ideals'] = ideals306hmf_fields.save(F)307308309def repair_fields_add_ideal_labels(D):310F = hmf_fields.find_one({"label": '2.2.' + str(D) + '.1'})311312ideals = F['ideals']313ideal_labels = ['1.1']314N = 1315cnt = 1316for I in ideals[2:]:317NI = I[0]318if NI == N:319cnt += 1320else:321cnt = 1322N = NI323ideal_labels.append(str(NI) + '.' + str(cnt))324F['ideal_labels'] = ideal_labels325hmf_fields.save(F)326327328def attach_new_label(f):329print(f['label'])330F = hmf_fields.find_one({"label": f['field_label']})331332P = PolynomialRing(QQ, 'w')333# P is used implicitly in the eval() calls below. When these are334# removed, this will not longer be neceesary, but until then the335# assert statement is for pyflakes.336assert P337338if isinstance(f['level_ideal'], str):339N = eval(f['level_ideal'])340else:341N = f['level_ideal']342if type(N) != list or len(N) != 3:343print(f, N, type(N))344assert False345346f['level_ideal'] = [N[0], N[1], str(N[2])]347348try:349ideal_label = F['ideal_labels'][F['ideals'].index(f['level_ideal'])]350f['level_ideal_label'] = ideal_label351f['label'] = construct_full_label(f['field_label'], f['weight'], f['level_ideal_label'], f['label_suffix'])352hmf_forms.save(f)353print(f['label'])354except ValueError:355hmf_forms.remove(f)356print("REMOVED!")357358359360361362363## ========= COPIED from import_hmf_extra_gnu_phase_0.py on 7-18-2017364365def parseALstring(s):366# Drop first char bracket367#in [[4,2,1/2*w^3-2*w],-1],[[191,191,-w^3-2*w^2+5*w+7],-1]]368#out ['[[4', '2', '1/2*w^3-2*w]', '-1]', '[[191', '191', '-w^3-2*w^2+5*w+7]', '-1]]']369if s == '[]':370return []371s = s[1:-1]372sm = s.split(',')373outlist = []374#print s, sm375assert len(sm) % 4 == 0376for i in range(len(sm) // 4):377outlist += [[sm[4*i][1:]+","+sm[4*i+1]+","+sm[4*i+2], sm[4*i+3][:-1]]]378return outlist379380381def import_extra_data(hmf_extra_filename, fileprefix=None, ferrors=None, test=True):382'''383put in docstring!384'''385if ferrors is None:386if Dan_test:387ferrors = open('/Users/d_yasaki/repos/lmfdb/lmfdb/scripts/hmf/fixing-permuted-primes/import_extra.err', 'a')388else:389ferrors = open('/home/jvoight/lmfdb/backups/import_data.err', 'a')390field_label = hmf_extra_filename.split('-')[0]391if fileprefix is None:392fileprefix="."393hmff = open(os.path.join(fileprefix, hmf_extra_filename))394395with hmff as infile:396# assumes the input filename starts with the field label.397F = hmf_fields.find_one({'label':field_label})398assert F is not None399clean_primes = [p.replace(' ','') for p in F['primes']]400401print(clean_primes)402403for line in infile:404# sample line - 4.4.1600.1-25.1-a:[25,5,w^2-3]:no:yes:[[[25,5,w^2-3],1]]:done:[[25,5,w^2-3],-1]405line_keys = ['label', 'level_ideal','is_CM','is_base_change','AL_eigenvalues','AL_eigenvalues_fixed']406data = line.split(':')407label = data[0]408f = hmf_forms.find_one({'label':label})409if f is None:410continue411assert f['field_label'] == field_label412f['AL_eigenvalues'] = parseALstring(data[line_keys.index('AL_eigenvalues')])413enter_keys = ['is_CM','is_base_change','AL_eigenvalues_fixed']414for k in enter_keys:415f[k] = data[line_keys.index(k)]416# need to fix some aps: data[-1]417# adjust f['hecke_eigenvalues']418if len(data) > 6:419# there are ap to fix420for apfix in data[6:]:421pp = apfix.rstrip()[1:-1].split('],')[0] + ']'422ap = apfix.rstrip()[1:-1].split('],')[1]423if ap not in {'1', '-1'}:424print('????? ', ap, label)425assert ap in {'1', '-1'}426if clean_primes.index(pp) < len(f['hecke_eigenvalues']):427try:428assert f['hecke_eigenvalues'][clean_primes.index(pp)] in {'0','1','-1'}429except AssertionError:430print(f['hecke_eigenvalues'][clean_primes.index(pp)])431print(f)432assert False433f['hecke_eigenvalues'][clean_primes.index(pp)] = ap434else:435print('!!! a_pp not corrected since not many stored !!!')436if not test:437print(label)438hmf_forms.save(f)439else:440print(f)441442443444445446