diff --git a/app.py b/app.py index 056b459..6a32f59 100644 --- a/app.py +++ b/app.py @@ -3,8 +3,11 @@ This provides a comprehensive web UI for the QPyth quantum computing library on Hugging Face Spaces. """ +import json + import gradio as gr -import numpy as np +from qiskit import QuantumCircuit + from quantumpytho.engine import QuantumEngine from quantumpytho.modules.bloch_ascii import one_qubit_from_angles from quantumpytho.modules.circuit_explorer import bell_pair @@ -25,8 +28,8 @@ def bloch_sphere_demo(theta, phi): def create_bell_pair(): """Create a Bell pair and return circuit diagram.""" try: - circuit = bell_pair() - return circuit.draw(output='text') + result = bell_pair(engine) + return result.circuit.draw(output="text") except Exception as e: return f"Error: {str(e)}" @@ -38,7 +41,9 @@ def run_quantum_teleport(): circuit = build_teleport_circuit() result = engine.run(circuit) - return f"Teleportation circuit executed successfully!\n\nCounts: {result.counts}" + return ( + f"Teleportation circuit executed successfully!\n\nCounts: {result.counts}" + ) except Exception as e: return f"Error: {str(e)}" @@ -56,6 +61,7 @@ def run_qec_demo(code_type="Shor"): return run_steane_qec_demo() else: # Surface from quantumpytho.modules.qec_surface import run_surface_code_demo + return run_surface_code_demo() except Exception as e: return f"Error: {str(e)}" @@ -78,60 +84,63 @@ def generate_qrng(count, phi_scale=False): except Exception as e: return f"Error: {str(e)}" + def run_vqe_h2(bond_length=0.74, shots=1024): """Run VQE for H2 molecule.""" try: - from quantumpytho.modules.vqe_h2_exact import compute_exact_energy from quantumpytho.modules.vqe_core import VQEEngine - + from quantumpytho.modules.vqe_h2_exact import compute_exact_energy + # Compute exact energy exact_energy = compute_exact_energy(bond_length) - + # Run VQE vqe_engine = VQEEngine() result = vqe_engine.run_h2(bond_length=bond_length, shots=shots) - + output = f"""VQE Results for H₂ Molecule: Bond Length: {bond_length} Å Shots: {shots} Exact Energy: {exact_energy:.6f} Hartree -VQE Energy: {result.get('energy', 'N/A')} Hartree -Error: {result.get('error', 'N/A')} Hartree +VQE Energy: {result.get("energy", "N/A")} Hartree +Error: {result.get("error", "N/A")} Hartree -Circuit Depth: {result.get('depth', 'N/A')} -Iterations: {result.get('iterations', 'N/A')} +Circuit Depth: {result.get("depth", "N/A")} +Iterations: {result.get("iterations", "N/A")} """ return output except Exception as e: return f"Error: {str(e)}" + def run_noisy_simulation(backend_profile="IBM", noise_level=0.01): """Run noisy simulation with backend profiles.""" try: - from quantumpytho.modules.noise_builder import NoiseModelBuilder from quantumpytho.modules.backend_profiles import get_backend_profile - + from quantumpytho.modules.noise_builder import NoiseModelBuilder + # Get backend profile profile = get_backend_profile(backend_profile) - + # Create circuit circuit = QuantumCircuit(2, 2) circuit.h(0) circuit.cx(0, 1) circuit.measure([0, 1], [0, 1]) - + # Build noise model noise_builder = NoiseModelBuilder() noise_model = noise_builder.build_from_profile(profile, noise_level) - + # Run with noise from qiskit_aer import AerSimulator + backend = AerSimulator(noise_model=noise_model) job = backend.run(circuit, shots=1024) result = job.result() counts = result.get_counts() - + output = f"""Noisy Simulation Results: Backend Profile: {backend_profile} Noise Level: {noise_level} @@ -146,28 +155,29 @@ def run_noisy_simulation(backend_profile="IBM", noise_level=0.01): except Exception as e: return f"Error: {str(e)}" + def explore_dna_circuits(sequence_name="ATCG"): """Explore DNA-inspired circuits.""" try: from quantumpytho.modules.dna_circuits import ( get_available_dna_sequences, get_dna_sequence, - summarize_dna_circuit + summarize_dna_circuit, ) - + # Get available sequences available = get_available_dna_sequences() - + # Get specific sequence sequence_data = get_dna_sequence(sequence_name) - + # Summarize summary = summarize_dna_circuit(sequence_name) - + output = f"""DNA Circuit Exploration: Sequence: {sequence_name} -Available Sequences: {', '.join(available[:10])}... +Available Sequences: {", ".join(available[:10])}... Sequence Data: {json.dumps(sequence_data, indent=2)} @@ -179,14 +189,15 @@ def explore_dna_circuits(sequence_name="ATCG"): except Exception as e: return f"Error: {str(e)}" + def run_tmt_sierpinski(): """Run TMT Sierpinski 21-qubit sacred geometry circuit.""" try: from quantumpytho.modules.tmt_sierpinski import build_tmt_circuit - + circuit = build_tmt_circuit() result = engine.run(circuit) - + output = f"""TMT Sierpinski Circuit (Sacred Geometry): Qubits: 21 Circuit Type: Sierpinski Triangle Pattern @@ -202,26 +213,28 @@ def run_tmt_sierpinski(): except Exception as e: return f"Error: {str(e)}" + def run_benchmark(): """Run benchmark dashboard.""" try: from quantumpytho.modules.benchmark_dashboard import run_benchmark_suite - + results = run_benchmark_suite() - + output = f"""QPyth Benchmark Results: {json.dumps(results, indent=2)} Summary: - Total Tests: {len(results)} -- Passed: {sum(1 for r in results.values() if r.get('status') == 'pass')} -- Failed: {sum(1 for r in results.values() if r.get('status') == 'fail')} +- Passed: {sum(1 for r in results.values() if r.get("status") == "pass")} +- Failed: {sum(1 for r in results.values() if r.get("status") == "fail")} """ return output except Exception as e: return f"Error: {str(e)}" + # Create Gradio interface def create_interface(): with gr.Blocks(title="QPyth - Quantum Computing", theme=gr.themes.Soft()) as demo: @@ -231,7 +244,7 @@ def create_interface(): A professionally engineered quantum computing library built on Qiskit. Featuring VQE, IBM Quantum integration, QEC, noisy simulation, and more. """) - + with gr.Tab("Bloch Sphere"): gr.Markdown("Visualize quantum states on the Bloch sphere") with gr.Row(): @@ -239,27 +252,29 @@ def create_interface(): phi = gr.Slider(0, 360, value=45, label="Phi (degrees)") bloch_output = gr.Textbox(label="Bloch Sphere Visualization", lines=20) bloch_btn = gr.Button("Generate") - bloch_btn.click(bloch_sphere_demo, inputs=[theta, phi], outputs=bloch_output) - + bloch_btn.click( + bloch_sphere_demo, inputs=[theta, phi], outputs=bloch_output + ) + with gr.Tab("Bell Pair"): gr.Markdown("Create an entangled Bell pair") bell_output = gr.Textbox(label="Bell Pair Results", lines=15) bell_btn = gr.Button("Create Bell Pair") bell_btn.click(create_bell_pair, outputs=bell_output) - + with gr.Tab("Quantum Teleportation"): gr.Markdown("Run the quantum teleportation protocol") teleport_output = gr.Textbox(label="Teleportation Results", lines=15) teleport_btn = gr.Button("Run Teleportation") teleport_btn.click(run_quantum_teleport, outputs=teleport_output) - + with gr.Tab("Quantum Error Correction"): gr.Markdown("Demonstrate quantum error correction codes") code_type = gr.Radio(["Shor", "Steane"], label="Code Type", value="Shor") qec_output = gr.Textbox(label="Result", lines=15) qec_btn = gr.Button("Run QEC Demo") qec_btn.click(run_qec_demo, inputs=code_type, outputs=qec_output) - + with gr.Tab("Quantum RNG"): gr.Markdown("Generate quantum random numbers") with gr.Row(): diff --git a/space_server.py b/space_server.py index 36f1b67..4a32607 100644 --- a/space_server.py +++ b/space_server.py @@ -2,17 +2,17 @@ FastAPI server for QPyth Space - Serves React frontend + Quantum API """ +import os + +import uvicorn from fastapi import FastAPI, HTTPException -from fastapi.staticfiles import StaticFiles -from fastapi.responses import FileResponse from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import FileResponse from pydantic import BaseModel -import uvicorn -import os +from qiskit import QuantumCircuit # Import QPyth modules from quantumpytho.engine import QuantumEngine -from qiskit import QuantumCircuit app = FastAPI(title="QPyth Space API", version="0.4.0") @@ -28,83 +28,93 @@ # Initialize quantum engine engine = QuantumEngine() + # Request/Response models class VQERequest(BaseModel): bond_length: float = 0.74 shots: int = 1024 + class NoisySimRequest(BaseModel): backend_profile: str = "IBM" noise_level: float = 0.01 + class QECRequest(BaseModel): code_type: str = "Shor" error_type: str = "None" + class QRNGRequest(BaseModel): count: int = 10 phi_scale: bool = False + class DNARequest(BaseModel): sequence: str = "ATCG" + # Health check @app.get("/api/health") async def health_check(): return {"status": "ok", "version": "0.4.0"} + # VQE Endpoint @app.post("/api/vqe") async def run_vqe(request: VQERequest): try: - from quantumpytho.modules.vqe_h2_exact import compute_exact_energy from quantumpytho.modules.vqe_core import VQEEngine - + from quantumpytho.modules.vqe_h2_exact import compute_exact_energy + exact_energy = compute_exact_energy(request.bond_length) vqe_engine = VQEEngine() result = vqe_engine.run_h2(bond_length=request.bond_length, shots=request.shots) - + return { "exact_energy": exact_energy, "vqe_energy": result.get("energy"), "error": result.get("error"), "depth": result.get("depth"), - "iterations": result.get("iterations") + "iterations": result.get("iterations"), } except Exception as e: - raise HTTPException(status_code=500, detail=str(e)) + raise HTTPException(status_code=500, detail=str(e)) from e + # Noisy Simulation Endpoint @app.post("/api/noisy") async def run_noisy_sim(request: NoisySimRequest): try: - from quantumpytho.modules.noise_builder import NoiseModelBuilder - from quantumpytho.modules.backend_profiles import get_backend_profile from qiskit_aer import AerSimulator - + + from quantumpytho.modules.backend_profiles import get_backend_profile + from quantumpytho.modules.noise_builder import NoiseModelBuilder + profile = get_backend_profile(request.backend_profile) - + circuit = QuantumCircuit(2, 2) circuit.h(0) circuit.cx(0, 1) circuit.measure([0, 1], [0, 1]) - + noise_builder = NoiseModelBuilder() noise_model = noise_builder.build_from_profile(profile, request.noise_level) - + backend = AerSimulator(noise_model=noise_model) job = backend.run(circuit, shots=1024) result = job.result() counts = result.get_counts() - + return { "backend": request.backend_profile, "noise_level": request.noise_level, "counts": counts, - "profile": profile + "profile": profile, } except Exception as e: - raise HTTPException(status_code=500, detail=str(e)) + raise HTTPException(status_code=500, detail=str(e)) from e + # QEC Endpoint @app.post("/api/qec") @@ -112,17 +122,21 @@ async def run_qec(request: QECRequest): try: if request.code_type == "Shor": from quantumpytho.modules.qec_shor import run_shor_qec_demo + result = run_shor_qec_demo() elif request.code_type == "Steane": from quantumpytho.modules.qec_steane import run_steane_qec_demo + result = run_steane_qec_demo() else: from quantumpytho.modules.qec_surface import run_surface_code_demo + result = run_surface_code_demo() - + return {"result": result} except Exception as e: - raise HTTPException(status_code=500, detail=str(e)) + raise HTTPException(status_code=500, detail=str(e)) from e + # QRNG Endpoint - FIXED @app.post("/api/qrng") @@ -131,6 +145,7 @@ async def run_qrng(request: QRNGRequest): if request.phi_scale: # QRNG Phi-Scaled - FIXED from quantumpytho.modules.qrng_sacred import qrng_phi_sequence + result = qrng_phi_sequence(request.count) return {"type": "phi_scaled", "result": result} else: @@ -141,26 +156,28 @@ async def run_qrng(request: QRNGRequest): job_result = engine.run(circuit) return {"type": "standard", "counts": job_result.counts} except Exception as e: - raise HTTPException(status_code=500, detail=str(e)) + raise HTTPException(status_code=500, detail=str(e)) from e + # Sacred Geometry / TMT Sierpinski Endpoint - FIXED @app.post("/api/sacred") async def run_sacred(): try: from quantumpytho.modules.tmt_sierpinski import build_tmt_circuit - + circuit = build_tmt_circuit() result = engine.run(circuit) - + return { "qubits": 21, "pattern": "Sierpinski Triangle", "depth": circuit.depth(), "gates": len(circuit.data), - "counts": result.counts + "counts": result.counts, } except Exception as e: - raise HTTPException(status_code=500, detail=str(e)) + raise HTTPException(status_code=500, detail=str(e)) from e + # DNA Circuits Endpoint @app.post("/api/dna") @@ -169,83 +186,96 @@ async def run_dna(request: DNARequest): from quantumpytho.modules.dna_circuits import ( get_available_dna_sequences, get_dna_sequence, - summarize_dna_circuit + summarize_dna_circuit, ) - + available = get_available_dna_sequences() sequence_data = get_dna_sequence(request.sequence) summary = summarize_dna_circuit(request.sequence) - + return { "sequence": request.sequence, "available": available, "data": sequence_data, - "summary": summary + "summary": summary, } except Exception as e: - raise HTTPException(status_code=500, detail=str(e)) + raise HTTPException(status_code=500, detail=str(e)) from e + # Bloch Sphere Endpoint @app.post("/api/bloch") async def run_bloch(theta: float, phi: float): try: from quantumpytho.modules.bloch_ascii import one_qubit_from_angles + result = one_qubit_from_angles(theta, phi) return {"visualization": result} except Exception as e: - raise HTTPException(status_code=500, detail=str(e)) + raise HTTPException(status_code=500, detail=str(e)) from e + # Bell Pair Endpoint @app.post("/api/bell") async def run_bell(): try: from quantumpytho.modules.circuit_explorer import bell_pair + result = bell_pair(engine) return {"counts": result.counts} except Exception as e: - raise HTTPException(status_code=500, detail=str(e)) + raise HTTPException(status_code=500, detail=str(e)) from e + # Teleportation Endpoint @app.post("/api/teleport") async def run_teleport(): try: from quantumpytho.modules.teleport_bridge import build_teleport_circuit + circuit = build_teleport_circuit() result = engine.run(circuit) return {"counts": result.counts} except Exception as e: - raise HTTPException(status_code=500, detail=str(e)) + raise HTTPException(status_code=500, detail=str(e)) from e + # Benchmark Endpoint @app.get("/api/benchmark") async def run_benchmark(): try: from quantumpytho.modules.benchmark_dashboard import run_benchmark_suite + results = run_benchmark_suite() return {"results": results} except Exception as e: - raise HTTPException(status_code=500, detail=str(e)) + raise HTTPException(status_code=500, detail=str(e)) from e + # IBM Status Endpoint @app.get("/api/ibm/status") async def get_ibm_status(): try: from quantumpytho.modules.hardware_ibm import get_ibm_backends + backends = get_ibm_backends() return {"backends": backends} except Exception as e: return {"backends": [], "error": str(e)} + # IBM Archive Endpoint @app.get("/api/ibm/archive") async def get_ibm_archive(): try: from quantumpytho.modules.ibm_archive import get_available_ibm_archive_jobs + jobs = get_available_ibm_archive_jobs() return {"jobs": jobs} except Exception as e: return {"jobs": [], "error": str(e)} + # Serve React frontend @app.get("/{path:path}") async def serve_react(path: str): @@ -253,9 +283,10 @@ async def serve_react(path: str): file_path = f"web/dist/{path}" if os.path.exists(file_path) and os.path.isfile(file_path): return FileResponse(file_path) - + # Serve index.html for all other routes (React Router) return FileResponse("web/dist/index.html") + if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=7860)