qiskit 1.2.1__cp38-abi3-manylinux_2_17_i686.manylinux2014_i686.whl → 1.2.2__cp38-abi3-manylinux_2_17_i686.manylinux2014_i686.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
qiskit/VERSION.txt CHANGED
@@ -1 +1 @@
1
- 1.2.1
1
+ 1.2.2
Binary file
@@ -56,6 +56,7 @@ class PauliEvolutionGate(Gate):
56
56
 
57
57
  X = SparsePauliOp("X")
58
58
  Z = SparsePauliOp("Z")
59
+ I = SparsePauliOp("I")
59
60
 
60
61
  # build the evolution gate
61
62
  operator = (Z ^ Z) - 0.1 * (X ^ I)
@@ -2090,7 +2090,7 @@ class DAGCircuit:
2090
2090
  new_layer = self.copy_empty_like(vars_mode=vars_mode)
2091
2091
 
2092
2092
  for node in op_nodes:
2093
- new_layer._apply_op_node_back(node, check=False)
2093
+ new_layer._apply_op_node_back(copy.copy(node), check=False)
2094
2094
 
2095
2095
  # The quantum registers that have an operation in this layer.
2096
2096
  support_list = [
@@ -92,7 +92,7 @@ class BaseEstimatorV1(BasePrimitive, Generic[T]):
92
92
  # calculate [ <psi1(theta1)|H1|psi1(theta1)> ]
93
93
  job = estimator.run([psi1], [H1], [theta1])
94
94
  job_result = job.result() # It will block until the job finishes.
95
- print(f"The primitive-job finished with result {job_result}"))
95
+ print(f"The primitive-job finished with result {job_result}")
96
96
 
97
97
  # calculate [ <psi1(theta1)|H1|psi1(theta1)>,
98
98
  # <psi2(theta2)|H2|psi2(theta2)>,
@@ -144,7 +144,7 @@ class BaseEstimatorV1(BasePrimitive, Generic[T]):
144
144
 
145
145
  .. code-block:: python
146
146
 
147
- values = parameter_values[i].
147
+ values = parameter_values[i]
148
148
 
149
149
  Args:
150
150
  circuits: one or more circuit objects.
@@ -34,14 +34,22 @@ class DataBin(ShapedMixin):
34
34
 
35
35
  .. code-block:: python
36
36
 
37
+ import numpy as np
38
+ from qiskit.primitives import DataBin, BitArray
39
+
37
40
  data = DataBin(
38
- alpha=BitArray.from_bitstrings(["0010"]),
41
+ alpha=BitArray.from_samples(["0010"]),
39
42
  beta=np.array([1.2])
40
43
  )
41
44
 
42
45
  print("alpha data:", data.alpha)
43
46
  print("beta data:", data.beta)
44
47
 
