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,258 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 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
|
+
=======================================
|
15
|
+
Passmanager (:mod:`qiskit.passmanager`)
|
16
|
+
=======================================
|
17
|
+
|
18
|
+
.. currentmodule:: qiskit.passmanager
|
19
|
+
|
20
|
+
Overview
|
21
|
+
========
|
22
|
+
|
23
|
+
The Qiskit pass manager is somewhat inspired by the `LLVM compiler <https://llvm.org/>`_,
|
24
|
+
but it is designed to take a Python object as an input instead of plain source code.
|
25
|
+
|
26
|
+
The pass manager converts the input Python object into an intermediate representation (IR),
|
27
|
+
and it can be optimized and get lowered with a variety of transformations over multiple passes.
|
28
|
+
The pass manager framework may employ multiple IRs with interleaved conversion passes,
|
29
|
+
depending on the context of the optimization.
|
30
|
+
|
31
|
+
.. note::
|
32
|
+
|
33
|
+
Currently there is no actual use/design of multiple IRs in the builtin Qiskit pass managers.
|
34
|
+
The implementation of the :mod:`passmanager` module is agnostic to
|
35
|
+
actual IR types (i.e. no strict type check is performed), and the pass manager works
|
36
|
+
as long as the IR implements all methods required by subsequent passes.
|
37
|
+
A concrete design for the use of multiple IRs might be provided in the future release.
|
38
|
+
|
39
|
+
The passes may consume the hardware constraints that the Qiskit backend may provide.
|
40
|
+
Finally, the IR is converted back to some Python object.
|
41
|
+
Note that the input type and output type are not necessarily the same.
|
42
|
+
|
43
|
+
Compilation in the pass manager is a chain of :class:`~.passmanager.Task` executions that
|
44
|
+
take an IR and output a new IR with some optimization or data analysis.
|
45
|
+
An atomic task is a *pass* which is a subclass of :class:`.GenericPass` that implements
|
46
|
+
a :meth:`.~GenericPass.run` method that performs some work on the received IR.
|
47
|
+
A set of passes may form a *flow controller*, which is a subclass of
|
48
|
+
:class:`.BaseController`, which can implement arbitrary compilation-state-dependent logic for
|
49
|
+
deciding which pass will get run next.
|
50
|
+
Passes share intermediate data via the :class:`.PropertySet` object which is
|
51
|
+
a free-form dictionary. A pass can populate the property set dictionary during the task execution.
|
52
|
+
A flow controller can also consume the property set to control the pass execution,
|
53
|
+
but this access must be read-only.
|
54
|
+
The property set is portable and handed over from pass to pass at execution.
|
55
|
+
In addition to the property set, tasks also receive a :class:`.WorkflowStatus` data structure.
|
56
|
+
This object is initialized when the pass manager is run and handed over to underlying tasks.
|
57
|
+
The status is updated after every pass is run, and contains information about the pipeline state
|
58
|
+
(number of passes run, failure state, and so on) as opposed to the :class:`PropertySet`, which
|
59
|
+
contains information about the IR being optimized.
|
60
|
+
|
61
|
+
A pass manager is a wrapper of the flow controller, with responsibilities of
|
62
|
+
|
63
|
+
* Scheduling optimization tasks,
|
64
|
+
* Converting an input Python object to a particular Qiskit IR,
|
65
|
+
* Initializing a property set and workflow status,
|
66
|
+
* Running scheduled tasks to apply a series of transformations to the IR,
|
67
|
+
* Converting the IR back to an output Python object.
|
68
|
+
|
69
|
+
This indicates that the flow controller itself is type-agnostic, and a developer must
|
70
|
+
implement a subclass of the :class:`BasePassManager` to manage the data conversion steps.
|
71
|
+
This *veil of ignorance* allows us to choose the most efficient data representation
|
72
|
+
for a particular pass manager task, while we can reuse the flow control machinery
|
73
|
+
for different input and output types.
|
74
|
+
|
75
|
+
A single flow controller always takes a single IR object, and returns a single
|
76
|
+
IR object. Parallelism for multiple input objects is supported by the
|
77
|
+
:class:`BasePassManager` by broadcasting the flow controller via
|
78
|
+
the :func:`.parallel_map` function.
|
79
|
+
|
80
|
+
|
81
|
+
Examples
|
82
|
+
========
|
83
|
+
|
84
|
+
We look into a toy optimization task, namely, preparing a row of numbers
|
85
|
+
and remove a digit if the number is five.
|
86
|
+
Such task might be easily done by converting the input numbers into string.
|
87
|
+
We use the pass manager framework here, putting the efficiency aside for
|
88
|
+
a moment to learn how to build a custom Qiskit compiler.
|
89
|
+
|
90
|
+
.. plot::
|
91
|
+
:include-source:
|
92
|
+
:nofigs:
|
93
|
+
:context:
|
94
|
+
|
95
|
+
from qiskit.passmanager import BasePassManager, GenericPass, ConditionalController
|
96
|
+
|
97
|
+
class ToyPassManager(BasePassManager):
|
98
|
+
|
99
|
+
def _passmanager_frontend(self, input_program: int, **kwargs) -> str:
|
100
|
+
return str(input_program)
|
101
|
+
|
102
|
+
def _passmanager_backend(self, passmanager_ir: str, in_program: int, **kwargs) -> int:
|
103
|
+
return int(passmanager_ir)
|
104
|
+
|
105
|
+
This pass manager inputs and outputs an integer number, while
|
106
|
+
performing the optimization tasks on a string data.
|
107
|
+
Hence, input, IR, output type are integer, string, integer, respectively.
|
108
|
+
The :meth:`.~BasePassManager._passmanager_frontend` method defines the conversion from the
|
109
|
+
input data to IR, and :meth:`.~BasePassManager._passmanager_backend` defines
|
110
|
+
the conversion from the IR to output data.
|
111
|
+
The pass manager backend is also given an :code:`in_program` parameter that contains the original
|
112
|
+
``input_program`` to the front end, for referencing any original metadata of the input program for
|
113
|
+
the final conversion.
|
114
|
+
|
115
|
+
Next, we implement a pass that removes a digit when the number is five.
|
116
|
+
|
117
|
+
.. plot::
|
118
|
+
:include-source:
|
119
|
+
:nofigs:
|
120
|
+
:context:
|
121
|
+
|
122
|
+
class RemoveFive(GenericPass):
|
123
|
+
|
124
|
+
def run(self, passmanager_ir: str):
|
125
|
+
return passmanager_ir.replace("5", "")
|
126
|
+
|
127
|
+
task = RemoveFive()
|
128
|
+
|
129
|
+
Finally, we instantiate a pass manager and schedule the task with it.
|
130
|
+
Running the pass manager with random row of numbers returns
|
131
|
+
new numbers that don't contain five.
|
132
|
+
|
133
|
+
.. plot::
|
134
|
+
:include-source:
|
135
|
+
:nofigs:
|
136
|
+
:context:
|
137
|
+
|
138
|
+
pm = ToyPassManager()
|
139
|
+
pm.append(task)
|
140
|
+
|
141
|
+
pm.run([123456789, 45654, 36785554])
|
142
|
+
|
143
|
+
Output:
|
144
|
+
|
145
|
+
.. code-block:: text
|
146
|
+
|
147
|
+
[12346789, 464, 36784]
|
148
|
+
|
149
|
+
Now we consider the case of conditional execution.
|
150
|
+
We avoid execution of the "remove five" task when the input number is
|
151
|
+
six digits or less. Such control can be implemented by a flow controller.
|
152
|
+
We start from an analysis pass that provides the flow controller
|
153
|
+
with information about the number of digits.
|
154
|
+
|
155
|
+
.. plot::
|
156
|
+
:include-source:
|
157
|
+
:nofigs:
|
158
|
+
:context:
|
159
|
+
|
160
|
+
class CountDigits(GenericPass):
|
161
|
+
|
162
|
+
def run(self, passmanager_ir: str):
|
163
|
+
self.property_set["ndigits"] = len(passmanager_ir)
|
164
|
+
|
165
|
+
analysis_task = CountDigits()
|
166
|
+
|
167
|
+
Then, we wrap the remove five task with the :class:`.ConditionalController`
|
168
|
+
that runs the stored tasks only when the condition is met.
|
169
|
+
|
170
|
+
.. plot::
|
171
|
+
:include-source:
|
172
|
+
:nofigs:
|
173
|
+
:context:
|
174
|
+
|
175
|
+
def digit_condition(property_set):
|
176
|
+
# Return True when condition is met.
|
177
|
+
return property_set["ndigits"] > 6
|
178
|
+
|
179
|
+
conditional_task = ConditionalController(
|
180
|
+
tasks=[RemoveFive()],
|
181
|
+
condition=digit_condition,
|
182
|
+
)
|
183
|
+
|
184
|
+
As before, we schedule these passes with the pass manager and run.
|
185
|
+
|
186
|
+
.. plot::
|
187
|
+
:include-source:
|
188
|
+
:nofigs:
|
189
|
+
:context:
|
190
|
+
|
191
|
+
pm = ToyPassManager()
|
192
|
+
pm.append(analysis_task)
|
193
|
+
pm.append(conditional_task)
|
194
|
+
|
195
|
+
pm.run([123456789, 45654, 36785554])
|
196
|
+
|
197
|
+
Output:
|
198
|
+
|
199
|
+
.. code-block:: text
|
200
|
+
|
201
|
+
[12346789, 45654, 36784]
|
202
|
+
|
203
|
+
The "remove five" task is triggered only for the first and third input
|
204
|
+
values, which have more than six digits.
|
205
|
+
|
206
|
+
With the pass manager framework, a developer can flexibly customize
|
207
|
+
the optimization task by combining multiple passes and flow controllers.
|
208
|
+
See details for following class API documentations.
|
209
|
+
|
210
|
+
|
211
|
+
Interface
|
212
|
+
=========
|
213
|
+
|
214
|
+
Base classes
|
215
|
+
------------
|
216
|
+
|
217
|
+
.. autosummary::
|
218
|
+
:toctree: ../stubs/
|
219
|
+
|
220
|
+
BasePassManager
|
221
|
+
BaseController
|
222
|
+
GenericPass
|
223
|
+
|
224
|
+
Flow controllers
|
225
|
+
----------------
|
226
|
+
|
227
|
+
.. autosummary::
|
228
|
+
:toctree: ../stubs/
|
229
|
+
|
230
|
+
FlowControllerLinear
|
231
|
+
ConditionalController
|
232
|
+
DoWhileController
|
233
|
+
|
234
|
+
Compilation state
|
235
|
+
-----------------
|
236
|
+
|
237
|
+
.. autosummary::
|
238
|
+
:toctree: ../stubs/
|
239
|
+
|
240
|
+
PropertySet
|
241
|
+
WorkflowStatus
|
242
|
+
PassManagerState
|
243
|
+
|
244
|
+
Exceptions
|
245
|
+
----------
|
246
|
+
|
247
|
+
.. autoexception:: PassManagerError
|
248
|
+
"""
|
249
|
+
|
250
|
+
from .passmanager import BasePassManager
|
251
|
+
from .flow_controllers import (
|
252
|
+
FlowControllerLinear,
|
253
|
+
ConditionalController,
|
254
|
+
DoWhileController,
|
255
|
+
)
|
256
|
+
from .base_tasks import GenericPass, BaseController
|
257
|
+
from .compilation_status import PropertySet, WorkflowStatus, PassManagerState
|
258
|
+
from .exceptions import PassManagerError
|
@@ -0,0 +1,230 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 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
|
+
"""Baseclasses for the Qiskit passmanager optimization tasks."""
|
14
|
+
from __future__ import annotations
|
15
|
+
|
16
|
+
import logging
|
17
|
+
import time
|
18
|
+
from abc import abstractmethod, ABC
|
19
|
+
from collections.abc import Iterable, Callable, Generator
|
20
|
+
from typing import Any
|
21
|
+
|
22
|
+
from .compilation_status import RunState, PassManagerState, PropertySet
|
23
|
+
|
24
|
+
logger = logging.getLogger(__name__)
|
25
|
+
|
26
|
+
# Type alias
|
27
|
+
PassManagerIR = Any
|
28
|
+
|
29
|
+
|
30
|
+
class Task(ABC):
|
31
|
+
"""An interface of the pass manager task.
|
32
|
+
|
33
|
+
The task takes a Qiskit IR, and outputs new Qiskit IR after some operation on it.
|
34
|
+
A task can rely on the :class:`.PropertySet` to communicate intermediate data among tasks.
|
35
|
+
"""
|
36
|
+
|
37
|
+
@abstractmethod
|
38
|
+
def execute(
|
39
|
+
self,
|
40
|
+
passmanager_ir: PassManagerIR,
|
41
|
+
state: PassManagerState,
|
42
|
+
callback: Callable = None,
|
43
|
+
) -> tuple[PassManagerIR, PassManagerState]:
|
44
|
+
"""Execute optimization task for input Qiskit IR.
|
45
|
+
|
46
|
+
Args:
|
47
|
+
passmanager_ir: Qiskit IR to optimize.
|
48
|
+
state: State associated with workflow execution by the pass manager itself.
|
49
|
+
callback: A callback function which is caller per execution of optimization task.
|
50
|
+
|
51
|
+
Returns:
|
52
|
+
Optimized Qiskit IR and state of the workflow.
|
53
|
+
"""
|
54
|
+
pass
|
55
|
+
|
56
|
+
|
57
|
+
class GenericPass(Task, ABC):
|
58
|
+
"""Base class of a single pass manager task.
|
59
|
+
|
60
|
+
A pass instance can read and write to the provided :class:`.PropertySet`,
|
61
|
+
and may modify the input pass manager IR.
|
62
|
+
"""
|
63
|
+
|
64
|
+
def __init__(self):
|
65
|
+
self.property_set = PropertySet()
|
66
|
+
self.requires: Iterable[Task] = []
|
67
|
+
|
68
|
+
def name(self) -> str:
|
69
|
+
"""Name of the pass."""
|
70
|
+
return self.__class__.__name__
|
71
|
+
|
72
|
+
def execute(
|
73
|
+
self,
|
74
|
+
passmanager_ir: PassManagerIR,
|
75
|
+
state: PassManagerState,
|
76
|
+
callback: Callable = None,
|
77
|
+
) -> tuple[PassManagerIR, PassManagerState]:
|
78
|
+
# Overriding this method is not safe.
|
79
|
+
# Pass subclass must keep current implementation.
|
80
|
+
# Especially, task execution may break when method signature is modified.
|
81
|
+
self.property_set = state.property_set
|
82
|
+
|
83
|
+
if self.requires:
|
84
|
+
# pylint: disable=cyclic-import
|
85
|
+
from .flow_controllers import FlowControllerLinear
|
86
|
+
|
87
|
+
passmanager_ir, state = FlowControllerLinear(self.requires).execute(
|
88
|
+
passmanager_ir=passmanager_ir,
|
89
|
+
state=state,
|
90
|
+
callback=callback,
|
91
|
+
)
|
92
|
+
|
93
|
+
run_state = None
|
94
|
+
ret = None
|
95
|
+
start_time = time.time()
|
96
|
+
try:
|
97
|
+
if self not in state.workflow_status.completed_passes:
|
98
|
+
ret = self.run(passmanager_ir)
|
99
|
+
run_state = RunState.SUCCESS
|
100
|
+
else:
|
101
|
+
run_state = RunState.SKIP
|
102
|
+
except Exception:
|
103
|
+
run_state = RunState.FAIL
|
104
|
+
raise
|
105
|
+
finally:
|
106
|
+
ret = ret or passmanager_ir
|
107
|
+
if run_state != RunState.SKIP:
|
108
|
+
running_time = time.time() - start_time
|
109
|
+
logger.info("Pass: %s - %.5f (ms)", self.name(), running_time * 1000)
|
110
|
+
if callback is not None:
|
111
|
+
callback(
|
112
|
+
task=self,
|
113
|
+
passmanager_ir=ret,
|
114
|
+
property_set=state.property_set,
|
115
|
+
running_time=running_time,
|
116
|
+
count=state.workflow_status.count,
|
117
|
+
)
|
118
|
+
return ret, self.update_status(state, run_state)
|
119
|
+
|
120
|
+
def update_status(
|
121
|
+
self,
|
122
|
+
state: PassManagerState,
|
123
|
+
run_state: RunState,
|
124
|
+
) -> PassManagerState:
|
125
|
+
"""Update workflow status.
|
126
|
+
|
127
|
+
Args:
|
128
|
+
state: Pass manager state to update.
|
129
|
+
run_state: Completion status of current task.
|
130
|
+
|
131
|
+
Returns:
|
132
|
+
Updated pass manager state.
|
133
|
+
"""
|
134
|
+
state.workflow_status.previous_run = run_state
|
135
|
+
if run_state == RunState.SUCCESS:
|
136
|
+
state.workflow_status.count += 1
|
137
|
+
state.workflow_status.completed_passes.add(self)
|
138
|
+
return state
|
139
|
+
|
140
|
+
@abstractmethod
|
141
|
+
def run(
|
142
|
+
self,
|
143
|
+
passmanager_ir: PassManagerIR,
|
144
|
+
) -> PassManagerIR:
|
145
|
+
"""Run optimization task.
|
146
|
+
|
147
|
+
Args:
|
148
|
+
passmanager_ir: Qiskit IR to optimize.
|
149
|
+
|
150
|
+
Returns:
|
151
|
+
Optimized Qiskit IR.
|
152
|
+
"""
|
153
|
+
pass
|
154
|
+
|
155
|
+
|
156
|
+
class BaseController(Task, ABC):
|
157
|
+
"""Base class of controller.
|
158
|
+
|
159
|
+
A controller is built with a collection of pass manager tasks,
|
160
|
+
and a subclass provides a custom logic to choose next task to run.
|
161
|
+
Note a controller can be nested into another controller,
|
162
|
+
and a controller itself doesn't provide any subroutine to modify the input IR.
|
163
|
+
"""
|
164
|
+
|
165
|
+
def __init__(
|
166
|
+
self,
|
167
|
+
options: dict[str, Any] | None = None,
|
168
|
+
):
|
169
|
+
"""Create new flow controller.
|
170
|
+
|
171
|
+
Args:
|
172
|
+
options: Option for this flow controller.
|
173
|
+
"""
|
174
|
+
self._options = options or {}
|
175
|
+
|
176
|
+
@abstractmethod
|
177
|
+
def iter_tasks(
|
178
|
+
self,
|
179
|
+
state: PassManagerState,
|
180
|
+
) -> Generator[Task, PassManagerState, None]:
|
181
|
+
"""A custom logic to choose a next task to run.
|
182
|
+
|
183
|
+
Controller subclass can consume the state to build a proper task pipeline. The updated
|
184
|
+
state after a task execution will be fed back in as the "return" value of any ``yield``
|
185
|
+
statements. This indicates the order of task execution is only determined at running time.
|
186
|
+
This method is not allowed to mutate the given state object.
|
187
|
+
|
188
|
+
Args:
|
189
|
+
state: The state of the passmanager workflow at the beginning of this flow controller's
|
190
|
+
execution.
|
191
|
+
|
192
|
+
Receives:
|
193
|
+
state: the state of pass manager after the execution of the last task that was yielded.
|
194
|
+
The generator does not need to inspect this if it is irrelevant to its logic, nor
|
195
|
+
update it.
|
196
|
+
|
197
|
+
Yields:
|
198
|
+
Task: Next task to run.
|
199
|
+
"""
|
200
|
+
pass
|
201
|
+
|
202
|
+
def execute(
|
203
|
+
self,
|
204
|
+
passmanager_ir: PassManagerIR,
|
205
|
+
state: PassManagerState,
|
206
|
+
callback: Callable = None,
|
207
|
+
) -> tuple[PassManagerIR, PassManagerState]:
|
208
|
+
# Overriding this method is not safe.
|
209
|
+
# Pass subclass must keep current implementation.
|
210
|
+
# Especially, task execution may break when method signature is modified.
|
211
|
+
|
212
|
+
task_generator = self.iter_tasks(state)
|
213
|
+
try:
|
214
|
+
next_task = task_generator.send(None)
|
215
|
+
except StopIteration:
|
216
|
+
return passmanager_ir, state
|
217
|
+
while True:
|
218
|
+
passmanager_ir, state = next_task.execute(
|
219
|
+
passmanager_ir=passmanager_ir,
|
220
|
+
state=state,
|
221
|
+
callback=callback,
|
222
|
+
)
|
223
|
+
try:
|
224
|
+
# Sending the object through the generator implies the custom controllers
|
225
|
+
# can always rely on the latest data to choose the next task to run.
|
226
|
+
next_task = task_generator.send(state)
|
227
|
+
except StopIteration:
|
228
|
+
break
|
229
|
+
|
230
|
+
return passmanager_ir, state
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2018, 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
|
+
"""A property set dictionary that shared among optimization passes."""
|
14
|
+
|
15
|
+
|
16
|
+
from dataclasses import dataclass, field
|
17
|
+
from enum import Enum
|
18
|
+
|
19
|
+
|
20
|
+
class PropertySet(dict):
|
21
|
+
"""A default dictionary-like object."""
|
22
|
+
|
23
|
+
def __missing__(self, key):
|
24
|
+
return None
|
25
|
+
|
26
|
+
|
27
|
+
class RunState(Enum):
|
28
|
+
"""Allowed values for the result of a pass execution."""
|
29
|
+
|
30
|
+
SUCCESS = 0
|
31
|
+
FAIL = 1
|
32
|
+
SKIP = 2
|
33
|
+
|
34
|
+
|
35
|
+
@dataclass
|
36
|
+
class WorkflowStatus:
|
37
|
+
"""Collection of compilation status of workflow, i.e. pass manager run.
|
38
|
+
|
39
|
+
This data structure is initialized when the pass manager is run,
|
40
|
+
and recursively handed over to underlying tasks.
|
41
|
+
Each pass will update this status once after being executed, and the lifetime of the
|
42
|
+
workflow status object is the time during which the pass manager is running.
|
43
|
+
"""
|
44
|
+
|
45
|
+
count: int = 0
|
46
|
+
"""Current number of pass execution."""
|
47
|
+
|
48
|
+
completed_passes: set = field(default_factory=set)
|
49
|
+
"""Passes already run that have not been invalidated."""
|
50
|
+
|
51
|
+
previous_run: RunState = RunState.FAIL
|
52
|
+
"""Status of the latest pass run."""
|
53
|
+
|
54
|
+
|
55
|
+
@dataclass
|
56
|
+
class PassManagerState:
|
57
|
+
"""A portable container object that pass manager tasks communicate through generator.
|
58
|
+
|
59
|
+
This object can contain every information about the running pass manager workflow,
|
60
|
+
except for the IR object being optimized.
|
61
|
+
The data structure consists of two elements; one for the status of the
|
62
|
+
workflow itself, and another one for the additional information about the IR
|
63
|
+
analyzed through pass executions. This container aims at just providing
|
64
|
+
a robust interface for the :meth:`.Task.execute`, and no logic that modifies
|
65
|
+
the container elements must be implemented.
|
66
|
+
|
67
|
+
This object is mutable, and might be mutated by pass executions.
|
68
|
+
"""
|
69
|
+
|
70
|
+
workflow_status: WorkflowStatus
|
71
|
+
"""Status of the current compilation workflow."""
|
72
|
+
|
73
|
+
property_set: PropertySet
|
74
|
+
"""Information about IR being optimized."""
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 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
|
+
"""Qiskit pass manager exceptions."""
|
14
|
+
|
15
|
+
from qiskit.exceptions import QiskitError
|
16
|
+
|
17
|
+
|
18
|
+
class PassManagerError(QiskitError):
|
19
|
+
"""Pass manager error."""
|
@@ -0,0 +1,116 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2019, 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
|
+
"""Built-in pass flow controllers."""
|
14
|
+
from __future__ import annotations
|
15
|
+
|
16
|
+
import logging
|
17
|
+
from collections.abc import Callable, Iterable, Generator
|
18
|
+
from typing import Any
|
19
|
+
|
20
|
+
from .base_tasks import BaseController, Task
|
21
|
+
from .compilation_status import PassManagerState, PropertySet
|
22
|
+
from .exceptions import PassManagerError
|
23
|
+
|
24
|
+
logger = logging.getLogger(__name__)
|
25
|
+
|
26
|
+
|
27
|
+
class FlowControllerLinear(BaseController):
|
28
|
+
"""A standard flow controller that runs tasks one after the other."""
|
29
|
+
|
30
|
+
def __init__(
|
31
|
+
self,
|
32
|
+
tasks: Task | Iterable[Task] = (),
|
33
|
+
*,
|
34
|
+
options: dict[str, Any] | None = None,
|
35
|
+
):
|
36
|
+
super().__init__(options)
|
37
|
+
|
38
|
+
if not isinstance(tasks, Iterable):
|
39
|
+
tasks = [tasks]
|
40
|
+
self.tasks: tuple[Task] = tuple(tasks)
|
41
|
+
|
42
|
+
@property
|
43
|
+
def passes(self) -> list[Task]:
|
44
|
+
"""Alias of tasks for backward compatibility."""
|
45
|
+
return list(self.tasks)
|
46
|
+
|
47
|
+
def iter_tasks(self, state: PassManagerState) -> Generator[Task, PassManagerState, None]:
|
48
|
+
for task in self.tasks:
|
49
|
+
state = yield task
|
50
|
+
|
51
|
+
|
52
|
+
class DoWhileController(BaseController):
|
53
|
+
"""Run the given tasks in a loop until the ``do_while`` condition on the property set becomes
|
54
|
+
``False``.
|
55
|
+
|
56
|
+
The given tasks will always run at least once, and on iteration of the loop, all the
|
57
|
+
tasks will be run (with the exception of a failure state being set)."""
|
58
|
+
|
59
|
+
def __init__(
|
60
|
+
self,
|
61
|
+
tasks: Task | Iterable[Task] = (),
|
62
|
+
do_while: Callable[[PropertySet], bool] = None,
|
63
|
+
*,
|
64
|
+
options: dict[str, Any] | None = None,
|
65
|
+
):
|
66
|
+
super().__init__(options)
|
67
|
+
|
68
|
+
if not isinstance(tasks, Iterable):
|
69
|
+
tasks = [tasks]
|
70
|
+
self.tasks: tuple[Task] = tuple(tasks)
|
71
|
+
self.do_while = do_while
|
72
|
+
|
73
|
+
@property
|
74
|
+
def passes(self) -> list[Task]:
|
75
|
+
"""Alias of tasks for backward compatibility."""
|
76
|
+
return list(self.tasks)
|
77
|
+
|
78
|
+
def iter_tasks(self, state: PassManagerState) -> Generator[Task, PassManagerState, None]:
|
79
|
+
max_iteration = self._options.get("max_iteration", 1000)
|
80
|
+
for _ in range(max_iteration):
|
81
|
+
for task in self.tasks:
|
82
|
+
state = yield task
|
83
|
+
if not self.do_while(state.property_set):
|
84
|
+
return
|
85
|
+
# Remove stored tasks from the completed task collection for next loop
|
86
|
+
state.workflow_status.completed_passes.difference_update(self.tasks)
|
87
|
+
raise PassManagerError(f"Maximum iteration reached. max_iteration={max_iteration}")
|
88
|
+
|
89
|
+
|
90
|
+
class ConditionalController(BaseController):
|
91
|
+
"""A flow controller runs the pipeline once if the condition is true, or does nothing if the
|
92
|
+
condition is false."""
|
93
|
+
|
94
|
+
def __init__(
|
95
|
+
self,
|
96
|
+
tasks: Task | Iterable[Task] = (),
|
97
|
+
condition: Callable[[PropertySet], bool] = None,
|
98
|
+
*,
|
99
|
+
options: dict[str, Any] | None = None,
|
100
|
+
):
|
101
|
+
super().__init__(options)
|
102
|
+
|
103
|
+
if not isinstance(tasks, Iterable):
|
104
|
+
tasks = [tasks]
|
105
|
+
self.tasks: tuple[Task] = tuple(tasks)
|
106
|
+
self.condition = condition
|
107
|
+
|
108
|
+
@property
|
109
|
+
def passes(self) -> list[Task]:
|
110
|
+
"""Alias of tasks for backward compatibility."""
|
111
|
+
return list(self.tasks)
|
112
|
+
|
113
|
+
def iter_tasks(self, state: PassManagerState) -> Generator[Task, PassManagerState, None]:
|
114
|
+
if self.condition(state.property_set):
|
115
|
+
for task in self.tasks:
|
116
|
+
state = yield task
|