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,205 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2018, 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
|
+
Multiple-Controlled U3 gate utilities. Not using ancillary qubits.
|
14
|
+
"""
|
15
|
+
|
16
|
+
import math
|
17
|
+
import numpy as np
|
18
|
+
|
19
|
+
from qiskit.circuit import QuantumCircuit, Gate
|
20
|
+
from qiskit.circuit.library.standard_gates.u3 import _generate_gray_code
|
21
|
+
from qiskit.exceptions import QiskitError
|
22
|
+
|
23
|
+
|
24
|
+
def _apply_cu(circuit, theta, phi, lam, control, target, use_basis_gates=True):
|
25
|
+
if use_basis_gates:
|
26
|
+
# ┌──────────────┐
|
27
|
+
# control: ┤ P(λ/2 + φ/2) ├──■──────────────────────────────────■────────────────
|
28
|
+
# ├──────────────┤┌─┴─┐┌────────────────────────────┐┌─┴─┐┌────────────┐
|
29
|
+
# target: ┤ P(λ/2 - φ/2) ├┤ X ├┤ U(-0.5*0,0,-0.5*λ - 0.5*φ) ├┤ X ├┤ U(0/2,φ,0) ├
|
30
|
+
# └──────────────┘└───┘└────────────────────────────┘└───┘└────────────┘
|
31
|
+
circuit.p((lam + phi) / 2, [control])
|
32
|
+
circuit.p((lam - phi) / 2, [target])
|
33
|
+
circuit.cx(control, target)
|
34
|
+
circuit.u(-theta / 2, 0, -(phi + lam) / 2, [target])
|
35
|
+
circuit.cx(control, target)
|
36
|
+
circuit.u(theta / 2, phi, 0, [target])
|
37
|
+
else:
|
38
|
+
circuit.cu(theta, phi, lam, 0, control, target)
|
39
|
+
|
40
|
+
|
41
|
+
def _apply_mcu_graycode(circuit, theta, phi, lam, ctls, tgt, use_basis_gates):
|
42
|
+
"""Apply multi-controlled u gate from ctls to tgt using graycode
|
43
|
+
pattern with single-step angles theta, phi, lam."""
|
44
|
+
|
45
|
+
n = len(ctls)
|
46
|
+
|
47
|
+
gray_code = _generate_gray_code(n)
|
48
|
+
last_pattern = None
|
49
|
+
|
50
|
+
for pattern in gray_code:
|
51
|
+
if "1" not in pattern:
|
52
|
+
continue
|
53
|
+
if last_pattern is None:
|
54
|
+
last_pattern = pattern
|
55
|
+
# find left most set bit
|
56
|
+
lm_pos = list(pattern).index("1")
|
57
|
+
|
58
|
+
# find changed bit
|
59
|
+
comp = [i != j for i, j in zip(pattern, last_pattern)]
|
60
|
+
if True in comp:
|
61
|
+
pos = comp.index(True)
|
62
|
+
else:
|
63
|
+
pos = None
|
64
|
+
if pos is not None:
|
65
|
+
if pos != lm_pos:
|
66
|
+
circuit.cx(ctls[pos], ctls[lm_pos])
|
67
|
+
else:
|
68
|
+
indices = [i for i, x in enumerate(pattern) if x == "1"]
|
69
|
+
for idx in indices[1:]:
|
70
|
+
circuit.cx(ctls[idx], ctls[lm_pos])
|
71
|
+
# check parity and undo rotation
|
72
|
+
if pattern.count("1") % 2 == 0:
|
73
|
+
# inverse CU: u(theta, phi, lamb)^dagger = u(-theta, -lam, -phi)
|
74
|
+
_apply_cu(
|
75
|
+
circuit, -theta, -lam, -phi, ctls[lm_pos], tgt, use_basis_gates=use_basis_gates
|
76
|
+
)
|
77
|
+
else:
|
78
|
+
_apply_cu(circuit, theta, phi, lam, ctls[lm_pos], tgt, use_basis_gates=use_basis_gates)
|
79
|
+
last_pattern = pattern
|
80
|
+
|
81
|
+
|
82
|
+
def _mcsu2_real_diagonal(
|
83
|
+
gate: Gate,
|
84
|
+
num_controls: int,
|
85
|
+
use_basis_gates: bool = False,
|
86
|
+
) -> QuantumCircuit:
|
87
|
+
"""
|
88
|
+
Return a multi-controlled SU(2) gate [1]_ with a real main diagonal or secondary diagonal.
|
89
|
+
|
90
|
+
Args:
|
91
|
+
gate: SU(2) Gate whose unitary matrix has one real diagonal.
|
92
|
+
num_controls: The number of control qubits.
|
93
|
+
use_basis_gates: If ``True``, use ``[p, u, cx]`` gates to implement the decomposition.
|
94
|
+
|
95
|
+
Returns:
|
96
|
+
A :class:`.QuantumCircuit` implementing the multi-controlled SU(2) gate.
|
97
|
+
|
98
|
+
Raises:
|
99
|
+
QiskitError: If the input matrix is invalid.
|
100
|
+
|
101
|
+
References:
|
102
|
+
|
103
|
+
.. [1]: R. Vale et al. Decomposition of Multi-controlled Special Unitary Single-Qubit Gates
|
104
|
+
`arXiv:2302.06377 (2023) <https://arxiv.org/abs/2302.06377>`__
|
105
|
+
|
106
|
+
"""
|
107
|
+
# pylint: disable=cyclic-import
|
108
|
+
from qiskit.circuit.library.standard_gates import RXGate, RYGate, RZGate
|
109
|
+
from qiskit.circuit.library.generalized_gates import UnitaryGate
|
110
|
+
from qiskit.quantum_info.operators.predicates import is_unitary_matrix
|
111
|
+
from qiskit.compiler import transpile
|
112
|
+
from qiskit.synthesis.multi_controlled import synth_mcx_n_dirty_i15
|
113
|
+
|
114
|
+
if isinstance(gate, RYGate):
|
115
|
+
theta = gate.params[0]
|
116
|
+
s_gate = RYGate(-theta / 4)
|
117
|
+
is_secondary_diag_real = True
|
118
|
+
elif isinstance(gate, RZGate):
|
119
|
+
theta = gate.params[0]
|
120
|
+
s_gate = RZGate(-theta / 4)
|
121
|
+
is_secondary_diag_real = True
|
122
|
+
elif isinstance(gate, RXGate):
|
123
|
+
theta = gate.params[0]
|
124
|
+
s_gate = RZGate(-theta / 4)
|
125
|
+
is_secondary_diag_real = False
|
126
|
+
|
127
|
+
else:
|
128
|
+
unitary = gate.to_matrix()
|
129
|
+
if unitary.shape != (2, 2):
|
130
|
+
raise QiskitError(f"The unitary must be a 2x2 matrix, but has shape {unitary.shape}.")
|
131
|
+
|
132
|
+
if not is_unitary_matrix(unitary):
|
133
|
+
raise QiskitError(f"The unitary in must be an unitary matrix, but is {unitary}.")
|
134
|
+
|
135
|
+
if not np.isclose(1.0, np.linalg.det(unitary)):
|
136
|
+
raise QiskitError(
|
137
|
+
"Invalid Value _mcsu2_real_diagonal requires det(unitary) equal to one."
|
138
|
+
)
|
139
|
+
|
140
|
+
is_main_diag_real = np.isclose(unitary[0, 0].imag, 0.0) and np.isclose(
|
141
|
+
unitary[1, 1].imag, 0.0
|
142
|
+
)
|
143
|
+
is_secondary_diag_real = np.isclose(unitary[0, 1].imag, 0.0) and np.isclose(
|
144
|
+
unitary[1, 0].imag, 0.0
|
145
|
+
)
|
146
|
+
|
147
|
+
if not is_main_diag_real and not is_secondary_diag_real:
|
148
|
+
raise QiskitError("The unitary must have one real diagonal.")
|
149
|
+
|
150
|
+
if is_secondary_diag_real:
|
151
|
+
x = unitary[0, 1]
|
152
|
+
z = unitary[1, 1]
|
153
|
+
else:
|
154
|
+
x = -unitary[0, 1].real
|
155
|
+
z = unitary[1, 1] - unitary[0, 1].imag * 1.0j
|
156
|
+
|
157
|
+
if np.isclose(z, -1):
|
158
|
+
s_op = [[1.0, 0.0], [0.0, 1.0j]]
|
159
|
+
else:
|
160
|
+
alpha_r = math.sqrt((math.sqrt((z.real + 1.0) / 2.0) + 1.0) / 2.0)
|
161
|
+
alpha_i = z.imag / (
|
162
|
+
2.0 * math.sqrt((z.real + 1.0) * (math.sqrt((z.real + 1.0) / 2.0) + 1.0))
|
163
|
+
)
|
164
|
+
alpha = alpha_r + 1.0j * alpha_i
|
165
|
+
beta = x / (2.0 * math.sqrt((z.real + 1.0) * (math.sqrt((z.real + 1.0) / 2.0) + 1.0)))
|
166
|
+
|
167
|
+
# S gate definition
|
168
|
+
s_op = np.array([[alpha, -np.conj(beta)], [beta, np.conj(alpha)]])
|
169
|
+
s_gate = UnitaryGate(s_op)
|
170
|
+
|
171
|
+
k_1 = math.ceil(num_controls / 2.0)
|
172
|
+
k_2 = math.floor(num_controls / 2.0)
|
173
|
+
|
174
|
+
controls = list(range(num_controls)) # control indices, defined for code legibility
|
175
|
+
target = num_controls # target index, defined for code legibility
|
176
|
+
|
177
|
+
mcx1 = synth_mcx_n_dirty_i15(num_ctrl_qubits=k_1)
|
178
|
+
mcx1_num_ancillas = mcx1.num_qubits - k_1 - 1
|
179
|
+
mcx1_qubits = controls[:k_1] + [target] + controls[k_1 : k_1 + mcx1_num_ancillas]
|
180
|
+
|
181
|
+
mcx2 = synth_mcx_n_dirty_i15(num_ctrl_qubits=k_2)
|
182
|
+
mcx2_num_ancillas = mcx2.num_qubits - k_2 - 1
|
183
|
+
mcx2_qubits = controls[k_1:] + [target] + controls[k_1 - mcx2_num_ancillas : k_1]
|
184
|
+
|
185
|
+
circuit = QuantumCircuit(num_controls + 1, name="MCSU2")
|
186
|
+
|
187
|
+
if not is_secondary_diag_real:
|
188
|
+
circuit.h(target)
|
189
|
+
|
190
|
+
circuit.compose(mcx1, mcx1_qubits, inplace=True)
|
191
|
+
circuit.append(s_gate, [target])
|
192
|
+
circuit.compose(mcx2, mcx2_qubits, inplace=True)
|
193
|
+
circuit.append(s_gate.inverse(), [target])
|
194
|
+
circuit.compose(mcx1, mcx1_qubits, inplace=True)
|
195
|
+
circuit.append(s_gate, [target])
|
196
|
+
circuit.compose(mcx2, mcx2_qubits, inplace=True)
|
197
|
+
circuit.append(s_gate.inverse(), [target])
|
198
|
+
|
199
|
+
if not is_secondary_diag_real:
|
200
|
+
circuit.h(target)
|
201
|
+
|
202
|
+
if use_basis_gates:
|
203
|
+
circuit = transpile(circuit, basis_gates=["p", "u", "cx"], qubits_initially_zero=False)
|
204
|
+
|
205
|
+
return circuit
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2023.
|
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 one qubit unitary synthesis methods."""
|
14
|
+
|
15
|
+
from .one_qubit_decompose import OneQubitEulerDecomposer
|
@@ -0,0 +1,288 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 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
|
+
"""
|
14
|
+
Decompose a single-qubit unitary via Euler angles.
|
15
|
+
"""
|
16
|
+
from __future__ import annotations
|
17
|
+
from typing import TYPE_CHECKING
|
18
|
+
import numpy as np
|
19
|
+
|
20
|
+
from qiskit._accelerate import euler_one_qubit_decomposer
|
21
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
22
|
+
from qiskit.circuit import Qubit
|
23
|
+
from qiskit.circuit.library.standard_gates import (
|
24
|
+
UGate,
|
25
|
+
PhaseGate,
|
26
|
+
U3Gate,
|
27
|
+
U2Gate,
|
28
|
+
U1Gate,
|
29
|
+
RXGate,
|
30
|
+
RYGate,
|
31
|
+
RZGate,
|
32
|
+
RGate,
|
33
|
+
SXGate,
|
34
|
+
XGate,
|
35
|
+
)
|
36
|
+
from qiskit.exceptions import QiskitError
|
37
|
+
from qiskit.quantum_info.operators.predicates import is_unitary_matrix
|
38
|
+
from qiskit.circuit.gate import Gate
|
39
|
+
from qiskit.quantum_info.operators.operator import Operator
|
40
|
+
|
41
|
+
if TYPE_CHECKING:
|
42
|
+
from qiskit.dagcircuit import DAGCircuit
|
43
|
+
|
44
|
+
DEFAULT_ATOL = 1e-12
|
45
|
+
|
46
|
+
ONE_QUBIT_EULER_BASIS_GATES = {
|
47
|
+
"U3": ["u3"],
|
48
|
+
"U321": ["u3", "u2", "u1"],
|
49
|
+
"U": ["u"],
|
50
|
+
"PSX": ["p", "sx"],
|
51
|
+
"U1X": ["u1", "rx"],
|
52
|
+
"RR": ["r"],
|
53
|
+
"ZYZ": ["rz", "ry"],
|
54
|
+
"ZXZ": ["rz", "rx"],
|
55
|
+
"XZX": ["rz", "rx"],
|
56
|
+
"XYX": ["rx", "ry"],
|
57
|
+
"ZSXX": ["rz", "sx", "x"],
|
58
|
+
"ZSX": ["rz", "sx"],
|
59
|
+
}
|
60
|
+
|
61
|
+
NAME_MAP = {
|
62
|
+
"u": UGate,
|
63
|
+
"u1": U1Gate,
|
64
|
+
"u2": U2Gate,
|
65
|
+
"u3": U3Gate,
|
66
|
+
"p": PhaseGate,
|
67
|
+
"rx": RXGate,
|
68
|
+
"ry": RYGate,
|
69
|
+
"rz": RZGate,
|
70
|
+
"r": RGate,
|
71
|
+
"sx": SXGate,
|
72
|
+
"x": XGate,
|
73
|
+
}
|
74
|
+
|
75
|
+
|
76
|
+
class OneQubitEulerDecomposer:
|
77
|
+
r"""A class for decomposing 1-qubit unitaries into Euler angle rotations.
|
78
|
+
|
79
|
+
The resulting decomposition is parameterized by 3 Euler rotation angle
|
80
|
+
parameters :math:`(\theta, \phi, \lambda)`, and a phase parameter
|
81
|
+
:math:`\gamma`. The value of the parameters for an input unitary depends
|
82
|
+
on the decomposition basis. Allowed bases and the resulting circuits are
|
83
|
+
shown in the following table. Note that for the non-Euler bases (:math:`U3`,
|
84
|
+
:math:`U1X`, :math:`RR`), the :math:`ZYZ` Euler parameters are used.
|
85
|
+
|
86
|
+
.. list-table:: Supported circuit bases
|
87
|
+
:widths: auto
|
88
|
+
:header-rows: 1
|
89
|
+
|
90
|
+
* - Basis
|
91
|
+
- Euler Angle Basis
|
92
|
+
- Decomposition Circuit
|
93
|
+
* - 'ZYZ'
|
94
|
+
- :math:`Z(\phi) Y(\theta) Z(\lambda)`
|
95
|
+
- :math:`e^{i\gamma} R_Z(\phi).R_Y(\theta).R_Z(\lambda)`
|
96
|
+
* - 'ZXZ'
|
97
|
+
- :math:`Z(\phi) X(\theta) Z(\lambda)`
|
98
|
+
- :math:`e^{i\gamma} R_Z(\phi).R_X(\theta).R_Z(\lambda)`
|
99
|
+
* - 'XYX'
|
100
|
+
- :math:`X(\phi) Y(\theta) X(\lambda)`
|
101
|
+
- :math:`e^{i\gamma} R_X(\phi).R_Y(\theta).R_X(\lambda)`
|
102
|
+
* - 'XZX'
|
103
|
+
- :math:`X(\phi) Z(\theta) X(\lambda)`
|
104
|
+
- :math:`e^{i\gamma} R_X(\phi).R_Z(\theta).R_X(\lambda)`
|
105
|
+
* - 'U3'
|
106
|
+
- :math:`Z(\phi) Y(\theta) Z(\lambda)`
|
107
|
+
- :math:`e^{i\gamma} U_3(\theta,\phi,\lambda)`
|
108
|
+
* - 'U321'
|
109
|
+
- :math:`Z(\phi) Y(\theta) Z(\lambda)`
|
110
|
+
- :math:`e^{i\gamma} U_3(\theta,\phi,\lambda)`
|
111
|
+
* - 'U'
|
112
|
+
- :math:`Z(\phi) Y(\theta) Z(\lambda)`
|
113
|
+
- :math:`e^{i\gamma} U_3(\theta,\phi,\lambda)`
|
114
|
+
* - 'PSX'
|
115
|
+
- :math:`Z(\phi) Y(\theta) Z(\lambda)`
|
116
|
+
- :math:`e^{i\gamma} U_1(\phi+\pi).R_X\left(\frac{\pi}{2}\right).`
|
117
|
+
:math:`U_1(\theta+\pi).R_X\left(\frac{\pi}{2}\right).U_1(\lambda)`
|
118
|
+
* - 'ZSX'
|
119
|
+
- :math:`Z(\phi) Y(\theta) Z(\lambda)`
|
120
|
+
- :math:`e^{i\gamma} R_Z(\phi+\pi).\sqrt{X}.`
|
121
|
+
:math:`R_Z(\theta+\pi).\sqrt{X}.R_Z(\lambda)`
|
122
|
+
* - 'ZSXX'
|
123
|
+
- :math:`Z(\phi) Y(\theta) Z(\lambda)`
|
124
|
+
- :math:`e^{i\gamma} R_Z(\phi+\pi).\sqrt{X}.R_Z(\theta+\pi).\sqrt{X}.R_Z(\lambda)`
|
125
|
+
or
|
126
|
+
:math:`e^{i\gamma} R_Z(\phi+\pi).X.R_Z(\lambda)`
|
127
|
+
* - 'U1X'
|
128
|
+
- :math:`Z(\phi) Y(\theta) Z(\lambda)`
|
129
|
+
- :math:`e^{i\gamma} U_1(\phi+\pi).R_X\left(\frac{\pi}{2}\right).`
|
130
|
+
:math:`U_1(\theta+\pi).R_X\left(\frac{\pi}{2}\right).U_1(\lambda)`
|
131
|
+
* - 'RR'
|
132
|
+
- :math:`Z(\phi) Y(\theta) Z(\lambda)`
|
133
|
+
- :math:`e^{i\gamma} R\left(-\pi,\frac{\phi-\lambda+\pi}{2}\right).`
|
134
|
+
:math:`R\left(\theta+\pi,\frac{\pi}{2}-\lambda\right)`
|
135
|
+
|
136
|
+
.. automethod:: __call__
|
137
|
+
"""
|
138
|
+
|
139
|
+
def __init__(self, basis: str = "U3", use_dag: bool = False):
|
140
|
+
"""Initialize decomposer
|
141
|
+
|
142
|
+
Supported bases are: ``'U'``, ``'PSX'``, ``'ZSXX'``, ``'ZSX'``, ``'U321'``, ``'U3'``,
|
143
|
+
``'U1X'``, ``'RR'``, ``'ZYZ'``, ``'ZXZ'``, ``'XYX'``, ``'XZX'``.
|
144
|
+
|
145
|
+
Args:
|
146
|
+
basis: the decomposition basis [Default: ``'U3'``]
|
147
|
+
use_dag: If true the output from calls to the decomposer
|
148
|
+
will be a :class:`~qiskit.dagcircuit.DAGCircuit` object instead of
|
149
|
+
:class:`~qiskit.circuit.QuantumCircuit`.
|
150
|
+
|
151
|
+
Raises:
|
152
|
+
QiskitError: If input basis is not recognized.
|
153
|
+
"""
|
154
|
+
self.basis = basis # sets: self._basis, self._params, self._circuit
|
155
|
+
self.use_dag = use_dag
|
156
|
+
|
157
|
+
def build_circuit(self, gates, global_phase) -> QuantumCircuit | DAGCircuit:
|
158
|
+
"""Return the circuit or dag object from a list of gates."""
|
159
|
+
qr = [Qubit()]
|
160
|
+
lookup_gate = False
|
161
|
+
if len(gates) > 0 and isinstance(gates[0], tuple):
|
162
|
+
lookup_gate = True
|
163
|
+
|
164
|
+
from qiskit.dagcircuit import dagcircuit
|
165
|
+
|
166
|
+
dag = dagcircuit.DAGCircuit()
|
167
|
+
dag.global_phase = global_phase
|
168
|
+
dag.add_qubits(qr)
|
169
|
+
for gate_entry in gates:
|
170
|
+
if lookup_gate:
|
171
|
+
gate = NAME_MAP[gate_entry[0].name](*gate_entry[1])
|
172
|
+
else:
|
173
|
+
gate = gate_entry.name
|
174
|
+
|
175
|
+
dag.apply_operation_back(gate, (qr[0],), check=False)
|
176
|
+
return dag
|
177
|
+
|
178
|
+
def __call__(
|
179
|
+
self,
|
180
|
+
unitary: Operator | Gate | np.ndarray,
|
181
|
+
simplify: bool = True,
|
182
|
+
atol: float = DEFAULT_ATOL,
|
183
|
+
) -> QuantumCircuit | DAGCircuit:
|
184
|
+
"""Decompose single qubit gate into a circuit.
|
185
|
+
|
186
|
+
Args:
|
187
|
+
unitary: 1-qubit unitary matrix
|
188
|
+
simplify: reduce gate count in decomposition [Default: True].
|
189
|
+
atol: absolute tolerance for checking angles when simplifying
|
190
|
+
returned circuit [Default: 1e-12].
|
191
|
+
|
192
|
+
Returns:
|
193
|
+
QuantumCircuit: the decomposed single-qubit gate circuit
|
194
|
+
|
195
|
+
Raises:
|
196
|
+
QiskitError: if input is invalid or synthesis fails.
|
197
|
+
"""
|
198
|
+
if hasattr(unitary, "to_operator"):
|
199
|
+
# If input is a BaseOperator subclass this attempts to convert
|
200
|
+
# the object to an Operator so that we can extract the underlying
|
201
|
+
# numpy matrix from `Operator.data`.
|
202
|
+
unitary = unitary.to_operator().data
|
203
|
+
elif hasattr(unitary, "to_matrix"):
|
204
|
+
# If input is Gate subclass or some other class object that has
|
205
|
+
# a to_matrix method this will call that method.
|
206
|
+
unitary = unitary.to_matrix()
|
207
|
+
# Convert to numpy array in case not already an array
|
208
|
+
unitary = np.asarray(unitary, dtype=complex)
|
209
|
+
|
210
|
+
# Check input is a 2-qubit unitary
|
211
|
+
if unitary.shape != (2, 2):
|
212
|
+
raise QiskitError("OneQubitEulerDecomposer: expected 2x2 input matrix")
|
213
|
+
if not is_unitary_matrix(unitary):
|
214
|
+
raise QiskitError("OneQubitEulerDecomposer: input matrix is not unitary.")
|
215
|
+
return self._decompose(unitary, simplify=simplify, atol=atol)
|
216
|
+
|
217
|
+
def _decompose(self, unitary, simplify=True, atol=DEFAULT_ATOL):
|
218
|
+
if self.use_dag:
|
219
|
+
circuit_sequence = euler_one_qubit_decomposer.unitary_to_gate_sequence(
|
220
|
+
unitary, [self.basis], 0, None, simplify, atol
|
221
|
+
)
|
222
|
+
circuit = self.build_circuit(circuit_sequence, circuit_sequence.global_phase)
|
223
|
+
return circuit
|
224
|
+
return QuantumCircuit._from_circuit_data(
|
225
|
+
euler_one_qubit_decomposer.unitary_to_circuit(
|
226
|
+
unitary, [self.basis], 0, None, simplify, atol
|
227
|
+
),
|
228
|
+
add_regs=True,
|
229
|
+
)
|
230
|
+
|
231
|
+
@property
|
232
|
+
def basis(self):
|
233
|
+
"""The decomposition basis."""
|
234
|
+
return self._basis
|
235
|
+
|
236
|
+
@basis.setter
|
237
|
+
def basis(self, basis):
|
238
|
+
"""Set the decomposition basis."""
|
239
|
+
basis_methods = {
|
240
|
+
"U321": self._params_u3,
|
241
|
+
"U3": self._params_u3,
|
242
|
+
"U": self._params_u3,
|
243
|
+
"PSX": self._params_u1x,
|
244
|
+
"ZSX": self._params_u1x,
|
245
|
+
"ZSXX": self._params_u1x,
|
246
|
+
"U1X": self._params_u1x,
|
247
|
+
"RR": self._params_zyz,
|
248
|
+
"ZYZ": self._params_zyz,
|
249
|
+
"ZXZ": self._params_zxz,
|
250
|
+
"XYX": self._params_xyx,
|
251
|
+
"XZX": self._params_xzx,
|
252
|
+
}
|
253
|
+
if basis not in basis_methods:
|
254
|
+
raise QiskitError(f"OneQubitEulerDecomposer: unsupported basis {basis}")
|
255
|
+
self._basis = basis
|
256
|
+
self._params = basis_methods[basis]
|
257
|
+
|
258
|
+
def angles(self, unitary: np.ndarray) -> tuple:
|
259
|
+
"""Return the Euler angles for input array.
|
260
|
+
|
261
|
+
Args:
|
262
|
+
unitary: :math:`2\\times2` unitary matrix.
|
263
|
+
|
264
|
+
Returns:
|
265
|
+
tuple: ``(theta, phi, lambda)``.
|
266
|
+
"""
|
267
|
+
unitary = np.asarray(unitary, dtype=complex)
|
268
|
+
theta, phi, lam, _ = self._params(unitary)
|
269
|
+
return theta, phi, lam
|
270
|
+
|
271
|
+
def angles_and_phase(self, unitary: np.ndarray) -> tuple:
|
272
|
+
"""Return the Euler angles and phase for input array.
|
273
|
+
|
274
|
+
Args:
|
275
|
+
unitary: :math:`2\\times2`
|
276
|
+
|
277
|
+
Returns:
|
278
|
+
tuple: ``(theta, phi, lambda, phase)``.
|
279
|
+
"""
|
280
|
+
unitary = np.asarray(unitary, dtype=complex)
|
281
|
+
return self._params(unitary)
|
282
|
+
|
283
|
+
_params_zyz = staticmethod(euler_one_qubit_decomposer.params_zyz)
|
284
|
+
_params_zxz = staticmethod(euler_one_qubit_decomposer.params_zxz)
|
285
|
+
_params_xyx = staticmethod(euler_one_qubit_decomposer.params_xyx)
|
286
|
+
_params_xzx = staticmethod(euler_one_qubit_decomposer.params_xzx)
|
287
|
+
_params_u3 = staticmethod(euler_one_qubit_decomposer.params_u3)
|
288
|
+
_params_u1x = staticmethod(euler_one_qubit_decomposer.params_u1x)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2022.
|
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 synthesis algorithms for Permutation gates."""
|
14
|
+
|
15
|
+
|
16
|
+
from .permutation_lnn import synth_permutation_depth_lnn_kms
|
17
|
+
from .permutation_full import synth_permutation_basic, synth_permutation_acg
|
18
|
+
from .permutation_reverse_lnn import synth_permutation_reverse_lnn_kms
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2022.
|
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 algorithm for Permutation gates for full-connectivity."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
import numpy as np
|
18
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
19
|
+
from qiskit._accelerate.synthesis.permutation import (
|
20
|
+
_synth_permutation_basic,
|
21
|
+
_synth_permutation_acg,
|
22
|
+
)
|
23
|
+
|
24
|
+
|
25
|
+
def synth_permutation_basic(pattern: list[int] | np.ndarray[int]) -> QuantumCircuit:
|
26
|
+
"""Synthesize a permutation circuit for a fully-connected
|
27
|
+
architecture using sorting.
|
28
|
+
|
29
|
+
More precisely, if the input permutation is a cycle of length ``m``,
|
30
|
+
then this creates a quantum circuit with ``m-1`` SWAPs (and of depth ``m-1``);
|
31
|
+
if the input permutation consists of several disjoint cycles, then each cycle
|
32
|
+
is essentially treated independently.
|
33
|
+
|
34
|
+
Args:
|
35
|
+
pattern: Permutation pattern, describing
|
36
|
+
which qubits occupy the positions 0, 1, 2, etc. after applying the
|
37
|
+
permutation. That is, ``pattern[k] = m`` when the permutation maps
|
38
|
+
qubit ``m`` to position ``k``. As an example, the pattern ``[2, 4, 3, 0, 1]``
|
39
|
+
means that qubit ``2`` goes to position ``0``, qubit ``4`` goes to
|
40
|
+
position ``1``, etc.
|
41
|
+
|
42
|
+
Returns:
|
43
|
+
The synthesized quantum circuit.
|
44
|
+
"""
|
45
|
+
return QuantumCircuit._from_circuit_data(_synth_permutation_basic(pattern), add_regs=True)
|
46
|
+
|
47
|
+
|
48
|
+
def synth_permutation_acg(pattern: list[int] | np.ndarray[int]) -> QuantumCircuit:
|
49
|
+
"""Synthesize a permutation circuit for a fully-connected
|
50
|
+
architecture using the Alon, Chung, Graham method.
|
51
|
+
|
52
|
+
This produces a quantum circuit of depth 2 (measured in the number of SWAPs).
|
53
|
+
|
54
|
+
This implementation is based on the Proposition 4.1 in reference [1] with
|
55
|
+
the detailed proof given in Theorem 2 in reference [2]
|
56
|
+
|
57
|
+
Args:
|
58
|
+
pattern: Permutation pattern, describing
|
59
|
+
which qubits occupy the positions 0, 1, 2, etc. after applying the
|
60
|
+
permutation. That is, ``pattern[k] = m`` when the permutation maps
|
61
|
+
qubit ``m`` to position ``k``. As an example, the pattern ``[2, 4, 3, 0, 1]``
|
62
|
+
means that qubit ``2`` goes to position ``0``, qubit ``4`` goes to
|
63
|
+
position ``1``, etc.
|
64
|
+
|
65
|
+
Returns:
|
66
|
+
The synthesized quantum circuit.
|
67
|
+
|
68
|
+
References:
|
69
|
+
1. N. Alon, F. R. K. Chung, and R. L. Graham.
|
70
|
+
*Routing Permutations on Graphs Via Matchings.*,
|
71
|
+
Proceedings of the Twenty-Fifth Annual ACM Symposium on Theory of Computing(1993).
|
72
|
+
Pages 583–591.
|
73
|
+
`(Extended abstract) 10.1145/167088.167239 <https://doi.org/10.1145/167088.167239>`_
|
74
|
+
2. N. Alon, F. R. K. Chung, and R. L. Graham.
|
75
|
+
*Routing Permutations on Graphs Via Matchings.*,
|
76
|
+
`(Full paper) <https://www.cs.tau.ac.il/~nogaa/PDFS/r.pdf>`_
|
77
|
+
"""
|
78
|
+
return QuantumCircuit._from_circuit_data(_synth_permutation_acg(pattern), add_regs=True)
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2022.
|
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
|
+
"""Depth-efficient synthesis algorithm for Permutation gates."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
import numpy as np
|
17
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
18
|
+
from qiskit._accelerate.synthesis.permutation import _synth_permutation_depth_lnn_kms
|
19
|
+
|
20
|
+
|
21
|
+
def synth_permutation_depth_lnn_kms(pattern: list[int] | np.ndarray[int]) -> QuantumCircuit:
|
22
|
+
"""Synthesize a permutation circuit for a linear nearest-neighbor
|
23
|
+
architecture using the Kutin, Moulton, Smithline method.
|
24
|
+
|
25
|
+
This is the permutation synthesis algorithm from [1], section 6.
|
26
|
+
It synthesizes any permutation of n qubits over linear nearest-neighbor
|
27
|
+
architecture using SWAP gates with depth at most :math:`n` and size at most
|
28
|
+
:math:`n(n-1)/2` (where both depth and size are measured with respect to SWAPs).
|
29
|
+
|
30
|
+
Args:
|
31
|
+
pattern: Permutation pattern, describing
|
32
|
+
which qubits occupy the positions 0, 1, 2, etc. after applying the
|
33
|
+
permutation. That is, ``pattern[k] = m`` when the permutation maps
|
34
|
+
qubit ``m`` to position ``k``. As an example, the pattern ``[2, 4, 3, 0, 1]``
|
35
|
+
means that qubit ``2`` goes to position ``0``, qubit ``4`` goes to
|
36
|
+
position ``1``, etc.
|
37
|
+
|
38
|
+
Returns:
|
39
|
+
The synthesized quantum circuit.
|
40
|
+
|
41
|
+
References:
|
42
|
+
1. Samuel A. Kutin, David Petrie Moulton and Lawren M. Smithline.
|
43
|
+
*Computation at a distance.*,
|
44
|
+
`arXiv:quant-ph/0701194v1 <https://arxiv.org/abs/quant-ph/0701194>`_
|
45
|
+
"""
|
46
|
+
|
47
|
+
# In Qiskit, the permutation pattern [2, 4, 3, 0, 1] means that
|
48
|
+
# the permutation that maps qubit 2 to position 0, 4 to 1, 3 to 2, 0 to 3, and 1 to 4.
|
49
|
+
# In the permutation synthesis code below the notation is opposite:
|
50
|
+
# [2, 4, 3, 0, 1] means that 0 maps to 2, 1 to 3, 2 to 3, 3 to 0, and 4 to 1.
|
51
|
+
# This is why we invert the pattern.
|
52
|
+
return QuantumCircuit._from_circuit_data(
|
53
|
+
_synth_permutation_depth_lnn_kms(pattern), add_regs=True
|
54
|
+
)
|