From 29388fd019992f84bbaaf5cd1de41bef08b886b2 Mon Sep 17 00:00:00 2001 From: Boxi Li Date: Mon, 18 Dec 2023 12:58:55 +0100 Subject: [PATCH 1/4] Use CSR as default for expand_operator Transform the qobj to CSR only if it is Dense, incase more data types are introduced in the future. --- src/qutip_qip/operations/gates.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/qutip_qip/operations/gates.py b/src/qutip_qip/operations/gates.py index e080971c..4531728d 100644 --- a/src/qutip_qip/operations/gates.py +++ b/src/qutip_qip/operations/gates.py @@ -1,4 +1,5 @@ import numbers +from packaging.version import parse as parse_version from collections.abc import Iterable from itertools import product from functools import partial, reduce @@ -1276,6 +1277,9 @@ def expand_operator( [0. 0. 0. 0. 0. 0. 1. 0.] [0. 0. 0. 1. 0. 0. 0. 0.]] """ + if parse_version(qutip.__version__) >= parse_version("5.dev"): + if isinstance(oper.data, qutip.data.Dense): + oper = oper.to("csr") if N is not None: warnings.warn( "The function expand_operator has been generalized to " From fdb797ab1bf26e3b7d1362f9ca9ad6dbabf8f519 Mon Sep 17 00:00:00 2001 From: Boxi Li Date: Sun, 11 Feb 2024 17:57:12 +0100 Subject: [PATCH 2/4] Add optional dtype to expand_operator --- src/qutip_qip/operations/gates.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/qutip_qip/operations/gates.py b/src/qutip_qip/operations/gates.py index 4531728d..21db97a0 100644 --- a/src/qutip_qip/operations/gates.py +++ b/src/qutip_qip/operations/gates.py @@ -1208,7 +1208,7 @@ def _targets_to_list(targets, oper=None, N=None): def expand_operator( - oper, N=None, targets=None, dims=None, cyclic_permutation=False + oper, N=None, targets=None, dims=None, cyclic_permutation=False, dtype=None ): """ Expand an operator to one that acts on a system with desired dimensions. @@ -1233,6 +1233,9 @@ def expand_operator( E.g. if ``N=3`` and `oper` is a 2-qubit operator, the result will be a list of three operators, each acting on qubits 0 and 1, 1 and 2, 2 and 0. + dtype : str, optional + Data type of the output `Qobj`. Only for qutip version larger than 5. + Returns ------- @@ -1278,8 +1281,11 @@ def expand_operator( [0. 0. 0. 1. 0. 0. 0. 0.]] """ if parse_version(qutip.__version__) >= parse_version("5.dev"): - if isinstance(oper.data, qutip.data.Dense): - oper = oper.to("csr") + if dtype is None: + if isinstance(oper.data, qutip.data.Dense): + oper = oper.to("csr") + else: + oper = oper.to(dtype) if N is not None: warnings.warn( "The function expand_operator has been generalized to " From f60a06a787e678a449ae692361da06eb3a787402 Mon Sep 17 00:00:00 2001 From: BoxiLi Date: Tue, 2 Apr 2024 03:35:35 +0200 Subject: [PATCH 3/4] Add tests --- tests/test_gates.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/test_gates.py b/tests/test_gates.py index 3cc8d120..49938105 100644 --- a/tests/test_gates.py +++ b/tests/test_gates.py @@ -338,6 +338,19 @@ def test_non_qubit_systems(self, dimensions): assert test.dims == expected.dims np.testing.assert_allclose(test.full(), expected.full()) + @pytest.mark.skipif( + not parse_version(qutip.__version__) >= parse_version('5.dev'), + reason= + "Data type only exist in v5." + ) + def test_dtype(self): + expanded_qobj = expand_operator(gates.cnot(), dims=[2, 2, 2]).data + assert isinstance(expanded_qobj, qutip.data.CSR) + expanded_qobj = expand_operator( + gates.cnot(), dims=[2, 2, 2], dtype="dense").data + assert isinstance(expanded_qobj, qutip.data.Dense) + + def test_gates_class(): if parse_version(qutip.__version__) < parse_version('5.dev'): init_state = qutip.rand_ket(8, dims=[[2, 2, 2], [1, 1, 1]]) From ea6d7f7761f5333928c09c8ea46d15f9e830e0ef Mon Sep 17 00:00:00 2001 From: BoxiLi Date: Tue, 2 Apr 2024 03:32:13 +0200 Subject: [PATCH 4/4] Align with the dtype setting in main qutip --- src/qutip_qip/operations/gates.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/qutip_qip/operations/gates.py b/src/qutip_qip/operations/gates.py index 21db97a0..7a294f2f 100644 --- a/src/qutip_qip/operations/gates.py +++ b/src/qutip_qip/operations/gates.py @@ -1226,7 +1226,7 @@ def expand_operator( The indices of subspace that are acted on. Permutation can also be realized by changing the orders of the indices. N : int - Deprecated. Number of qubits. Please use `dims`. + Deprecated. Number of qubits. Please use `dims`. cyclic_permutation : boolean, optional Deprecated. Expand for all cyclic permutation of the targets. @@ -1281,11 +1281,9 @@ def expand_operator( [0. 0. 0. 1. 0. 0. 0. 0.]] """ if parse_version(qutip.__version__) >= parse_version("5.dev"): - if dtype is None: - if isinstance(oper.data, qutip.data.Dense): - oper = oper.to("csr") - else: - oper = oper.to(dtype) + # If no data type specified, use CSR + dtype = dtype or qutip.settings.core["default_dtype"] or qutip.data.CSR + oper = oper.to(dtype) if N is not None: warnings.warn( "The function expand_operator has been generalized to "