48
+ .. code-block::
49
+
50
+ alpha data: BitArray(<shape=(), num_shots=1, num_bits=2>)
51
+ beta data: [1.2]
52
+
45
53
  """
46
54
 
47
55
  __slots__ = ("_data", "_shape")
qiskit/pulse/builder.py CHANGED
@@ -137,7 +137,6 @@ In the example below we demonstrate some more features of the pulse builder:
137
137
  from qiskit.compiler import schedule
138
138
 
139
139
  from qiskit import pulse, QuantumCircuit
140
- from qiskit.pulse import library
141
140
  from qiskit.providers.fake_provider import FakeOpenPulse2Q
142
141
 
143
142
  backend = FakeOpenPulse2Q()
@@ -147,7 +146,7 @@ In the example below we demonstrate some more features of the pulse builder:
147
146
 
148
147
  with pulse.build(backend) as pulse_prog:
149
148
  # Create a pulse.
150
- gaussian_pulse = library.gaussian(10, 1.0, 2)
149
+ gaussian_pulse = pulse.Gaussian(10, 1.0, 2)
151
150
  # Get the qubit's corresponding drive channel from the backend.
152
151
  d0 = pulse.drive_channel(0)
153
152
  d1 = pulse.drive_channel(1)
@@ -285,7 +284,7 @@ Pulse instructions are available within the builder interface. Here's an example
285
284
  d0 = pulse.drive_channel(0)
286
285
  a0 = pulse.acquire_channel(0)
287
286
 
288
- pulse.play(pulse.library.Constant(10, 1.0), d0)
287
+ pulse.play(pulse.Constant(10, 1.0), d0)
289
288
  pulse.delay(20, d0)
290
289
  pulse.shift_phase(3.14/2, d0)
291
290
  pulse.set_phase(3.14, d0)
@@ -293,8 +292,8 @@ Pulse instructions are available within the builder interface. Here's an example
293
292
  pulse.set_frequency(5e9, d0)
294
293
 
295
294
  with pulse.build() as temp_sched:
296
- pulse.play(pulse.library.Gaussian(20, 1.0, 3.0), d0)
297
- pulse.play(pulse.library.Gaussian(20, -1.0, 3.0), d0)
295
+ pulse.play(pulse.Gaussian(20, 1.0, 3.0), d0)
296
+ pulse.play(pulse.Gaussian(20, -1.0, 3.0), d0)
298
297
 
299
298
  pulse.call(temp_sched)
300
299
  pulse.acquire(30, a0, pulse.MemorySlot(0))
@@ -1327,7 +1326,9 @@ def frequency_offset(
1327
1326
  :emphasize-lines: 7, 16
1328
1327
 
1329
1328
  from qiskit import pulse
1329
+ from qiskit.providers.fake_provider import FakeOpenPulse2Q
1330
1330
 
1331
+ backend = FakeOpenPulse2Q()
1331
1332
  d0 = pulse.DriveChannel(0)
1332
1333
 
1333
1334
  with pulse.build(backend) as pulse_prog:
@@ -1969,19 +1970,23 @@ def barrier(*channels_or_qubits: chans.Channel | int, name: str | None = None):
1969
1970
  .. code-block::
1970
1971
 
1971
1972
  import math
1973
+ from qiskit import pulse
1974
+ from qiskit.providers.fake_provider import FakeOpenPulse2Q
1975
+
1976
+ backend = FakeOpenPulse2Q()
1972
1977
 
1973
1978
  d0 = pulse.DriveChannel(0)
1974
1979
 
1975
1980
  with pulse.build(backend) as pulse_prog:
1976
1981
  with pulse.align_right():
1977
- pulse.call(backend.defaults.instruction_schedule_map.get('x', (1,)))
1982
+ pulse.call(backend.defaults().instruction_schedule_map.get('u1', (1,)))
1978
1983
  # Barrier qubit 1 and d0.
1979
1984
  pulse.barrier(1, d0)
1980
1985
  # Due to barrier this will play before the gate on qubit 1.
1981
1986
  pulse.play(pulse.Constant(10, 1.0), d0)
1982
1987
  # This will end at the same time as the pulse above due to
1983
1988
  # the barrier.
1984
- pulse.call(backend.defaults.instruction_schedule_map.get('x', (1,)))
1989
+ pulse.call(backend.defaults().instruction_schedule_map.get('u1', (1,)))
1985
1990
 
1986
1991
  .. note:: Requires the active builder context to have a backend set if
1987
1992
  qubits are barriered on.
@@ -2012,6 +2017,7 @@ def macro(func: Callable):
2012
2017
  :include-source:
2013
2018
 
2014
2019
  from qiskit import pulse
2020
+ from qiskit.providers.fake_provider import FakeOpenPulse2Q
2015
2021
 
2016
2022
  @pulse.macro
2017
2023
  def measure(qubit: int):
@@ -2021,6 +2027,9 @@ def macro(func: Callable):
2021
2027
 
2022
2028
  return mem_slot
2023
2029
 
2030
+
2031
+ backend = FakeOpenPulse2Q()
2032
+
2024
2033
  with pulse.build(backend=backend) as sched:
2025
2034
  mem_slot = measure(0)
2026
2035
  print(f"Qubit measured into {mem_slot}")
@@ -72,6 +72,8 @@ class TimeBlockade(Directive):
72
72
 
73
73
  .. code-block:: python
74
74
 
75
+ from qiskit.pulse import Schedule, Play, Constant, DriveChannel
76
+
75
77
  schedule = Schedule()
76
78
  schedule.insert(120, Play(Constant(10, 0.1), DriveChannel(0)))
77
79
 
@@ -79,6 +81,9 @@ class TimeBlockade(Directive):
79
81
 
80
82
  .. code-block:: python
81
83
 
84
+ from qiskit.pulse import ScheduleBlock, Play, Constant, DriveChannel
85
+ from qiskit.pulse.instructions import TimeBlockade
86
+
82
87
  block = ScheduleBlock()
83
88
  block.append(TimeBlockade(120, DriveChannel(0)))
84
89
  block.append(Play(Constant(10, 0.1), DriveChannel(0)))
qiskit/pulse/schedule.py CHANGED
@@ -81,6 +81,7 @@ class Schedule:
81
81
 
82
82
  .. code-block:: python
83
83
 
84
+ from qiskit.pulse import Schedule, Gaussian, DriveChannel, Play
84
85
  sched = Schedule()
85
86
  sched += Play(Gaussian(160, 0.1, 40), DriveChannel(0))
86
87
 
@@ -653,8 +654,6 @@ class Schedule:
653
654
 
654
655
  sched += pulse.Schedule(old)
655
656
 
656
- sched = sched.flatten()
657
-
658
657
  sched = sched.replace(old, new)
659
658
 
660
659
  assert sched == pulse.Schedule(new)
@@ -899,11 +898,8 @@ class ScheduleBlock:
899
898
  pulse.reference("grand_child")
900
899
  pulse.play(pulse.Constant(200, amp2), pulse.DriveChannel(0))
901
900
 
902
- Now you assign the inner pulse program to this reference.
903
-
904
- .. code-block::
905
-
906
- sched_outer.assign_references({("grand_child", ): sched_inner})
901
+ # Now assign the inner pulse program to this reference
902
+ sched_outer.assign_references({("grand_child",): sched_inner})
907
903
  print(sched_outer.parameters)
908
904
 
909
905
  .. parsed-literal::
@@ -1459,7 +1455,7 @@ class ScheduleBlock:
1459
1455
 
1460
1456
  from qiskit import pulse
1461
1457
 
1462
- with pulse.build() as subroutine:
1458
+ with pulse.build() as nested_prog:
1463
1459
  pulse.delay(10, pulse.DriveChannel(0))
1464
1460
 
1465
1461
  with pulse.build() as sub_prog:
@@ -1490,7 +1486,7 @@ class ScheduleBlock:
1490
1486
  .. code-block:: python
1491
1487
 
1492
1488
  main_prog.assign_references({("B", ): sub_prog}, inplace=True)
1493
- main_prog.references[("B", )].assign_references({"A": nested_prog}, inplace=True)
1489
+ main_prog.references[("B", )].assign_references({("A", ): nested_prog}, inplace=True)
1494
1490
 
1495
1491
  Here :attr:`.references` returns a dict-like object, and you can
1496
1492
  mutably update the nested reference of the particular subroutine.
@@ -338,8 +338,10 @@ class AlignFunc(AlignmentKind):
338
338
 
339
339
  .. code-block:: python
340
340
 
341
+ import numpy as np
342
+
341
343
  def udd10_pos(j):
342
- return np.sin(np.pi*j/(2*10 + 2))**2
344
+ return np.sin(np.pi*j/(2*10 + 2))**2
343
345
 
344
346
  .. note::
345
347
 
@@ -32,6 +32,11 @@ def block_to_dag(block: ScheduleBlock) -> rx.PyDAG:
32
32
 
33
33
  .. code-block:: python
34
34
 
35
+ from qiskit import pulse
36
+
37
+ my_gaussian0 = pulse.Gaussian(100, 0.5, 20)
38
+ my_gaussian1 = pulse.Gaussian(100, 0.3, 10)
39
+
35
40
  with pulse.build() as sched1:
36
41
  with pulse.align_left():
37
42
  pulse.play(my_gaussian0, pulse.DriveChannel(0))
@@ -51,6 +56,8 @@ def block_to_dag(block: ScheduleBlock) -> rx.PyDAG:
51
56
 
52
57
  .. code-block:: python
53
58
 
59
+ from qiskit import pulse
60
+
54
61
  with pulse.build() as sched:
55
62
  with pulse.align_left():
56
63
  pulse.shift_phase(1.57, pulse.DriveChannel(1))
qiskit/qasm2/parse.py CHANGED
@@ -89,6 +89,35 @@ class CustomInstruction:
89
89
  There is a final ``builtin`` field. This is optional, and if set true will cause the
90
90
  instruction to be defined and available within the parsing, even if there is no definition in
91
91
  any included OpenQASM 2 file.
92
+
93
+ Examples:
94
+
95
+ Instruct the importer to use Qiskit's :class:`.ECRGate` and :class:`.RZXGate` objects to
96
+ interpret ``gate`` statements that are known to have been created from those same objects
97
+ during OpenQASM 2 export::
98
+
99
+ from qiskit import qasm2
100
+ from qiskit.circuit import QuantumCircuit, library
101
+
102
+ qc = QuantumCircuit(2)
103
+ qc.ecr(0, 1)
104
+ qc.rzx(0.3, 0, 1)
105
+ qc.rzx(0.7, 1, 0)
106
+ qc.rzx(1.5, 0, 1)
107
+ qc.ecr(1, 0)
108
+
109
+ # This output string includes `gate ecr q0, q1 { ... }` and `gate rzx(p) q0, q1 { ... }`
110
+ # statements, since `ecr` and `rzx` are neither built-in gates nor in ``qelib1.inc``.
111
+ dumped = qasm2.dumps(qc)
112
+
113
+ # Tell the importer how to interpret the `gate` statements, which we know are safe
114
+ # because we controlled the input OpenQASM 2 source.
115
+ custom = [
116
+ qasm2.CustomInstruction("ecr", 0, 2, library.ECRGate),
117
+ qasm2.CustomInstruction("rzx", 1, 2, library.RZXGate),
118
+ ]
119
+
120
+ loaded = qasm2.loads(dumped, custom_instructions=custom)
92
121
  """
