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,143 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2019.
|
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
|
+
# pylint: disable=unused-variable
|
14
|
+
|
15
|
+
"""Multi controlled single-qubit unitary up to diagonal."""
|
16
|
+
|
17
|
+
# ToDo: This code should be merged wth the implementation of MCGs
|
18
|
+
# ToDo: (introducing a decomposition mode "up_to_diagonal").
|
19
|
+
|
20
|
+
import numpy as np
|
21
|
+
|
22
|
+
from qiskit.circuit import Gate
|
23
|
+
from qiskit.circuit.quantumcircuit import QuantumRegister, QuantumCircuit
|
24
|
+
from qiskit.circuit.exceptions import CircuitError
|
25
|
+
from qiskit.exceptions import QiskitError
|
26
|
+
from qiskit.quantum_info.operators.predicates import is_isometry
|
27
|
+
|
28
|
+
from .uc import UCGate
|
29
|
+
|
30
|
+
_EPS = 1e-10 # global variable used to chop very small numbers to zero
|
31
|
+
|
32
|
+
|
33
|
+
class MCGupDiag(Gate):
|
34
|
+
r"""
|
35
|
+
Decomposes a multi-controlled gate :math:`U` up to a diagonal :math:`D` acting on the control
|
36
|
+
and target qubit (but not on the ancilla qubits), i.e., it implements a circuit corresponding to
|
37
|
+
a unitary :math:`U'`, such that :math:`U = D U'`.
|
38
|
+
"""
|
39
|
+
|
40
|
+
def __init__(
|
41
|
+
self, gate: np.ndarray, num_controls: int, num_ancillas_zero: int, num_ancillas_dirty: int
|
42
|
+
) -> None:
|
43
|
+
r"""
|
44
|
+
Args:
|
45
|
+
gate: :math:`2 \times 2` unitary given as a (complex) ``ndarray``.
|
46
|
+
num_controls: Number of control qubits.
|
47
|
+
num_ancillas_zero: Number of ancilla qubits that start in the state zero.
|
48
|
+
num_ancillas_dirty: Number of ancilla qubits that are allowed to start in an
|
49
|
+
arbitrary state.
|
50
|
+
|
51
|
+
Raises:
|
52
|
+
QiskitError: if the input format is wrong; if the array gate is not unitary
|
53
|
+
"""
|
54
|
+
|
55
|
+
self.num_controls = num_controls
|
56
|
+
self.num_ancillas_zero = num_ancillas_zero
|
57
|
+
self.num_ancillas_dirty = num_ancillas_dirty
|
58
|
+
# Check if the gate has the right dimension
|
59
|
+
if not gate.shape == (2, 2):
|
60
|
+
raise QiskitError("The dimension of the controlled gate is not equal to (2,2).")
|
61
|
+
# Check if the single-qubit gate is unitary
|
62
|
+
if not is_isometry(gate, _EPS):
|
63
|
+
raise QiskitError("The controlled gate is not unitary.")
|
64
|
+
# Create new gate.
|
65
|
+
num_qubits = 1 + num_controls + num_ancillas_zero + num_ancillas_dirty
|
66
|
+
super().__init__("MCGupDiag", num_qubits, [gate])
|
67
|
+
|
68
|
+
def _define(self):
|
69
|
+
mcg_up_diag_circuit, _ = self._dec_mcg_up_diag()
|
70
|
+
gate = mcg_up_diag_circuit.to_instruction()
|
71
|
+
q = QuantumRegister(self.num_qubits, "q")
|
72
|
+
mcg_up_diag_circuit = QuantumCircuit(q, name="mcg_up_to_diagonal")
|
73
|
+
mcg_up_diag_circuit.append(gate, q[:])
|
74
|
+
self.definition = mcg_up_diag_circuit
|
75
|
+
|
76
|
+
def inverse(self, annotated: bool = False) -> Gate:
|
77
|
+
"""Return the inverse.
|
78
|
+
|
79
|
+
Note that the resulting Gate object has an empty ``params`` property.
|
80
|
+
"""
|
81
|
+
if not annotated:
|
82
|
+
inverse_gate = Gate(
|
83
|
+
name=self.name + "_dg", num_qubits=self.num_qubits, params=[]
|
84
|
+
) # removing the params because arrays are deprecated
|
85
|
+
|
86
|
+
definition = QuantumCircuit(*self.definition.qregs)
|
87
|
+
for inst in reversed(self._definition):
|
88
|
+
definition._append(
|
89
|
+
inst.replace(operation=inst.operation.inverse(annotated=annotated))
|
90
|
+
)
|
91
|
+
inverse_gate.definition = definition
|
92
|
+
else:
|
93
|
+
inverse_gate = super().inverse(annotated=annotated)
|
94
|
+
return inverse_gate
|
95
|
+
|
96
|
+
# Returns the diagonal up to which the gate is implemented.
|
97
|
+
def _get_diagonal(self):
|
98
|
+
# Important: for a control list q_controls = [q[0],...,q_[k-1]] the diagonal gate is
|
99
|
+
# provided in the computational basis of the qubits q[k-1],...,q[0],q_target, decreasingly
|
100
|
+
# ordered with respect to the significance of the qubit in the computational basis
|
101
|
+
_, diag = self._dec_mcg_up_diag()
|
102
|
+
return diag
|
103
|
+
|
104
|
+
def _dec_mcg_up_diag(self):
|
105
|
+
"""
|
106
|
+
Call to create a circuit with gates that implement the MCG up to a diagonal gate.
|
107
|
+
Remark: The qubits the gate acts on are ordered in the following way:
|
108
|
+
q=[q_target,q_controls,q_ancilla_zero,q_ancilla_dirty]
|
109
|
+
"""
|
110
|
+
diag = np.ones(2 ** (self.num_controls + 1)).tolist()
|
111
|
+
q = QuantumRegister(self.num_qubits, "q")
|
112
|
+
circuit = QuantumCircuit(q, name="mcg_up_to_diagonal")
|
113
|
+
(q_target, q_controls, q_ancillas_zero, q_ancillas_dirty) = self._define_qubit_role(q)
|
114
|
+
# ToDo: Keep this threshold updated such that the lowest gate count is achieved:
|
115
|
+
# ToDo: we implement the MCG with a UCGate up to diagonal if the number of controls is
|
116
|
+
# ToDo: smaller than the threshold.
|
117
|
+
threshold = float("inf")
|
118
|
+
if self.num_controls < threshold:
|
119
|
+
# Implement the MCG as a UCGate (up to diagonal)
|
120
|
+
gate_list = [np.eye(2, 2) for i in range(2**self.num_controls)]
|
121
|
+
gate_list[-1] = self.params[0]
|
122
|
+
ucg = UCGate(gate_list, up_to_diagonal=True)
|
123
|
+
circuit.append(ucg, [q_target] + q_controls)
|
124
|
+
diag = ucg._get_diagonal()
|
125
|
+
# else:
|
126
|
+
# ToDo: Use the best decomposition for MCGs up to diagonal gates here
|
127
|
+
# ToDo: (with all available ancillas)
|
128
|
+
return circuit, diag
|
129
|
+
|
130
|
+
def _define_qubit_role(self, q):
|
131
|
+
# Define the role of the qubits
|
132
|
+
q_target = q[0]
|
133
|
+
q_controls = q[1 : self.num_controls + 1]
|
134
|
+
q_ancillas_zero = q[self.num_controls + 1 : self.num_controls + 1 + self.num_ancillas_zero]
|
135
|
+
q_ancillas_dirty = q[self.num_controls + 1 + self.num_ancillas_zero :]
|
136
|
+
return q_target, q_controls, q_ancillas_zero, q_ancillas_dirty
|
137
|
+
|
138
|
+
def validate_parameter(self, parameter):
|
139
|
+
"""Multi controlled single-qubit unitary gate parameter has to be an ndarray."""
|
140
|
+
if isinstance(parameter, np.ndarray):
|
141
|
+
return parameter
|
142
|
+
else:
|
143
|
+
raise CircuitError(f"invalid param type {type(parameter)} in gate {self.name}")
|
@@ -0,0 +1,316 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2020.
|
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
|
+
"""Multiple-Control, Multiple-Target Gate."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
import warnings
|
18
|
+
from collections.abc import Callable
|
19
|
+
|
20
|
+
from qiskit import circuit
|
21
|
+
from qiskit.circuit import ControlledGate, Gate, QuantumCircuit
|
22
|
+
from qiskit.circuit._utils import _ctrl_state_to_int
|
23
|
+
from qiskit.utils.deprecation import deprecate_func
|
24
|
+
from ..standard_gates import get_standard_gate_name_mapping
|
25
|
+
|
26
|
+
|
27
|
+
class MCMT(QuantumCircuit):
|
28
|
+
"""The multi-controlled multi-target gate, for an arbitrary singly controlled target gate.
|
29
|
+
|
30
|
+
For example, the H gate controlled on 3 qubits and acting on 2 target qubit is represented as:
|
31
|
+
|
32
|
+
.. code-block:: text
|
33
|
+
|
34
|
+
───■────
|
35
|
+
│
|
36
|
+
───■────
|
37
|
+
│
|
38
|
+
───■────
|
39
|
+
┌──┴───┐
|
40
|
+
┤0 ├
|
41
|
+
│ 2-H │
|
42
|
+
┤1 ├
|
43
|
+
└──────┘
|
44
|
+
|
45
|
+
This default implementations requires no ancilla qubits, by broadcasting the target gate
|
46
|
+
to the number of target qubits and using Qiskit's generic control routine to control the
|
47
|
+
broadcasted target on the control qubits. If ancilla qubits are available, a more efficient
|
48
|
+
variant using the so-called V-chain decomposition can be used. This is implemented in
|
49
|
+
:class:`~qiskit.circuit.library.MCMTVChain`.
|
50
|
+
"""
|
51
|
+
|
52
|
+
@deprecate_func(since="1.4", additional_msg="Use MCMTGate instead.")
|
53
|
+
def __init__(
|
54
|
+
self,
|
55
|
+
gate: Gate | Callable[[QuantumCircuit, circuit.Qubit, circuit.Qubit], circuit.Instruction],
|
56
|
+
num_ctrl_qubits: int,
|
57
|
+
num_target_qubits: int,
|
58
|
+
) -> None:
|
59
|
+
"""Create a new multi-control multi-target gate.
|
60
|
+
|
61
|
+
Args:
|
62
|
+
gate: The gate to be applied controlled on the control qubits and applied to the target
|
63
|
+
qubits. Can be either a Gate or a circuit method.
|
64
|
+
If it is a callable, it will be casted to a Gate.
|
65
|
+
num_ctrl_qubits: The number of control qubits.
|
66
|
+
num_target_qubits: The number of target qubits.
|
67
|
+
|
68
|
+
Raises:
|
69
|
+
AttributeError: If the gate cannot be casted to a controlled gate.
|
70
|
+
AttributeError: If the number of controls or targets is 0.
|
71
|
+
"""
|
72
|
+
if num_ctrl_qubits == 0 or num_target_qubits == 0:
|
73
|
+
raise AttributeError("Need at least one control and one target qubit.")
|
74
|
+
|
75
|
+
if callable(gate):
|
76
|
+
warnings.warn(
|
77
|
+
"Passing a callable to MCMT is pending deprecation since Qiskit 1.3. Pass a "
|
78
|
+
"gate instance or the gate name instead, e.g. pass 'h' instead of QuantumCircuit.h.",
|
79
|
+
category=DeprecationWarning,
|
80
|
+
stacklevel=2,
|
81
|
+
)
|
82
|
+
gate = gate.__name__
|
83
|
+
elif isinstance(gate, QuantumCircuit):
|
84
|
+
warnings.warn(
|
85
|
+
"Passing a QuantumCircuit is pending deprecation since Qiskit 1.3. Pass a gate "
|
86
|
+
"or turn the circuit into a gate using the ``to_gate`` method, instead.",
|
87
|
+
category=DeprecationWarning,
|
88
|
+
stacklevel=2,
|
89
|
+
)
|
90
|
+
gate = gate.to_gate()
|
91
|
+
|
92
|
+
self.gate = MCMTGate._identify_base_gate(gate)
|
93
|
+
self.num_ctrl_qubits = num_ctrl_qubits
|
94
|
+
self.num_target_qubits = num_target_qubits
|
95
|
+
|
96
|
+
# initialize the circuit object
|
97
|
+
num_qubits = num_ctrl_qubits + num_target_qubits + self.num_ancilla_qubits
|
98
|
+
super().__init__(num_qubits, name="mcmt")
|
99
|
+
self._build()
|
100
|
+
|
101
|
+
def _build(self):
|
102
|
+
gate = MCMTGate(self.gate, self.num_ctrl_qubits, self.num_target_qubits)
|
103
|
+
self.append(gate, self.qubits)
|
104
|
+
|
105
|
+
@property
|
106
|
+
def num_ancilla_qubits(self):
|
107
|
+
"""Return the number of ancillas."""
|
108
|
+
return 0
|
109
|
+
|
110
|
+
def control(self, num_ctrl_qubits=1, label=None, ctrl_state=None, annotated=False):
|
111
|
+
"""Return the controlled version of the MCMT circuit."""
|
112
|
+
if not annotated and ctrl_state is None:
|
113
|
+
gate = MCMT(self.gate, self.num_ctrl_qubits + num_ctrl_qubits, self.num_target_qubits)
|
114
|
+
else:
|
115
|
+
gate = super().control(num_ctrl_qubits, label, ctrl_state, annotated=annotated)
|
116
|
+
return gate
|
117
|
+
|
118
|
+
def inverse(self, annotated: bool = False):
|
119
|
+
"""Return the inverse MCMT circuit, which is itself."""
|
120
|
+
return MCMT(self.gate, self.num_ctrl_qubits, self.num_target_qubits)
|
121
|
+
|
122
|
+
|
123
|
+
class MCMTVChain(MCMT):
|
124
|
+
"""The MCMT implementation using the CCX V-chain.
|
125
|
+
|
126
|
+
This implementation requires ancillas but is decomposed into a much shallower circuit
|
127
|
+
than the default implementation in :class:`~qiskit.circuit.library.MCMT`.
|
128
|
+
|
129
|
+
**Expanded Circuit:**
|
130
|
+
|
131
|
+
.. plot::
|
132
|
+
:alt: Diagram illustrating the previously described circuit.
|
133
|
+
|
134
|
+
from qiskit.circuit.library import MCMTVChain, ZGate
|
135
|
+
from qiskit.visualization.library import _generate_circuit_library_visualization
|
136
|
+
circuit = MCMTVChain(ZGate(), 2, 2)
|
137
|
+
_generate_circuit_library_visualization(circuit.decompose())
|
138
|
+
|
139
|
+
**Examples:**
|
140
|
+
|
141
|
+
>>> from qiskit.circuit.library import HGate
|
142
|
+
>>> MCMTVChain(HGate(), 3, 2).draw()
|
143
|
+
|
144
|
+
q_0: ──■────────────────────────■──
|
145
|
+
│ │
|
146
|
+
q_1: ──■────────────────────────■──
|
147
|
+
│ │
|
148
|
+
q_2: ──┼────■──────────────■────┼──
|
149
|
+
│ │ ┌───┐ │ │
|
150
|
+
q_3: ──┼────┼──┤ H ├───────┼────┼──
|
151
|
+
│ │ └─┬─┘┌───┐ │ │
|
152
|
+
q_4: ──┼────┼────┼──┤ H ├──┼────┼──
|
153
|
+
┌─┴─┐ │ │ └─┬─┘ │ ┌─┴─┐
|
154
|
+
q_5: ┤ X ├──■────┼────┼────■──┤ X ├
|
155
|
+
└───┘┌─┴─┐ │ │ ┌─┴─┐└───┘
|
156
|
+
q_6: ─────┤ X ├──■────■──┤ X ├─────
|
157
|
+
└───┘ └───┘
|
158
|
+
"""
|
159
|
+
|
160
|
+
@deprecate_func(
|
161
|
+
since="1.4",
|
162
|
+
additional_msg="Use MCMTGate with the V-chain synthesis plugin instead.",
|
163
|
+
)
|
164
|
+
def __init__(
|
165
|
+
self,
|
166
|
+
gate: Gate | Callable[[QuantumCircuit, circuit.Qubit, circuit.Qubit], circuit.Instruction],
|
167
|
+
num_ctrl_qubits: int,
|
168
|
+
num_target_qubits: int,
|
169
|
+
) -> None:
|
170
|
+
super().__init__(gate, num_ctrl_qubits, num_target_qubits)
|
171
|
+
|
172
|
+
def _build(self):
|
173
|
+
# pylint: disable=cyclic-import
|
174
|
+
from qiskit.synthesis.multi_controlled import synth_mcmt_vchain
|
175
|
+
|
176
|
+
synthesized = synth_mcmt_vchain(self.gate, self.num_ctrl_qubits, self.num_target_qubits)
|
177
|
+
self.compose(synthesized, inplace=True, copy=False)
|
178
|
+
|
179
|
+
@property
|
180
|
+
def num_ancilla_qubits(self):
|
181
|
+
"""Return the number of ancilla qubits required."""
|
182
|
+
return max(0, self.num_ctrl_qubits - 1)
|
183
|
+
|
184
|
+
def inverse(self, annotated: bool = False):
|
185
|
+
return MCMTVChain(self.gate, self.num_ctrl_qubits, self.num_target_qubits)
|
186
|
+
|
187
|
+
|
188
|
+
class MCMTGate(ControlledGate):
|
189
|
+
"""The multi-controlled multi-target gate, for an arbitrary singly controlled target gate.
|
190
|
+
|
191
|
+
For example, the H gate controlled on 3 qubits and acting on 2 target qubit is represented as:
|
192
|
+
|
193
|
+
.. parsed-literal::
|
194
|
+
|
195
|
+
───■────
|
196
|
+
│
|
197
|
+
───■────
|
198
|
+
│
|
199
|
+
───■────
|
200
|
+
┌──┴───┐
|
201
|
+
┤0 ├
|
202
|
+
│ 2-H │
|
203
|
+
┤1 ├
|
204
|
+
└──────┘
|
205
|
+
|
206
|
+
Depending on the number of available auxiliary qubits, this operation can be synthesized
|
207
|
+
using different methods. For example, if :math:`n - 1` clean auxiliary qubits are available
|
208
|
+
(where :math:`n` is the number of control qubits), a V-chain decomposition can be used whose
|
209
|
+
depth is linear in :math:`n`. See also :func:`.synth_mcmt_chain`.
|
210
|
+
"""
|
211
|
+
|
212
|
+
def __init__(
|
213
|
+
self,
|
214
|
+
gate: Gate,
|
215
|
+
num_ctrl_qubits: int,
|
216
|
+
num_target_qubits: int,
|
217
|
+
ctrl_state: int | str | None = None,
|
218
|
+
label: str | None = None,
|
219
|
+
) -> None:
|
220
|
+
"""
|
221
|
+
Args:
|
222
|
+
gate: The base gate to apply on multiple target qubits, controlled by other qubits.
|
223
|
+
This must be a single-qubit gate or a controlled single-qubit gate.
|
224
|
+
num_ctrl_qubits: The number of control qubits.
|
225
|
+
num_target_qubits: The number of target qubits.
|
226
|
+
ctrl_state: The control state of the control qubits. Defaults to all closed controls.
|
227
|
+
label: The gate label.
|
228
|
+
"""
|
229
|
+
if num_target_qubits < 1:
|
230
|
+
raise ValueError("Need at least one target qubit.")
|
231
|
+
|
232
|
+
if num_ctrl_qubits < 1:
|
233
|
+
raise ValueError("Need at least one control qubit.")
|
234
|
+
|
235
|
+
self.num_target_qubits = num_target_qubits
|
236
|
+
|
237
|
+
base_gate = self._identify_base_gate(gate)
|
238
|
+
num_qubits = num_ctrl_qubits + num_target_qubits
|
239
|
+
|
240
|
+
if label is None:
|
241
|
+
label = f"{num_target_qubits}-{gate.name.capitalize()}"
|
242
|
+
|
243
|
+
super().__init__(
|
244
|
+
"mcmt",
|
245
|
+
base_gate=base_gate,
|
246
|
+
num_qubits=num_qubits,
|
247
|
+
params=gate.params,
|
248
|
+
num_ctrl_qubits=num_ctrl_qubits,
|
249
|
+
ctrl_state=ctrl_state,
|
250
|
+
label=label,
|
251
|
+
)
|
252
|
+
|
253
|
+
def _define(self):
|
254
|
+
"""Default definition relying on gate.control. Control state is handled by superclass."""
|
255
|
+
# pylint: disable=cyclic-import
|
256
|
+
from qiskit.transpiler.passes.synthesis.hls_plugins import MCMTSynthesisDefault
|
257
|
+
|
258
|
+
self.definition = MCMTSynthesisDefault().run(self)
|
259
|
+
|
260
|
+
@staticmethod
|
261
|
+
def _identify_base_gate(gate):
|
262
|
+
"""Get the control base gate. Note this must be a single qubit gate."""
|
263
|
+
|
264
|
+
# try getting the standard name from the string
|
265
|
+
if isinstance(gate, str):
|
266
|
+
standard_gates = get_standard_gate_name_mapping()
|
267
|
+
if gate in standard_gates:
|
268
|
+
gate = standard_gates[gate]
|
269
|
+
else:
|
270
|
+
raise AttributeError(
|
271
|
+
f"Unknown gate {gate}. Available: {list(get_standard_gate_name_mapping.keys())}"
|
272
|
+
)
|
273
|
+
|
274
|
+
# extract the base gate
|
275
|
+
if isinstance(gate, ControlledGate):
|
276
|
+
warnings.warn(
|
277
|
+
"Passing a controlled gate to MCMT is pending deprecation since Qiskit 1.3. Pass a "
|
278
|
+
"single-qubit gate instance or the gate name instead, e.g. pass 'h' instead of 'ch'.",
|
279
|
+
category=DeprecationWarning,
|
280
|
+
stacklevel=2,
|
281
|
+
)
|
282
|
+
base_gate = gate.base_gate
|
283
|
+
elif isinstance(gate, Gate):
|
284
|
+
base_gate = gate
|
285
|
+
else:
|
286
|
+
raise TypeError(f"Invalid gate type {type(gate)}.")
|
287
|
+
|
288
|
+
if base_gate.num_qubits != 1:
|
289
|
+
raise ValueError(
|
290
|
+
f"MCMTGate requires a base gate with a single qubit, but got {base_gate.num_qubits}."
|
291
|
+
)
|
292
|
+
|
293
|
+
return base_gate
|
294
|
+
|
295
|
+
def control(self, num_ctrl_qubits=1, label=None, ctrl_state=None, annotated=False):
|
296
|
+
"""Return the controlled version of the MCMT circuit."""
|
297
|
+
if not annotated:
|
298
|
+
ctrl_state = _ctrl_state_to_int(ctrl_state, num_ctrl_qubits)
|
299
|
+
new_ctrl_state = (self.ctrl_state << num_ctrl_qubits) | ctrl_state
|
300
|
+
|
301
|
+
gate = MCMTGate(
|
302
|
+
self.base_gate,
|
303
|
+
self.num_ctrl_qubits + num_ctrl_qubits,
|
304
|
+
self.num_target_qubits,
|
305
|
+
ctrl_state=new_ctrl_state,
|
306
|
+
)
|
307
|
+
else:
|
308
|
+
gate = super().control(num_ctrl_qubits, label, ctrl_state, annotated=annotated)
|
309
|
+
|
310
|
+
return gate
|
311
|
+
|
312
|
+
def inverse(self, annotated: bool = False):
|
313
|
+
"""Return the inverse MCMT circuit."""
|
314
|
+
return MCMTGate(
|
315
|
+
self.base_gate.inverse(), self.num_ctrl_qubits, self.num_target_qubits, self.ctrl_state
|
316
|
+
)
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2020
|
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
|
+
"""
|
14
|
+
Simulator command to perform multiple pauli gates in a single pass
|
15
|
+
"""
|
16
|
+
from qiskit.circuit.quantumcircuitdata import CircuitInstruction
|
17
|
+
from qiskit.circuit.library.standard_gates.x import XGate
|
18
|
+
from qiskit.circuit.library.standard_gates.y import YGate
|
19
|
+
from qiskit.circuit.library.standard_gates.z import ZGate
|
20
|
+
|
21
|
+
from qiskit.circuit.gate import Gate
|
22
|
+
from qiskit.circuit.exceptions import CircuitError
|
23
|
+
|
24
|
+
|
25
|
+
class PauliGate(Gate):
|
26
|
+
r"""A multi-qubit Pauli gate.
|
27
|
+
|
28
|
+
This gate exists for optimization purposes for the
|
29
|
+
quantum statevector simulation, since applying multiple
|
30
|
+
pauli gates to different qubits at once can be done via
|
31
|
+
a single pass on the statevector.
|
32
|
+
|
33
|
+
The functionality is equivalent to applying
|
34
|
+
the pauli gates sequentially using standard Qiskit gates.
|
35
|
+
|
36
|
+
Can be applied to a :class:`~qiskit.circuit.QuantumCircuit`
|
37
|
+
with the :meth:`~qiskit.circuit.QuantumCircuit.pauli` method.
|
38
|
+
"""
|
39
|
+
|
40
|
+
def __init__(self, label):
|
41
|
+
super().__init__("pauli", len(label), [label])
|
42
|
+
|
43
|
+
def _define(self):
|
44
|
+
"""
|
45
|
+
gate pauli (p1 a1,...,pn an) { p1 a1; ... ; pn an; }
|
46
|
+
"""
|
47
|
+
# pylint: disable=cyclic-import
|
48
|
+
from qiskit.circuit import QuantumCircuit, QuantumRegister
|
49
|
+
|
50
|
+
gates = {"X": XGate, "Y": YGate, "Z": ZGate}
|
51
|
+
q = QuantumRegister(len(self.params[0]), "q")
|
52
|
+
qc = QuantumCircuit(q, name=f"{self.name}({self.params[0]})")
|
53
|
+
|
54
|
+
paulis = self.params[0]
|
55
|
+
for i, p in enumerate(reversed(paulis)):
|
56
|
+
if p == "I":
|
57
|
+
continue
|
58
|
+
qc._append(CircuitInstruction(gates[p](), (q[i],), ()))
|
59
|
+
self.definition = qc
|
60
|
+
|
61
|
+
def inverse(self, annotated: bool = False):
|
62
|
+
r"""Return inverted pauli gate (itself)."""
|
63
|
+
return PauliGate(self.params[0]) # self-inverse
|
64
|
+
|
65
|
+
def __array__(self, dtype=None, copy=None):
|
66
|
+
"""Return a Numpy.array for the pauli gate.
|
67
|
+
i.e. tensor product of the paulis"""
|
68
|
+
# pylint: disable=cyclic-import
|
69
|
+
from qiskit.quantum_info.operators import Pauli
|
70
|
+
|
71
|
+
return Pauli(self.params[0]).__array__(dtype=dtype, copy=copy)
|
72
|
+
|
73
|
+
def validate_parameter(self, parameter):
|
74
|
+
if isinstance(parameter, str):
|
75
|
+
if all(c in ["I", "X", "Y", "Z"] for c in parameter):
|
76
|
+
return parameter
|
77
|
+
else:
|
78
|
+
raise CircuitError(
|
79
|
+
f"Parameter string {parameter} should contain only 'I', 'X', 'Y', 'Z' characters"
|
80
|
+
)
|
81
|
+
else:
|
82
|
+
raise CircuitError(
|
83
|
+
f"Parameter {parameter} should be a string of 'I', 'X', 'Y', 'Z' characters"
|
84
|
+
)
|