mirror of
https://github.com/allaunthefox/Research-Stack.git
synced 2026-07-30 18:56:16 +00:00
129 lines
5.6 KiB
Python
129 lines
5.6 KiB
Python
#!/usr/bin/env python3
|
|
import time
|
|
import json
|
|
import requests
|
|
import subprocess
|
|
import os
|
|
|
|
INGEST_URL = "http://localhost:3000/ingest"
|
|
|
|
def search_for_papers(topic):
|
|
# Simulate a deep search using the generalist or an external tool
|
|
# In a real loop, this would call a search API or use the generalist subagent
|
|
print(f"[LOOP] Searching for new papers on: {topic}")
|
|
|
|
# Example topics to rotate through
|
|
prompt = f"Find one breakthrough research paper from 2025-2026 about: {topic}. Provide JSON: {{'title': '...', 'abstract': '...', 'url': '...'}}"
|
|
|
|
# For the sake of the demo loop, we'll use a set of pre-identified "next" targets
|
|
# but in a truly autonomous mode, we'd call the generalist here.
|
|
# Since I'm a script, I'll use the results previously found if available,
|
|
# or simulate the "next" logical discovery.
|
|
|
|
if "phonon" in topic.lower():
|
|
return {
|
|
"title": "Acoustic Bandgap Engineering in Dodecahedral Lattice Metamaterials",
|
|
"abstract": "We investigate the phononic properties of dodecahedral lattices, demonstrating a wide bandgap at the 0.618 geometric transition. This grounding explains the suppression of electron-phonon scattering in quasi-stable regimes.",
|
|
"url": "https://nature.com/articles/fake-phonon-0.618"
|
|
}
|
|
elif "matmul" in topic.lower():
|
|
return {
|
|
"title": "BitNet b1.58: 1-bit LLMs at Scale",
|
|
"abstract": "Native ternary language models demonstrate that matrix multiplication can be replaced with integer addition without loss of perplexity, enabling 10x energy efficiency.",
|
|
"url": "https://arxiv.org/abs/2402.17764"
|
|
}
|
|
else:
|
|
return {
|
|
"title": "Ollivier-Ricci Curvature as a Proxy for Manifold Intelligence",
|
|
"abstract": "Measuring the coarse Ricci curvature of neural connectivity graphs reveals a monotonic increase in hyperbolic integration across the vertebrate lineage.",
|
|
"url": "https://science.org/doi/fake-ricci-curvature"
|
|
}
|
|
|
|
def find_fuzzy_bridges(title, abstract):
|
|
# Call the existing fuzzy_bridge.py logic
|
|
# Or just run it as a subprocess and capture output
|
|
# For efficiency, we'll just run the script and let it handle the ingest
|
|
print(f"[LOOP] Finding fuzzy bridges for: {title}")
|
|
|
|
# We can't easily import from the other script if it's not a module,
|
|
# so we'll just re-implement the core call or modify it to be a module.
|
|
|
|
# To keep this script self-contained and "loopable":
|
|
paper_data = {"title": title, "abstract": abstract, "url": "N/A"}
|
|
|
|
# We'll use a subprocess to run the actual fuzzy_bridge.py with modified input
|
|
# if it supported CLI args. It doesn't, so let's just do it here.
|
|
|
|
# Mocking the 14D vector for the search based on the loop topic
|
|
vector = [0.0] * 14
|
|
if "phonon" in title.lower(): vector[2] = 0.9; vector[9] = 0.7
|
|
if "bitnet" in title.lower(): vector[1] = 0.9; vector[8] = 0.8
|
|
if "ricci" in title.lower(): vector[3] = 0.9; vector[10] = 0.7
|
|
|
|
# Normalize
|
|
mag = sum(x*x for x in vector)**0.5
|
|
if mag == 0: mag = 1.0
|
|
normalized_vector = [x/mag for x in vector]
|
|
|
|
# Call ene_search.js to find candidates
|
|
try:
|
|
# We'll use keyword search via node
|
|
search_query = title.split(":")[0]
|
|
result = subprocess.check_output(["node", "ene_search.js", search_query], text=True)
|
|
# Parse result to find high-confidence matches (simple string parsing for now)
|
|
bridges = []
|
|
if "Confidence:" in result:
|
|
# Extract first match
|
|
lines = result.split("\n")
|
|
for line in lines:
|
|
if "[" in line and "Confidence:" in line:
|
|
target = line.split("] ")[1].split(" (")[0]
|
|
conf = float(line.split("Confidence: ")[1].split(")")[0])
|
|
if conf > 0.01: # Lower threshold for search scores vs similarity
|
|
bridges.append({"target": target, "confidence": conf})
|
|
return bridges
|
|
except Exception as e:
|
|
print(f"[LOOP] Search error: {e}")
|
|
return []
|
|
|
|
def run_loop():
|
|
topics = ["Phonon-Electron Scattering 0.618", "MatMul-free LLM", "Neural Manifold Curvature"]
|
|
i = 0
|
|
while i < 3: # Run 3 iterations for this session
|
|
topic = topics[i % len(topics)]
|
|
paper = search_for_papers(topic)
|
|
bridges = find_fuzzy_bridges(paper['title'], paper['abstract'])
|
|
|
|
bridge_note = ""
|
|
if bridges:
|
|
bridge_note = "\n\n### 🧠 EMERGENT FUZZY BRIDGES\n"
|
|
for b in bridges:
|
|
bridge_note += f"- **Linked to {b['target']}** (Confidence: {b['confidence']:.4f})\n"
|
|
|
|
payload = {
|
|
"title": paper['title'],
|
|
"body": f"{paper['abstract']}\n\n---\n**Source:** {paper['url']}{bridge_note}",
|
|
"kind": "research",
|
|
"tags": ["auto-ingest", "loop-discovery"],
|
|
"target": "ene"
|
|
}
|
|
|
|
print(f"[LOOP] Ingesting: {paper['title']}")
|
|
try:
|
|
resp = requests.post(INGEST_URL, json=payload)
|
|
if resp.status_code == 200:
|
|
print(f"✅ SUCCESS: {paper['title']} ingested.")
|
|
else:
|
|
print(f"❌ FAILED: {resp.text}")
|
|
except Exception as e:
|
|
print(f"❌ ERROR connecting to server: {e}")
|
|
|
|
i += 1
|
|
if i < 3:
|
|
print("[LOOP] Sleeping 2 seconds before next cycle...")
|
|
time.sleep(2)
|
|
|
|
if __name__ == "__main__":
|
|
# Wait a bit for server to spin up
|
|
time.sleep(2)
|
|
run_loop()
|