Deminiko
1
09ef755
"""
Path: QuantumArchitect-MCP/frontend/tabs/tab_simulate.py
Related: ui/ui_handlers.py (ui_simulate_circuit), core/circuits.py (PREDEFINED_CIRCUITS)
Purpose: Simulate tab with editable QASM input and predefined circuit selection
"""
import gradio as gr
import json
# Import required components
from ..core import EXAMPLE_QASM, PREDEFINED_CIRCUITS
def get_qasm_from_gates(gates_json: str, num_qubits: int) -> str:
"""Convert gates JSON to OpenQASM 2.0 code."""
try:
gates = json.loads(gates_json) if isinstance(gates_json, str) else gates_json
except:
return EXAMPLE_QASM
lines = [
"OPENQASM 2.0;",
'include "qelib1.inc";',
f"qreg q[{num_qubits}];",
f"creg c[{num_qubits}];",
""
]
for gate in gates:
# Skip if gate is not a dict or name is not a string
if not isinstance(gate, dict):
continue
name_raw = gate.get("name", "")
if not isinstance(name_raw, str):
continue
name = name_raw.lower()
qubits = gate.get("qubits", [])
params = gate.get("params", [])
if name in ["h", "x", "y", "z", "s", "t", "sdg", "tdg"]:
lines.append(f"{name} q[{qubits[0]}];")
elif name in ["rx", "ry", "rz"]:
param = params[0] if params else 0
lines.append(f"{name}({param}) q[{qubits[0]}];")
elif name in ["cx", "cnot"]:
lines.append(f"cx q[{qubits[0]}],q[{qubits[1]}];")
elif name == "cz":
lines.append(f"cz q[{qubits[0]}],q[{qubits[1]}];")
elif name == "swap":
lines.append(f"swap q[{qubits[0]}],q[{qubits[1]}];")
elif name == "ccx":
lines.append(f"ccx q[{qubits[0]}],q[{qubits[1]}],q[{qubits[2]}];")
# Add measurements
lines.append("")
for i in range(num_qubits):
lines.append(f"measure q[{i}] -> c[{i}];")
return "\n".join(lines)
def load_circuit_for_simulation(circuit_id: str):
"""Load a predefined circuit and return its QASM code."""
if circuit_id in PREDEFINED_CIRCUITS:
circuit = PREDEFINED_CIRCUITS[circuit_id]
qasm = get_qasm_from_gates(json.dumps(circuit["gates"]), circuit["qubits"])
info = f"**{circuit['name']}**\n\n{circuit['description']}\n\n**Expected:** {circuit['expected']}"
return qasm, info
return EXAMPLE_QASM, "*Select a circuit or edit QASM directly*"
# Import UI handler
from ..ui import ui_simulate_circuit
def add_simulate_tab():
"""Add the Simulate tab to the Gradio interface."""
with gr.TabItem("🎲 Simulate"):
gr.Markdown("### Simulate quantum circuits")
gr.Markdown("*Select a predefined circuit or edit the QASM code directly*")
with gr.Row():
with gr.Column():
# Circuit selection dropdown
circuit_choices = [(f"{v['name']} ({v['qubits']}q)", k) for k, v in PREDEFINED_CIRCUITS.items()]
circuit_selector = gr.Dropdown(
choices=circuit_choices,
value="bell_state",
label="📋 Load Predefined Circuit",
interactive=True
)
circuit_info = gr.Markdown(value="*Select a circuit to see details*")
# Editable QASM input
sim_qasm = gr.Code(value=EXAMPLE_QASM, language="python", label="OpenQASM 2.0 Code", lines=12, interactive=True)
with gr.Row():
sim_shots = gr.Slider(minimum=100, maximum=10000, value=1024, step=100, label="Shots")
simulate_btn = gr.Button("🎲 Simulate", variant="primary", size="lg")
with gr.Column():
gr.Markdown("#### 📊 Results")
sim_counts = gr.Markdown(value="*Click Simulate to run the circuit*")
sim_probs = gr.Markdown(value="")
# Event handlers
circuit_selector.change(
load_circuit_for_simulation,
inputs=[circuit_selector],
outputs=[sim_qasm, circuit_info]
)
simulate_btn.click(ui_simulate_circuit, inputs=[sim_qasm, sim_shots], outputs=[sim_counts, sim_probs])