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/VERSION.txt
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.3.
|
1
|
+
1.3.2
|
qiskit/_accelerate.pyd
CHANGED
Binary file
|
qiskit/circuit/__init__.py
CHANGED
@@ -64,6 +64,7 @@ defined as:
|
|
64
64
|
|
65
65
|
|
66
66
|
.. plot::
|
67
|
+
:alt: Circuit diagram output by the previous code.
|
67
68
|
:include-source:
|
68
69
|
|
69
70
|
from qiskit import QuantumCircuit
|
@@ -1140,6 +1141,7 @@ If we draw this circuit, we will see that Qiskit places the zeroth qubit on the
|
|
1140
1141
|
drawing:
|
1141
1142
|
|
1142
1143
|
.. plot::
|
1144
|
+
:alt: Circuit diagram output by the previous code.
|
1143
1145
|
:include-source:
|
1144
1146
|
:context:
|
1145
1147
|
:show-source-link: False
|
qiskit/circuit/add_control.py
CHANGED
@@ -13,6 +13,7 @@
|
|
13
13
|
"""Add control to operation if supported."""
|
14
14
|
from __future__ import annotations
|
15
15
|
|
16
|
+
from math import pi
|
16
17
|
from qiskit.circuit.exceptions import CircuitError
|
17
18
|
from qiskit.circuit.library import UnitaryGate
|
18
19
|
from qiskit.transpiler import PassManager
|
@@ -92,7 +93,6 @@ def control(
|
|
92
93
|
Raises:
|
93
94
|
CircuitError: gate contains non-gate in definition
|
94
95
|
"""
|
95
|
-
from math import pi
|
96
96
|
|
97
97
|
# pylint: disable=cyclic-import
|
98
98
|
from qiskit.circuit import controlledgate
|
@@ -101,22 +101,23 @@ def control(
|
|
101
101
|
|
102
102
|
q_control = QuantumRegister(num_ctrl_qubits, name="control")
|
103
103
|
q_target = QuantumRegister(operation.num_qubits, name="target")
|
104
|
-
q_ancillae = None # TODO: add
|
105
104
|
controlled_circ = QuantumCircuit(q_control, q_target, name=f"c_{operation.name}")
|
106
105
|
if isinstance(operation, controlledgate.ControlledGate):
|
107
106
|
original_ctrl_state = operation.ctrl_state
|
107
|
+
operation = operation.to_mutable()
|
108
|
+
operation.ctrl_state = None
|
109
|
+
|
108
110
|
global_phase = 0
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
global_phase += operation.definition.global_phase
|
111
|
+
|
112
|
+
basis = ["p", "u", "x", "z", "rx", "ry", "rz", "cx"]
|
113
|
+
|
114
|
+
if operation.name in basis:
|
115
|
+
apply_basic_controlled_gate(controlled_circ, operation, q_control, q_target[0])
|
115
116
|
else:
|
116
|
-
basis = ["p", "u", "x", "z", "rx", "ry", "rz", "cx"]
|
117
117
|
if isinstance(operation, controlledgate.ControlledGate):
|
118
118
|
operation = operation.to_mutable()
|
119
119
|
operation.ctrl_state = None
|
120
|
+
|
120
121
|
unrolled_gate = _unroll_gate(operation, basis_gates=basis)
|
121
122
|
if unrolled_gate.definition.global_phase:
|
122
123
|
global_phase += unrolled_gate.definition.global_phase
|
@@ -130,87 +131,17 @@ def control(
|
|
130
131
|
|
131
132
|
for instruction in definition.data:
|
132
133
|
gate, qargs = instruction.operation, instruction.qubits
|
133
|
-
if gate.name == "x":
|
134
|
-
controlled_circ.mcx(q_control, q_target[bit_indices[qargs[0]]], q_ancillae)
|
135
|
-
elif gate.name == "rx":
|
136
|
-
controlled_circ.mcrx(
|
137
|
-
gate.definition.data[0].operation.params[0],
|
138
|
-
q_control,
|
139
|
-
q_target[bit_indices[qargs[0]]],
|
140
|
-
use_basis_gates=False,
|
141
|
-
)
|
142
|
-
elif gate.name == "ry":
|
143
|
-
controlled_circ.mcry(
|
144
|
-
gate.definition.data[0].operation.params[0],
|
145
|
-
q_control,
|
146
|
-
q_target[bit_indices[qargs[0]]],
|
147
|
-
q_ancillae,
|
148
|
-
mode="noancilla",
|
149
|
-
use_basis_gates=False,
|
150
|
-
)
|
151
|
-
elif gate.name == "rz":
|
152
|
-
controlled_circ.mcrz(
|
153
|
-
gate.definition.data[0].operation.params[0],
|
154
|
-
q_control,
|
155
|
-
q_target[bit_indices[qargs[0]]],
|
156
|
-
use_basis_gates=False,
|
157
|
-
)
|
158
|
-
continue
|
159
|
-
elif gate.name == "p":
|
160
|
-
from qiskit.circuit.library import MCPhaseGate
|
161
134
|
|
162
|
-
|
163
|
-
|
164
|
-
q_control[:] + [q_target[bit_indices[qargs[0]]]],
|
165
|
-
)
|
166
|
-
elif gate.name == "cx":
|
167
|
-
controlled_circ.mcx(
|
168
|
-
q_control[:] + [q_target[bit_indices[qargs[0]]]],
|
169
|
-
q_target[bit_indices[qargs[1]]],
|
170
|
-
q_ancillae,
|
171
|
-
)
|
172
|
-
elif gate.name == "u":
|
173
|
-
theta, phi, lamb = gate.params
|
174
|
-
if num_ctrl_qubits == 1:
|
175
|
-
if theta == 0 and phi == 0:
|
176
|
-
controlled_circ.cp(lamb, q_control[0], q_target[bit_indices[qargs[0]]])
|
177
|
-
else:
|
178
|
-
controlled_circ.cu(
|
179
|
-
theta, phi, lamb, 0, q_control[0], q_target[bit_indices[qargs[0]]]
|
180
|
-
)
|
181
|
-
else:
|
182
|
-
if phi == -pi / 2 and lamb == pi / 2:
|
183
|
-
controlled_circ.mcrx(
|
184
|
-
theta, q_control, q_target[bit_indices[qargs[0]]], use_basis_gates=True
|
185
|
-
)
|
186
|
-
elif phi == 0 and lamb == 0:
|
187
|
-
controlled_circ.mcry(
|
188
|
-
theta,
|
189
|
-
q_control,
|
190
|
-
q_target[bit_indices[qargs[0]]],
|
191
|
-
q_ancillae,
|
192
|
-
use_basis_gates=True,
|
193
|
-
)
|
194
|
-
elif theta == 0 and phi == 0:
|
195
|
-
controlled_circ.mcp(lamb, q_control, q_target[bit_indices[qargs[0]]])
|
196
|
-
else:
|
197
|
-
controlled_circ.mcp(lamb, q_control, q_target[bit_indices[qargs[0]]])
|
198
|
-
controlled_circ.mcry(
|
199
|
-
theta,
|
200
|
-
q_control,
|
201
|
-
q_target[bit_indices[qargs[0]]],
|
202
|
-
q_ancillae,
|
203
|
-
use_basis_gates=True,
|
204
|
-
)
|
205
|
-
controlled_circ.mcp(phi, q_control, q_target[bit_indices[qargs[0]]])
|
206
|
-
elif gate.name == "z":
|
207
|
-
controlled_circ.h(q_target[bit_indices[qargs[0]]])
|
208
|
-
controlled_circ.mcx(q_control, q_target[bit_indices[qargs[0]]], q_ancillae)
|
209
|
-
controlled_circ.h(q_target[bit_indices[qargs[0]]])
|
135
|
+
if len(qargs) == 1:
|
136
|
+
target = q_target[bit_indices[qargs[0]]]
|
210
137
|
else:
|
211
|
-
|
212
|
-
|
138
|
+
target = [q_target[bit_indices[qarg]] for qarg in qargs]
|
139
|
+
|
140
|
+
apply_basic_controlled_gate(controlled_circ, gate, q_control, target)
|
141
|
+
|
142
|
+
if gate.definition is not None and gate.definition.global_phase and gate.name != "rz":
|
213
143
|
global_phase += gate.definition.global_phase
|
144
|
+
|
214
145
|
# apply controlled global phase
|
215
146
|
if global_phase:
|
216
147
|
if len(q_control) < 2:
|
@@ -228,6 +159,7 @@ def control(
|
|
228
159
|
new_ctrl_state = ctrl_state
|
229
160
|
base_name = operation.name
|
230
161
|
base_gate = operation
|
162
|
+
|
231
163
|
# In order to maintain some backward compatibility with gate names this
|
232
164
|
# uses a naming convention where if the number of controls is <=2 the gate
|
233
165
|
# is named like "cc<base_gate.name>", else it is named like
|
@@ -250,15 +182,101 @@ def control(
|
|
250
182
|
return cgate
|
251
183
|
|
252
184
|
|
185
|
+
def apply_basic_controlled_gate(circuit, gate, controls, target):
|
186
|
+
"""Apply a controlled version of ``gate`` to the circuit.
|
187
|
+
|
188
|
+
This implements multi-control operations for the following basis gates:
|
189
|
+
|
190
|
+
["p", "u", "x", "z", "rx", "ry", "rz", "cx"]
|
191
|
+
|
192
|
+
"""
|
193
|
+
num_ctrl_qubits = len(controls)
|
194
|
+
|
195
|
+
if gate.name == "x":
|
196
|
+
circuit.mcx(controls, target)
|
197
|
+
|
198
|
+
elif gate.name == "rx":
|
199
|
+
circuit.mcrx(
|
200
|
+
gate.definition.data[0].operation.params[0],
|
201
|
+
controls,
|
202
|
+
target,
|
203
|
+
use_basis_gates=False,
|
204
|
+
)
|
205
|
+
elif gate.name == "ry":
|
206
|
+
circuit.mcry(
|
207
|
+
gate.definition.data[0].operation.params[0],
|
208
|
+
controls,
|
209
|
+
target,
|
210
|
+
mode="noancilla",
|
211
|
+
use_basis_gates=False,
|
212
|
+
)
|
213
|
+
elif gate.name == "rz":
|
214
|
+
circuit.mcrz(
|
215
|
+
gate.definition.data[0].operation.params[0],
|
216
|
+
controls,
|
217
|
+
target,
|
218
|
+
use_basis_gates=False,
|
219
|
+
)
|
220
|
+
# continue
|
221
|
+
elif gate.name == "p":
|
222
|
+
from qiskit.circuit.library import MCPhaseGate
|
223
|
+
|
224
|
+
circuit.append(
|
225
|
+
MCPhaseGate(gate.params[0], num_ctrl_qubits),
|
226
|
+
controls[:] + [target],
|
227
|
+
)
|
228
|
+
elif gate.name == "cx":
|
229
|
+
circuit.mcx(
|
230
|
+
controls[:] + [target[0]], # CX has two targets
|
231
|
+
target[1],
|
232
|
+
)
|
233
|
+
elif gate.name == "u":
|
234
|
+
theta, phi, lamb = gate.params
|
235
|
+
if num_ctrl_qubits == 1:
|
236
|
+
if theta == 0 and phi == 0:
|
237
|
+
circuit.cp(lamb, controls[0], target)
|
238
|
+
else:
|
239
|
+
circuit.cu(theta, phi, lamb, 0, controls[0], target)
|
240
|
+
else:
|
241
|
+
if phi == -pi / 2 and lamb == pi / 2:
|
242
|
+
circuit.mcrx(theta, controls, target, use_basis_gates=True)
|
243
|
+
elif phi == 0 and lamb == 0:
|
244
|
+
circuit.mcry(
|
245
|
+
theta,
|
246
|
+
controls,
|
247
|
+
target,
|
248
|
+
use_basis_gates=True,
|
249
|
+
)
|
250
|
+
elif theta == 0 and phi == 0:
|
251
|
+
circuit.mcp(lamb, controls, target)
|
252
|
+
else:
|
253
|
+
circuit.mcp(lamb, controls, target)
|
254
|
+
circuit.mcry(
|
255
|
+
theta,
|
256
|
+
controls,
|
257
|
+
target,
|
258
|
+
use_basis_gates=True,
|
259
|
+
)
|
260
|
+
circuit.mcp(phi, controls, target)
|
261
|
+
|
262
|
+
elif gate.name == "z":
|
263
|
+
circuit.h(target)
|
264
|
+
circuit.mcx(controls, target)
|
265
|
+
circuit.h(target)
|
266
|
+
|
267
|
+
else:
|
268
|
+
raise CircuitError(f"Gate {gate} not in supported basis.")
|
269
|
+
|
270
|
+
|
253
271
|
def _gate_to_circuit(operation):
|
254
272
|
"""Converts a gate instance to a QuantumCircuit"""
|
255
273
|
if hasattr(operation, "definition") and operation.definition is not None:
|
256
274
|
return operation.definition
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
275
|
+
|
276
|
+
qr = QuantumRegister(operation.num_qubits)
|
277
|
+
qc = QuantumCircuit(qr, name=operation.name)
|
278
|
+
qc.append(operation, qr)
|
279
|
+
return qc
|
262
280
|
|
263
281
|
|
264
282
|
def _unroll_gate(operation, basis_gates):
|
qiskit/circuit/controlledgate.py
CHANGED
@@ -70,6 +70,7 @@ class ControlledGate(Gate):
|
|
70
70
|
Create a controlled standard gate and apply it to a circuit.
|
71
71
|
|
72
72
|
.. plot::
|
73
|
+
:alt: Circuit diagram output by the previous code.
|
73
74
|
:include-source:
|
74
75
|
|
75
76
|
from qiskit import QuantumCircuit, QuantumRegister
|
@@ -84,6 +85,7 @@ class ControlledGate(Gate):
|
|
84
85
|
Create a controlled custom gate and apply it to a circuit.
|
85
86
|
|
86
87
|
.. plot::
|
88
|
+
:alt: Circuit diagram output by the previous code.
|
87
89
|
:include-source:
|
88
90
|
|
89
91
|
from qiskit import QuantumCircuit, QuantumRegister
|
@@ -26,6 +26,7 @@ method and so the circuit library allows users to program at higher levels of ab
|
|
26
26
|
For example, to append a multi-controlled CNOT:
|
27
27
|
|
28
28
|
.. plot::
|
29
|
+
:alt: Circuit diagram output by the previous code.
|
29
30
|
:include-source:
|
30
31
|
|
31
32
|
from qiskit.circuit.library import MCXGate
|
@@ -116,6 +116,15 @@ class HalfAdderGate(Gate):
|
|
116
116
|
"""
|
117
117
|
return self._num_state_qubits
|
118
118
|
|
119
|
+
def _define(self):
|
120
|
+
"""Populates self.definition with some decomposition of this gate."""
|
121
|
+
from qiskit.synthesis.arithmetic import adder_qft_d00
|
122
|
+
|
123
|
+
# This particular decomposition does not use any ancilla qubits.
|
124
|
+
# Note that the transpiler may choose a different decomposition
|
125
|
+
# based on the number of ancilla qubits available.
|
126
|
+
self.definition = adder_qft_d00(self.num_state_qubits, kind="half")
|
127
|
+
|
119
128
|
|
120
129
|
class ModularAdderGate(Gate):
|
121
130
|
r"""Compute the sum modulo :math:`2^n` of two :math:`n`-sized qubit registers.
|
@@ -162,6 +171,15 @@ class ModularAdderGate(Gate):
|
|
162
171
|
"""
|
163
172
|
return self._num_state_qubits
|
164
173
|
|
174
|
+
def _define(self):
|
175
|
+
"""Populates self.definition with some decomposition of this gate."""
|
176
|
+
from qiskit.synthesis.arithmetic import adder_qft_d00
|
177
|
+
|
178
|
+
# This particular decomposition does not use any ancilla qubits.
|
179
|
+
# Note that the transpiler may choose a different decomposition
|
180
|
+
# based on the number of ancilla qubits available.
|
181
|
+
self.definition = adder_qft_d00(self.num_state_qubits, kind="fixed")
|
182
|
+
|
165
183
|
|
166
184
|
class FullAdderGate(Gate):
|
167
185
|
r"""Compute the sum of two :math:`n`-sized qubit registers, including carry-in and -out bits.
|
@@ -208,3 +226,10 @@ class FullAdderGate(Gate):
|
|
208
226
|
The number of state qubits.
|
209
227
|
"""
|
210
228
|
return self._num_state_qubits
|
229
|
+
|
230
|
+
def _define(self):
|
231
|
+
"""Populates self.definition with a decomposition of this gate."""
|
232
|
+
from qiskit.synthesis.arithmetic import adder_ripple_c04
|
233
|
+
|
234
|
+
# In the case of a full adder, this method does not use any ancilla qubits
|
235
|
+
self.definition = adder_ripple_c04(self.num_state_qubits, kind="full")
|
@@ -84,7 +84,7 @@ class CDKMRippleCarryAdder(Adder):
|
|
84
84
|
:class:`.ModularAdderGate`: A generic inplace adder, modulo :math:`2^n`. This
|
85
85
|
is functionally equivalent to ``kind="fixed"``.
|
86
86
|
|
87
|
-
:class:`.
|
87
|
+
:class:`.HalfAdderGate`: A generic inplace adder. This
|
88
88
|
is functionally equivalent to ``kind="half"``.
|
89
89
|
|
90
90
|
:class:`.FullAdderGate`: A generic inplace adder, with a carry-in bit. This
|
@@ -54,7 +54,7 @@ class DraperQFTAdder(Adder):
|
|
54
54
|
:class:`.ModularAdderGate`: A generic inplace adder, modulo :math:`2^n`. This
|
55
55
|
is functionally equivalent to ``kind="fixed"``.
|
56
56
|
|
57
|
-
:class:`.
|
57
|
+
:class:`.HalfAdderGate`: A generic inplace adder. This
|
58
58
|
is functionally equivalent to ``kind="half"``.
|
59
59
|
|
60
60
|
**References:**
|
@@ -60,7 +60,7 @@ class VBERippleCarryAdder(Adder):
|
|
60
60
|
:class:`.ModularAdderGate`: A generic inplace adder, modulo :math:`2^n`. This
|
61
61
|
is functionally equivalent to ``kind="fixed"``.
|
62
62
|
|
63
|
-
:class:`.
|
63
|
+
:class:`.HalfAdderGate`: A generic inplace adder. This
|
64
64
|
is functionally equivalent to ``kind="half"``.
|
65
65
|
|
66
66
|
:class:`.FullAdderGate`: A generic inplace adder, with a carry-in bit. This
|
@@ -190,3 +190,12 @@ class MultiplierGate(Gate):
|
|
190
190
|
The number of result qubits.
|
191
191
|
"""
|
192
192
|
return self._num_result_qubits
|
193
|
+
|
194
|
+
def _define(self):
|
195
|
+
"""Populates self.definition with some decomposition of this gate."""
|
196
|
+
from qiskit.synthesis.arithmetic import multiplier_qft_r17
|
197
|
+
|
198
|
+
# This particular decomposition does not use any ancilla qubits.
|
199
|
+
# Note that the transpiler may choose a different decomposition
|
200
|
+
# based on the number of ancilla qubits available.
|
201
|
+
self.definition = multiplier_qft_r17(self.num_state_qubits)
|
@@ -38,6 +38,7 @@ class QFT(BlueprintCircuit):
|
|
38
38
|
For 4 qubits, the circuit that implements this transformation is:
|
39
39
|
|
40
40
|
.. plot::
|
41
|
+
:alt: Diagram illustrating the previously described circuit.
|
41
42
|
|
42
43
|
from qiskit.circuit.library import QFT
|
43
44
|
from qiskit.visualization.library import _generate_circuit_library_visualization
|
@@ -48,6 +49,7 @@ class QFT(BlueprintCircuit):
|
|
48
49
|
The respective circuit diagram is:
|
49
50
|
|
50
51
|
.. plot::
|
52
|
+
:alt: Diagram illustrating the previously described circuit.
|
51
53
|
|
52
54
|
from qiskit.circuit.library import QFT
|
53
55
|
from qiskit.visualization.library import _generate_circuit_library_visualization
|
@@ -64,6 +66,7 @@ class QFT(BlueprintCircuit):
|
|
64
66
|
on 5 qubits with approximation degree 2 yields (the barriers are dropped in this example):
|
65
67
|
|
66
68
|
.. plot::
|
69
|
+
:alt: Diagram illustrating the previously described circuit.
|
67
70
|
|
68
71
|
from qiskit.circuit.library import QFT
|
69
72
|
from qiskit.visualization.library import _generate_circuit_library_visualization
|
@@ -55,6 +55,7 @@ class InnerProduct(QuantumCircuit):
|
|
55
55
|
|
56
56
|
Reference Circuit:
|
57
57
|
.. plot::
|
58
|
+
:alt: Diagram illustrating the previously described circuit.
|
58
59
|
|
59
60
|
from qiskit.circuit.library import InnerProduct
|
60
61
|
from qiskit.visualization.library import _generate_circuit_library_visualization
|
@@ -121,6 +122,7 @@ class InnerProductGate(Gate):
|
|
121
122
|
|
122
123
|
Reference Circuit:
|
123
124
|
.. plot::
|
125
|
+
:alt: Diagram illustrating the previously described circuit.
|
124
126
|
|
125
127
|
from qiskit.circuit import QuantumCircuit
|
126
128
|
from qiskit.circuit.library import InnerProductGate
|
@@ -32,6 +32,7 @@ class AND(QuantumCircuit):
|
|
32
32
|
The AND gate without special flags equals the multi-controlled-X gate:
|
33
33
|
|
34
34
|
.. plot::
|
35
|
+
:alt: Diagram illustrating the previously described circuit.
|
35
36
|
|
36
37
|
from qiskit.circuit.library import AND
|
37
38
|
from qiskit.visualization.library import _generate_circuit_library_visualization
|
@@ -43,6 +44,7 @@ class AND(QuantumCircuit):
|
|
43
44
|
``[-1, 0, 0, 1, 1]``.
|
44
45
|
|
45
46
|
.. plot::
|
47
|
+
:alt: Diagram illustrating the previously described circuit.
|
46
48
|
|
47
49
|
from qiskit.circuit.library import AND
|
48
50
|
from qiskit.visualization.library import _generate_circuit_library_visualization
|
@@ -116,6 +118,7 @@ class AndGate(Gate):
|
|
116
118
|
The AndGate gate without special flags equals the multi-controlled-X gate:
|
117
119
|
|
118
120
|
.. plot::
|
121
|
+
:alt: Diagram illustrating the previously described circuit.
|
119
122
|
|
120
123
|
from qiskit.circuit import QuantumCircuit
|
121
124
|
from qiskit.circuit.library import AndGate
|
@@ -129,6 +132,7 @@ class AndGate(Gate):
|
|
129
132
|
``[-1, 0, 0, 1, 1]``.
|
130
133
|
|
131
134
|
.. plot::
|
135
|
+
:alt: Diagram illustrating the previously described circuit.
|
132
136
|
|
133
137
|
from qiskit.circuit import QuantumCircuit
|
134
138
|
from qiskit.circuit.library import AndGate
|
@@ -33,6 +33,7 @@ class OR(QuantumCircuit):
|
|
33
33
|
The OR gate without special flags:
|
34
34
|
|
35
35
|
.. plot::
|
36
|
+
:alt: Diagram illustrating the previously described circuit.
|
36
37
|
|
37
38
|
from qiskit.circuit.library import OR
|
38
39
|
from qiskit.visualization.library import _generate_circuit_library_visualization
|
@@ -44,6 +45,7 @@ class OR(QuantumCircuit):
|
|
44
45
|
flags ``[-1, 0, 0, 1, 1]``.
|
45
46
|
|
46
47
|
.. plot::
|
48
|
+
:alt: Diagram illustrating the previously described circuit.
|
47
49
|
|
48
50
|
from qiskit.circuit.library import OR
|
49
51
|
from qiskit.visualization.library import _generate_circuit_library_visualization
|
@@ -117,6 +119,7 @@ class OrGate(Gate):
|
|
117
119
|
The OrGate gate without special flags:
|
118
120
|
|
119
121
|
.. plot::
|
122
|
+
:alt: Diagram illustrating the previously described circuit.
|
120
123
|
|
121
124
|
from qiskit.circuit import QuantumCircuit
|
122
125
|
from qiskit.circuit.library import OrGate
|
@@ -130,6 +133,7 @@ class OrGate(Gate):
|
|
130
133
|
flags ``[-1, 0, 0, 1, 1]``.
|
131
134
|
|
132
135
|
.. plot::
|
136
|
+
:alt: Diagram illustrating the previously described circuit.
|
133
137
|
|
134
138
|
from qiskit.circuit import QuantumCircuit
|
135
139
|
from qiskit.circuit.library import OrGate
|
@@ -53,6 +53,7 @@ class XOR(QuantumCircuit):
|
|
53
53
|
|
54
54
|
Reference Circuit:
|
55
55
|
.. plot::
|
56
|
+
:alt: Diagram illustrating the previously described circuit.
|
56
57
|
|
57
58
|
from qiskit.circuit.library import XOR
|
58
59
|
from qiskit.visualization.library import _generate_circuit_library_visualization
|
@@ -88,6 +89,7 @@ class BitwiseXorGate(Gate):
|
|
88
89
|
Reference Circuit:
|
89
90
|
|
90
91
|
.. plot::
|
92
|
+
:alt: Diagram illustrating the previously described circuit.
|
91
93
|
|
92
94
|
from qiskit.circuit import QuantumCircuit
|
93
95
|
from qiskit.circuit.library import BitwiseXorGate
|
@@ -70,6 +70,7 @@ class FourierChecking(QuantumCircuit):
|
|
70
70
|
|
71
71
|
Reference Circuit:
|
72
72
|
.. plot::
|
73
|
+
:alt: Diagram illustrating the previously described circuit.
|
73
74
|
|
74
75
|
from qiskit.circuit.library import FourierChecking
|
75
76
|
from qiskit.visualization.library import _generate_circuit_library_visualization
|
@@ -124,6 +125,7 @@ def fourier_checking(f: Sequence[int], g: Sequence[int]) -> QuantumCircuit:
|
|
124
125
|
**Reference Circuit:**
|
125
126
|
|
126
127
|
.. plot::
|
128
|
+
:alt: Circuit diagram output by the previous code.
|
127
129
|
:include-source:
|
128
130
|
|
129
131
|
from qiskit.circuit.library import fourier_checking
|
@@ -45,6 +45,7 @@ class GR(QuantumCircuit):
|
|
45
45
|
**Expanded Circuit:**
|
46
46
|
|
47
47
|
.. plot::
|
48
|
+
:alt: Diagram illustrating the previously described circuit.
|
48
49
|
|
49
50
|
from qiskit.circuit.library import GR
|
50
51
|
from qiskit.visualization.library import _generate_circuit_library_visualization
|
@@ -99,6 +100,7 @@ class GRX(GR):
|
|
99
100
|
**Expanded Circuit:**
|
100
101
|
|
101
102
|
.. plot::
|
103
|
+
:alt: Diagram illustrating the previously described circuit.
|
102
104
|
|
103
105
|
from qiskit.circuit.library import GRX
|
104
106
|
from qiskit.visualization.library import _generate_circuit_library_visualization
|
@@ -147,6 +149,7 @@ class GRY(GR):
|
|
147
149
|
**Expanded Circuit:**
|
148
150
|
|
149
151
|
.. plot::
|
152
|
+
:alt: Diagram illustrating the previously described circuit.
|
150
153
|
|
151
154
|
from qiskit.circuit.library import GRY
|
152
155
|
from qiskit.visualization.library import _generate_circuit_library_visualization
|
@@ -195,6 +198,7 @@ class GRZ(QuantumCircuit):
|
|
195
198
|
**Expanded Circuit:**
|
196
199
|
|
197
200
|
.. plot::
|
201
|
+
:alt: Diagram illustrating the previously described circuit.
|
198
202
|
|
199
203
|
from qiskit.circuit.library import GRZ
|
200
204
|
from qiskit.visualization.library import _generate_circuit_library_visualization
|
@@ -129,6 +129,7 @@ class MCMTVChain(MCMT):
|
|
129
129
|
**Expanded Circuit:**
|
130
130
|
|
131
131
|
.. plot::
|
132
|
+
:alt: Diagram illustrating the previously described circuit.
|
132
133
|
|
133
134
|
from qiskit.circuit.library import MCMTVChain, ZGate
|
134
135
|
from qiskit.visualization.library import _generate_circuit_library_visualization
|
@@ -54,6 +54,7 @@ class Permutation(QuantumCircuit):
|
|
54
54
|
|
55
55
|
Reference Circuit:
|
56
56
|
.. plot::
|
57
|
+
:alt: Diagram illustrating the previously described circuit.
|
57
58
|
|
58
59
|
from qiskit.circuit.library import Permutation
|
59
60
|
A = [2,4,3,0,1]
|
@@ -62,6 +63,7 @@ class Permutation(QuantumCircuit):
|
|
62
63
|
|
63
64
|
Expanded Circuit:
|
64
65
|
.. plot::
|
66
|
+
:alt: Diagram illustrating the previously described circuit.
|
65
67
|
|
66
68
|
from qiskit.circuit.library import Permutation
|
67
69
|
from qiskit.visualization.library import _generate_circuit_library_visualization
|
@@ -116,6 +118,7 @@ class PermutationGate(Gate):
|
|
116
118
|
|
117
119
|
Reference Circuit:
|
118
120
|
.. plot::
|
121
|
+
:alt: Diagram illustrating the previously described circuit.
|
119
122
|
|
120
123
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
121
124
|
from qiskit.circuit.library import PermutationGate
|
@@ -127,6 +130,7 @@ class PermutationGate(Gate):
|
|
127
130
|
|
128
131
|
Expanded Circuit:
|
129
132
|
.. plot::
|
133
|
+
:alt: Diagram illustrating the previously described circuit.
|
130
134
|
|
131
135
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
132
136
|
from qiskit.circuit.library import PermutationGate
|
@@ -182,7 +186,7 @@ class PermutationGate(Gate):
|
|
182
186
|
|
183
187
|
return PermutationGate(pattern=_inverse_pattern(self.pattern))
|
184
188
|
|
185
|
-
def
|
189
|
+
def _qasm_decomposition(self):
|
186
190
|
# pylint: disable=cyclic-import
|
187
191
|
from qiskit.synthesis.permutation import synth_permutation_basic
|
188
192
|
|
@@ -200,7 +200,7 @@ class UnitaryGate(Gate):
|
|
200
200
|
)
|
201
201
|
return gate
|
202
202
|
|
203
|
-
def
|
203
|
+
def _qasm_decomposition(self):
|
204
204
|
"""Return an unparameterized version of ourselves, so the OQ2 exporter doesn't choke on the
|
205
205
|
non-standard things in our `params` field."""
|
206
206
|
out = self.definition.to_gate()
|
@@ -41,6 +41,7 @@ class GraphState(QuantumCircuit):
|
|
41
41
|
**Reference Circuit:**
|
42
42
|
|
43
43
|
.. plot::
|
44
|
+
:alt: Diagram illustrating the previously described circuit.
|
44
45
|
|
45
46
|
from qiskit.circuit.library import GraphState
|
46
47
|
from qiskit.visualization.library import _generate_circuit_library_visualization
|
@@ -105,6 +106,7 @@ class GraphStateGate(Gate):
|
|
105
106
|
**Reference Circuit:**
|
106
107
|
|
107
108
|
.. plot::
|
109
|
+
:alt: Circuit diagram output by the previous code.
|
108
110
|
:include-source:
|
109
111
|
|
110
112
|
from qiskit.circuit import QuantumCircuit
|