Skip to content

Commit

Permalink
Add test for graph state circuit (Qiskit#4530)
Browse files Browse the repository at this point in the history
* Add test for graph state circuit (Qiskit#4349)

* Update graph state circuit test with stabilizers

* Add symmetry check to graph state circuit test

* Apply suggestions from code review

* rm whitespaces

Co-authored-by: Julien Gacon <gaconju@gmail.com>
  • Loading branch information
mantcep and Cryoris committed Jun 17, 2020
1 parent 6547a2f commit a255f2d
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 2 deletions.
9 changes: 9 additions & 0 deletions qiskit/circuit/library/graph_state.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

import numpy as np
from qiskit import QuantumCircuit
from qiskit.circuit.exceptions import CircuitError


class GraphState(QuantumCircuit):
Expand Down Expand Up @@ -69,9 +70,17 @@ def __init__(self,
Args:
adjacency_matrix: input graph as n-by-n list of 0-1 lists
Raises:
CircuitError: If adjacency_matrix is not symmetric.
The circuit prepares a graph state with the given adjacency
matrix.
"""

adjacency_matrix = np.asarray(adjacency_matrix)
if not np.allclose(adjacency_matrix, adjacency_matrix.transpose()):
raise CircuitError("The adjacency matrix must be symmetric.")

num_qubits = len(adjacency_matrix)
super().__init__(num_qubits, name="graph: %s" % (adjacency_matrix))

Expand Down
49 changes: 47 additions & 2 deletions test/python/circuit/test_library.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,13 @@
WeightedAdder, Diagonal, NLocal, TwoLocal, RealAmplitudes,
EfficientSU2, ExcitationPreserving, PauliFeatureMap,
ZFeatureMap, ZZFeatureMap, MCMT, MCMTVChain, GMS,
HiddenLinearFunction)
HiddenLinearFunction, GraphState)
from qiskit.circuit.random.utils import random_circuit
from qiskit.converters.circuit_to_dag import circuit_to_dag
from qiskit.exceptions import QiskitError
from qiskit.circuit.library import (XGate, RXGate, RYGate, RZGate, CRXGate, CCXGate, SwapGate,
RXXGate, RYYGate, HGate, ZGate, CXGate, CZGate, CHGate)
from qiskit.quantum_info import Statevector, Operator
from qiskit.quantum_info import Statevector, Operator, Clifford
from qiskit.quantum_info.random import random_unitary
from qiskit.quantum_info.states import state_fidelity

Expand Down Expand Up @@ -185,6 +185,51 @@ def test_non_symmetric_raises(self):
HiddenLinearFunction([[1, 1, 0], [1, 0, 1], [1, 1, 1]])


@ddt
class TestGraphStateLibrary(QiskitTestCase):
"""Test the graph state circuit."""

def assertGraphStateIsCorrect(self, adjacency_matrix, graph_state):
"""Check the stabilizers of the graph state against the expected stabilizers.
Based on https://arxiv.org/pdf/quant-ph/0307130.pdf, Eq. (6).
"""

stabilizers = Clifford(graph_state).stabilizer.pauli.to_labels()

expected_stabilizers = [] # keep track of all expected stabilizers
num_vertices = len(adjacency_matrix)
for vertex_a in range(num_vertices):
stabilizer = [None] * num_vertices # Paulis must be put into right place
for vertex_b in range(num_vertices):
if vertex_a == vertex_b: # self-connection --> 'X'
stabilizer[vertex_a] = 'X'
elif adjacency_matrix[vertex_a][vertex_b] != 0: # vertices connected --> 'Z'
stabilizer[vertex_b] = 'Z'
else: # else --> 'I'
stabilizer[vertex_b] = 'I'

# need to reverse for Qiskit's tensoring order
expected_stabilizers.append(''.join(stabilizer)[::-1])

self.assertListEqual(expected_stabilizers, stabilizers)

@data(
[[0, 1, 0, 0, 1], [1, 0, 1, 0, 0], [0, 1, 0, 1, 0], [0, 0, 1, 0, 1], [1, 0, 0, 1, 0]]
)
def test_graph_state(self, adjacency_matrix):
"""Verify the GraphState by checking if the circuit has the expected stabilizers."""
graph_state = GraphState(adjacency_matrix)
self.assertGraphStateIsCorrect(adjacency_matrix, graph_state)

@data(
[[1, 1, 0], [1, 0, 1], [1, 1, 1]]
)
def test_non_symmetric_raises(self, adjacency_matrix):
"""Test that adjacency matrix is required to be symmetric."""
with self.assertRaises(CircuitError):
GraphState(adjacency_matrix)


class TestIQPLibrary(QiskitTestCase):
"""Test library of IQP quantum circuits."""

Expand Down

0 comments on commit a255f2d

Please sign in to comment.