Circuits API Reference¶
Unverified examples
This page predates the current release and parts of it describe planned or older API. Only 0 of 13 code snippets on this page run as-is today. For verified, runnable code see the Quick Start, the Showcase and the Backends guide.
SuperQuantX provides comprehensive quantum circuit construction, manipulation, and execution capabilities. This API reference covers quantum circuits, gates, measurements, and noise modeling.
Quantum Circuits¶
Quantum Circuit¶
superquantx.circuits.QuantumCircuit ¶
Quantum circuit representation with gate operations and measurements
This class provides a high-level interface for building and manipulating quantum circuits compatible with multiple quantum computing frameworks.
Initialize a quantum circuit
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
num_qubits
|
int
|
Number of qubits in the circuit |
required |
num_classical_bits
|
int | None
|
Number of classical bits (defaults to num_qubits) |
None
|
name
|
str | None
|
Optional circuit name |
None
|
Source code in src/superquantx/circuits.py
Functions¶
copy ¶
add_register ¶
Add a quantum or classical register to the circuit
Source code in src/superquantx/circuits.py
h ¶
x ¶
y ¶
z ¶
s ¶
sdg ¶
t ¶
tdg ¶
rx ¶
ry ¶
rz ¶
u ¶
Apply general unitary gate U(θ,φ,λ)
cx ¶
cnot ¶
cy ¶
cz ¶
swap ¶
crx ¶
Apply controlled rotation around X-axis
cry ¶
Apply controlled rotation around Y-axis
crz ¶
Apply controlled rotation around Z-axis
ccx ¶
Apply Toffoli (CCNOT) gate
toffoli ¶
cswap ¶
Apply controlled SWAP (Fredkin) gate
fredkin ¶
measure ¶
measure_all ¶
barrier ¶
Add a barrier (prevents gate reordering across barrier)
compose ¶
Compose this circuit with another circuit
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
other
|
QuantumCircuit
|
Circuit to compose with |
required |
qubits
|
list[int] | None
|
Qubit mapping for the other circuit |
None
|
Returns:
| Type | Description |
|---|---|
QuantumCircuit
|
New composed circuit |
Source code in src/superquantx/circuits.py
inverse ¶
Return the inverse (adjoint) of the circuit
Source code in src/superquantx/circuits.py
to_dict ¶
Convert circuit to dictionary representation
Source code in src/superquantx/circuits.py
to_json ¶
from_dict
classmethod
¶
Create circuit from dictionary representation
Source code in src/superquantx/circuits.py
from_json
classmethod
¶
draw ¶
Draw the circuit in text format
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
output
|
str
|
Output format ("text" only for now) |
'text'
|
Returns:
| Type | Description |
|---|---|
str
|
String representation of the circuit |
Source code in src/superquantx/circuits.py
Quantum Gate¶
superquantx.circuits.QuantumGate ¶
Classical Register¶
superquantx.circuits.ClassicalRegister ¶
Bases: BaseModel
Represents a classical register for measurements
Source code in src/superquantx/circuits.py
Quantum Gates¶
Gate Matrix Library¶
superquantx.gates.GateMatrix ¶
Quantum gate matrix representations and operations
Functions¶
rx
staticmethod
¶
ry
staticmethod
¶
rz
staticmethod
¶
u
staticmethod
¶
General single-qubit unitary gate U(θ,φ,λ)
Source code in src/superquantx/gates.py
phase
staticmethod
¶
cnot
staticmethod
¶
cz
staticmethod
¶
swap
staticmethod
¶
iswap
staticmethod
¶
crx
staticmethod
¶
Controlled rotation around X-axis
Source code in src/superquantx/gates.py
cry
staticmethod
¶
Controlled rotation around Y-axis
Source code in src/superquantx/gates.py
crz
staticmethod
¶
Controlled rotation around Z-axis
xx
staticmethod
¶
XX interaction gate
Source code in src/superquantx/gates.py
yy
staticmethod
¶
YY interaction gate
Source code in src/superquantx/gates.py
zz
staticmethod
¶
ZZ interaction gate
Source code in src/superquantx/gates.py
toffoli
staticmethod
¶
fredkin
staticmethod
¶
Pauli String Operations¶
superquantx.gates.PauliString ¶
Represents a Pauli string for Hamiltonian construction
Initialize Pauli string
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
pauli_ops
|
str
|
String of Pauli operators (e.g., "IXZY") |
required |
coefficient
|
complex
|
Complex coefficient |
1.0
|
Source code in src/superquantx/gates.py
Functions¶
matrix ¶
Get the matrix representation of the Pauli string
Source code in src/superquantx/gates.py
commutes_with ¶
Check if this Pauli string commutes with another
Source code in src/superquantx/gates.py
Hamiltonian Operations¶
superquantx.gates.Hamiltonian ¶
Quantum Hamiltonian represented as sum of Pauli strings
Initialize Hamiltonian
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
pauli_strings
|
list[PauliString]
|
List of Pauli strings that sum to form the Hamiltonian |
required |
Source code in src/superquantx/gates.py
Functions¶
matrix ¶
Get matrix representation of the Hamiltonian
Source code in src/superquantx/gates.py
expectation_value ¶
ground_state_energy ¶
time_evolution ¶
from_dict
classmethod
¶
Create Hamiltonian from dictionary
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
hamiltonian_dict
|
dict[str, complex]
|
Dictionary mapping Pauli strings to coefficients |
required |
Example
{"IXZI": 0.5, "YZII": -0.3, "ZXYX": 1.2j}
Source code in src/superquantx/gates.py
heisenberg_model
staticmethod
¶
heisenberg_model(num_qubits: int, Jx: float = 1.0, Jy: float = 1.0, Jz: float = 1.0, periodic: bool = False) -> Hamiltonian
Create Heisenberg model Hamiltonian
H = Σᵢ (Jₓ XᵢXᵢ₊₁ + Jᵧ YᵢYᵢ₊₁ + Jᵤ ZᵢZᵢ₊₁)
Source code in src/superquantx/gates.py
ising_model
staticmethod
¶
Create transverse field Ising model Hamiltonian
H = -J Σᵢ ZᵢZᵢ₊₁ - h Σᵢ Xᵢ
Source code in src/superquantx/gates.py
Measurements¶
Measurement Result¶
superquantx.measurements.MeasurementResult ¶
Bases: BaseModel
Represents the result of quantum measurements
Attributes¶
Functions¶
model_post_init ¶
marginal_counts ¶
Get marginal counts for specific qubits
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
qubits
|
list[int]
|
List of qubit indices to marginalize over |
required |
Returns:
| Type | Description |
|---|---|
dict[str, int]
|
Marginal counts dictionary |
Source code in src/superquantx/measurements.py
expectation_value ¶
Calculate expectation value for Pauli observable
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
observable
|
str
|
Pauli string (e.g., "ZZI") |
required |
Returns:
| Type | Description |
|---|---|
float
|
Expectation value |
Source code in src/superquantx/measurements.py
entropy ¶
plot_histogram ¶
plot_histogram(title: str = 'Measurement Results', figsize: tuple[int, int] = (10, 6), max_outcomes: int = 20) -> plt.Figure
Plot measurement histogram
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
title
|
str
|
Plot title |
'Measurement Results'
|
figsize
|
tuple[int, int]
|
Figure size |
(10, 6)
|
max_outcomes
|
int
|
Maximum number of outcomes to show |
20
|
Returns:
| Type | Description |
|---|---|
Figure
|
Matplotlib figure |
Source code in src/superquantx/measurements.py
to_dict ¶
to_json ¶
from_dict
classmethod
¶
from_json
classmethod
¶
Quantum Measurement¶
superquantx.measurements.QuantumMeasurement ¶
Quantum measurement operations and analysis
Initialize measurement system
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
backend
|
str | None
|
Quantum backend for measurements |
'simulator'
|
Source code in src/superquantx/measurements.py
Functions¶
measure_circuit ¶
measure_circuit(circuit: QuantumCircuit, shots: int = 1024, memory: bool = False) -> MeasurementResult
Measure quantum circuit
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
circuit
|
QuantumCircuit
|
Quantum circuit to measure |
required |
shots
|
int
|
Number of measurement shots |
1024
|
memory
|
bool
|
Whether to store individual shot outcomes |
False
|
Returns:
| Type | Description |
|---|---|
MeasurementResult
|
Measurement result |
Source code in src/superquantx/measurements.py
measure_observable ¶
Measure expectation value of Pauli observable
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
circuit
|
QuantumCircuit
|
Quantum circuit (without measurements) |
required |
observable
|
str
|
Pauli string observable |
required |
shots
|
int
|
Number of shots |
1024
|
Returns:
| Type | Description |
|---|---|
float
|
Expectation value |
Source code in src/superquantx/measurements.py
tomography_measurements ¶
tomography_measurements(circuit: QuantumCircuit, qubits: list[int] | None = None, shots_per_measurement: int = 1024) -> dict[str, MeasurementResult]
Perform quantum state tomography measurements
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
circuit
|
QuantumCircuit
|
Quantum circuit to tomographically reconstruct |
required |
qubits
|
list[int] | None
|
Qubits to perform tomography on (default: all) |
None
|
shots_per_measurement
|
int
|
Shots per Pauli measurement |
1024
|
Returns:
| Type | Description |
|---|---|
dict[str, MeasurementResult]
|
Dictionary of measurement results for each Pauli basis |
Source code in src/superquantx/measurements.py
reconstruct_state ¶
Reconstruct quantum state from tomography measurements
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
tomography_results
|
dict[str, MeasurementResult]
|
Results from tomography_measurements |
required |
Returns:
| Type | Description |
|---|---|
ndarray
|
Reconstructed density matrix |
Source code in src/superquantx/measurements.py
fidelity ¶
Calculate quantum state fidelity
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
state1
|
ndarray
|
First quantum state (vector or density matrix) |
required |
state2
|
ndarray
|
Second quantum state (vector or density matrix) |
required |
Returns:
| Type | Description |
|---|---|
float
|
Fidelity between states |
Source code in src/superquantx/measurements.py
trace_distance ¶
Calculate trace distance between quantum states
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
state1
|
ndarray
|
First quantum state |
required |
state2
|
ndarray
|
Second quantum state |
required |
Returns:
| Type | Description |
|---|---|
float
|
Trace distance |
Source code in src/superquantx/measurements.py
quantum_volume ¶
quantum_volume(num_qubits: int, depth: int, trials: int = 100, shots_per_trial: int = 1024) -> dict[str, Any]
Perform quantum volume benchmark
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
num_qubits
|
int
|
Number of qubits |
required |
depth
|
int
|
Circuit depth |
required |
trials
|
int
|
Number of random circuits to test |
100
|
shots_per_trial
|
int
|
Shots per circuit |
1024
|
Returns:
| Type | Description |
|---|---|
dict[str, Any]
|
Quantum volume benchmark results |
Source code in src/superquantx/measurements.py
Result Analyzer¶
superquantx.measurements.ResultAnalyzer ¶
Advanced analysis of quantum measurement results
Functions¶
compare_results
staticmethod
¶
Compare two measurement results
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
results1
|
MeasurementResult
|
First measurement result |
required |
results2
|
MeasurementResult
|
Second measurement result |
required |
Returns:
| Type | Description |
|---|---|
dict[str, float]
|
Comparison metrics |
Source code in src/superquantx/measurements.py
error_mitigation_zero_noise_extrapolation
staticmethod
¶
error_mitigation_zero_noise_extrapolation(noise_levels: list[float], measurement_results: list[MeasurementResult], observable: str = 'Z') -> tuple[float, dict[str, Any]]
Perform zero-noise extrapolation error mitigation
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
noise_levels
|
list[float]
|
List of noise levels (e.g., [1, 2, 3]) |
required |
measurement_results
|
list[MeasurementResult]
|
Results for each noise level |
required |
observable
|
str
|
Observable to extrapolate |
'Z'
|
Returns:
| Type | Description |
|---|---|
tuple[float, dict[str, Any]]
|
Zero-noise extrapolated value and fitting info |
Source code in src/superquantx/measurements.py
readout_error_mitigation
staticmethod
¶
readout_error_mitigation(calibration_results: dict[str, MeasurementResult], measurement_result: MeasurementResult) -> MeasurementResult
Apply readout error mitigation
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
calibration_results
|
dict[str, MeasurementResult]
|
Results from measuring |0⟩ and |1⟩ states |
required |
measurement_result
|
MeasurementResult
|
Result to correct |
required |
Returns:
| Type | Description |
|---|---|
MeasurementResult
|
Error-mitigated result |
Source code in src/superquantx/measurements.py
Noise Models¶
Noise Channel Base¶
superquantx.noise.NoiseChannel ¶
Bases: ABC
Abstract base class for quantum noise channels
Initialize noise channel
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
probability
|
float
|
Noise probability (0 <= p <= 1) |
required |
Source code in src/superquantx/noise.py
Specific Noise Channels¶
superquantx.noise.BitFlipChannel ¶
Bases: NoiseChannel
Bit flip (X) noise channel
Source code in src/superquantx/noise.py
superquantx.noise.PhaseFlipChannel ¶
Bases: NoiseChannel
Phase flip (Z) noise channel
Source code in src/superquantx/noise.py
superquantx.noise.DepolarizingChannel ¶
Bases: NoiseChannel
Depolarizing noise channel
Source code in src/superquantx/noise.py
superquantx.noise.AmplitudeDampingChannel ¶
Bases: NoiseChannel
Amplitude damping noise channel (T1 decay)
Source code in src/superquantx/noise.py
Noise Model¶
superquantx.noise.NoiseModel ¶
Bases: BaseModel
Comprehensive noise model for quantum circuits
Functions¶
add_single_qubit_error ¶
add_two_qubit_error ¶
add_readout_error ¶
set_coherence_time ¶
Set T1 and T2 coherence times for qubit
Source code in src/superquantx/noise.py
apply_to_circuit ¶
Apply noise model to quantum circuit
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
circuit
|
QuantumCircuit
|
Original circuit |
required |
Returns:
| Type | Description |
|---|---|
QuantumCircuit
|
Noisy circuit with error channels |
Source code in src/superquantx/noise.py
from_device_properties
classmethod
¶
Create noise model from device properties
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
device_props
|
dict[str, Any]
|
Device property dictionary |
required |
Returns:
| Type | Description |
|---|---|
NoiseModel
|
Noise model based on device properties |
Source code in src/superquantx/noise.py
ideal
classmethod
¶
basic_device_noise
classmethod
¶
basic_device_noise(single_qubit_error: float = 0.001, two_qubit_error: float = 0.01, readout_error: float = 0.01) -> NoiseModel
Create basic device noise model
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
single_qubit_error
|
float
|
Single-qubit gate error rate |
0.001
|
two_qubit_error
|
float
|
Two-qubit gate error rate |
0.01
|
readout_error
|
float
|
Readout error rate |
0.01
|
Returns:
| Type | Description |
|---|---|
NoiseModel
|
Basic noise model |
Source code in src/superquantx/noise.py
Usage Examples¶
Basic Circuit Construction¶
import superquantx as sqx
import numpy as np
# Create quantum circuit
circuit = sqx.QuantumCircuit(n_qubits=3, n_classical=3)
# Add quantum gates
circuit.h(0) # Hadamard gate
circuit.cx(0, 1) # CNOT gate
circuit.ry(np.pi/4, 2) # Y-rotation
# Add measurements
circuit.measure(0, 0) # Measure qubit 0 to classical bit 0
circuit.measure_all() # Measure all qubits
print(circuit)
Advanced Gate Operations¶
from superquantx.gates import GateMatrix, PauliString
# Custom rotation gates
theta = np.pi/3
rx_gate = GateMatrix.rx(theta)
ry_gate = GateMatrix.ry(theta)
rz_gate = GateMatrix.rz(theta)
# Pauli string operations
pauli_str = PauliString('XYZX') # X⊗Y⊗Z⊗X
print(f"Pauli string: {pauli_str}")
print(f"Matrix shape: {pauli_str.to_matrix().shape}")
# Hamiltonian construction
from superquantx.gates import Hamiltonian, PauliString
# Create Heisenberg model Hamiltonian
hamiltonian = Hamiltonian.heisenberg_model(num_qubits=4, Jx=1.0, Jy=1.0, Jz=1.0)
print(f"Hamiltonian: {hamiltonian}")
# Time evolution
time_evolution_op = hamiltonian.time_evolution(time=0.1)
circuit.unitary(time_evolution_op, range(4))
Measurement Analysis¶
# Execute circuit and analyze results
backend = sqx.get_backend('simulator')
result = backend.execute_circuit(circuit, shots=1000)
# Create measurement result object
measurement = sqx.MeasurementResult(
counts=result['counts'],
shots=result['shots'],
metadata=result.get('metadata', {})
)
# Analyze measurements
print(f"Most frequent outcome: {measurement.most_frequent}")
print(f"Measurement probabilities: {measurement.probabilities}")
# Marginal analysis
marginal = measurement.marginal_counts([0, 1]) # Marginalize over qubits 0,1
print(f"Marginal counts: {marginal}")
# Statistical analysis
entropy = measurement.measurement_entropy()
print(f"Measurement entropy: {entropy:.4f}")
Expectation Value Calculations¶
from superquantx.measurements import QuantumMeasurement
from superquantx.gates import PauliString
# Create measurement system
measurement = QuantumMeasurement(backend="simulator")
# Define observable
observable = 'ZZ' # Z⊗Z measurement
# Calculate expectation value
exp_value = measurement.measure_observable(
circuit=circuit,
observable=observable,
shots=5000
)
print(f"⟨ZZ⟩ = {exp_value:.4f}")
# Multiple observables
observables = ['XX', 'YY', 'ZZ']
exp_values = []
for obs in observables:
val = measurement.measure_observable(circuit, obs, shots=5000)
exp_values.append(val)
print(f"⟨{obs}⟩ = {val:.4f}")
Quantum State Tomography¶
from superquantx.measurements import QuantumMeasurement
# Create measurement system
measurement = QuantumMeasurement(backend="simulator")
# Perform tomography measurements
tomography_results = measurement.tomography_measurements(
circuit=circuit,
qubits=[0, 1], # Reconstruct 2-qubit state
shots_per_measurement=1000
)
# Reconstruct density matrix
density_matrix = measurement.reconstruct_state(tomography_results)
print(f"Reconstructed density matrix:\n{density_matrix}")
# Calculate fidelity with target state
bell_state = np.array([1, 0, 0, 1]) / np.sqrt(2) # |Φ⁺⟩
fidelity = measurement.fidelity(density_matrix, bell_state)
print(f"Fidelity with |Φ⁺⟩: {fidelity:.4f}")
print(f"State purity: {np.trace(density_matrix @ density_matrix).real:.4f}")
Noise Modeling¶
from superquantx.noise import (
NoiseModel, BitFlipChannel, PhaseFlipChannel,
DepolarizingChannel, AmplitudeDampingChannel
)
# Create noise channels
bit_flip = BitFlipChannel(probability=0.01)
phase_flip = PhaseFlipChannel(probability=0.01)
depolarizing = DepolarizingChannel(probability=0.02)
amplitude_damping = AmplitudeDampingChannel(probability=0.05)
# Combine into noise model
noise_model = NoiseModel()
# Add gate-specific noise
noise_model.add_gate_noise('X', bit_flip)
noise_model.add_gate_noise('H', depolarizing)
noise_model.add_gate_noise('CNOT', phase_flip)
# Add readout noise
noise_model.add_readout_noise(
p0_given_1=0.02, # Probability of measuring 0 given |1⟩
p1_given_0=0.03 # Probability of measuring 1 given |0⟩
)
# Apply noise model to backend
noisy_backend = sqx.get_backend('simulator', noise_model=noise_model)
# Execute noisy simulation
noisy_result = noisy_backend.execute_circuit(circuit, shots=1000)
print("Noisy simulation results:", noisy_result['counts'])
Error Mitigation¶
from superquantx.measurements import ResultAnalyzer
# Zero-noise extrapolation
noise_levels = [1, 2, 3]
measurement_results = []
# Collect measurements at different noise levels
for noise_level in noise_levels:
# Create noisy backend (implementation dependent)
result = measurement.measure_circuit(circuit, shots=1000)
measurement_results.append(result)
# Perform extrapolation
zero_noise_value, fit_info = ResultAnalyzer.error_mitigation_zero_noise_extrapolation(
noise_levels=noise_levels,
measurement_results=measurement_results,
observable='Z'
)
print(f"Zero-noise extrapolated value: {zero_noise_value:.4f}")
print(f"Fit R²: {fit_info.get('r_squared', 'N/A'):.4f}")
# Readout error mitigation
calibration_results = {"0": result, "1": result} # Calibration measurements
corrected_result = ResultAnalyzer.readout_error_mitigation(
calibration_results=calibration_results,
measurement_result=result
)
print(f"Corrected counts: {corrected_result.counts}")
Circuit Optimization¶
from superquantx.circuits import CircuitOptimizer
# Create optimizer
optimizer = CircuitOptimizer(
optimization_level=2,
target_backend=backend
)
# Optimize circuit
optimized_circuit = optimizer.optimize(circuit)
print(f"Original circuit: {circuit.depth()} depth, {circuit.count_ops()} gates")
print(f"Optimized circuit: {optimized_circuit.depth()} depth, {optimized_circuit.count_ops()} gates")
# Specific optimizations
optimized_circuit = optimizer.apply_passes([
'RemoveRedundantGates',
'CombineRotations',
'CancelInverses',
'CommuteThroughClifford'
])
Parameterized Circuits¶
from superquantx.circuits import Parameter, ParameterVector
# Create parameters
theta = Parameter('theta')
phi_vec = ParameterVector('phi', 3)
# Build parameterized circuit
param_circuit = sqx.QuantumCircuit(3)
param_circuit.ry(theta, 0)
param_circuit.rx(phi_vec[0], 1)
param_circuit.rz(phi_vec[1], 2)
param_circuit.cx(0, 1)
param_circuit.cry(phi_vec[2], 1, 2)
# Bind parameters
bound_circuit = param_circuit.bind_parameters({
theta: np.pi/4,
phi_vec: [np.pi/3, np.pi/6, np.pi/2]
})
# Execute bound circuit
result = backend.execute_circuit(bound_circuit)
Quantum Circuit Libraries¶
from superquantx.circuits.library import (
EfficientSU2,
RealAmplitudes,
ZZFeatureMap,
PauliFeatureMap
)
# Variational ansatz circuits
ansatz1 = EfficientSU2(num_qubits=4, reps=3)
ansatz2 = RealAmplitudes(num_qubits=4, reps=2)
# Feature map circuits for quantum machine learning
feature_map1 = ZZFeatureMap(feature_dimension=4, reps=2)
feature_map2 = PauliFeatureMap(feature_dimension=4, reps=1)
# Combine feature map and ansatz
ml_circuit = feature_map1.compose(ansatz1)
# Bind training data
training_data = [0.1, 0.5, -0.3, 0.8]
bound_ml_circuit = ml_circuit.bind_parameters({
**feature_map1.parameter_dict(training_data),
**ansatz1.random_parameters()
})
Circuit Simulation and Debugging¶
from superquantx.circuits import CircuitSimulator
# Create detailed simulator
sim = CircuitSimulator(backend='statevector')
# Step-by-step execution
sim.initialize_circuit(circuit)
for step, gate in enumerate(circuit.data):
print(f"Step {step}: Applying {gate}")
# Apply gate
sim.apply_gate(gate)
# Get current state
current_state = sim.get_statevector()
print(f" Statevector norm: {np.linalg.norm(current_state):.6f}")
# Check entanglement
entanglement = sim.calculate_entanglement()
print(f" Entanglement entropy: {entanglement:.4f}")
# Final state analysis
final_state = sim.get_statevector()
final_density_matrix = sim.get_density_matrix()
print("Final state analysis:")
print(f" Purity: {np.trace(final_density_matrix @ final_density_matrix).real:.4f}")
print(f" Von Neumann entropy: {sim.von_neumann_entropy():.4f}")
Performance Optimization¶
Circuit Compilation¶
from superquantx.circuits import QuantumCompiler
# Create compiler for specific backend
compiler = QuantumCompiler(target_backend=backend)
# Compile circuit
compiled_circuit = compiler.compile(
circuit=circuit,
optimization_level=3,
scheduling='as_late_as_possible',
layout='dense'
)
# Analysis compilation results
print(f"Compilation report:")
print(f" Original gates: {circuit.count_ops()}")
print(f" Compiled gates: {compiled_circuit.count_ops()}")
print(f" Gate reduction: {(1 - compiled_circuit.count_ops()/circuit.count_ops())*100:.1f}%")
Batch Circuit Execution¶
# Execute multiple circuits efficiently
circuits = [create_random_circuit(n_qubits=4) for _ in range(10)]
# Parallel execution
results = backend.execute_circuits_parallel(
circuits=circuits,
shots=1000,
max_workers=4
)
# Batch analysis
success_rate = sum(1 for r in results if r['success']) / len(results)
avg_execution_time = np.mean([r.get('execution_time', 0) for r in results])
print(f"Batch execution: {success_rate*100:.1f}% success rate")
print(f"Average execution time: {avg_execution_time:.3f}s")
Best Practices¶
Circuit Construction¶
- Use Native Gates: Prefer gates supported by target backend
- Minimize Depth: Reduce circuit depth for better fidelity
- Optimize Layout: Consider qubit connectivity constraints
- Parameter Management: Use symbolic parameters for flexibility
Measurement Strategy¶
- Statistical Significance: Use sufficient shots for reliable statistics
- Marginal Analysis: Focus on relevant qubit subsets
- Error Bars: Always include measurement uncertainties
- Baseline Comparison: Compare with theoretical expectations
Noise Handling¶
- Realistic Models: Use device-specific noise parameters
- Error Mitigation: Apply appropriate mitigation techniques
- Validation: Compare noisy vs. noiseless simulations
- Calibration: Regularly update noise models from hardware data
For more detailed examples and tutorials, see: - Circuit Construction Tutorial - Backend Integration