Get Started 1 Qubit VQE with Blueqat
Tags: quantumcomputing, blueqat, python
Published: 2020-02-13 01:57:00

#Get Started VQE with Blueqat

[Blueqat](https://github.com/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](https://developer.ibm.com/dwblog/2017/quantum-computing-qubit-vqe-variational-quantum-eigensolver/) 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.


```py
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.


```py
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.

```py
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

```py
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`.

```py
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:

```py
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](https://github.com/Blueqat/Blueqat) library can write the VQE easily.