From c7aee4f5350e18e4021ebaae718bab4dd16895a0 Mon Sep 17 00:00:00 2001 From: Shraddha-2005 <63237790+Shraddha-2005@users.noreply.github.com> Date: Sun, 27 Nov 2022 22:44:32 +0530 Subject: [PATCH 1/3] Added linear and log sweeps --- conftest.py | 7 ++++++- red_queen/games/applications/run_bv.py | 26 +++++++++++++++++++++++--- red_queen/games/applications/run_ft.py | 21 ++++++++++++++++++++- 3 files changed, 49 insertions(+), 5 deletions(-) diff --git a/conftest.py b/conftest.py index 704c93e0..2e3119fd 100644 --- a/conftest.py +++ b/conftest.py @@ -47,7 +47,12 @@ def pytest_addoption(parser): dest="store_data", help="", ) - + group.addoption( + "--num_qubits", + default="Linear:10:100:50", + help="", + ) + @pytest.mark.trylast def pytest_configure(config): diff --git a/red_queen/games/applications/run_bv.py b/red_queen/games/applications/run_bv.py index a846af0a..4be45262 100644 --- a/red_queen/games/applications/run_bv.py +++ b/red_queen/games/applications/run_bv.py @@ -4,7 +4,6 @@ # ------------------------------------------------------------------------------ """Benchmark Bernstein Vazirani circuits.""" - import os import pytest @@ -13,14 +12,35 @@ from red_queen.games.applications import backends, run_qiskit_circuit +import random + +import numpy QASM_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "qasm") -SECRET_STRING = "110011" +@pytest.fixture +def get_num_qubits(request): + return request.config.getoption("--num_qubits") + + +def generate_num_qubits(get_num_qubits): + user_params = requests.get(get_num_qubits) + user_params = user_params.split(":") + if user_params[0] == "linear": + sweep_list = numpy.linspace(int(user_params[1]), int(user_params[2]), int(user_params[3])) + sweep_list = [int(i) for i in sweep_list] + if user_params[0] == "log": + sweep_list = numpy.logspace(int(user_params[1]), int(user_params[2]), int(user_params[3])) + sweep_list = [int(i) for i in sweep_list] + for i in sweep_list: + num_qubits = i + SECRET_STRING = bin(random.getrandbits(i - 1))[2:] + + +@pytest.mark.parametrize("num_qubits", sweep_list) def build_bv_circuit(secret_string, mid_circuit_measure=False): input_size = len(secret_string) - num_qubits = input_size + 1 if not mid_circuit_measure: qr = QuantumRegister(num_qubits) cr = ClassicalRegister(input_size) diff --git a/red_queen/games/applications/run_ft.py b/red_queen/games/applications/run_ft.py index 6f37d88e..12eae20a 100644 --- a/red_queen/games/applications/run_ft.py +++ b/red_queen/games/applications/run_ft.py @@ -23,12 +23,31 @@ DIRECTORY = "qasm" QASM_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), DIRECTORY) -SECRET_STRING = "11111111" + + +@pytest.fixture +def get_num_qubits(request): + return request.config.getoption("--num_qubits") + + +def generate_num_qubits(get_num_qubits): + user_params = requests.get(get_num_qubits) + user_params = user_params.split(":") + if user_params[0] == "linear": + sweep_list = np.linspace(int(user_params[1]), int(user_params[2]), int(user_params[3])) + sweep_list = [int(i) for i in sweep_list] + if user_params[0] == "log": + sweep_list = np.logspace(int(user_params[1]), int(user_params[2]), int(user_params[3])) + sweep_list = [int(i) for i in sweep_list] + for i in sweep_list: + num_qubits = i + SECRET_STRING = bin(random.getrandbits(i - 1))[2:] """ Generates Quantum Fourier Transform circuit using QFT and Inverse QFT""" +@pytest.mark.parametrize("num_qubits", sweep_list) def generate_ft_circuit_1(binary): qubits = QuantumRegister(len(binary)) bits = ClassicalRegister(len(binary)) From dfad92ed9809dadb3f8af67c7e4225c1d6271585 Mon Sep 17 00:00:00 2001 From: Shraddha-2005 <63237790+Shraddha-2005@users.noreply.github.com> Date: Mon, 5 Dec 2022 22:48:59 +0530 Subject: [PATCH 2/3] Modified sweep implementations --- red_queen/games/applications/run_bv.py | 44 +++++++++++++++----------- red_queen/games/applications/run_ft.py | 36 +++++++++++---------- 2 files changed, 44 insertions(+), 36 deletions(-) diff --git a/red_queen/games/applications/run_bv.py b/red_queen/games/applications/run_bv.py index 4be45262..b1e36f07 100644 --- a/red_queen/games/applications/run_bv.py +++ b/red_queen/games/applications/run_bv.py @@ -14,33 +14,33 @@ import random -import numpy +import requests + +import numpy as np QASM_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "qasm") @pytest.fixture def get_num_qubits(request): - return request.config.getoption("--num_qubits") - - -def generate_num_qubits(get_num_qubits): - user_params = requests.get(get_num_qubits) + user_params = request.config.getoption("--num_qubits") user_params = user_params.split(":") if user_params[0] == "linear": - sweep_list = numpy.linspace(int(user_params[1]), int(user_params[2]), int(user_params[3])) - sweep_list = [int(i) for i in sweep_list] + sweep = np.linspace(int(user_params[1]), int(user_params[2]), int(user_params[3])) + sweep = [int(i) for i in sweep] if user_params[0] == "log": - sweep_list = numpy.logspace(int(user_params[1]), int(user_params[2]), int(user_params[3])) - sweep_list = [int(i) for i in sweep_list] - for i in sweep_list: - num_qubits = i - SECRET_STRING = bin(random.getrandbits(i - 1))[2:] + sweep = np.logspace(int(user_params[1]), int(user_params[2]), int(user_params[3])) + sweep = [int(i) for i in sweep] + return sweep + + +sweep_list = requests.get(get_num_qubits) +default_secret_string = "110011" -@pytest.mark.parametrize("num_qubits", sweep_list) def build_bv_circuit(secret_string, mid_circuit_measure=False): input_size = len(secret_string) + num_qubits = input_size + 1 if not mid_circuit_measure: qr = QuantumRegister(num_qubits) cr = ClassicalRegister(input_size) @@ -78,19 +78,25 @@ def build_bv_circuit(secret_string, mid_circuit_measure=False): @pytest.mark.parametrize("optimization_level", [0, 1, 2, 3]) @pytest.mark.parametrize("backend", backends) @pytest.mark.parametrize("method", ["normal", "mid-circuit measurement"]) -def bench_qiskit_bv(benchmark, optimization_level, backend, method): +@pytest.mark.parametrize("num_qubits", sweep_list) +def bench_qiskit_bv(benchmark, optimization_level, backend, method, num_qubits): shots = 65536 + SECRET_STRING = bin(random.getrandbits(num_qubits - 1))[2:] expected_counts = {SECRET_STRING: shots} + circ = build_bv_circuit(SECRET_STRING) + run_qiskit_circuit(benchmark, circ, backend, optimization_level, shots, expected_counts) if method == "normal": benchmark.name = "Bernstein Vazirani" - circ = QuantumCircuit.from_qasm_file(os.path.join(QASM_DIR, "bv.qasm")) + circ = build_bv_circuit(SECRET_STRING) else: benchmark.name = "Bernstein Vazirani (mid-circuit measurement)" - circ = QuantumCircuit.from_qasm_file(os.path.join(QASM_DIR, "bv_mcm.qasm")) + circ = build_bv_circuit(SECRET_STRING, True) benchmark.algorithm = f"Optimization level: {optimization_level} on {backend.name()}" run_qiskit_circuit(benchmark, circ, backend, optimization_level, shots, expected_counts) if __name__ == "__main__": - build_bv_circuit(SECRET_STRING).qasm(filename=os.path.join(QASM_DIR, "bv.qasm")) - build_bv_circuit(SECRET_STRING, True).qasm(filename=os.path.join(QASM_DIR, "bv_mcm.qasm")) + build_bv_circuit(default_secret_string).qasm(filename=os.path.join(QASM_DIR, "bv.qasm")) + build_bv_circuit(default_secret_string, True).qasm( + filename=os.path.join(QASM_DIR, "bv_mcm.qasm") + ) diff --git a/red_queen/games/applications/run_ft.py b/red_queen/games/applications/run_ft.py index 12eae20a..2bfeb08c 100644 --- a/red_queen/games/applications/run_ft.py +++ b/red_queen/games/applications/run_ft.py @@ -16,6 +16,7 @@ import pytest from red_queen.games.applications import backends, run_qiskit_circuit import numpy as np +import requests # Importing standard Qiskit libraries from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister @@ -27,21 +28,19 @@ @pytest.fixture def get_num_qubits(request): - return request.config.getoption("--num_qubits") - - -def generate_num_qubits(get_num_qubits): - user_params = requests.get(get_num_qubits) + user_params = request.config.getoption("--num_qubits") user_params = user_params.split(":") if user_params[0] == "linear": - sweep_list = np.linspace(int(user_params[1]), int(user_params[2]), int(user_params[3])) - sweep_list = [int(i) for i in sweep_list] + sweep = np.linspace(int(user_params[1]), int(user_params[2]), int(user_params[3])) + sweep = [int(i) for i in sweep] if user_params[0] == "log": - sweep_list = np.logspace(int(user_params[1]), int(user_params[2]), int(user_params[3])) - sweep_list = [int(i) for i in sweep_list] - for i in sweep_list: - num_qubits = i - SECRET_STRING = bin(random.getrandbits(i - 1))[2:] + sweep = np.logspace(int(user_params[1]), int(user_params[2]), int(user_params[3])) + sweep = [int(i) for i in sweep] + return sweep + + +sweep_list = requests.get(get_num_qubits) +default_secret_string = "110011" """ Generates Quantum Fourier Transform circuit using QFT and Inverse QFT""" @@ -106,8 +105,10 @@ def generate_ft_circuit_2(binary): @pytest.mark.parametrize("optimization_level", [0, 1, 2, 3]) @pytest.mark.parametrize("backend", backends) @pytest.mark.parametrize("method", ["1", "2"]) -def bench_qiskit_ft(benchmark, optimization_level, backend, method): +@pytest.mark.parametrize("num_qubits", sweep_list) +def bench_qiskit_ft(benchmark, optimization_level, backend, method, num_qubits): shots = 65536 + SECRET_STRING = bin(random.getrandbits(num_qubits - 1))[2:] integer_value = int(SECRET_STRING, 2) binary_1 = format((integer_value + 1) % (2 ** (len(SECRET_STRING))), "b").zfill( len(SECRET_STRING) @@ -115,14 +116,15 @@ def bench_qiskit_ft(benchmark, optimization_level, backend, method): expected_counts = {binary_1: shots} if method == "1" else {SECRET_STRING: shots} if method == "1": benchmark.name = "Quantum Fourier Transform v1" - circ = QuantumCircuit.from_qasm_file(os.path.join(QASM_DIR, "ft_1.qasm")) + circ = generate_ft_circuit_1(SECRET_STRING) else: benchmark.name = "Quantum Fourier Transform v2" - circ = QuantumCircuit.from_qasm_file(os.path.join(QASM_DIR, "ft_2.qasm")) + circ = generate_ft_circuit_2(SECRET_STRING) + benchmark.algorithm = f"Optimization level: {optimization_level} on {backend.name()}" run_qiskit_circuit(benchmark, circ, backend, optimization_level, shots, expected_counts) if __name__ == "__main__": - generate_ft_circuit_1(SECRET_STRING).qasm(filename=os.path.join(QASM_DIR, "ft_1.qasm")) - generate_ft_circuit_2(SECRET_STRING).qasm(filename=os.path.join(QASM_DIR, "ft_2.qasm")) + generate_ft_circuit_1(default_secret_string).qasm(filename=os.path.join(QASM_DIR, "ft_1.qasm")) + generate_ft_circuit_2(default_secret_string).qasm(filename=os.path.join(QASM_DIR, "ft_2.qasm")) From c26343062d2a69be83a98494eacb732cca6f9eff Mon Sep 17 00:00:00 2001 From: Shraddha-2005 <63237790+Shraddha-2005@users.noreply.github.com> Date: Mon, 5 Dec 2022 23:40:54 +0530 Subject: [PATCH 3/3] Modified bench_qiskit_ft --- conftest.py | 2 +- red_queen/games/applications/run_bv.py | 11 ++++------- red_queen/games/applications/run_ft.py | 3 ++- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/conftest.py b/conftest.py index 2e3119fd..cb8deb12 100644 --- a/conftest.py +++ b/conftest.py @@ -49,7 +49,7 @@ def pytest_addoption(parser): ) group.addoption( "--num_qubits", - default="Linear:10:100:50", + default="linear:10:100:50", help="", ) diff --git a/red_queen/games/applications/run_bv.py b/red_queen/games/applications/run_bv.py index b1e36f07..309435d1 100644 --- a/red_queen/games/applications/run_bv.py +++ b/red_queen/games/applications/run_bv.py @@ -34,7 +34,7 @@ def get_num_qubits(request): return sweep -sweep_list = requests.get(get_num_qubits) +sweep_list = list(requests.get(get_num_qubits)) default_secret_string = "110011" @@ -81,10 +81,9 @@ def build_bv_circuit(secret_string, mid_circuit_measure=False): @pytest.mark.parametrize("num_qubits", sweep_list) def bench_qiskit_bv(benchmark, optimization_level, backend, method, num_qubits): shots = 65536 - SECRET_STRING = bin(random.getrandbits(num_qubits - 1))[2:] + SECRET_STRING = str(bin(random.getrandbits(num_qubits - 1))[2:].zfill(num_qubits-1)) expected_counts = {SECRET_STRING: shots} - circ = build_bv_circuit(SECRET_STRING) - run_qiskit_circuit(benchmark, circ, backend, optimization_level, shots, expected_counts) + if method == "normal": benchmark.name = "Bernstein Vazirani" circ = build_bv_circuit(SECRET_STRING) @@ -97,6 +96,4 @@ def bench_qiskit_bv(benchmark, optimization_level, backend, method, num_qubits): if __name__ == "__main__": build_bv_circuit(default_secret_string).qasm(filename=os.path.join(QASM_DIR, "bv.qasm")) - build_bv_circuit(default_secret_string, True).qasm( - filename=os.path.join(QASM_DIR, "bv_mcm.qasm") - ) + build_bv_circuit(default_secret_string, True).qasm(filename=os.path.join(QASM_DIR, "bv_mcm.qasm")) diff --git a/red_queen/games/applications/run_ft.py b/red_queen/games/applications/run_ft.py index 2bfeb08c..ca8e016b 100644 --- a/red_queen/games/applications/run_ft.py +++ b/red_queen/games/applications/run_ft.py @@ -17,6 +17,7 @@ from red_queen.games.applications import backends, run_qiskit_circuit import numpy as np import requests +import random # Importing standard Qiskit libraries from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister @@ -108,7 +109,7 @@ def generate_ft_circuit_2(binary): @pytest.mark.parametrize("num_qubits", sweep_list) def bench_qiskit_ft(benchmark, optimization_level, backend, method, num_qubits): shots = 65536 - SECRET_STRING = bin(random.getrandbits(num_qubits - 1))[2:] + SECRET_STRING = str(bin(random.getrandbits(num_qubits - 1))[2:].zfill(num_qubits-1)) integer_value = int(SECRET_STRING, 2) binary_1 = format((integer_value + 1) % (2 ** (len(SECRET_STRING))), "b").zfill( len(SECRET_STRING)