title: Quantum Circuit Optimizer
emoji: ⚛️
colorFrom: indigo
colorTo: blue
sdk: docker
pinned: false
app_port: 7860
tags:
- quantum
- reinforcement-learning
- circuit-optimization
- gradio
- qiskit
base_path: /web
⚛️ Quantum Circuit Optimizer
A web-based reinforcement learning environment for optimizing quantum circuits. Build and optimize quantum circuits step-by-step to maximize fidelity with target quantum states while respecting hardware constraints and noise.
🌟 Features
- Interactive Web UI: Built with Gradio for easy circuit construction
- Reinforcement Learning Ready: Compatible with RL algorithms for automated optimization
- Hardware-Aware: Respects qubit connectivity and gate constraints
- Noise Simulation: Includes noise models for realistic NISQ-era circuits
- Multiple Tasks: From simple Bell states to complex unitary approximations
🎯 Problem Statement
The agent must construct quantum circuits to:
- Maximize Fidelity - Match target quantum states
- Minimize Depth - Shorter circuits run faster
- Minimize Gate Count - Fewer operations reduce noise
- Respect Connectivity - Multi-qubit gates only on connected qubits
- Resist Noise - Circuits must survive decoherence
🚀 Action Space
| Action | Description | Parameters |
|---|---|---|
ADD |
Add a quantum gate | gate (H, X, CNOT, RX, RZ), qubits, parameter |
REMOVE |
Remove last gate | -- |
SWAP |
Swap two qubits | qubits [q1, q2] |
PARAM |
Tune parametric gate | parameter (angle in radians) |
STOP |
End episode | -- |
Available Gates:
- H - Hadamard (single qubit)
- X - Pauli-X / NOT (single qubit)
- CNOT - Controlled-NOT (two qubits)
- RX(θ) - Rotation around X-axis (parameterized)
- RZ(θ) - Rotation around Z-axis (parameterized)
🏗️ Architecture
- Backend: Qiskit for quantum state simulation
- Frontend: Gradio web interface
- Server: FastAPI with WebSocket support
- Environment: Custom Gym-compatible RL environment
🚀 Quick Start
Local Development
Clone and setup:
git clone https://github.com/viditkaushik/quantum_circuit_optimizer.git cd quantum_circuit_optimizer pip install -r requirements.txtRun locally:
python server/app.py # Or with uvicorn: uvicorn server.app:app --host 0.0.0.0 --port 7860Open browser: http://localhost:7860
Docker Deployment
# Build image
docker build -t quantum-circuit-optimizer .
# Run container
docker run -p 7860:7860 quantum-circuit-optimizer
📊 Tasks
- Easy: Bell State (2 qubits, no noise)
- Medium: GHZ State (3 qubits, depolarizing noise)
- Hard: Unitary Approximation (2 qubits, thermal noise)
- Efficient: Imperfect but Efficient (budget constraints)
- Noisy: Noise-Dominant (high decoherence)
- Budget: Budgeted Optimization (resource limits)
- Approx: Approximate Target (tolerance-based)
🔧 API Endpoints
POST /reset- Reset environment with taskPOST /step- Execute actionGET /state- Get current stateGET /health- Health check
📈 Metrics
- Fidelity: How close circuit output is to target state
- Efficiency: Circuit depth and gate count
- Noise Score: Resilience to decoherence
- Constraints Score: Hardware constraint satisfaction
- Aggregate Score: Weighted combination of above
🤝 Contributing
- Fork the repository
- Create feature branch
- Make changes
- Add tests
- Submit pull request
📄 License
This project is licensed under the BSD-style license.
🙏 Acknowledgments
Built using Qiskit, Gradio, FastAPI, and OpenEnv framework.
- H - Hadamard (single qubit)
- X - Pauli-X / NOT (single qubit)
- CNOT - Controlled-NOT (two qubits)
- RX(θ) - Rotation around X-axis (parameterized)
- RZ(θ) - Rotation around Z-axis (parameterized)
🏗️ Architecture
- Backend: Qiskit for quantum state simulation
- Frontend: Gradio web interface
- Server: FastAPI with WebSocket support
- Environment: Custom Gym-compatible RL environment
🚀 Quick Start
Local Development
Clone and setup:
git clone https://github.com/viditkaushik/quantum_circuit_optimizer.git cd quantum_circuit_optimizer pip install -r requirements.txtRun locally:
python server/app.py # Or with uvicorn: uvicorn server.app:app --host 0.0.0.0 --port 7860Open browser: http://localhost:7860
Docker Deployment
# Build image
docker build -t quantum-circuit-optimizer .
# Run container
docker run -p 7860:7860 quantum-circuit-optimizer
📊 Tasks
- Easy: Bell State (2 qubits, no noise)
- Medium: GHZ State (3 qubits, depolarizing noise)
- Hard: Unitary Approximation (2 qubits, thermal noise)
- Efficient: Imperfect but Efficient (budget constraints)
- Noisy: Noise-Dominant (high decoherence)
- Budget: Budgeted Optimization (resource limits)
- Approx: Approximate Target (tolerance-based)
🔧 API Endpoints
POST /reset- Reset environment with taskPOST /step- Execute actionGET /state- Get current stateGET /health- Health check
📈 Metrics
- Fidelity: How close circuit output is to target state
- Efficiency: Circuit depth and gate count
- Noise Score: Resilience to decoherence
- Constraints Score: Hardware constraint satisfaction
- Aggregate Score: Weighted combination of above
🤝 Contributing
- Fork the repository
- Create feature branch
- Make changes
- Add tests
- Submit pull request
📄 License
This project is licensed under the BSD-style license.
🙏 Acknowledgments
Built using Qiskit, Gradio, FastAPI, and OpenEnv framework.
Gates available: Hadamard (H), Pauli-X (X), CNOT, RX(theta), RZ(theta)
Observation Space
| Field | Type | Description |
|---|---|---|
circuit_gates |
list | Current gates in the circuit |
fidelity |
float | Overlap with target state (0-1) |
depth |
int | Circuit depth |
gate_count |
int | Number of gates |
noise_estimate |
float | Estimated fidelity loss from noise |
valid_actions |
list | Legal action types |
score |
float | Aggregate grader score (0-1) |
target_description |
str | What state to build |
Reward Design
Shaped reward -- NOT sparse. The reward at each step is:
reward = current_aggregate_score - previous_aggregate_score
The aggregate score is a weighted combination of four modular graders:
| Grader | Weight | Measures |
|---|---|---|
| Fidelity | 40-60% | State overlap with target |
| Efficiency | 20% | Depth + gate count vs limits |
| Noise | 15-25% | Gate-by-gate error probability |
| Constraints | 10-15% | Hardware connectivity compliance |
At episode end: +0.2 bonus if fidelity >= threshold, -0.05 penalty otherwise.
Tasks
7 diverse tasks covering different quantum circuit optimization challenges:
1. Easy -- Bell State
- Target: (|00> + |11>) / sqrt(2)
- Qubits: 2 | Noise: None | Connectivity: Full
- Max depth: 10 | Max steps: 20
2. Medium -- GHZ State
- Target: (|000> + |111>) / sqrt(2)
- Qubits: 3 | Noise: Depolarizing | Connectivity: Linear (0<->1<->2)
- Max depth: 15 | Max steps: 30
3. Hard -- Unitary Approximation
- Target: Ry(pi/3) @ Rz(pi/4) . CNOT
- Qubits: 2 | Noise: Thermal | Connectivity: Restricted (0<->1 only)
- Max depth: 20 | Max steps: 40
4. Efficient -- Imperfect but Efficient
- Target: GHZ state with efficiency focus
- Qubits: 3 | Noise: None | Grader weights: 60% fidelity, 40% efficiency
5. Noisy -- Noise-Dominant
- Target: Bell state with noise focus
- Qubits: 2 | Noise: Thermal | Grader weights: 40% fidelity, 40% noise
6. Budget -- Budgeted Optimization
- Target: GHZ state with strict gate budget
- Qubits: 3 | Max gates: 3 | Hard constraint on gate count
7. Approx -- Approximate Target
- Target: 4-qubit GHZ state
- Qubits: 4 | Tolerance: 0.80 fidelity | Rewards approximate solutions
Quick Start
Prerequisites
# Install uv (if not already installed)
curl -LsSf https://astral.sh/uv/install.sh | sh
# Install dependencies
uv sync
Run Server Locally
# Development mode
uvicorn server.app:app --reload --host 0.0.0.0 --port 8000
# Or via uv
uv run --project . server
Test Directly (No Server)
python server/my_env_environment.py
Build & Run Docker
docker build -t quantum-circuit-opt:latest .
docker run -p 8000:8000 quantum-circuit-opt:latest
Run Inference
export HF_TOKEN="your-token"
export IMAGE_NAME="quantum-circuit-opt:latest"
python inference.py
Deploy to HF Spaces
openenv push
Expected Baseline Results
With a capable LLM (e.g., Qwen2.5-72B):
| Task | Expected Score | Expected Fidelity |
|---|---|---|
| Easy (Bell) | 0.65-0.85 | >= 0.90 |
| Medium (GHZ) | 0.45-0.65 | >= 0.80 |
| Hard (Unitary) | 0.30-0.50 | >= 0.60 |
| Efficient | 0.60-0.80 | >= 0.85 |
| Noisy | 0.40-0.60 | >= 0.75 |
| Budget | 0.50-0.70 | >= 0.80 |
| Approx | 0.55-0.75 | >= 0.70 |
Scores depend heavily on the LLM's ability to reason about quantum operations.
Validation & Testing
# Run compliance tests (verifies all OpenEnv requirements)
python test_compliance.py
# Run pre-deployment validation
python validate_deployment.py
# Run environment smoke tests
python server/my_env_environment.py
Project Structure
my_env/
|---- __init__.py # Module exports
|---- models.py # Pydantic action/observation/state models
|---- client.py # QuantumCircuitEnv client
|---- openenv.yaml # OpenEnv manifest
|---- pyproject.toml # Project dependencies
|---- inference.py # Baseline inference script
|---- Dockerfile # Container image
|---- README.md # This file
|---- graders/
| |---- __init__.py
| |---- fidelity.py # State fidelity grader
| |---- efficiency.py # Depth + gate count grader
| |---- noise.py # Noise resilience grader
| |---- constraints.py # Connectivity compliance grader
| |---- aggregate.py # Weighted score combiner
|---- server/
|---- __init__.py
|---- my_env_environment.py # Core environment + statevector simulator
|---- app.py # FastAPI application
|---- tasks/
|---- __init__.py # Task registry
|---- easy.py # Bell state task
|---- medium.py # GHZ state task
|---- hard.py # Unitary approximation task
Technical Design
Statevector Simulator
Uses a pure-NumPy statevector simulator for deterministic, dependency-light quantum simulation:
- No native C++ compilation required (unlike Qiskit Aer)
- Exact simulation for 2-3 qubit circuits
- Supports H, X, CNOT, RX(theta), RZ(theta), SWAP gates
- Fully deterministic -- same inputs always produce same outputs
Noise Model
Analytical noise estimation rather than density matrix simulation:
- Depolarizing: Per-gate error rates (single-qubit: 0.1%, two-qubit: 1%)
- Thermal: 2x higher error rates than depolarizing
- Noise score = probability of no error across all gates
Determinism
All scoring is deterministic: same circuit -> same score. This is critical for reliable RL training and reproducible evaluation.