Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
AndrewVSutherland
GitHub Repository: AndrewVSutherland/lmfdb
Path: blob/main/scripts/hmf/import_hmf_data_gnu_phase_0.py
1448 views
1
# -*- coding: utf-8 -*-
2
Dan_test = True
3
import os.path
4
5
from pymongo.mongo_client import MongoClient
6
C = MongoClient(port=int(37010))
7
C['admin'].authenticate('lmfdb','lmfdb')
8
9
# Saved login procedure from old script; not working now (JV 07-2017)
10
# from lmfdb.lmfdb.base import getDBConnection
11
# C= getDBConnection()
12
# C['admin'].authenticate('lmfdb', 'lmfdb') # read-only
13
14
# if Dan_test:
15
# import sys
16
# from sage.all import preparse
17
# # sys.path.append('/Users/d_yasaki/repos/lmfdb/lmfdb/scripts/hmf')
18
# else:
19
from sage.all import preparse
20
# import sage.misc.preparser
21
# from sage.misc.preparser import preparse
22
23
from sage.interfaces.magma import magma
24
25
from sage.all import ZZ, QQ, PolynomialRing
26
27
from scripts.hmf.check_conjugates import fix_one_label
28
from sage.databases.cremona import class_to_int
29
import yaml
30
31
# Assumes running from lmfdb root directory
32
pw_dict = yaml.load(open(os.path.join(os.getcwd(), "passwords.yaml")))
33
username = pw_dict['data']['username']
34
password = pw_dict['data']['password']
35
C['hmfs'].authenticate(username, password)
36
37
hmf_forms = C.hmfs.forms_dan
38
hmf_fields = C.hmfs.fields
39
fields = C.numberfields.fields
40
41
magma.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;')
42
43
from lmfdb.number_fields.number_field import make_disc_key
44
from lmfdb.hilbert_modular_forms.web_HMF import construct_full_label
45
46
P = PolynomialRing(QQ, 3, ['w', 'e', 'x'])
47
w, e, x = P.gens()
48
49
def import_all_data(n, fileprefix=None, ferrors=None, test=True):
50
nstr = str(n)
51
52
if fileprefix is None:
53
fileprefix = "/home/jvoight/Elements/ModFrmHilDatav1.1/Data/" + nstr + "/dir.tmp"
54
ff = open(fileprefix, 'r')
55
files = ff.readlines()
56
files = [f[:-1] for f in files]
57
58
files = [f for f in files if f.find('_old') == -1]
59
for file_name in files:
60
print("About to import data from file %s" % file_name)
61
import_data(file_name, fileprefix=fileprefix, ferrors=ferrors, test=test)
62
63
64
def import_data(hmf_filename, fileprefix=None, ferrors=None, test=True):
65
if fileprefix is None:
66
fileprefix="."
67
hmff = open(os.path.join(fileprefix,hmf_filename))
68
69
if ferrors is None:
70
if Dan_test:
71
ferrors = open('/Users/d_yasaki/repos/lmfdb/lmfdb/scripts/hmf/fixing-permuted-primes/import_data.err', 'a')
72
else:
73
ferrors = open('/home/jvoight/lmfdb/backups/import_data.err', 'a')
74
75
# Parse field data
76
v = hmff.readline()
77
assert v[:9] == 'COEFFS :='
78
coeffs = eval(v[10:][:-2])
79
v = hmff.readline()
80
assert v[:4] == 'n :='
81
n = int(v[4:][:-2])
82
v = hmff.readline()
83
assert v[:4] == 'd :='
84
d = int(v[4:][:-2])
85
86
magma.eval('F<w> := NumberField(Polynomial(' + str(coeffs) + '));')
87
magma.eval('ZF := Integers(F);')
88
89
# Find the corresponding field in the database of number fields
90
dkey = make_disc_key(ZZ(d))[1]
91
sig = "%s,%s" % (n,0)
92
print("Finding field with signature %s and disc_key %s ..." % (sig,dkey))
93
fields_matching = fields.find({"disc_abs_key": dkey, "signature": sig})
94
cnt = fields_matching.count()
95
print("Found %s fields" % cnt)
96
assert cnt >= 1
97
field_label = None
98
co = str(coeffs)[1:-1].replace(" ","")
99
for i in range(cnt):
100
nf = next(fields_matching)
101
print("Comparing coeffs %s with %s" % (nf['coeffs'], co))
102
if nf['coeffs'] == co:
103
field_label = nf['label']
104
assert field_label is not None
105
print("...found!")
106
107
# Find the field in the HMF database
108
print("Finding field %s in HMF..." % field_label)
109
F_hmf = hmf_fields.find_one({"label": field_label})
110
if Dan_test:
111
assert F_hmf is not None # Assuming the hmf field is already there!
112
if F_hmf is None:
113
# Create list of ideals
114
print("...adding!")
115
ideals = eval(preparse(magma.eval('nice_idealstr(F);')))
116
ideals_str = [str(c) for c in ideals]
117
if test:
118
print("Would now insert data for %s into hmf_fields" % field_label)
119
else:
120
hmf_fields.insert_one({"label": field_label,
121
"degree": n,
122
"discriminant": d,
123
"ideals": ideals_str})
124
F_hmf = hmf_fields.find_one({"label": field_label})
125
else:
126
print("...found!")
127
128
print("Computing ideals...")
129
ideals_str = F_hmf['ideals']
130
ideals = [eval(preparse(c)) for c in ideals_str]
131
ideals_norms = [c[0] for c in ideals]
132
magma.eval('ideals_str := [' + ''.join(F_hmf['ideals']).replace('][', '], [') + ']')
133
magma.eval('ideals := [ideal<ZF | {F!x : x in I}> : I in ideals_str];')
134
135
# Add the list of primes
136
print("Computing primes...")
137
v = hmff.readline() # Skip line
138
v = hmff.readline()
139
assert v[:9] == 'PRIMES :='
140
primes_str = v[10:][:-2]
141
primes_array = [str(t) for t in eval(preparse(primes_str))]
142
magma.eval('primes_array := ' + primes_str)
143
magma.eval('primes := [ideal<ZF | {F!x : x in I}> : I in primes_array];')
144
magma.eval('primes_indices := [Index(ideals, pp) : pp in primes];')
145
try:
146
assert magma('&and[primes_indices[j] gt primes_indices[j-1] : j in [2..#primes_indices]]')
147
resort = False
148
except AssertionError:
149
print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Primes reordered!")
150
resort = True
151
magma.eval('_, sigma := Sort(primes_indices, func<x,y | x-y>);')
152
magma.eval('perm := [[xx : xx in x] : x in CycleDecomposition(sigma) | #x gt 1]')
153
# Check at least they have the same norm
154
magma.eval('for tau in perm do assert #{Norm(ideals[primes_indices[t]]) : t in tau} eq 1; end for;')
155
primes_resort = eval(magma.eval('Eltseq(sigma)'))
156
primes_resort = [c - 1 for c in primes_resort]
157
158
primes_indices = eval(magma.eval('primes_indices'))
159
primes_str = [ideals_str[j - 1] for j in primes_indices]
160
assert len(primes_array) == len(primes_str)
161
print("...comparing...")
162
for i in range(len(primes_array)):
163
assert magma('ideal<ZF | {F!x : x in ' + primes_array[i] + '}> eq '
164
+ 'ideal<ZF | {F!x : x in ' + primes_str[i] + '}>;')
165
if resort:
166
# Important also to resort the list of primes themselves!
167
# not just the a_pp's
168
primes_str = [primes_str[i] for i in primes_resort]
169
if Dan_test:
170
assert 'primes' in F_hmf # DY: want to make sure the fields are not touched!
171
if 'primes' in F_hmf: # Nothing smart: make sure it is the same
172
assert F_hmf['primes'] == primes_str
173
else:
174
F_hmf['primes'] = primes_str
175
if test:
176
print("Would now save primes string %s... into hmf_fields" % primes_str[:100])
177
else:
178
hmf_fields.replace_one(F_hmf)
179
print("...saved!")
180
181
# Collect levels
182
v = hmff.readline()
183
if v[:9] == 'LEVELS :=':
184
# Skip this line since we do not use the list of levels
185
v = hmff.readline()
186
for i in range(3):
187
if v[:11] != 'NEWFORMS :=':
188
v = hmff.readline()
189
else:
190
break
191
192
# Finally, newforms!
193
print("Starting newforms!")
194
while v != '':
195
v = hmff.readline()[1:-3]
196
if len(v) == 0:
197
break
198
data = eval(preparse(v))
199
level_ideal = data[0]
200
level_norm = data[0][0]
201
label_suffix = fix_one_label(data[1])
202
weight = [2 for i in range(n)]
203
label_nsuffix = class_to_int(label_suffix)
204
205
level_ind = int(magma('Index(ideals, ideal<ZF | {F!x : x in ' + str(level_ideal) + '}>)')
206
) - 1 # Magma counts starting at 1
207
level_ideal = ideals_str[level_ind]
208
assert magma('ideal<ZF | {F!x : x in ' + str(level_ideal) + '}> eq '
209
+ 'ideal<ZF | {F!x : x in ' + str(data[0]) + '}>;')
210
level_dotlabel = level_ind - ideals_norms.index(level_norm) + 1 # Start counting at 1
211
assert level_dotlabel > 0
212
level_label = str(level_norm) + '.' + str(level_dotlabel)
213
214
label = construct_full_label(field_label, weight, level_label, label_suffix)
215
short_label = level_label + '-' + label_suffix
216
217
if len(data) == 3:
218
hecke_polynomial = x
219
hecke_eigenvalues = data[2]
220
else:
221
hecke_polynomial = data[2]
222
hecke_eigenvalues = data[3]
223
224
if resort:
225
hecke_eigenvalues = [hecke_eigenvalues[i] for i in primes_resort]
226
227
# Constrain eigenvalues to size 2MB
228
hecke_eigenvalues = [str(c) for c in hecke_eigenvalues]
229
leftout = 0
230
while sum([len(s) for s in hecke_eigenvalues]) > 2000000:
231
hecke_eigenvalues = hecke_eigenvalues[:-1]
232
leftout += 1
233
# commented code below throws an error. use above.
234
# just be safe and remove one eigenvalue at a time.
235
# Aurel's code will adjust and remove extra when needed.
236
#q = primes_resort[len(hecke_eigenvalues)]
237
#while primes_resort[len(hecke_eigenvalues)] == q:
238
# # Remove all with same norm
239
# leftout += 1
240
# hecke_eigenvalues = hecke_eigenvalues[:-1]
241
242
if leftout > 0:
243
print("Left out", leftout)
244
245
info = {"label": label,
246
"short_label": short_label,
247
"field_label": field_label,
248
"level_norm": int(level_norm),
249
"level_ideal": str(level_ideal),
250
"level_label": level_label,
251
"weight": str(weight),
252
"label_suffix": label_suffix,
253
"label_nsuffix" : label_nsuffix,
254
"dimension": hecke_polynomial.degree(),
255
"hecke_polynomial": str(hecke_polynomial),
256
"hecke_eigenvalues": hecke_eigenvalues} # DY: don't deal with AL right now.
257
#,
258
#"AL_eigenvalues": [[str(a[0]), str(a[1])] for a in AL_eigenvalues]}
259
print(info['label'])
260
261
existing_forms = hmf_forms.find({"label": label})
262
assert existing_forms.count() <= 1
263
if existing_forms.count() == 0:
264
if test:
265
print("Would now insert form data %s into hmf_forms" % info)
266
else:
267
hmf_forms.insert_one(info)
268
else:
269
existing_form = next(existing_forms)
270
assert info['hecke_polynomial'] == existing_form['hecke_polynomial']
271
try:
272
assert info['hecke_eigenvalues'] == existing_form['hecke_eigenvalues']
273
print("...duplicate")
274
except AssertionError:
275
print("...Hecke eigenvalues do not match! Checking for permutation")
276
assert set(info['hecke_eigenvalues'] + ['0','1','-1']) == set(existing_form['hecke_eigenvalues'] + [u'0',u'1',u'-1'])
277
# Add 0,1,-1 to allow for Atkin-Lehner eigenvalues, if not computed
278
print("As sets, ignoring 0,1,-1, the eigenvalues match!")
279
if test:
280
print("Would now replace permuted form data %s with %s" % (existing_form, info))
281
else:
282
existing_form['hecke_eigenvalues'] = info['hecke_eigenvalues']
283
hmf_forms.save(existing_form)
284
285
286
def repair_fields(D):
287
F = hmf_fields.find_one({"label": '2.2.' + str(D) + '.1'})
288
289
P = PolynomialRing(QQ, 'w')
290
# P is used implicitly in the eval() calls below. When these are
291
# removed, this will not longer be neceesary, but until then the
292
# assert statement is for pyflakes.
293
assert P
294
295
primes = F['primes']
296
primes = [[int(eval(p)[0]), int(eval(p)[1]), str(eval(p)[2])] for p in primes]
297
F['primes'] = primes
298
299
hmff = open("data_2_" + (4 - len(str(D))) * '0' + str(D))
300
301
# Parse field data
302
for i in range(7):
303
v = hmff.readline()
304
ideals = eval(v[10:][:-2])
305
ideals = [[p[0], p[1], str(p[2])] for p in ideals]
306
F['ideals'] = ideals
307
hmf_fields.save(F)
308
309
310
def repair_fields_add_ideal_labels(D):
311
F = hmf_fields.find_one({"label": '2.2.' + str(D) + '.1'})
312
313
ideals = F['ideals']
314
ideal_labels = ['1.1']
315
N = 1
316
cnt = 1
317
for I in ideals[2:]:
318
NI = I[0]
319
if NI == N:
320
cnt += 1
321
else:
322
cnt = 1
323
N = NI
324
ideal_labels.append(str(NI) + '.' + str(cnt))
325
F['ideal_labels'] = ideal_labels
326
hmf_fields.save(F)
327
328
329
def attach_new_label(f):
330
print(f['label'])
331
F = hmf_fields.find_one({"label": f['field_label']})
332
333
P = PolynomialRing(QQ, 'w')
334
# P is used implicitly in the eval() calls below. When these are
335
# removed, this will not longer be neceesary, but until then the
336
# assert statement is for pyflakes.
337
assert P
338
339
if isinstance(f['level_ideal'], str):
340
N = eval(f['level_ideal'])
341
else:
342
N = f['level_ideal']
343
if type(N) != list or len(N) != 3:
344
print(f, N, type(N))
345
assert False
346
347
f['level_ideal'] = [N[0], N[1], str(N[2])]
348
349
try:
350
ideal_label = F['ideal_labels'][F['ideals'].index(f['level_ideal'])]
351
f['level_ideal_label'] = ideal_label
352
f['label'] = construct_full_label(f['field_label'], f['weight'], f['level_ideal_label'], f['label_suffix'])
353
hmf_forms.save(f)
354
print(f['label'])
355
except ValueError:
356
hmf_forms.remove(f)
357
print("REMOVED!")
358
359
360
361
362
363
364
## ========= COPIED from import_hmf_extra_gnu_phase_0.py on 7-18-2017
365
366
def parseALstring(s):
367
# Drop first char bracket
368
#in [[4,2,1/2*w^3-2*w],-1],[[191,191,-w^3-2*w^2+5*w+7],-1]]
369
#out ['[[4', '2', '1/2*w^3-2*w]', '-1]', '[[191', '191', '-w^3-2*w^2+5*w+7]', '-1]]']
370
if s == '[]':
371
return []
372
s = s[1:-1]
373
sm = s.split(',')
374
outlist = []
375
#print s, sm
376
assert len(sm) % 4 == 0
377
for i in range(len(sm) // 4):
378
outlist += [[sm[4*i][1:]+","+sm[4*i+1]+","+sm[4*i+2], sm[4*i+3][:-1]]]
379
return outlist
380
381
382
def import_extra_data(hmf_extra_filename, fileprefix=None, ferrors=None, test=True):
383
'''
384
put in docstring!
385
'''
386
if ferrors is None:
387
if Dan_test:
388
ferrors = open('/Users/d_yasaki/repos/lmfdb/lmfdb/scripts/hmf/fixing-permuted-primes/import_extra.err', 'a')
389
else:
390
ferrors = open('/home/jvoight/lmfdb/backups/import_data.err', 'a')
391
field_label = hmf_extra_filename.split('-')[0]
392
if fileprefix is None:
393
fileprefix="."
394
hmff = open(os.path.join(fileprefix, hmf_extra_filename))
395
396
with hmff as infile:
397
# assumes the input filename starts with the field label.
398
F = hmf_fields.find_one({'label':field_label})
399
assert F is not None
400
clean_primes = [p.replace(' ','') for p in F['primes']]
401
402
print(clean_primes)
403
404
for line in infile:
405
# 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]
406
line_keys = ['label', 'level_ideal','is_CM','is_base_change','AL_eigenvalues','AL_eigenvalues_fixed']
407
data = line.split(':')
408
label = data[0]
409
f = hmf_forms.find_one({'label':label})
410
if f is None:
411
continue
412
assert f['field_label'] == field_label
413
f['AL_eigenvalues'] = parseALstring(data[line_keys.index('AL_eigenvalues')])
414
enter_keys = ['is_CM','is_base_change','AL_eigenvalues_fixed']
415
for k in enter_keys:
416
f[k] = data[line_keys.index(k)]
417
# need to fix some aps: data[-1]
418
# adjust f['hecke_eigenvalues']
419
if len(data) > 6:
420
# there are ap to fix
421
for apfix in data[6:]:
422
pp = apfix.rstrip()[1:-1].split('],')[0] + ']'
423
ap = apfix.rstrip()[1:-1].split('],')[1]
424
if ap not in {'1', '-1'}:
425
print('????? ', ap, label)
426
assert ap in {'1', '-1'}
427
if clean_primes.index(pp) < len(f['hecke_eigenvalues']):
428
try:
429
assert f['hecke_eigenvalues'][clean_primes.index(pp)] in {'0','1','-1'}
430
except AssertionError:
431
print(f['hecke_eigenvalues'][clean_primes.index(pp)])
432
print(f)
433
assert False
434
f['hecke_eigenvalues'][clean_primes.index(pp)] = ap
435
else:
436
print('!!! a_pp not corrected since not many stored !!!')
437
if not test:
438
print(label)
439
hmf_forms.save(f)
440
else:
441
print(f)
442
443
444
445
446