Source code for mqt.bench.benchmarks.qwalk

# Copyright (c) 2023 - 2026 Chair for Design Automation, TUM
# Copyright (c) 2025 - 2026 Munich Quantum Software Company GmbH
# All rights reserved.
#
# SPDX-License-Identifier: MIT
#
# Licensed under the MIT License

"""Qwalk benchmark definition."""

from __future__ import annotations

from qiskit.circuit import ForLoopOp, QuantumCircuit, QuantumRegister

from ._registry import register_benchmark


[docs] @register_benchmark("qwalk", description="Quantum Walk") def create_circuit( num_qubits: int, depth: int = 3, coin_state_preparation: QuantumCircuit | None = None, *, for_loop: bool = False, ) -> QuantumCircuit: """Returns a quantum circuit implementing the Quantum Walk algorithm. Args: num_qubits: number of qubits of the returned quantum circuit depth: number of quantum steps coin_state_preparation: optional quantum circuit for state preparation for_loop: whether to use a structured for-loop for the quantum walk steps Returns: qc: a quantum circuit implementing the Quantum Walk algorithm """ num_qubits = num_qubits - 1 # because one qubit is needed for the coin coin = QuantumRegister(1, "coin") node = QuantumRegister(num_qubits, "node") qc = QuantumCircuit(node, coin, name="qwalk") # coin state preparation if coin_state_preparation is not None: qc.append(coin_state_preparation, coin[:]) walk = QuantumCircuit(node, coin) if for_loop else qc for _ in range(1 if for_loop else depth): # Hadamard coin operator walk.h(coin) # controlled increment for i in range(num_qubits - 1): walk.mcx(coin[:] + node[i + 1 :], node[i]) walk.cx(coin, node[num_qubits - 1]) # controlled decrement walk.x(coin) if num_qubits > 1: walk.x(node[1:]) for i in range(num_qubits - 1): walk.mcx(coin[:] + node[i + 1 :], node[i]) walk.cx(coin, node[num_qubits - 1]) if num_qubits > 1: walk.x(node[1:]) walk.x(coin) if for_loop: qc.append(ForLoopOp(range(depth), None, walk), qc.qubits) qc.measure_all() qc.name = qc.name return qc