Project Overview

Quantum Circuit Optimization is a comprehensive toolkit that bridges quantum computing and large language models (LLMs). It provides tools for generating quantum circuit datasets using Cirq and optimizing them via AI providers such as OpenRouter and Google Gemini.

The project follows an in-context learning approach โ€” providing the LLM with example input/output circuit pairs so it learns the optimization pattern, then applying that learned pattern to new circuits.

Python 3.10+ Cirq LLM-Powered

Features

๐Ÿ”ฌ Dataset Generation

Create random quantum circuits using Cirq with configurable parameters โ€” qubit count, gate range, noise levels.

๐ŸŒŠ Noise Simulation

Simulate circuits with depolarizing, bit-flip, or phase-flip noise models. Also supports noiseless statevector simulation.

๐Ÿค– AI Optimization

Use LLMs via OpenRouter for circuit optimization through in-context learning with custom examples.

โŒจ๏ธ Unified CLI

Single command-line interface for both dataset generation and circuit optimization with multiple provider support.

Project Structure

quantum-circuit-optimization/
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ data_generation/           # Quantum circuit dataset generation
โ”‚   โ”‚   โ”œโ”€โ”€ qc/                    # Core quantum computing modules
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ circuit_generation.py  # Circuit creation & representation
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ simulation.py         # Noise & statevector simulation
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ optimization.py       # Cirq built-in optimization
โ”‚   โ”‚   โ””โ”€โ”€ scripts/
โ”‚   โ”‚       โ””โ”€โ”€ generate_dataset.py   # CLI dataset generator
โ”‚   โ”‚   โ””โ”€โ”€ tests/
โ”‚   โ”‚       โ””โ”€โ”€ test_qc.py            # pytest + hypothesis tests
โ”‚   โ””โ”€โ”€ model_training/             # AI-powered circuit optimization
โ”‚       โ”œโ”€โ”€ config.py               # Provider configuration
โ”‚       โ”œโ”€โ”€ openrouter_optimizer.py  # OpenRouter API integration
โ”‚       โ”œโ”€โ”€ utils.py                # Validation & parsing utilities
โ”‚       โ””โ”€โ”€ cli/
โ”‚           โ””โ”€โ”€ predict.py           # Unified CLI for optimization
โ”œโ”€โ”€ requirements.txt               # Pinned dependencies
โ”œโ”€โ”€ pytest.ini                     # Test configuration
โ”œโ”€โ”€ LICENSE                        # MIT-0 License
โ””โ”€โ”€ README.md

Installation

Prerequisites

Clone & Setup

# Clone the repository
git clone https://github.com/waifuai/quantum-circuit-optimization.git
cd quantum-circuit-optimization

# Using uv (recommended)
python -m venv .venv
source .venv/bin/activate        # Linux/macOS
# .venv\Scripts\activate         # Windows
pip install uv
uv pip install -r requirements.txt

# Or standard pip
pip install -r requirements.txt

Verify Installation

# Run the test suite
pytest

# Generate a test dataset
python -m src.data_generation.scripts.generate_dataset --n_circuits 5

Quick Start

1. Generate a Dataset

# Generate 100 circuits with default settings
python -m src.data_generation.scripts.generate_dataset

# Custom: 500 circuits, 2-10 gates, 3 qubits
python -m src.data_generation.scripts.generate_dataset \
    --n_circuits 500 \
    --min_gates 2 \
    --max_gates 10 \
    --n_qubits 3 \
    --output_file my_dataset.jsonl

2. Optimize a Circuit

# Set your API key
export OPENROUTER_API_KEY="sk-or-..."

# Optimize a simple circuit
python -m src.model_training.cli.predict \
    --input_circuit "H 0 ; CNOT 0 1 ; H 0"

# With custom examples
python -m src.model_training.cli.predict \
    --input_circuit "X 0 ; X 0 ; Y 1" \
    --example "H 0 ; CNOT 0 1 ; H 0||CNOT 0 1" \
    --example "X 0 ; X 0 ; Y 1||Y 1"

Data Generation Module

The src/data_generation/ package handles creating random quantum circuits, simulating them, and saving structured datasets in JSON Lines format.

Each generated circuit record contains:

FieldTypeDescription
raw_circuitstringCirq circuit string representation
operationslist[dict]Gate operations with type, qubits, exponent
num_gatesintNon-measurement gate count
simulation_countsdictMeasurement histogram from noisy simulation
optimized_circuitstringCirq-optimized circuit string

Circuit Generation

circuit_generation.py provides the core circuit creation logic using Cirq.

