Qward Beginner’s Guide

This guide provides a comprehensive introduction to Qward, a framework for analyzing and validating quantum code execution quality on quantum processing units (QPUs).

What is Qward?

Qward is a framework built on top of Qiskit that helps quantum developers understand how their quantum algorithms perform on both simulators and real quantum hardware. It provides tools to:

  1. Create and run quantum circuits

  2. Collect execution metrics

  3. Analyze circuit performance

  4. Validate algorithm correctness

  5. Compare results across different backends

  6. Calculate circuit complexity metrics

  7. Estimate quantum volume

Key Concepts

Validators

In Qward, validators are the main components you’ll work with. They are quantum circuits with added functionality for:

  • Setting up experiments

  • Defining success criteria

  • Running simulations with multiple jobs/shots

  • Executing on IBM Quantum hardware

  • Analyzing results

  • Calculating circuit complexity

  • Estimating quantum volume

Analysis

Qward provides analysis tools to help you understand your quantum algorithm’s performance:

  • Success rate analysis

  • Statistical aggregation

  • Visualization tools

  • Circuit complexity metrics

  • Quantum volume estimation

Getting Started

Installation

You can set up Qward in two ways:

Option 1: Local Installation

# Clone the repository
git clone https://github.com/your-org/qiskit-qward.git
cd qiskit-qward

# Install in development mode
pip install -e .

# Set up IBM Quantum credentials
cp .env.example .env
# Edit .env with your IBM Quantum token

Option 2: Using Docker

# Clone the repository
git clone https://github.com/your-org/qiskit-qward.git
cd qiskit-qward

# Copy and edit .env file
cp .env.example .env
# Edit .env with your IBM Quantum token

# Start Docker container with Jupyter Lab
chmod +x start.sh
./start.sh

This will open a Jupyter Lab interface in your browser where you can run the examples and tutorials.

First Steps: The Quantum Coin Flip

Let’s start with a simple example - the quantum coin flip. This uses a single qubit in superposition to simulate a fair coin toss.

# If running in a notebook, ensure paths are set up correctly
from qward.examples.flip_coin.scanner import ScanningQuantumFlipCoin

# Create the validator
scanner = ScanningQuantumFlipCoin(use_barriers=True)

# Show the circuit
print("Quantum Coin Flip Circuit:")
circuit_fig = scanner.draw()
display(circuit_fig)

# Run simulation
print("\nRunning quantum simulation jobs...")
results = scanner.run_simulation(
    show_histogram=True,
    num_jobs=100,
    shots_per_job=1024
)

# Check results
analysis = results["analysis"]["analyzer_0"]
print(f"\nSuccess rate (tails): {analysis['mean_success_rate']:.2%}")
print(f"Standard deviation: {analysis['std_success_rate']:.2%}")

# Examine complexity metrics
complexity = results["complexity_metrics"]
print(f"\nGate count: {complexity['gate_based_metrics']['gate_count']}")
print(f"Circuit depth: {complexity['gate_based_metrics']['circuit_depth']}")
print(f"Circuit volume: {complexity['standardized_metrics']['circuit_volume']}")

# Check quantum volume
qv = results["quantum_volume"]
print(f"\nQuantum Volume: {qv['standard_quantum_volume']}")
print(f"Enhanced Quantum Volume: {qv['enhanced_quantum_volume']}")

This circuit:

  1. Applies a Hadamard gate to put a qubit in superposition (50% |0⟩, 50% |1⟩)

  2. Measures the qubit

  3. Runs multiple jobs to collect statistics

  4. Analyzes the results to verify the coin is fair

  5. Calculates circuit complexity metrics

  6. Estimates quantum volume

Understanding the Circuit

The quantum coin flip circuit is simple but demonstrates important quantum principles:

┌───┐┌─┐
┤ H ├┤M├
└───┘└╥┘
     ┌╨┐
     │0│
     └─┘
  1. H gate: Creates an equal superposition of |0⟩ and |1⟩

  2. Measurement: Collapses the superposition into either 0 (heads) or 1 (tails)

The results should show approximately 50% heads and 50% tails, demonstrating quantum randomness.

Going Further: The Two Doors Enigma

For a more complex example, try the Two Doors Enigma validator. This implements a quantum solution to a classic puzzle involving truth-tellers and liars.

from qward.examples.two_doors_enigma.scanner import ScanningQuantumEnigma

# Create the validator
scanner = ScanningQuantumEnigma()

# Run simulation
results = scanner.run_simulation(show_histogram=True)

