From 3eb20cee19360838d04eaeed433d174335de698d Mon Sep 17 00:00:00 2001 From: Alexander Kunitsa <28026247+aakunitsa@users.noreply.github.com> Date: Tue, 13 Jul 2021 16:56:52 -0400 Subject: [PATCH 01/14] minor change of the optimizer class to enable NFT --- src/python/qeqiskit/optimizer/optimizer.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/python/qeqiskit/optimizer/optimizer.py b/src/python/qeqiskit/optimizer/optimizer.py index 8461087..391c64c 100644 --- a/src/python/qeqiskit/optimizer/optimizer.py +++ b/src/python/qeqiskit/optimizer/optimizer.py @@ -8,7 +8,7 @@ from zquantum.core.interfaces.functions import CallableWithGradient from zquantum.core.typing import RecorderFactory from typing import Optional, Dict -from qiskit.algorithms.optimizers import SPSA, ADAM +from qiskit.algorithms.optimizers import SPSA, ADAM, NFT class QiskitOptimizer(Optimizer): @@ -38,6 +38,9 @@ def __init__( if self.method == "AMSGRAD": self.optimizer_kwargs["amsgrad"] = True self.optimizer = ADAM(**self.optimizer_kwargs) + elif self.method == "NFT": + self.optimizer = NFT(**self.optimizer_kwargs) + def _minimize( self, From fc8fdad95221a1278b60e0be61ee3c7fa770c18f Mon Sep 17 00:00:00 2001 From: Alexander Kunitsa <28026247+aakunitsa@users.noreply.github.com> Date: Wed, 14 Jul 2021 15:20:38 -0400 Subject: [PATCH 02/14] modified the nit is extracted for NFT --- src/python/qeqiskit/optimizer/optimizer.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/python/qeqiskit/optimizer/optimizer.py b/src/python/qeqiskit/optimizer/optimizer.py index 391c64c..8e7b718 100644 --- a/src/python/qeqiskit/optimizer/optimizer.py +++ b/src/python/qeqiskit/optimizer/optimizer.py @@ -77,6 +77,8 @@ def _minimize( if self.method == "ADAM" or self.method == "AMSGRAD": nit = self.optimizer._t + elif self.method == "NFT": + nit = self.optimizer._options['maxiter'] else: nit = self.optimizer.maxiter From 4e63523bfc38b5f9d86927c461732ecffc3d909f Mon Sep 17 00:00:00 2001 From: Alexander Kunitsa <28026247+aakunitsa@users.noreply.github.com> Date: Mon, 2 Aug 2021 18:32:55 -0400 Subject: [PATCH 03/14] added an assert --- src/python/qeqiskit/backend/backend.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/python/qeqiskit/backend/backend.py b/src/python/qeqiskit/backend/backend.py index 5823fff..244d023 100644 --- a/src/python/qeqiskit/backend/backend.py +++ b/src/python/qeqiskit/backend/backend.py @@ -257,6 +257,7 @@ def run_circuitset_and_measure( A list of Measurements objects containing the observed bitstrings. """ + assert isinstance(n_samples, list) and isinstance(n_samples[0], int) ( experiments, n_samples_for_experiments, @@ -343,4 +344,4 @@ def _apply_readout_correction(self, counts, qubit_list=None): self.readout_correction_filter = meas_fitter.filter mitigated_counts = self.readout_correction_filter.apply(counts) - return mitigated_counts \ No newline at end of file + return mitigated_counts From 8af41df8feb2008dda94883d96f57164a6a5dc2a Mon Sep 17 00:00:00 2001 From: Alexander Kunitsa <28026247+aakunitsa@users.noreply.github.com> Date: Mon, 2 Aug 2021 18:45:14 -0400 Subject: [PATCH 04/14] broke the assert into two pieces --- src/python/qeqiskit/backend/backend.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/python/qeqiskit/backend/backend.py b/src/python/qeqiskit/backend/backend.py index 244d023..4093951 100644 --- a/src/python/qeqiskit/backend/backend.py +++ b/src/python/qeqiskit/backend/backend.py @@ -257,7 +257,8 @@ def run_circuitset_and_measure( A list of Measurements objects containing the observed bitstrings. """ - assert isinstance(n_samples, list) and isinstance(n_samples[0], int) + assert isinstance(n_samples, list) + assert isinstance(n_samples[0], int) ( experiments, n_samples_for_experiments, From 024526bdf2e60d06cc3e47b77ed93105403ca5c7 Mon Sep 17 00:00:00 2001 From: Alexander Kunitsa <28026247+aakunitsa@users.noreply.github.com> Date: Thu, 4 Nov 2021 16:09:35 -0400 Subject: [PATCH 05/14] fixed the inconsistent parameter name in run_circuitset_and_measure --- src/python/qeqiskit/backend/backend.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/python/qeqiskit/backend/backend.py b/src/python/qeqiskit/backend/backend.py index 8db85cb..80cce78 100644 --- a/src/python/qeqiskit/backend/backend.py +++ b/src/python/qeqiskit/backend/backend.py @@ -237,7 +237,7 @@ def aggregregate_measurements( def run_circuitset_and_measure( self, - circuitset: List[Circuit], + circuits: List[Circuit], n_samples: List[int], ) -> List[Measurements]: """Run a set of circuits and measure a certain number of bitstrings. @@ -256,7 +256,7 @@ def run_circuitset_and_measure( experiments, n_samples_for_experiments, multiplicities, - ) = self.transform_circuitset_to_ibmq_experiments(circuitset, n_samples) + ) = self.transform_circuitset_to_ibmq_experiments(circuits, n_samples) batches, n_samples_for_batches = self.batch_experiments( experiments, n_samples_for_experiments ) From 25bc880281294b6433124b5b27de8c93e7aeca2b Mon Sep 17 00:00:00 2001 From: Alexander Kunitsa <28026247+aakunitsa@users.noreply.github.com> Date: Thu, 4 Nov 2021 16:29:47 -0400 Subject: [PATCH 06/14] replaced circuitset with circuits inside run_circuitset_and_measure --- src/python/qeqiskit/backend/backend.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/qeqiskit/backend/backend.py b/src/python/qeqiskit/backend/backend.py index 80cce78..0586749 100644 --- a/src/python/qeqiskit/backend/backend.py +++ b/src/python/qeqiskit/backend/backend.py @@ -266,7 +266,7 @@ def run_circuitset_and_measure( for n_samples, batch in zip(n_samples_for_batches, batches) ] - self.number_of_circuits_run += len(circuitset) + self.number_of_circuits_run += len(circuits) self.number_of_jobs_run += len(batches) return self.aggregregate_measurements(jobs, batches, multiplicities) From 5a59bc627b7056fff5df7afb9e2c4f572138fff0 Mon Sep 17 00:00:00 2001 From: Max Radin Date: Thu, 11 Nov 2021 18:02:31 -0500 Subject: [PATCH 07/14] Adding special test for NFT optimizer --- tests/qeqiskit/optimizer/optimizer_test.py | 67 +++++++++++++++++++++- 1 file changed, 65 insertions(+), 2 deletions(-) diff --git a/tests/qeqiskit/optimizer/optimizer_test.py b/tests/qeqiskit/optimizer/optimizer_test.py index 690336c..913fc87 100644 --- a/tests/qeqiskit/optimizer/optimizer_test.py +++ b/tests/qeqiskit/optimizer/optimizer_test.py @@ -1,8 +1,13 @@ import numpy as np import pytest from qeqiskit.optimizer import QiskitOptimizer -from zquantum.core.history.recorder import recorder -from zquantum.core.interfaces.optimizer_test import OptimizerTests +from zquantum.core.interfaces.optimizer_test import ( + OptimizerTests, + MANDATORY_OPTIMIZATION_RESULT_FIELDS, +) + +from zquantum.core.interfaces.functions import FunctionWithGradient +from zquantum.core.gradients import finite_differences_gradient @pytest.fixture( @@ -26,6 +31,18 @@ def optimizer(request): return QiskitOptimizer(**request.param) +@pytest.fixture( + params=[ + { + "method": "NFT", + "optimizer_kwargs": {"maxiter": 2e5}, + }, + ] +) +def sinusoidal_optimizer(request): + return QiskitOptimizer(**request.param) + + @pytest.fixture(params=[True, False]) def keep_history(request): return request.param @@ -46,3 +63,49 @@ def test_optimizer_succeeds_on_cost_function_without_gradient( assert "opt_value" in results assert "opt_params" in results assert "history" in results + + +class TestQiskitSinusoidalOptimizerTests(OptimizerTests): + """Some optimizers assume that the cost function can be expressed as a sum of + products of sines and cosines (Eq. 12 of arXiv:1903.12166), a functional form which + reflects the cost function of many variational quantum algorithms. Such optimizers + may fail to find the minimum of cost functions that are not of this form. + + This class removes the tests from the base class that check whether the optimizer + finds the minimum of such non-sinusoidal cost functions, and replaces them with a + test on a sinuisoidal cost function.""" + + @pytest.fixture + def sum_cos_x(self): + """Create a sinuisoidal function whose minimum is at the origin with a value of + zero.""" + return lambda x: -np.sum(np.cos(x)) + x.shape[0] + + def test_optimizer_succeeds_with_optimizing_rosenbrock_function(self): + pass + + def test_optimizer_succeeds_with_optimizing_sum_of_squares_function(self): + pass + + def test_optimizer_succeeds_on_cost_function_without_gradient(self): + pass + + def test_optimizer_succeeds_on_sum_of_cosines_function( + self, sinusoidal_optimizer, sum_cos_x, keep_history + ): + + cost_function = FunctionWithGradient( + sum_cos_x, finite_differences_gradient(sum_cos_x) + ) + + results = sinusoidal_optimizer.minimize( + cost_function, initial_params=np.array([1, -1]), keep_history=keep_history + ) + + assert results.opt_value == pytest.approx(0, abs=1e-5) + assert results.opt_params == pytest.approx(np.zeros(2), abs=1e-4) + + assert all(field in results for field in MANDATORY_OPTIMIZATION_RESULT_FIELDS) + + assert "history" in results or not keep_history + assert "gradient_history" in results or not keep_history From b4995c1efbbde1566ad0db1f65d7bac20c1b9699 Mon Sep 17 00:00:00 2001 From: Max Radin Date: Thu, 11 Nov 2021 18:31:36 -0500 Subject: [PATCH 08/14] Removed trailing whitespace --- src/python/qeqiskit/backend/backend.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/python/qeqiskit/backend/backend.py b/src/python/qeqiskit/backend/backend.py index c56fb3e..f7f5e75 100644 --- a/src/python/qeqiskit/backend/backend.py +++ b/src/python/qeqiskit/backend/backend.py @@ -252,8 +252,8 @@ def run_circuitset_and_measure( A list of Measurements objects containing the observed bitstrings. """ - assert isinstance(n_samples, list) - assert isinstance(n_samples[0], int) + assert isinstance(n_samples, list) + assert isinstance(n_samples[0], int) ( experiments, n_samples_for_experiments, From d93e2dd0ea527b92381b60773ff396bab3acfc21 Mon Sep 17 00:00:00 2001 From: Max Radin Date: Thu, 11 Nov 2021 18:35:56 -0500 Subject: [PATCH 09/14] Applying isort --- src/python/qeqiskit/optimizer/optimizer.py | 2 +- tests/qeqiskit/optimizer/optimizer_test.py | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/python/qeqiskit/optimizer/optimizer.py b/src/python/qeqiskit/optimizer/optimizer.py index 08fe63d..de1a604 100644 --- a/src/python/qeqiskit/optimizer/optimizer.py +++ b/src/python/qeqiskit/optimizer/optimizer.py @@ -1,7 +1,7 @@ from typing import Dict, Optional import numpy as np -from qiskit.algorithms.optimizers import ADAM, SPSA, NFT +from qiskit.algorithms.optimizers import ADAM, NFT, SPSA from scipy.optimize import OptimizeResult from zquantum.core.history.recorder import recorder as _recorder from zquantum.core.interfaces.functions import CallableWithGradient diff --git a/tests/qeqiskit/optimizer/optimizer_test.py b/tests/qeqiskit/optimizer/optimizer_test.py index 913fc87..8394c0a 100644 --- a/tests/qeqiskit/optimizer/optimizer_test.py +++ b/tests/qeqiskit/optimizer/optimizer_test.py @@ -1,14 +1,13 @@ import numpy as np import pytest from qeqiskit.optimizer import QiskitOptimizer +from zquantum.core.gradients import finite_differences_gradient +from zquantum.core.interfaces.functions import FunctionWithGradient from zquantum.core.interfaces.optimizer_test import ( - OptimizerTests, MANDATORY_OPTIMIZATION_RESULT_FIELDS, + OptimizerTests, ) -from zquantum.core.interfaces.functions import FunctionWithGradient -from zquantum.core.gradients import finite_differences_gradient - @pytest.fixture( params=[ From 4db10fa8bca5c63c975e7682fe7364c70dba01f2 Mon Sep 17 00:00:00 2001 From: Max Radin Date: Fri, 12 Nov 2021 12:50:45 -0500 Subject: [PATCH 10/14] Adding pytest.skip to NFT tests --- tests/qeqiskit/optimizer/optimizer_test.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/qeqiskit/optimizer/optimizer_test.py b/tests/qeqiskit/optimizer/optimizer_test.py index 8394c0a..e20a074 100644 --- a/tests/qeqiskit/optimizer/optimizer_test.py +++ b/tests/qeqiskit/optimizer/optimizer_test.py @@ -80,12 +80,15 @@ def sum_cos_x(self): zero.""" return lambda x: -np.sum(np.cos(x)) + x.shape[0] + @pytest.mark.skip(reason="Optimizer only supports sinusoidal cost functions") def test_optimizer_succeeds_with_optimizing_rosenbrock_function(self): pass + @pytest.mark.skip(reason="Optimizer only supports sinusoidal cost functions") def test_optimizer_succeeds_with_optimizing_sum_of_squares_function(self): pass + @pytest.mark.skip(reason="Optimizer only supports sinusoidal cost functions") def test_optimizer_succeeds_on_cost_function_without_gradient(self): pass From 9102a8b6071208eddd93ee49cc5eec54f39fa2e4 Mon Sep 17 00:00:00 2001 From: AthenaCaesura Date: Tue, 16 Nov 2021 11:10:02 -0500 Subject: [PATCH 11/14] Updated qasm to aer and statevector to aer_simulator_statevector in tests --- src/python/qeqiskit/simulator/simulator.py | 5 +++- tests/qeqiskit/simulator/simulator_test.py | 32 +++++++++++----------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/python/qeqiskit/simulator/simulator.py b/src/python/qeqiskit/simulator/simulator.py index c37cdcd..66a9a4a 100644 --- a/src/python/qeqiskit/simulator/simulator.py +++ b/src/python/qeqiskit/simulator/simulator.py @@ -108,7 +108,7 @@ def run_circuit_and_measure(self, circuit: Circuit, n_samples: int) -> Measureme if self.device_connectivity is not None: coupling_map = CouplingMap(self.device_connectivity.connectivity) - if self.device_name == "statevector_simulator": + if self.device_name == "aer_simulator_statevector": wavefunction = self.get_wavefunction(circuit) return Measurements(sample_from_wavefunction(wavefunction, n_samples)) else: @@ -158,6 +158,9 @@ def _get_wavefunction_from_native_circuit( if self.device_connectivity is not None: coupling_map = CouplingMap(self.device_connectivity.connectivity) + if self.device_name == "aer_simulator_statevector": + ibmq_circuit.save_state() + # Execute job to get wavefunction job = execute( ibmq_circuit, diff --git a/tests/qeqiskit/simulator/simulator_test.py b/tests/qeqiskit/simulator/simulator_test.py index 4129c5f..f0453b9 100644 --- a/tests/qeqiskit/simulator/simulator_test.py +++ b/tests/qeqiskit/simulator/simulator_test.py @@ -18,7 +18,7 @@ @pytest.fixture( params=[ { - "device_name": "qasm_simulator", + "device_name": "aer_simulator", "api_token": os.getenv("ZAPATA_IBMQ_API_TOKEN"), }, ] @@ -30,7 +30,7 @@ def backend(request): @pytest.fixture( params=[ { - "device_name": "statevector_simulator", + "device_name": "aer_simulator_statevector", }, ] ) @@ -41,10 +41,10 @@ def wf_simulator(request): @pytest.fixture( params=[ { - "device_name": "qasm_simulator", + "device_name": "aer_simulator", }, { - "device_name": "statevector_simulator", + "device_name": "aer_simulator_statevector", }, ] ) @@ -54,7 +54,7 @@ def sampling_simulator(request): @pytest.fixture( params=[ - {"device_name": "qasm_simulator", "optimization_level": 0}, + {"device_name": "aer_simulator", "optimization_level": 0}, ] ) def noisy_simulator(request): @@ -96,16 +96,16 @@ def test_run_circuitset_and_measure(self, sampling_simulator): assert all(bitstring == (1, 0, 0) for bitstring in measurements.bitstrings) def test_setup_basic_simulators(self): - simulator = QiskitSimulator("qasm_simulator") + simulator = QiskitSimulator("aer_simulator") assert isinstance(simulator, QiskitSimulator) - assert simulator.device_name == "qasm_simulator" + assert simulator.device_name == "aer_simulator" assert simulator.noise_model is None assert simulator.device_connectivity is None assert simulator.basis_gates is None - simulator = QiskitSimulator("statevector_simulator") + simulator = QiskitSimulator("aer_simulator_statevector") assert isinstance(simulator, QiskitSimulator) - assert simulator.device_name == "statevector_simulator" + assert simulator.device_name == "aer_simulator_statevector" assert simulator.noise_model is None assert simulator.device_connectivity is None assert simulator.basis_gates is None @@ -139,7 +139,7 @@ def test_expectation_value_with_noisy_simulator(self, noisy_simulator): assert expectation_values_10_gates.values[0] > -1 assert expectation_values_10_gates.values[0] < 0.0 assert isinstance(noisy_simulator, QiskitSimulator) - assert noisy_simulator.device_name == "qasm_simulator" + assert noisy_simulator.device_name == "aer_simulator" assert isinstance(noisy_simulator.noise_model, AerNoise.NoiseModel) assert noisy_simulator.device_connectivity is not None assert noisy_simulator.basis_gates is not None @@ -167,7 +167,7 @@ def test_expectation_value_with_noisy_simulator(self, noisy_simulator): > expectation_values_10_gates.values[0] ) assert isinstance(noisy_simulator, QiskitSimulator) - assert noisy_simulator.device_name == "qasm_simulator" + assert noisy_simulator.device_name == "aer_simulator" assert isinstance(noisy_simulator.noise_model, AerNoise.NoiseModel) assert noisy_simulator.device_connectivity is not None assert noisy_simulator.basis_gates is not None @@ -179,7 +179,7 @@ def test_optimization_level_of_transpiler(self): ) n_samples = 8192 simulator = QiskitSimulator( - "qasm_simulator", + "aer_simulator", noise_model=noise_model, device_connectivity=connectivity, optimization_level=0, @@ -213,8 +213,8 @@ def test_run_circuit_and_measure_seed(self): # Given circuit = Circuit([X(0), CNOT(1, 2)]) n_samples = 100 - simulator1 = QiskitSimulator("qasm_simulator", seed=643) - simulator2 = QiskitSimulator("qasm_simulator", seed=643) + simulator1 = QiskitSimulator("aer_simulator", seed=643) + simulator2 = QiskitSimulator("aer_simulator", seed=643) # When measurements1 = simulator1.run_circuit_and_measure(circuit, n_samples) @@ -227,8 +227,8 @@ def test_run_circuit_and_measure_seed(self): def test_get_wavefunction_seed(self): # Given circuit = Circuit([X(0), CNOT(1, 2)]) - simulator1 = QiskitSimulator("statevector_simulator", seed=643) - simulator2 = QiskitSimulator("statevector_simulator", seed=643) + simulator1 = QiskitSimulator("aer_simulator_statevector", seed=643) + simulator2 = QiskitSimulator("aer_simulator_statevector", seed=643) # When wavefunction1 = simulator1.get_wavefunction(circuit) From 972db37b677f64665656fc97667d76f1752386ea Mon Sep 17 00:00:00 2001 From: AthenaCaesura Date: Tue, 16 Nov 2021 11:21:18 -0500 Subject: [PATCH 12/14] Created docstrings to differentiate qasm_sumulator from IBMQ_qasm_simulator --- tests/qeqiskit/backend/backend_test.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/qeqiskit/backend/backend_test.py b/tests/qeqiskit/backend/backend_test.py index 7357257..2324214 100644 --- a/tests/qeqiskit/backend/backend_test.py +++ b/tests/qeqiskit/backend/backend_test.py @@ -9,6 +9,12 @@ from zquantum.core.circuits import CNOT, Circuit, X from zquantum.core.interfaces.backend_test import QuantumBackendTests +# NOTE: qiskit currently offers 2 types of qasm simulators: +# 1. qasm_simulator - a local simulator that is depreciated. +# 2. IBMQ_qasm_simulator - a remote simulator. +# All tests of qasm_simulator have been removed since it's depreciation +# but IBMQ_qasm_simulator is still tested by this module. + @pytest.fixture( params=[ From 68b8f57116c1b2aae0db172d6d6cc208ecce13ea Mon Sep 17 00:00:00 2001 From: AthenaCaesura Date: Tue, 16 Nov 2021 15:53:49 -0500 Subject: [PATCH 13/14] Updated backend_test for higher number of max_shots --- tests/qeqiskit/backend/backend_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/qeqiskit/backend/backend_test.py b/tests/qeqiskit/backend/backend_test.py index 2324214..87ef0e2 100644 --- a/tests/qeqiskit/backend/backend_test.py +++ b/tests/qeqiskit/backend/backend_test.py @@ -212,7 +212,7 @@ def test_run_circuitset_and_measure_split_circuits_and_jobs(self, backend): # Given num_circuits = 200 circuit = self.x_cnot_circuit() - n_samples = 8193 + n_samples = 20001 # Verify that we are actually going to need to split circuits assert n_samples > backend.max_shots From 687548dbee220d4384e5ae6b8b0bc5e4fd784e87 Mon Sep 17 00:00:00 2001 From: AthenaCaesura Date: Tue, 16 Nov 2021 17:49:54 -0500 Subject: [PATCH 14/14] Moved Docstring from backend_test to backend --- src/python/qeqiskit/backend/backend.py | 6 ++++++ tests/qeqiskit/backend/backend_test.py | 6 ------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/python/qeqiskit/backend/backend.py b/src/python/qeqiskit/backend/backend.py index 8db85cb..c74ce41 100644 --- a/src/python/qeqiskit/backend/backend.py +++ b/src/python/qeqiskit/backend/backend.py @@ -32,6 +32,12 @@ def __init__( """Get a qiskit QPU that adheres to the zquantum.core.interfaces.backend.QuantumBackend + qiskit currently offers 2 types of qasm simulators: + 1. qasm_simulator - a local simulator that is depreciated. + 2. IBMQ_qasm_simulator - a remote simulator. + All implementation of qasm_simulator have been removed since it's depreciation + but IBMQ_qasm_simulator is still tested by this module. + Args: device_name: the name of the device hub: IBMQ hub diff --git a/tests/qeqiskit/backend/backend_test.py b/tests/qeqiskit/backend/backend_test.py index 87ef0e2..589b778 100644 --- a/tests/qeqiskit/backend/backend_test.py +++ b/tests/qeqiskit/backend/backend_test.py @@ -9,12 +9,6 @@ from zquantum.core.circuits import CNOT, Circuit, X from zquantum.core.interfaces.backend_test import QuantumBackendTests -# NOTE: qiskit currently offers 2 types of qasm simulators: -# 1. qasm_simulator - a local simulator that is depreciated. -# 2. IBMQ_qasm_simulator - a remote simulator. -# All tests of qasm_simulator have been removed since it's depreciation -# but IBMQ_qasm_simulator is still tested by this module. - @pytest.fixture( params=[