qml.qaoa

Overview

This module provides a collection of methods that help in the construction of QAOA workflows.

Mixer Hamiltonians

Methods for constructing QAOA mixer Hamiltonians.

Functions

bit_flip_mixer(graph, b)

Creates a bit-flip mixer Hamiltonian.

x_mixer(wires)

Creates a basic Pauli-X mixer Hamiltonian.

xy_mixer(graph)

Creates a generalized SWAP/XY mixer Hamiltonian.

Cost Hamiltonians

Methods for generating QAOA cost Hamiltonians corresponding to different optimization problems.

Functions

bit_driver(wires, b)

Returns the bit-driver cost Hamiltonian.

edge_driver(graph, reward)

Returns the edge-driver cost Hamiltonian.

max_clique(graph[, constrained])

Returns the QAOA cost Hamiltonian and the recommended mixer corresponding to the Maximum Clique problem, for a given graph.

max_independent_set(graph[, constrained])

For a given graph, returns the QAOA cost Hamiltonian and the recommended mixer corresponding to the Maximum Independent Set problem.

max_weight_cycle(graph[, constrained])

Returns the QAOA cost Hamiltonian and the recommended mixer corresponding to the maximum-weighted cycle problem, for a given graph.

maxcut(graph)

Returns the QAOA cost Hamiltonian and the recommended mixer corresponding to the MaxCut problem, for a given graph.

min_vertex_cover(graph[, constrained])

Returns the QAOA cost Hamiltonian and the recommended mixer corresponding to the Minimum Vertex Cover problem, for a given graph.

QAOA Layers

Methods that define cost and mixer layers for use in QAOA workflows.

Functions

cost_layer(gamma, hamiltonian)

Applies the QAOA cost layer corresponding to a cost Hamiltonian.

mixer_layer(alpha, hamiltonian)

Applies the QAOA mixer layer corresponding to a mixer Hamiltonian.

Cycle Optimization

The cycle module is available for additional functionality related to the maximum-weighted cycle problem.

cycle

Functionality for finding the maximum weighted cycle of directed graphs.

Solving the MaxCut problem using QAOA

We can demonstrate the PennyLane QAOA functionality with a basic application of QAOA: solving the MaxCut problem. We begin by defining the set of wires on which QAOA is executed, as well as the graph on which we will perform MaxCut. The node labels of the graph are the index of the wire to which they correspond:

import pennylane as qml
from pennylane import qaoa
from networkx import Graph

# Defines the wires and the graph on which MaxCut is being performed
wires = range(3)
graph = Graph([(0, 1), (1, 2), (2, 0)])

We now obtain the QAOA cost and mixer Hamiltonians for MaxCut on the graph that we defined:

# Defines the QAOA cost and mixer Hamiltonians
cost_h, mixer_h = qaoa.maxcut(graph)

These cost and mixer Hamiltonians are then used to define layers of the variational QAOA ansatz, which we implement as the following function:

# Defines a layer of the QAOA ansatz from the cost and mixer Hamiltonians
def qaoa_layer(gamma, alpha):
    qaoa.cost_layer(gamma, cost_h)
    qaoa.mixer_layer(alpha, mixer_h)

Finally, the full QAOA circuit is built. We begin by initializing the wires in an even superposition over computational basis states, and then repeatedly apply QAOA layers with the qml.layer method. In this case we repeat the circuit twice:

# Repeatedly applies layers of the QAOA ansatz
def circuit(params):

    for w in wires:
        qml.Hadamard(wires=w)

    qml.layer(qaoa_layer, 2, params[0], params[1])

With the circuit defined, we call the device on which QAOA will be executed and use qml.expval() to create the QAOA cost function: the expected value of the cost Hamiltonian with respect to the parametrized output of the QAOA circuit.

# Defines the device and the QAOA cost function
dev = qml.device('default.qubit', wires=len(wires))
@qml.qnode(dev)
def cost_function(params):
    circuit(params)
    return qml.expval(cost_h)
>>> print(cost_function([[1, 1], [1, 1]]))
-1.8260274380964299

The QAOA cost function can then be optimized in the usual way, by calling one of the built-in PennyLane optimizers and updating the variational parameters until the expected value of the cost Hamiltonian is minimized.