From c592c6018a16c9e65da2af5615f1e9c2b750dce3 Mon Sep 17 00:00:00 2001 From: Liwei Yang Date: Wed, 19 Apr 2023 10:13:30 +0800 Subject: [PATCH 1/9] Make the import statement more concise --- src/qibotn/__main__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibotn/__main__.py b/src/qibotn/__main__.py index f81bfd3..f702755 100644 --- a/src/qibotn/__main__.py +++ b/src/qibotn/__main__.py @@ -1,7 +1,7 @@ import argparse from timeit import default_timer as timer -from qibotn import quimb as qiboquimb +import qibotn.quimb from QiboCircuitConvertor import QiboCircuitToEinsum from cuquantum import contract import cupy as cp @@ -18,7 +18,7 @@ def parser(): def main(args: argparse.Namespace): print("Testing for %d nqubits" % (args.nqubits)) - qiboquimb.eval(args.nqubits, args.qasm_circ, args.init_state) + qibotn.quimb.eval(args.nqubits, args.qasm_circ, args.init_state) def parser_cuquantum(): From a50cb76fdb5f7b203bf122482bd5e78481a2a1f1 Mon Sep 17 00:00:00 2001 From: Liwei Yang Date: Wed, 19 Apr 2023 10:32:17 +0800 Subject: [PATCH 2/9] Remove unnecessary aliases --- src/qibotn/__main__.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/qibotn/__main__.py b/src/qibotn/__main__.py index f702755..f79a24e 100644 --- a/src/qibotn/__main__.py +++ b/src/qibotn/__main__.py @@ -59,14 +59,12 @@ def run_bench(task, label): def main_cuquantum(args: argparse.Namespace): print("Testing for %d nqubits" % (args.nqubits)) - nqubits = args.nqubits - circuit_name = args.circuit datatype = args.precision - if circuit_name in ("qft", "QFT"): - circuit = QFT(nqubits) + if args.circuit.lower() == "qft": + circuit = QFT(args.nqubits) else: - raise NotImplementedError(f"Cannot find circuit {circuit_name}.") + raise NotImplementedError(f"Cannot find circuit {args.circuit}.") myconvertor = QiboCircuitToEinsum(circuit, dtype=datatype) operands_expression = myconvertor.state_vector() From d86eaf0134329b356c6da11545b9881fc2aae903 Mon Sep 17 00:00:00 2001 From: Liwei Yang Date: Wed, 19 Apr 2023 15:00:43 +0800 Subject: [PATCH 3/9] Fix the import error for QiboCircuitConvertor --- src/qibotn/cutn.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibotn/cutn.py b/src/qibotn/cutn.py index 026604a..985d7bb 100644 --- a/src/qibotn/cutn.py +++ b/src/qibotn/cutn.py @@ -1,9 +1,9 @@ # from qibotn import quimb as qiboquimb -from QiboCircuitConvertor import QiboCircuitToEinsum +from qibotn.QiboCircuitConvertor import QiboCircuitToEinsum from cuquantum import contract -def eval(qibo_circ,datatype): +def eval(qibo_circ, datatype): myconvertor = QiboCircuitToEinsum(qibo_circ, dtype=datatype) operands_expression = myconvertor.state_vector() results = contract(*operands_expression) From bea6b1c16659305fe80538017343a5c23f550828 Mon Sep 17 00:00:00 2001 From: Liwei Yang Date: Wed, 19 Apr 2023 15:09:01 +0800 Subject: [PATCH 4/9] Remove the test in __main__.py because the test has been moved into folder --- src/qibotn/__main__.py | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/src/qibotn/__main__.py b/src/qibotn/__main__.py index f79a24e..15a775a 100644 --- a/src/qibotn/__main__.py +++ b/src/qibotn/__main__.py @@ -57,24 +57,5 @@ def run_bench(task, label): return result -def main_cuquantum(args: argparse.Namespace): - print("Testing for %d nqubits" % (args.nqubits)) - datatype = args.precision - - if args.circuit.lower() == "qft": - circuit = QFT(args.nqubits) - else: - raise NotImplementedError(f"Cannot find circuit {args.circuit}.") - - myconvertor = QiboCircuitToEinsum(circuit, dtype=datatype) - operands_expression = myconvertor.state_vector() - - result_qibo = run_bench(circuit, "Qibo") - sv_cutn = run_bench(lambda: contract(*operands_expression), "cuQuantum cuTensorNet") - - # print(f"is sv in agreement?", cp.allclose(sv_cutn.flatten(), result_qibo.state(numpy=True))) - assert cp.allclose(sv_cutn.flatten(), result_qibo.state(numpy=True)) - - if __name__ == "__main__": - main_cuquantum(parser_cuquantum()) + main(parser()) From 725c92e75dc73c3e0b6d315d79f3089c961c10ec Mon Sep 17 00:00:00 2001 From: Liwei Yang Date: Wed, 19 Apr 2023 15:12:08 +0800 Subject: [PATCH 5/9] Remove unused imports, format it using black --- tests/test_cuquantum_cutensor_backend.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/tests/test_cuquantum_cutensor_backend.py b/tests/test_cuquantum_cutensor_backend.py index 30823ef..74cf2e1 100644 --- a/tests/test_cuquantum_cutensor_backend.py +++ b/tests/test_cuquantum_cutensor_backend.py @@ -1,5 +1,3 @@ -import copy -import os from timeit import default_timer as timer import config @@ -22,18 +20,22 @@ def time(func): time = end - start return time, res + @pytest.mark.gpu @pytest.mark.parametrize("nqubits", [1, 2, 5, 10]) def test_eval(nqubits: int): import qibotn.cutn # Test qibo - qibo.set_backend(backend=config.qibo.backend, platform=config.qibo.platform) - qibo_time, (qibo_circ, result_sv) = time(lambda: qibo_qft(nqubits, swaps=True)) + qibo.set_backend(backend=config.qibo.backend, + platform=config.qibo.platform) + qibo_time, (qibo_circ, result_sv) = time( + lambda: qibo_qft(nqubits, swaps=True)) # Test Cuquantum data_type = "complex128" - cutn_time, result_tn = time(lambda: qibotn.cutn.eval(qibo_circ,data_type)) + cutn_time, result_tn = time(lambda: qibotn.cutn.eval(qibo_circ, data_type)) assert 1e-2 * qibo_time < cutn_time < 1e2 * qibo_time - assert np.allclose(result_sv, result_tn), "Resulting dense vectors do not match" + assert np.allclose( + result_sv, result_tn), "Resulting dense vectors do not match" From 820744e57e0a7fc2b4f63cfe7e1d90df3736c3a4 Mon Sep 17 00:00:00 2001 From: Liwei Yang Date: Wed, 19 Apr 2023 15:19:26 +0800 Subject: [PATCH 6/9] Remove unused functions --- src/qibotn/__main__.py | 36 ------------------------------------ 1 file changed, 36 deletions(-) diff --git a/src/qibotn/__main__.py b/src/qibotn/__main__.py index 15a775a..052dfaa 100644 --- a/src/qibotn/__main__.py +++ b/src/qibotn/__main__.py @@ -21,41 +21,5 @@ def main(args: argparse.Namespace): qibotn.quimb.eval(args.nqubits, args.qasm_circ, args.init_state) -def parser_cuquantum(): - parser = argparse.ArgumentParser() - - parser.add_argument( - "--nqubits", default=10, type=int, help="Number of quibits in the circuits." - ) - - parser.add_argument( - "--circuit", - default="qft", - type=str, - help="Type of circuit to use. See README for the list of " - "available circuits.", - ) - - parser.add_argument( - "--precision", - default="complex128", - type=str, - help="Numerical precision of the simulation. " - "Choose between 'complex128' and 'complex64'.", - ) - - return parser.parse_args() - - -def run_bench(task, label): - start = timer() - result = task() - end = timer() - circuit_eval_time = end - start - print(f"Simulation time: {label} = {circuit_eval_time}s") - - return result - - if __name__ == "__main__": main(parser()) From 5bfa1d9f5284ed8a8e089dd1ae235b30e0b3001a Mon Sep 17 00:00:00 2001 From: Liwei Yang Date: Wed, 19 Apr 2023 15:21:24 +0800 Subject: [PATCH 7/9] Remove unused imports --- src/qibotn/__main__.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/qibotn/__main__.py b/src/qibotn/__main__.py index 052dfaa..0476be5 100644 --- a/src/qibotn/__main__.py +++ b/src/qibotn/__main__.py @@ -1,11 +1,6 @@ import argparse -from timeit import default_timer as timer import qibotn.quimb -from QiboCircuitConvertor import QiboCircuitToEinsum -from cuquantum import contract -import cupy as cp -from qibo.models import QFT def parser(): From 4d36afb9efde1478a0f274670ed918dd77578bf4 Mon Sep 17 00:00:00 2001 From: Liwei Yang Date: Wed, 19 Apr 2023 16:11:14 +0800 Subject: [PATCH 8/9] Expose the precision dtype to the caller so that users can specify the precision for testing --- tests/test_cuquantum_cutensor_backend.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/tests/test_cuquantum_cutensor_backend.py b/tests/test_cuquantum_cutensor_backend.py index 74cf2e1..e438b24 100644 --- a/tests/test_cuquantum_cutensor_backend.py +++ b/tests/test_cuquantum_cutensor_backend.py @@ -23,7 +23,14 @@ def time(func): @pytest.mark.gpu @pytest.mark.parametrize("nqubits", [1, 2, 5, 10]) -def test_eval(nqubits: int): +def test_eval(nqubits: int, dtype="complex128"): + """Evaluate QASM with cuQuantum. + + Args: + nqubits (int): Total number of qubits in the system. + dtype (str): The data type for precision, 'complex64' for single, + 'complex128' for double. + """ import qibotn.cutn # Test qibo @@ -33,8 +40,7 @@ def test_eval(nqubits: int): lambda: qibo_qft(nqubits, swaps=True)) # Test Cuquantum - data_type = "complex128" - cutn_time, result_tn = time(lambda: qibotn.cutn.eval(qibo_circ, data_type)) + cutn_time, result_tn = time(lambda: qibotn.cutn.eval(qibo_circ, dtype)) assert 1e-2 * qibo_time < cutn_time < 1e2 * qibo_time assert np.allclose( From e517b4fe7c6a9d15ed03e5e8b55c6b17ba625b03 Mon Sep 17 00:00:00 2001 From: Liwei Yang Date: Wed, 19 Apr 2023 16:23:59 +0800 Subject: [PATCH 9/9] Avoid flatten() so as to keep the shape information of contraction results --- src/qibotn/cutn.py | 2 +- tests/test_cuquantum_cutensor_backend.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/qibotn/cutn.py b/src/qibotn/cutn.py index 985d7bb..36f7866 100644 --- a/src/qibotn/cutn.py +++ b/src/qibotn/cutn.py @@ -7,4 +7,4 @@ def eval(qibo_circ, datatype): myconvertor = QiboCircuitToEinsum(qibo_circ, dtype=datatype) operands_expression = myconvertor.state_vector() results = contract(*operands_expression) - return results.flatten() + return results diff --git a/tests/test_cuquantum_cutensor_backend.py b/tests/test_cuquantum_cutensor_backend.py index e438b24..e7f2804 100644 --- a/tests/test_cuquantum_cutensor_backend.py +++ b/tests/test_cuquantum_cutensor_backend.py @@ -40,7 +40,8 @@ def test_eval(nqubits: int, dtype="complex128"): lambda: qibo_qft(nqubits, swaps=True)) # Test Cuquantum - cutn_time, result_tn = time(lambda: qibotn.cutn.eval(qibo_circ, dtype)) + cutn_time, result_tn = time( + lambda: qibotn.cutn.eval(qibo_circ, dtype).flatten()) assert 1e-2 * qibo_time < cutn_time < 1e2 * qibo_time assert np.allclose(