qiskit-aer/test/terra/reference/ref_1q_clifford.py

910 lines
22 KiB
Python

# This code is part of Qiskit.
#
# (C) Copyright IBM 2018, 2019.
#
# This code is licensed under the Apache License, Version 2.0. You may
# obtain a copy of this license in the LICENSE.txt file in the root directory
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
#
# Any modifications or derivative works of this code must retain this
# copyright notice, and modified files need to carry a notice indicating
# that they have been altered from the originals.
"""
Test circuits and reference outputs for 1-qubit Clifford gate instructions.
"""
import numpy as np
from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit
# ==========================================================================
# H-gate
# ==========================================================================
def h_gate_circuits_deterministic(final_measure=True):
"""H-gate test circuits with deterministic counts."""
circuits = []
qr = QuantumRegister(1)
if final_measure:
cr = ClassicalRegister(1)
regs = (qr, cr)
else:
regs = (qr,)
# HH=I
circuit = QuantumCircuit(*regs)
circuit.h(qr)
circuit.barrier(qr)
circuit.h(qr)
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
circuits.append(circuit)
return circuits
def h_gate_counts_deterministic(shots, hex_counts=True):
"""H-gate circuits reference counts."""
targets = []
if hex_counts:
# HH=I
targets.append({"0x0": shots})
else:
# HH=I
targets.append({"0": shots})
return targets
def h_gate_statevector_deterministic():
"""H-gate circuits reference statevectors."""
targets = []
# HH=I
targets.append(np.array([1, 0]))
return targets
def h_gate_unitary_deterministic():
"""H-gate circuits reference unitaries."""
targets = []
# HH=I
targets.append(np.eye(2))
return targets
def h_gate_circuits_nondeterministic(final_measure=True):
"""X-gate test circuits with non-deterministic counts."""
circuits = []
qr = QuantumRegister(1)
if final_measure:
cr = ClassicalRegister(1)
regs = (qr, cr)
else:
regs = (qr,)
# H
circuit = QuantumCircuit(*regs)
circuit.h(qr)
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
circuits.append(circuit)
return circuits
def h_gate_counts_nondeterministic(shots, hex_counts=True):
"""H-gate circuits reference counts."""
targets = []
if hex_counts:
# H
targets.append({"0x0": shots / 2, "0x1": shots / 2})
else:
# H
targets.append({"0": shots / 2, "1": shots / 2})
return targets
def h_gate_statevector_nondeterministic():
"""H-gate circuits reference statevectors."""
targets = []
# H
targets.append(np.array([1, 1]) / np.sqrt(2))
return targets
def h_gate_unitary_nondeterministic():
"""H-gate circuits reference unitaries."""
targets = []
# HH=I
targets.append(np.array([[1, 1], [1, -1]]) / np.sqrt(2))
return targets
# ==========================================================================
# X-gate
# ==========================================================================
def x_gate_circuits_deterministic(final_measure=True):
"""X-gate test circuits with deterministic counts."""
circuits = []
qr = QuantumRegister(1)
if final_measure:
cr = ClassicalRegister(1)
regs = (qr, cr)
else:
regs = (qr,)
# X
circuit = QuantumCircuit(*regs)
circuit.x(qr)
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
circuits.append(circuit)
# XX = I
circuit = QuantumCircuit(*regs)
circuit.x(qr)
circuit.barrier(qr)
circuit.x(qr)
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
circuits.append(circuit)
# HXH=Z
circuit = QuantumCircuit(*regs)
circuit.h(qr)
circuit.barrier(qr)
circuit.x(qr)
circuit.barrier(qr)
circuit.h(qr)
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
circuits.append(circuit)
return circuits
def x_gate_counts_deterministic(shots, hex_counts=True):
"""X-gate circuits reference counts."""
targets = []
if hex_counts:
# X
targets.append({"0x1": shots})
# XX = I
targets.append({"0x0": shots})
# HXH=Z
targets.append({"0x0": shots})
else:
# X
targets.append({"1": shots})
# XX = I
targets.append({"0": shots})
# HXH=Z
targets.append({"0": shots})
return targets
def x_gate_statevector_deterministic():
"""X-gate circuits reference statevectors."""
targets = []
# X
targets.append(np.array([0, 1]))
# XX = I
targets.append(np.array([1, 0]))
# HXH=Z
targets.append(np.array([1, 0]))
return targets
def x_gate_unitary_deterministic():
"""X-gate circuits reference unitaries."""
targets = []
# X
targets.append(np.array([[0, 1], [1, 0]]))
# XX = I
targets.append(np.eye(2))
# HXH=Z
targets.append(np.array([[1, 0], [0, -1]]))
return targets
# ==========================================================================
# Z-gate
# ==========================================================================
def z_gate_circuits_deterministic(final_measure=True):
"""Z-gate test circuits with deterministic counts."""
circuits = []
qr = QuantumRegister(1)
if final_measure:
cr = ClassicalRegister(1)
regs = (qr, cr)
else:
regs = (qr,)
# Z alone
circuit = QuantumCircuit(*regs)
circuit.z(qr)
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
circuits.append(circuit)
# HZH = X
circuit = QuantumCircuit(*regs)
circuit.h(qr)
circuit.barrier(qr)
circuit.z(qr)
circuit.barrier(qr)
circuit.h(qr)
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
circuits.append(circuit)
# HZZH = I
circuit = QuantumCircuit(*regs)
circuit.h(qr)
circuit.barrier(qr)
circuit.z(qr)
circuit.barrier(qr)
circuit.z(qr)
circuit.barrier(qr)
circuit.h(qr)
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
circuits.append(circuit)
return circuits
def z_gate_counts_deterministic(shots, hex_counts=True):
"""Z-gate circuits reference counts."""
targets = []
if hex_counts:
# Z
targets.append({"0x0": shots})
# HZH = X
targets.append({"0x1": shots})
# HZZH = I
targets.append({"0x0": shots})
else:
# Z
targets.append({"0": shots})
# HZH = X
targets.append({"1": shots})
# HZZH = I
targets.append({"0": shots})
return targets
def z_gate_statevector_deterministic():
"""Z-gate circuits reference statevectors."""
targets = []
# Z
targets.append(np.array([1, 0]))
# HZH = X
targets.append(np.array([0, 1]))
# HZZH = I
targets.append(np.array([1, 0]))
return targets
def z_gate_unitary_deterministic():
"""Z-gate circuits reference unitaries."""
targets = []
# Z
targets.append(np.array([[1, 0], [0, -1]]))
# HZH = X
targets.append(np.array([[0, 1], [1, 0]]))
# HZZH = I
targets.append(np.eye(2))
return targets
# ==========================================================================
# Y-gate
# ==========================================================================
def y_gate_circuits_deterministic(final_measure=True):
"""Y-gate test circuits with deterministic counts."""
circuits = []
qr = QuantumRegister(1)
if final_measure:
cr = ClassicalRegister(1)
regs = (qr, cr)
else:
regs = (qr,)
# Y
circuit = QuantumCircuit(*regs)
circuit.y(qr)
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
circuits.append(circuit)
# YY = I
circuit = QuantumCircuit(*regs)
circuit.y(qr)
circuit.barrier(qr)
circuit.y(qr)
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
circuits.append(circuit)
# HYH = -Y
circuit = QuantumCircuit(*regs)
circuit.h(qr)
circuit.barrier(qr)
circuit.y(qr)
circuit.barrier(qr)
circuit.h(qr)
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
circuits.append(circuit)
return circuits
def y_gate_counts_deterministic(shots, hex_counts=True):
"""Y-gate circuits reference counts."""
targets = []
if hex_counts:
# Y
targets.append({"0x1": shots})
# YY = I
targets.append({"0x0": shots})
# HYH = -Y
targets.append({"0x1": shots})
else:
# Y
targets.append({"1": shots})
# YY = I
targets.append({"0": shots})
# HYH = -Y
targets.append({"1": shots})
return targets
def y_gate_statevector_deterministic():
"""Y-gate circuits reference statevectors."""
targets = []
# Y
targets.append(np.array([0, 1j]))
# YY = I
targets.append(np.array([1, 0]))
# HYH = -Y
targets.append(np.array([0, -1j]))
return targets
def y_gate_unitary_deterministic():
"""Y-gate circuits reference unitaries."""
targets = []
# Y
targets.append(np.array([[0, -1j], [1j, 0]]))
# YY = I
targets.append(np.eye(2))
# HYH = -Y
targets.append(np.array([[0, 1j], [-1j, 0]]))
return targets
# ==========================================================================
# S-gate
# ==========================================================================
def s_gate_circuits_deterministic(final_measure=True):
"""S-gate test circuits with deterministic counts."""
circuits = []
qr = QuantumRegister(1)
if final_measure:
cr = ClassicalRegister(1)
regs = (qr, cr)
else:
regs = (qr,)
# S
circuit = QuantumCircuit(*regs)
circuit.s(qr)
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
circuits.append(circuit)
# S.X
circuit = QuantumCircuit(*regs)
circuit.x(qr)
circuit.barrier(qr)
circuit.s(qr)
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
circuits.append(circuit)
# HSSH = HZH = X
circuit = QuantumCircuit(*regs)
circuit.h(qr)
circuit.barrier(qr)
circuit.s(qr)
circuit.barrier(qr)
circuit.s(qr)
circuit.barrier(qr)
circuit.h(qr)
circuit.barrier(qr)
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
return circuits
def s_gate_counts_deterministic(shots, hex_counts=True):
"""S-gate circuits reference counts."""
targets = []
if hex_counts:
# S
targets.append({"0x0": shots})
# S.X
targets.append({"0x1": shots})
# HSSH = HZH = X
targets.append({"0x1": shots})
else:
# S
targets.append({"0": shots})
# S.X
targets.append({"1": shots})
# HSSH = HZH = X
targets.append({"1": shots})
return targets
def s_gate_statevector_deterministic():
"""S-gate circuits reference statevectors."""
targets = []
# S
targets.append(np.array([1, 0]))
# S.X
targets.append(np.array([0, 1j]))
# HSSH = HZH = X
targets.append(np.array([0, 1]))
return targets
def s_gate_unitary_deterministic():
"""S-gate circuits reference unitaries."""
targets = []
# S
targets.append(np.diag([1, 1j]))
# S.X
targets.append(np.array([[0, 1], [1j, 0]]))
# HSSH = HZH = X
targets.append(np.array([[0, 1], [1, 0]]))
return targets
def s_gate_circuits_nondeterministic(final_measure=True):
"""S-gate test circuits with non-deterministic counts."""
circuits = []
qr = QuantumRegister(1)
if final_measure:
cr = ClassicalRegister(1)
regs = (qr, cr)
else:
regs = (qr,)
# SH
circuit = QuantumCircuit(*regs)
circuit.h(qr)
circuit.barrier(qr)
circuit.s(qr)
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
circuits.append(circuit)
# HSH
circuit = QuantumCircuit(*regs)
circuit.h(qr)
circuit.barrier(qr)
circuit.s(qr)
circuit.barrier(qr)
circuit.h(qr)
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
circuits.append(circuit)
return circuits
def s_gate_counts_nondeterministic(shots, hex_counts=True):
"""S-gate circuits reference counts."""
targets = []
if hex_counts:
# S.H
targets.append({"0x0": shots / 2, "0x1": shots / 2})
# H.S.H
targets.append({"0x0": shots / 2, "0x1": shots / 2})
else:
# S.H
targets.append({"0": shots / 2, "1": shots / 2})
# H.S.H
targets.append({"0": shots / 2, "1": shots / 2})
return targets
def s_gate_statevector_nondeterministic():
"""S-gate circuits reference statevectors."""
targets = []
# S.H
targets.append(np.array([1, 1j]) / np.sqrt(2))
# H.S.H
targets.append(np.array([1 + 1j, 1 - 1j]) / 2)
return targets
def s_gate_unitary_nondeterministic():
"""S-gate circuits reference unitaries."""
targets = []
# S.H
targets.append(np.array([[1, 1], [1j, -1j]]) / np.sqrt(2))
# H.S.H
targets.append(np.array([[1 + 1j, 1 - 1j], [1 - 1j, 1 + 1j]]) / 2)
return targets
# ==========================================================================
# S^dagger-gate
# ==========================================================================
def sdg_gate_circuits_deterministic(final_measure=True):
"""Sdg-gate test circuits with deterministic counts."""
circuits = []
qr = QuantumRegister(1)
if final_measure:
cr = ClassicalRegister(1)
regs = (qr, cr)
else:
regs = (qr,)
# Sdg
circuit = QuantumCircuit(*regs)
circuit.sdg(qr)
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
circuits.append(circuit)
# H.Sdg.Sdg.H = H.Z.H = X
circuit = QuantumCircuit(*regs)
circuit.h(qr)
circuit.barrier(qr)
circuit.sdg(qr)
circuit.barrier(qr)
circuit.sdg(qr)
circuit.barrier(qr)
circuit.h(qr)
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
circuits.append(circuit)
# H.Sdg.S.H = I
circuit = QuantumCircuit(*regs)
circuit.h(qr)
circuit.barrier(qr)
circuit.s(qr)
circuit.barrier(qr)
circuit.sdg(qr)
circuit.barrier(qr)
circuit.h(qr)
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
circuits.append(circuit)
return circuits
def sdg_gate_counts_deterministic(shots, hex_counts=True):
"""Sdg-gate circuits reference counts."""
targets = []
if hex_counts:
# Sdg
targets.append({"0x0": shots})
# H.Sdg.Sdg.H = H.Z.H = X
targets.append({"0x1": shots})
# H.Sdg.S.H = I
targets.append({"0x0": shots})
else:
# Sdg
targets.append({"0": shots})
# H.Sdg.Sdg.H = H.Z.H = X
targets.append({"1": shots})
# H.Sdg.S.H = I
targets.append({"0": shots})
return targets
def sdg_gate_statevector_deterministic():
"""Sdg-gate circuits reference statevectors."""
targets = []
# Sdg
targets.append(np.array([1, 0]))
# H.Sdg.Sdg.H = H.Z.H = X
targets.append(np.array([0, 1]))
# H.Sdg.S.H = I
targets.append(np.array([1, 0]))
return targets
def sdg_gate_unitary_deterministic():
"""Sdg-gate circuits reference unitaries."""
targets = []
# Sdg
targets.append(np.diag([1, -1j]))
# H.Sdg.Sdg.H = H.Z.H = X
targets.append(np.array([[0, 1], [1, 0]]))
# H.Sdg.S.H = I
targets.append(np.eye(2))
return targets
def sdg_gate_circuits_nondeterministic(final_measure=True):
"""Sdg-gate test circuits with non-deterministic counts."""
circuits = []
qr = QuantumRegister(1)
if final_measure:
cr = ClassicalRegister(1)
regs = (qr, cr)
else:
regs = (qr,)
# Sdg.H
circuit = QuantumCircuit(*regs)
circuit.h(qr)
circuit.barrier(qr)
circuit.sdg(qr)
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
circuits.append(circuit)
# H.Sdg.H
circuit = QuantumCircuit(*regs)
circuit.h(qr)
circuit.barrier(qr)
circuit.sdg(qr)
circuit.barrier(qr)
circuit.h(qr)
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
circuits.append(circuit)
return circuits
def sdg_gate_counts_nondeterministic(shots, hex_counts=True):
"""Sdg-gate circuits reference counts."""
targets = []
if hex_counts:
# Sdg.H
targets.append({"0x0": shots / 2, "0x1": shots / 2})
# H.Sdg.H
targets.append({"0x0": shots / 2, "0x1": shots / 2})
else:
# Sdg.H
targets.append({"0": shots / 2, "1": shots / 2})
# H.Sdg.H
targets.append({"0": shots / 2, "1": shots / 2})
return targets
def sdg_gate_statevector_nondeterministic():
"""Sdg-gate circuits reference statevectors."""
targets = []
# Sdg.H
targets.append(np.array([1, -1j]) / np.sqrt(2))
# H.Sdg.H
targets.append(np.array([1 - 1j, 1 + 1j]) / 2)
return targets
def sdg_gate_unitary_nondeterministic():
"""Sdg-gate circuits reference unitaries."""
targets = []
# Sdg.H
targets.append(np.array([[1, 1], [-1j, 1j]]) / np.sqrt(2))
# H.Sdg.H
targets.append(np.array([[1 - 1j, 1 + 1j], [1 + 1j, 1 - 1j]]) / 2)
return targets
# ==========================================================================
# Pauli gate
# ==========================================================================
def pauli_gate_circuits_deterministic(final_measure=True):
"""pauli gate test circuits with deterministic counts."""
circuits = []
qr = QuantumRegister(3)
if final_measure:
cr = ClassicalRegister(3)
regs = (qr, cr)
else:
regs = (qr,)
circuit = QuantumCircuit(*regs)
circuit.pauli("ZYX", qr)
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
circuits.append(circuit)
# HZH = X
circuit = QuantumCircuit(*regs)
circuit.h(qr[0])
circuit.h(qr[2])
circuit.pauli("ZZ", [qr[0], qr[2]])
circuit.h(qr[0])
circuit.h(qr[2])
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
circuits.append(circuit)
circuit = QuantumCircuit(*regs)
circuit.pauli("XYZ", qr)
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
circuits.append(circuit)
return circuits
def pauli_gate_counts_deterministic(shots, hex_counts=True):
"""multipauli-gate circuits reference counts."""
targets = []
if hex_counts:
targets.append({"0x3": shots})
targets.append({"0x5": shots})
targets.append({"0x6": shots})
else:
targets.append({"110": shots})
targets.append({"101": shots})
targets.append({"011": shots})
return targets
# ==========================================================================
# I-gate
# ==========================================================================
def id_gate_circuits_deterministic(final_measure=True):
"""I-gate test circuits with deterministic counts."""
circuits = []
qr = QuantumRegister(1)
if final_measure:
cr = ClassicalRegister(1)
regs = (qr, cr)
else:
regs = (qr,)
circuit = QuantumCircuit(*regs)
circuit.id(qr)
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
circuits.append(circuit)
circuit = QuantumCircuit(*regs)
circuit.x(qr)
circuit.barrier(qr)
circuit.id(qr)
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
circuits.append(circuit)
return circuits
def id_gate_counts_deterministic(shots, hex_counts=True):
"""I-gate circuits reference counts."""
targets = []
if hex_counts:
targets.append({"0x0": shots})
targets.append({"0x1": shots})
else:
targets.append({"0": shots})
targets.append({"1": shots})
return targets
def id_gate_statevector_deterministic():
"""I-gate circuits reference statevectors."""
targets = []
targets.append(np.array([1, 0]))
targets.append(np.array([0, 1]))
return targets
def id_gate_unitary_deterministic():
"""delay-gate circuits reference unitaries."""
targets = []
targets.append(np.eye(2))
targets.append(np.array([[0, 1], [1, 0]]))
return targets
# ==========================================================================
# delay-gate
# ==========================================================================
def delay_gate_circuits_deterministic(final_measure=True):
"""delay-gate test circuits with deterministic counts."""
circuits = []
qr = QuantumRegister(1)
if final_measure:
cr = ClassicalRegister(1)
regs = (qr, cr)
else:
regs = (qr,)
circuit = QuantumCircuit(*regs)
circuit.delay(1, qr)
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
circuits.append(circuit)
circuit = QuantumCircuit(*regs)
circuit.x(qr)
circuit.barrier(qr)
circuit.delay(1, qr)
if final_measure:
circuit.barrier(qr)
circuit.measure(qr, cr)
circuits.append(circuit)
return circuits
def delay_gate_counts_deterministic(shots, hex_counts=True):
"""delay-gate circuits reference counts."""
targets = []
if hex_counts:
targets.append({"0x0": shots})
targets.append({"0x1": shots})
else:
targets.append({"0": shots})
targets.append({"1": shots})
return targets
def delay_gate_statevector_deterministic():
"""delay-gate circuits reference statevectors."""
targets = []
targets.append(np.array([1, 0]))
targets.append(np.array([0, 1]))
return targets
def delay_gate_unitary_deterministic():
"""delay-gate circuits reference unitaries."""
targets = []
targets.append(np.eye(2))
targets.append(np.array([[0, 1], [1, 0]]))
return targets