Key Classes & Functions

QuantumConfig

Constants for default circuit parameters:

ConstantValueDescription
N_QUBITS5Default number of qubits
MIN_GATES1Minimum gates per circuit
MAX_GATES5Maximum gates per circuit
DEFAULT_NOISE0.01Default noise level

generate_random_circuit(qubits, n_gates, gate_set=None)

Creates a random quantum circuit. Default gate set: X, Y, Z, H (single-qubit) and CNOT, CZ (two-qubit). Appends a measurement on all qubits.

import cirq
from src.data_generation.qc.circuit_generation import generate_random_circuit

qubits = [cirq.GridQubit(0, i) for i in range(3)]
circuit = generate_random_circuit(qubits, n_gates=5)
print(circuit)

GateOperationData

Frozen dataclass for serializing gate operations: gate_type, qubits_repr, exponent.

circuit_to_operations_data(circuit)

Converts a Cirq circuit to a list of GateOperationData objects and returns the non-measurement gate count.

Simulation

simulation.py provides two simulation modes for quantum circuits.

simulate_with_noise(circuit, noise, noise_model, repetitions)

Simulates a circuit under noise and returns measurement histograms.

ParameterDefaultDescription
noise0.01Noise probability (0โ€“1)
noise_model"depolarize"Options: depolarize, bit_flip, phase_flip
repetitions1000Number of measurement shots

simulate_statevector(circuit)

Simulates without noise, returning a dictionary of computational basis states to probabilities. Filters out probabilities below 1e-10.

from src.data_generation.qc.simulation import simulate_with_noise, simulate_statevector

# Noisy simulation
counts = simulate_with_noise(circuit, noise=0.05, noise_model="bit_flip")

# Noiseless statevector
probs = simulate_statevector(circuit)
print(probs)  # {'state_000': 0.125, 'state_001': 0.125, ...}

Cirq Optimization

optimization.py wraps Cirq's built-in optimize_for_target_gateset routine.

optimize_circuit(circuit, qubits, gateset=None)

Optimizes a circuit for a target gateset. Defaults to cirq.CZTargetGateset() if none specified.

from src.data_generation.qc.optimization import optimize_circuit
import cirq

qubits = [cirq.GridQubit(0, i) for i in range(3)]
circuit = cirq.Circuit([cirq.H(q) for q in qubits])
optimized = optimize_circuit(circuit, qubits)

# Custom gateset
optimized_sqrt = optimize_circuit(circuit, qubits, gateset=cirq.SqrtIswapTargetGateset())

Model Training Module

The src/model_training/ package handles LLM-powered quantum circuit optimization using in-context learning. Currently supports OpenRouter as the primary provider.

How It Works

  1. Provide input/output circuit examples (e.g., "H 0 ; CNOT 0 1 ; H 0" โ†’ "CNOT 0 1")
  2. The examples are formatted into a prompt with clear "Unoptimized/Optimized" pairs
  3. The target circuit is appended as the final "Unoptimized" entry
  4. The LLM generates the "Optimized" output using the learned pattern
  5. The optimized circuit string is returned

OpenRouter Integration

openrouter_optimizer.py handles API communication with OpenRouter's chat completions endpoint.

Authentication

The API key is resolved in this order:

  1. OPENROUTER_API_KEY environment variable
  2. ~/.api-openrouter file (containing the key on one line)

optimize_circuit_with_openrouter(...)

ParameterTypeDescription
unoptimized_circuit_stringstrCircuit to optimize (e.g., "H 0 ; CNOT 0 1")
exampleslist[tuple]List of (input, output) example pairs
modelstr | NoneModel override (defaults to ~/.model-openrouter or "openrouter/free")
timeoutintHTTP timeout in seconds (default: 60)

Returns the optimized circuit string. Raises ValueError for invalid inputs or missing API key, RuntimeError for API failures.

CLI Interface

The unified CLI (src.model_training.cli.predict) provides a single entry point for circuit optimization.

Usage

python -m src.model_training.cli.predict [OPTIONS]

Required:
  --input_circuit STR    Circuit string (e.g., "H 0 ; CNOT 0 1 ; H 0")

Options:
  --provider STR         Provider name (default: openrouter)
  --model STR            Override model name
  --timeout INT          HTTP timeout in seconds (default: 60)
  --example STR          Add example as "input||output" (repeatable)
  --verbose, -v          Enable DEBUG logging

Examples

# Basic optimization with defaults
python -m src.model_training.cli.predict \
    --input_circuit "H 0 ; CNOT 0 1 ; H 0"

