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,65 @@
|
|
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
|
+
"""A custom python-constraint solver used by the :class:`~.CSPLayout` pass"""
|
14
|
+
from time import time
|
15
|
+
|
16
|
+
from qiskit.utils import optionals as _optionals
|
17
|
+
|
18
|
+
# This isn't ideal usage because we will import constraint at import time
|
19
|
+
# but to ensure the CustomSolver class is defined we need to do this.
|
20
|
+
# If constraint is not installed this will not raise a missing library
|
21
|
+
# exception until CSPLayout is initialized
|
22
|
+
if _optionals.HAS_CONSTRAINT:
|
23
|
+
from constraint import RecursiveBacktrackingSolver
|
24
|
+
|
25
|
+
class CustomSolver(RecursiveBacktrackingSolver):
|
26
|
+
"""A wrap to RecursiveBacktrackingSolver to support ``call_limit``"""
|
27
|
+
|
28
|
+
# pylint: disable=invalid-name
|
29
|
+
|
30
|
+
def __init__(self, call_limit=None, time_limit=None):
|
31
|
+
self.call_limit = call_limit
|
32
|
+
self.time_limit = time_limit
|
33
|
+
self.call_current = None
|
34
|
+
self.time_start = None
|
35
|
+
self.time_current = None
|
36
|
+
super().__init__()
|
37
|
+
|
38
|
+
def limit_reached(self):
|
39
|
+
"""Checks if a limit is reached."""
|
40
|
+
if self.call_current is not None:
|
41
|
+
self.call_current += 1
|
42
|
+
if self.call_current > self.call_limit:
|
43
|
+
return True
|
44
|
+
if self.time_start is not None:
|
45
|
+
self.time_current = time() - self.time_start
|
46
|
+
if self.time_current > self.time_limit:
|
47
|
+
return True
|
48
|
+
return False
|
49
|
+
|
50
|
+
def getSolution(self, domains, constraints, vconstraints):
|
51
|
+
"""Wrap RecursiveBacktrackingSolver.getSolution to add the limits."""
|
52
|
+
if self.call_limit is not None:
|
53
|
+
self.call_current = 0
|
54
|
+
if self.time_limit is not None:
|
55
|
+
self.time_start = time()
|
56
|
+
return super().getSolution(domains, constraints, vconstraints)
|
57
|
+
|
58
|
+
def recursiveBacktracking(self, solutions, domains, vconstraints, assignments, single):
|
59
|
+
"""Like ``constraint.RecursiveBacktrackingSolver.recursiveBacktracking`` but
|
60
|
+
limited in the amount of calls by ``self.call_limit``"""
|
61
|
+
if self.limit_reached():
|
62
|
+
return None
|
63
|
+
return super().recursiveBacktracking(
|
64
|
+
solutions, domains, vconstraints, assignments, single
|
65
|
+
)
|
@@ -0,0 +1,128 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 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
|
+
"""Transform a circuit with virtual qubits into a circuit with physical qubits."""
|
14
|
+
|
15
|
+
from qiskit.circuit import QuantumRegister
|
16
|
+
from qiskit.dagcircuit import DAGCircuit, DAGOpNode
|
17
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
18
|
+
from qiskit.transpiler.exceptions import TranspilerError
|
19
|
+
from qiskit.transpiler.layout import Layout
|
20
|
+
|
21
|
+
|
22
|
+
class ApplyLayout(TransformationPass):
|
23
|
+
"""Transform a circuit with virtual qubits into a circuit with physical qubits.
|
24
|
+
|
25
|
+
Transforms a DAGCircuit with virtual qubits into a DAGCircuit with physical qubits
|
26
|
+
by applying the Layout given in `property_set`.
|
27
|
+
Requires either of passes to set/select Layout, e.g. `SetLayout`, `TrivialLayout`.
|
28
|
+
Assumes the Layout has full physical qubits.
|
29
|
+
|
30
|
+
If a post layout pass is run and sets the ``post_layout`` property set field with
|
31
|
+
a new layout to use after ``ApplyLayout`` has already run once this pass will
|
32
|
+
compact the layouts so that we apply
|
33
|
+
``original_virtual`` -> ``existing_layout`` -> ``new_layout`` -> ``new_physical``
|
34
|
+
so that the output circuit and layout combination become:
|
35
|
+
``original_virtual`` -> ``new_physical``
|
36
|
+
"""
|
37
|
+
|
38
|
+
def run(self, dag):
|
39
|
+
"""Run the ApplyLayout pass on ``dag``.
|
40
|
+
|
41
|
+
Args:
|
42
|
+
dag (DAGCircuit): DAG to map.
|
43
|
+
|
44
|
+
Returns:
|
45
|
+
DAGCircuit: A mapped DAG (with physical qubits).
|
46
|
+
|
47
|
+
Raises:
|
48
|
+
TranspilerError: if no layout is found in ``property_set`` or no full physical qubits.
|
49
|
+
"""
|
50
|
+
layout = self.property_set["layout"]
|
51
|
+
if not layout:
|
52
|
+
raise TranspilerError(
|
53
|
+
"No 'layout' is found in property_set. Please run a Layout pass in advance."
|
54
|
+
)
|
55
|
+
if len(layout) != (1 + max(layout.get_physical_bits())):
|
56
|
+
raise TranspilerError("The 'layout' must be full (with ancilla).")
|
57
|
+
|
58
|
+
post_layout = self.property_set["post_layout"]
|
59
|
+
q = QuantumRegister(len(layout), "q")
|
60
|
+
|
61
|
+
new_dag = DAGCircuit()
|
62
|
+
new_dag.name = dag.name
|
63
|
+
new_dag.add_qreg(q)
|
64
|
+
for var in dag.iter_input_vars():
|
65
|
+
new_dag.add_input_var(var)
|
66
|
+
for var in dag.iter_captured_vars():
|
67
|
+
new_dag.add_captured_var(var)
|
68
|
+
for var in dag.iter_declared_vars():
|
69
|
+
new_dag.add_declared_var(var)
|
70
|
+
for stretch in dag.iter_captured_stretches():
|
71
|
+
new_dag.add_captured_stretch(stretch)
|
72
|
+
for stretch in dag.iter_declared_stretches():
|
73
|
+
new_dag.add_declared_stretch(stretch)
|
74
|
+
new_dag.metadata = dag.metadata
|
75
|
+
new_dag.add_clbits(dag.clbits)
|
76
|
+
for creg in dag.cregs.values():
|
77
|
+
new_dag.add_creg(creg)
|
78
|
+
if post_layout is None:
|
79
|
+
self.property_set["original_qubit_indices"] = {
|
80
|
+
bit: index for index, bit in enumerate(dag.qubits)
|
81
|
+
}
|
82
|
+
for qreg in dag.qregs.values():
|
83
|
+
self.property_set["layout"].add_register(qreg)
|
84
|
+
virtual_physical_map = layout.get_virtual_bits()
|
85
|
+
for node in dag.topological_op_nodes():
|
86
|
+
qargs = [q[virtual_physical_map[qarg]] for qarg in node.qargs]
|
87
|
+
new_dag._apply_op_node_back(
|
88
|
+
DAGOpNode.from_instruction(
|
89
|
+
node._to_circuit_instruction().replace(qubits=qargs)
|
90
|
+
),
|
91
|
+
check=False,
|
92
|
+
)
|
93
|
+
else:
|
94
|
+
# First build a new layout object going from:
|
95
|
+
# old virtual -> old physical -> new virtual -> new physical
|
96
|
+
# to:
|
97
|
+
# old virtual -> new physical
|
98
|
+
full_layout = Layout()
|
99
|
+
old_phys_to_virtual = layout.get_physical_bits()
|
100
|
+
new_virtual_to_physical = post_layout.get_virtual_bits()
|
101
|
+
phys_map = list(range(len(new_dag.qubits)))
|
102
|
+
for new_virt, new_phys in new_virtual_to_physical.items():
|
103
|
+
old_phys = dag.find_bit(new_virt).index
|
104
|
+
old_virt = old_phys_to_virtual[old_phys]
|
105
|
+
phys_map[old_phys] = new_phys
|
106
|
+
full_layout.add(old_virt, new_phys)
|
107
|
+
for reg in layout.get_registers():
|
108
|
+
full_layout.add_register(reg)
|
109
|
+
# Apply new layout to the circuit
|
110
|
+
for node in dag.topological_op_nodes():
|
111
|
+
qargs = [q[new_virtual_to_physical[qarg]] for qarg in node.qargs]
|
112
|
+
new_dag._apply_op_node_back(
|
113
|
+
DAGOpNode.from_instruction(
|
114
|
+
node._to_circuit_instruction().replace(qubits=qargs)
|
115
|
+
),
|
116
|
+
check=False,
|
117
|
+
)
|
118
|
+
self.property_set["layout"] = full_layout
|
119
|
+
if (final_layout := self.property_set["final_layout"]) is not None:
|
120
|
+
final_layout_mapping = {
|
121
|
+
new_dag.qubits[phys_map[dag.find_bit(old_virt).index]]: phys_map[old_phys]
|
122
|
+
for old_virt, old_phys in final_layout.get_virtual_bits().items()
|
123
|
+
}
|
124
|
+
out_layout = Layout(final_layout_mapping)
|
125
|
+
self.property_set["final_layout"] = out_layout
|
126
|
+
new_dag.global_phase = dag.global_phase
|
127
|
+
|
128
|
+
return new_dag
|
@@ -0,0 +1,132 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 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
|
+
"""A pass for choosing a Layout of a circuit onto a Coupling graph, as a
|
14
|
+
Constraint Satisfaction Problem. It tries to find a solution that fully
|
15
|
+
satisfy the circuit, i.e. no further swap is needed. If no solution is
|
16
|
+
found, no ``property_set['layout']`` is set.
|
17
|
+
"""
|
18
|
+
import random
|
19
|
+
|
20
|
+
from qiskit.transpiler.layout import Layout
|
21
|
+
from qiskit.transpiler.basepasses import AnalysisPass
|
22
|
+
from qiskit.transpiler.exceptions import TranspilerError
|
23
|
+
from qiskit.utils import optionals as _optionals
|
24
|
+
from qiskit.transpiler.target import Target
|
25
|
+
|
26
|
+
|
27
|
+
@_optionals.HAS_CONSTRAINT.require_in_instance
|
28
|
+
class CSPLayout(AnalysisPass):
|
29
|
+
"""If possible, chooses a Layout as a CSP, using backtracking."""
|
30
|
+
|
31
|
+
def __init__(
|
32
|
+
self,
|
33
|
+
coupling_map,
|
34
|
+
strict_direction=False,
|
35
|
+
seed=None,
|
36
|
+
call_limit=1000,
|
37
|
+
time_limit=10,
|
38
|
+
):
|
39
|
+
"""If possible, chooses a Layout as a CSP, using backtracking.
|
40
|
+
|
41
|
+
If not possible, does not set the layout property. In all the cases,
|
42
|
+
the property `CSPLayout_stop_reason` will be added with one of the
|
43
|
+
following values:
|
44
|
+
|
45
|
+
* solution found: If a perfect layout was found.
|
46
|
+
* nonexistent solution: If no perfect layout was found and every combination was checked.
|
47
|
+
* call limit reached: If no perfect layout was found and the call limit was reached.
|
48
|
+
* time limit reached: If no perfect layout was found and the time limit was reached.
|
49
|
+
|
50
|
+
Args:
|
51
|
+
coupling_map (Union[CouplingMap, Target]): Directed graph representing a coupling map.
|
52
|
+
strict_direction (bool): If True, considers the direction of the coupling map.
|
53
|
+
Default is False.
|
54
|
+
seed (int): Sets the seed of the PRNG.
|
55
|
+
call_limit (int): Amount of times that
|
56
|
+
``constraint.RecursiveBacktrackingSolver.recursiveBacktracking`` will be called.
|
57
|
+
None means no call limit. Default: 1000.
|
58
|
+
time_limit (int): Amount of seconds that the pass will try to find a solution.
|
59
|
+
None means no time limit. Default: 10 seconds.
|
60
|
+
"""
|
61
|
+
super().__init__()
|
62
|
+
if isinstance(coupling_map, Target):
|
63
|
+
self.target = coupling_map
|
64
|
+
self.coupling_map = self.target.build_coupling_map()
|
65
|
+
else:
|
66
|
+
self.target = None
|
67
|
+
self.coupling_map = coupling_map
|
68
|
+
|
69
|
+
self.strict_direction = strict_direction
|
70
|
+
self.call_limit = call_limit
|
71
|
+
self.time_limit = time_limit
|
72
|
+
self.seed = seed
|
73
|
+
|
74
|
+
def run(self, dag):
|
75
|
+
"""run the layout method"""
|
76
|
+
if not self.coupling_map.is_connected():
|
77
|
+
raise TranspilerError(
|
78
|
+
"Coupling Map is disjoint, this pass can't be used with a disconnected coupling "
|
79
|
+
"map."
|
80
|
+
)
|
81
|
+
qubits = dag.qubits
|
82
|
+
cxs = set()
|
83
|
+
|
84
|
+
from constraint import Problem, AllDifferentConstraint, RecursiveBacktrackingSolver
|
85
|
+
from qiskit.transpiler.passes.layout._csp_custom_solver import CustomSolver
|
86
|
+
|
87
|
+
for gate in dag.two_qubit_ops():
|
88
|
+
cxs.add((qubits.index(gate.qargs[0]), qubits.index(gate.qargs[1])))
|
89
|
+
edges = set(self.coupling_map.get_edges())
|
90
|
+
|
91
|
+
if self.time_limit is None and self.call_limit is None:
|
92
|
+
solver = RecursiveBacktrackingSolver()
|
93
|
+
else:
|
94
|
+
solver = CustomSolver(call_limit=self.call_limit, time_limit=self.time_limit)
|
95
|
+
|
96
|
+
variables = list(range(len(qubits)))
|
97
|
+
variable_domains = list(self.coupling_map.physical_qubits)
|
98
|
+
random.Random(self.seed).shuffle(variable_domains)
|
99
|
+
|
100
|
+
problem = Problem(solver)
|
101
|
+
problem.addVariables(variables, variable_domains)
|
102
|
+
problem.addConstraint(AllDifferentConstraint()) # each wire is map to a single qubit
|
103
|
+
|
104
|
+
if self.strict_direction:
|
105
|
+
|
106
|
+
def constraint(control, target):
|
107
|
+
return (control, target) in edges
|
108
|
+
|
109
|
+
else:
|
110
|
+
|
111
|
+
def constraint(control, target):
|
112
|
+
return (control, target) in edges or (target, control) in edges
|
113
|
+
|
114
|
+
for pair in cxs:
|
115
|
+
problem.addConstraint(constraint, [pair[0], pair[1]])
|
116
|
+
|
117
|
+
solution = problem.getSolution()
|
118
|
+
|
119
|
+
if solution is None:
|
120
|
+
stop_reason = "nonexistent solution"
|
121
|
+
if isinstance(solver, CustomSolver):
|
122
|
+
if solver.time_current is not None and solver.time_current >= self.time_limit:
|
123
|
+
stop_reason = "time limit reached"
|
124
|
+
elif solver.call_current is not None and solver.call_current >= self.call_limit:
|
125
|
+
stop_reason = "call limit reached"
|
126
|
+
else:
|
127
|
+
stop_reason = "solution found"
|
128
|
+
self.property_set["layout"] = Layout({v: qubits[k] for k, v in solution.items()})
|
129
|
+
for reg in dag.qregs.values():
|
130
|
+
self.property_set["layout"].add_register(reg)
|
131
|
+
|
132
|
+
self.property_set["CSPLayout_stop_reason"] = stop_reason
|
@@ -0,0 +1,197 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2018.
|
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
|
+
"""Choose a Layout by finding the most connected subset of qubits."""
|
14
|
+
|
15
|
+
|
16
|
+
import numpy as np
|
17
|
+
import rustworkx
|
18
|
+
|
19
|
+
from qiskit.transpiler.layout import Layout
|
20
|
+
from qiskit.transpiler.basepasses import AnalysisPass
|
21
|
+
from qiskit.transpiler.exceptions import TranspilerError
|
22
|
+
from qiskit.transpiler.target import Target
|
23
|
+
from qiskit._accelerate import disjoint_utils
|
24
|
+
|
25
|
+
from qiskit._accelerate.dense_layout import best_subset
|
26
|
+
|
27
|
+
|
28
|
+
class DenseLayout(AnalysisPass):
|
29
|
+
"""Choose a Layout by finding the most connected subset of qubits.
|
30
|
+
|
31
|
+
This pass associates a physical qubit (int) to each virtual qubit
|
32
|
+
of the circuit (Qubit).
|
33
|
+
|
34
|
+
Note:
|
35
|
+
Even though a ``'layout'`` is not strictly a property of the DAG,
|
36
|
+
in the transpiler architecture it is best passed around between passes
|
37
|
+
by being set in ``property_set``.
|
38
|
+
"""
|
39
|
+
|
40
|
+
def __init__(self, coupling_map=None, target=None):
|
41
|
+
"""DenseLayout initializer.
|
42
|
+
|
43
|
+
Args:
|
44
|
+
coupling_map (Coupling): directed graph representing a coupling map.
|
45
|
+
target (Target): A target representing the target backend.
|
46
|
+
"""
|
47
|
+
super().__init__()
|
48
|
+
self.coupling_map = coupling_map
|
49
|
+
self.target = target
|
50
|
+
self.adjacency_matrix = None
|
51
|
+
if target is not None:
|
52
|
+
self.coupling_map = target.build_coupling_map()
|
53
|
+
|
54
|
+
def run(self, dag):
|
55
|
+
"""Run the DenseLayout pass on `dag`.
|
56
|
+
|
57
|
+
Pick a convenient layout depending on the best matching
|
58
|
+
qubit connectivity, and set the property `layout`.
|
59
|
+
|
60
|
+
Args:
|
61
|
+
dag (DAGCircuit): DAG to find layout for.
|
62
|
+
|
63
|
+
Raises:
|
64
|
+
TranspilerError: if dag wider than self.coupling_map
|
65
|
+
"""
|
66
|
+
if self.coupling_map is None:
|
67
|
+
raise TranspilerError(
|
68
|
+
"A coupling_map or target with constrained qargs is necessary to run the pass."
|
69
|
+
)
|
70
|
+
if self.target is not None:
|
71
|
+
layout_components = disjoint_utils.run_pass_over_connected_components(
|
72
|
+
dag,
|
73
|
+
self.target,
|
74
|
+
self._inner_run,
|
75
|
+
)
|
76
|
+
if layout_components is None:
|
77
|
+
target = Target.from_configuration(
|
78
|
+
basis_gates=["u", "cx"], coupling_map=self.coupling_map
|
79
|
+
)
|
80
|
+
layout_components = disjoint_utils.run_pass_over_connected_components(
|
81
|
+
dag,
|
82
|
+
target,
|
83
|
+
self._inner_run,
|
84
|
+
)
|
85
|
+
else:
|
86
|
+
target = Target.from_configuration(
|
87
|
+
basis_gates=["u", "cx"], coupling_map=self.coupling_map
|
88
|
+
)
|
89
|
+
layout_components = disjoint_utils.run_pass_over_connected_components(
|
90
|
+
dag,
|
91
|
+
target,
|
92
|
+
self._inner_run,
|
93
|
+
)
|
94
|
+
layout_mapping = {}
|
95
|
+
for component in layout_components:
|
96
|
+
layout_mapping.update(component)
|
97
|
+
layout = Layout(layout_mapping)
|
98
|
+
for qreg in dag.qregs.values():
|
99
|
+
layout.add_register(qreg)
|
100
|
+
self.property_set["layout"] = layout
|
101
|
+
|
102
|
+
def _inner_run(self, dag, coupling_map):
|
103
|
+
num_dag_qubits = len(dag.qubits)
|
104
|
+
if num_dag_qubits > coupling_map.size():
|
105
|
+
raise TranspilerError("Number of qubits greater than device.")
|
106
|
+
num_cx = 0
|
107
|
+
num_meas = 0
|
108
|
+
|
109
|
+
if self.target is not None:
|
110
|
+
num_cx = 1
|
111
|
+
num_meas = 1
|
112
|
+
else:
|
113
|
+
# Get avg number of cx and meas per qubit
|
114
|
+
ops = dag.count_ops(recurse=True)
|
115
|
+
if "cx" in ops.keys():
|
116
|
+
num_cx = ops["cx"]
|
117
|
+
if "measure" in ops.keys():
|
118
|
+
num_meas = ops["measure"]
|
119
|
+
|
120
|
+
best_sub = self._best_subset(num_dag_qubits, num_meas, num_cx, coupling_map)
|
121
|
+
layout_mapping = {
|
122
|
+
qubit: coupling_map.graph[int(best_sub[i])] for i, qubit in enumerate(dag.qubits)
|
123
|
+
}
|
124
|
+
return layout_mapping
|
125
|
+
|
126
|
+
def _best_subset(self, num_qubits, num_meas, num_cx, coupling_map):
|
127
|
+
"""Computes the qubit mapping with the best connectivity.
|
128
|
+
|
129
|
+
Args:
|
130
|
+
num_qubits (int): Number of subset qubits to consider.
|
131
|
+
|
132
|
+
Returns:
|
133
|
+
ndarray: Array of qubits to use for best connectivity mapping.
|
134
|
+
"""
|
135
|
+
from scipy.sparse import coo_matrix, csgraph
|
136
|
+
|
137
|
+
if num_qubits == 1:
|
138
|
+
return np.array([0])
|
139
|
+
if num_qubits == 0:
|
140
|
+
return []
|
141
|
+
|
142
|
+
adjacency_matrix = rustworkx.adjacency_matrix(coupling_map.graph)
|
143
|
+
reverse_index_map = {v: k for k, v in enumerate(coupling_map.graph.nodes())}
|
144
|
+
|
145
|
+
error_mat, use_error = _build_error_matrix(
|
146
|
+
coupling_map.size(),
|
147
|
+
reverse_index_map,
|
148
|
+
target=self.target,
|
149
|
+
)
|
150
|
+
|
151
|
+
rows, cols, best_map = best_subset(
|
152
|
+
num_qubits,
|
153
|
+
adjacency_matrix,
|
154
|
+
num_meas,
|
155
|
+
num_cx,
|
156
|
+
use_error,
|
157
|
+
coupling_map.is_symmetric,
|
158
|
+
error_mat,
|
159
|
+
)
|
160
|
+
data = [1] * len(rows)
|
161
|
+
sp_sub_graph = coo_matrix((data, (rows, cols)), shape=(num_qubits, num_qubits)).tocsr()
|
162
|
+
perm = csgraph.reverse_cuthill_mckee(sp_sub_graph)
|
163
|
+
best_map = best_map[perm]
|
164
|
+
return best_map
|
165
|
+
|
166
|
+
|
167
|
+
def _build_error_matrix(num_qubits, qubit_map, target=None):
|
168
|
+
error_mat = np.zeros((num_qubits, num_qubits))
|
169
|
+
use_error = False
|
170
|
+
if target is not None and target.qargs is not None:
|
171
|
+
for qargs in target.qargs:
|
172
|
+
# Ignore gates over 2q DenseLayout only works with 2q
|
173
|
+
if len(qargs) > 2:
|
174
|
+
continue
|
175
|
+
error = 0.0
|
176
|
+
ops = target.operation_names_for_qargs(qargs)
|
177
|
+
for op in ops:
|
178
|
+
props = target[op].get(qargs, None)
|
179
|
+
if props is not None and props.error is not None:
|
180
|
+
# Use max error rate to represent operation error
|
181
|
+
# on a qubit(s). If there is more than 1 operation available
|
182
|
+
# we don't know what will be used on the qubits eventually
|
183
|
+
# so we take the highest error operation as a proxy for
|
184
|
+
# the possible worst case.
|
185
|
+
error = max(error, props.error)
|
186
|
+
max_error = error
|
187
|
+
if any(qubit not in qubit_map for qubit in qargs):
|
188
|
+
continue
|
189
|
+
# TODO: Factor in T1 and T2 to error matrix after #7736
|
190
|
+
if len(qargs) == 1:
|
191
|
+
qubit = qubit_map[qargs[0]]
|
192
|
+
error_mat[qubit][qubit] = max_error
|
193
|
+
use_error = True
|
194
|
+
elif len(qargs) == 2:
|
195
|
+
error_mat[qubit_map[qargs[0]]][qubit_map[qargs[1]]] = max_error
|
196
|
+
use_error = True
|
197
|
+
return error_mat, use_error
|
@@ -0,0 +1,54 @@
|
|
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
|
+
"""This module contains common utils for disjoint coupling maps."""
|
14
|
+
from __future__ import annotations
|
15
|
+
from typing import Union
|
16
|
+
|
17
|
+
from qiskit.dagcircuit.dagcircuit import DAGCircuit
|
18
|
+
from qiskit.transpiler.coupling import CouplingMap
|
19
|
+
from qiskit.transpiler.target import Target
|
20
|
+
from qiskit.transpiler.exceptions import TranspilerError
|
21
|
+
|
22
|
+
|
23
|
+
def require_layout_isolated_to_component(
|
24
|
+
dag: DAGCircuit, components_source: Union[Target, CouplingMap]
|
25
|
+
):
|
26
|
+
"""
|
27
|
+
Check that the layout of the dag does not require connectivity across connected components
|
28
|
+
in the CouplingMap
|
29
|
+
|
30
|
+
Args:
|
31
|
+
dag: DAGCircuit to check.
|
32
|
+
components_source: Target to check against.
|
33
|
+
|
34
|
+
Raises:
|
35
|
+
TranspilerError: Chosen layout is not valid for the target disjoint connectivity.
|
36
|
+
"""
|
37
|
+
if isinstance(components_source, Target):
|
38
|
+
coupling_map = components_source.build_coupling_map(filter_idle_qubits=True)
|
39
|
+
else:
|
40
|
+
coupling_map = components_source
|
41
|
+
component_sets = [set(x.graph.nodes()) for x in coupling_map.connected_components()]
|
42
|
+
for inst in dag.two_qubit_ops():
|
43
|
+
component_index = None
|
44
|
+
for i, component_set in enumerate(component_sets):
|
45
|
+
if dag.find_bit(inst.qargs[0]).index in component_set:
|
46
|
+
component_index = i
|
47
|
+
break
|
48
|
+
if dag.find_bit(inst.qargs[1]).index not in component_sets[component_index]:
|
49
|
+
raise TranspilerError(
|
50
|
+
"The circuit has an invalid layout as two qubits need to interact in disconnected "
|
51
|
+
"components of the coupling map. The physical qubit "
|
52
|
+
f"{dag.find_bit(inst.qargs[1]).index} needs to interact with the "
|
53
|
+
f"qubit {dag.find_bit(inst.qargs[0]).index} and they belong to different components"
|
54
|
+
)
|
@@ -0,0 +1,49 @@
|
|
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
|
+
"""Extend the dag with virtual qubits that are in layout but not in the circuit yet."""
|
14
|
+
|
15
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
16
|
+
from qiskit.transpiler.exceptions import TranspilerError
|
17
|
+
|
18
|
+
|
19
|
+
class EnlargeWithAncilla(TransformationPass):
|
20
|
+
"""Extend the dag with virtual qubits that are in layout but not in the circuit yet.
|
21
|
+
|
22
|
+
Extend the DAG circuit with new virtual qubits (ancilla) that are specified
|
23
|
+
in the layout, but not present in the circuit. Which qubits to add are
|
24
|
+
previously allocated in the ``layout`` property, by a previous pass.
|
25
|
+
"""
|
26
|
+
|
27
|
+
def run(self, dag):
|
28
|
+
"""Run the EnlargeWithAncilla pass on `dag`.
|
29
|
+
|
30
|
+
Args:
|
31
|
+
dag (DAGCircuit): DAG to extend.
|
32
|
+
|
33
|
+
Returns:
|
34
|
+
DAGCircuit: An extended DAG.
|
35
|
+
|
36
|
+
Raises:
|
37
|
+
TranspilerError: If there is no layout in the property set or not set at init time.
|
38
|
+
"""
|
39
|
+
layout = self.property_set["layout"]
|
40
|
+
|
41
|
+
if layout is None:
|
42
|
+
raise TranspilerError('EnlargeWithAncilla requires property_set["layout"]')
|
43
|
+
|
44
|
+
new_qregs = {reg for reg in layout.get_registers() if reg not in dag.qregs.values()}
|
45
|
+
|
46
|
+
for qreg in new_qregs:
|
47
|
+
dag.add_qreg(qreg)
|
48
|
+
|
49
|
+
return dag
|