import os import sys import subprocess from pathlib import Path import gradio as gr ROOT = Path(__file__).resolve().parent DOWN_ROOT = ROOT / "Down" STRANGE_ROOT = ROOT / "Strange" DOWN_GRAPHICS = DOWN_ROOT / "graphics" STRANGE_GRAPHICS = STRANGE_ROOT / "graphics" DOWN_RESULTS = DOWN_ROOT / "results" STRANGE_RESULTS = STRANGE_ROOT / "results" STYLE_PATH = ROOT / "style.css" CSS = STYLE_PATH.read_text(encoding="utf-8") if STYLE_PATH.exists() else "" JS = r""" () => { if (window.__tq_starfield_running) return; function initOnceDomReady() { const canvas = document.getElementById("quantumField"); const btn = document.getElementById("tqMenuBtn"); const menu = document.getElementById("tqMenu"); if (!canvas) return false; if (btn && menu && !btn.__tq_bound) { btn.__tq_bound = true; btn.addEventListener("click", () => menu.classList.toggle("open")); document.addEventListener("click", (e) => { if (!menu.contains(e.target) && !btn.contains(e.target)) { menu.classList.remove("open"); } }); } const ctx = canvas.getContext("2d"); if (!ctx) return true; let w = 0, h = 0; let dpr = 1; const stars = []; const N = 170; function resize() { dpr = Math.max(1, window.devicePixelRatio || 1); canvas.style.width = window.innerWidth + "px"; canvas.style.height = window.innerHeight + "px"; canvas.width = Math.floor(window.innerWidth * dpr); canvas.height = Math.floor(window.innerHeight * dpr); ctx.setTransform(dpr, 0, 0, dpr, 0, 0); w = window.innerWidth; h = window.innerHeight; } function seed() { stars.length = 0; for (let i = 0; i < N; i++) { stars.push({ x: Math.random() * w, y: Math.random() * h, z: 0.2 + Math.random() * 0.8, v: 0.15 + Math.random() * 0.55, }); } } function tick() { ctx.clearRect(0, 0, w, h); const g = ctx.createRadialGradient(w/2, h/2, 10, w/2, h/2, Math.max(w,h)/1.1); g.addColorStop(0, "rgba(0,0,0,0)"); g.addColorStop(1, "rgba(0,0,0,0.55)"); ctx.fillStyle = g; ctx.fillRect(0, 0, w, h); ctx.globalAlpha = 0.9; ctx.fillStyle = "rgba(255,255,255,0.75)"; for (const s of stars) { s.y += s.v * (1.0 + (1.0 - s.z)); if (s.y > h + 10) { s.y = -10; s.x = Math.random() * w; } const r = 0.6 + 1.6 * (1.0 - s.z); ctx.beginPath(); ctx.arc(s.x, s.y, r, 0, Math.PI * 2); ctx.fill(); } requestAnimationFrame(tick); } resize(); seed(); if (!window.__tq_resize_bound) { window.__tq_resize_bound = true; window.addEventListener("resize", () => { resize(); seed(); }); } window.__tq_starfield_running = true; tick(); return true; } let tries = 0; const maxTries = 30; const timer = setInterval(() => { tries += 1; const ok = initOnceDomReady(); if (ok || tries >= maxTries) clearInterval(timer); }, 120); } """ def _clean_pngs(folder: Path): folder.mkdir(parents=True, exist_ok=True) for f in folder.rglob("*.png"): try: f.unlink() except Exception: pass def _collect_pngs(folder: Path): if not folder.exists(): return [] return sorted(str(p.resolve()) for p in folder.rglob("*.png")) def _run_capture(cmd, cwd: Path, env: dict, timeout_s: int = 900): try: result = subprocess.run( cmd, cwd=str(cwd), env=env, capture_output=True, text=True, timeout=timeout_s, ) except subprocess.TimeoutExpired as e: raise RuntimeError( "Subprocess timed out\n" f"CMD: {' '.join(map(str, cmd))}\n" f"CWD: {cwd}\n" f"TIMEOUT: {timeout_s}s\n" ) from e if result.returncode != 0: raise RuntimeError( "Subprocess failed\n" f"CMD: {' '.join(map(str, cmd))}\n" f"CWD: {cwd}\n\n" f"STDOUT:\n{result.stdout}\n" f"STDERR:\n{result.stderr}" ) return result.stdout, result.stderr def run_down_all(episodes: int): run_all = DOWN_ROOT / "run_all.py" if not run_all.exists(): raise RuntimeError(f"{run_all} not found (folder must be 'Down/')") DOWN_GRAPHICS.mkdir(parents=True, exist_ok=True) DOWN_RESULTS.mkdir(parents=True, exist_ok=True) _clean_pngs(DOWN_GRAPHICS) env = os.environ.copy() env["TWOQUARKS_RESULTS_DIR"] = str(DOWN_RESULTS) env["TWOQUARKS_GRAPHICS_DIR"] = str(DOWN_GRAPHICS) cmd = [sys.executable, str(run_all), "--episodes", str(int(episodes))] _run_capture(cmd, cwd=DOWN_ROOT, env=env, timeout_s=1200) images = _collect_pngs(DOWN_GRAPHICS) meta = { "status": "completed", "pipeline": "DOWN + AntiDown", "episodes_per_phase": int(episodes), "graphics_count": len(images), "graphics_dir": str(DOWN_GRAPHICS), "results_dir": str(DOWN_RESULTS), "csv_down": str(DOWN_RESULTS / "down_paradox_tabular_results.csv"), "csv_antidown": str(DOWN_RESULTS / "antidown_corrupted_valley_tabular.csv"), } return meta, images def run_strange_all(): run_all = STRANGE_ROOT / "run_all.py" if not run_all.exists(): raise RuntimeError(f"{run_all} not found (folder must be 'Strange/')") STRANGE_GRAPHICS.mkdir(parents=True, exist_ok=True) STRANGE_RESULTS.mkdir(parents=True, exist_ok=True) _clean_pngs(STRANGE_GRAPHICS) env = os.environ.copy() env["TWOQUARKS_RESULTS_DIR"] = str(STRANGE_RESULTS) env["TWOQUARKS_GRAPHICS_DIR"] = str(STRANGE_GRAPHICS) cmd = [sys.executable, str(run_all)] _run_capture(cmd, cwd=STRANGE_ROOT, env=env, timeout_s=1200) images = _collect_pngs(STRANGE_GRAPHICS) meta = { "status": "completed", "pipeline": "STRANGE + AntiStrange", "graphics_count": len(images), "graphics_dir": str(STRANGE_GRAPHICS), "results_dir": str(STRANGE_RESULTS), } return meta, images def build_ui(): with gr.Blocks(title="TwoQuarks — QuarksLab", css=CSS, js=JS) as demo: gr.HTML( """ """ ) with gr.Column(elem_id="tq-app"): gr.Markdown( """