# With custom examples and verbose output
python -m src.model_training.cli.predict \
    --input_circuit "X 0 ; X 0 ; Y 1" \
    --example "H 0 ; CNOT 0 1 ; H 0||CNOT 0 1" \
    --example "X 0 ; X 0 ; Y 1||Y 1" \
    --timeout 120 \
    --verbose

# Override model
python -m src.model_training.cli.predict \
    --provider openrouter \
    --model "deepseek/deepseek-chat-v3-0324" \
    --input_circuit "H 0 ; CNOT 0 1 ; H 0"
Default examples: If no --example flags are provided, the CLI uses two built-in examples: "H 0 ; CNOT 0 1 ; H 0" โ†’ "CNOT 0 1" and "X 0 ; X 0 ; Y 1" โ†’ "Y 1".

API Reference

Data Generation โ€” qc.circuit_generation

SymbolTypeDescription
QuantumConfigclassConstants: N_QUBITS, MIN_GATES, MAX_GATES, DEFAULT_NOISE
GateOperationDatadataclassFrozen dataclass: gate_type, qubits_repr, exponent
generate_random_circuit(qubits, n_gates, gate_set=None)functionReturns cirq.Circuit with random gates + measurement
gate_operation_to_data(op)functionConverts cirq.Operation โ†’ GateOperationData
circuit_to_operations_data(circuit)functionReturns (list[GateOperationData], gate_count)

Data Generation โ€” qc.simulation

SymbolTypeDescription
simulate_with_noise(circuit, noise, noise_model, repetitions)functionReturns dict[int, int] measurement histogram
simulate_statevector(circuit)functionReturns dict[str, float] state probabilities

Data Generation โ€” qc.optimization

SymbolTypeDescription
optimize_circuit(circuit, qubits, gateset=None)functionOptimizes via Cirq CZTargetGateset (default)

Data Generation โ€” scripts.generate_dataset

SymbolTypeDescription
generate_qc_dict(qubits, n_gates, noise_level)functionReturns dict with raw_circuit, operations, num_gates, simulation_counts, optimized_circuit
generate_dataset(n_circuits, qubits, min_gates, max_gates, noise_level)functionReturns list of circuit dicts

Model Training โ€” openrouter_optimizer

SymbolTypeDescription
optimize_circuit_with_openrouter(circuit_str, examples, model, timeout)functionReturns optimized circuit string via OpenRouter API
resolve_openrouter_api_key()functionReturns API key from env or ~/.api-openrouter

Model Training โ€” config

SymbolTypeDescription
DEFAULT_OPENROUTER_MODELstr"openrouter/free"
OPENROUTER_API_URLstrOpenRouter chat completions endpoint
DEFAULT_TIMEOUTint60 seconds
resolve_openrouter_model(explicit=None)functionResolves model from arg, ~/.model-openrouter, or fallback

Model Training โ€” utils

SymbolTypeDescription
validate_circuit_string(circuit_str)functionValidates circuit format against known gates
parse_examples(examples_str)functionParses "input||output" strings into tuples
format_circuit_for_display(circuit_str, max_length=50)functionTruncates long circuit strings for display
setup_logging(verbose, level)functionConfigures logging level

Configuration

API Keys

ProviderEnvironment VariableFallback File
OpenRouterOPENROUTER_API_KEY~/.api-openrouter

Model Selection

Override default models by creating dotfiles in your home directory:

# Set default OpenRouter model
echo "deepseek/deepseek-chat-v3-0324" > ~/.model-openrouter
Supported gates for validation: H, X, Y, Z, CNOT, CX, CZ, S, T, RX, RY, RZ

Testing

The project uses pytest with Hypothesis for property-based testing.

Running Tests

# Run all tests
pytest

# Run data generation tests
pytest src/data_generation/tests/

# Run with verbose output
pytest -v

Test Coverage

ModuleTestsApproach
Circuit generationProperty-based (Hypothesis)Validates gate counts, measurement presence across random inputs
Gate serializationUnit testsVerifies GateOperationData conversion accuracy
Noise simulationUnit testsTests depolarize, bit_flip, phase_flip models
Statevector simulationUnit testsVerifies probability sum โ‰ˆ 1.0
Dataset generationUnit + CLI testsTests JSONL output, subprocess CLI invocation
Note: Tests require all dependencies installed. The test suite validates JSONL serialization, subprocess CLI execution, and circuit optimization with custom gatesets.

License

This project is licensed under the MIT No Attribution (MIT-0) license.

MIT No Attribution

Copyright 2025 WaifuAI

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.

GitHub Repository  ยท  Report Issues