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,251 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2022, 2024.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Rescheduler pass to adjust node start times."""
|
14
|
+
from __future__ import annotations
|
15
|
+
from collections.abc import Generator
|
16
|
+
|
17
|
+
from qiskit.circuit.gate import Gate
|
18
|
+
from qiskit.circuit.delay import Delay
|
19
|
+
from qiskit.circuit.measure import Measure
|
20
|
+
from qiskit.circuit.reset import Reset
|
21
|
+
from qiskit.dagcircuit import DAGCircuit, DAGOpNode, DAGOutNode
|
22
|
+
from qiskit.transpiler.basepasses import AnalysisPass
|
23
|
+
from qiskit.transpiler.exceptions import TranspilerError
|
24
|
+
from qiskit.transpiler.target import Target
|
25
|
+
|
26
|
+
|
27
|
+
class ConstrainedReschedule(AnalysisPass):
|
28
|
+
"""Rescheduler pass that updates node start times to conform to the hardware alignments.
|
29
|
+
|
30
|
+
This pass shifts DAG node start times previously scheduled with one of
|
31
|
+
the scheduling passes, e.g. :class:`ASAPScheduleAnalysis` or :class:`ALAPScheduleAnalysis`,
|
32
|
+
so that every instruction start time satisfies alignment constraints.
|
33
|
+
|
34
|
+
Examples:
|
35
|
+
|
36
|
+
We assume executing the following circuit on a backend with 16 dt of acquire alignment.
|
37
|
+
|
38
|
+
.. code-block:: text
|
39
|
+
|
40
|
+
┌───┐┌────────────────┐┌─┐
|
41
|
+
q_0: ┤ X ├┤ Delay(100[dt]) ├┤M├
|
42
|
+
└───┘└────────────────┘└╥┘
|
43
|
+
c: 1/════════════════════════╩═
|
44
|
+
0
|
45
|
+
|
46
|
+
Note that delay of 100 dt induces a misalignment of 4 dt at the measurement.
|
47
|
+
This pass appends an extra 12 dt time shift to the input circuit.
|
48
|
+
|
49
|
+
.. code-block:: text
|
50
|
+
|
51
|
+
┌───┐┌────────────────┐┌─┐
|
52
|
+
q_0: ┤ X ├┤ Delay(112[dt]) ├┤M├
|
53
|
+
└───┘└────────────────┘└╥┘
|
54
|
+
c: 1/════════════════════════╩═
|
55
|
+
0
|
56
|
+
|
57
|
+
Notes:
|
58
|
+
|
59
|
+
Your backend may execute circuits violating these alignment constraints.
|
60
|
+
However, you may obtain erroneous measurement result because of the
|
61
|
+
untracked phase originating in the instruction misalignment.
|
62
|
+
"""
|
63
|
+
|
64
|
+
def __init__(
|
65
|
+
self,
|
66
|
+
acquire_alignment: int = 1,
|
67
|
+
pulse_alignment: int = 1,
|
68
|
+
target: Target = None,
|
69
|
+
):
|
70
|
+
"""Create new rescheduler pass.
|
71
|
+
|
72
|
+
The alignment values depend on the control electronics of your quantum processor.
|
73
|
+
|
74
|
+
Args:
|
75
|
+
acquire_alignment: Integer number representing the minimum time resolution to
|
76
|
+
trigger acquisition instruction in units of ``dt``.
|
77
|
+
pulse_alignment: Integer number representing the minimum time resolution to
|
78
|
+
trigger gate instruction in units of ``dt``.
|
79
|
+
target: The :class:`~.Target` representing the target backend, if
|
80
|
+
``target`` is specified then this argument will take
|
81
|
+
precedence and ``acquire_alignment`` and ``pulse_alignment`` will be ignored.
|
82
|
+
"""
|
83
|
+
super().__init__()
|
84
|
+
self.acquire_align = acquire_alignment
|
85
|
+
self.pulse_align = pulse_alignment
|
86
|
+
if target is not None:
|
87
|
+
self.durations = target.durations()
|
88
|
+
self.target = target
|
89
|
+
self.acquire_align = target.acquire_alignment
|
90
|
+
self.pulse_align = target.pulse_alignment
|
91
|
+
|
92
|
+
@classmethod
|
93
|
+
def _get_next_gate(cls, dag: DAGCircuit, node: DAGOpNode) -> Generator[DAGOpNode, None, None]:
|
94
|
+
"""Get next non-delay nodes.
|
95
|
+
|
96
|
+
Args:
|
97
|
+
dag: DAG circuit to be rescheduled with constraints.
|
98
|
+
node: Current node.
|
99
|
+
|
100
|
+
Returns:
|
101
|
+
A list of non-delay successors.
|
102
|
+
"""
|
103
|
+
for next_node in dag.successors(node):
|
104
|
+
if not isinstance(next_node, DAGOutNode):
|
105
|
+
yield next_node
|
106
|
+
|
107
|
+
def _push_node_back(self, dag: DAGCircuit, node: DAGOpNode):
|
108
|
+
"""Update the start time of the current node to satisfy alignment constraints.
|
109
|
+
Immediate successors are pushed back to avoid overlap and will be processed later.
|
110
|
+
|
111
|
+
.. note::
|
112
|
+
|
113
|
+
This logic assumes the all bits in the qregs and cregs synchronously start and end,
|
114
|
+
i.e. occupy the same time slot, but qregs and cregs can take
|
115
|
+
different time slot due to classical I/O latencies.
|
116
|
+
|
117
|
+
Args:
|
118
|
+
dag: DAG circuit to be rescheduled with constraints.
|
119
|
+
node: Current node.
|
120
|
+
"""
|
121
|
+
node_start_time = self.property_set["node_start_time"]
|
122
|
+
clbit_write_latency = self.property_set.get("clbit_write_latency", 0)
|
123
|
+
|
124
|
+
if isinstance(node.op, Gate):
|
125
|
+
alignment = self.pulse_align
|
126
|
+
elif isinstance(node.op, (Measure, Reset)):
|
127
|
+
alignment = self.acquire_align
|
128
|
+
elif isinstance(node.op, Delay) or getattr(node.op, "_directive", False):
|
129
|
+
# Directive or delay. These can start at arbitrary time.
|
130
|
+
alignment = None
|
131
|
+
else:
|
132
|
+
raise TranspilerError(f"Unknown operation type for {repr(node)}.")
|
133
|
+
|
134
|
+
this_t0 = node_start_time[node]
|
135
|
+
|
136
|
+
if alignment is not None:
|
137
|
+
misalignment = node_start_time[node] % alignment
|
138
|
+
if misalignment != 0:
|
139
|
+
shift = max(0, alignment - misalignment)
|
140
|
+
else:
|
141
|
+
shift = 0
|
142
|
+
this_t0 += shift
|
143
|
+
node_start_time[node] = this_t0
|
144
|
+
|
145
|
+
# Compute shifted t1 of this node separately for qreg and creg
|
146
|
+
if self.target is not None:
|
147
|
+
try:
|
148
|
+
duration = self.durations.get(node.op, [dag.find_bit(x).index for x in node.qargs])
|
149
|
+
except TranspilerError:
|
150
|
+
duration = 0
|
151
|
+
new_t1q = this_t0 + duration
|
152
|
+
|
153
|
+
elif node.name == "delay":
|
154
|
+
new_t1q = this_t0 + node.op.duration
|
155
|
+
else:
|
156
|
+
new_t1q = this_t0
|
157
|
+
this_qubits = set(node.qargs)
|
158
|
+
if isinstance(node.op, (Measure, Reset)):
|
159
|
+
# creg access ends at the end of instruction
|
160
|
+
new_t1c = new_t1q
|
161
|
+
this_clbits = set(node.cargs)
|
162
|
+
else:
|
163
|
+
new_t1c = None
|
164
|
+
this_clbits = set()
|
165
|
+
|
166
|
+
# Check immediate successors for overlap
|
167
|
+
for next_node in self._get_next_gate(dag, node):
|
168
|
+
# Compute next node start time separately for qreg and creg
|
169
|
+
next_t0q = node_start_time[next_node]
|
170
|
+
next_qubits = set(next_node.qargs)
|
171
|
+
if isinstance(next_node.op, (Measure, Reset)):
|
172
|
+
# creg access starts after write latency
|
173
|
+
next_t0c = next_t0q + clbit_write_latency
|
174
|
+
next_clbits = set(next_node.cargs)
|
175
|
+
else:
|
176
|
+
next_t0c = None
|
177
|
+
next_clbits = set()
|
178
|
+
# Compute overlap if there is qubits overlap
|
179
|
+
if any(this_qubits & next_qubits):
|
180
|
+
qreg_overlap = new_t1q - next_t0q
|
181
|
+
else:
|
182
|
+
qreg_overlap = 0
|
183
|
+
# Compute overlap if there is clbits overlap
|
184
|
+
if any(this_clbits & next_clbits):
|
185
|
+
creg_overlap = new_t1c - next_t0c
|
186
|
+
else:
|
187
|
+
creg_overlap = 0
|
188
|
+
|
189
|
+
# Shift next node if there is finite overlap in either in qubits or clbits
|
190
|
+
overlap = max(qreg_overlap, creg_overlap)
|
191
|
+
node_start_time[next_node] = node_start_time[next_node] + overlap
|
192
|
+
|
193
|
+
def run(self, dag: DAGCircuit):
|
194
|
+
"""Run rescheduler.
|
195
|
+
|
196
|
+
This pass should perform rescheduling to satisfy:
|
197
|
+
|
198
|
+
- All DAGOpNode nodes (except for compiler directives) are placed at start time
|
199
|
+
satisfying hardware alignment constraints.
|
200
|
+
- The end time of a node does not overlap with the start time of successor nodes.
|
201
|
+
|
202
|
+
Assumptions:
|
203
|
+
|
204
|
+
- Topological order and absolute time order of DAGOpNode are consistent.
|
205
|
+
- All bits in either qargs or cargs associated with node synchronously start.
|
206
|
+
- Start time of qargs and cargs may different due to I/O latency.
|
207
|
+
|
208
|
+
Based on the configurations above, the rescheduler pass takes the following strategy:
|
209
|
+
|
210
|
+
1. The nodes are processed in the topological order, from the beginning of
|
211
|
+
the circuit (i.e. from left to right). For every node (including compiler
|
212
|
+
directives), the function ``_push_node_back`` performs steps 2 and 3.
|
213
|
+
2. If the start time of the node violates the alignment constraint,
|
214
|
+
the start time is increased to satisfy the constraint.
|
215
|
+
3. Each immediate successor whose start_time overlaps the node's end_time is
|
216
|
+
pushed backwards (towards the end of the wire). Note that at this point
|
217
|
+
the shifted successor does not need to satisfy the constraints, but this
|
218
|
+
will be taken care of when that successor node itself is processed.
|
219
|
+
4. After every node is processed, all misalignment constraints will be resolved,
|
220
|
+
and there will be no overlap between the nodes.
|
221
|
+
|
222
|
+
Args:
|
223
|
+
dag: DAG circuit to be rescheduled with constraints.
|
224
|
+
|
225
|
+
Raises:
|
226
|
+
TranspilerError: If circuit is not scheduled.
|
227
|
+
"""
|
228
|
+
|
229
|
+
if "node_start_time" not in self.property_set:
|
230
|
+
raise TranspilerError(
|
231
|
+
f"The input circuit {dag.name} is not scheduled. Call one of scheduling passes "
|
232
|
+
f"before running the {self.__class__.__name__} pass."
|
233
|
+
)
|
234
|
+
|
235
|
+
node_start_time = self.property_set["node_start_time"]
|
236
|
+
|
237
|
+
for node in dag.topological_op_nodes():
|
238
|
+
|
239
|
+
start_time = node_start_time.get(node)
|
240
|
+
|
241
|
+
if start_time is None:
|
242
|
+
raise TranspilerError(
|
243
|
+
f"Start time of {repr(node)} is not found. This node is likely added after "
|
244
|
+
"this circuit is scheduled. Run scheduler again."
|
245
|
+
)
|
246
|
+
|
247
|
+
if start_time == 0:
|
248
|
+
# Every instruction can start at t=0.
|
249
|
+
continue
|
250
|
+
|
251
|
+
self._push_node_back(dag, node)
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2022.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Scheduling pass to fill idle times with gate sequence."""
|
14
|
+
|
15
|
+
from .dynamical_decoupling import PadDynamicalDecoupling
|
16
|
+
from .pad_delay import PadDelay
|
@@ -0,0 +1,284 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2022.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Padding pass to fill empty timeslot."""
|
14
|
+
from __future__ import annotations
|
15
|
+
|
16
|
+
from collections.abc import Iterable
|
17
|
+
import logging
|
18
|
+
|
19
|
+
from qiskit.circuit import Qubit, Clbit, Instruction
|
20
|
+
from qiskit.circuit.delay import Delay
|
21
|
+
from qiskit.dagcircuit import DAGCircuit, DAGNode
|
22
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
23
|
+
from qiskit.transpiler.exceptions import TranspilerError
|
24
|
+
from qiskit.transpiler.target import Target
|
25
|
+
from qiskit.transpiler.instruction_durations import InstructionDurations
|
26
|
+
|
27
|
+
logger = logging.getLogger(__name__)
|
28
|
+
|
29
|
+
|
30
|
+
class BasePadding(TransformationPass):
|
31
|
+
"""The base class of padding pass.
|
32
|
+
|
33
|
+
This pass requires one of scheduling passes to be executed before itself.
|
34
|
+
Since there are multiple scheduling strategies, the selection of scheduling
|
35
|
+
pass is left in the hands of the pass manager designer.
|
36
|
+
Once a scheduling analysis pass is run, ``node_start_time`` is generated
|
37
|
+
in the :attr:`property_set`. This information is represented by a python dictionary of
|
38
|
+
the expected instruction execution times keyed on the node instances.
|
39
|
+
Entries in the dictionary are only created for non-delay nodes.
|
40
|
+
The padding pass expects all ``DAGOpNode`` in the circuit to be scheduled.
|
41
|
+
|
42
|
+
This base class doesn't define any sequence to interleave, but it manages
|
43
|
+
the location where the sequence is inserted, and provides a set of information necessary
|
44
|
+
to construct the proper sequence. Thus, a subclass of this pass just needs to implement
|
45
|
+
:meth:`_pad` method, in which the subclass constructs a circuit block to insert.
|
46
|
+
This mechanism removes lots of boilerplate logic to manage whole DAG circuits.
|
47
|
+
|
48
|
+
Note that padding pass subclasses should define interleaving sequences satisfying:
|
49
|
+
|
50
|
+
- Interleaved sequence does not change start time of other nodes
|
51
|
+
- Interleaved sequence should have total duration of the provided ``time_interval``.
|
52
|
+
|
53
|
+
Any manipulation violating these constraints may prevent this base pass from correctly
|
54
|
+
tracking the start time of each instruction,
|
55
|
+
which may result in violation of hardware alignment constraints.
|
56
|
+
"""
|
57
|
+
|
58
|
+
def __init__(
|
59
|
+
self,
|
60
|
+
target: Target = None,
|
61
|
+
durations: InstructionDurations = None,
|
62
|
+
):
|
63
|
+
"""BasePadding initializer.
|
64
|
+
|
65
|
+
Args:
|
66
|
+
target: The :class:`~.Target` representing the target backend.
|
67
|
+
If it supplied and it does not support delay instruction on a qubit,
|
68
|
+
padding passes do not pad any idle time of the qubit.
|
69
|
+
"""
|
70
|
+
super().__init__()
|
71
|
+
self.target = target
|
72
|
+
self.durations = durations
|
73
|
+
|
74
|
+
def get_duration(self, node, dag): # pylint: disable=too-many-return-statements
|
75
|
+
"""Get duration of a given node in the circuit."""
|
76
|
+
if node.name == "delay":
|
77
|
+
return node.op.duration
|
78
|
+
if node.name == "barrier":
|
79
|
+
return 0
|
80
|
+
if not self.target and not self.durations:
|
81
|
+
return None
|
82
|
+
indices = [dag.find_bit(qarg).index for qarg in node.qargs]
|
83
|
+
|
84
|
+
if self.target:
|
85
|
+
props_dict = self.target.get(node.name)
|
86
|
+
if not props_dict:
|
87
|
+
return None
|
88
|
+
props = props_dict.get(tuple(indices))
|
89
|
+
if not props:
|
90
|
+
return None
|
91
|
+
if self.target.dt is None:
|
92
|
+
return props.duration
|
93
|
+
else:
|
94
|
+
return self.target.seconds_to_dt(props.duration)
|
95
|
+
return self.durations.get(node.name, indices)
|
96
|
+
|
97
|
+
def run(self, dag: DAGCircuit):
|
98
|
+
"""Run the padding pass on ``dag``.
|
99
|
+
|
100
|
+
Args:
|
101
|
+
dag: DAG to be checked.
|
102
|
+
|
103
|
+
Returns:
|
104
|
+
DAGCircuit: DAG with idle time filled with instructions.
|
105
|
+
|
106
|
+
Raises:
|
107
|
+
TranspilerError: When a particular node is not scheduled, likely some transform pass
|
108
|
+
is inserted before this node is called.
|
109
|
+
"""
|
110
|
+
self._pre_runhook(dag)
|
111
|
+
|
112
|
+
node_start_time = self.property_set["node_start_time"].copy()
|
113
|
+
|
114
|
+
new_dag = DAGCircuit()
|
115
|
+
for qreg in dag.qregs.values():
|
116
|
+
new_dag.add_qreg(qreg)
|
117
|
+
for creg in dag.cregs.values():
|
118
|
+
new_dag.add_creg(creg)
|
119
|
+
|
120
|
+
# Update start time dictionary for the new_dag.
|
121
|
+
# This information may be used for further scheduling tasks,
|
122
|
+
# but this is immediately invalidated because node id is updated in the new_dag.
|
123
|
+
self.property_set["node_start_time"].clear()
|
124
|
+
|
125
|
+
new_dag.name = dag.name
|
126
|
+
new_dag.metadata = dag.metadata
|
127
|
+
new_dag._unit = self.property_set["time_unit"]
|
128
|
+
new_dag.global_phase = dag.global_phase
|
129
|
+
|
130
|
+
idle_after = {bit: 0 for bit in dag.qubits}
|
131
|
+
|
132
|
+
# Compute fresh circuit duration from the node start time dictionary and op duration.
|
133
|
+
# Note that pre-scheduled duration may change within the alignment passes, i.e.
|
134
|
+
# if some instruction time t0 violating the hardware alignment constraint,
|
135
|
+
# the alignment pass may delay t0 and accordingly the circuit duration changes.
|
136
|
+
circuit_duration = 0
|
137
|
+
for node in dag.topological_op_nodes():
|
138
|
+
if node in node_start_time:
|
139
|
+
t0 = node_start_time[node]
|
140
|
+
t1 = t0 + self.get_duration(node, dag)
|
141
|
+
circuit_duration = max(circuit_duration, t1)
|
142
|
+
|
143
|
+
if isinstance(node.op, Delay):
|
144
|
+
# The padding class considers a delay instruction as idle time
|
145
|
+
# rather than instruction. Delay node is removed so that
|
146
|
+
# we can extract non-delay predecessors.
|
147
|
+
dag.remove_op_node(node)
|
148
|
+
continue
|
149
|
+
|
150
|
+
for bit in node.qargs:
|
151
|
+
# Fill idle time with some sequence
|
152
|
+
if t0 - idle_after[bit] > 0 and self.__delay_supported(dag.find_bit(bit).index):
|
153
|
+
# Find previous node on the wire, i.e. always the latest node on the wire
|
154
|
+
prev_node = next(new_dag.predecessors(new_dag.output_map[bit]))
|
155
|
+
self._pad(
|
156
|
+
dag=new_dag,
|
157
|
+
qubit=bit,
|
158
|
+
t_start=idle_after[bit],
|
159
|
+
t_end=t0,
|
160
|
+
next_node=node,
|
161
|
+
prev_node=prev_node,
|
162
|
+
)
|
163
|
+
|
164
|
+
idle_after[bit] = t1
|
165
|
+
|
166
|
+
self._apply_scheduled_op(new_dag, t0, node.op, node.qargs, node.cargs)
|
167
|
+
else:
|
168
|
+
raise TranspilerError(
|
169
|
+
f"Operation {repr(node)} is likely added after the circuit is scheduled. "
|
170
|
+
"Schedule the circuit again if you transformed it."
|
171
|
+
)
|
172
|
+
|
173
|
+
# Add delays until the end of circuit.
|
174
|
+
for bit in new_dag.qubits:
|
175
|
+
if circuit_duration - idle_after[bit] > 0 and self.__delay_supported(
|
176
|
+
dag.find_bit(bit).index
|
177
|
+
):
|
178
|
+
node = new_dag.output_map[bit]
|
179
|
+
prev_node = next(new_dag.predecessors(node))
|
180
|
+
self._pad(
|
181
|
+
dag=new_dag,
|
182
|
+
qubit=bit,
|
183
|
+
t_start=idle_after[bit],
|
184
|
+
t_end=circuit_duration,
|
185
|
+
next_node=node,
|
186
|
+
prev_node=prev_node,
|
187
|
+
)
|
188
|
+
|
189
|
+
new_dag._duration = circuit_duration
|
190
|
+
|
191
|
+
return new_dag
|
192
|
+
|
193
|
+
def __delay_supported(self, qarg: int) -> bool:
|
194
|
+
"""Delay operation is supported on the qubit (qarg) or not."""
|
195
|
+
if self.target is None or self.target.instruction_supported("delay", qargs=(qarg,)):
|
196
|
+
return True
|
197
|
+
return False
|
198
|
+
|
199
|
+
def _pre_runhook(self, dag: DAGCircuit):
|
200
|
+
"""Extra routine inserted before running the padding pass.
|
201
|
+
|
202
|
+
Args:
|
203
|
+
dag: DAG circuit on which the sequence is applied.
|
204
|
+
|
205
|
+
Raises:
|
206
|
+
TranspilerError: If the whole circuit or instruction is not scheduled.
|
207
|
+
"""
|
208
|
+
if "node_start_time" not in self.property_set:
|
209
|
+
raise TranspilerError(
|
210
|
+
f"The input circuit {dag.name} is not scheduled. Call one of scheduling passes "
|
211
|
+
f"before running the {self.__class__.__name__} pass."
|
212
|
+
)
|
213
|
+
if self.property_set["time_unit"] == "stretch":
|
214
|
+
# This should have already been raised during scheduling, but just in case.
|
215
|
+
raise TranspilerError("Scheduling cannot run on circuits with stretch durations.")
|
216
|
+
for qarg, _ in enumerate(dag.qubits):
|
217
|
+
if not self.__delay_supported(qarg):
|
218
|
+
logger.debug(
|
219
|
+
"No padding on qubit %d as delay is not supported on it",
|
220
|
+
qarg,
|
221
|
+
)
|
222
|
+
|
223
|
+
def _apply_scheduled_op(
|
224
|
+
self,
|
225
|
+
dag: DAGCircuit,
|
226
|
+
t_start: int,
|
227
|
+
oper: Instruction,
|
228
|
+
qubits: Qubit | Iterable[Qubit],
|
229
|
+
clbits: Clbit | Iterable[Clbit] = (),
|
230
|
+
):
|
231
|
+
"""Add new operation to DAG with scheduled information.
|
232
|
+
|
233
|
+
This is identical to apply_operation_back + updating the node_start_time property.
|
234
|
+
|
235
|
+
Args:
|
236
|
+
dag: DAG circuit on which the sequence is applied.
|
237
|
+
t_start: Start time of new node.
|
238
|
+
oper: New operation that is added to the DAG circuit.
|
239
|
+
qubits: The list of qubits that the operation acts on.
|
240
|
+
clbits: The list of clbits that the operation acts on.
|
241
|
+
"""
|
242
|
+
if isinstance(qubits, Qubit):
|
243
|
+
qubits = [qubits]
|
244
|
+
if isinstance(clbits, Clbit):
|
245
|
+
clbits = [clbits]
|
246
|
+
|
247
|
+
new_node = dag.apply_operation_back(oper, qargs=qubits, cargs=clbits, check=False)
|
248
|
+
self.property_set["node_start_time"][new_node] = t_start
|
249
|
+
|
250
|
+
def _pad(
|
251
|
+
self,
|
252
|
+
dag: DAGCircuit,
|
253
|
+
qubit: Qubit,
|
254
|
+
t_start: int,
|
255
|
+
t_end: int,
|
256
|
+
next_node: DAGNode,
|
257
|
+
prev_node: DAGNode,
|
258
|
+
):
|
259
|
+
"""Interleave instruction sequence in between two nodes.
|
260
|
+
|
261
|
+
.. note::
|
262
|
+
If a DAGOpNode is added here, it should update node_start_time property
|
263
|
+
in the property set so that the added node is also scheduled.
|
264
|
+
This is achieved by adding operation via :meth:`_apply_scheduled_op`.
|
265
|
+
|
266
|
+
.. note::
|
267
|
+
|
268
|
+
This method doesn't check if the total duration of new DAGOpNode added here
|
269
|
+
is identical to the interval (``t_end - t_start``).
|
270
|
+
A developer of the pass must guarantee this is satisfied.
|
271
|
+
If the duration is greater than the interval, your circuit may be
|
272
|
+
compiled down to the target code with extra duration on the backend compiler,
|
273
|
+
which is then played normally without error. However, the outcome of your circuit
|
274
|
+
might be unexpected due to erroneous scheduling.
|
275
|
+
|
276
|
+
Args:
|
277
|
+
dag: DAG circuit that sequence is applied.
|
278
|
+
qubit: The wire that the sequence is applied on.
|
279
|
+
t_start: Absolute start time of this interval.
|
280
|
+
t_end: Absolute end time of this interval.
|
281
|
+
next_node: Node that follows the sequence.
|
282
|
+
prev_node: Node ahead of the sequence.
|
283
|
+
"""
|
284
|
+
raise NotImplementedError
|