# Check analysis results
analysis = scanner.run_analysis()["analyzer_0"]
print(f"Success rate: {analysis['mean_success_rate']:.2%}")

# Examine complexity metrics
complexity = results["complexity_metrics"]
print(f"Circuit depth: {complexity['gate_based_metrics']['circuit_depth']}")
print(f"CNOT count: {complexity['gate_based_metrics']['cnot_count']}")
print(f"Entangling gate density: {complexity['entanglement_metrics']['entangling_gate_density']}")

# Check quantum volume
qv = results["quantum_volume"]
print(f"Quantum Volume: {qv['standard_quantum_volume']}")
print(f"Enhanced Quantum Volume: {qv['enhanced_quantum_volume']}")

This example demonstrates more advanced quantum concepts:

  • Multiple qubits and classical bits

  • Entanglement with CNOT gates

  • Complex quantum logic

  • Higher circuit complexity

  • Larger quantum volume

Understanding Circuit Complexity

Qward provides comprehensive circuit complexity analysis through the calculate_complexity_metrics() method. This helps you understand your circuit’s resource requirements and algorithmic complexity.

Key metrics include:

  1. Gate-based Metrics:

    • Gate count, circuit depth, T-count, CNOT count

    • Two-qubit gate count and multi-qubit operation ratio

  2. Entanglement Metrics:

    • Entangling gate density

    • Entangling width (maximum qubits that could be entangled)

  3. Standardized Metrics:

    • Circuit volume (depth × width)

    • Gate density

    • Clifford vs non-Clifford gate ratios

  4. Advanced Metrics:

    • Parallelism factors

    • Circuit efficiency

    • Quantum resource utilization

You can access these metrics directly:

# Create a scanner
scanner = ScanningQuantumFlipCoin()

# Calculate complexity metrics
metrics = scanner.calculate_complexity_metrics()

# Print selected metrics
print(f"Gate count: {metrics['gate_based_metrics']['gate_count']}")
print(f"Circuit depth: {metrics['gate_based_metrics']['circuit_depth']}")
print(f"Circuit volume: {metrics['standardized_metrics']['circuit_volume']}")

Quantum Volume Estimation

Quantum Volume is an important metric for understanding a circuit’s computational capacity. Qward extends the standard quantum volume calculation with an enhanced metric that considers additional circuit characteristics.

The estimate_quantum_volume() method returns:

  1. Standard Quantum Volume: Calculated as 2^n where n is the effective depth

  2. Enhanced Quantum Volume: Factors in square ratio, density, and gate complexity

  3. Contributing Factors: Details on what affects the quantum volume

Example usage:

# Create a scanner
scanner = ScanningQuantumEnigma()

# Calculate quantum volume
qv = scanner.estimate_quantum_volume()

# Access quantum volume metrics
print(f"Standard QV: {qv['standard_quantum_volume']}")
print(f"Enhanced QV: {qv['enhanced_quantum_volume']}")
print(f"Effective depth: {qv['effective_depth']}")

# Examine contributing factors
for factor, value in qv['factors'].items():
    print(f"{factor}: {value}")

Creating Your Own Validator

To create your own validator, extend the ScanningQuantumCircuit class:

from qward.scanning_quantum_circuit import ScanningQuantumCircuit
from qward.analysis.success_rate import SuccessRate

class MyCustomValidator(ScanningQuantumCircuit):
    def __init__(self, use_barriers=True):
        # Initialize with desired qubits and classical bits
        super().__init__(num_qubits=2, num_clbits=2, use_barriers=use_barriers, name="my_circuit")
        
        # Define success criteria
        def success_criteria(state):
            # For example, consider "00" a success
            return state == "00"
        
        # Add success rate analyzer with custom criteria
        success_analyzer = SuccessRate()
        success_analyzer.set_success_criteria(success_criteria)
        self.add_analyzer(success_analyzer)
        
        # Build the circuit
        self._build_circuit()
    
    def _build_circuit(self):
        # Implement your quantum circuit here
        self.h(0)              # Apply Hadamard to qubit 0
        self.cx(0, 1)          # CNOT with control qubit 0, target qubit 1
        
        if self.use_barriers:
            self.barrier()
            
        self.measure([0, 1], [0, 1])  # Measure both qubits

Next Steps

  • Explore the Tutorials for more detailed examples

  • Check the Technical Documentation for advanced usage

  • Read the API Documentation for a complete reference

  • Try the example notebooks:

    • Flip Coin: qward/examples/flip_coin/notebook_demo.ipynb

    • Two Doors Enigma: qward/examples/two_doors_enigma/notebook_demo.ipynb