Skip to content

Commit 37d0485

Browse files
authored
✨ Support for Qiskit 1.0 (#349)
1 parent a50b525 commit 37d0485

13 files changed

Lines changed: 25 additions & 308 deletions

pyproject.toml

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ classifiers = [
3434
]
3535
requires-python = ">=3.8"
3636
dependencies = [
37-
"qiskit[qasm3-import]>=0.45.0"
37+
"qiskit[qasm3-import]>=1.0.0"
3838
]
3939
dynamic = ["version"]
4040

@@ -143,14 +143,7 @@ log_cli_level = "INFO"
143143
xfail_strict = true
144144
filterwarnings = [
145145
"error",
146-
"ignore:.*qiskit.__qiskit_version__.*:DeprecationWarning:qiskit:",
147-
"ignore:.*qiskit.utils.algorithm_globals.QiskitAlgorithmGlobals*:DeprecationWarning:qiskit",
148-
"ignore:.*Building a flow controller with keyword arguments is going to be deprecated*:PendingDeprecationWarning:qiskit",
149-
"ignore:.*qiskit.extensions module is pending deprecation*:PendingDeprecationWarning:qiskit",
150146
'ignore:.*datetime\.datetime\.utcfromtimestamp.*:DeprecationWarning:',
151-
"ignore:.*qiskit.utils.parallel*:DeprecationWarning:qiskit",
152-
"ignore:.*qiskit.tools.events*:DeprecationWarning:qiskit",
153-
"ignore:.*qiskit.qasm*:DeprecationWarning:qiskit",
154147
]
155148

156149
[tool.coverage]
@@ -172,10 +165,6 @@ warn_unreachable = true
172165
explicit_package_bases = true
173166
pretty = true
174167

175-
[[tool.mypy.overrides]]
176-
module = ["qiskit.*"]
177-
ignore_missing_imports = true
178-
179168
[tool.ruff]
180169
line-length = 120
181170
extend-include = ["*.ipynb"]

src/mqt/ddsim/hybridqasmsimulator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def _run_experiment(self, qc: QuantumCircuit, **options: Any) -> ExperimentResul
6161
nthreads = int(options.get("nthreads", local_hardware_info()["cpus"]))
6262
if mode == "amplitude":
6363
hybrid_mode = HybridMode.amplitude
64-
max_qubits = self.max_qubits()
64+
max_qubits = 30 # hard-coded 16GiB memory limit
6565
algorithm_qubits = qc.num_qubits
6666
if algorithm_qubits > max_qubits:
6767
msg = "Not enough memory available to simulate the circuit even on a single thread"

src/mqt/ddsim/hybridstatevectorsimulator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class HybridStatevectorSimulatorBackend(HybridQasmSimulatorBackend):
1313
_SHOW_STATE_VECTOR = True
1414
_HSF_SV_TARGET = Target(
1515
description="MQT DDSIM HSF Statevector Simulator Target",
16-
num_qubits=HybridQasmSimulatorBackend.max_qubits(),
16+
num_qubits=30, # corresponds to 16GiB memory for storing the full statevector
1717
)
1818

1919
def __init__(self) -> None:

src/mqt/ddsim/pathstatevectorsimulator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class PathStatevectorSimulatorBackend(PathQasmSimulatorBackend):
1313
_SHOW_STATE_VECTOR = True
1414
_Path_SV_TARGET = Target(
1515
description="MQT DDSIM Simulation Path Framework Statevector Target",
16-
num_qubits=PathQasmSimulatorBackend.max_qubits(),
16+
num_qubits=30, # corresponds to 16GiB memory for storing the full statevector
1717
)
1818

1919
def __init__(self) -> None:

src/mqt/ddsim/primitives/estimator.py

Lines changed: 4 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,21 @@
77

88
import numpy as np
99
from qiskit.circuit import QuantumCircuit
10-
from qiskit.primitives.base import BaseEstimator, EstimatorResult
11-
from qiskit.primitives.primitive_job import PrimitiveJob
12-
from qiskit.primitives.utils import (
13-
_circuit_key, # noqa: PLC2701
14-
_observable_key, # noqa: PLC2701
15-
init_observable,
16-
)
17-
from qiskit.quantum_info import Pauli, PauliList, SparsePauliOp
10+
from qiskit.primitives import Estimator as QiskitEstimator
11+
from qiskit.primitives import EstimatorResult
12+
from qiskit.quantum_info import Pauli, PauliList
1813

1914
from mqt.ddsim.pyddsim import CircuitSimulator
2015
from mqt.ddsim.qasmsimulator import QasmSimulatorBackend
2116

2217
if TYPE_CHECKING:
2318
from qiskit.circuit import Parameter
2419
from qiskit.circuit.parameterexpression import ParameterValueType
25-
from qiskit.quantum_info.operators.base_operator import BaseOperator
2620

2721
Parameters = Union[Mapping[Parameter, ParameterValueType], Sequence[ParameterValueType]]
2822

2923

30-
class Estimator(BaseEstimator):
24+
class Estimator(QiskitEstimator):
3125
"""DDSIM implementation of qiskit's sampler.
3226
Code adapted from Qiskit's BackendEstimator class.
3327
"""
@@ -152,47 +146,6 @@ def _observable_circuit(num_qubits: int, pauli: Pauli) -> tuple[QuantumCircuit,
152146

153147
return obs_circuit, qubit_indices
154148

155-
def _run(
156-
self,
157-
circuits: Sequence[QuantumCircuit],
158-
observables: Sequence[BaseOperator | SparsePauliOp],
159-
parameter_values: Sequence[Parameters],
160-
**run_options: dict[str, Any],
161-
) -> PrimitiveJob:
162-
circuit_indices = []
163-
for circuit in circuits:
164-
key_circ = _circuit_key(circuit)
165-
index = self._circuit_ids.get(key_circ)
166-
if index is not None:
167-
circuit_indices.append(index)
168-
else:
169-
num_circuits = len(self._circuits)
170-
circuit_indices.append(num_circuits)
171-
self._circuit_ids[key_circ] = num_circuits
172-
self._circuits.append(circuit)
173-
self._parameters.append(circuit.parameters)
174-
observable_indices = []
175-
for observable in observables:
176-
observable_copy = init_observable(observable)
177-
key_obs = _observable_key(observable_copy)
178-
index = self._observable_ids.get(key_obs)
179-
if index is not None:
180-
observable_indices.append(index)
181-
else:
182-
num_observables = len(self._observables)
183-
observable_indices.append(num_observables)
184-
self._observable_ids[key_obs] = num_observables
185-
self._observables.append(observable_copy)
186-
job = PrimitiveJob(
187-
self._call,
188-
circuit_indices,
189-
observable_indices,
190-
parameter_values,
191-
**run_options,
192-
)
193-
job.submit()
194-
return job
195-
196149
def _call(
197150
self,
198151
circuits: Sequence[int],

src/mqt/ddsim/primitives/sampler.py

Lines changed: 7 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,20 @@
55
import math
66
from typing import TYPE_CHECKING, Any, Mapping, Sequence, Union
77

8-
from qiskit.primitives.base import BaseSampler, SamplerResult
9-
from qiskit.primitives.primitive_job import PrimitiveJob
10-
from qiskit.primitives.utils import _circuit_key # noqa: PLC2701
8+
from qiskit.primitives import SamplerResult
9+
from qiskit.primitives.sampler import Sampler as QiskitSampler
1110
from qiskit.result import QuasiDistribution, Result
1211

1312
from mqt.ddsim.qasmsimulator import QasmSimulatorBackend
1413

1514
if TYPE_CHECKING:
1615
from qiskit.circuit import Parameter
1716
from qiskit.circuit.parameterexpression import ParameterValueType
18-
from qiskit.circuit.quantumcircuit import QuantumCircuit
1917

2018
Parameters = Union[Mapping[Parameter, ParameterValueType], Sequence[ParameterValueType]]
2119

2220

23-
class Sampler(BaseSampler):
21+
class Sampler(QiskitSampler):
2422
_BACKEND = QasmSimulatorBackend()
2523

2624
def __init__(
@@ -41,39 +39,10 @@ def __init__(
4139
def backend(self) -> QasmSimulatorBackend:
4240
return self._BACKEND
4341

44-
def _run(
45-
self,
46-
circuits: Sequence[QuantumCircuit],
47-
parameter_values: Sequence[Parameters],
48-
**run_options: Any,
49-
) -> PrimitiveJob:
50-
"""Stores circuits and parameters within the instance.
51-
Executes _call function.
52-
53-
Args:
54-
circuits: List of quantum circuits to simulate
55-
parameter_values: List of parameters associated with those circuits
56-
run_options: Additional run options.
57-
58-
Returns:
59-
PrimitiveJob.
60-
"""
61-
circuit_indices = []
62-
for circuit in circuits:
63-
key = _circuit_key(circuit)
64-
index = self._circuit_ids.get(key)
65-
if index is not None:
66-
circuit_indices.append(index)
67-
else:
68-
num_circuits = len(self._circuits)
69-
circuit_indices.append(num_circuits)
70-
self._circuit_ids[key] = num_circuits
71-
self._circuits.append(circuit)
72-
self._parameters.append(circuit.parameters)
73-
74-
job = PrimitiveJob(self._call, circuit_indices, parameter_values, **run_options)
75-
job.submit()
76-
return job
42+
@property
43+
def num_circuits(self) -> int:
44+
"""The number of circuits stored in the sampler."""
45+
return len(self._circuits)
7746

7847
def _call(
7948
self,

src/mqt/ddsim/qasmsimulator.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import time
66
import uuid
7-
from math import log2
87
from typing import TYPE_CHECKING, Any, Mapping, Sequence, Union
98

109
from qiskit import QuantumCircuit
@@ -13,7 +12,6 @@
1312
from qiskit.result import Result
1413
from qiskit.result.models import ExperimentResult, ExperimentResultData
1514
from qiskit.transpiler import Target
16-
from qiskit.utils.multiprocessing import local_hardware_info
1715

1816
from . import __version__
1917
from .header import DDSIMHeader
@@ -34,14 +32,6 @@ class QasmSimulatorBackend(BackendV2):
3432
_SHOW_STATE_VECTOR = False
3533
_TARGET = Target(description="MQT DDSIM Simulator Target", num_qubits=128)
3634

37-
@staticmethod
38-
def max_qubits(for_matrix: bool = False) -> int:
39-
max_complex = local_hardware_info()["memory"] * (1024**3) / 16
40-
max_qubits = int(log2(max_complex))
41-
if for_matrix:
42-
max_qubits = max_qubits // 2
43-
return max_qubits
44-
4535
@staticmethod
4636
def _add_operations_to_target(target: Target) -> None:
4737
DDSIMTargetBuilder.add_0q_gates(target)

src/mqt/ddsim/statevectorsimulator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class StatevectorSimulatorBackend(QasmSimulatorBackend):
1313
_SHOW_STATE_VECTOR = True
1414
_SV_TARGET = Target(
1515
description="MQT DDSIM Statevector Simulator Target",
16-
num_qubits=QasmSimulatorBackend.max_qubits(),
16+
num_qubits=30, # corresponds to 16GiB memory for storing the full statevector
1717
)
1818

1919
def __init__(self) -> None:

src/mqt/ddsim/unitarysimulator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class UnitarySimulatorBackend(QasmSimulatorBackend):
2626

2727
_US_TARGET = Target(
2828
description="MQT DDSIM Unitary Simulator Target",
29-
num_qubits=QasmSimulatorBackend.max_qubits(for_matrix=True),
29+
num_qubits=15, # corresponds to 16GiB memory for storing the full matrix
3030
)
3131

3232
@staticmethod

test/__init__.py

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)