qiskit 1.3.0rc2__cp39-abi3-win32.whl → 1.3.2__cp39-abi3-win32.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 +1 -1
- qiskit/_accelerate.pyd +0 -0
- qiskit/circuit/__init__.py +2 -0
- qiskit/circuit/add_control.py +110 -92
- qiskit/circuit/controlledgate.py +2 -0
- qiskit/circuit/library/__init__.py +1 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +25 -0
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +1 -1
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +9 -0
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +1 -0
- qiskit/circuit/library/basis_change/qft.py +3 -0
- qiskit/circuit/library/boolean_logic/inner_product.py +2 -0
- qiskit/circuit/library/boolean_logic/quantum_and.py +4 -0
- qiskit/circuit/library/boolean_logic/quantum_or.py +4 -0
- qiskit/circuit/library/boolean_logic/quantum_xor.py +2 -0
- qiskit/circuit/library/fourier_checking.py +2 -0
- qiskit/circuit/library/generalized_gates/gms.py +1 -0
- qiskit/circuit/library/generalized_gates/gr.py +4 -0
- qiskit/circuit/library/generalized_gates/mcmt.py +1 -0
- qiskit/circuit/library/generalized_gates/permutation.py +5 -1
- qiskit/circuit/library/generalized_gates/unitary.py +1 -1
- qiskit/circuit/library/graph_state.py +2 -0
- qiskit/circuit/library/grover_operator.py +7 -3
- qiskit/circuit/library/hidden_linear_function.py +2 -0
- qiskit/circuit/library/iqp.py +5 -0
- qiskit/circuit/library/n_local/efficient_su2.py +7 -2
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +3 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +14 -8
- qiskit/circuit/library/n_local/n_local.py +10 -5
- qiskit/circuit/library/n_local/pauli_two_design.py +5 -2
- qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -0
- qiskit/circuit/library/n_local/real_amplitudes.py +10 -4
- qiskit/circuit/library/overlap.py +1 -0
- qiskit/circuit/library/phase_estimation.py +2 -0
- qiskit/circuit/library/quantum_volume.py +3 -0
- qiskit/circuit/operation.py +1 -0
- qiskit/circuit/parameter.py +1 -0
- qiskit/circuit/parameterexpression.py +1 -1
- qiskit/circuit/quantumcircuit.py +13 -19
- qiskit/circuit/random/utils.py +2 -0
- qiskit/converters/dag_to_circuit.py +1 -0
- qiskit/primitives/statevector_estimator.py +1 -0
- qiskit/providers/fake_provider/__init__.py +1 -0
- qiskit/pulse/builder.py +8 -0
- qiskit/pulse/library/symbolic_pulses.py +1 -0
- qiskit/qasm2/export.py +2 -2
- qiskit/qasm3/__init__.py +1 -0
- qiskit/qasm3/exporter.py +6 -3
- qiskit/qpy/__init__.py +5 -5
- qiskit/quantum_info/operators/channel/chi.py +9 -9
- qiskit/quantum_info/operators/channel/choi.py +9 -9
- qiskit/quantum_info/operators/channel/ptm.py +9 -9
- qiskit/quantum_info/operators/channel/quantum_channel.py +3 -3
- qiskit/quantum_info/operators/channel/stinespring.py +9 -9
- qiskit/quantum_info/operators/channel/superop.py +5 -9
- qiskit/quantum_info/operators/symplectic/pauli_list.py +8 -8
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +10 -1
- qiskit/quantum_info/states/densitymatrix.py +17 -15
- qiskit/quantum_info/states/stabilizerstate.py +7 -6
- qiskit/quantum_info/states/statevector.py +15 -6
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -0
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -0
- qiskit/synthesis/evolution/product_formula.py +0 -6
- qiskit/synthesis/evolution/suzuki_trotter.py +22 -5
- qiskit/transpiler/__init__.py +22 -1
- qiskit/transpiler/layout.py +3 -0
- qiskit/transpiler/passes/basis/decompose.py +24 -4
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +2 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +1 -0
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +1 -0
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +1 -0
- qiskit/transpiler/passes/synthesis/hls_plugins.py +137 -30
- qiskit/transpiler/passes/utils/filter_op_nodes.py +2 -1
- qiskit/transpiler/passes/utils/remove_barriers.py +1 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +5 -5
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +19 -22
- qiskit/transpiler/target.py +1 -1
- qiskit/visualization/__init__.py +6 -0
- qiskit/visualization/circuit/circuit_visualization.py +1 -0
- qiskit/visualization/counts_visualization.py +2 -0
- qiskit/visualization/dag_visualization.py +1 -0
- qiskit/visualization/gate_map.py +7 -3
- qiskit/visualization/pulse_v2/interface.py +4 -1
- qiskit/visualization/state_visualization.py +13 -2
- qiskit/visualization/timeline/interface.py +6 -3
- {qiskit-1.3.0rc2.dist-info → qiskit-1.3.2.dist-info}/METADATA +26 -26
- {qiskit-1.3.0rc2.dist-info → qiskit-1.3.2.dist-info}/RECORD +93 -93
- {qiskit-1.3.0rc2.dist-info → qiskit-1.3.2.dist-info}/WHEEL +1 -1
- {qiskit-1.3.0rc2.dist-info → qiskit-1.3.2.dist-info}/entry_points.txt +1 -1
- {qiskit-1.3.0rc2.dist-info → qiskit-1.3.2.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.3.0rc2.dist-info → qiskit-1.3.2.dist-info}/top_level.txt +0 -0
qiskit/transpiler/__init__.py
CHANGED
@@ -33,6 +33,8 @@ branches, and other complex behaviors. That being said, the standard
|
|
33
33
|
compilation flow follows the structure given below:
|
34
34
|
|
35
35
|
.. image:: /source_images/transpiling_core_steps.png
|
36
|
+
:alt: The transpilation process takes the input circuit, applies the transpilation \
|
37
|
+
passes, then produces the output circuit.
|
36
38
|
|
37
39
|
.. raw:: html
|
38
40
|
|
@@ -331,7 +333,8 @@ example 3 qubit :class:`~.Target` above:
|
|
331
333
|
|
332
334
|
.. plot::
|
333
335
|
:include-source:
|
334
|
-
|
336
|
+
:alt: Output from the previous code.
|
337
|
+
|
335
338
|
from qiskit.circuit import Parameter, Measure
|
336
339
|
from qiskit.transpiler import Target, InstructionProperties
|
337
340
|
from qiskit.circuit.library import UGate, RZGate, RXGate, RYGate, CXGate, CZGate
|
@@ -390,6 +393,7 @@ see the individual connectivity, you can pass the operation name to
|
|
390
393
|
:meth:`.CouplingMap.build_coupling_map`:
|
391
394
|
|
392
395
|
.. plot::
|
396
|
+
:alt: Output from the previous code.
|
393
397
|
:include-source:
|
394
398
|
|
395
399
|
from qiskit.circuit import Parameter, Measure
|
@@ -445,6 +449,7 @@ see the individual connectivity, you can pass the operation name to
|
|
445
449
|
target.build_coupling_map('cx').draw()
|
446
450
|
|
447
451
|
.. plot::
|
452
|
+
:alt: Output from the previous code.
|
448
453
|
:include-source:
|
449
454
|
|
450
455
|
from qiskit.circuit import Parameter, Measure
|
@@ -532,6 +537,7 @@ Every quantum circuit run on the target device must be expressed using only thes
|
|
532
537
|
For example, to run a simple phase estimation circuit:
|
533
538
|
|
534
539
|
.. plot::
|
540
|
+
:alt: Circuit diagram output by the previous code.
|
535
541
|
:include-source:
|
536
542
|
|
537
543
|
import numpy as np
|
@@ -557,6 +563,7 @@ the target IBM Quantum device (the :class:`~.GenericBackendV2` class generates
|
|
557
563
|
a fake backend with a specified number of qubits for test purposes):
|
558
564
|
|
559
565
|
.. plot::
|
566
|
+
:alt: Circuit diagram output by the previous code.
|
560
567
|
:include-source:
|
561
568
|
|
562
569
|
from qiskit import transpile
|
@@ -608,6 +615,7 @@ It is important to highlight two special cases:
|
|
608
615
|
['id', 'rz', 'sx', 'x', 'cx', 'measure', 'delay']
|
609
616
|
|
610
617
|
.. plot:
|
618
|
+
:alt: Circuit diagram output by the previous code.
|
611
619
|
:include-source:
|
612
620
|
|
613
621
|
from qiskit.circuit import QuantumCircuit
|
@@ -628,6 +636,7 @@ It is important to highlight two special cases:
|
|
628
636
|
this gate must be decomposed. This decomposition is quite costly:
|
629
637
|
|
630
638
|
.. plot::
|
639
|
+
:alt: Circuit diagram output by the previous code.
|
631
640
|
:include-source:
|
632
641
|
|
633
642
|
from qiskit.circuit import QuantumCircuit
|
@@ -653,6 +662,7 @@ qubits used in computations. We need to be able to map these virtual qubits in
|
|
653
662
|
manner to the "physical" qubits in an actual quantum device.
|
654
663
|
|
655
664
|
.. image:: /source_images/mapping.png
|
665
|
+
:alt: Diagram illustrating how virtual qubits are mapped to physical qubits.
|
656
666
|
|
657
667
|
|
658
668
|
By default, qiskit will do this mapping for you. The choice of mapping depends on the
|
@@ -700,6 +710,7 @@ and we can view this layout selection graphically using
|
|
700
710
|
:func:`qiskit.visualization.plot_circuit_layout`:
|
701
711
|
|
702
712
|
.. plot::
|
713
|
+
:alt: Circuit diagram output by the previous code.
|
703
714
|
:include-source:
|
704
715
|
|
705
716
|
from qiskit import QuantumCircuit, transpile
|
@@ -718,6 +729,7 @@ and we can view this layout selection graphically using
|
|
718
729
|
- **Layout Using Optimization Level 0**
|
719
730
|
|
720
731
|
.. plot::
|
732
|
+
:alt: Output from the previous code.
|
721
733
|
:include-source:
|
722
734
|
|
723
735
|
from qiskit import QuantumCircuit, transpile
|
@@ -737,6 +749,7 @@ and we can view this layout selection graphically using
|
|
737
749
|
- **Layout Using Optimization Level 3**
|
738
750
|
|
739
751
|
.. plot::
|
752
|
+
:alt: Output from the previous code.
|
740
753
|
:include-source:
|
741
754
|
|
742
755
|
from qiskit import QuantumCircuit, transpile
|
@@ -760,6 +773,7 @@ keyword argument, where the index labels the virtual qubit in the circuit and th
|
|
760
773
|
corresponding value is the label for the physical qubit to map onto:
|
761
774
|
|
762
775
|
.. plot::
|
776
|
+
:alt: Output from the previous code.
|
763
777
|
:include-source:
|
764
778
|
|
765
779
|
from qiskit import QuantumCircuit, transpile
|
@@ -807,6 +821,7 @@ In order to highlight this, we run a GHZ circuit 100 times, using a "bad" (disco
|
|
807
821
|
``initial_layout`` in a heavy hex coupling map:
|
808
822
|
|
809
823
|
.. plot::
|
824
|
+
:alt: Diagram illustrating the previously described circuit.
|
810
825
|
|
811
826
|
from qiskit import QuantumCircuit, transpile
|
812
827
|
|
@@ -816,6 +831,7 @@ In order to highlight this, we run a GHZ circuit 100 times, using a "bad" (disco
|
|
816
831
|
ghz.draw(output='mpl')
|
817
832
|
|
818
833
|
.. plot::
|
834
|
+
:alt: Output from the previous code.
|
819
835
|
:include-source:
|
820
836
|
|
821
837
|
import matplotlib.pyplot as plt
|
@@ -888,6 +904,7 @@ setting the optimization level higher:
|
|
888
904
|
|
889
905
|
|
890
906
|
.. plot::
|
907
|
+
:alt: Diagram illustrating the previously described circuit.
|
891
908
|
|
892
909
|
import matplotlib.pyplot as plt
|
893
910
|
from qiskit import QuantumCircuit, transpile
|
@@ -900,6 +917,7 @@ setting the optimization level higher:
|
|
900
917
|
ghz.draw(output='mpl')
|
901
918
|
|
902
919
|
.. plot::
|
920
|
+
:alt: Output from the previous code.
|
903
921
|
:include-source:
|
904
922
|
|
905
923
|
import matplotlib.pyplot as plt
|
@@ -946,6 +964,7 @@ for idle time on the qubits between the execution of instructions. For example,
|
|
946
964
|
circuit such as:
|
947
965
|
|
948
966
|
.. plot::
|
967
|
+
:alt: Diagram illustrating the previously described circuit.
|
949
968
|
|
950
969
|
from qiskit import QuantumCircuit
|
951
970
|
|
@@ -957,6 +976,7 @@ circuit such as:
|
|
957
976
|
we can then call :func:`~.transpile` on it with ``scheduling_method`` set:
|
958
977
|
|
959
978
|
.. plot::
|
979
|
+
:alt: Circuit diagram output by the previous code.
|
960
980
|
:include-source:
|
961
981
|
|
962
982
|
from qiskit import QuantumCircuit, transpile
|
@@ -976,6 +996,7 @@ account for idle time on each qubit. To get a better idea of the timing of the c
|
|
976
996
|
also look at it with the :func:`.timeline.draw` function:
|
977
997
|
|
978
998
|
.. plot::
|
999
|
+
:alt: Output from circuit timeline drawer.
|
979
1000
|
|
980
1001
|
from qiskit.visualization.timeline import draw as timeline_draw
|
981
1002
|
|
qiskit/transpiler/layout.py
CHANGED
@@ -455,6 +455,7 @@ class TranspileLayout:
|
|
455
455
|
let the input circuit be:
|
456
456
|
|
457
457
|
.. plot::
|
458
|
+
:alt: Circuit diagram output by the previous code.
|
458
459
|
:include-source:
|
459
460
|
|
460
461
|
from qiskit.circuit import QuantumCircuit, QuantumRegister
|
@@ -470,6 +471,7 @@ class TranspileLayout:
|
|
470
471
|
Suppose that during the layout stage the transpiler reorders the qubits to be:
|
471
472
|
|
472
473
|
.. plot::
|
474
|
+
:alt: Circuit diagram output by the previous code.
|
473
475
|
:include-source:
|
474
476
|
|
475
477
|
from qiskit import QuantumCircuit
|
@@ -498,6 +500,7 @@ class TranspileLayout:
|
|
498
500
|
becomes:
|
499
501
|
|
500
502
|
.. plot::
|
503
|
+
:alt: Circuit diagram output by the previous code.
|
501
504
|
:include-source:
|
502
505
|
|
503
506
|
from qiskit import QuantumCircuit
|
@@ -17,8 +17,10 @@ from __future__ import annotations
|
|
17
17
|
from collections.abc import Sequence
|
18
18
|
from typing import Type
|
19
19
|
from fnmatch import fnmatch
|
20
|
+
import warnings
|
20
21
|
|
21
22
|
from qiskit.transpiler.basepasses import TransformationPass
|
23
|
+
from qiskit.transpiler.passes.utils import control_flow
|
22
24
|
from qiskit.dagcircuit.dagnode import DAGOpNode
|
23
25
|
from qiskit.dagcircuit.dagcircuit import DAGCircuit
|
24
26
|
from qiskit.converters.circuit_to_dag import circuit_to_dag
|
@@ -58,7 +60,7 @@ class Decompose(TransformationPass):
|
|
58
60
|
output dag where ``gate`` was expanded.
|
59
61
|
"""
|
60
62
|
# We might use HLS to synthesize objects that do not have a definition
|
61
|
-
hls = HighLevelSynthesis() if self.apply_synthesis else None
|
63
|
+
hls = HighLevelSynthesis(qubits_initially_zero=False) if self.apply_synthesis else None
|
62
64
|
|
63
65
|
# Walk through the DAG and expand each non-basis node
|
64
66
|
for node in dag.op_nodes():
|
@@ -66,12 +68,18 @@ class Decompose(TransformationPass):
|
|
66
68
|
if not self._should_decompose(node):
|
67
69
|
continue
|
68
70
|
|
69
|
-
if
|
71
|
+
if node.is_control_flow():
|
72
|
+
decomposition = control_flow.map_blocks(self.run, node.op)
|
73
|
+
dag.substitute_node(node, decomposition, inplace=True)
|
74
|
+
|
75
|
+
elif getattr(node.op, "definition", None) is None:
|
70
76
|
# if we try to synthesize, turn the node into a DAGCircuit and run HLS
|
71
77
|
if self.apply_synthesis:
|
78
|
+
# note that node_as_dag does not include the condition, which will
|
79
|
+
# be propagated in ``substitute_node_with_dag``
|
72
80
|
node_as_dag = _node_to_dag(node)
|
73
81
|
synthesized = hls.run(node_as_dag)
|
74
|
-
dag.substitute_node_with_dag(node, synthesized)
|
82
|
+
dag.substitute_node_with_dag(node, synthesized, propagate_condition=True)
|
75
83
|
|
76
84
|
# else: no definition and synthesis not enabled, so we do nothing
|
77
85
|
else:
|
@@ -123,9 +131,21 @@ class Decompose(TransformationPass):
|
|
123
131
|
|
124
132
|
|
125
133
|
def _node_to_dag(node: DAGOpNode) -> DAGCircuit:
|
134
|
+
# Control flow is already handled separately, however that does not capture
|
135
|
+
# c_if, which we are treating here. We explicitly ignore the condition attribute,
|
136
|
+
# which will be handled by ``substitute_node_with_dag``, so we create a copy of the node
|
137
|
+
# and set the condition to None. Once ``c_if`` is removed for 2.0, this block can go, too.
|
138
|
+
with warnings.catch_warnings():
|
139
|
+
warnings.filterwarnings("ignore", category=DeprecationWarning)
|
140
|
+
if getattr(node.op, "condition", None) is not None:
|
141
|
+
op = node.op.copy()
|
142
|
+
op.condition = None
|
143
|
+
node = DAGOpNode(op, node.qargs, node.cargs)
|
144
|
+
|
145
|
+
# create new dag and apply the operation
|
126
146
|
dag = DAGCircuit()
|
127
147
|
dag.add_qubits(node.qargs)
|
128
148
|
dag.add_clbits(node.cargs)
|
129
|
-
|
130
149
|
dag.apply_operation_back(node.op, node.qargs, node.cargs)
|
150
|
+
|
131
151
|
return dag
|
@@ -19,6 +19,7 @@ from qiskit.circuit import Gate
|
|
19
19
|
from qiskit.dagcircuit import DAGCircuit
|
20
20
|
from qiskit.transpiler.basepasses import TransformationPass
|
21
21
|
from qiskit.transpiler.exceptions import TranspilerError
|
22
|
+
from qiskit.transpiler.passes.utils import control_flow
|
22
23
|
|
23
24
|
from qiskit._accelerate.inverse_cancellation import inverse_cancellation
|
24
25
|
|
@@ -74,6 +75,7 @@ class InverseCancellation(TransformationPass):
|
|
74
75
|
|
75
76
|
super().__init__()
|
76
77
|
|
78
|
+
@control_flow.trivial_recurse
|
77
79
|
def run(self, dag: DAGCircuit):
|
78
80
|
"""Run the InverseCancellation pass on `dag`.
|
79
81
|
|