# Copyright (c) 2023 - 2025 Chair for Design Automation, TUM# Copyright (c) 2025 Munich Quantum Software Company GmbH# All rights reserved.## SPDX-License-Identifier: MIT## Licensed under the MIT License"""QAOA benchmark definition. Code is based on https://github.com/qiskit-community/qiskit-application-modules-demo-sessions/blob/main/qiskit-optimization/qiskit-optimization-demo.ipynb."""from__future__importannotationsimportnumpyasnpfromqiskit.circuitimportParameterVector,QuantumCircuitfrom._registryimportregister_benchmark
[docs]@register_benchmark("qaoa",description="Quantum Approximation Optimization Algorithm (QAOA)")defcreate_circuit(num_qubits:int,repetitions:int=2,seed:int=10)->QuantumCircuit:"""Constructs a quantum circuit implementing QAOA for a Max-Cut example with random parameters. Arguments: num_qubits: Number of qubits in the circuit (equal to the number of graph nodes). repetitions: Number of QAOA layers (repetitions of the ansatz). seed: Seed for reproducibility. Returns: QuantumCircuit: Quantum circuit implementing QAOA. """rng=np.random.default_rng(seed)adjacency_matrix=rng.integers(0,2,size=(num_qubits,num_qubits))adjacency_matrix=np.triu(adjacency_matrix,1)# Upper triangular part for undirected graphgamma_values=ParameterVector("g",repetitions)beta_values=ParameterVector("b",repetitions)# Initialize QAOA circuitqc=QuantumCircuit(num_qubits)# Start in uniform superpositionqc.h(range(num_qubits))# Define cost and mixer operators for each layerforlayerinrange(repetitions):# Cost Hamiltonianforiinrange(num_qubits):forjinrange(i+1,num_qubits):ifadjacency_matrix[i,j]!=0:qc.rzz(2*gamma_values[layer],i,j)# Mixer Hamiltonianforiinrange(num_qubits):qc.rx(2*beta_values[layer],i)qc.name="qaoa"returnqc