Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
AndrewVSutherland
GitHub Repository: AndrewVSutherland/lmfdb
Path: blob/main/scripts/hypergm/import_hgm.py
1452 views
1
#!/usr/local/bin/sage -python
2
# -*- coding: utf-8 -*-
3
4
import sys
5
import json
6
import os
7
import gzip
8
import re
9
from collections import Counter as mset
10
from sage.all import euler_phi, valuation, QQ
11
12
sys.path.append('/home/jj/data/lmfdb/data_mgt/utilities')
13
pw_path = "../../"
14
pw_filename = "xyzzy"
15
password = open(pw_path+pw_filename, "r").readlines()[0].strip()
16
17
#from pymongo import *
18
19
from pymongo.mongo_client import MongoClient
20
C= MongoClient(port=37010, host='lmfdb-ib')
21
C['hgm'].authenticate('editor', password)
22
23
hgm = C.hgm.newmotives
24
#hgm = C.hgm.motives
25
26
saving = True
27
28
count = 0
29
30
#hgm.drop()
31
#time.sleep(3)
32
33
# New game plan:
34
# - make a list of python dictionaries
35
# - insert them all in one shot!
36
37
newrecs = []
38
39
def list2string(li):
40
li2 = [str(x) for x in li]
41
return ','.join(li2)
42
43
def fixname(s):
44
a = re.sub(r'C(\d+)', r'C_{\1}',str(s))
45
a = re.sub(r'S(\d+)', r'S_{\1}',a)
46
a = re.sub(r'A(\d+)', r'A_{\1}',a)
47
a = re.sub(r'D(\d+)', r'D_{\1}',a)
48
return a
49
50
def pnotp(a,p):
51
pv = p**valuation(a,p)
52
return [pv, a/pv]
53
54
# Insert both forms into the database
55
def modvec(A,p):
56
Ap = []
57
for a in A:
58
ap, aprime = pnotp(a,p)
59
Ap.extend([ap]*euler_phi(aprime))
60
Ap.sort(reverse=True)
61
return Ap
62
63
def modvecupper(A,p):
64
Ap = []
65
for a in A:
66
ap, aprime = pnotp(a,p)
67
Ap.extend([aprime]*euler_phi(ap))
68
Ap.sort(reverse=True)
69
return Ap
70
71
def killdup(A,B):
72
aa=mset(A)
73
bb=mset(B)
74
cc=aa & bb
75
aa.subtract(cc)
76
bb.subtract(cc)
77
aa = list(aa.elements())
78
aa.sort(reverse=True)
79
bb = list(bb.elements())
80
bb.sort(reverse=True)
81
cc = list(cc.elements())
82
cc.sort(reverse=True)
83
return([aa,bb,cc])
84
85
def galmunge(gg):
86
gg[1][2] = fixname(gg[1][2])
87
return gg
88
89
def fixsort(gg):
90
for k in range(3):
91
gg[1][3][k] = sorted(gg[1][3][k], reverse=True)
92
return gg
93
94
def modpair(A,B,p):
95
return [modvec(A,p),modvec(B,p)]
96
97
def modupperpair(A,B,p):
98
return [modvecupper(A,p),modvecupper(B,p)]
99
100
def orderAB(A,B):
101
if 1 in B:
102
return [A,B]
103
if 1 in A:
104
return [B,A]
105
if A[-1]<B[-1]:
106
return [A,B]
107
return [B,A]
108
109
def do_addrec(F):
110
global newrecs
111
degree, weight, A, B, t, famhodge, hodge, conductor, sign, sig, locinfo, lcms, hardness, coeffs = F
112
A,B = orderAB(A,B)
113
A.sort(reverse=True)
114
B.sort(reverse=True)
115
Astr = '.'.join([str(x) for x in A])
116
Bstr = '.'.join([str(x) for x in B])
117
myt = QQ(str(t[1])+'/'+str(t[0]))
118
tstr = str(myt.numerator())+'.'+str(myt.denominator())
119
label = "A%s_B%s_t%s" % (Astr, Bstr, tstr)
120
121
data = {
122
'label': label,
123
'degree': degree,
124
'weight': weight,
125
't': str(myt),
126
'A': list2string(A),
127
'B': list2string(B),
128
'Arev': list2string(B),
129
'Brev': list2string(A),
130
'hodge': list2string(hodge),
131
'famhodge': list2string(famhodge),
132
'sign': sign,
133
'sig': sig,
134
'req': hardness,
135
'coeffs': coeffs,
136
'lcms': lcms,
137
'cond': conductor,
138
'locinfo': locinfo,
139
'centralval': 0
140
}
141
for p in [2,3,5,7]:
142
mod = modpair(A,B,p)
143
mod = killdup(mod[0],mod[1])
144
data['A'+str(p)] = list2string(mod[0])
145
data['B'+str(p)] = list2string(mod[1])
146
data['C'+str(p)] = list2string(mod[2])
147
mod = modpair(B,A,p)
148
mod = killdup(mod[0],mod[1])
149
data['A'+str(p)+'rev'] = list2string(mod[0])
150
data['B'+str(p)+'rev'] = list2string(mod[1])
151
mod = modupperpair(A,B,p)
152
mod = killdup(mod[0],mod[1])
153
data['Au'+str(p)] = list2string(mod[0])
154
data['Bu'+str(p)] = list2string(mod[1])
155
data['Cu'+str(p)] = list2string(mod[2])
156
data['Bu'+str(p)+'rev'] = list2string(mod[0])
157
data['Au'+str(p)+'rev'] = list2string(mod[1])
158
159
is_new = True
160
for field in hgm.find({'label': label}):
161
is_new = False
162
break
163
164
for k in newrecs:
165
if k['label'] == label:
166
is_new = False
167
break
168
169
if is_new:
170
#print "new family"
171
newrecs.append(data)
172
#else:
173
#print "Have this one"
174
175
for path in sys.argv[1:]:
176
print(path)
177
filename = os.path.basename(path)
178
fn = gzip.open(path) if filename[-3:] == '.gz' else open(path)
179
dat = fn.read().replace('\n', ' ')
180
dat = dat.replace('>',']')
181
dat = dat.replace('<','[')
182
dat = dat.replace("'",'"')
183
l = json.loads(dat)
184
for motfam in l:
185
do_addrec(motfam)
186
count += 1
187
#print "Count %d"%(count)
188
fn.close()
189
190
hgm.insert_many(newrecs)
191
192
193