from qiskit.circuit import QuantumCircuit, QuantumRegister, Parameter
from classes.MyDataLogger import MyDataLogger, MySubDataLogger
from modules.helper_functions_tsp import (vqc_circuit,
cost_func_evaluate,
my_gradient,
cost_fn_fact
)
import numpy as np
import pytest as py
from pathlib import Path
from modules.config import NETWORK_DIR
[docs]
def my_cost_function1(bit_string_list:list) -> int:
"""A simple cost function for testing"""
if bit_string_list == [0]:
return 0
elif bit_string_list == [1]:
return 1
else:
raise Exception('Invalid bit string list')
[docs]
def test_gradient_1():
"""Test a circuit with one parameter"""
datalogger = MyDataLogger()
sdl = MySubDataLogger(runid = datalogger.runid)
sdl.quantum = True
sdl.noise = False
sdl.s = 0.5
sdl.shots = 1024
sdl.gradient_type = 'parameter_shift'
a = Parameter('a')
q = QuantumRegister(1)
qc = QuantumCircuit(q)
qc.rx(a, q[0])
qc.measure_all()
init_rots = [0]
params = [a]
actual_results = my_gradient(sdl,
my_cost_function1,
qc,
params,
init_rots,
average_slice = 1,
)
expected_results = np.array([0])
assert actual_results == py.approx(expected_results, abs=0.1)
[docs]
def test_gradient_2():
"""Test a circuit with one parameter"""
datalogger = MyDataLogger()
sdl = MySubDataLogger(runid = datalogger.runid)
sdl.quantum = True
sdl.noise = False
sdl.s = 0.5
sdl.shots = 1024
sdl.gradient_type = 'parameter_shift'
a = Parameter('a')
q = QuantumRegister(1)
qc = QuantumCircuit(q)
qc.rx(a, q[0])
qc.measure_all()
init_rots = [np.pi]
params = [a]
actual_results = my_gradient(sdl,
my_cost_function1,
qc,
params,
init_rots,
average_slice = 1,
)
expected_results = np.array([0])
assert actual_results == py.approx(expected_results, abs=0.1)
[docs]
def test_gradient_3():
"""Test a circuit with one parameter"""
datalogger = MyDataLogger()
sdl = MySubDataLogger(runid = datalogger.runid)
sdl.quantum = True
sdl.noise = False
sdl.s = 0.5
sdl.shots = 1024
sdl.gradient_type = 'parameter_shift'
a = Parameter('a')
q = QuantumRegister(1)
qc = QuantumCircuit(q)
qc.rx(a, q[0])
qc.measure_all()
init_rots = [np.pi/2]
params = [a]
actual_results = my_gradient(sdl,
my_cost_function1,
qc,
params,
init_rots,
average_slice = 1,
)
expected_results = np.array([0.5])
assert actual_results == py.approx(expected_results, abs=0.1)
[docs]
def test_gradient_4():
"""Test a circuit with two parameters and compare to qiskit results"""
datalogger = MyDataLogger()
sdl = MySubDataLogger(runid = datalogger.runid)
sdl.quantum = True
sdl.noise = False
sdl.s = 0.5
sdl.shots = 1024
sdl.gradient_type = 'parameter_shift'
a = Parameter('a')
b = Parameter('b')
q = QuantumRegister(1)
qc = QuantumCircuit(q)
qc.h(q)
qc.rz(a, q[0])
qc.rx(b, q[0])
qc.measure_all()
init_rots = [np.pi / 4, np.pi / 2]
params = [a, b]
actual_results = my_gradient(sdl,
my_cost_function1,
qc,
params,
init_rots,
average_slice = 1,
)
expected_results = np.array([-0.353, 0.0]) #qiskit results
assert actual_results == py.approx(expected_results, abs=0.1)
[docs]
def test_simple_circuit():
"""Test a simple circuit with known output"""
datalogger = MyDataLogger()
sdl = MySubDataLogger(runid = datalogger.runid)
sdl.quantum = True
sdl.qubits = 5
sdl.shots = 1024
params = []
sdl.mode = 5
sdl.locations = 5
sdl.gray = True
sdl.formulation = 'original'
file = 'five_d.txt'
filename = Path(NETWORK_DIR).joinpath(file)
distance_array = np.genfromtxt(filename)
cost_fn = cost_fn_fact(sdl, distance_array,)
qc = vqc_circuit(sdl, params)
actual_result, _ , _ = cost_func_evaluate(sdl,
cost_fn,
qc,
average_slice=1,
)
expected_result = 21.0
assert actual_result == expected_result
[docs]
def test_calculate_parameter_numbers_2_1():
"""Test parameter numbers with input 2,1"""
datalogger = MyDataLogger()
sdl = MySubDataLogger(runid = datalogger.runid)
sdl.qubits = 4
sdl.mode = 1
sdl.layers = 2
expected_result = 16
actual_result = sdl.calculate_parameter_numbers()
assert expected_result == actual_result