Source code for modules.test_quantum_function

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