From ad5e663f97a5e70313ad18692e6564d40ce6db12 Mon Sep 17 00:00:00 2001 From: Nicolas Renaud Date: Mon, 6 Nov 2023 08:57:44 +0100 Subject: [PATCH 01/22] Update test_vqls.py do not import qiskit_algorithm --- tests/test_vqls.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/test_vqls.py b/tests/test_vqls.py index fa1414c..ca1a1f8 100644 --- a/tests/test_vqls.py +++ b/tests/test_vqls.py @@ -20,7 +20,6 @@ from qiskit import BasicAer, QuantumCircuit from qiskit.circuit.library import RealAmplitudes -from qiskit.utils import algorithm_globals from qiskit.algorithms.optimizers import COBYLA from qiskit.primitives import Estimator, Sampler, BackendEstimator, BackendSampler @@ -32,8 +31,6 @@ class TestVQLS(QiskitTestCase): def setUp(self): super().setUp() - self.seed = 50 - algorithm_globals.random_seed = self.seed self.options = ( {"use_local_cost_function": False, "use_overlap_test": False}, From 948a753d3965a740b0007ce27664767583c07c30 Mon Sep 17 00:00:00 2001 From: Nicolas Renaud Date: Mon, 6 Nov 2023 08:58:43 +0100 Subject: [PATCH 02/22] Update test_hadamard.py --- tests/test_hadamard.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/test_hadamard.py b/tests/test_hadamard.py index 2ce1506..c5de6e8 100644 --- a/tests/test_hadamard.py +++ b/tests/test_hadamard.py @@ -13,7 +13,6 @@ import numpy as np from qiskit.test import QiskitTestCase -from qiskit.utils import algorithm_globals from qiskit.circuit.library import RealAmplitudes from qiskit.algorithms import optimizers as opt @@ -28,8 +27,6 @@ class TestHadamard(QiskitTestCase): def setUp(self): super().setUp() - self.seed = 50 - algorithm_globals.random_seed = self.seed # define system self.estimator = Estimator() From aaf5275816332528f28b12a77ec104857ab2d0b2 Mon Sep 17 00:00:00 2001 From: Nicolas Renaud Date: Mon, 6 Nov 2023 08:59:06 +0100 Subject: [PATCH 03/22] Update test_hybrid_qst_vqls.py --- tests/test_hybrid_qst_vqls.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/test_hybrid_qst_vqls.py b/tests/test_hybrid_qst_vqls.py index 11f35e1..ca67e13 100644 --- a/tests/test_hybrid_qst_vqls.py +++ b/tests/test_hybrid_qst_vqls.py @@ -20,7 +20,6 @@ from qiskit import BasicAer from qiskit.circuit.library import RealAmplitudes -from qiskit.utils import algorithm_globals from qiskit.algorithms.optimizers import COBYLA from qiskit.primitives import Estimator, Sampler, BackendEstimator, BackendSampler @@ -32,8 +31,6 @@ class TestHybridQSTVQLS(QiskitTestCase): def setUp(self): super().setUp() - self.seed = 50 - algorithm_globals.random_seed = self.seed self.options = ({"use_local_cost_function": False, "use_overlap_test": False},) From 8afa205317fd5f6026edab20544a4249b77d85b8 Mon Sep 17 00:00:00 2001 From: Nicolas Renaud Date: Mon, 6 Nov 2023 08:59:26 +0100 Subject: [PATCH 04/22] Update test_qst_vqls.py --- tests/test_qst_vqls.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/test_qst_vqls.py b/tests/test_qst_vqls.py index 9f0a059..fb394b9 100644 --- a/tests/test_qst_vqls.py +++ b/tests/test_qst_vqls.py @@ -20,7 +20,6 @@ from qiskit import BasicAer from qiskit.circuit.library import RealAmplitudes -from qiskit.utils import algorithm_globals from qiskit.algorithms.optimizers import COBYLA from qiskit.primitives import Estimator, Sampler, BackendEstimator, BackendSampler @@ -32,8 +31,6 @@ class TestQSTVQLS(QiskitTestCase): def setUp(self): super().setUp() - self.seed = 50 - algorithm_globals.random_seed = self.seed self.options = ({"use_local_cost_function": False, "use_overlap_test": False},) From 658bf9b795e92296f7378958d421f27a0bfcd4e1 Mon Sep 17 00:00:00 2001 From: Nicolas Renaud Date: Mon, 6 Nov 2023 08:59:53 +0100 Subject: [PATCH 05/22] Update test_tomography.py --- tests/test_tomography.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/test_tomography.py b/tests/test_tomography.py index 14ab761..5cd146b 100644 --- a/tests/test_tomography.py +++ b/tests/test_tomography.py @@ -12,7 +12,6 @@ import numpy as np from qiskit.test import QiskitTestCase -from qiskit.utils import algorithm_globals from qiskit import Aer from qiskit.circuit.library import RealAmplitudes @@ -24,8 +23,6 @@ class TestTomography(QiskitTestCase): def setUp(self): super().setUp() - self.seed = 50 - algorithm_globals.random_seed = self.seed # define ansatz num_qubits = 2 From ca6c19ae7d47ddaff099a844b5a485149f489692 Mon Sep 17 00:00:00 2001 From: Nicolas Renaud Date: Tue, 7 Nov 2023 10:41:12 +0100 Subject: [PATCH 06/22] check for spsp general matrix --- vqls_prototype/matrix_decomposition/matrix_decomposition.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vqls_prototype/matrix_decomposition/matrix_decomposition.py b/vqls_prototype/matrix_decomposition/matrix_decomposition.py index eecabc3..b3496c4 100644 --- a/vqls_prototype/matrix_decomposition/matrix_decomposition.py +++ b/vqls_prototype/matrix_decomposition/matrix_decomposition.py @@ -412,7 +412,7 @@ def get_possible_pauli_strings(self) -> List: # if we use the sparse decomposition if self.use_sparse: # for now convert to coo and extract indices - assert isinstance(self._matrix, spsp.csr_array) + assert isinstance(self._matrix, spsp.spmatrix) coo_mat = self._matrix.tocoo() idx_row, idx_col = coo_mat.row, coo_mat.col From e2ca7b8d36af57a9efe2d95f371e081a7e9d1ca2 Mon Sep 17 00:00:00 2001 From: Nicolas Renaud Date: Tue, 7 Nov 2023 10:51:55 +0100 Subject: [PATCH 07/22] removed validate_mi --- vqls_prototype/solver/base_solver.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/vqls_prototype/solver/base_solver.py b/vqls_prototype/solver/base_solver.py index c9083a4..3b6e564 100644 --- a/vqls_prototype/solver/base_solver.py +++ b/vqls_prototype/solver/base_solver.py @@ -8,7 +8,6 @@ from qiskit import QuantumCircuit from qiskit.primitives import BaseEstimator, BaseSampler from qiskit.algorithms.variational_algorithm import VariationalAlgorithm -from qiskit.utils.validation import validate_min from qiskit.circuit.library.n_local.real_amplitudes import RealAmplitudes from qiskit.algorithms.optimizers import Minimizer, Optimizer from qiskit.opflow.gradients import GradientBase @@ -71,8 +70,6 @@ def __init__( """ super().__init__() - validate_min("max_evals_grouped", max_evals_grouped, 1) - self._num_qubits = None self._max_evals_grouped = max_evals_grouped From 788df68f0e1dee60edf2f3c3e38bff8f64113e59 Mon Sep 17 00:00:00 2001 From: Nicolas Renaud Date: Tue, 7 Nov 2023 11:22:17 +0100 Subject: [PATCH 08/22] bumped qiskit_algorithms --- docs/how_tos/01_how_to_solve_linear_system.ipynb | 2 +- docs/how_tos/03_how_to_use_runtime.ipynb | 2 +- docs/how_tos/04_how_to_control_options.ipynb | 2 +- docs/technical_docs/vqls.md | 2 +- docs/tutorials/vqls.ipynb | 2 +- docs/tutorials/vqls_runtime.ipynb | 2 +- tests/test_hadamard.py | 2 +- tests/test_hybrid_qst_vqls.py | 2 +- tests/test_qst_vqls.py | 2 +- tests/test_vqls.py | 2 +- .../hadamard_test/direct_hadamard_test.py | 2 +- .../hadamard_test/hadamard_overlap_test.py | 2 +- vqls_prototype/hadamard_test/hadamard_test.py | 2 +- vqls_prototype/solver/base_solver.py | 7 +++++-- vqls_prototype/solver/hybrid_qst_vqls.py | 14 +++++++------- vqls_prototype/solver/qst_vqls.py | 14 +++++++------- vqls_prototype/solver/vqls.py | 13 +++++-------- 17 files changed, 37 insertions(+), 37 deletions(-) diff --git a/docs/how_tos/01_how_to_solve_linear_system.ipynb b/docs/how_tos/01_how_to_solve_linear_system.ipynb index d912222..ddd1046 100644 --- a/docs/how_tos/01_how_to_solve_linear_system.ipynb +++ b/docs/how_tos/01_how_to_solve_linear_system.ipynb @@ -103,7 +103,7 @@ "source": [ "from vqls_prototype import VQLS, VQLSLog\n", "from qiskit.primitives import Estimator\n", - "from qiskit.algorithms import optimizers as opt\n", + "from qiskit_algorithms import optimizers as opt\n", "\n", "# instantiate an estimator primitive\n", "estimator = Estimator()\n", diff --git a/docs/how_tos/03_how_to_use_runtime.ipynb b/docs/how_tos/03_how_to_use_runtime.ipynb index 4d80a6b..c72d818 100644 --- a/docs/how_tos/03_how_to_use_runtime.ipynb +++ b/docs/how_tos/03_how_to_use_runtime.ipynb @@ -67,7 +67,7 @@ "source": [ "from qiskit_ibm_runtime import QiskitRuntimeService, Estimator, Session, Options\n", "from vqls_prototype import VQLS, VQLSLog\n", - "from qiskit.algorithms import optimizers as opt\n", + "from qiskit._algorithms import optimizers as opt\n", "\n", "# make sure your IBMQ account is saved\n", "\n", diff --git a/docs/how_tos/04_how_to_control_options.ipynb b/docs/how_tos/04_how_to_control_options.ipynb index 9ac6fd5..fce35a5 100644 --- a/docs/how_tos/04_how_to_control_options.ipynb +++ b/docs/how_tos/04_how_to_control_options.ipynb @@ -57,7 +57,7 @@ "outputs": [], "source": [ "from qiskit.primitives import Estimator, Sampler\n", - "from qiskit.algorithms import optimizers as opt\n", + "from qiskit_algorithms import optimizers as opt\n", "from vqls_prototype import VQLS, VQLSLog\n", "\n", "# instantiate an estimator primitive\n", diff --git a/docs/technical_docs/vqls.md b/docs/technical_docs/vqls.md index eb617e5..4cf66a9 100644 --- a/docs/technical_docs/vqls.md +++ b/docs/technical_docs/vqls.md @@ -45,7 +45,7 @@ Systems of linear equations arise naturally in many real-life applications in a ```python from qalcore.qiskit.vqls.vqls import VQLS, VQLSLog from qiskit.circuit.library.n_local.real_amplitudes import RealAmplitudes - from qiskit.algorithms import optimizers as opt + from qiskit_algorithms import optimizers as opt from qiskit import Aer, BasicAer import numpy as np diff --git a/docs/tutorials/vqls.ipynb b/docs/tutorials/vqls.ipynb index c284b44..0610cf1 100644 --- a/docs/tutorials/vqls.ipynb +++ b/docs/tutorials/vqls.ipynb @@ -9,7 +9,7 @@ "from vqls_prototype import VQLS, VQLSLog\n", "from qiskit.primitives import Estimator, Sampler\n", "from qiskit.circuit.library.n_local.real_amplitudes import RealAmplitudes\n", - "from qiskit.algorithms.optimizers import COBYLA\n", + "from qiskit_algorithms.optimizers import COBYLA\n", "import numpy as np" ] }, diff --git a/docs/tutorials/vqls_runtime.ipynb b/docs/tutorials/vqls_runtime.ipynb index 49e6c67..82a9529 100644 --- a/docs/tutorials/vqls_runtime.ipynb +++ b/docs/tutorials/vqls_runtime.ipynb @@ -9,7 +9,7 @@ "from vqls_prototype import VQLS, VQLSLog\n", "from qiskit_ibm_runtime import QiskitRuntimeService, Estimator, Session, Options\n", "from qiskit.circuit.library.n_local.real_amplitudes import RealAmplitudes\n", - "from qiskit.algorithms.optimizers import COBYLA\n", + "from qiskit_algorithms.optimizers import COBYLA\n", "import numpy as np" ] }, diff --git a/tests/test_hadamard.py b/tests/test_hadamard.py index c5de6e8..a208405 100644 --- a/tests/test_hadamard.py +++ b/tests/test_hadamard.py @@ -15,7 +15,7 @@ from qiskit.test import QiskitTestCase from qiskit.circuit.library import RealAmplitudes -from qiskit.algorithms import optimizers as opt +from qiskit_algorithms import optimizers as opt from qiskit.primitives import Estimator, Sampler from vqls_prototype import VQLS, VQLSLog, Hybrid_QST_VQLS diff --git a/tests/test_hybrid_qst_vqls.py b/tests/test_hybrid_qst_vqls.py index ca67e13..0496e62 100644 --- a/tests/test_hybrid_qst_vqls.py +++ b/tests/test_hybrid_qst_vqls.py @@ -21,7 +21,7 @@ from qiskit import BasicAer from qiskit.circuit.library import RealAmplitudes -from qiskit.algorithms.optimizers import COBYLA +from qiskit_algorithms.optimizers import COBYLA from qiskit.primitives import Estimator, Sampler, BackendEstimator, BackendSampler from vqls_prototype import Hybrid_QST_VQLS, VQLSLog diff --git a/tests/test_qst_vqls.py b/tests/test_qst_vqls.py index fb394b9..74bd996 100644 --- a/tests/test_qst_vqls.py +++ b/tests/test_qst_vqls.py @@ -21,7 +21,7 @@ from qiskit import BasicAer from qiskit.circuit.library import RealAmplitudes -from qiskit.algorithms.optimizers import COBYLA +from qiskit_algorithms.optimizers import COBYLA from qiskit.primitives import Estimator, Sampler, BackendEstimator, BackendSampler from vqls_prototype import QST_VQLS, VQLSLog diff --git a/tests/test_vqls.py b/tests/test_vqls.py index ca1a1f8..d6f78ec 100644 --- a/tests/test_vqls.py +++ b/tests/test_vqls.py @@ -21,7 +21,7 @@ from qiskit import BasicAer, QuantumCircuit from qiskit.circuit.library import RealAmplitudes -from qiskit.algorithms.optimizers import COBYLA +from qiskit_algorithms.optimizers import COBYLA from qiskit.primitives import Estimator, Sampler, BackendEstimator, BackendSampler from vqls_prototype import VQLS, VQLSLog diff --git a/vqls_prototype/hadamard_test/direct_hadamard_test.py b/vqls_prototype/hadamard_test/direct_hadamard_test.py index f38c612..776009b 100644 --- a/vqls_prototype/hadamard_test/direct_hadamard_test.py +++ b/vqls_prototype/hadamard_test/direct_hadamard_test.py @@ -1,6 +1,6 @@ from typing import Optional, List from qiskit import QuantumCircuit -from qiskit.algorithms.exceptions import AlgorithmError +from qiskit_algorithms.exceptions import AlgorithmError import numpy as np import numpy.typing as npt diff --git a/vqls_prototype/hadamard_test/hadamard_overlap_test.py b/vqls_prototype/hadamard_test/hadamard_overlap_test.py index 9eb47f0..378fae2 100644 --- a/vqls_prototype/hadamard_test/hadamard_overlap_test.py +++ b/vqls_prototype/hadamard_test/hadamard_overlap_test.py @@ -1,6 +1,6 @@ from typing import Optional, List, Union from qiskit import QuantumCircuit, QuantumRegister, transpile -from qiskit.algorithms.exceptions import AlgorithmError +from qiskit_algorithms.exceptions import AlgorithmError from qiskit.opflow import TensoredOp from qiskit.quantum_info import SparsePauliOp import numpy as np diff --git a/vqls_prototype/hadamard_test/hadamard_test.py b/vqls_prototype/hadamard_test/hadamard_test.py index 46d44f4..24eb91d 100644 --- a/vqls_prototype/hadamard_test/hadamard_test.py +++ b/vqls_prototype/hadamard_test/hadamard_test.py @@ -2,7 +2,7 @@ from typing import Optional, List, Union from qiskit import QuantumCircuit, QuantumRegister, transpile -from qiskit.algorithms.exceptions import AlgorithmError +from qiskit_algorithms.exceptions import AlgorithmError from qiskit.opflow import TensoredOp from qiskit.quantum_info import SparsePauliOp import numpy as np diff --git a/vqls_prototype/solver/base_solver.py b/vqls_prototype/solver/base_solver.py index 3b6e564..cbf11e9 100644 --- a/vqls_prototype/solver/base_solver.py +++ b/vqls_prototype/solver/base_solver.py @@ -7,9 +7,10 @@ from qiskit import QuantumCircuit from qiskit.primitives import BaseEstimator, BaseSampler -from qiskit.algorithms.variational_algorithm import VariationalAlgorithm +from qiskit_algorithms.variational_algorithm import VariationalAlgorithm +from qiskit_algorithms.utils.validation import validate_min from qiskit.circuit.library.n_local.real_amplitudes import RealAmplitudes -from qiskit.algorithms.optimizers import Minimizer, Optimizer +from qiskit_algorithms.optimizers import Minimizer, Optimizer from qiskit.opflow.gradients import GradientBase from .variational_linear_solver import ( @@ -70,6 +71,8 @@ def __init__( """ super().__init__() + validate_min("max_evals_grouped", max_evals_grouped, 1) + self._num_qubits = None self._max_evals_grouped = max_evals_grouped diff --git a/vqls_prototype/solver/hybrid_qst_vqls.py b/vqls_prototype/solver/hybrid_qst_vqls.py index 16404da..5ab7d87 100644 --- a/vqls_prototype/solver/hybrid_qst_vqls.py +++ b/vqls_prototype/solver/hybrid_qst_vqls.py @@ -8,16 +8,16 @@ See https://arxiv.org/abs/1909.05820 """ from typing import Optional, Union, List, Callable, Dict, Tuple -from qiskit.algorithms.optimizers import Minimizer, Optimizer +from qiskit_algorithms.optimizers import Minimizer, Optimizer import numpy as np from qiskit.opflow.gradients import GradientBase from qiskit.primitives import BaseEstimator, BaseSampler from qiskit import Aer from qiskit import QuantumCircuit -from qiskit.algorithms.minimum_eigen_solvers.vqe import ( - _validate_bounds, - _validate_initial_point, +from qiskit_algorithms.utils import ( + validate_bounds, + validate_initial_point, ) from qiskit.quantum_info import SparsePauliOp @@ -56,7 +56,7 @@ class Hybrid_QST_VQLS(BaseSolver): from qalcore.qiskit.vqls.vqls import VQLS, VQLSLog from qiskit.circuit.library.n_local.real_amplitudes import RealAmplitudes - from qiskit.algorithms import optimizers as opt + from qiskit_algorithms import optimizers as opt from qiskit import Aer, BasicAer import numpy as np @@ -489,8 +489,8 @@ def _solve( ) # set an expectation for this algorithm run (will be reset to None at the end) - initial_point = _validate_initial_point(self.initial_point, self.ansatz) - bounds = _validate_bounds(self.ansatz) + initial_point = validate_initial_point(self.initial_point, self.ansatz) + bounds = validate_bounds(self.ansatz) # Convert the gradient operator into a callable function that is compatible with the # optimization routine. diff --git a/vqls_prototype/solver/qst_vqls.py b/vqls_prototype/solver/qst_vqls.py index 5923d4b..675abff 100644 --- a/vqls_prototype/solver/qst_vqls.py +++ b/vqls_prototype/solver/qst_vqls.py @@ -8,7 +8,7 @@ See https://arxiv.org/abs/1909.05820 """ from typing import Optional, Union, List, Callable, Dict -from qiskit.algorithms.optimizers import Minimizer, Optimizer +from qiskit_algorithms.optimizers import Minimizer, Optimizer import numpy as np import sparse @@ -17,9 +17,9 @@ from qiskit import Aer from qiskit import QuantumCircuit from qiskit.quantum_info import SparsePauliOp -from qiskit.algorithms.minimum_eigen_solvers.vqe import ( - _validate_bounds, - _validate_initial_point, +from qiskit_algorithms.utils import ( + validate_bounds, + validate_initial_point, ) from .variational_linear_solver import ( @@ -52,7 +52,7 @@ class QST_VQLS(BaseSolver): from qalcore.qiskit.vqls.vqls import VQLS, VQLSLog from qiskit.circuit.library.n_local.real_amplitudes import RealAmplitudes - from qiskit.algorithms import optimizers as opt + from qiskit_algorithms import optimizers as opt from qiskit import Aer, BasicAer import numpy as np @@ -486,8 +486,8 @@ def _solve( ) # set an expectation for this algorithm run (will be reset to None at the end) - initial_point = _validate_initial_point(self.initial_point, self.ansatz) - bounds = _validate_bounds(self.ansatz) + initial_point = validate_initial_point(self.initial_point, self.ansatz) + bounds = validate_bounds(self.ansatz) # Convert the gradient operator into a callable function that is compatible with the # optimization routine. diff --git a/vqls_prototype/solver/vqls.py b/vqls_prototype/solver/vqls.py index 08ab05e..44d01d4 100644 --- a/vqls_prototype/solver/vqls.py +++ b/vqls_prototype/solver/vqls.py @@ -13,12 +13,9 @@ from qiskit import QuantumCircuit from qiskit.primitives import BaseEstimator, BaseSampler -from qiskit.algorithms.minimum_eigen_solvers.vqe import ( - _validate_bounds, - _validate_initial_point, -) +from qiskit_algorithms.utils import validate_bounds, validate_initial_point from qiskit.quantum_info import Statevector -from qiskit.algorithms.optimizers import Minimizer, Optimizer +from qiskit_algorithms.optimizers import Minimizer, Optimizer from qiskit.opflow.gradients import GradientBase from .variational_linear_solver import ( @@ -66,7 +63,7 @@ class VQLS(BaseSolver): from qalcore.qiskit.vqls.vqls import VQLS, VQLSLog from qiskit.circuit.library.n_local.real_amplitudes import RealAmplitudes - from qiskit.algorithms import optimizers as opt + from qiskit_algorithms import optimizers as opt from qiskit import Aer, BasicAer import numpy as np @@ -647,8 +644,8 @@ def _solve( ) # set an expectation for this algorithm run (will be reset to None at the end) - initial_point = _validate_initial_point(self.initial_point, self.ansatz) - bounds = _validate_bounds(self.ansatz) + initial_point = validate_initial_point(self.initial_point, self.ansatz) + bounds = validate_bounds(self.ansatz) # Convert the gradient operator into a callable function that is compatible with the # optimization routine. From cfd0be89b81f0ea32f543e2332931e53c8f6c7f3 Mon Sep 17 00:00:00 2001 From: Nicolas Renaud Date: Tue, 7 Nov 2023 11:24:08 +0100 Subject: [PATCH 09/22] install qiskit algo --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index d070b4e..07ccdfb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,6 +21,7 @@ dependencies = [ "qiskit>=0.14.1", "qiskit_experiments>=0.5.3", "qiskit_ibm_runtime>=0.9.3", + "qiskit_algorithms>=0.2.1", "ipykernel>=6.15.0", "matplotlib>=3.5.3", "pylatexenc>=2.10", From 86e301b5904508503f90f000dcf7c4f020dd2084 Mon Sep 17 00:00:00 2001 From: Nicolas Renaud Date: Tue, 7 Nov 2023 11:29:42 +0100 Subject: [PATCH 10/22] fix typo --- docs/how_tos/03_how_to_use_runtime.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/how_tos/03_how_to_use_runtime.ipynb b/docs/how_tos/03_how_to_use_runtime.ipynb index c72d818..2b64632 100644 --- a/docs/how_tos/03_how_to_use_runtime.ipynb +++ b/docs/how_tos/03_how_to_use_runtime.ipynb @@ -67,7 +67,7 @@ "source": [ "from qiskit_ibm_runtime import QiskitRuntimeService, Estimator, Session, Options\n", "from vqls_prototype import VQLS, VQLSLog\n", - "from qiskit._algorithms import optimizers as opt\n", + "from qiskit_algorithms import optimizers as opt\n", "\n", "# make sure your IBMQ account is saved\n", "\n", From f34f736287ab7235e194e54ea6ebc193361d33d5 Mon Sep 17 00:00:00 2001 From: Nicolas Renaud Date: Tue, 7 Nov 2023 15:53:22 +0100 Subject: [PATCH 11/22] removed latest_version --- .github/workflows/test_latest_versions.yml | 48 ---------------------- docs/beginners_guide.md | 2 +- docs/how_tos/02_how_to_use_circuits.ipynb | 4 +- 3 files changed, 3 insertions(+), 51 deletions(-) delete mode 100644 .github/workflows/test_latest_versions.yml diff --git a/.github/workflows/test_latest_versions.yml b/.github/workflows/test_latest_versions.yml deleted file mode 100644 index 6e97b4f..0000000 --- a/.github/workflows/test_latest_versions.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: Latest version tests - -on: - push: - branches: - - main - - 'stable/**' - pull_request: - branches: - - main - - 'stable/**' - schedule: - - cron: '0 1 * * *' - -jobs: - tests: - runs-on: ${{ matrix.os }} - timeout-minutes: 60 - strategy: - max-parallel: 4 - matrix: - os: [ubuntu-latest] - python-version: [3.8, 3.9, '3.10'] - include: - - os: macos-latest - python-version: 3.8 - - os: windows-latest - python-version: 3.8 - steps: - - uses: actions/checkout@v4 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 - with: - python-version: ${{ matrix.python-version }} - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install tox - - name: Modify tox.ini for more thorough check - shell: bash - run: | - sed -i.bak -E '/#.*CI:[[:space:]]*skip-next-line/I{N;d;}' tox.ini - cat tox.ini - - name: Test using tox environment - shell: bash - run: | - pver=${{ matrix.python-version }} - tox -epy${pver/./} diff --git a/docs/beginners_guide.md b/docs/beginners_guide.md index 4f0e176..edd330b 100644 --- a/docs/beginners_guide.md +++ b/docs/beginners_guide.md @@ -50,7 +50,7 @@ import numpy as np from qalcore.qiskit.vqls.vqls import VQLS, VQLSLog from qiskit.primitives import Estimator from qiskit.circuit.library.n_local.real_amplitudes import RealAmplitudes -from qiskit.algorithms import optimizers as opt +from qiskit_algorithms import optimizers as opt size = 4 # define the matrix of the problem diff --git a/docs/how_tos/02_how_to_use_circuits.ipynb b/docs/how_tos/02_how_to_use_circuits.ipynb index a79f091..1df86a7 100644 --- a/docs/how_tos/02_how_to_use_circuits.ipynb +++ b/docs/how_tos/02_how_to_use_circuits.ipynb @@ -67,7 +67,7 @@ "qc2 = QuantumCircuit(nqbit)\n", "qc2.h(0)\n", "qc2.x(1)\n", - "qc2.cnot(0, 1)\n", + "qc2.cx(0, 1)\n", "\n", "# quantum circuit for b\n", "rhs = QuantumCircuit(nqbit)\n", @@ -94,7 +94,7 @@ "source": [ "from vqls_prototype import VQLS, VQLSLog\n", "from qiskit.primitives import Estimator\n", - "from qiskit.algorithms import optimizers as opt\n", + "from qiskit_algorithms import optimizers as opt\n", "from qiskit.circuit.library.n_local.real_amplitudes import RealAmplitudes\n", "\n", "\n", From 3ddb2852dc7fc4f0b7528afe1291aa07b41ff8eb Mon Sep 17 00:00:00 2001 From: Nicolas Renaud Date: Tue, 7 Nov 2023 15:58:41 +0100 Subject: [PATCH 12/22] remove cnot --- tests/test_vqls.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_vqls.py b/tests/test_vqls.py index d6f78ec..f70878e 100644 --- a/tests/test_vqls.py +++ b/tests/test_vqls.py @@ -89,12 +89,12 @@ def test_circuit_input_statevector(self): qc1 = QuantumCircuit(num_qubits) qc1.x(0) qc1.x(1) - qc1.cnot(0, 1) + qc1.x(0, 1) qc2 = QuantumCircuit(num_qubits) qc2.h(0) qc2.x(1) - qc2.cnot(0, 1) + qc2.x(0, 1) for estimator, sampler in zip(self.estimators, self.samplers): for opt in self.options: From c322fe316b64eef691b3a8149917e43c37fed459 Mon Sep 17 00:00:00 2001 From: Nicolas Renaud Date: Tue, 7 Nov 2023 17:33:55 +0100 Subject: [PATCH 13/22] checkedout latest version test --- .github/workflows/test_latest_versions.yml | 48 ++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 .github/workflows/test_latest_versions.yml diff --git a/.github/workflows/test_latest_versions.yml b/.github/workflows/test_latest_versions.yml new file mode 100644 index 0000000..6e97b4f --- /dev/null +++ b/.github/workflows/test_latest_versions.yml @@ -0,0 +1,48 @@ +name: Latest version tests + +on: + push: + branches: + - main + - 'stable/**' + pull_request: + branches: + - main + - 'stable/**' + schedule: + - cron: '0 1 * * *' + +jobs: + tests: + runs-on: ${{ matrix.os }} + timeout-minutes: 60 + strategy: + max-parallel: 4 + matrix: + os: [ubuntu-latest] + python-version: [3.8, 3.9, '3.10'] + include: + - os: macos-latest + python-version: 3.8 + - os: windows-latest + python-version: 3.8 + steps: + - uses: actions/checkout@v4 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install tox + - name: Modify tox.ini for more thorough check + shell: bash + run: | + sed -i.bak -E '/#.*CI:[[:space:]]*skip-next-line/I{N;d;}' tox.ini + cat tox.ini + - name: Test using tox environment + shell: bash + run: | + pver=${{ matrix.python-version }} + tox -epy${pver/./} From 54838db8516e432382969632fa97a58c4b7a71be Mon Sep 17 00:00:00 2001 From: Nicolas Renaud Date: Wed, 8 Nov 2023 10:09:04 +0100 Subject: [PATCH 14/22] fix cnot typo --- tests/test_vqls.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_vqls.py b/tests/test_vqls.py index f70878e..7fd791f 100644 --- a/tests/test_vqls.py +++ b/tests/test_vqls.py @@ -89,12 +89,12 @@ def test_circuit_input_statevector(self): qc1 = QuantumCircuit(num_qubits) qc1.x(0) qc1.x(1) - qc1.x(0, 1) + qc1.cx(0, 1) qc2 = QuantumCircuit(num_qubits) qc2.h(0) qc2.x(1) - qc2.x(0, 1) + qc2.cx(0, 1) for estimator, sampler in zip(self.estimators, self.samplers): for opt in self.options: From 8daa0feae0099e129ebfff06580c4e81e82c60ce Mon Sep 17 00:00:00 2001 From: Nicolas Renaud Date: Wed, 8 Nov 2023 14:22:55 +0100 Subject: [PATCH 15/22] add cx --- docs/how_tos/02_how_to_use_circuits.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/how_tos/02_how_to_use_circuits.ipynb b/docs/how_tos/02_how_to_use_circuits.ipynb index 1df86a7..a28aaec 100644 --- a/docs/how_tos/02_how_to_use_circuits.ipynb +++ b/docs/how_tos/02_how_to_use_circuits.ipynb @@ -61,7 +61,7 @@ "qc1 = QuantumCircuit(nqbit)\n", "qc1.x(0)\n", "qc1.x(1)\n", - "qc1.cnot(0, 1)\n", + "qc1.x(0, 1)\n", "\n", "# second quantum circuit for A\n", "qc2 = QuantumCircuit(nqbit)\n", From 85a45c271cbfcd16dcf140b710bae6921190852f Mon Sep 17 00:00:00 2001 From: Nicolas Renaud Date: Wed, 8 Nov 2023 14:28:26 +0100 Subject: [PATCH 16/22] fix var result --- vqls_prototype/solver/variational_linear_solver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vqls_prototype/solver/variational_linear_solver.py b/vqls_prototype/solver/variational_linear_solver.py index c0057d3..f47aacd 100644 --- a/vqls_prototype/solver/variational_linear_solver.py +++ b/vqls_prototype/solver/variational_linear_solver.py @@ -17,7 +17,7 @@ import numpy as np from qiskit import QuantumCircuit -from qiskit.algorithms.variational_algorithm import VariationalResult +from qiskit_algorithms.variational_algorithm import VariationalResult class VariationalLinearSolverResult(VariationalResult): From 83b046f9537be0f7f76c107bb02a9be2306164c8 Mon Sep 17 00:00:00 2001 From: Nicolas Renaud Date: Wed, 8 Nov 2023 15:53:08 +0100 Subject: [PATCH 17/22] added validation with numpy and skip overlap test with basicaer --- pyproject.toml | 4 +- pytest.ini | 2 + tests/test_vqls.py | 30 +++++++---- .../hadamard_test/hadamard_overlap_test.py | 1 - vqls_prototype/solver/validation.py | 53 +++++++++++++++++++ vqls_prototype/solver/vqls.py | 6 +-- 6 files changed, 80 insertions(+), 16 deletions(-) create mode 100644 pytest.ini create mode 100644 vqls_prototype/solver/validation.py diff --git a/pyproject.toml b/pyproject.toml index 07ccdfb..74f2f06 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,7 +18,7 @@ dependencies = [ "certifi>=2021.5.30", "importlib_metadata>=4.8.1", "qiskit-aer>=0.10.3", - "qiskit>=0.14.1", + "qiskit>=0.44", "qiskit_experiments>=0.5.3", "qiskit_ibm_runtime>=0.9.3", "qiskit_algorithms>=0.2.1", @@ -70,4 +70,4 @@ py-modules = [] [tool.setuptools.packages.find] include = ['vqls_prototype*'] -exclude = ['vqls_prototype*tests'] +exclude = ['vqls_prototype*tests'] \ No newline at end of file diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000..4d6e978 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,2 @@ +[pytest] +filterwarnings = ignore::DeprecationWarning diff --git a/tests/test_vqls.py b/tests/test_vqls.py index 7fd791f..149ae58 100644 --- a/tests/test_vqls.py +++ b/tests/test_vqls.py @@ -21,9 +21,13 @@ from qiskit import BasicAer, QuantumCircuit from qiskit.circuit.library import RealAmplitudes -from qiskit_algorithms.optimizers import COBYLA +from qiskit_algorithms.optimizers import ADAM from qiskit.primitives import Estimator, Sampler, BackendEstimator, BackendSampler -from vqls_prototype import VQLS, VQLSLog +from vqls_prototype import VQLS + +# 8-11-2023 +# Overlap Hadamard test do not work with BasicAer primitives anymore +# this test case is skipped for now class TestVQLS(QiskitTestCase): @@ -48,8 +52,6 @@ def setUp(self): BackendSampler(BasicAer.get_backend("qasm_simulator")), ) - self.log = VQLSLog([], []) - def test_numpy_input(self): """Test the VQLS on matrix input using statevector simulator.""" @@ -65,12 +67,16 @@ def test_numpy_input(self): rhs = np.array([0.1] * 4) ansatz = RealAmplitudes(num_qubits=2, reps=3, entanglement="full") - for estimator, sampler in zip(self.estimators, self.samplers): - for opt in self.options: + for iprim, (estimator, sampler) in enumerate( + zip(self.estimators, self.samplers) + ): + for iopt, opt in enumerate(self.options): + if iprim == 1 and iopt == 2: + continue vqls = VQLS( estimator, ansatz, - COBYLA(maxiter=2, disp=True), + ADAM(maxiter=2), options=opt, sampler=sampler, ) @@ -96,12 +102,16 @@ def test_circuit_input_statevector(self): qc2.x(1) qc2.cx(0, 1) - for estimator, sampler in zip(self.estimators, self.samplers): - for opt in self.options: + for iprim, (estimator, sampler) in enumerate( + zip(self.estimators, self.samplers) + ): + for iopt, opt in enumerate(self.options): + if iprim == 1 and iopt == 2: + continue vqls = VQLS( estimator, ansatz, - COBYLA(maxiter=2, disp=True), + ADAM(maxiter=2), sampler=sampler, options=opt, ) diff --git a/vqls_prototype/hadamard_test/hadamard_overlap_test.py b/vqls_prototype/hadamard_test/hadamard_overlap_test.py index 378fae2..0d8822c 100644 --- a/vqls_prototype/hadamard_test/hadamard_overlap_test.py +++ b/vqls_prototype/hadamard_test/hadamard_overlap_test.py @@ -17,7 +17,6 @@ def __init__(self, hdmr_list: List): hdrm_list (List): A list of DirectHadamardTest instances """ self.hdmr_list = hdmr_list - # self.circuits = [hdmr.circuits for hdmr in hdmr_list] self.circuits = [c for hdmr in hdmr_list for c in hdmr.circuits] self.post_processing = hdmr_list[0].post_processing self.shots = hdmr_list[0].shots diff --git a/vqls_prototype/solver/validation.py b/vqls_prototype/solver/validation.py new file mode 100644 index 0000000..4943ab0 --- /dev/null +++ b/vqls_prototype/solver/validation.py @@ -0,0 +1,53 @@ +from __future__ import annotations + +from collections.abc import Sequence +import numpy as np +from qiskit.circuit import QuantumCircuit + + + +def validate_initial_point( + point: Sequence[float] | None, circuit: QuantumCircuit +) -> Sequence[float]: + r""" + Validate a choice of initial point against a choice of circuit. If no point is provided, a + random point will be generated within certain parameter bounds. It will first look to the + circuit for these bounds. If the circuit does not specify bounds, bounds of :math:`-2\pi`, + :math:`2\pi` will be used. + + Args: + point: An initial point. + circuit: A parameterized quantum circuit. + + Returns: + A validated initial point. + + Raises: + ValueError: If the dimension of the initial point does not match the number of circuit + parameters. + """ + expected_size = circuit.num_parameters + + if point is None: + # get bounds if circuit has them set, otherwise use [-2pi, 2pi] for each parameter + bounds = getattr(circuit, "parameter_bounds", None) + if bounds is None: + bounds = [(-2 * np.pi, 2 * np.pi)] * expected_size + + # replace all Nones by [-2pi, 2pi] + lower_bounds = [] + upper_bounds = [] + for lower, upper in bounds: + lower_bounds.append(lower if lower is not None else -2 * np.pi) + upper_bounds.append(upper if upper is not None else 2 * np.pi) + + # sample from within bounds + point = np.random.uniform(low=lower_bounds, high=upper_bounds) + + elif len(point) != expected_size: + raise ValueError( + f"The dimension of the initial point ({len(point)}) does not match the " + f"number of parameters in the circuit ({expected_size})." + ) + + return point diff --git a/vqls_prototype/solver/vqls.py b/vqls_prototype/solver/vqls.py index 44d01d4..dc94332 100644 --- a/vqls_prototype/solver/vqls.py +++ b/vqls_prototype/solver/vqls.py @@ -13,7 +13,7 @@ from qiskit import QuantumCircuit from qiskit.primitives import BaseEstimator, BaseSampler -from qiskit_algorithms.utils import validate_bounds, validate_initial_point +from qiskit_algorithms.utils import validate_bounds from qiskit.quantum_info import Statevector from qiskit_algorithms.optimizers import Minimizer, Optimizer from qiskit.opflow.gradients import GradientBase @@ -45,7 +45,7 @@ DirectHadamardTest, BatchDirectHadammardTest, ) - +from .validation import validate_initial_point from .base_solver import BaseSolver @@ -643,7 +643,7 @@ def _solve( np.array([mat_i.coeff for mat_i in self.matrix_circuits]) ) - # set an expectation for this algorithm run (will be reset to None at the end) + # set an expectation for this algorithm run (will be reset to None at the end initial_point = validate_initial_point(self.initial_point, self.ansatz) bounds = validate_bounds(self.ansatz) From 7760e3f5af671a9771c9ce6a59dd31e3308d7c48 Mon Sep 17 00:00:00 2001 From: Nicolas Renaud Date: Wed, 8 Nov 2023 16:02:10 +0100 Subject: [PATCH 18/22] black --- vqls_prototype/solver/validation.py | 1 - 1 file changed, 1 deletion(-) diff --git a/vqls_prototype/solver/validation.py b/vqls_prototype/solver/validation.py index 4943ab0..ece6f39 100644 --- a/vqls_prototype/solver/validation.py +++ b/vqls_prototype/solver/validation.py @@ -5,7 +5,6 @@ from qiskit.circuit import QuantumCircuit - def validate_initial_point( point: Sequence[float] | None, circuit: QuantumCircuit ) -> Sequence[float]: From 3651ad243614d63cc281a72d74be2c30196ffd22 Mon Sep 17 00:00:00 2001 From: Nicolas Renaud Date: Wed, 8 Nov 2023 16:04:38 +0100 Subject: [PATCH 19/22] add validation to qst --- vqls_prototype/solver/hybrid_qst_vqls.py | 6 ++---- vqls_prototype/solver/qst_vqls.py | 7 +++---- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/vqls_prototype/solver/hybrid_qst_vqls.py b/vqls_prototype/solver/hybrid_qst_vqls.py index 5ab7d87..4cb01db 100644 --- a/vqls_prototype/solver/hybrid_qst_vqls.py +++ b/vqls_prototype/solver/hybrid_qst_vqls.py @@ -15,10 +15,7 @@ from qiskit import Aer from qiskit import QuantumCircuit -from qiskit_algorithms.utils import ( - validate_bounds, - validate_initial_point, -) +from qiskit_algorithms.utils import validate_bounds from qiskit.quantum_info import SparsePauliOp from .variational_linear_solver import ( @@ -39,6 +36,7 @@ from ..tomography.htree_qst import HTreeQST from ..tomography.shadow_qst import ShadowQST +from .validation import validate_initial_point from .base_solver import BaseSolver diff --git a/vqls_prototype/solver/qst_vqls.py b/vqls_prototype/solver/qst_vqls.py index 675abff..3e09844 100644 --- a/vqls_prototype/solver/qst_vqls.py +++ b/vqls_prototype/solver/qst_vqls.py @@ -17,10 +17,8 @@ from qiskit import Aer from qiskit import QuantumCircuit from qiskit.quantum_info import SparsePauliOp -from qiskit_algorithms.utils import ( - validate_bounds, - validate_initial_point, -) +from qiskit_algorithms.utils import validate_bounds + from .variational_linear_solver import ( VariationalLinearSolverResult, @@ -35,6 +33,7 @@ from ..tomography.htree_qst import HTreeQST from ..tomography.shadow_qst import ShadowQST +from .validation import validate_initial_point from .base_solver import BaseSolver From bfe1735ef1474ec3c78727d6961764a97a1833da Mon Sep 17 00:00:00 2001 From: Nicolas Renaud Date: Wed, 8 Nov 2023 16:19:53 +0100 Subject: [PATCH 20/22] mypy --- vqls_prototype/solver/validation.py | 7 ++++--- vqls_prototype/solver/vqls.py | 1 - 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/vqls_prototype/solver/validation.py b/vqls_prototype/solver/validation.py index ece6f39..0a23049 100644 --- a/vqls_prototype/solver/validation.py +++ b/vqls_prototype/solver/validation.py @@ -1,13 +1,14 @@ from __future__ import annotations from collections.abc import Sequence +from typing import Union, Any import numpy as np from qiskit.circuit import QuantumCircuit def validate_initial_point( - point: Sequence[float] | None, circuit: QuantumCircuit -) -> Sequence[float]: + point: Union[Sequence[float], np.ndarray] | None, circuit: QuantumCircuit +) -> Union[Sequence[float], Any, np.ndarray[Any, Any]]: r""" Validate a choice of initial point against a choice of circuit. If no point is provided, a random point will be generated within certain parameter bounds. It will first look to the @@ -41,7 +42,7 @@ def validate_initial_point( upper_bounds.append(upper if upper is not None else 2 * np.pi) # sample from within bounds - point = np.random.uniform(low=lower_bounds, high=upper_bounds) + point = np.random.uniform(low=lower_bounds, high=upper_bounds).tolist() elif len(point) != expected_size: raise ValueError( diff --git a/vqls_prototype/solver/vqls.py b/vqls_prototype/solver/vqls.py index dc94332..ff395b9 100644 --- a/vqls_prototype/solver/vqls.py +++ b/vqls_prototype/solver/vqls.py @@ -7,7 +7,6 @@ See https://arxiv.org/abs/1909.05820 """ - from typing import Optional, Union, List, Callable, Dict, Tuple import numpy as np From b2fbd9d14458b7ac20aeb585a2e4fd14b296a750 Mon Sep 17 00:00:00 2001 From: Nicolas Renaud Date: Wed, 8 Nov 2023 16:31:18 +0100 Subject: [PATCH 21/22] remove bind parameters --- vqls_prototype/tomography/qst.py | 2 +- vqls_prototype/tomography/simulator_qst.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/vqls_prototype/tomography/qst.py b/vqls_prototype/tomography/qst.py index 85b3b67..eeaa8bf 100644 --- a/vqls_prototype/tomography/qst.py +++ b/vqls_prototype/tomography/qst.py @@ -50,7 +50,7 @@ def get_density_matrix(self, parameters): Returns: _type_: _description_ """ - qstexp1 = StateTomography(self.circuit.bind_parameters(parameters)) + qstexp1 = StateTomography(self.circuit.assign_parameters(parameters)) qstdata1 = qstexp1.run(self.backend, shots=self.shots).block_for_results() return qstdata1.analysis_results("state").value.data.real diff --git a/vqls_prototype/tomography/simulator_qst.py b/vqls_prototype/tomography/simulator_qst.py index 89cc6b0..548ab2a 100644 --- a/vqls_prototype/tomography/simulator_qst.py +++ b/vqls_prototype/tomography/simulator_qst.py @@ -15,7 +15,9 @@ def get_relative_amplitude_sign(self, parameters): parameters (_type_): _description_ backend (_type_): _description_ """ - state_vector = (Statevector(self.circuit.bind_parameters(parameters))).data.real + state_vector = ( + Statevector(self.circuit.assign_parameters(parameters)) + ).data.real return np.sign(state_vector) def get_statevector(self, parameters, **kwargs): # pylint: disable=unused-argument @@ -26,4 +28,4 @@ def get_statevector(self, parameters, **kwargs): # pylint: disable=unused-argum parameters (_type_): _description_ backend (_type_): _description_ """ - return (Statevector(self.circuit.bind_parameters(parameters))).data.real + return (Statevector(self.circuit.assign_parameters(parameters))).data.real From 7e90c6503ab9b7ab919b8ce7cd8674b67578c81a Mon Sep 17 00:00:00 2001 From: Nicolas Renaud Date: Wed, 8 Nov 2023 16:35:48 +0100 Subject: [PATCH 22/22] xtocx --- docs/how_tos/02_how_to_use_circuits.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/how_tos/02_how_to_use_circuits.ipynb b/docs/how_tos/02_how_to_use_circuits.ipynb index a28aaec..ebdb9df 100644 --- a/docs/how_tos/02_how_to_use_circuits.ipynb +++ b/docs/how_tos/02_how_to_use_circuits.ipynb @@ -61,7 +61,7 @@ "qc1 = QuantumCircuit(nqbit)\n", "qc1.x(0)\n", "qc1.x(1)\n", - "qc1.x(0, 1)\n", + "qc1.cx(0, 1)\n", "\n", "# second quantum circuit for A\n", "qc2 = QuantumCircuit(nqbit)\n",