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,338 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2019.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Add control to operation if supported."""
|
14
|
+
from __future__ import annotations
|
15
|
+
|
16
|
+
from math import pi
|
17
|
+
from qiskit.circuit.exceptions import CircuitError
|
18
|
+
from qiskit.circuit.library import UnitaryGate
|
19
|
+
from qiskit.transpiler import PassManager
|
20
|
+
from qiskit.transpiler.passes.basis import BasisTranslator, UnrollCustomDefinitions
|
21
|
+
from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel
|
22
|
+
|
23
|
+
from . import ControlledGate, Gate, QuantumRegister, QuantumCircuit
|
24
|
+
from ._utils import _ctrl_state_to_int
|
25
|
+
|
26
|
+
|
27
|
+
# The list of gates whose controlled versions have efficient synthesis algorithms.
|
28
|
+
# For example, a controlled version of X is MCX (with many synthesis algorithms avalable),
|
29
|
+
# and a controlled version of Z is MCX + two Hadamard gates.
|
30
|
+
#
|
31
|
+
# Note: when adding a new gate to this list, also add the decomposition of its controlled
|
32
|
+
# version to apply_basic_controlled_gate.
|
33
|
+
EFFICIENTLY_CONTROLLED_GATES = [
|
34
|
+
"p",
|
35
|
+
"u",
|
36
|
+
"x",
|
37
|
+
"z",
|
38
|
+
"y",
|
39
|
+
"h",
|
40
|
+
"sx",
|
41
|
+
"sxdg",
|
42
|
+
"rx",
|
43
|
+
"ry",
|
44
|
+
"rz",
|
45
|
+
"cx",
|
46
|
+
"cz",
|
47
|
+
]
|
48
|
+
|
49
|
+
|
50
|
+
def add_control(
|
51
|
+
operation: Gate | ControlledGate,
|
52
|
+
num_ctrl_qubits: int,
|
53
|
+
label: str | None,
|
54
|
+
ctrl_state: str | int | None,
|
55
|
+
) -> ControlledGate:
|
56
|
+
"""Return the controlled version of the gate.
|
57
|
+
|
58
|
+
This function first checks whether the gate's name corresponds to a known
|
59
|
+
method for generating its controlled version. Currently, these methods exist
|
60
|
+
for gates in ``EFFICIENTLY_CONTROLLED_GATES``.
|
61
|
+
|
62
|
+
For gates not in ``EFFICIENTLY_CONTROLLED_GATES``, the function calls the unroller
|
63
|
+
to decompose the gate into gates in ``EFFICIENTLY_CONTROLLED_GATES``,
|
64
|
+
and then generates the controlled version by controlling every gate in this
|
65
|
+
decomposition.
|
66
|
+
|
67
|
+
Open controls are implemented by conjugating the control line with X gates.
|
68
|
+
|
69
|
+
This function is meant to be called from the
|
70
|
+
:method:`qiskit.circuit.gate.Gate.control()` method.
|
71
|
+
|
72
|
+
Args:
|
73
|
+
operation: The operation to be controlled.
|
74
|
+
num_ctrl_qubits: The number of controls to add to gate.
|
75
|
+
label: An optional gate label.
|
76
|
+
ctrl_state: The control state in decimal or as a bitstring
|
77
|
+
(e.g. '111'). If specified as a bitstring the length
|
78
|
+
must equal num_ctrl_qubits, MSB on left. If None, use
|
79
|
+
2**num_ctrl_qubits-1.
|
80
|
+
|
81
|
+
Returns:
|
82
|
+
Controlled version of gate.
|
83
|
+
|
84
|
+
"""
|
85
|
+
if isinstance(operation, UnitaryGate):
|
86
|
+
# attempt decomposition
|
87
|
+
operation._define()
|
88
|
+
cgate = control(operation, num_ctrl_qubits=num_ctrl_qubits, label=label, ctrl_state=ctrl_state)
|
89
|
+
if operation.label is not None:
|
90
|
+
cgate.base_gate = cgate.base_gate.to_mutable()
|
91
|
+
cgate.base_gate.label = operation.label
|
92
|
+
return cgate
|
93
|
+
|
94
|
+
|
95
|
+
def control(
|
96
|
+
operation: Gate | ControlledGate,
|
97
|
+
num_ctrl_qubits: int | None = 1,
|
98
|
+
label: str | None = None,
|
99
|
+
ctrl_state: str | int | None = None,
|
100
|
+
) -> ControlledGate:
|
101
|
+
"""Return the controlled version of the gate.
|
102
|
+
|
103
|
+
This function first checks whether the gate's name corresponds to a known
|
104
|
+
method for generating its controlled version. Currently, these methods exist
|
105
|
+
for gates in ``EFFICIENTLY_CONTROLLED_GATES``.
|
106
|
+
|
107
|
+
For gates not in ``EFFICIENTLY_CONTROLLED_GATES``, the function calls the unroller
|
108
|
+
to decompose the gate into gates in ``EFFICIENTLY_CONTROLLED_GATES``,
|
109
|
+
and then generates the controlled version by controlling every gate in this
|
110
|
+
decomposition.
|
111
|
+
|
112
|
+
Open controls are implemented by conjugating the control line with X gates.
|
113
|
+
|
114
|
+
Args:
|
115
|
+
operation: The gate used to create the ControlledGate.
|
116
|
+
num_ctrl_qubits: The number of controls to add to gate (default=1).
|
117
|
+
label: An optional gate label.
|
118
|
+
ctrl_state: The control state in decimal or as
|
119
|
+
a bitstring (e.g. '111'). If specified as a bitstring the length
|
120
|
+
must equal num_ctrl_qubits, MSB on left. If None, use
|
121
|
+
2**num_ctrl_qubits-1.
|
122
|
+
|
123
|
+
Returns:
|
124
|
+
Controlled version of gate.
|
125
|
+
|
126
|
+
Raises:
|
127
|
+
CircuitError: gate contains non-gate in definition
|
128
|
+
"""
|
129
|
+
|
130
|
+
# pylint: disable=cyclic-import
|
131
|
+
from qiskit.circuit import controlledgate
|
132
|
+
|
133
|
+
ctrl_state = _ctrl_state_to_int(ctrl_state, num_ctrl_qubits)
|
134
|
+
|
135
|
+
q_control = QuantumRegister(num_ctrl_qubits, name="control")
|
136
|
+
q_target = QuantumRegister(operation.num_qubits, name="target")
|
137
|
+
controlled_circ = QuantumCircuit(q_control, q_target, name=f"c_{operation.name}")
|
138
|
+
if isinstance(operation, controlledgate.ControlledGate):
|
139
|
+
original_ctrl_state = operation.ctrl_state
|
140
|
+
operation = operation.to_mutable()
|
141
|
+
operation.ctrl_state = None
|
142
|
+
|
143
|
+
global_phase = 0
|
144
|
+
|
145
|
+
if operation.name in EFFICIENTLY_CONTROLLED_GATES:
|
146
|
+
apply_basic_controlled_gate(controlled_circ, operation, q_control, q_target)
|
147
|
+
else:
|
148
|
+
if isinstance(operation, controlledgate.ControlledGate):
|
149
|
+
operation = operation.to_mutable()
|
150
|
+
operation.ctrl_state = None
|
151
|
+
|
152
|
+
unrolled_gate = _unroll_gate(operation, basis_gates=EFFICIENTLY_CONTROLLED_GATES)
|
153
|
+
if unrolled_gate.definition.global_phase:
|
154
|
+
global_phase += unrolled_gate.definition.global_phase
|
155
|
+
|
156
|
+
definition = unrolled_gate.definition
|
157
|
+
bit_indices = {
|
158
|
+
bit: index
|
159
|
+
for bits in [definition.qubits, definition.clbits]
|
160
|
+
for index, bit in enumerate(bits)
|
161
|
+
}
|
162
|
+
|
163
|
+
for instruction in definition.data:
|
164
|
+
gate, qargs = instruction.operation, instruction.qubits
|
165
|
+
|
166
|
+
if len(qargs) == 1:
|
167
|
+
target = q_target[bit_indices[qargs[0]]]
|
168
|
+
else:
|
169
|
+
target = [q_target[bit_indices[qarg]] for qarg in qargs]
|
170
|
+
|
171
|
+
apply_basic_controlled_gate(controlled_circ, gate, q_control, target)
|
172
|
+
|
173
|
+
# apply controlled global phase
|
174
|
+
if global_phase:
|
175
|
+
if len(q_control) < 2:
|
176
|
+
controlled_circ.p(global_phase, q_control)
|
177
|
+
else:
|
178
|
+
controlled_circ.mcp(global_phase, q_control[:-1], q_control[-1])
|
179
|
+
if isinstance(operation, controlledgate.ControlledGate):
|
180
|
+
operation.ctrl_state = original_ctrl_state
|
181
|
+
new_num_ctrl_qubits = num_ctrl_qubits + operation.num_ctrl_qubits
|
182
|
+
new_ctrl_state = operation.ctrl_state << num_ctrl_qubits | ctrl_state
|
183
|
+
base_name = operation.base_gate.name
|
184
|
+
base_gate = operation.base_gate
|
185
|
+
else:
|
186
|
+
new_num_ctrl_qubits = num_ctrl_qubits
|
187
|
+
new_ctrl_state = ctrl_state
|
188
|
+
base_name = operation.name
|
189
|
+
base_gate = operation
|
190
|
+
|
191
|
+
# In order to maintain some backward compatibility with gate names this
|
192
|
+
# uses a naming convention where if the number of controls is <=2 the gate
|
193
|
+
# is named like "cc<base_gate.name>", else it is named like
|
194
|
+
# "c<num_ctrl_qubits><base_name>".
|
195
|
+
if new_num_ctrl_qubits > 2:
|
196
|
+
ctrl_substr = f"c{new_num_ctrl_qubits:d}"
|
197
|
+
else:
|
198
|
+
ctrl_substr = ("{0}" * new_num_ctrl_qubits).format("c")
|
199
|
+
new_name = f"{ctrl_substr}{base_name}"
|
200
|
+
cgate = controlledgate.ControlledGate(
|
201
|
+
new_name,
|
202
|
+
controlled_circ.num_qubits,
|
203
|
+
operation.params,
|
204
|
+
label=label,
|
205
|
+
num_ctrl_qubits=new_num_ctrl_qubits,
|
206
|
+
definition=controlled_circ,
|
207
|
+
ctrl_state=new_ctrl_state,
|
208
|
+
base_gate=base_gate,
|
209
|
+
)
|
210
|
+
return cgate
|
211
|
+
|
212
|
+
|
213
|
+
def apply_basic_controlled_gate(circuit, gate, controls, target):
|
214
|
+
"""Apply a controlled version of ``gate`` to the circuit.
|
215
|
+
|
216
|
+
This implements multi-control operations for every gate in
|
217
|
+
``EFFICIENTLY_CONTROLLED_GATES``.
|
218
|
+
|
219
|
+
"""
|
220
|
+
num_ctrl_qubits = len(controls)
|
221
|
+
|
222
|
+
if gate.name == "x":
|
223
|
+
circuit.mcx(controls, target)
|
224
|
+
elif gate.name == "rx":
|
225
|
+
circuit.mcrx(
|
226
|
+
gate.definition.data[0].operation.params[0],
|
227
|
+
controls,
|
228
|
+
target,
|
229
|
+
use_basis_gates=False,
|
230
|
+
)
|
231
|
+
elif gate.name == "ry":
|
232
|
+
circuit.mcry(
|
233
|
+
gate.definition.data[0].operation.params[0],
|
234
|
+
controls,
|
235
|
+
target,
|
236
|
+
mode="noancilla",
|
237
|
+
use_basis_gates=False,
|
238
|
+
)
|
239
|
+
elif gate.name == "rz":
|
240
|
+
circuit.mcrz(
|
241
|
+
gate.definition.data[0].operation.params[0],
|
242
|
+
controls,
|
243
|
+
target,
|
244
|
+
use_basis_gates=False,
|
245
|
+
)
|
246
|
+
elif gate.name == "p":
|
247
|
+
from qiskit.circuit.library import MCPhaseGate
|
248
|
+
|
249
|
+
circuit.append(
|
250
|
+
MCPhaseGate(gate.params[0], num_ctrl_qubits),
|
251
|
+
controls[:] + [target],
|
252
|
+
)
|
253
|
+
elif gate.name == "cx":
|
254
|
+
circuit.mcx(
|
255
|
+
controls[:] + [target[0]], # CX has two targets
|
256
|
+
target[1],
|
257
|
+
)
|
258
|
+
elif gate.name == "cz":
|
259
|
+
circuit.h(target[1])
|
260
|
+
circuit.mcx(
|
261
|
+
controls[:] + [target[0]], # CZ has two targets
|
262
|
+
target[1],
|
263
|
+
)
|
264
|
+
circuit.h(target[1])
|
265
|
+
elif gate.name == "u":
|
266
|
+
theta, phi, lamb = gate.params
|
267
|
+
if num_ctrl_qubits == 1:
|
268
|
+
if theta == 0 and phi == 0:
|
269
|
+
circuit.cp(lamb, controls[0], target)
|
270
|
+
else:
|
271
|
+
circuit.cu(theta, phi, lamb, 0, controls[0], target)
|
272
|
+
else:
|
273
|
+
if phi == -pi / 2 and lamb == pi / 2:
|
274
|
+
circuit.mcrx(theta, controls, target, use_basis_gates=False)
|
275
|
+
elif phi == 0 and lamb == 0:
|
276
|
+
circuit.mcry(
|
277
|
+
theta,
|
278
|
+
controls,
|
279
|
+
target,
|
280
|
+
use_basis_gates=False,
|
281
|
+
)
|
282
|
+
elif theta == 0 and phi == 0:
|
283
|
+
circuit.mcp(lamb, controls, target)
|
284
|
+
else:
|
285
|
+
circuit.mcrz(lamb, controls, target, use_basis_gates=False)
|
286
|
+
circuit.mcry(theta, controls, target, use_basis_gates=False)
|
287
|
+
circuit.mcrz(phi, controls, target, use_basis_gates=False)
|
288
|
+
circuit.mcp((phi + lamb) / 2, controls[1:], controls[0])
|
289
|
+
elif gate.name == "z":
|
290
|
+
circuit.h(target)
|
291
|
+
circuit.mcx(controls, target)
|
292
|
+
circuit.h(target)
|
293
|
+
elif gate.name == "y":
|
294
|
+
circuit.sdg(target)
|
295
|
+
circuit.mcx(controls, target)
|
296
|
+
circuit.s(target)
|
297
|
+
elif gate.name == "h":
|
298
|
+
circuit.s(target)
|
299
|
+
circuit.h(target)
|
300
|
+
circuit.t(target)
|
301
|
+
circuit.mcx(controls, target)
|
302
|
+
circuit.tdg(target)
|
303
|
+
circuit.h(target)
|
304
|
+
circuit.sdg(target)
|
305
|
+
elif gate.name == "sx":
|
306
|
+
circuit.h(target)
|
307
|
+
circuit.mcp(pi / 2, controls, target)
|
308
|
+
circuit.h(target)
|
309
|
+
elif gate.name == "sxdg":
|
310
|
+
circuit.h(target)
|
311
|
+
circuit.mcp(3 * pi / 2, controls, target)
|
312
|
+
circuit.h(target)
|
313
|
+
else:
|
314
|
+
raise CircuitError(f"Gate {gate} not in supported basis.")
|
315
|
+
|
316
|
+
|
317
|
+
def _gate_to_circuit(operation):
|
318
|
+
"""Converts a gate instance to a QuantumCircuit"""
|
319
|
+
if hasattr(operation, "definition") and operation.definition is not None:
|
320
|
+
return operation.definition
|
321
|
+
|
322
|
+
qr = QuantumRegister(operation.num_qubits)
|
323
|
+
qc = QuantumCircuit(qr, name=operation.name)
|
324
|
+
qc.append(operation, qr)
|
325
|
+
return qc
|
326
|
+
|
327
|
+
|
328
|
+
def _unroll_gate(operation, basis_gates):
|
329
|
+
"""Unrolls a gate, possibly composite, to the target basis"""
|
330
|
+
circ = _gate_to_circuit(operation)
|
331
|
+
pm = PassManager(
|
332
|
+
[
|
333
|
+
UnrollCustomDefinitions(sel, basis_gates=basis_gates),
|
334
|
+
BasisTranslator(sel, target_basis=basis_gates),
|
335
|
+
]
|
336
|
+
)
|
337
|
+
opqc = pm.run(circ)
|
338
|
+
return opqc.to_gate()
|
@@ -0,0 +1,154 @@
|
|
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
|
+
"""Shared helper utility for mapping classical resources from one circuit or DAG to another."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
import typing
|
18
|
+
|
19
|
+
from . import Bit, Clbit, ClassicalRegister # pylint: disable=cyclic-import
|
20
|
+
from .classical import expr
|
21
|
+
|
22
|
+
|
23
|
+
class VariableMapper(expr.ExprVisitor[expr.Expr]):
|
24
|
+
"""Stateful helper class that manages the mapping of variables in conditions and expressions.
|
25
|
+
|
26
|
+
This is designed to be used by both :class:`.QuantumCircuit` and :class:`.DAGCircuit` when
|
27
|
+
managing operations that need to map classical resources from one circuit to another.
|
28
|
+
|
29
|
+
The general usage is to initialise this at the start of a many-block mapping operation, then
|
30
|
+
call its :meth:`map_condition`, :meth:`map_target` or :meth:`map_expr` methods as appropriate,
|
31
|
+
which will return the new object that should be used.
|
32
|
+
|
33
|
+
If an ``add_register`` callable is given to the initializer, the mapper will use it to attempt
|
34
|
+
to add new aliasing registers to the outer circuit object, if there is not already a suitable
|
35
|
+
register for the mapping available in the circuit. If this parameter is not given, a
|
36
|
+
``ValueError`` will be raised instead. The given ``add_register`` callable may choose to raise
|
37
|
+
its own exception."""
|
38
|
+
|
39
|
+
# We don't want docstrings for the inherited visitor methods, which are self-explanatory and
|
40
|
+
# would just be noise.
|
41
|
+
# pylint: disable=missing-function-docstring
|
42
|
+
|
43
|
+
__slots__ = ("target_cregs", "register_map", "bit_map", "var_map", "add_register")
|
44
|
+
|
45
|
+
def __init__(
|
46
|
+
self,
|
47
|
+
target_cregs: typing.Iterable[ClassicalRegister],
|
48
|
+
bit_map: typing.Mapping[Bit, Bit],
|
49
|
+
var_map: typing.Mapping[expr.Var | expr.Stretch, expr.Var | expr.Stretch] | None = None,
|
50
|
+
*,
|
51
|
+
add_register: typing.Callable[[ClassicalRegister], None] | None = None,
|
52
|
+
):
|
53
|
+
self.target_cregs = tuple(target_cregs)
|
54
|
+
self.register_map = {}
|
55
|
+
self.bit_map = bit_map
|
56
|
+
self.var_map = var_map or {}
|
57
|
+
self.add_register = add_register
|
58
|
+
|
59
|
+
def _map_register(self, theirs: ClassicalRegister) -> ClassicalRegister:
|
60
|
+
"""Map the target's registers to suitable equivalents in the destination, adding an
|
61
|
+
extra one if there's no exact match."""
|
62
|
+
if (mapped_theirs := self.register_map.get(theirs.name)) is not None:
|
63
|
+
return mapped_theirs
|
64
|
+
mapped_bits = [self.bit_map[bit] for bit in theirs]
|
65
|
+
for ours in self.target_cregs:
|
66
|
+
if mapped_bits == list(ours):
|
67
|
+
mapped_theirs = ours
|
68
|
+
break
|
69
|
+
else:
|
70
|
+
if self.add_register is None:
|
71
|
+
raise ValueError(f"Register '{theirs.name}' has no counterpart in the destination.")
|
72
|
+
mapped_theirs = ClassicalRegister(bits=mapped_bits)
|
73
|
+
self.add_register(mapped_theirs)
|
74
|
+
self.register_map[theirs.name] = mapped_theirs
|
75
|
+
return mapped_theirs
|
76
|
+
|
77
|
+
def map_condition(self, condition, /, *, allow_reorder=False):
|
78
|
+
"""Map the given ``condition`` so that it only references variables in the destination
|
79
|
+
circuit (as given to this class on initialization).
|
80
|
+
|
81
|
+
If ``allow_reorder`` is ``True``, then when a legacy condition (the two-tuple form) is made
|
82
|
+
on a register that has a counterpart in the destination with all the same (mapped) bits but
|
83
|
+
in a different order, then that register will be used and the value suitably modified to
|
84
|
+
make the equality condition work. This is maintaining legacy (tested) behavior of
|
85
|
+
:meth:`.DAGCircuit.compose`; nowhere else does this, and in general this would require *far*
|
86
|
+
more complex classical rewriting than Terra needs to worry about in the full expression era.
|
87
|
+
"""
|
88
|
+
if condition is None:
|
89
|
+
return None
|
90
|
+
if isinstance(condition, expr.Expr):
|
91
|
+
return self.map_expr(condition)
|
92
|
+
target, value = condition
|
93
|
+
if isinstance(target, Clbit):
|
94
|
+
return (self.bit_map[target], value)
|
95
|
+
if not allow_reorder:
|
96
|
+
return (self._map_register(target), value)
|
97
|
+
# This is maintaining the legacy behavior of `DAGCircuit.compose`. We don't attempt to
|
98
|
+
# speed-up this lookup with a cache, since that would just make the more standard cases more
|
99
|
+
# annoying to deal with.
|
100
|
+
mapped_bits_order = [self.bit_map[bit] for bit in target]
|
101
|
+
mapped_bits_set = set(mapped_bits_order)
|
102
|
+
for register in self.target_cregs:
|
103
|
+
if mapped_bits_set == set(register):
|
104
|
+
mapped_theirs = register
|
105
|
+
break
|
106
|
+
else:
|
107
|
+
if self.add_register is None:
|
108
|
+
raise self.exc_type(
|
109
|
+
f"Register '{target.name}' has no counterpart in the destination."
|
110
|
+
)
|
111
|
+
mapped_theirs = ClassicalRegister(bits=mapped_bits_order)
|
112
|
+
self.add_register(mapped_theirs)
|
113
|
+
new_order = {bit: i for i, bit in enumerate(mapped_bits_order)}
|
114
|
+
value_bits = f"{value:0{len(target)}b}"[::-1] # Little-index-indexed binary bitstring.
|
115
|
+
mapped_value = int("".join(value_bits[new_order[bit]] for bit in mapped_theirs)[::-1], 2)
|
116
|
+
return (mapped_theirs, mapped_value)
|
117
|
+
|
118
|
+
def map_target(self, target, /):
|
119
|
+
"""Map the real-time variables in a ``target`` of a :class:`.SwitchCaseOp` to the new
|
120
|
+
circuit, as defined in the ``circuit`` argument of the initializer of this class."""
|
121
|
+
if isinstance(target, Clbit):
|
122
|
+
return self.bit_map[target]
|
123
|
+
if isinstance(target, ClassicalRegister):
|
124
|
+
return self._map_register(target)
|
125
|
+
return self.map_expr(target)
|
126
|
+
|
127
|
+
def map_expr(self, node: expr.Expr, /) -> expr.Expr:
|
128
|
+
"""Map the variables in an :class:`~.expr.Expr` node to the new circuit."""
|
129
|
+
return node.accept(self)
|
130
|
+
|
131
|
+
def visit_var(self, node, /):
|
132
|
+
if isinstance(node.var, Clbit):
|
133
|
+
return expr.Var(self.bit_map[node.var], node.type)
|
134
|
+
if isinstance(node.var, ClassicalRegister):
|
135
|
+
return expr.Var(self._map_register(node.var), node.type)
|
136
|
+
return self.var_map.get(node, node)
|
137
|
+
|
138
|
+
def visit_stretch(self, node, /):
|
139
|
+
return self.var_map.get(node, node)
|
140
|
+
|
141
|
+
def visit_value(self, node, /):
|
142
|
+
return expr.Value(node.value, node.type)
|
143
|
+
|
144
|
+
def visit_unary(self, node, /):
|
145
|
+
return expr.Unary(node.op, node.operand.accept(self), node.type)
|
146
|
+
|
147
|
+
def visit_binary(self, node, /):
|
148
|
+
return expr.Binary(node.op, node.left.accept(self), node.right.accept(self), node.type)
|
149
|
+
|
150
|
+
def visit_cast(self, node, /):
|
151
|
+
return expr.Cast(node.operand.accept(self), node.type, implicit=node.implicit)
|
152
|
+
|
153
|
+
def visit_index(self, node, /):
|
154
|
+
return expr.Index(node.target.accept(self), node.index.accept(self), node.type)
|