Basic example of use of simulated annealing¶

Let us consider the one-dimensional Ising model of an antiferromagnet described by the Hamiltonian

$$ H = J \sum_{\langle i, j \rangle} \sigma_i \sigma_j$$

where $\langle i, j \rangle$ denotes nearest neighbour sites, magnetic coupling J > 0 for antiferromagnetism and $\sigma_i$ is the respective Pauli spin matrix acting on site $i$.

We want to use the simulated annealing implemented on the QLM to solve this problem. The following example presents how one can do so.

Encoding and solving the problem¶

In [1]:
import numpy as np
from qat.qpus import SimulatedAnnealing
from qat.core import Observable, Schedule, Variable, Term

# Define the the problem
n_spins = 100
mag_coupling = 1  # >0 is antiferromagnetic, <0 is ferromagnetic
    
# Create a temperature function
t = Variable("t", float)
temp_t = 2 * (1 - t) + 0.001  # annealing requires going from a high to a very low temperature

# Create a QPU
n_steps = 500
qpu = SimulatedAnnealing(temp_t=temp_t,
                         n_steps=n_steps,
                         seed=817)

# Create an observable
observable = Observable(n_spins, pauli_terms=[Term(mag_coupling, "ZZ", [i, i + 1])
                                              for i in range(n_spins - 1)])

# Create a schedule for the annealing, a job, and send it to the QPU
drive = [(1, observable)]
schedule = Schedule(drive=drive)
job = schedule.to_job(nbshots=1)
result = qpu.submit(job)

# Show the solution
for sample in result:
    print(sample.state)
|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101>

Solution¶

We can see that as expected for an antiferromagnet, the resulting spin configuration is alternating spins up and spins down which translates to alternating $|0>$ and $|1>$ qubit states.

In [ ]: