qiskit 2.0.3__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 +141 -0
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +73 -0
- qiskit/circuit/__init__.py +1343 -0
- qiskit/circuit/_add_control.py +312 -0
- qiskit/circuit/_classical_resource_map.py +150 -0
- qiskit/circuit/_standard_gates_commutations.py +3849 -0
- qiskit/circuit/_utils.py +167 -0
- qiskit/circuit/annotated_operation.py +279 -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 +498 -0
- qiskit/circuit/classical/expr/visitors.py +375 -0
- qiskit/circuit/classical/types/__init__.py +113 -0
- qiskit/circuit/classical/types/ordering.py +229 -0
- qiskit/circuit/classical/types/types.py +153 -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 +163 -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 +157 -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 +502 -0
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +387 -0
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +493 -0
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
- qiskit/circuit/library/arithmetic/quadratic_form.py +364 -0
- qiskit/circuit/library/arithmetic/weighted_adder.py +409 -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 +316 -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 +159 -0
- qiskit/circuit/library/generalized_gates/gms.py +175 -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 +198 -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 +217 -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 +303 -0
- qiskit/circuit/library/n_local/n_local.py +1477 -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 +201 -0
- qiskit/circuit/library/phase_estimation.py +177 -0
- qiskit/circuit/library/phase_oracle.py +239 -0
- qiskit/circuit/library/quantum_volume.py +180 -0
- qiskit/circuit/library/standard_gates/__init__.py +141 -0
- qiskit/circuit/library/standard_gates/dcx.py +77 -0
- qiskit/circuit/library/standard_gates/ecr.py +129 -0
- qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
- qiskit/circuit/library/standard_gates/global_phase.py +84 -0
- qiskit/circuit/library/standard_gates/h.py +253 -0
- qiskit/circuit/library/standard_gates/i.py +76 -0
- qiskit/circuit/library/standard_gates/iswap.py +133 -0
- qiskit/circuit/library/standard_gates/p.py +422 -0
- qiskit/circuit/library/standard_gates/r.py +114 -0
- qiskit/circuit/library/standard_gates/rx.py +293 -0
- qiskit/circuit/library/standard_gates/rxx.py +180 -0
- qiskit/circuit/library/standard_gates/ry.py +286 -0
- qiskit/circuit/library/standard_gates/ryy.py +180 -0
- qiskit/circuit/library/standard_gates/rz.py +307 -0
- qiskit/circuit/library/standard_gates/rzx.py +226 -0
- qiskit/circuit/library/standard_gates/rzz.py +193 -0
- qiskit/circuit/library/standard_gates/s.py +419 -0
- qiskit/circuit/library/standard_gates/swap.py +281 -0
- qiskit/circuit/library/standard_gates/sx.py +310 -0
- qiskit/circuit/library/standard_gates/t.py +178 -0
- qiskit/circuit/library/standard_gates/u.py +395 -0
- qiskit/circuit/library/standard_gates/u1.py +490 -0
- qiskit/circuit/library/standard_gates/u2.py +145 -0
- qiskit/circuit/library/standard_gates/u3.py +428 -0
- qiskit/circuit/library/standard_gates/x.py +1481 -0
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +202 -0
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +236 -0
- qiskit/circuit/library/standard_gates/y.py +257 -0
- qiskit/circuit/library/standard_gates/z.py +338 -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 +179 -0
- qiskit/circuit/parameterexpression.py +703 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +140 -0
- qiskit/circuit/quantumcircuit.py +7540 -0
- qiskit/circuit/quantumcircuitdata.py +136 -0
- qiskit/circuit/random/__init__.py +15 -0
- qiskit/circuit/random/utils.py +366 -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 +193 -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 +55 -0
- qiskit/dagcircuit/collect_blocks.py +407 -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 +188 -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 +175 -0
- qiskit/primitives/containers/estimator_pub.py +222 -0
- qiskit/primitives/containers/object_array.py +94 -0
- qiskit/primitives/containers/observables_array.py +296 -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 +81 -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 +374 -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 +372 -0
- qiskit/qasm3/ast.py +782 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1340 -0
- qiskit/qasm3/printer.py +608 -0
- qiskit/qpy/__init__.py +1965 -0
- qiskit/qpy/binary_io/__init__.py +35 -0
- qiskit/qpy/binary_io/circuits.py +1455 -0
- qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
- qiskit/qpy/binary_io/schedules.py +308 -0
- qiskit/qpy/binary_io/value.py +1165 -0
- qiskit/qpy/common.py +353 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +442 -0
- qiskit/qpy/interface.py +344 -0
- qiskit/qpy/type_keys.py +409 -0
- qiskit/quantum_info/__init__.py +162 -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 +28 -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 +23 -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 +558 -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 +74 -0
- qiskit/result/utils.py +294 -0
- qiskit/synthesis/__init__.py +240 -0
- qiskit/synthesis/arithmetic/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -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/commutator_decompose.py +265 -0
- qiskit/synthesis/discrete_basis/gate_sequence.py +421 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +165 -0
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +240 -0
- qiskit/synthesis/evolution/__init__.py +21 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +120 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +313 -0
- qiskit/synthesis/evolution/qdrift.py +130 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +224 -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 +25 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +359 -0
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -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 +79 -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 +288 -0
- qiskit/transpiler/__init__.py +1345 -0
- qiskit/transpiler/basepasses.py +190 -0
- qiskit/transpiler/coupling.py +500 -0
- qiskit/transpiler/exceptions.py +59 -0
- qiskit/transpiler/instruction_durations.py +281 -0
- qiskit/transpiler/layout.py +740 -0
- qiskit/transpiler/passes/__init__.py +276 -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 +177 -0
- qiskit/transpiler/passes/layout/disjoint_utils.py +219 -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 +506 -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 +256 -0
- qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
- qiskit/transpiler/passes/layout/vf2_utils.py +235 -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 +250 -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_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 +639 -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 +463 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +408 -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 +16 -0
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -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 +20 -0
- qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -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 +1963 -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 +313 -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 +151 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +993 -0
- qiskit/transpiler/preset_passmanagers/common.py +672 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +437 -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 +354 -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 +675 -0
- qiskit/visualization/circuit/circuit_visualization.py +735 -0
- qiskit/visualization/circuit/latex.py +661 -0
- qiskit/visualization/circuit/matplotlib.py +2019 -0
- qiskit/visualization/circuit/qcstyle.py +278 -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_visualization.py +318 -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/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.0.3.dist-info/METADATA +220 -0
- qiskit-2.0.3.dist-info/RECORD +690 -0
- qiskit-2.0.3.dist-info/WHEEL +6 -0
- qiskit-2.0.3.dist-info/entry_points.txt +82 -0
- qiskit-2.0.3.dist-info/licenses/LICENSE.txt +203 -0
- qiskit-2.0.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,429 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2022, 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
|
+
"""
|
14
|
+
High-level-synthesis transpiler pass.
|
15
|
+
"""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
|
19
|
+
import typing
|
20
|
+
from collections.abc import Callable
|
21
|
+
|
22
|
+
import numpy as np
|
23
|
+
|
24
|
+
from qiskit.circuit.operation import Operation
|
25
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
26
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
27
|
+
from qiskit.circuit import EquivalenceLibrary
|
28
|
+
from qiskit.transpiler.target import Target
|
29
|
+
from qiskit.transpiler.coupling import CouplingMap
|
30
|
+
from qiskit.dagcircuit.dagcircuit import DAGCircuit
|
31
|
+
from qiskit.transpiler.exceptions import TranspilerError
|
32
|
+
|
33
|
+
from qiskit._accelerate.high_level_synthesis import (
|
34
|
+
QubitTracker,
|
35
|
+
HighLevelSynthesisData,
|
36
|
+
run_on_dag,
|
37
|
+
)
|
38
|
+
|
39
|
+
from .plugin import HighLevelSynthesisPluginManager
|
40
|
+
|
41
|
+
if typing.TYPE_CHECKING:
|
42
|
+
from qiskit.dagcircuit import DAGOpNode
|
43
|
+
|
44
|
+
|
45
|
+
class HLSConfig:
|
46
|
+
"""The high-level-synthesis config allows to specify a list of "methods" used by
|
47
|
+
:class:`~.HighLevelSynthesis` transformation pass to synthesize different types
|
48
|
+
of higher-level objects.
|
49
|
+
|
50
|
+
A higher-level object is an object of type :class:`~.Operation` (e.g., :class:`.Clifford` or
|
51
|
+
:class:`.LinearFunction`). Each object is referred to by its :attr:`~.Operation.name` field
|
52
|
+
(e.g., ``"clifford"`` for :class:`.Clifford` objects), and the applicable synthesis methods are
|
53
|
+
tied to this name.
|
54
|
+
|
55
|
+
In the config, each method is specified in one of several ways:
|
56
|
+
|
57
|
+
1. a tuple consisting of the name of a known synthesis plugin and a dictionary providing
|
58
|
+
additional arguments for the algorithm.
|
59
|
+
2. a tuple consisting of an instance of :class:`.HighLevelSynthesisPlugin` and additional
|
60
|
+
arguments for the algorithm.
|
61
|
+
3. a single string of a known synthesis plugin
|
62
|
+
4. a single instance of :class:`.HighLevelSynthesisPlugin`.
|
63
|
+
|
64
|
+
The following example illustrates different ways how a config file can be created::
|
65
|
+
|
66
|
+
from qiskit.transpiler.passes.synthesis.high_level_synthesis import HLSConfig
|
67
|
+
from qiskit.transpiler.passes.synthesis.high_level_synthesis import ACGSynthesisPermutation
|
68
|
+
|
69
|
+
# All the ways to specify hls_config are equivalent
|
70
|
+
hls_config = HLSConfig(permutation=[("acg", {})])
|
71
|
+
hls_config = HLSConfig(permutation=["acg"])
|
72
|
+
hls_config = HLSConfig(permutation=[(ACGSynthesisPermutation(), {})])
|
73
|
+
hls_config = HLSConfig(permutation=[ACGSynthesisPermutation()])
|
74
|
+
|
75
|
+
The names of the synthesis plugins should be declared in ``entry-points`` table for
|
76
|
+
``qiskit.synthesis`` in ``pyproject.toml``, in the form
|
77
|
+
<higher-level-object-name>.<synthesis-method-name>.
|
78
|
+
|
79
|
+
The standard higher-level-objects are recommended to have a synthesis method
|
80
|
+
called "default", which would be called automatically when synthesizing these objects,
|
81
|
+
without having to explicitly set these methods in the config.
|
82
|
+
|
83
|
+
To avoid synthesizing a given higher-level-object, one can give it an empty list of methods.
|
84
|
+
|
85
|
+
For an explicit example of using such config files, refer to the documentation for
|
86
|
+
:class:`~.HighLevelSynthesis`.
|
87
|
+
|
88
|
+
For an overview of the complete process of using high-level synthesis, see
|
89
|
+
:ref:`using-high-level-synthesis-plugins`.
|
90
|
+
"""
|
91
|
+
|
92
|
+
def __init__(
|
93
|
+
self,
|
94
|
+
use_default_on_unspecified: bool = True,
|
95
|
+
plugin_selection: str = "sequential",
|
96
|
+
plugin_evaluation_fn: Callable[[QuantumCircuit], int] | None = None,
|
97
|
+
**kwargs,
|
98
|
+
):
|
99
|
+
"""Creates a high-level-synthesis config.
|
100
|
+
|
101
|
+
Args:
|
102
|
+
use_default_on_unspecified: if True, every higher-level-object without an
|
103
|
+
explicitly specified list of methods will be synthesized using the "default"
|
104
|
+
algorithm if it exists.
|
105
|
+
plugin_selection: if set to ``"sequential"`` (default), for every higher-level-object
|
106
|
+
the synthesis pass will consider the specified methods sequentially, stopping
|
107
|
+
at the first method that is able to synthesize the object. If set to ``"all"``,
|
108
|
+
all the specified methods will be considered, and the best synthesized circuit,
|
109
|
+
according to ``plugin_evaluation_fn`` will be chosen.
|
110
|
+
plugin_evaluation_fn: a callable that evaluates the quality of the synthesized
|
111
|
+
quantum circuit; a smaller value means a better circuit. If ``None``, the
|
112
|
+
quality of the circuit its size (i.e. the number of gates that it contains).
|
113
|
+
kwargs: a dictionary mapping higher-level-objects to lists of synthesis methods.
|
114
|
+
"""
|
115
|
+
self.use_default_on_unspecified = use_default_on_unspecified
|
116
|
+
self.plugin_selection = plugin_selection
|
117
|
+
self.plugin_evaluation_fn = (
|
118
|
+
plugin_evaluation_fn if plugin_evaluation_fn is not None else lambda qc: qc.size()
|
119
|
+
)
|
120
|
+
self.methods = {}
|
121
|
+
|
122
|
+
for key, value in kwargs.items():
|
123
|
+
self.set_methods(key, value)
|
124
|
+
|
125
|
+
def set_methods(self, hls_name, hls_methods):
|
126
|
+
"""Sets the list of synthesis methods for a given higher-level-object. This overwrites
|
127
|
+
the lists of methods if also set previously."""
|
128
|
+
self.methods[hls_name] = hls_methods
|
129
|
+
|
130
|
+
|
131
|
+
class HighLevelSynthesis(TransformationPass):
|
132
|
+
r"""Synthesize higher-level objects and unroll custom definitions.
|
133
|
+
|
134
|
+
The input to this pass is a DAG that may contain higher-level objects,
|
135
|
+
including abstract mathematical objects (e.g., objects of type :class:`.LinearFunction`),
|
136
|
+
annotated operations (objects of type :class:`.AnnotatedOperation`), and
|
137
|
+
custom gates.
|
138
|
+
|
139
|
+
In the most common use-case when either ``basis_gates`` or ``target`` is specified,
|
140
|
+
all higher-level objects are synthesized, so the output is a :class:`.DAGCircuit`
|
141
|
+
without such objects.
|
142
|
+
More precisely, every gate in the output DAG is either directly supported by the target,
|
143
|
+
or is in ``equivalence_library``.
|
144
|
+
|
145
|
+
The abstract mathematical objects are synthesized using synthesis plugins, applying
|
146
|
+
synthesis methods specified in the high-level-synthesis config (refer to the documentation
|
147
|
+
for :class:`~.HLSConfig`).
|
148
|
+
|
149
|
+
As an example, let us assume that ``op_a`` and ``op_b`` are names of two higher-level objects,
|
150
|
+
that ``op_a``-objects have two synthesis methods ``default`` which does require any additional
|
151
|
+
parameters and ``other`` with two optional integer parameters ``option_1`` and ``option_2``,
|
152
|
+
that ``op_b``-objects have a single synthesis method ``default``, and ``qc`` is a quantum
|
153
|
+
circuit containing ``op_a`` and ``op_b`` objects. The following code snippet::
|
154
|
+
|
155
|
+
hls_config = HLSConfig(op_b=[("other", {"option_1": 7, "option_2": 4})])
|
156
|
+
pm = PassManager([HighLevelSynthesis(hls_config=hls_config)])
|
157
|
+
transpiled_qc = pm.run(qc)
|
158
|
+
|
159
|
+
shows how to run the alternative synthesis method ``other`` for ``op_b``-objects, while using the
|
160
|
+
``default`` methods for all other high-level objects, including ``op_a``-objects.
|
161
|
+
|
162
|
+
The annotated operations (consisting of a base operation and a list of inverse, control and power
|
163
|
+
modifiers) are synthesizing recursively, first synthesizing the base operation, and then applying
|
164
|
+
synthesis methods for creating inverted, controlled, or powered versions of that).
|
165
|
+
|
166
|
+
The custom gates are synthesized by recursively unrolling their definitions, until every gate
|
167
|
+
is either supported by the target or is in the equivalence library.
|
168
|
+
|
169
|
+
When neither ``basis_gates`` nor ``target`` is specified, the pass synthesizes only the top-level
|
170
|
+
abstract mathematical objects and annotated operations, without descending into the gate
|
171
|
+
``definitions``. This is consistent with the older behavior of the pass, allowing to synthesize
|
172
|
+
some higher-level objects using plugins and leaving the other gates untouched.
|
173
|
+
|
174
|
+
The high-level-synthesis passes information about available auxiliary qubits, and whether their
|
175
|
+
state is clean (defined as :math:`|0\rangle`) or dirty (unknown state) to the synthesis routine
|
176
|
+
via the respective arguments ``"num_clean_ancillas"`` and ``"num_dirty_ancillas"``.
|
177
|
+
If ``qubits_initially_zero`` is ``True`` (default), the qubits are assumed to be in the
|
178
|
+
:math:`|0\rangle` state. When appending a synthesized block using auxiliary qubits onto the
|
179
|
+
circuit, we first use the clean auxiliary qubits.
|
180
|
+
|
181
|
+
.. note::
|
182
|
+
|
183
|
+
Synthesis methods are assumed to maintain the state of the auxiliary qubits.
|
184
|
+
Concretely this means that clean auxiliary qubits must still be in the :math:`|0\rangle`
|
185
|
+
state after the synthesized block, while dirty auxiliary qubits are re-used only
|
186
|
+
as dirty qubits.
|
187
|
+
|
188
|
+
"""
|
189
|
+
|
190
|
+
def __init__(
|
191
|
+
self,
|
192
|
+
hls_config: HLSConfig | None = None,
|
193
|
+
coupling_map: CouplingMap | None = None,
|
194
|
+
target: Target | None = None,
|
195
|
+
use_qubit_indices: bool = False,
|
196
|
+
equivalence_library: EquivalenceLibrary | None = None,
|
197
|
+
basis_gates: list[str] | None = None,
|
198
|
+
min_qubits: int = 0,
|
199
|
+
qubits_initially_zero: bool = True,
|
200
|
+
):
|
201
|
+
r"""
|
202
|
+
HighLevelSynthesis initializer.
|
203
|
+
|
204
|
+
Args:
|
205
|
+
hls_config: Optional, the high-level-synthesis config that specifies synthesis methods
|
206
|
+
and parameters for various high-level-objects in the circuit. If it is not specified,
|
207
|
+
the default synthesis methods and parameters will be used.
|
208
|
+
coupling_map: Optional, directed graph represented as a coupling map.
|
209
|
+
target: Optional, the backend target to use for this pass. If it is specified,
|
210
|
+
it will be used instead of the coupling map.
|
211
|
+
use_qubit_indices: a flag indicating whether this synthesis pass is running before or after
|
212
|
+
the layout is set, that is, whether the qubit indices of higher-level-objects correspond
|
213
|
+
to qubit indices on the target backend.
|
214
|
+
equivalence_library: The equivalence library used (instructions in this library will not
|
215
|
+
be unrolled by this pass).
|
216
|
+
basis_gates: Optional, target basis names to unroll to, e.g. `['u3', 'cx']`.
|
217
|
+
Ignored if ``target`` is also specified.
|
218
|
+
min_qubits: The minimum number of qubits for operations in the input
|
219
|
+
dag to translate.
|
220
|
+
qubits_initially_zero: Indicates whether the qubits are initially in the state
|
221
|
+
:math:`|0\rangle`. This allows the high-level-synthesis to use clean auxiliary qubits
|
222
|
+
(i.e. in the zero state) to synthesize an operation.
|
223
|
+
"""
|
224
|
+
super().__init__()
|
225
|
+
|
226
|
+
# When the config file is not provided, we will use the "default" method
|
227
|
+
# to synthesize Operations (when available).
|
228
|
+
hls_config = hls_config or HLSConfig(True)
|
229
|
+
hls_plugin_manager = HighLevelSynthesisPluginManager()
|
230
|
+
hls_op_names = set(hls_plugin_manager.plugins_by_op.keys()).union(
|
231
|
+
set(hls_config.methods.keys())
|
232
|
+
)
|
233
|
+
|
234
|
+
if target is not None:
|
235
|
+
coupling_map = target.build_coupling_map()
|
236
|
+
|
237
|
+
unroll_definitions = not (
|
238
|
+
(basis_gates is None or len(basis_gates) == 0)
|
239
|
+
and (target is None or len(target.operation_names) == 0)
|
240
|
+
)
|
241
|
+
|
242
|
+
# include path for when target exists but target.num_qubits is None (BasicSimulator)
|
243
|
+
if unroll_definitions and (target is None or target.num_qubits is None):
|
244
|
+
basic_insts = {"measure", "reset", "barrier", "snapshot", "delay", "store"}
|
245
|
+
device_insts = basic_insts | set(basis_gates)
|
246
|
+
else:
|
247
|
+
device_insts = set()
|
248
|
+
|
249
|
+
self.qubits_initially_zero = qubits_initially_zero
|
250
|
+
|
251
|
+
self.data = HighLevelSynthesisData(
|
252
|
+
hls_config=hls_config,
|
253
|
+
hls_plugin_manager=hls_plugin_manager,
|
254
|
+
coupling_map=coupling_map,
|
255
|
+
target=target,
|
256
|
+
equivalence_library=equivalence_library,
|
257
|
+
hls_op_names=hls_op_names,
|
258
|
+
device_insts=device_insts,
|
259
|
+
use_physical_indices=use_qubit_indices,
|
260
|
+
min_qubits=min_qubits,
|
261
|
+
unroll_definitions=unroll_definitions,
|
262
|
+
)
|
263
|
+
|
264
|
+
def run(self, dag: DAGCircuit) -> DAGCircuit:
|
265
|
+
"""Run the HighLevelSynthesis pass on `dag`.
|
266
|
+
|
267
|
+
Args:
|
268
|
+
dag: input dag.
|
269
|
+
|
270
|
+
Returns:
|
271
|
+
Output dag with higher-level operations synthesized.
|
272
|
+
|
273
|
+
Raises:
|
274
|
+
TranspilerError: when the transpiler is unable to synthesize the given DAG
|
275
|
+
(for instance, when the specified synthesis method is not available).
|
276
|
+
"""
|
277
|
+
res = run_on_dag(dag, self.data, self.qubits_initially_zero)
|
278
|
+
return res if res is not None else dag
|
279
|
+
|
280
|
+
|
281
|
+
def _methods_to_try(data: HighLevelSynthesisData, name: str):
|
282
|
+
"""Get a sequence of methods to try for a given op name."""
|
283
|
+
if (methods := data.hls_config.methods.get(name)) is not None:
|
284
|
+
# the operation's name appears in the user-provided config,
|
285
|
+
# we use the list of methods provided by the user
|
286
|
+
return methods
|
287
|
+
if (
|
288
|
+
data.hls_config.use_default_on_unspecified
|
289
|
+
and "default" in data.hls_plugin_manager.method_names(name)
|
290
|
+
):
|
291
|
+
# the operation's name does not appear in the user-specified config,
|
292
|
+
# we use the "default" method when instructed to do so and the "default"
|
293
|
+
# method is available
|
294
|
+
return ["default"]
|
295
|
+
return []
|
296
|
+
|
297
|
+
|
298
|
+
def _synthesize_op_using_plugins(
|
299
|
+
operation: Operation,
|
300
|
+
input_qubits: tuple[int],
|
301
|
+
data: HighLevelSynthesisData,
|
302
|
+
tracker: QubitTracker,
|
303
|
+
) -> tuple[QuantumCircuit, tuple[int], QubitTracker] | None:
|
304
|
+
"""
|
305
|
+
Attempts to synthesize an operation using plugin mechanism.
|
306
|
+
|
307
|
+
Input:
|
308
|
+
operation: the operation to be synthesized.
|
309
|
+
input_qubits: a list of global qubits (qubits in the original circuit) over
|
310
|
+
which the operation is defined.
|
311
|
+
data: high-level-synthesis data and options.
|
312
|
+
tracker: the global tracker, tracking the state of global qubits.
|
313
|
+
hls_methods: the list of synthesis methods to try.
|
314
|
+
|
315
|
+
The function is called from within Rust code.
|
316
|
+
|
317
|
+
Returns either the synthesized circuit or ``None`` (which may occur
|
318
|
+
when no synthesis methods is available or specified, or when there is
|
319
|
+
an insufficient number of auxiliary qubits).
|
320
|
+
"""
|
321
|
+
hls_methods = _methods_to_try(data, operation.name)
|
322
|
+
if len(hls_methods) == 0:
|
323
|
+
return None
|
324
|
+
|
325
|
+
hls_plugin_manager = data.hls_plugin_manager
|
326
|
+
num_clean_ancillas = tracker.num_clean(input_qubits)
|
327
|
+
num_dirty_ancillas = tracker.num_dirty(input_qubits)
|
328
|
+
|
329
|
+
best_decomposition = None
|
330
|
+
best_score = np.inf
|
331
|
+
|
332
|
+
for method in hls_methods:
|
333
|
+
# There are two ways to specify a synthesis method. The more explicit
|
334
|
+
# way is to specify it as a tuple consisting of a synthesis algorithm and a
|
335
|
+
# list of additional arguments, e.g.,
|
336
|
+
# ("kms", {"all_mats": 1, "max_paths": 100, "orig_circuit": 0}), or
|
337
|
+
# ("pmh", {}).
|
338
|
+
# When the list of additional arguments is empty, one can also specify
|
339
|
+
# just the synthesis algorithm, e.g.,
|
340
|
+
# "pmh".
|
341
|
+
if isinstance(method, tuple):
|
342
|
+
plugin_specifier, plugin_args = method
|
343
|
+
else:
|
344
|
+
plugin_specifier = method
|
345
|
+
plugin_args = {}
|
346
|
+
|
347
|
+
# There are two ways to specify a synthesis algorithm being run,
|
348
|
+
# either by name, e.g. "kms" (which then should be specified in entry_points),
|
349
|
+
# or directly as a class inherited from HighLevelSynthesisPlugin (which then
|
350
|
+
# does not need to be specified in entry_points).
|
351
|
+
if isinstance(plugin_specifier, str):
|
352
|
+
if plugin_specifier not in hls_plugin_manager.method_names(operation.name):
|
353
|
+
raise TranspilerError(
|
354
|
+
f"Specified method: {plugin_specifier} not found in available "
|
355
|
+
f"plugins for {operation.name}"
|
356
|
+
)
|
357
|
+
plugin_method = hls_plugin_manager.method(operation.name, plugin_specifier)
|
358
|
+
else:
|
359
|
+
plugin_method = plugin_specifier
|
360
|
+
|
361
|
+
# The additional arguments we pass to every plugin include the list of global
|
362
|
+
# qubits over which the operation is defined, high-level-synthesis data and options,
|
363
|
+
# and the tracker that tracks the state for global qubits.
|
364
|
+
#
|
365
|
+
# Note: the difference between the argument "qubits" passed explicitly to "run"
|
366
|
+
# and "input_qubits" passed via "plugin_args" is that for backwards compatibility
|
367
|
+
# the former should be None if the synthesis is done before layout/routing.
|
368
|
+
# However, plugins may need access to the global qubits over which the operation
|
369
|
+
# is defined, as well as their state, in particular the plugin for AnnotatedOperations
|
370
|
+
# requires these arguments to be able to process the base operation recursively.
|
371
|
+
#
|
372
|
+
# We may want to refactor the inputs and the outputs for the plugins' "run" method,
|
373
|
+
# however this needs to be backwards-compatible.
|
374
|
+
plugin_args["input_qubits"] = input_qubits
|
375
|
+
plugin_args["hls_data"] = data
|
376
|
+
plugin_args["qubit_tracker"] = tracker
|
377
|
+
plugin_args["num_clean_ancillas"] = num_clean_ancillas
|
378
|
+
plugin_args["num_dirty_ancillas"] = num_dirty_ancillas
|
379
|
+
|
380
|
+
qubits = input_qubits if data.use_physical_indices else None
|
381
|
+
|
382
|
+
decomposition = plugin_method.run(
|
383
|
+
operation,
|
384
|
+
coupling_map=data.coupling_map,
|
385
|
+
target=data.target,
|
386
|
+
qubits=qubits,
|
387
|
+
**plugin_args,
|
388
|
+
)
|
389
|
+
|
390
|
+
# The synthesis methods that are not suited for the given higher-level-object
|
391
|
+
# will return None.
|
392
|
+
if decomposition is not None:
|
393
|
+
if data.hls_config.plugin_selection == "sequential":
|
394
|
+
# In the "sequential" mode the first successful decomposition is
|
395
|
+
# returned.
|
396
|
+
best_decomposition = decomposition
|
397
|
+
break
|
398
|
+
|
399
|
+
# In the "run everything" mode we update the best decomposition
|
400
|
+
# discovered
|
401
|
+
current_score = data.hls_config.plugin_evaluation_fn(decomposition)
|
402
|
+
if current_score < best_score:
|
403
|
+
best_decomposition = decomposition
|
404
|
+
best_score = current_score
|
405
|
+
|
406
|
+
# A synthesis method may have potentially used available ancilla qubits.
|
407
|
+
# The following greedily grabs global qubits available. In the additional
|
408
|
+
# refactoring mentioned previously, we want each plugin to actually return
|
409
|
+
# the global qubits used, especially when the synthesis is done on the physical
|
410
|
+
# circuit, and the choice of which ancilla qubits to use really matters.
|
411
|
+
output_qubits = input_qubits
|
412
|
+
if best_decomposition is not None:
|
413
|
+
if best_decomposition.num_qubits > len(input_qubits):
|
414
|
+
global_aux_qubits = tracker.borrow(
|
415
|
+
best_decomposition.num_qubits - len(input_qubits), input_qubits
|
416
|
+
)
|
417
|
+
output_qubits = output_qubits + global_aux_qubits
|
418
|
+
|
419
|
+
# This checks (in particular) that there is indeed a sufficient number
|
420
|
+
# of ancilla qubits to borrow from the tracker.
|
421
|
+
if best_decomposition.num_qubits != len(output_qubits):
|
422
|
+
raise TranspilerError(
|
423
|
+
"HighLevelSynthesis: the result from 'synthesize_op_using_plugin' is incorrect."
|
424
|
+
)
|
425
|
+
|
426
|
+
if best_decomposition is None:
|
427
|
+
return None
|
428
|
+
|
429
|
+
return (best_decomposition, output_qubits)
|