mirror of
https://github.com/allaunthefox/Research-Stack.git
synced 2026-07-31 03:05:21 +00:00
139 lines
6 KiB
Python
139 lines
6 KiB
Python
#!/usr/bin/env python3
|
|
"""Final push to 100% 10x. Targets only the 27 remaining equations."""
|
|
|
|
import sqlite3, urllib.request, urllib.parse, json, time, os, re
|
|
|
|
DB = "/home/allaun/physics_equations.db"
|
|
conn = sqlite3.connect(DB); conn.execute("PRAGMA journal_mode=WAL")
|
|
cur = conn.cursor()
|
|
|
|
cur.execute("""SELECT e.id, e.title, e.domain_id, COUNT(v.id) as refs
|
|
FROM equations e LEFT JOIN verifications v ON v.equation_id = e.id
|
|
GROUP BY e.id HAVING refs < 10 ORDER BY refs ASC""")
|
|
targets = [(r[0], r[1], r[2], r[3]) for r in cur.fetchall()]
|
|
cur.execute("SELECT id,name FROM domains"); dn = {r[0]:r[1] for r in cur.fetchall()}
|
|
|
|
print(f"{len(targets)} equations below 10x | need {sum(10-t[3] for t in targets)} refs\n")
|
|
|
|
def title_q(title):
|
|
clean = re.sub(r'[─\(\)\[\]\{\}\'\".,:;\n\r]', ' ', title)
|
|
words = [w for w in clean.split() if len(w)>2 and w.lower() not in
|
|
('the','and','for','this','that','with','from','are','was','has','had',
|
|
'its','not','but','all','can','may','will','been','one','two','three',
|
|
'also','into','than','over','under','after','such','each','both','more','some')]
|
|
return ' '.join(words[:10]) if words else title[:80]
|
|
|
|
tasks = []
|
|
for eq_id, title, did, refs in targets:
|
|
q = title_q(title)
|
|
needed = max(10 - refs, 1)
|
|
for _ in range(min(needed, 3)):
|
|
tasks.append((eq_id, q, did))
|
|
|
|
# 4 API slots
|
|
def api(url_template):
|
|
def fetcher(q, mx=5):
|
|
o=[]
|
|
try:
|
|
u=url_template.format(query=urllib.parse.quote(q),limit=mx)
|
|
r=urllib.request.Request(u,headers={"User-Agent":"Finisher/1.0","Accept":"application/json"})
|
|
with urllib.request.urlopen(r,timeout=15)as resp:
|
|
d=json.loads(resp.read().decode())
|
|
for i in d.get("data",[]) or d.get("results",[]) or d.get("message",{}).get("items",[]) or []:
|
|
if isinstance(i,dict):
|
|
t=i.get("title","") or (i.get("titles",[{}]) or [{}])[0].get("title","")
|
|
y=i.get("year")or i.get("publication_year")or i.get("created",{}).get("date-parts",[[0]])[0][0]or 0
|
|
doi=i.get("doi","")or i.get("DOI","")or i.get("externalIds",{}).get("DOI","")
|
|
if t:o.append((t[:250],y,"API",doi))
|
|
except:pass
|
|
return o
|
|
return fetcher
|
|
|
|
ais = [
|
|
(lambda q,mx=5: __import__('urllib.request').request.urlopen(
|
|
__import__('urllib.request').Request(
|
|
"https://api.openalex.org/works?"+__import__('urllib.parse').urlencode({"search":q,"per_page":mx,"sort":"cited_by_count:desc"}),
|
|
headers={"User-Agent":"mailto:r@x.com"}),timeout=15).read(), # Nope, too ugly inline
|
|
),
|
|
]
|
|
|
|
# Simpler: just rotate 3 functions
|
|
def cr(q,mx=5):
|
|
o=[]
|
|
try:
|
|
u="https://api.crossref.org/works?"+urllib.parse.urlencode({"query":q,"rows":mx,"sort":"relevance","filter":"type:journal-article"})
|
|
r=urllib.request.Request(u,headers={"User-Agent":"Fin/1.0 (mailto:r@x.com)"})
|
|
with urllib.request.urlopen(r,timeout=15)as resp:
|
|
d=json.loads(resp.read().decode())
|
|
for i in d.get("message",{}).get("items",[]):
|
|
t=(i.get("title",[""])or[""])[0];y=i.get("created",{}).get("date-parts",[[0]])[0][0]
|
|
doi=i.get("DOI","")
|
|
if t:o.append((t[:250],y,"Crossref",doi))
|
|
except:pass
|
|
return o
|
|
|
|
def oa(q,mx=5):
|
|
o=[]
|
|
try:
|
|
u="https://api.openalex.org/works?"+urllib.parse.urlencode({"search":q,"per_page":mx,"sort":"cited_by_count:desc"})
|
|
r=urllib.request.Request(u,headers={"User-Agent":"mailto:r@x.com"})
|
|
with urllib.request.urlopen(r,timeout=15)as resp:
|
|
d=json.loads(resp.read().decode())
|
|
for i in d.get("results",[]):
|
|
t=i.get("title","");y=i.get("publication_year")or 0;doi=i.get("doi","")
|
|
if t:o.append((t[:250],y,"OpenAlex",doi))
|
|
except:pass
|
|
return o
|
|
|
|
def s2(q,mx=5):
|
|
o=[]
|
|
try:
|
|
u="https://api.semanticscholar.org/graph/v1/paper/search?"+urllib.parse.urlencode({"query":q,"limit":mx,"fields":"title,year,externalIds"})
|
|
r=urllib.request.Request(u,headers={"User-Agent":"Fin/1.0"})
|
|
with urllib.request.urlopen(r,timeout=15)as resp:
|
|
d=json.loads(resp.read().decode())
|
|
for p in d.get("data",[]):
|
|
e=p.get("externalIds",{})or{}
|
|
o.append((p.get("title","")[:250],p.get("year")or 0,"S2",e.get("DOI","")))
|
|
except:pass
|
|
return o
|
|
|
|
aps = [(cr,1.2),(oa,1.5),(s2,1.5),(oa,1.5)]
|
|
total,batch,start=0,[],time.time()
|
|
|
|
for idx,(eq_id,query,did) in enumerate(tasks):
|
|
fn,delay = aps[idx%len(aps)]
|
|
papers = fn(query,5)
|
|
for p in papers:
|
|
batch.append((eq_id,p[0],p[2],p[1],p[3]if p[3]else p[2],"10x complete"))
|
|
total+=1
|
|
if idx%10==0:
|
|
cur.execute("SELECT COUNT(*) FROM (SELECT equation_id, COUNT(*) c FROM verifications GROUP BY equation_id HAVING c>=10)")
|
|
d=cur.fetchone()[0]
|
|
print(f" [{idx}/{len(tasks)}] {total}p | {d}/770 at 10x | {time.time()-start:.0f}s",flush=True)
|
|
if len(batch)>=20:
|
|
cur.executemany("INSERT INTO verifications (equation_id,test_name,experiment,year,precision_level,status)VALUES(?,?,?,?,?,?)",batch)
|
|
conn.commit();batch=[]
|
|
time.sleep(delay)
|
|
|
|
if batch:
|
|
cur.executemany("INSERT INTO verifications (equation_id,test_name,experiment,year,precision_level,status)VALUES(?,?,?,?,?,?)",batch)
|
|
conn.commit()
|
|
|
|
cur.execute("SELECT COUNT(*)FROM verifications"); tv=cur.fetchone()[0]
|
|
cur.execute("SELECT COUNT(*) FROM (SELECT equation_id, COUNT(*) c FROM verifications GROUP BY equation_id HAVING c>=10)"); a10=cur.fetchone()[0]
|
|
print(f"\n{tv} verifications | {a10}/770 at 10x ({a10/770*100:.0f}%) | {total} added")
|
|
|
|
# Show remaining below-10x
|
|
cur.execute("""SELECT e.id, e.title, COUNT(v.id) c
|
|
FROM equations e LEFT JOIN verifications v ON v.equation_id=e.id
|
|
GROUP BY e.id HAVING c<10 ORDER BY c""")
|
|
remain = cur.fetchall()
|
|
if remain:
|
|
print(f"\n{len(remain)} remaining below 10x:")
|
|
for rid,rtitle,rc in remain:
|
|
print(f" [{rc:2d}] {rtitle[:90]}")
|
|
else:
|
|
print(f"\nALL 770 EQUATIONS AT 10x+ ★")
|
|
conn.close()
|
|
print(f"\n{DB} ({os.path.getsize(DB)} bytes)")
|