|
import streamlit as st |
|
from qiskit import QuantumCircuit, transpile |
|
from qiskit_aer import AerSimulator |
|
import io |
|
import sys |
|
|
|
|
|
st.title("Quantum Circuit Simulator with Examples") |
|
st.write("Select a quantum circuit example to load and simulate.") |
|
|
|
|
|
examples = { |
|
"1. Empty Circuit": """ |
|
from qiskit import QuantumCircuit |
|
qc = QuantumCircuit(1) |
|
print("Empty circuit created.") |
|
""", |
|
"2. Single Qubit Hadamard": """ |
|
from qiskit import QuantumCircuit |
|
from qiskit_aer import AerSimulator |
|
|
|
qc = QuantumCircuit(1, 1) |
|
qc.h(0) |
|
qc.measure(0, 0) |
|
|
|
simulator = AerSimulator() |
|
compiled_circuit = transpile(qc, simulator) |
|
result = simulator.run(compiled_circuit, shots=1024).result() |
|
counts = result.get_counts() |
|
print(counts) |
|
""", |
|
"3. Bell State": """ |
|
from qiskit import QuantumCircuit |
|
from qiskit_aer import AerSimulator |
|
|
|
qc = QuantumCircuit(2, 2) |
|
qc.h(0) |
|
qc.cx(0, 1) |
|
qc.measure([0, 1], [0, 1]) |
|
|
|
simulator = AerSimulator() |
|
compiled_circuit = transpile(qc, simulator) |
|
result = simulator.run(compiled_circuit, shots=1024).result() |
|
counts = result.get_counts() |
|
print(counts) |
|
""", |
|
"4. GHZ State": """ |
|
from qiskit import QuantumCircuit |
|
from qiskit_aer import AerSimulator |
|
|
|
qc = QuantumCircuit(3, 3) |
|
qc.h(0) |
|
qc.cx(0, 1) |
|
qc.cx(1, 2) |
|
qc.measure([0, 1, 2], [0, 1, 2]) |
|
|
|
simulator = AerSimulator() |
|
compiled_circuit = transpile(qc, simulator) |
|
result = simulator.run(compiled_circuit, shots=1024).result() |
|
counts = result.get_counts() |
|
print(counts) |
|
""", |
|
"5. Deutsch Algorithm": """ |
|
from qiskit import QuantumCircuit |
|
from qiskit_aer import AerSimulator |
|
|
|
qc = QuantumCircuit(2, 1) |
|
qc.h([0, 1]) |
|
qc.cx(0, 1) |
|
qc.h(0) |
|
qc.measure(0, 0) |
|
|
|
simulator = AerSimulator() |
|
compiled_circuit = transpile(qc, simulator) |
|
result = simulator.run(compiled_circuit, shots=1024).result() |
|
counts = result.get_counts() |
|
print(counts) |
|
""", |
|
"6. Quantum Teleportation": """ |
|
from qiskit import QuantumCircuit |
|
from qiskit_aer import AerSimulator |
|
|
|
qc = QuantumCircuit(3, 3) |
|
qc.h(1) |
|
qc.cx(1, 2) |
|
qc.cx(0, 1) |
|
qc.h(0) |
|
qc.measure([0, 1], [0, 1]) |
|
qc.cx(1, 2) |
|
qc.cz(0, 2) |
|
qc.measure(2, 2) |
|
|
|
simulator = AerSimulator() |
|
compiled_circuit = transpile(qc, simulator) |
|
result = simulator.run(compiled_circuit, shots=1024).result() |
|
counts = result.get_counts() |
|
print(counts) |
|
""", |
|
"7. DNA Base Pair Encoding": """ |
|
from qiskit import QuantumCircuit |
|
qc = QuantumCircuit(2, 2) |
|
|
|
# DNA Base Pair Encoding: A -> 00, T -> 01, G -> 10, C -> 11 |
|
qc.x(0) # Example encoding for T (01) |
|
qc.measure([0, 1], [0, 1]) |
|
|
|
simulator = AerSimulator() |
|
compiled_circuit = transpile(qc, simulator) |
|
result = simulator.run(compiled_circuit, shots=1024).result() |
|
counts = result.get_counts() |
|
print(counts) |
|
""", |
|
"8. QUBO": """ |
|
|
|
import numpy as np |
|
|
|
# Qiskit / Qiskit Optimization imports |
|
from qiskit import Aer |
|
from qiskit.utils import QuantumInstance |
|
from qiskit.algorithms import QAOA |
|
from qiskit.algorithms.optimizers import SPSA |
|
from qiskit_optimization import QuadraticProgram |
|
from qiskit_optimization.algorithms import MinimumEigenOptimizer |
|
|
|
# 1) Define a small QUBO with two binary variables |
|
problem = QuadraticProgram("my_qubo") |
|
problem.binary_var("x0") |
|
problem.binary_var("x1") |
|
|
|
# Objective: minimize: H = x0 + 2*x1 + x0*x1 |
|
problem.minimize( |
|
linear={"x0": 1, "x1": 2}, |
|
quadratic={("x0", "x1"): 1} |
|
) |
|
|
|
# Print to confirm the problem is not empty |
|
print("--- Quadratic Program ---") |
|
print(problem.export_as_lp_string()) |
|
|
|
# 2) Set up QAOA solver on the qasm_simulator |
|
backend = Aer.get_backend('qasm_simulator') |
|
quantum_instance = QuantumInstance( |
|
backend=backend, |
|
shots=512, |
|
seed_simulator=42, |
|
seed_transpiler=42 |
|
) |
|
|
|
qaoa = QAOA( |
|
optimizer=SPSA(maxiter=50), reps=2, quantum_instance=quantum_instance |
|
) |
|
|
|
solver = MinimumEigenOptimizer(qaoa) |
|
|
|
# 3) Solve the QUBO |
|
result = solver.solve(problem) |
|
|
|
print("--- QAOA Results ---") |
|
print("Optimal solution:", result.x) |
|
print("Objective value:", result.fval) |
|
|
|
|
|
""", |
|
"9. DNA Sequence Matching with Grover's Algorithm": """ |
|
from qiskit import QuantumCircuit, transpile |
|
from qiskit_aer import AerSimulator |
|
from qiskit.circuit.library import GroverOperator |
|
|
|
# Define the oracle circuit to mark the solution state |01> |
|
def create_oracle(): |
|
oracle_circuit = QuantumCircuit(2) |
|
oracle_circuit.cz(0, 1) # Mark |01> as the solution |
|
return oracle_circuit |
|
|
|
# Define the full Grover search circuit |
|
def create_grover_circuit(): |
|
oracle = create_oracle() |
|
grover_circuit = QuantumCircuit(2, 2) |
|
|
|
# Apply Hadamard to all qubits |
|
grover_circuit.h([0, 1]) |
|
|
|
# Apply the oracle |
|
grover_circuit.append(oracle.to_gate(), [0, 1]) |
|
|
|
# Apply Grover diffusion operator |
|
grover_circuit.h([0, 1]) |
|
grover_circuit.x([0, 1]) |
|
grover_circuit.h(1) |
|
grover_circuit.cz(0, 1) |
|
grover_circuit.h(1) |
|
grover_circuit.x([0, 1]) |
|
grover_circuit.h([0, 1]) |
|
|
|
# Measure the qubits |
|
grover_circuit.measure([0, 1], [0, 1]) |
|
return grover_circuit |
|
|
|
# Create the Grover circuit |
|
grover_circuit = create_grover_circuit() |
|
|
|
# Use AerSimulator as the backend |
|
simulator = AerSimulator() |
|
|
|
# Transpile and execute the circuit |
|
compiled_circuit = transpile(grover_circuit, simulator) |
|
result = simulator.run(compiled_circuit, shots=1024).result() |
|
|
|
# Retrieve and print the counts |
|
counts = result.get_counts() |
|
print(counts) |
|
""" |
|
} |
|
|
|
|
|
selected_example = st.selectbox("Select a Quantum Circuit Example", list(examples.keys())) |
|
|
|
|
|
st.subheader("Selected Quantum Circuit Code") |
|
st.text_area("Code", examples[selected_example], height=300) |
|
|
|
|
|
if st.button("Run"): |
|
try: |
|
|
|
old_stdout = sys.stdout |
|
redirected_output = io.StringIO() |
|
sys.stdout = redirected_output |
|
|
|
|
|
exec(examples[selected_example]) |
|
|
|
|
|
output = redirected_output.getvalue() |
|
st.success("Execution successful!") |
|
st.text_area("Output", output, height=200) |
|
except Exception as e: |
|
st.error(f"An error occurred: {e}") |
|
finally: |
|
|
|
sys.stdout = old_stdout |
|
|