93
122
 
94
123
  name: str
qiskit/qasm3/exporter.py CHANGED
@@ -140,9 +140,16 @@ class Exporter:
140
140
  ):
141
141
  """
142
142
  Args:
143
- includes: the filenames that should be emitted as includes. These files will be parsed
144
- for gates, and any objects dumped from this exporter will use those definitions
145
- where possible.
143
+ includes: the filenames that should be emitted as includes.
144
+
145
+ .. note::
146
+
147
+ At present, only the standard-library file ``stdgates.inc`` is properly
148
+ understood by the exporter, in the sense that it knows the gates it defines.
149
+ You can specify other includes, but you will need to pass the names of the gates
150
+ they define in the ``basis_gates`` argument to avoid the exporter outputting a
151
+ separate ``gate`` definition.
152
+
146
153
  basis_gates: the basic defined gate set of the backend.
147
154
  disable_constants: if ``True``, always emit floating-point constants for numeric
148
155
  parameter values. If ``False`` (the default), then values close to multiples of
@@ -675,9 +682,9 @@ class QASM3Builder:
675
682
  def build_includes(self):
676
683
  """Builds a list of included files."""
677
684
  for filename in self.includes:
678
- if (definitions := _KNOWN_INCLUDES.get(filename)) is None:
679
- raise QASM3ExporterError(f"Unknown OpenQASM 3 include file: '{filename}'")
680
- for name, gate in definitions.items():
685
+ # Note: unknown include files have a corresponding `include` statement generated, but do
686
+ # not actually define any gates; we rely on the user to pass those in `basis_gates`.
687
+ for name, gate in _KNOWN_INCLUDES.get(filename, {}).items():
681
688
  self.symbols.register_gate_without_definition(name, gate)
682
689
  yield ast.Include(filename)
683
690
 
@@ -144,6 +144,8 @@ class Pauli(BasePauli):
144
144
 
145
145
  .. code-block:: python
146
146
 
147
+ from qiskit.quantum_info import Pauli
148
+
147
149
  P = Pauli('-iXYZ')
148
150
 
149
151
  print('P[0] =', repr(P[0]))
@@ -792,6 +792,8 @@ class SparsePauliOp(LinearOp):
792
792
 
793
793
  .. code-block:: python
794
794
 
795
+ from qiskit.quantum_info import SparsePauliOp
796
+
795
797
  # via tuples and the full Pauli string
796
798
  op = SparsePauliOp.from_list([("XIIZI", 1), ("IYIIY", 2)])
797
799
 
@@ -856,6 +858,8 @@ class SparsePauliOp(LinearOp):
856
858
 
857
859
  .. code-block:: python
858
860
 
861
+ from qiskit.quantum_info import SparsePauliOp
862
+
859
863
  # via triples and local Paulis with indices
860
864
  op = SparsePauliOp.from_sparse_list([("ZX", [1, 4], 1), ("YY", [0, 3], 2)], num_qubits=5)
861
865
 
@@ -1051,6 +1055,7 @@ class SparsePauliOp(LinearOp):
1051
1055
 
1052
1056
  .. code-block:: python
1053
1057
 
1058
+ >>> from qiskit.quantum_info import SparsePauliOp
1054
1059
  >>> op = SparsePauliOp.from_list([("XX", 2), ("YY", 1), ("IZ",2j), ("ZZ",1j)])
1055
1060
  >>> op.group_commuting()
1056
1061
  [SparsePauliOp(["IZ", "ZZ"], coeffs=[0.+2.j, 0.+1j]),
@@ -106,8 +106,9 @@ also add initial logical optimization prior to routing, you would do something l
106
106
  .. code-block:: python
107
107
 
108
108
  import numpy as np
109
+ from qiskit.providers.fake_provider import GenericBackendV2
109
110
  from qiskit.circuit.library import HGate, PhaseGate, RXGate, TdgGate, TGate, XGate
110
- from qiskit.transpiler import PassManager
111
+ from qiskit.transpiler import PassManager, generate_preset_pass_manager
111
112
  from qiskit.transpiler.passes import (
112
113
  ALAPScheduleAnalysis,
113
114
  CXCancellation,
@@ -115,6 +116,7 @@ also add initial logical optimization prior to routing, you would do something l
115
116
  PadDynamicalDecoupling,
116
117
  )
117
118
 
119
+ backend = GenericBackendV2(num_qubits=5)
118
120
  dd_sequence = [XGate(), XGate()]
119
121
  scheduling_pm = PassManager(
120
122
  [
@@ -135,6 +137,9 @@ also add initial logical optimization prior to routing, you would do something l
135
137
  ]
136
138
  )
137
139
 
140
+ pass_manager = generate_preset_pass_manager(
141
+ optimization_level=0
142
+ )
138
143
 
139
144
  # Add pre-layout stage to run extra logical optimization
140
145
  pass_manager.pre_layout = logical_opt
@@ -45,7 +45,7 @@ class RXCalibrationBuilder(CalibrationBuilder):
45
45
  from qiskit.circuit.library import QuantumVolume
46
46
  from qiskit.circuit.library.standard_gates import RXGate
47
47
 
48
- from calibration.rx_builder import RXCalibrationBuilder
48
+ from qiskit.transpiler.passes import RXCalibrationBuilder
49
49
 
50
50
  qv = QuantumVolume(4, 4, seed=1004)
51
51
 
@@ -96,8 +96,8 @@ class ElidePermutations(TransformationPass):
96
96
  elif isinstance(node.op, PermutationGate):
97
97
  starting_indices = [qubit_mapping[dag.find_bit(qarg).index] for qarg in node.qargs]
98
98
  pattern = node.op.params[0]
99
- pattern_indices = [qubit_mapping[idx] for idx in pattern]
100
- for i, j in zip(starting_indices, pattern_indices):
99
+ updated_indices = [starting_indices[idx] for idx in pattern]
100
+ for i, j in zip(starting_indices, updated_indices):
101
101
  qubit_mapping[i] = j
102
102
  input_qubit_mapping = {qubit: index for index, qubit in enumerate(dag.qubits)}
103
103
  self.property_set["original_layout"] = Layout(input_qubit_mapping)
@@ -27,6 +27,9 @@ class PadDelay(BasePadding):
27
27
 
28
28
  .. code-block:: python
29
29
 
30
+ from qiskit import QuantumCircuit
31
+ from qiskit.transpiler import InstructionDurations
32
+
30
33
  durations = InstructionDurations([("x", None, 160), ("cx", None, 800)])
31
34
 
32
35
  qc = QuantumCircuit(2)
@@ -968,6 +968,10 @@ class QFTSynthesisFull(HighLevelSynthesisPlugin):
968
968
  This plugin name is :``qft.full`` which can be used as the key on
969
969
  an :class:`~.HLSConfig` object to use this method with :class:`~.HighLevelSynthesis`.
970
970
 
971
+ Note that the plugin mechanism is not applied if the gate is called ``qft`` but
972
+ is not an instance of ``QFTGate``. This allows users to create custom gates with
973
+ name ``qft``.
974
+
971
975
  The plugin supports the following additional options:
972
976
 
973
977
  * reverse_qubits (bool): Whether to synthesize the "QFT" operation (if ``False``,
@@ -995,10 +999,11 @@ class QFTSynthesisFull(HighLevelSynthesisPlugin):
995
999
 
996
1000
  def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
997
1001
  """Run synthesis for the given QFTGate."""
1002
+
1003
+ # Even though the gate is called "qft", it's not a QFTGate,
1004
+ # and we should not synthesize it using the plugin.
998
1005
  if not isinstance(high_level_object, QFTGate):
999
- raise TranspilerError(
1000
- "The synthesis plugin 'qft.full` only applies to objects of type QFTGate."
1001
- )
1006
+ return None
1002
1007
 
1003
1008
  reverse_qubits = options.get("reverse_qubits", False)
1004
1009
  approximation_degree = options.get("approximation_degree", 0)
@@ -1023,6 +1028,10 @@ class QFTSynthesisLine(HighLevelSynthesisPlugin):
1023
1028
  This plugin name is :``qft.line`` which can be used as the key on
1024
1029
  an :class:`~.HLSConfig` object to use this method with :class:`~.HighLevelSynthesis`.
1025
1030
 
1031
+ Note that the plugin mechanism is not applied if the gate is called ``qft`` but
1032
+ is not an instance of ``QFTGate``. This allows users to create custom gates with
1033
+ name ``qft``.
1034
+
1026
1035
  The plugin supports the following additional options:
1027
1036
 
1028
1037
  * reverse_qubits (bool): Whether to synthesize the "QFT" operation (if ``False``,
@@ -1047,10 +1056,11 @@ class QFTSynthesisLine(HighLevelSynthesisPlugin):
1047
1056
 
1048
1057
  def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
1049
1058
  """Run synthesis for the given QFTGate."""
1059
+
1060
+ # Even though the gate is called "qft", it's not a QFTGate,
1061
+ # and we should not synthesize it using the plugin.
1050
1062
  if not isinstance(high_level_object, QFTGate):
1051
- raise TranspilerError(
1052
- "The synthesis plugin 'qft.line` only applies to objects of type QFTGate."
1053
- )
1063
+ return None
1054
1064
 
1055
1065
  reverse_qubits = options.get("reverse_qubits", False)
1056
1066
  approximation_degree = options.get("approximation_degree", 0)
@@ -150,7 +150,8 @@ class DefaultInitPassManager(PassManagerStagePlugin):
150
150
  pass_manager_config.unitary_synthesis_plugin_config,
151
151
  pass_manager_config.hls_config,
152
152
  )
153
- init.append(ElidePermutations())
153
+ if pass_manager_config.routing_method != "none":
154
+ init.append(ElidePermutations())
154
155
  init.append(RemoveDiagonalGatesBeforeMeasure())
155
156
  init.append(
156
157
  InverseCancellation(
@@ -58,23 +58,12 @@ def pass_manager_drawer(pass_manager, filename=None, style=None, raw=False):
58
58
  Example:
59
59
  .. code-block::
60
60
 
61
- %matplotlib inline
62
61
  from qiskit import QuantumCircuit
63
- from qiskit.compiler import transpile
64
- from qiskit.transpiler import PassManager
62
+ from qiskit.transpiler import generate_preset_pass_manager
65
63
  from qiskit.visualization import pass_manager_drawer
66
- from qiskit.transpiler.passes import Unroller
67
64
 
68
- circ = QuantumCircuit(3)
69
- circ.ccx(0, 1, 2)
70
- circ.draw()
71
-
72
- pass_ = Unroller(['u1', 'u2', 'u3', 'cx'])
73
- pm = PassManager(pass_)
74
- new_circ = pm.run(circ)
75
- new_circ.draw(output='mpl')
76
-
77
- pass_manager_drawer(pm, "passmanager.jpg")
65
+ pm = generate_preset_pass_manager(optimization_level=0)
66
+ pass_manager_drawer(pm)
78
67
  """
79
68
  import pydot
80
69
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: qiskit
3
- Version: 1.2.1
3
+ Version: 1.2.2
4
4
  Summary: An open-source SDK for working with quantum computers at the level of extended quantum circuits, operators, and primitives.
5
5
  Author-email: Qiskit Development Team <qiskit@us.ibm.com>
6
6
  License: Apache 2.0