From 2d2c358d6fe6e559d437531db09384944afb5245 Mon Sep 17 00:00:00 2001 From: burgholzer Date: Sat, 27 Jan 2024 12:59:45 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20switch=20to=20mqt-core=20Python=20p?= =?UTF-8?q?ackage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: burgholzer --- .pre-commit-config.yaml | 1 + cmake/ExternalDependencies.cmake | 19 +++++-- extern/mqt-core | 2 +- noxfile.py | 1 + pyproject.toml | 17 +++--- src/mqt/ddsim/hybridqasmsimulator.py | 5 +- src/mqt/ddsim/pathqasmsimulator.py | 29 ++++++---- src/mqt/ddsim/primitives/estimator.py | 6 +- src/mqt/ddsim/qasmsimulator.py | 5 +- src/mqt/ddsim/unitarysimulator.py | 5 +- src/python/CMakeLists.txt | 5 +- src/python/bindings.cpp | 57 ++++--------------- test/python/constraints.txt | 1 + .../test_hybrid_standalone_simulator.py | 11 ++-- .../simulator/test_standalone_simulator.py | 41 +++++++------ .../test_path_sim_standalone_simulator.py | 27 +++++---- .../test_standalone_unitary_simulator.py | 4 +- 17 files changed, 113 insertions(+), 123 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a2d457d5..b35b301b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -98,6 +98,7 @@ repos: additional_dependencies: - numpy - pytest + - mqt.core~=2.2.2 # Check for spelling - repo: https://github.com/codespell-project/codespell diff --git a/cmake/ExternalDependencies.cmake b/cmake/ExternalDependencies.cmake index 443301b2..52f9f9f9 100644 --- a/cmake/ExternalDependencies.cmake +++ b/cmake/ExternalDependencies.cmake @@ -4,6 +4,19 @@ include(FetchContent) set(FETCH_PACKAGES "") if(BUILD_MQT_DDSIM_BINDINGS) + # Manually detect the installed mqt-core package. + execute_process( + COMMAND "${Python_EXECUTABLE}" -m mqt.core --cmake_dir + OUTPUT_STRIP_TRAILING_WHITESPACE + OUTPUT_VARIABLE mqt-core_DIR + ERROR_QUIET) + + # Add the detected directory to the CMake prefix path. + if(mqt-core_DIR) + list(APPEND CMAKE_PREFIX_PATH "${mqt-core_DIR}") + message(STATUS "Found mqt-core package: ${mqt-core_DIR}") + endif() + if(NOT SKBUILD) # Manually detect the installed pybind11 package. execute_process( @@ -19,12 +32,6 @@ if(BUILD_MQT_DDSIM_BINDINGS) find_package(pybind11 CONFIG REQUIRED) endif() -set(FETCHCONTENT_SOURCE_DIR_MQT-CORE - ${PROJECT_SOURCE_DIR}/extern/mqt-core - CACHE - PATH - "Path to the source directory of the mqt-core library. This variable is used by FetchContent to download the library if it is not already available." -) set(MQT_CORE_VERSION 2.2.2 CACHE STRING "MQT Core version") diff --git a/extern/mqt-core b/extern/mqt-core index fc7d8660..f2533950 160000 --- a/extern/mqt-core +++ b/extern/mqt-core @@ -1 +1 @@ -Subproject commit fc7d8660e6d2007befbcdf70abdad0e845e67ae8 +Subproject commit f2533950fccdab892dd3b193d3b10aebaf952dd6 diff --git a/noxfile.py b/noxfile.py index f6ef02ce..e2de2e46 100644 --- a/noxfile.py +++ b/noxfile.py @@ -17,6 +17,7 @@ PYTHON_ALL_VERSIONS = ["3.8", "3.9", "3.10", "3.11", "3.12"] BUILD_REQUIREMENTS = [ + "mqt.core~=2.2.2", "scikit-build-core[pyproject]>=0.6.1", "setuptools_scm>=7", "pybind11>=2.11", diff --git a/pyproject.toml b/pyproject.toml index 1b0dd38b..2ef52fbc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,10 @@ [build-system] -requires = ["scikit-build-core>=0.6.1", "setuptools-scm>=7", "pybind11>=2.11"] +requires = [ + "scikit-build-core>=0.6.1", + "setuptools-scm>=7", + "pybind11>=2.11", + "mqt.core~=2.2.2", +] build-backend = "scikit_build_core.build" [project] @@ -34,7 +39,7 @@ classifiers = [ ] requires-python = ">=3.8" dependencies = [ - "qiskit[qasm3-import]>=0.45.0" + "mqt.core[qiskit]~=2.2.2", ] dynamic = ["version"] @@ -103,14 +108,6 @@ sdist.exclude = [ "**/plots", "**/test", "**/tests", - "extern/mqt-core/extern/json/include", - "extern/mqt-core/extern/googletest", - "extern/mqt-core/extern/boost/config/checks", - "extern/mqt-core/extern/boost/config/tools", - "extern/mqt-core/extern/boost/multiprecision/config", - "extern/mqt-core/extern/boost/multiprecision/example", - "extern/mqt-core/extern/boost/multiprecision/performance", - "extern/mqt-core/extern/boost/multiprecision/tools" ] [tool.scikit-build.cmake.define] diff --git a/src/mqt/ddsim/hybridqasmsimulator.py b/src/mqt/ddsim/hybridqasmsimulator.py index fc4e6ed7..3cfa3f89 100644 --- a/src/mqt/ddsim/hybridqasmsimulator.py +++ b/src/mqt/ddsim/hybridqasmsimulator.py @@ -14,6 +14,8 @@ from qiskit.transpiler import Target from qiskit.utils.multiprocessing import local_hardware_info +from mqt.core.io import load + from .header import DDSIMHeader from .pyddsim import HybridCircuitSimulator, HybridMode from .qasmsimulator import QasmSimulatorBackend @@ -74,7 +76,8 @@ def _run_experiment(self, qc: QuantumCircuit, **options: Any) -> ExperimentResul msg = f"Simulation mode{mode} not supported by hybrid simulator. Available modes are 'amplitude' and 'dd'." raise QiskitError(msg) - sim = HybridCircuitSimulator(qc, seed=seed, mode=hybrid_mode, nthreads=nthreads) + circuit = load(qc) + sim = HybridCircuitSimulator(circuit, seed=seed, mode=hybrid_mode, nthreads=nthreads) shots = options.get("shots", 1024) if self._SHOW_STATE_VECTOR and shots > 0: diff --git a/src/mqt/ddsim/pathqasmsimulator.py b/src/mqt/ddsim/pathqasmsimulator.py index 2aefb061..7071d0fb 100644 --- a/src/mqt/ddsim/pathqasmsimulator.py +++ b/src/mqt/ddsim/pathqasmsimulator.py @@ -7,13 +7,17 @@ from typing import TYPE_CHECKING, Any if TYPE_CHECKING: + from qiskit import QuantumCircuit from quimb.tensor import Tensor, TensorNetwork -from qiskit import QuantumCircuit + from mqt.core import QuantumComputation + from qiskit.providers import Options from qiskit.result.models import ExperimentResult, ExperimentResultData from qiskit.transpiler import Target +from mqt.core.io import load + from .header import DDSIMHeader from .pyddsim import PathCircuitSimulator, PathSimulatorConfiguration, PathSimulatorMode from .qasmsimulator import QasmSimulatorBackend @@ -38,18 +42,14 @@ def read_tensor_network_file(filename: str) -> list[Tensor]: return tensors -def create_tensor_network(qc: QuantumCircuit) -> TensorNetwork: +def create_tensor_network(qc: QuantumComputation) -> TensorNetwork: import quimb.tensor as qtn import sparse from mqt.ddsim import dump_tensor_network - if isinstance(qc, QuantumCircuit): - filename = qc.name + "_" + str(qc.num_qubits) + ".tensor" - nqubits = qc.num_qubits - else: - filename = "tensor.tensor" - nqubits = qc.header.n_qubits + filename = qc.name + "_" + str(qc.num_qubits) + ".tensor" + nqubits = qc.num_qubits dump_tensor_network(qc, filename) tensors = read_tensor_network_file(filename) @@ -78,7 +78,7 @@ def create_tensor_network(qc: QuantumCircuit) -> TensorNetwork: def get_simulation_path( - qc: QuantumCircuit, + qc: QuantumComputation, max_time: int = 60, max_repeats: int = 1024, parallel_runs: int = 1, @@ -101,7 +101,7 @@ def get_simulation_path( path = linear_to_ssa(info.path) if dump_path: - filename = qc.name + "_" + str(qc.num_qubits) + ".path" if isinstance(qc, QuantumCircuit) else "simulation.path" + filename = qc.name + "_" + str(qc.num_qubits) + ".path" with pathlib.Path(filename).open("w") as file: file.write(str(path)) @@ -181,7 +181,8 @@ def _run_experiment(self, qc: QuantumCircuit, **options: Any) -> ExperimentResul if seed is not None: pathsim_configuration.seed = seed - sim = PathCircuitSimulator(qc, config=pathsim_configuration) + circuit = load(qc) + sim = PathCircuitSimulator(circuit, config=pathsim_configuration) # determine the contraction path using cotengra in case this is requested if pathsim_configuration.mode == PathSimulatorMode.cotengra: @@ -190,7 +191,11 @@ def _run_experiment(self, qc: QuantumCircuit, **options: Any) -> ExperimentResul dump_path = options.get("cotengra_dump_path", False) plot_ring = options.get("cotengra_plot_ring", False) path = get_simulation_path( - qc, max_time=max_time, max_repeats=max_repeats, dump_path=dump_path, plot_ring=plot_ring + circuit, + max_time=max_time, + max_repeats=max_repeats, + dump_path=dump_path, + plot_ring=plot_ring, ) sim.set_simulation_path(path, False) diff --git a/src/mqt/ddsim/primitives/estimator.py b/src/mqt/ddsim/primitives/estimator.py index fba6e233..86703f4e 100644 --- a/src/mqt/ddsim/primitives/estimator.py +++ b/src/mqt/ddsim/primitives/estimator.py @@ -16,6 +16,7 @@ ) from qiskit.quantum_info import Pauli, PauliList, SparsePauliOp +from mqt.core.io import load from mqt.ddsim.pyddsim import CircuitSimulator from mqt.ddsim.qasmsimulator import QasmSimulatorBackend @@ -235,15 +236,16 @@ def _run_experiment( approximation_strategy = options.get("approximation_strategy", "fidelity") seed = options.get("seed_simulator", -1) + qc = load(circ) sim = CircuitSimulator( - circ, + qc, approximation_step_fidelity=approximation_step_fidelity, approximation_steps=approximation_steps, approximation_strategy=approximation_strategy, seed=seed, ) - return [sim.expectation_value(observable=obs) for obs in obs_circ_list] + return [sim.expectation_value(observable=load(obs)) for obs in obs_circ_list] @staticmethod def _postprocessing(result_list: list[float], accum: list[int], metadata: list[dict]) -> EstimatorResult: diff --git a/src/mqt/ddsim/qasmsimulator.py b/src/mqt/ddsim/qasmsimulator.py index 8d373bb9..d90414fb 100644 --- a/src/mqt/ddsim/qasmsimulator.py +++ b/src/mqt/ddsim/qasmsimulator.py @@ -15,6 +15,8 @@ from qiskit.transpiler import Target from qiskit.utils.multiprocessing import local_hardware_info +from mqt.core.io import load + from . import __version__ from .header import DDSIMHeader from .job import DDSIMJob @@ -161,8 +163,9 @@ def _run_experiment(self, qc: QuantumCircuit, **options: dict[str, Any]) -> Expe seed = options.get("seed_simulator", -1) shots = options.get("shots", 1024) + circuit = load(qc) sim = CircuitSimulator( - qc, + circuit, approximation_step_fidelity=approximation_step_fidelity, approximation_steps=approximation_steps, approximation_strategy=approximation_strategy, diff --git a/src/mqt/ddsim/unitarysimulator.py b/src/mqt/ddsim/unitarysimulator.py index 3c12a2fa..fc091eec 100644 --- a/src/mqt/ddsim/unitarysimulator.py +++ b/src/mqt/ddsim/unitarysimulator.py @@ -12,6 +12,8 @@ from qiskit.result.models import ExperimentResult, ExperimentResultData from qiskit.transpiler import Target +from mqt.core.io import load + from .header import DDSIMHeader from .pyddsim import ConstructionMode, UnitarySimulator, get_matrix from .qasmsimulator import QasmSimulatorBackend @@ -66,7 +68,8 @@ def _run_experiment(cls, qc: QuantumCircuit, **options: Any) -> ExperimentResult ) raise QiskitError(msg) - sim = UnitarySimulator(qc, seed=seed, mode=construction_mode) + circuit = load(qc) + sim = UnitarySimulator(circuit, seed=seed, mode=construction_mode) sim.construct() # Extract resulting matrix from final DD and write data unitary: npt.NDArray[np.complex128] = np.zeros((2**qc.num_qubits, 2**qc.num_qubits), dtype=np.complex128) diff --git a/src/python/CMakeLists.txt b/src/python/CMakeLists.txt index d76e9dd7..a6e839b8 100644 --- a/src/python/CMakeLists.txt +++ b/src/python/CMakeLists.txt @@ -6,9 +6,8 @@ pybind11_add_module( OPT_SIZE # Source code goes here bindings.cpp) -target_link_libraries( - pyddsim PRIVATE MQT::DDSim MQT::ProjectOptions MQT::ProjectWarnings - MQT::CorePython pybind11_json) +target_link_libraries(pyddsim PRIVATE MQT::DDSim MQT::ProjectOptions + MQT::ProjectWarnings pybind11_json) # Install directive for scikit-build-core install( diff --git a/src/python/bindings.cpp b/src/python/bindings.cpp index baf400f1..f74d21e1 100644 --- a/src/python/bindings.cpp +++ b/src/python/bindings.cpp @@ -7,7 +7,6 @@ #include "HybridSchrodingerFeynmanSimulator.hpp" #include "PathSimulator.hpp" #include "UnitarySimulator.hpp" -#include "python/qiskit/QuantumCircuit.hpp" #include #include @@ -17,33 +16,14 @@ namespace py = pybind11; using namespace pybind11::literals; -static qc::QuantumComputation importCircuit(const py::object& circ) { - const py::object quantumCircuit = - py::module::import("qiskit").attr("QuantumCircuit"); - - auto qc = qc::QuantumComputation(); - - if (py::isinstance(circ)) { - const auto file = circ.cast(); - qc.import(file); - } else if (py::isinstance(circ, quantumCircuit)) { - qc::qiskit::QuantumCircuit::import(qc, circ); - } else { - throw std::runtime_error( - "PyObject is neither py::str nor QuantumCircuit"); - } - - return qc; -} - template -std::unique_ptr constructSimulator(const py::object& circ, - const double stepFidelity, - const unsigned int stepNumber, - const std::string& approximationStrategy, - const std::int64_t seed, +std::unique_ptr constructSimulator(const qc::QuantumComputation& circ, + const double stepFidelity, + const unsigned int stepNumber, + const std::string& approximationStrategy, + const std::int64_t seed, Args&&... args) { - auto qc = std::make_unique(importCircuit(circ)); + auto qc = std::make_unique(circ); const auto approx = ApproximationInfo{stepFidelity, stepNumber, ApproximationInfo::fromString(approximationStrategy)}; if constexpr (std::is_same_v>) { return std::make_unique(std::move(qc), @@ -62,7 +42,7 @@ std::unique_ptr constructSimulator(const py::object& circ, } template -std::unique_ptr constructSimulatorWithoutSeed(const py::object& circ, Args&&... args) { +std::unique_ptr constructSimulatorWithoutSeed(const qc::QuantumComputation& circ, Args&&... args) { return constructSimulator(circ, 1., 1, "fidelity", -1, std::forward(args)...); } @@ -114,26 +94,9 @@ void getNumPyMatrix(UnitarySimulator& sim, py::array_t{1.0, 0.0}, 0, 0, dim, dataPtr); } -void dumpTensorNetwork(const py::object& circ, const std::string& filename) { - const py::object quantumCircuit = py::module::import("qiskit").attr("QuantumCircuit"); - - std::unique_ptr qc = std::make_unique(); - - if (py::isinstance(circ)) { - auto&& file1 = circ.cast(); - qc->import(file1); - } else if (py::isinstance(circ, quantumCircuit)) { - qc::qiskit::QuantumCircuit::import(*qc, circ); - } else { - throw std::runtime_error("PyObject is neither py::str nor QuantumCircuit"); - } +void dumpTensorNetwork(qc::QuantumComputation& circ, const std::string& filename) { std::ofstream ofs(filename); - qc->dump(ofs, qc::Format::Tensor); -} - -dd::fp expectationValue(CircuitSimulator<>& sim, const py::object& observable) { - const auto observableCircuit = importCircuit(observable); - return sim.expectationValue(observableCircuit); + circ.dump(ofs, qc::Format::Tensor); } template @@ -171,7 +134,7 @@ PYBIND11_MODULE(pyddsim, m) { "approximation_steps"_a = 1, "approximation_strategy"_a = "fidelity", "seed"_a = -1) - .def("expectation_value", &expectationValue, "observable"_a); + .def("expectation_value", &CircuitSimulator<>::expectationValue, "observable"_a); // Hybrid Schrödinger-Feynman Simulator py::enum_::Mode>(m, "HybridMode") diff --git a/test/python/constraints.txt b/test/python/constraints.txt index aac0312c..d2e0adb7 100644 --- a/test/python/constraints.txt +++ b/test/python/constraints.txt @@ -2,4 +2,5 @@ scikit-build-core==0.6.1 setuptools-scm==7.0.0 pybind11==2.11.0 pytest==7.0.0 +mqt.core==2.2.2 qiskit==0.45.0 diff --git a/test/python/hybridsimulator/test_hybrid_standalone_simulator.py b/test/python/hybridsimulator/test_hybrid_standalone_simulator.py index 41d0d55e..a450d292 100644 --- a/test/python/hybridsimulator/test_hybrid_standalone_simulator.py +++ b/test/python/hybridsimulator/test_hybrid_standalone_simulator.py @@ -2,19 +2,18 @@ import unittest -from qiskit import QuantumCircuit, QuantumRegister - from mqt import ddsim +from mqt.core import QuantumComputation class MQTStandaloneHybridSimulatorTest(unittest.TestCase): def setUp(self) -> None: - q = QuantumRegister(4) - circ = QuantumCircuit(q) - circ.h(q) + circ = QuantumComputation(4) + for i in range(4): + circ.h(i) circ.cz(3, 1) circ.cz(2, 0) - circ.measure_all(inplace=True) + circ.measure_all() self.circuit = circ self.non_zeros_in_matrix = 16 diff --git a/test/python/simulator/test_standalone_simulator.py b/test/python/simulator/test_standalone_simulator.py index 474c5931..9664bd36 100644 --- a/test/python/simulator/test_standalone_simulator.py +++ b/test/python/simulator/test_standalone_simulator.py @@ -3,9 +3,9 @@ import pathlib import unittest -from qiskit import QuantumCircuit - from mqt import ddsim +from mqt.core import QuantumComputation +from mqt.core.io import load class MQTStandaloneSimulatorTests(unittest.TestCase): @@ -14,7 +14,8 @@ def setUp(self) -> None: def test_truly_standalone(self): filename = str(pathlib.Path(__file__).with_name("ghz_03.qasm").absolute()) - sim = ddsim.CircuitSimulator(filename) + circ = load(filename) + sim = ddsim.CircuitSimulator(circ) result = sim.simulate(1000) print(result) assert len(result.keys()) == self.nonzero_states_ghz @@ -22,7 +23,7 @@ def test_truly_standalone(self): assert "111" in result def test_standalone(self): - circ = QuantumCircuit(3) + circ = QuantumComputation(3) circ.h(0) circ.cx(0, 1) circ.cx(0, 2) @@ -34,7 +35,7 @@ def test_standalone(self): assert "111" in result def test_standalone_with_seed(self): - circ = QuantumCircuit(3) + circ = QuantumComputation(3) circ.h(0) circ.cx(0, 1) circ.cx(0, 2) @@ -49,11 +50,11 @@ def test_standalone_simple_approximation(self): import numpy as np # creates a state with <2% probability of measuring |1x> - circ = QuantumCircuit(2) + circ = QuantumComputation(2) circ.h(0) circ.cry(np.pi / 8, 0, 1) - circ.id(0) - circ.id(0) + circ.i(0) + circ.i(0) # create a simulator that approximates once and by at most 2% sim = ddsim.CircuitSimulator(circ, approximation_step_fidelity=0.98, approximation_steps=1) @@ -66,17 +67,15 @@ def test_standalone_simple_approximation(self): @staticmethod def test_native_two_qubit_gates(): - from qiskit.circuit.library import XXMinusYYGate, XXPlusYYGate - - qc = QuantumCircuit(2) + qc = QuantumComputation(2) qc.dcx(0, 1) qc.ecr(0, 1) qc.rxx(0.5, 0, 1) qc.rzz(0.5, 0, 1) qc.ryy(0.5, 0, 1) qc.rzx(0.5, 0, 1) - qc.append(XXMinusYYGate(0.5, 0.25), [0, 1]) - qc.append(XXPlusYYGate(0.5, 0.25), [0, 1]) + qc.xx_minus_yy(0.5, 0.25, 0, 1) + qc.xx_plus_yy(0.5, 0.25, 0, 1) print(qc) print(qc.global_phase) sim = ddsim.CircuitSimulator(qc) @@ -89,16 +88,16 @@ def test_expectation_value_local_operators(): max_qubits = 3 for qubits in range(1, max_qubits + 1): - qc = QuantumCircuit(qubits) + qc = QuantumComputation(qubits) sim = ddsim.CircuitSimulator(qc) for i in range(qubits): - x_observable = QuantumCircuit(qubits) + x_observable = QuantumComputation(qubits) x_observable.x(i) assert sim.expectation_value(x_observable) == 0 - z_observable = QuantumCircuit(qubits) + z_observable = QuantumComputation(qubits) z_observable.z(i) assert sim.expectation_value(z_observable) == 1 - h_observable = QuantumCircuit(qubits) + h_observable = QuantumComputation(qubits) h_observable.h(i) assert np.allclose(sim.expectation_value(h_observable), 1 / np.sqrt(2)) @@ -108,11 +107,11 @@ def test_expectation_value_global_operators(): max_qubits = 3 for qubits in range(1, max_qubits + 1): - qc = QuantumCircuit(qubits) + qc = QuantumComputation(qubits) sim = ddsim.CircuitSimulator(qc) - x_observable = QuantumCircuit(qubits) - z_observable = QuantumCircuit(qubits) - h_observable = QuantumCircuit(qubits) + x_observable = QuantumComputation(qubits) + z_observable = QuantumComputation(qubits) + h_observable = QuantumComputation(qubits) for i in range(qubits): x_observable.x(i) z_observable.z(i) diff --git a/test/python/taskbasedsimulator/test_path_sim_standalone_simulator.py b/test/python/taskbasedsimulator/test_path_sim_standalone_simulator.py index 6dd8cd96..2ddefbda 100644 --- a/test/python/taskbasedsimulator/test_path_sim_standalone_simulator.py +++ b/test/python/taskbasedsimulator/test_path_sim_standalone_simulator.py @@ -2,9 +2,8 @@ import unittest -from qiskit import QuantumCircuit - from mqt import ddsim +from mqt.core import QuantumComputation class MQTStandaloneSimulatorTests(unittest.TestCase): @@ -12,7 +11,7 @@ def setUp(self) -> None: self.nonzero_states_ghz = 2 def test_standalone(self): - circ = QuantumCircuit(3) + circ = QuantumComputation(3) circ.h(0) circ.cx(0, 1) circ.cx(0, 2) @@ -24,7 +23,7 @@ def test_standalone(self): assert "111" in result def test_standalone_with_config(self): - circ = QuantumCircuit(3) + circ = QuantumComputation(3) circ.h(0) circ.cx(0, 1) circ.cx(0, 2) @@ -36,7 +35,7 @@ def test_standalone_with_config(self): assert "111" in result def test_standalone_with_seed(self): - circ = QuantumCircuit(3) + circ = QuantumComputation(3) circ.h(0) circ.cx(0, 1) circ.cx(0, 2) @@ -48,7 +47,7 @@ def test_standalone_with_seed(self): assert "111" in result def test_standalone_individual_objects(self): - circ = QuantumCircuit(3) + circ = QuantumComputation(3) circ.h(0) circ.cx(0, 1) circ.cx(0, 2) @@ -60,25 +59,33 @@ def test_standalone_individual_objects(self): assert "111" in result def test_standalone_pairwise_only(self): - circ = QuantumCircuit(3) + circ = QuantumComputation(3) circ.h(0) circ.cx(0, 1) circ.cx(0, 2) - sim = ddsim.PathCircuitSimulator(circ, seed=1, mode=ddsim.PathSimulatorMode.pairwise_recursive, bracket_size=2) + sim = ddsim.PathCircuitSimulator( + circ, + seed=1, + mode=ddsim.PathSimulatorMode.pairwise_recursive, + bracket_size=2, + ) result = sim.simulate(1000) assert len(result.keys()) == self.nonzero_states_ghz assert "000" in result assert "111" in result def test_standalone_gatecost_only(self): - circ = QuantumCircuit(3) + circ = QuantumComputation(3) circ.h(0) circ.cx(0, 1) circ.cx(0, 2) sim = ddsim.PathCircuitSimulator( - circ, mode=ddsim.PathSimulatorMode.gate_cost, starting_point=2, gate_cost=[1, 1] + circ, + mode=ddsim.PathSimulatorMode.gate_cost, + starting_point=2, + gate_cost=[1, 1], ) result = sim.simulate(1000) assert len(result.keys()) == self.nonzero_states_ghz diff --git a/test/python/unitarysimulator/test_standalone_unitary_simulator.py b/test/python/unitarysimulator/test_standalone_unitary_simulator.py index 5a5a5bca..cf755f5f 100644 --- a/test/python/unitarysimulator/test_standalone_unitary_simulator.py +++ b/test/python/unitarysimulator/test_standalone_unitary_simulator.py @@ -4,14 +4,14 @@ import numpy as np import numpy.typing as npt -from qiskit import QuantumCircuit from mqt import ddsim +from mqt.core import QuantumComputation class MQTStandaloneUnitarySimulatorTests(unittest.TestCase): def setUp(self) -> None: - circ = QuantumCircuit(3) + circ = QuantumComputation(3) circ.h(0) circ.cx(0, 1) circ.cx(0, 2)