DEV Community

loading...

Get Started 1 Qubit VQE with Blueqat

beef_and_rice profile image Takumi Kato ・3 min read

Get Started VQE with Blueqat

Blueqat, the quantum computing library assists to write variational quantum eigensolver (VQE) algorithm.

This article explains how to write VQE for 2x2 Hamiltonian in Blueqat.

If you want to know the overview of VQE, this article is prefer.

All you need is Hamiltonian and Ansatz

First, you have to make a Hamiltonian, it is the problem to solve with VQE.
Second, you have to prepare "ansatz", it is parametrized quantum circuit.

Blueqat prepares some built in ansatzes like QAOA ansatz. However, sometimes, it is not enough to solve your Hamiltonian.

In this article, we define new ansatz for 1 qubit (2x2 Hamiltonian) VQE.

blueqat.pauli helps to make the Hamiltonian

Making Hamiltonian by Pauli matrices is very easy.

from blueqat.pauli import X, Y, Z, I

h = 1.23 * I - 4.56 * X(0) + 2.45 * Y(0) + 2.34 * Z(0)

Making randomized Hamiltonian

We make randomized Hamiltonian.

from random import random
from blueqat.pauli import X, Y, Z, I

h = random() * I + random() * X(0) + random() * Y(0) + random() * Z(0)

Now, h is a Hamiltonian with random matrix coefficient.

Ansatz is a class which inherits blueqat.vqe.AnsatzBase

Ansatz is a class which inherits blueqat.vqe.AnsatzBase and is implemented get_circuit() method.

To make a arbitrary 1 qubit gate, apply a RY gate and a RZ gate is enough.
Let's make the ansatz.

from blueqat import Circuit
from blueqat.vqe import AnsatzBase

class OneQubitAnsatz(AnsatzBase):
    def __init__(self, hamiltonian):
        AnsatzBase.__init__(hamiltonian, 2) # Hamiltonian and the number of parameters

    def get_circuit(self, params):
        # Return a circuit which applied a RY gate and a RZ gate.
        a, b = params
        return Circuit().ry(a)[0].rz(b)[0]

Very simple.

VQE works with a Hamiltonian and an ansatz

from blueqat.vqe import Vqe

h = random() * I + random() * X(0) + random() * Y(0) + random() * Z(0)
runner = Vqe(OneQubitAnsatz(h))
result = runner.run()

print('Result by VQE')
print(runner.ansatz.get_energy(result.circuit, runner.sampler))

runner = Vqe(OneQubitAnsatz(h)): Make a runner to run the VQE with the ansatz.
result = runner.run(): Run the VQE and get the result.

runner.ansatz.get_energy(result.circuit, runner.sampler): Get the energy from result.
This is the most complicated line in this article. Copy and paste is your friend!

Now, you obtained the energy (smallest eigenvalue of the Hamiltonian matrix).

Compare the result with numpy's solution

Is our result correct answer? Let's compare with numpy's solution.

blueqat.pauli can transform Hamiltonian to numpy's array by to_matrix() method.
We can get the eigenvalue by np.linalg.eigh.

import numpy as np
# Hamiltonian to matrix
mat = h.to_matrix()
# Calculate by numpy
print('Result by numpy')
print(np.linalg.eigh(mat))

Run from the beginning to the end

Whole source code is as following:

from random import random
import numpy as np
from blueqat import Circuit
from blueqat.pauli import X, Y, Z, I
from blueqat.vqe import AnsatzBase, Vqe

class OneQubitAnsatz(AnsatzBase):
    def __init__(self, hamiltonian):
        super().__init__(hamiltonian, 2)

    def get_circuit(self, params):
        a, b = params
        return Circuit().ry(a)[0].rz(b)[0]


# Calculate by VQE
h = random() * I + random() * X(0) + random() * Y(0) + random() * Z(0)
runner = Vqe(OneQubitAnsatz(h))
result = runner.run()

print('Result by VQE')
print(runner.ansatz.get_energy(result.circuit, runner.sampler))

# Hamiltonian to matrix
mat = h.to_matrix()
# Calculate by numpy
print('Result by numpy')
print(np.linalg.eigh(mat)[0][0])

This is the example of result.
You can see VQE result and numpy result are almost same value.

Result by VQE
-0.7072131424381115
Result by numpy
-0.7072139372798669

Summary

Blueqat library can write the VQE easily.

Discussion (0)

Forem Open with the Forem app