qiskit 2.1.0rc1__cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.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 -0
- qiskit/__init__.py +159 -0
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +73 -0
- qiskit/circuit/__init__.py +1335 -0
- qiskit/circuit/_add_control.py +338 -0
- qiskit/circuit/_classical_resource_map.py +154 -0
- qiskit/circuit/_standard_gates_commutations.py +3849 -0
- qiskit/circuit/_utils.py +167 -0
- qiskit/circuit/annotated_operation.py +279 -0
- qiskit/circuit/annotation.py +404 -0
- qiskit/circuit/barrier.py +46 -0
- qiskit/circuit/classical/__init__.py +41 -0
- qiskit/circuit/classical/expr/__init__.py +266 -0
- qiskit/circuit/classical/expr/constructors.py +764 -0
- qiskit/circuit/classical/expr/expr.py +156 -0
- qiskit/circuit/classical/expr/visitors.py +381 -0
- qiskit/circuit/classical/types/__init__.py +113 -0
- qiskit/circuit/classical/types/ordering.py +229 -0
- qiskit/circuit/classical/types/types.py +30 -0
- qiskit/circuit/commutation_checker.py +133 -0
- qiskit/circuit/commutation_library.py +20 -0
- qiskit/circuit/controlflow/__init__.py +59 -0
- qiskit/circuit/controlflow/_builder_utils.py +211 -0
- qiskit/circuit/controlflow/box.py +188 -0
- qiskit/circuit/controlflow/break_loop.py +56 -0
- qiskit/circuit/controlflow/builder.py +791 -0
- qiskit/circuit/controlflow/continue_loop.py +56 -0
- qiskit/circuit/controlflow/control_flow.py +94 -0
- qiskit/circuit/controlflow/for_loop.py +218 -0
- qiskit/circuit/controlflow/if_else.py +498 -0
- qiskit/circuit/controlflow/switch_case.py +411 -0
- qiskit/circuit/controlflow/while_loop.py +166 -0
- qiskit/circuit/controlledgate.py +274 -0
- qiskit/circuit/delay.py +159 -0
- qiskit/circuit/duration.py +80 -0
- qiskit/circuit/equivalence.py +94 -0
- qiskit/circuit/equivalence_library.py +18 -0
- qiskit/circuit/exceptions.py +19 -0
- qiskit/circuit/gate.py +261 -0
- qiskit/circuit/instruction.py +564 -0
- qiskit/circuit/instructionset.py +132 -0
- qiskit/circuit/library/__init__.py +984 -0
- qiskit/circuit/library/arithmetic/__init__.py +40 -0
- qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +235 -0
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +131 -0
- qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
- qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -0
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +201 -0
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +506 -0
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +395 -0
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +501 -0
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
- qiskit/circuit/library/arithmetic/quadratic_form.py +370 -0
- qiskit/circuit/library/arithmetic/weighted_adder.py +428 -0
- qiskit/circuit/library/basis_change/__init__.py +15 -0
- qiskit/circuit/library/basis_change/qft.py +316 -0
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +322 -0
- qiskit/circuit/library/boolean_logic/__init__.py +18 -0
- qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
- qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
- qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
- qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -0
- qiskit/circuit/library/data_preparation/__init__.py +57 -0
- qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
- qiskit/circuit/library/data_preparation/initializer.py +107 -0
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
- qiskit/circuit/library/fourier_checking.py +160 -0
- qiskit/circuit/library/generalized_gates/__init__.py +30 -0
- qiskit/circuit/library/generalized_gates/diagonal.py +163 -0
- qiskit/circuit/library/generalized_gates/gms.py +179 -0
- qiskit/circuit/library/generalized_gates/gr.py +219 -0
- qiskit/circuit/library/generalized_gates/isometry.py +370 -0
- qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
- qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
- qiskit/circuit/library/generalized_gates/pauli.py +84 -0
- qiskit/circuit/library/generalized_gates/permutation.py +202 -0
- qiskit/circuit/library/generalized_gates/rv.py +96 -0
- qiskit/circuit/library/generalized_gates/uc.py +303 -0
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
- qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
- qiskit/circuit/library/generalized_gates/ucry.py +32 -0
- qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
- qiskit/circuit/library/generalized_gates/unitary.py +236 -0
- qiskit/circuit/library/graph_state.py +172 -0
- qiskit/circuit/library/grover_operator.py +583 -0
- qiskit/circuit/library/hamiltonian_gate.py +142 -0
- qiskit/circuit/library/hidden_linear_function.py +163 -0
- qiskit/circuit/library/iqp.py +180 -0
- qiskit/circuit/library/n_local/__init__.py +45 -0
- qiskit/circuit/library/n_local/efficient_su2.py +282 -0
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +301 -0
- qiskit/circuit/library/n_local/n_local.py +1478 -0
- qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
- qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
- qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
- qiskit/circuit/library/n_local/two_local.py +289 -0
- qiskit/circuit/library/overlap.py +183 -0
- qiskit/circuit/library/pauli_evolution.py +202 -0
- qiskit/circuit/library/phase_estimation.py +177 -0
- qiskit/circuit/library/phase_oracle.py +239 -0
- qiskit/circuit/library/quantum_volume.py +179 -0
- qiskit/circuit/library/standard_gates/__init__.py +141 -0
- qiskit/circuit/library/standard_gates/dcx.py +76 -0
- qiskit/circuit/library/standard_gates/ecr.py +126 -0
- qiskit/circuit/library/standard_gates/equivalence_library.py +1936 -0
- qiskit/circuit/library/standard_gates/global_phase.py +83 -0
- qiskit/circuit/library/standard_gates/h.py +230 -0
- qiskit/circuit/library/standard_gates/i.py +76 -0
- qiskit/circuit/library/standard_gates/iswap.py +115 -0
- qiskit/circuit/library/standard_gates/p.py +415 -0
- qiskit/circuit/library/standard_gates/r.py +108 -0
- qiskit/circuit/library/standard_gates/rx.py +269 -0
- qiskit/circuit/library/standard_gates/rxx.py +165 -0
- qiskit/circuit/library/standard_gates/ry.py +268 -0
- qiskit/circuit/library/standard_gates/ryy.py +165 -0
- qiskit/circuit/library/standard_gates/rz.py +290 -0
- qiskit/circuit/library/standard_gates/rzx.py +211 -0
- qiskit/circuit/library/standard_gates/rzz.py +181 -0
- qiskit/circuit/library/standard_gates/s.py +424 -0
- qiskit/circuit/library/standard_gates/swap.py +268 -0
- qiskit/circuit/library/standard_gates/sx.py +303 -0
- qiskit/circuit/library/standard_gates/t.py +169 -0
- qiskit/circuit/library/standard_gates/u.py +379 -0
- qiskit/circuit/library/standard_gates/u1.py +466 -0
- qiskit/circuit/library/standard_gates/u2.py +145 -0
- qiskit/circuit/library/standard_gates/u3.py +412 -0
- qiskit/circuit/library/standard_gates/x.py +1335 -0
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +164 -0
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +197 -0
- qiskit/circuit/library/standard_gates/y.py +253 -0
- qiskit/circuit/library/standard_gates/z.py +331 -0
- qiskit/circuit/library/templates/__init__.py +92 -0
- qiskit/circuit/library/templates/clifford/__init__.py +33 -0
- qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
- qiskit/circuit/library/templates/nct/__init__.py +67 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
- qiskit/circuit/library/templates/rzx/__init__.py +25 -0
- qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
- qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
- qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
- qiskit/circuit/measure.py +53 -0
- qiskit/circuit/operation.py +68 -0
- qiskit/circuit/parameter.py +188 -0
- qiskit/circuit/parameterexpression.py +737 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +140 -0
- qiskit/circuit/quantumcircuit.py +7610 -0
- qiskit/circuit/quantumcircuitdata.py +137 -0
- qiskit/circuit/random/__init__.py +50 -0
- qiskit/circuit/random/utils.py +755 -0
- qiskit/circuit/reset.py +37 -0
- qiskit/circuit/singleton.py +600 -0
- qiskit/circuit/store.py +89 -0
- qiskit/circuit/tools/__init__.py +16 -0
- qiskit/circuit/tools/pi_check.py +185 -0
- qiskit/circuit/twirling.py +145 -0
- qiskit/compiler/__init__.py +27 -0
- qiskit/compiler/transpiler.py +375 -0
- qiskit/converters/__init__.py +74 -0
- qiskit/converters/circuit_to_dag.py +80 -0
- qiskit/converters/circuit_to_dagdependency.py +49 -0
- qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
- qiskit/converters/circuit_to_gate.py +107 -0
- qiskit/converters/circuit_to_instruction.py +142 -0
- qiskit/converters/dag_to_circuit.py +79 -0
- qiskit/converters/dag_to_dagdependency.py +54 -0
- qiskit/converters/dag_to_dagdependency_v2.py +43 -0
- qiskit/converters/dagdependency_to_circuit.py +40 -0
- qiskit/converters/dagdependency_to_dag.py +48 -0
- qiskit/dagcircuit/__init__.py +44 -0
- qiskit/dagcircuit/collect_blocks.py +403 -0
- qiskit/dagcircuit/dagcircuit.py +24 -0
- qiskit/dagcircuit/dagdependency.py +612 -0
- qiskit/dagcircuit/dagdependency_v2.py +566 -0
- qiskit/dagcircuit/dagdepnode.py +160 -0
- qiskit/dagcircuit/dagnode.py +193 -0
- qiskit/dagcircuit/exceptions.py +42 -0
- qiskit/exceptions.py +153 -0
- qiskit/passmanager/__init__.py +258 -0
- qiskit/passmanager/base_tasks.py +230 -0
- qiskit/passmanager/compilation_status.py +74 -0
- qiskit/passmanager/exceptions.py +19 -0
- qiskit/passmanager/flow_controllers.py +116 -0
- qiskit/passmanager/passmanager.py +353 -0
- qiskit/primitives/__init__.py +490 -0
- qiskit/primitives/backend_estimator_v2.py +530 -0
- qiskit/primitives/backend_sampler_v2.py +339 -0
- qiskit/primitives/base/__init__.py +20 -0
- qiskit/primitives/base/base_estimator.py +247 -0
- qiskit/primitives/base/base_primitive_job.py +78 -0
- qiskit/primitives/base/base_primitive_v1.py +45 -0
- qiskit/primitives/base/base_result_v1.py +65 -0
- qiskit/primitives/base/base_sampler.py +196 -0
- qiskit/primitives/base/estimator_result_v1.py +46 -0
- qiskit/primitives/base/sampler_result_v1.py +45 -0
- qiskit/primitives/base/validation_v1.py +250 -0
- qiskit/primitives/containers/__init__.py +26 -0
- qiskit/primitives/containers/bindings_array.py +391 -0
- qiskit/primitives/containers/bit_array.py +764 -0
- qiskit/primitives/containers/data_bin.py +172 -0
- qiskit/primitives/containers/estimator_pub.py +222 -0
- qiskit/primitives/containers/object_array.py +94 -0
- qiskit/primitives/containers/observables_array.py +380 -0
- qiskit/primitives/containers/primitive_result.py +53 -0
- qiskit/primitives/containers/pub_result.py +51 -0
- qiskit/primitives/containers/sampler_pub.py +193 -0
- qiskit/primitives/containers/sampler_pub_result.py +74 -0
- qiskit/primitives/containers/shape.py +129 -0
- qiskit/primitives/primitive_job.py +100 -0
- qiskit/primitives/statevector_estimator.py +175 -0
- qiskit/primitives/statevector_sampler.py +290 -0
- qiskit/primitives/utils.py +72 -0
- qiskit/providers/__init__.py +677 -0
- qiskit/providers/backend.py +364 -0
- qiskit/providers/basic_provider/__init__.py +47 -0
- qiskit/providers/basic_provider/basic_provider.py +121 -0
- qiskit/providers/basic_provider/basic_provider_job.py +65 -0
- qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
- qiskit/providers/basic_provider/basic_simulator.py +693 -0
- qiskit/providers/basic_provider/exceptions.py +30 -0
- qiskit/providers/exceptions.py +33 -0
- qiskit/providers/fake_provider/__init__.py +69 -0
- qiskit/providers/fake_provider/generic_backend_v2.py +376 -0
- qiskit/providers/fake_provider/utils/__init__.py +15 -0
- qiskit/providers/job.py +147 -0
- qiskit/providers/jobstatus.py +30 -0
- qiskit/providers/options.py +273 -0
- qiskit/providers/providerutils.py +110 -0
- qiskit/qasm/libs/dummy/stdgates.inc +75 -0
- qiskit/qasm/libs/qelib1.inc +266 -0
- qiskit/qasm/libs/stdgates.inc +82 -0
- qiskit/qasm2/__init__.py +669 -0
- qiskit/qasm2/exceptions.py +27 -0
- qiskit/qasm2/export.py +364 -0
- qiskit/qasm2/parse.py +438 -0
- qiskit/qasm3/__init__.py +466 -0
- qiskit/qasm3/ast.py +796 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1363 -0
- qiskit/qasm3/printer.py +620 -0
- qiskit/qpy/__init__.py +2141 -0
- qiskit/qpy/binary_io/__init__.py +35 -0
- qiskit/qpy/binary_io/circuits.py +1687 -0
- qiskit/qpy/binary_io/parse_sympy_repr.py +126 -0
- qiskit/qpy/binary_io/schedules.py +288 -0
- qiskit/qpy/binary_io/value.py +1183 -0
- qiskit/qpy/common.py +361 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +458 -0
- qiskit/qpy/interface.py +384 -0
- qiskit/qpy/type_keys.py +415 -0
- qiskit/quantum_info/__init__.py +172 -0
- qiskit/quantum_info/analysis/__init__.py +17 -0
- qiskit/quantum_info/analysis/average.py +47 -0
- qiskit/quantum_info/analysis/distance.py +104 -0
- qiskit/quantum_info/analysis/make_observable.py +44 -0
- qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
- qiskit/quantum_info/operators/__init__.py +29 -0
- qiskit/quantum_info/operators/base_operator.py +145 -0
- qiskit/quantum_info/operators/channel/__init__.py +29 -0
- qiskit/quantum_info/operators/channel/chi.py +191 -0
- qiskit/quantum_info/operators/channel/choi.py +218 -0
- qiskit/quantum_info/operators/channel/kraus.py +337 -0
- qiskit/quantum_info/operators/channel/ptm.py +204 -0
- qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
- qiskit/quantum_info/operators/channel/stinespring.py +296 -0
- qiskit/quantum_info/operators/channel/superop.py +373 -0
- qiskit/quantum_info/operators/channel/transformations.py +490 -0
- qiskit/quantum_info/operators/custom_iterator.py +48 -0
- qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
- qiskit/quantum_info/operators/dihedral/dihedral.py +511 -0
- qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
- qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
- qiskit/quantum_info/operators/dihedral/random.py +64 -0
- qiskit/quantum_info/operators/linear_op.py +25 -0
- qiskit/quantum_info/operators/measures.py +418 -0
- qiskit/quantum_info/operators/mixins/__init__.py +52 -0
- qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
- qiskit/quantum_info/operators/mixins/group.py +171 -0
- qiskit/quantum_info/operators/mixins/linear.py +84 -0
- qiskit/quantum_info/operators/mixins/multiply.py +62 -0
- qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
- qiskit/quantum_info/operators/op_shape.py +525 -0
- qiskit/quantum_info/operators/operator.py +869 -0
- qiskit/quantum_info/operators/operator_utils.py +76 -0
- qiskit/quantum_info/operators/predicates.py +183 -0
- qiskit/quantum_info/operators/random.py +154 -0
- qiskit/quantum_info/operators/scalar_op.py +254 -0
- qiskit/quantum_info/operators/symplectic/__init__.py +24 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
- qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +584 -0
- qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
- qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -0
- qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
- qiskit/quantum_info/operators/symplectic/random.py +117 -0
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1239 -0
- qiskit/quantum_info/operators/utils/__init__.py +20 -0
- qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
- qiskit/quantum_info/operators/utils/commutator.py +36 -0
- qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
- qiskit/quantum_info/quaternion.py +156 -0
- qiskit/quantum_info/random.py +26 -0
- qiskit/quantum_info/states/__init__.py +28 -0
- qiskit/quantum_info/states/densitymatrix.py +857 -0
- qiskit/quantum_info/states/measures.py +288 -0
- qiskit/quantum_info/states/quantum_state.py +503 -0
- qiskit/quantum_info/states/random.py +157 -0
- qiskit/quantum_info/states/stabilizerstate.py +805 -0
- qiskit/quantum_info/states/statevector.py +977 -0
- qiskit/quantum_info/states/utils.py +247 -0
- qiskit/result/__init__.py +61 -0
- qiskit/result/counts.py +189 -0
- qiskit/result/distributions/__init__.py +17 -0
- qiskit/result/distributions/probability.py +100 -0
- qiskit/result/distributions/quasi.py +154 -0
- qiskit/result/exceptions.py +40 -0
- qiskit/result/models.py +241 -0
- qiskit/result/postprocess.py +239 -0
- qiskit/result/result.py +385 -0
- qiskit/result/sampled_expval.py +76 -0
- qiskit/result/utils.py +294 -0
- qiskit/synthesis/__init__.py +250 -0
- qiskit/synthesis/arithmetic/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +107 -0
- qiskit/synthesis/arithmetic/adders/rv_ripple_carry_adder.py +156 -0
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
- qiskit/synthesis/arithmetic/comparators/__init__.py +16 -0
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/synthesis/boolean/__init__.py +13 -0
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/clifford/__init__.py +19 -0
- qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
- qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
- qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
- qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
- qiskit/synthesis/cnotdihedral/__init__.py +17 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
- qiskit/synthesis/discrete_basis/__init__.py +16 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +53 -0
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +280 -0
- qiskit/synthesis/evolution/__init__.py +21 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +123 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +316 -0
- qiskit/synthesis/evolution/qdrift.py +133 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +227 -0
- qiskit/synthesis/linear/__init__.py +26 -0
- qiskit/synthesis/linear/cnot_synth.py +69 -0
- qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
- qiskit/synthesis/linear/linear_depth_lnn.py +61 -0
- qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
- qiskit/synthesis/linear_phase/__init__.py +17 -0
- qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +61 -0
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
- qiskit/synthesis/multi_controlled/__init__.py +29 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +583 -0
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +205 -0
- qiskit/synthesis/one_qubit/__init__.py +15 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
- qiskit/synthesis/permutation/__init__.py +18 -0
- qiskit/synthesis/permutation/permutation_full.py +78 -0
- qiskit/synthesis/permutation/permutation_lnn.py +54 -0
- qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
- qiskit/synthesis/permutation/permutation_utils.py +16 -0
- qiskit/synthesis/qft/__init__.py +16 -0
- qiskit/synthesis/qft/qft_decompose_full.py +97 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +61 -0
- qiskit/synthesis/stabilizer/__init__.py +16 -0
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
- qiskit/synthesis/two_qubit/__init__.py +20 -0
- qiskit/synthesis/two_qubit/local_invariance.py +63 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +583 -0
- qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
- qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
- qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
- qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
- qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
- qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
- qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
- qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
- qiskit/synthesis/unitary/__init__.py +13 -0
- qiskit/synthesis/unitary/aqc/__init__.py +177 -0
- qiskit/synthesis/unitary/aqc/approximate.py +116 -0
- qiskit/synthesis/unitary/aqc/aqc.py +175 -0
- qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
- qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
- qiskit/synthesis/unitary/qsd.py +359 -0
- qiskit/transpiler/__init__.py +1352 -0
- qiskit/transpiler/basepasses.py +190 -0
- qiskit/transpiler/coupling.py +500 -0
- qiskit/transpiler/exceptions.py +59 -0
- qiskit/transpiler/instruction_durations.py +263 -0
- qiskit/transpiler/layout.py +740 -0
- qiskit/transpiler/passes/__init__.py +278 -0
- qiskit/transpiler/passes/analysis/__init__.py +23 -0
- qiskit/transpiler/passes/analysis/count_ops.py +30 -0
- qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
- qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
- qiskit/transpiler/passes/analysis/depth.py +33 -0
- qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
- qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
- qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
- qiskit/transpiler/passes/analysis/size.py +36 -0
- qiskit/transpiler/passes/analysis/width.py +27 -0
- qiskit/transpiler/passes/basis/__init__.py +19 -0
- qiskit/transpiler/passes/basis/basis_translator.py +138 -0
- qiskit/transpiler/passes/basis/decompose.py +137 -0
- qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +84 -0
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +110 -0
- qiskit/transpiler/passes/layout/__init__.py +26 -0
- qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
- qiskit/transpiler/passes/layout/apply_layout.py +128 -0
- qiskit/transpiler/passes/layout/csp_layout.py +132 -0
- qiskit/transpiler/passes/layout/dense_layout.py +197 -0
- qiskit/transpiler/passes/layout/disjoint_utils.py +54 -0
- qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +116 -0
- qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
- qiskit/transpiler/passes/layout/sabre_layout.py +525 -0
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
- qiskit/transpiler/passes/layout/set_layout.py +69 -0
- qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
- qiskit/transpiler/passes/layout/vf2_layout.py +292 -0
- qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
- qiskit/transpiler/passes/layout/vf2_utils.py +245 -0
- qiskit/transpiler/passes/optimization/__init__.py +42 -0
- qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
- qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
- qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +117 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +109 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +85 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +242 -0
- qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
- qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
- qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +176 -0
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
- qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +267 -0
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +251 -0
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
- qiskit/transpiler/passes/optimization/optimize_annotated.py +449 -0
- qiskit/transpiler/passes/optimization/optimize_clifford_t.py +68 -0
- qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
- qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
- qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
- qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +70 -0
- qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -0
- qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
- qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
- qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +633 -0
- qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
- qiskit/transpiler/passes/routing/__init__.py +21 -0
- qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
- qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
- qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
- qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
- qiskit/transpiler/passes/routing/basic_swap.py +166 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +397 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
- qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
- qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
- qiskit/transpiler/passes/routing/sabre_swap.py +465 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +433 -0
- qiskit/transpiler/passes/routing/utils.py +35 -0
- qiskit/transpiler/passes/scheduling/__init__.py +21 -0
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
- qiskit/transpiler/passes/scheduling/padding/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
- qiskit/transpiler/passes/scheduling/padding/context_aware_dynamical_decoupling.py +876 -0
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
- qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
- qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
- qiskit/transpiler/passes/synthesis/__init__.py +21 -0
- qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
- qiskit/transpiler/passes/synthesis/clifford_unitary_synth_plugin.py +123 -0
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
- qiskit/transpiler/passes/synthesis/hls_plugins.py +2338 -0
- qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
- qiskit/transpiler/passes/synthesis/plugin.py +738 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +318 -0
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
- qiskit/transpiler/passes/utils/__init__.py +32 -0
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
- qiskit/transpiler/passes/utils/check_gate_direction.py +60 -0
- qiskit/transpiler/passes/utils/check_map.py +78 -0
- qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
- qiskit/transpiler/passes/utils/control_flow.py +61 -0
- qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
- qiskit/transpiler/passes/utils/error.py +69 -0
- qiskit/transpiler/passes/utils/filter_op_nodes.py +66 -0
- qiskit/transpiler/passes/utils/fixed_point.py +48 -0
- qiskit/transpiler/passes/utils/gate_direction.py +93 -0
- qiskit/transpiler/passes/utils/gates_basis.py +51 -0
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
- qiskit/transpiler/passes/utils/minimum_point.py +118 -0
- qiskit/transpiler/passes/utils/remove_barriers.py +50 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
- qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
- qiskit/transpiler/passmanager.py +503 -0
- qiskit/transpiler/passmanager_config.py +154 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1114 -0
- qiskit/transpiler/preset_passmanagers/common.py +773 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +443 -0
- qiskit/transpiler/preset_passmanagers/level0.py +104 -0
- qiskit/transpiler/preset_passmanagers/level1.py +108 -0
- qiskit/transpiler/preset_passmanagers/level2.py +109 -0
- qiskit/transpiler/preset_passmanagers/level3.py +110 -0
- qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
- qiskit/transpiler/target.py +905 -0
- qiskit/transpiler/timing_constraints.py +59 -0
- qiskit/user_config.py +266 -0
- qiskit/utils/__init__.py +90 -0
- qiskit/utils/classtools.py +146 -0
- qiskit/utils/deprecation.py +382 -0
- qiskit/utils/lazy_tester.py +363 -0
- qiskit/utils/optionals.py +355 -0
- qiskit/utils/parallel.py +318 -0
- qiskit/utils/units.py +146 -0
- qiskit/version.py +84 -0
- qiskit/visualization/__init__.py +290 -0
- qiskit/visualization/array.py +207 -0
- qiskit/visualization/bloch.py +778 -0
- qiskit/visualization/circuit/__init__.py +15 -0
- qiskit/visualization/circuit/_utils.py +677 -0
- qiskit/visualization/circuit/circuit_visualization.py +735 -0
- qiskit/visualization/circuit/latex.py +668 -0
- qiskit/visualization/circuit/matplotlib.py +2041 -0
- qiskit/visualization/circuit/qcstyle.py +130 -0
- qiskit/visualization/circuit/styles/__init__.py +13 -0
- qiskit/visualization/circuit/styles/bw.json +202 -0
- qiskit/visualization/circuit/styles/clifford.json +202 -0
- qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
- qiskit/visualization/circuit/styles/iqp.json +214 -0
- qiskit/visualization/circuit/styles/textbook.json +202 -0
- qiskit/visualization/circuit/text.py +1849 -0
- qiskit/visualization/circuit_visualization.py +19 -0
- qiskit/visualization/counts_visualization.py +487 -0
- qiskit/visualization/dag/__init__.py +13 -0
- qiskit/visualization/dag/dagstyle.py +103 -0
- qiskit/visualization/dag/styles/__init__.py +13 -0
- qiskit/visualization/dag/styles/color.json +10 -0
- qiskit/visualization/dag/styles/plain.json +5 -0
- qiskit/visualization/dag_visualization.py +389 -0
- qiskit/visualization/exceptions.py +21 -0
- qiskit/visualization/gate_map.py +1424 -0
- qiskit/visualization/library.py +40 -0
- qiskit/visualization/pass_manager_visualization.py +312 -0
- qiskit/visualization/state_visualization.py +1546 -0
- qiskit/visualization/style.py +223 -0
- qiskit/visualization/timeline/__init__.py +21 -0
- qiskit/visualization/timeline/core.py +495 -0
- qiskit/visualization/timeline/drawings.py +260 -0
- qiskit/visualization/timeline/generators.py +506 -0
- qiskit/visualization/timeline/interface.py +444 -0
- qiskit/visualization/timeline/layouts.py +115 -0
- qiskit/visualization/timeline/plotters/__init__.py +16 -0
- qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
- qiskit/visualization/timeline/plotters/matplotlib.py +195 -0
- qiskit/visualization/timeline/stylesheet.py +301 -0
- qiskit/visualization/timeline/types.py +148 -0
- qiskit/visualization/transition_visualization.py +369 -0
- qiskit/visualization/utils.py +49 -0
- qiskit-2.1.0rc1.dist-info/METADATA +221 -0
- qiskit-2.1.0rc1.dist-info/RECORD +699 -0
- qiskit-2.1.0rc1.dist-info/WHEEL +6 -0
- qiskit-2.1.0rc1.dist-info/entry_points.txt +88 -0
- qiskit-2.1.0rc1.dist-info/licenses/LICENSE.txt +203 -0
- qiskit-2.1.0rc1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,29 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2024.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Module containing multi-controlled circuits synthesis"""
|
14
|
+
|
15
|
+
from .mcmt_vchain import synth_mcmt_vchain
|
16
|
+
from .mcx_synthesis import (
|
17
|
+
synth_mcx_1_clean_kg24,
|
18
|
+
synth_mcx_1_dirty_kg24,
|
19
|
+
synth_mcx_2_clean_kg24,
|
20
|
+
synth_mcx_2_dirty_kg24,
|
21
|
+
synth_mcx_n_dirty_i15,
|
22
|
+
synth_mcx_n_clean_m15,
|
23
|
+
synth_mcx_1_clean_b95,
|
24
|
+
synth_mcx_gray_code,
|
25
|
+
synth_mcx_noaux_v24,
|
26
|
+
synth_c3x,
|
27
|
+
synth_c4x,
|
28
|
+
)
|
29
|
+
from .multi_control_rotation_gates import _apply_cu, _apply_mcu_graycode, _mcsu2_real_diagonal
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2024.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Synthesis for multiple-control, multiple-target Gate."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from qiskit.circuit import QuantumCircuit, Gate
|
18
|
+
from qiskit._accelerate.synthesis.multi_controlled import mcmt_v_chain
|
19
|
+
|
20
|
+
|
21
|
+
def synth_mcmt_vchain(
|
22
|
+
gate: Gate, num_ctrl_qubits: int, num_target_qubits: int, ctrl_state: int | None = None
|
23
|
+
) -> QuantumCircuit:
|
24
|
+
"""Synthesize MCMT using a V-chain.
|
25
|
+
|
26
|
+
This uses a chain of CCX gates, using ``num_ctrl_qubits - 1`` auxiliary qubits.
|
27
|
+
|
28
|
+
For example, a 3-control and 2-target H gate will be synthesized as::
|
29
|
+
|
30
|
+
q_0: ──■────────────────────────■──
|
31
|
+
│ │
|
32
|
+
q_1: ──■────────────────────────■──
|
33
|
+
│ │
|
34
|
+
q_2: ──┼────■──────────────■────┼──
|
35
|
+
│ │ ┌───┐ │ │
|
36
|
+
q_3: ──┼────┼──┤ H ├───────┼────┼──
|
37
|
+
│ │ └─┬─┘┌───┐ │ │
|
38
|
+
q_4: ──┼────┼────┼──┤ H ├──┼────┼──
|
39
|
+
┌─┴─┐ │ │ └─┬─┘ │ ┌─┴─┐
|
40
|
+
q_5: ┤ X ├──■────┼────┼────■──┤ X ├
|
41
|
+
└───┘┌─┴─┐ │ │ ┌─┴─┐└───┘
|
42
|
+
q_6: ─────┤ X ├──■────■──┤ X ├─────
|
43
|
+
└───┘ └───┘
|
44
|
+
|
45
|
+
"""
|
46
|
+
if gate.num_qubits != 1:
|
47
|
+
raise ValueError("Only single qubit gates are supported as input.")
|
48
|
+
|
49
|
+
circ = QuantumCircuit._from_circuit_data(
|
50
|
+
mcmt_v_chain(gate.control(), num_ctrl_qubits, num_target_qubits, ctrl_state)
|
51
|
+
)
|
52
|
+
return circ
|
@@ -0,0 +1,583 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2024.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Module containing multi-controlled circuits synthesis with and without ancillary qubits."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
from math import ceil
|
17
|
+
import numpy as np
|
18
|
+
|
19
|
+
from qiskit.exceptions import QiskitError
|
20
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit, QuantumRegister, AncillaRegister
|
21
|
+
from qiskit.circuit.library.standard_gates import (
|
22
|
+
HGate,
|
23
|
+
CU1Gate,
|
24
|
+
)
|
25
|
+
|
26
|
+
from qiskit._accelerate.synthesis.multi_controlled import (
|
27
|
+
c3x as c3x_rs,
|
28
|
+
c4x as c4x_rs,
|
29
|
+
synth_mcx_n_dirty_i15 as synth_mcx_n_dirty_i15_rs,
|
30
|
+
synth_mcx_noaux_v24 as synth_mcx_noaux_v24_rs,
|
31
|
+
)
|
32
|
+
|
33
|
+
|
34
|
+
def synth_mcx_n_dirty_i15(
|
35
|
+
num_ctrl_qubits: int,
|
36
|
+
relative_phase: bool = False,
|
37
|
+
action_only: bool = False,
|
38
|
+
) -> QuantumCircuit:
|
39
|
+
r"""
|
40
|
+
Synthesize a multi-controlled X gate with :math:`k` controls based on the paper
|
41
|
+
by Iten et al. [1].
|
42
|
+
|
43
|
+
For :math:`k\ge 4` the method uses :math:`k - 2` dirty ancillary qubits, producing a circuit
|
44
|
+
with :math:`2 * k - 1` qubits and at most :math:`8 * k - 6` CX gates. For :math:`k\le 3`
|
45
|
+
explicit efficient circuits are used instead.
|
46
|
+
|
47
|
+
Args:
|
48
|
+
num_ctrl_qubits: The number of control qubits.
|
49
|
+
|
50
|
+
relative_phase: when set to ``True``, the method applies the optimized multi-controlled X gate
|
51
|
+
up to a relative phase, in a way that, by lemma 8 of [1], the relative
|
52
|
+
phases of the ``action part`` cancel out with the phases of the ``reset part``.
|
53
|
+
|
54
|
+
action_only: when set to ``True``, the method applies only the ``action part`` of lemma 8 of [1].
|
55
|
+
|
56
|
+
Returns:
|
57
|
+
The synthesized quantum circuit.
|
58
|
+
|
59
|
+
References:
|
60
|
+
1. Iten et. al., *Quantum Circuits for Isometries*, Phys. Rev. A 93, 032318 (2016),
|
61
|
+
`arXiv:1501.06911 <http://arxiv.org/abs/1501.06911>`_
|
62
|
+
"""
|
63
|
+
return QuantumCircuit._from_circuit_data(
|
64
|
+
synth_mcx_n_dirty_i15_rs(num_ctrl_qubits, relative_phase, action_only)
|
65
|
+
)
|
66
|
+
|
67
|
+
|
68
|
+
def synth_mcx_n_clean_m15(num_ctrl_qubits: int) -> QuantumCircuit:
|
69
|
+
r"""
|
70
|
+
Synthesize a multi-controlled X gate with :math:`k` controls using :math:`k - 2`
|
71
|
+
clean ancillary qubits with producing a circuit with :math:`2 * k - 1` qubits
|
72
|
+
and at most :math:`6 * k - 6` CX gates, by Maslov [1].
|
73
|
+
|
74
|
+
Args:
|
75
|
+
num_ctrl_qubits: The number of control qubits.
|
76
|
+
|
77
|
+
Returns:
|
78
|
+
The synthesized quantum circuit.
|
79
|
+
|
80
|
+
References:
|
81
|
+
1. Maslov., Phys. Rev. A 93, 022311 (2016),
|
82
|
+
`arXiv:1508.03273 <https://arxiv.org/pdf/1508.03273>`_
|
83
|
+
"""
|
84
|
+
|
85
|
+
num_qubits = 2 * num_ctrl_qubits - 1
|
86
|
+
q = QuantumRegister(num_qubits, name="q")
|
87
|
+
qc = QuantumCircuit(q, name="mcx_vchain")
|
88
|
+
q_controls = q[:num_ctrl_qubits]
|
89
|
+
q_target = q[num_ctrl_qubits]
|
90
|
+
q_ancillas = q[num_ctrl_qubits + 1 :]
|
91
|
+
|
92
|
+
qc.rccx(q_controls[0], q_controls[1], q_ancillas[0])
|
93
|
+
i = 0
|
94
|
+
for j in range(2, num_ctrl_qubits - 1):
|
95
|
+
qc.rccx(q_controls[j], q_ancillas[i], q_ancillas[i + 1])
|
96
|
+
|
97
|
+
i += 1
|
98
|
+
|
99
|
+
qc.ccx(q_controls[-1], q_ancillas[i], q_target)
|
100
|
+
|
101
|
+
for j in reversed(range(2, num_ctrl_qubits - 1)):
|
102
|
+
qc.rccx(q_controls[j], q_ancillas[i - 1], q_ancillas[i])
|
103
|
+
|
104
|
+
i -= 1
|
105
|
+
|
106
|
+
qc.rccx(q_controls[0], q_controls[1], q_ancillas[i])
|
107
|
+
|
108
|
+
return qc
|
109
|
+
|
110
|
+
|
111
|
+
def synth_mcx_1_clean_b95(num_ctrl_qubits: int) -> QuantumCircuit:
|
112
|
+
r"""
|
113
|
+
Synthesize a multi-controlled X gate with :math:`k` controls using a single
|
114
|
+
clean ancillary qubit producing a circuit with :math:`k + 2` qubits and at most
|
115
|
+
:math:`16 * k - 24` CX gates, by [1], [2].
|
116
|
+
|
117
|
+
Args:
|
118
|
+
num_ctrl_qubits: The number of control qubits.
|
119
|
+
|
120
|
+
Returns:
|
121
|
+
The synthesized quantum circuit.
|
122
|
+
|
123
|
+
References:
|
124
|
+
1. Barenco et. al., *Elementary gates for quantum computation*, Phys.Rev. A52 3457 (1995),
|
125
|
+
`arXiv:quant-ph/9503016 <https://arxiv.org/abs/quant-ph/9503016>`_
|
126
|
+
2. Iten et. al., *Quantum Circuits for Isometries*, Phys. Rev. A 93, 032318 (2016),
|
127
|
+
`arXiv:1501.06911 <http://arxiv.org/abs/1501.06911>`_
|
128
|
+
"""
|
129
|
+
|
130
|
+
if num_ctrl_qubits == 3:
|
131
|
+
return synth_c3x()
|
132
|
+
|
133
|
+
elif num_ctrl_qubits == 4:
|
134
|
+
return synth_c4x()
|
135
|
+
|
136
|
+
num_qubits = num_ctrl_qubits + 2
|
137
|
+
q = QuantumRegister(num_qubits, name="q")
|
138
|
+
qc = QuantumCircuit(q, name="mcx_recursive")
|
139
|
+
|
140
|
+
num_ctrl_qubits = len(q) - 1
|
141
|
+
q_ancilla = q[-1]
|
142
|
+
q_target = q[-2]
|
143
|
+
middle = ceil(num_ctrl_qubits / 2)
|
144
|
+
|
145
|
+
# The contruction involving 4 MCX gates is described in Lemma 7.3 of [1], and also
|
146
|
+
# appears as Lemma 9 in [2]. The optimization that the first and third MCX gates
|
147
|
+
# can be synthesized up to relative phase follows from Lemma 7 in [2], as a diagonal
|
148
|
+
# gate following the first MCX gate commutes with the second MCX gate, and
|
149
|
+
# thus cancels with the inverse diagonal gate preceding the third MCX gate. The
|
150
|
+
# same optimization cannot be applied to the second MCX gate, since a diagonal
|
151
|
+
# gate following the second MCX gate would not satisfy the preconditions of Lemma 7,
|
152
|
+
# and would not necessarily commute with the third MCX gate.
|
153
|
+
controls1 = [*q[:middle]]
|
154
|
+
mcx1 = synth_mcx_n_dirty_i15(num_ctrl_qubits=len(controls1), relative_phase=True)
|
155
|
+
qubits1 = [*controls1, q_ancilla, *q[middle : middle + mcx1.num_qubits - len(controls1) - 1]]
|
156
|
+
|
157
|
+
controls2 = [*q[middle : num_ctrl_qubits - 1], q_ancilla]
|
158
|
+
mcx2 = synth_mcx_n_dirty_i15(num_ctrl_qubits=len(controls2))
|
159
|
+
qc2_qubits = [*controls2, q_target, *q[0 : mcx2.num_qubits - len(controls2) - 1]]
|
160
|
+
|
161
|
+
qc.compose(mcx1, qubits1, inplace=True)
|
162
|
+
qc.compose(mcx2, qc2_qubits, inplace=True)
|
163
|
+
qc.compose(mcx1.inverse(), qubits1, inplace=True)
|
164
|
+
qc.compose(mcx2, qc2_qubits, inplace=True)
|
165
|
+
|
166
|
+
return qc
|
167
|
+
|
168
|
+
|
169
|
+
def synth_mcx_gray_code(num_ctrl_qubits: int) -> QuantumCircuit:
|
170
|
+
r"""
|
171
|
+
Synthesize a multi-controlled X gate with :math:`k` controls using the Gray code.
|
172
|
+
|
173
|
+
Produces a quantum circuit with :math:`k + 1` qubits. This method
|
174
|
+
produces exponentially many CX gates and should be used only for small
|
175
|
+
values of :math:`k`.
|
176
|
+
|
177
|
+
Args:
|
178
|
+
num_ctrl_qubits: The number of control qubits.
|
179
|
+
|
180
|
+
Returns:
|
181
|
+
The synthesized quantum circuit.
|
182
|
+
"""
|
183
|
+
from qiskit.circuit.library.standard_gates.u3 import _gray_code_chain
|
184
|
+
|
185
|
+
num_qubits = num_ctrl_qubits + 1
|
186
|
+
q = QuantumRegister(num_qubits, name="q")
|
187
|
+
qc = QuantumCircuit(q, name="mcx_gray")
|
188
|
+
qc._append(HGate(), [q[-1]], [])
|
189
|
+
scaled_lam = np.pi / (2 ** (num_ctrl_qubits - 1))
|
190
|
+
bottom_gate = CU1Gate(scaled_lam)
|
191
|
+
definition = _gray_code_chain(q, num_ctrl_qubits, bottom_gate)
|
192
|
+
for instr, qargs, cargs in definition:
|
193
|
+
qc._append(instr, qargs, cargs)
|
194
|
+
qc._append(HGate(), [q[-1]], [])
|
195
|
+
return qc
|
196
|
+
|
197
|
+
|
198
|
+
def synth_mcx_noaux_v24(num_ctrl_qubits: int) -> QuantumCircuit:
|
199
|
+
r"""
|
200
|
+
Synthesize a multi-controlled X gate with :math:`k` controls based on
|
201
|
+
the implementation for MCPhaseGate.
|
202
|
+
|
203
|
+
In turn, the MCPhase gate uses the decomposition for multi-controlled
|
204
|
+
special unitaries described in [1].
|
205
|
+
|
206
|
+
Produces a quantum circuit with :math:`k + 1` qubits.
|
207
|
+
The number of CX-gates is quadratic in :math:`k`.
|
208
|
+
|
209
|
+
Args:
|
210
|
+
num_ctrl_qubits: The number of control qubits.
|
211
|
+
|
212
|
+
Returns:
|
213
|
+
The synthesized quantum circuit.
|
214
|
+
|
215
|
+
References:
|
216
|
+
1. Vale et. al., *Circuit Decomposition of Multicontrolled Special Unitary
|
217
|
+
Single-Qubit Gates*, IEEE TCAD 43(3) (2024),
|
218
|
+
`arXiv:2302.06377 <https://arxiv.org/abs/2302.06377>`_
|
219
|
+
"""
|
220
|
+
circ = QuantumCircuit._from_circuit_data(synth_mcx_noaux_v24_rs(num_ctrl_qubits))
|
221
|
+
return circ
|
222
|
+
|
223
|
+
|
224
|
+
def _n_parallel_ccx_x(n: int, apply_x: bool = True) -> QuantumCircuit:
|
225
|
+
r"""
|
226
|
+
Construct a quantum circuit for creating n-condionally clean ancillae using 3n qubits. This
|
227
|
+
implements Fig. 4a of [1]. The circuit applies n relative CCX (RCCX) gates . If apply_x is True,
|
228
|
+
each RCCX gate is preceded by an X gate on the target qubit. The order of returned qubits is
|
229
|
+
qr_a, qr_b, qr_target.
|
230
|
+
|
231
|
+
Args:
|
232
|
+
n: Number of conditionally clean ancillae to create.
|
233
|
+
apply_x: If True, apply X gate to the target qubit.
|
234
|
+
|
235
|
+
Returns:
|
236
|
+
QuantumCircuit: The quantum circuit for creating n-conditionally clean ancillae.
|
237
|
+
|
238
|
+
References:
|
239
|
+
1. Khattar and Gidney, Rise of conditionally clean ancillae for optimizing quantum circuits
|
240
|
+
`arXiv:2407.17966 <https://arxiv.org/abs/2407.17966>`__
|
241
|
+
"""
|
242
|
+
|
243
|
+
n_qubits = 3 * n
|
244
|
+
q = QuantumRegister(n_qubits, name="q")
|
245
|
+
qc = QuantumCircuit(q, name=f"ccxn_{n}")
|
246
|
+
qr_a, qr_b, qr_target = q[:n], q[n : 2 * n], q[2 * n :]
|
247
|
+
|
248
|
+
if apply_x:
|
249
|
+
qc.x(qr_target)
|
250
|
+
|
251
|
+
qc.rccx(qr_a, qr_b, qr_target)
|
252
|
+
|
253
|
+
return qc
|
254
|
+
|
255
|
+
|
256
|
+
def _linear_depth_ladder_ops(num_ladder_qubits: int) -> tuple[QuantumCircuit, list[int]]:
|
257
|
+
r"""
|
258
|
+
Helper function to create linear-depth ladder operations used in Khattar and Gidney's MCX synthesis.
|
259
|
+
In particular, this implements Step-1 and Step-2 on Fig. 3 of [1] except for the first and last
|
260
|
+
CCX gates.
|
261
|
+
|
262
|
+
Args:
|
263
|
+
num_ladder_qubits: No. of qubits involved in the ladder operation.
|
264
|
+
|
265
|
+
Returns:
|
266
|
+
A tuple consisting of the linear-depth ladder circuit and the index of control qubit to
|
267
|
+
apply the final CCX gate.
|
268
|
+
|
269
|
+
Raises:
|
270
|
+
QiskitError: If num_ladder_qubits <= 2.
|
271
|
+
|
272
|
+
References:
|
273
|
+
1. Khattar and Gidney, Rise of conditionally clean ancillae for optimizing quantum circuits
|
274
|
+
`arXiv:2407.17966 <https://arxiv.org/abs/2407.17966>`__
|
275
|
+
"""
|
276
|
+
|
277
|
+
if num_ladder_qubits <= 2:
|
278
|
+
raise QiskitError("n_ctrls >= 3 to use MCX ladder. Otherwise, use CCX")
|
279
|
+
|
280
|
+
n = num_ladder_qubits + 1
|
281
|
+
qc = QuantumCircuit(n)
|
282
|
+
qreg = list(range(n))
|
283
|
+
|
284
|
+
# up-ladder
|
285
|
+
for i in range(2, n - 2, 2):
|
286
|
+
qc.rccx(qreg[i + 1], qreg[i + 2], qreg[i])
|
287
|
+
qc.x(qreg[i])
|
288
|
+
|
289
|
+
# down-ladder
|
290
|
+
if n % 2 != 0:
|
291
|
+
a, b, target = n - 3, n - 5, n - 6
|
292
|
+
else:
|
293
|
+
a, b, target = n - 1, n - 4, n - 5
|
294
|
+
|
295
|
+
if target > 0:
|
296
|
+
qc.rccx(qreg[a], qreg[b], qreg[target])
|
297
|
+
qc.x(qreg[target])
|
298
|
+
|
299
|
+
for i in range(target, 2, -2):
|
300
|
+
qc.rccx(qreg[i], qreg[i - 1], qreg[i - 2])
|
301
|
+
qc.x(qreg[i - 2])
|
302
|
+
|
303
|
+
mid_second_ctrl = 1 + max(0, 6 - n)
|
304
|
+
final_ctrl = qreg[mid_second_ctrl] - 1
|
305
|
+
return qc, final_ctrl
|
306
|
+
|
307
|
+
|
308
|
+
def synth_mcx_1_kg24(num_ctrl_qubits: int, clean: bool = True) -> QuantumCircuit:
|
309
|
+
r"""
|
310
|
+
Synthesize a multi-controlled X gate with :math:`k` controls using :math:`1` ancillary qubit as
|
311
|
+
described in Sec. 5 of [1].
|
312
|
+
|
313
|
+
Args:
|
314
|
+
num_ctrl_qubits: The number of control qubits.
|
315
|
+
clean: If True, the ancilla is clean, otherwise it is dirty.
|
316
|
+
|
317
|
+
Returns:
|
318
|
+
The synthesized quantum circuit.
|
319
|
+
|
320
|
+
Raises:
|
321
|
+
QiskitError: If num_ctrl_qubits <= 2.
|
322
|
+
|
323
|
+
References:
|
324
|
+
1. Khattar and Gidney, Rise of conditionally clean ancillae for optimizing quantum circuits
|
325
|
+
`arXiv:2407.17966 <https://arxiv.org/abs/2407.17966>`__
|
326
|
+
"""
|
327
|
+
|
328
|
+
if num_ctrl_qubits <= 2:
|
329
|
+
raise QiskitError("kg24 synthesis requires at least 3 control qubits. Use CCX directly.")
|
330
|
+
|
331
|
+
q_controls = QuantumRegister(num_ctrl_qubits, name="ctrl")
|
332
|
+
q_target = QuantumRegister(1, name="targ")
|
333
|
+
q_ancilla = AncillaRegister(1, name="anc")
|
334
|
+
qc = QuantumCircuit(q_controls, q_target, q_ancilla, name="mcx_linear_depth")
|
335
|
+
|
336
|
+
ladder_ops, final_ctrl = _linear_depth_ladder_ops(num_ctrl_qubits)
|
337
|
+
|
338
|
+
qc.rccx(q_controls[0], q_controls[1], q_ancilla[0]) # # create cond. clean ancilla
|
339
|
+
qc.compose(ladder_ops, q_ancilla[:] + q_controls[:], inplace=True) # up-ladder
|
340
|
+
qc.ccx(q_ancilla, q_controls[final_ctrl], q_target) # # target
|
341
|
+
qc.compose( # # down-ladder
|
342
|
+
ladder_ops.inverse(),
|
343
|
+
q_ancilla[:] + q_controls[:],
|
344
|
+
inplace=True,
|
345
|
+
)
|
346
|
+
qc.rccx(q_controls[0], q_controls[1], q_ancilla[0]) # # undo cond. clean ancilla
|
347
|
+
|
348
|
+
if not clean:
|
349
|
+
# perform toggle-detection if ancilla is dirty
|
350
|
+
qc.compose(ladder_ops, q_ancilla[:] + q_controls[:], inplace=True)
|
351
|
+
qc.ccx(q_ancilla, q_controls[final_ctrl], q_target)
|
352
|
+
qc.compose(ladder_ops.inverse(), q_ancilla[:] + q_controls[:], inplace=True)
|
353
|
+
|
354
|
+
return qc
|
355
|
+
|
356
|
+
|
357
|
+
def synth_mcx_1_clean_kg24(num_ctrl_qubits: int) -> QuantumCircuit:
|
358
|
+
r"""
|
359
|
+
Synthesize a multi-controlled X gate with :math:`k` controls using :math:`1` clean ancillary qubit
|
360
|
+
producing a circuit with :math:`2k-3` Toffoli gates and depth :math:`O(k)` as described in
|
361
|
+
Sec. 5.1 of [1].
|
362
|
+
|
363
|
+
Args:
|
364
|
+
num_ctrl_qubits: The number of control qubits.
|
365
|
+
|
366
|
+
Returns:
|
367
|
+
The synthesized quantum circuit.
|
368
|
+
|
369
|
+
Raises:
|
370
|
+
QiskitError: If num_ctrl_qubits <= 2.
|
371
|
+
|
372
|
+
References:
|
373
|
+
1. Khattar and Gidney, Rise of conditionally clean ancillae for optimizing quantum circuits
|
374
|
+
`arXiv:2407.17966 <https://arxiv.org/abs/2407.17966>`__
|
375
|
+
"""
|
376
|
+
|
377
|
+
return synth_mcx_1_kg24(num_ctrl_qubits, clean=True)
|
378
|
+
|
379
|
+
|
380
|
+
def synth_mcx_1_dirty_kg24(num_ctrl_qubits: int) -> QuantumCircuit:
|
381
|
+
r"""
|
382
|
+
Synthesize a multi-controlled X gate with :math:`k` controls using :math:`1` dirty ancillary qubit
|
383
|
+
producing a circuit with :math:`4k-8` Toffoli gates and depth :math:`O(k)` as described in
|
384
|
+
Sec. 5.3 of [1].
|
385
|
+
|
386
|
+
Args:
|
387
|
+
num_ctrl_qubits: The number of control qubits.
|
388
|
+
|
389
|
+
Returns:
|
390
|
+
The synthesized quantum circuit.
|
391
|
+
|
392
|
+
Raises:
|
393
|
+
QiskitError: If num_ctrl_qubits <= 2.
|
394
|
+
|
395
|
+
References:
|
396
|
+
1. Khattar and Gidney, Rise of conditionally clean ancillae for optimizing quantum circuits
|
397
|
+
`arXiv:2407.17966 <https://arxiv.org/abs/2407.17966>`__
|
398
|
+
"""
|
399
|
+
|
400
|
+
return synth_mcx_1_kg24(num_ctrl_qubits, clean=False)
|
401
|
+
|
402
|
+
|
403
|
+
def _build_logn_depth_ccx_ladder(
|
404
|
+
ancilla_idx: int, ctrls: list[int], skip_cond_clean: bool = False
|
405
|
+
) -> tuple[QuantumCircuit, list[int]]:
|
406
|
+
r"""
|
407
|
+
Helper function to build a log-depth ladder compose of CCX and X gates as shown in Fig. 4b of [1].
|
408
|
+
|
409
|
+
Args:
|
410
|
+
ancilla_idx: Index of the ancillary qubit.
|
411
|
+
ctrls: List of control qubits.
|
412
|
+
skip_cond_clean: If True, do not include the conditionally clean ancilla (step 1 and 5 in
|
413
|
+
Fig. 4b of [1]).
|
414
|
+
|
415
|
+
Returns:
|
416
|
+
A tuple consisting of the log-depth ladder circuit of conditionally clean ancillae and the
|
417
|
+
list of indices of control qubit to apply the linear-depth MCX gate.
|
418
|
+
|
419
|
+
Raises:
|
420
|
+
QiskitError: If no. of qubits in parallel CCX + X gates are not the same.
|
421
|
+
|
422
|
+
References:
|
423
|
+
1. Khattar and Gidney, Rise of conditionally clean ancillae for optimizing quantum circuits
|
424
|
+
`arXiv:2407.17966 <https://arxiv.org/abs/2407.17966>`__
|
425
|
+
"""
|
426
|
+
|
427
|
+
qc = QuantumCircuit(len(ctrls) + 1)
|
428
|
+
anc = [ancilla_idx]
|
429
|
+
final_ctrls = []
|
430
|
+
|
431
|
+
while len(ctrls) > 1:
|
432
|
+
next_batch_len = min(len(anc) + 1, len(ctrls))
|
433
|
+
ctrls, nxt_batch = ctrls[next_batch_len:], ctrls[:next_batch_len]
|
434
|
+
new_anc = []
|
435
|
+
while len(nxt_batch) > 1:
|
436
|
+
ccx_n = len(nxt_batch) // 2
|
437
|
+
st = int(len(nxt_batch) % 2)
|
438
|
+
ccx_x, ccx_y, ccx_t = (
|
439
|
+
nxt_batch[st : st + ccx_n],
|
440
|
+
nxt_batch[st + ccx_n :],
|
441
|
+
anc[-ccx_n:],
|
442
|
+
)
|
443
|
+
if not len(ccx_x) == len(ccx_y) == ccx_n >= 1:
|
444
|
+
raise QiskitError(
|
445
|
+
f"Invalid CCX gate parameters: {len(ccx_x)=} != {len(ccx_y)=} != {len(ccx_n)=}"
|
446
|
+
)
|
447
|
+
if ccx_t != [ancilla_idx]:
|
448
|
+
qc.compose(_n_parallel_ccx_x(ccx_n), ccx_x + ccx_y + ccx_t, inplace=True)
|
449
|
+
else:
|
450
|
+
if not skip_cond_clean:
|
451
|
+
qc.rccx(ccx_x[0], ccx_y[0], ccx_t[0]) # # create conditionally clean ancilla
|
452
|
+
|
453
|
+
new_anc += nxt_batch[st:] # # newly created cond. clean ancilla
|
454
|
+
nxt_batch = ccx_t + nxt_batch[:st]
|
455
|
+
anc = anc[:-ccx_n]
|
456
|
+
|
457
|
+
anc = sorted(anc + new_anc)
|
458
|
+
final_ctrls += nxt_batch
|
459
|
+
|
460
|
+
final_ctrls += ctrls
|
461
|
+
final_ctrls = sorted(final_ctrls)
|
462
|
+
return qc, final_ctrls[:-1] # exclude ancilla
|
463
|
+
|
464
|
+
|
465
|
+
def synth_mcx_2_kg24(num_ctrl_qubits: int, clean: bool = True) -> QuantumCircuit:
|
466
|
+
r"""
|
467
|
+
Synthesize a multi-controlled X gate with :math:`k` controls using :math:`2` ancillary qubits.
|
468
|
+
as described in Sec. 5 of [1].
|
469
|
+
|
470
|
+
Args:
|
471
|
+
num_ctrl_qubits: The number of control qubits.
|
472
|
+
clean: If True, the ancilla is clean, otherwise it is dirty.
|
473
|
+
|
474
|
+
Returns:
|
475
|
+
The synthesized quantum circuit.
|
476
|
+
|
477
|
+
Raises:
|
478
|
+
QiskitError: If num_ctrl_qubits <= 2.
|
479
|
+
|
480
|
+
References:
|
481
|
+
1. Khattar and Gidney, Rise of conditionally clean ancillae for optimizing quantum circuits
|
482
|
+
`arXiv:2407.17966 <https://arxiv.org/abs/2407.17966>`__
|
483
|
+
"""
|
484
|
+
|
485
|
+
if num_ctrl_qubits <= 2:
|
486
|
+
raise QiskitError("kg24 synthesis requires at least 3 control qubits. Use CCX directly.")
|
487
|
+
|
488
|
+
q_control = QuantumRegister(num_ctrl_qubits, name="ctrl")
|
489
|
+
q_target = QuantumRegister(1, name="targ")
|
490
|
+
q_ancilla = AncillaRegister(2, name="anc")
|
491
|
+
qc = QuantumCircuit(q_control, q_target, q_ancilla, name="mcx_logn_depth")
|
492
|
+
|
493
|
+
ladder_ops, final_ctrls = _build_logn_depth_ccx_ladder(
|
494
|
+
num_ctrl_qubits, list(range(num_ctrl_qubits))
|
495
|
+
)
|
496
|
+
qc.compose(ladder_ops, q_control[:] + [q_ancilla[0]], inplace=True)
|
497
|
+
if len(final_ctrls) == 1: # Already a toffoli
|
498
|
+
qc.ccx(q_ancilla[0], q_control[final_ctrls[0]], q_target)
|
499
|
+
else:
|
500
|
+
mid_mcx = synth_mcx_1_clean_kg24(len(final_ctrls) + 1)
|
501
|
+
qc.compose(
|
502
|
+
mid_mcx,
|
503
|
+
[q_ancilla[0]]
|
504
|
+
+ q_control[final_ctrls]
|
505
|
+
+ q_target[:]
|
506
|
+
+ [q_ancilla[1]], # ctrls, targ, anc
|
507
|
+
inplace=True,
|
508
|
+
)
|
509
|
+
qc.compose(ladder_ops.inverse(), q_control[:] + [q_ancilla[0]], inplace=True)
|
510
|
+
|
511
|
+
if not clean:
|
512
|
+
# perform toggle-detection if ancilla is dirty
|
513
|
+
ladder_ops_new, final_ctrls = _build_logn_depth_ccx_ladder(
|
514
|
+
num_ctrl_qubits, list(range(num_ctrl_qubits)), skip_cond_clean=True
|
515
|
+
)
|
516
|
+
qc.compose(ladder_ops_new, q_control[:] + [q_ancilla[0]], inplace=True)
|
517
|
+
if len(final_ctrls) == 1:
|
518
|
+
qc.ccx(q_ancilla[0], q_control[final_ctrls[0]], q_target)
|
519
|
+
else:
|
520
|
+
qc.compose(
|
521
|
+
mid_mcx,
|
522
|
+
[q_ancilla[0]] + q_control[final_ctrls] + q_target[:] + [q_ancilla[1]],
|
523
|
+
inplace=True,
|
524
|
+
)
|
525
|
+
qc.compose(ladder_ops_new.inverse(), q_control[:] + [q_ancilla[0]], inplace=True)
|
526
|
+
|
527
|
+
return qc
|
528
|
+
|
529
|
+
|
530
|
+
def synth_mcx_2_clean_kg24(num_ctrl_qubits: int) -> QuantumCircuit:
|
531
|
+
r"""
|
532
|
+
Synthesize a multi-controlled X gate with :math:`k` controls using :math:`2` clean ancillary qubits
|
533
|
+
producing a circuit with :math:`2k-3` Toffoli gates and depth :math:`O(\log(k))` as described in
|
534
|
+
Sec. 5.2 of [1].
|
535
|
+
|
536
|
+
Args:
|
537
|
+
num_ctrl_qubits: The number of control qubits.
|
538
|
+
|
539
|
+
Returns:
|
540
|
+
The synthesized quantum circuit.
|
541
|
+
|
542
|
+
Raises:
|
543
|
+
QiskitError: If num_ctrl_qubits <= 2.
|
544
|
+
|
545
|
+
References:
|
546
|
+
1. Khattar and Gidney, Rise of conditionally clean ancillae for optimizing quantum circuits
|
547
|
+
`arXiv:2407.17966 <https://arxiv.org/abs/2407.17966>`__
|
548
|
+
"""
|
549
|
+
|
550
|
+
return synth_mcx_2_kg24(num_ctrl_qubits, clean=True)
|
551
|
+
|
552
|
+
|
553
|
+
def synth_mcx_2_dirty_kg24(num_ctrl_qubits: int) -> QuantumCircuit:
|
554
|
+
r"""
|
555
|
+
Synthesize a multi-controlled X gate with :math:`k` controls using :math:`2` dirty ancillary qubits
|
556
|
+
producing a circuit with :math:`4k-8` Toffoli gates and depth :math:`O(\log(k))` as described in
|
557
|
+
Sec. 5.4 of [1].
|
558
|
+
|
559
|
+
Args:
|
560
|
+
num_ctrl_qubits: The number of control qubits.
|
561
|
+
|
562
|
+
Returns:
|
563
|
+
The synthesized quantum circuit.
|
564
|
+
|
565
|
+
Raises:
|
566
|
+
QiskitError: If num_ctrl_qubits <= 2.
|
567
|
+
|
568
|
+
References:
|
569
|
+
1. Khattar and Gidney, Rise of conditionally clean ancillae for optimizing quantum circuits
|
570
|
+
`arXiv:2407.17966 <https://arxiv.org/abs/2407.17966>`__
|
571
|
+
"""
|
572
|
+
|
573
|
+
return synth_mcx_2_kg24(num_ctrl_qubits, clean=False)
|
574
|
+
|
575
|
+
|
576
|
+
def synth_c3x() -> QuantumCircuit:
|
577
|
+
"""Efficient synthesis of 3-controlled X-gate."""
|
578
|
+
return QuantumCircuit._from_circuit_data(c3x_rs())
|
579
|
+
|
580
|
+
|
581
|
+
def synth_c4x() -> QuantumCircuit:
|
582
|
+
"""Efficient synthesis of 4-controlled X-gate."""
|
583
|
+
return QuantumCircuit._from_circuit_data(c4x_rs())
|