qiskit 1.3.0__cp39-abi3-macosx_11_0_arm64.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 +146 -0
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +73 -0
- qiskit/assembler/__init__.py +42 -0
- qiskit/assembler/assemble_circuits.py +451 -0
- qiskit/assembler/assemble_schedules.py +367 -0
- qiskit/assembler/disassemble.py +310 -0
- qiskit/assembler/run_config.py +77 -0
- qiskit/circuit/__init__.py +1313 -0
- qiskit/circuit/_classical_resource_map.py +148 -0
- qiskit/circuit/_standard_gates_commutations.py +3849 -0
- qiskit/circuit/_utils.py +167 -0
- qiskit/circuit/add_control.py +274 -0
- qiskit/circuit/annotated_operation.py +279 -0
- qiskit/circuit/barrier.py +50 -0
- qiskit/circuit/bit.py +94 -0
- qiskit/circuit/classical/__init__.py +41 -0
- qiskit/circuit/classical/expr/__init__.py +238 -0
- qiskit/circuit/classical/expr/constructors.py +556 -0
- qiskit/circuit/classical/expr/expr.py +397 -0
- qiskit/circuit/classical/expr/visitors.py +300 -0
- qiskit/circuit/classical/types/__init__.py +109 -0
- qiskit/circuit/classical/types/ordering.py +222 -0
- qiskit/circuit/classical/types/types.py +117 -0
- qiskit/circuit/classicalfunction/__init__.py +140 -0
- qiskit/circuit/classicalfunction/boolean_expression.py +129 -0
- qiskit/circuit/classicalfunction/classical_element.py +54 -0
- qiskit/circuit/classicalfunction/classical_function_visitor.py +155 -0
- qiskit/circuit/classicalfunction/classicalfunction.py +173 -0
- qiskit/circuit/classicalfunction/exceptions.py +35 -0
- qiskit/circuit/classicalfunction/types.py +18 -0
- qiskit/circuit/classicalfunction/utils.py +91 -0
- qiskit/circuit/classicalregister.py +57 -0
- qiskit/circuit/commutation_checker.py +106 -0
- qiskit/circuit/commutation_library.py +20 -0
- qiskit/circuit/controlflow/__init__.py +28 -0
- qiskit/circuit/controlflow/_builder_utils.py +207 -0
- qiskit/circuit/controlflow/break_loop.py +56 -0
- qiskit/circuit/controlflow/builder.py +691 -0
- qiskit/circuit/controlflow/continue_loop.py +58 -0
- qiskit/circuit/controlflow/control_flow.py +84 -0
- qiskit/circuit/controlflow/for_loop.py +217 -0
- qiskit/circuit/controlflow/if_else.py +511 -0
- qiskit/circuit/controlflow/switch_case.py +417 -0
- qiskit/circuit/controlflow/while_loop.py +171 -0
- qiskit/circuit/controlledgate.py +274 -0
- qiskit/circuit/delay.py +123 -0
- qiskit/circuit/duration.py +95 -0
- qiskit/circuit/equivalence.py +94 -0
- qiskit/circuit/equivalence_library.py +18 -0
- qiskit/circuit/exceptions.py +19 -0
- qiskit/circuit/gate.py +263 -0
- qiskit/circuit/instruction.py +697 -0
- qiskit/circuit/instructionset.py +179 -0
- qiskit/circuit/library/__init__.py +668 -0
- qiskit/circuit/library/arithmetic/__init__.py +34 -0
- qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +210 -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 +88 -0
- qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
- qiskit/circuit/library/arithmetic/integer_comparator.py +243 -0
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +196 -0
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +189 -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 +192 -0
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +353 -0
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +277 -0
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +317 -0
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +335 -0
- qiskit/circuit/library/arithmetic/quadratic_form.py +198 -0
- qiskit/circuit/library/arithmetic/weighted_adder.py +337 -0
- qiskit/circuit/library/basis_change/__init__.py +15 -0
- qiskit/circuit/library/basis_change/qft.py +313 -0
- qiskit/circuit/library/blueprintcircuit.py +280 -0
- qiskit/circuit/library/boolean_logic/__init__.py +18 -0
- qiskit/circuit/library/boolean_logic/inner_product.py +155 -0
- qiskit/circuit/library/boolean_logic/quantum_and.py +200 -0
- qiskit/circuit/library/boolean_logic/quantum_or.py +202 -0
- qiskit/circuit/library/boolean_logic/quantum_xor.py +165 -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 +158 -0
- qiskit/circuit/library/generalized_gates/__init__.py +30 -0
- qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
- qiskit/circuit/library/generalized_gates/gms.py +174 -0
- qiskit/circuit/library/generalized_gates/gr.py +215 -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 +85 -0
- qiskit/circuit/library/generalized_gates/permutation.py +194 -0
- qiskit/circuit/library/generalized_gates/rv.py +96 -0
- qiskit/circuit/library/generalized_gates/uc.py +213 -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 +215 -0
- qiskit/circuit/library/graph_state.py +169 -0
- qiskit/circuit/library/grover_operator.py +579 -0
- qiskit/circuit/library/hamiltonian_gate.py +142 -0
- qiskit/circuit/library/hidden_linear_function.py +161 -0
- qiskit/circuit/library/iqp.py +175 -0
- qiskit/circuit/library/n_local/__init__.py +45 -0
- qiskit/circuit/library/n_local/efficient_su2.py +277 -0
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +515 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +297 -0
- qiskit/circuit/library/n_local/n_local.py +1472 -0
- qiskit/circuit/library/n_local/pauli_two_design.py +243 -0
- qiskit/circuit/library/n_local/qaoa_ansatz.py +366 -0
- qiskit/circuit/library/n_local/real_amplitudes.py +306 -0
- qiskit/circuit/library/n_local/two_local.py +289 -0
- qiskit/circuit/library/overlap.py +182 -0
- qiskit/circuit/library/pauli_evolution.py +186 -0
- qiskit/circuit/library/phase_estimation.py +175 -0
- qiskit/circuit/library/phase_oracle.py +153 -0
- qiskit/circuit/library/quantum_volume.py +167 -0
- qiskit/circuit/library/standard_gates/__init__.py +142 -0
- qiskit/circuit/library/standard_gates/dcx.py +78 -0
- qiskit/circuit/library/standard_gates/ecr.py +130 -0
- qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
- qiskit/circuit/library/standard_gates/global_phase.py +85 -0
- qiskit/circuit/library/standard_gates/h.py +258 -0
- qiskit/circuit/library/standard_gates/i.py +76 -0
- qiskit/circuit/library/standard_gates/iswap.py +134 -0
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +405 -0
- qiskit/circuit/library/standard_gates/p.py +441 -0
- qiskit/circuit/library/standard_gates/r.py +117 -0
- qiskit/circuit/library/standard_gates/rx.py +303 -0
- qiskit/circuit/library/standard_gates/rxx.py +183 -0
- qiskit/circuit/library/standard_gates/ry.py +298 -0
- qiskit/circuit/library/standard_gates/ryy.py +183 -0
- qiskit/circuit/library/standard_gates/rz.py +319 -0
- qiskit/circuit/library/standard_gates/rzx.py +229 -0
- qiskit/circuit/library/standard_gates/rzz.py +196 -0
- qiskit/circuit/library/standard_gates/s.py +428 -0
- qiskit/circuit/library/standard_gates/swap.py +288 -0
- qiskit/circuit/library/standard_gates/sx.py +315 -0
- qiskit/circuit/library/standard_gates/t.py +179 -0
- qiskit/circuit/library/standard_gates/u.py +403 -0
- qiskit/circuit/library/standard_gates/u1.py +501 -0
- qiskit/circuit/library/standard_gates/u2.py +149 -0
- qiskit/circuit/library/standard_gates/u3.py +436 -0
- qiskit/circuit/library/standard_gates/x.py +1529 -0
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +235 -0
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +239 -0
- qiskit/circuit/library/standard_gates/y.py +262 -0
- qiskit/circuit/library/standard_gates/z.py +348 -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 +44 -0
- qiskit/circuit/operation.py +67 -0
- qiskit/circuit/parameter.py +178 -0
- qiskit/circuit/parameterexpression.py +692 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +120 -0
- qiskit/circuit/quantumcircuit.py +6829 -0
- qiskit/circuit/quantumcircuitdata.py +136 -0
- qiskit/circuit/quantumregister.py +75 -0
- qiskit/circuit/random/__init__.py +15 -0
- qiskit/circuit/random/utils.py +358 -0
- qiskit/circuit/register.py +233 -0
- qiskit/circuit/reset.py +34 -0
- qiskit/circuit/singleton.py +606 -0
- qiskit/circuit/store.py +97 -0
- qiskit/circuit/tools/__init__.py +16 -0
- qiskit/circuit/tools/pi_check.py +190 -0
- qiskit/circuit/twirling.py +145 -0
- qiskit/compiler/__init__.py +33 -0
- qiskit/compiler/assembler.py +681 -0
- qiskit/compiler/scheduler.py +109 -0
- qiskit/compiler/sequencer.py +71 -0
- qiskit/compiler/transpiler.py +533 -0
- qiskit/converters/__init__.py +74 -0
- qiskit/converters/circuit_to_dag.py +78 -0
- qiskit/converters/circuit_to_dagdependency.py +51 -0
- qiskit/converters/circuit_to_dagdependency_v2.py +47 -0
- qiskit/converters/circuit_to_gate.py +107 -0
- qiskit/converters/circuit_to_instruction.py +155 -0
- qiskit/converters/dag_to_circuit.py +79 -0
- qiskit/converters/dag_to_dagdependency.py +55 -0
- qiskit/converters/dag_to_dagdependency_v2.py +44 -0
- qiskit/converters/dagdependency_to_circuit.py +46 -0
- qiskit/converters/dagdependency_to_dag.py +54 -0
- qiskit/dagcircuit/__init__.py +44 -0
- qiskit/dagcircuit/collect_blocks.py +391 -0
- qiskit/dagcircuit/dagcircuit.py +24 -0
- qiskit/dagcircuit/dagdependency.py +646 -0
- qiskit/dagcircuit/dagdependency_v2.py +641 -0
- qiskit/dagcircuit/dagdepnode.py +160 -0
- qiskit/dagcircuit/dagnode.py +176 -0
- qiskit/dagcircuit/exceptions.py +42 -0
- qiskit/exceptions.py +153 -0
- qiskit/passmanager/__init__.py +240 -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 +333 -0
- qiskit/primitives/__init__.py +481 -0
- qiskit/primitives/backend_estimator.py +486 -0
- qiskit/primitives/backend_estimator_v2.py +434 -0
- qiskit/primitives/backend_sampler.py +222 -0
- qiskit/primitives/backend_sampler_v2.py +339 -0
- qiskit/primitives/base/__init__.py +20 -0
- qiskit/primitives/base/base_estimator.py +252 -0
- qiskit/primitives/base/base_primitive.py +45 -0
- qiskit/primitives/base/base_primitive_job.py +78 -0
- qiskit/primitives/base/base_result.py +65 -0
- qiskit/primitives/base/base_sampler.py +204 -0
- qiskit/primitives/base/estimator_result.py +46 -0
- qiskit/primitives/base/sampler_result.py +45 -0
- qiskit/primitives/base/validation.py +231 -0
- qiskit/primitives/containers/__init__.py +26 -0
- qiskit/primitives/containers/bindings_array.py +389 -0
- qiskit/primitives/containers/bit_array.py +741 -0
- qiskit/primitives/containers/data_bin.py +173 -0
- qiskit/primitives/containers/estimator_pub.py +222 -0
- qiskit/primitives/containers/object_array.py +94 -0
- qiskit/primitives/containers/observables_array.py +279 -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/estimator.py +172 -0
- qiskit/primitives/primitive_job.py +81 -0
- qiskit/primitives/sampler.py +162 -0
- qiskit/primitives/statevector_estimator.py +174 -0
- qiskit/primitives/statevector_sampler.py +292 -0
- qiskit/primitives/utils.py +247 -0
- qiskit/providers/__init__.py +803 -0
- qiskit/providers/backend.py +667 -0
- qiskit/providers/backend_compat.py +472 -0
- qiskit/providers/basic_provider/__init__.py +45 -0
- qiskit/providers/basic_provider/basic_provider.py +101 -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 +821 -0
- qiskit/providers/basic_provider/exceptions.py +30 -0
- qiskit/providers/exceptions.py +45 -0
- qiskit/providers/fake_provider/__init__.py +105 -0
- qiskit/providers/fake_provider/backends_v1/__init__.py +22 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +37 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_20q/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +43 -0
- qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +50 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +41 -0
- qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +44 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +1 -0
- qiskit/providers/fake_provider/fake_1q.py +91 -0
- qiskit/providers/fake_provider/fake_backend.py +165 -0
- qiskit/providers/fake_provider/fake_openpulse_2q.py +391 -0
- qiskit/providers/fake_provider/fake_openpulse_3q.py +340 -0
- qiskit/providers/fake_provider/fake_pulse_backend.py +49 -0
- qiskit/providers/fake_provider/fake_qasm_backend.py +77 -0
- qiskit/providers/fake_provider/generic_backend_v2.py +1035 -0
- qiskit/providers/fake_provider/utils/__init__.py +15 -0
- qiskit/providers/fake_provider/utils/backend_converter.py +150 -0
- qiskit/providers/fake_provider/utils/json_decoder.py +109 -0
- qiskit/providers/job.py +147 -0
- qiskit/providers/jobstatus.py +30 -0
- qiskit/providers/models/__init__.py +89 -0
- qiskit/providers/models/backendconfiguration.py +1040 -0
- qiskit/providers/models/backendproperties.py +517 -0
- qiskit/providers/models/backendstatus.py +94 -0
- qiskit/providers/models/jobstatus.py +66 -0
- qiskit/providers/models/pulsedefaults.py +305 -0
- qiskit/providers/options.py +273 -0
- qiskit/providers/provider.py +95 -0
- qiskit/providers/providerutils.py +110 -0
- qiskit/pulse/__init__.py +158 -0
- qiskit/pulse/builder.py +2254 -0
- qiskit/pulse/calibration_entries.py +381 -0
- qiskit/pulse/channels.py +227 -0
- qiskit/pulse/configuration.py +245 -0
- qiskit/pulse/exceptions.py +45 -0
- qiskit/pulse/filters.py +309 -0
- qiskit/pulse/instruction_schedule_map.py +424 -0
- qiskit/pulse/instructions/__init__.py +67 -0
- qiskit/pulse/instructions/acquire.py +150 -0
- qiskit/pulse/instructions/delay.py +71 -0
- qiskit/pulse/instructions/directives.py +154 -0
- qiskit/pulse/instructions/frequency.py +135 -0
- qiskit/pulse/instructions/instruction.py +270 -0
- qiskit/pulse/instructions/phase.py +152 -0
- qiskit/pulse/instructions/play.py +99 -0
- qiskit/pulse/instructions/reference.py +100 -0
- qiskit/pulse/instructions/snapshot.py +82 -0
- qiskit/pulse/library/__init__.py +97 -0
- qiskit/pulse/library/continuous.py +430 -0
- qiskit/pulse/library/pulse.py +148 -0
- qiskit/pulse/library/samplers/__init__.py +15 -0
- qiskit/pulse/library/samplers/decorators.py +295 -0
- qiskit/pulse/library/samplers/strategies.py +71 -0
- qiskit/pulse/library/symbolic_pulses.py +1988 -0
- qiskit/pulse/library/waveform.py +136 -0
- qiskit/pulse/macros.py +262 -0
- qiskit/pulse/parameter_manager.py +445 -0
- qiskit/pulse/parser.py +314 -0
- qiskit/pulse/reference_manager.py +58 -0
- qiskit/pulse/schedule.py +1854 -0
- qiskit/pulse/transforms/__init__.py +106 -0
- qiskit/pulse/transforms/alignments.py +406 -0
- qiskit/pulse/transforms/base_transforms.py +71 -0
- qiskit/pulse/transforms/canonicalization.py +498 -0
- qiskit/pulse/transforms/dag.py +122 -0
- qiskit/pulse/utils.py +149 -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 +654 -0
- qiskit/qasm2/exceptions.py +27 -0
- qiskit/qasm2/export.py +372 -0
- qiskit/qasm2/parse.py +452 -0
- qiskit/qasm3/__init__.py +367 -0
- qiskit/qasm3/ast.py +738 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1299 -0
- qiskit/qasm3/printer.py +577 -0
- qiskit/qobj/__init__.py +75 -0
- qiskit/qobj/common.py +81 -0
- qiskit/qobj/converters/__init__.py +18 -0
- qiskit/qobj/converters/lo_config.py +177 -0
- qiskit/qobj/converters/pulse_instruction.py +897 -0
- qiskit/qobj/pulse_qobj.py +709 -0
- qiskit/qobj/qasm_qobj.py +708 -0
- qiskit/qobj/utils.py +46 -0
- qiskit/qpy/__init__.py +1822 -0
- qiskit/qpy/binary_io/__init__.py +36 -0
- qiskit/qpy/binary_io/circuits.py +1475 -0
- qiskit/qpy/binary_io/schedules.py +635 -0
- qiskit/qpy/binary_io/value.py +1025 -0
- qiskit/qpy/common.py +350 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +401 -0
- qiskit/qpy/interface.py +377 -0
- qiskit/qpy/type_keys.py +572 -0
- qiskit/quantum_info/__init__.py +162 -0
- qiskit/quantum_info/analysis/__init__.py +17 -0
- qiskit/quantum_info/analysis/average.py +47 -0
- qiskit/quantum_info/analysis/distance.py +102 -0
- qiskit/quantum_info/analysis/make_observable.py +44 -0
- qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
- qiskit/quantum_info/operators/__init__.py +28 -0
- qiskit/quantum_info/operators/base_operator.py +145 -0
- qiskit/quantum_info/operators/channel/__init__.py +29 -0
- qiskit/quantum_info/operators/channel/chi.py +191 -0
- qiskit/quantum_info/operators/channel/choi.py +218 -0
- qiskit/quantum_info/operators/channel/kraus.py +337 -0
- qiskit/quantum_info/operators/channel/ptm.py +204 -0
- qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
- qiskit/quantum_info/operators/channel/stinespring.py +296 -0
- qiskit/quantum_info/operators/channel/superop.py +377 -0
- qiskit/quantum_info/operators/channel/transformations.py +475 -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 +509 -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 +865 -0
- qiskit/quantum_info/operators/operator_utils.py +76 -0
- qiskit/quantum_info/operators/predicates.py +183 -0
- qiskit/quantum_info/operators/random.py +154 -0
- qiskit/quantum_info/operators/scalar_op.py +254 -0
- qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
- qiskit/quantum_info/operators/symplectic/clifford.py +1030 -0
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
- qiskit/quantum_info/operators/symplectic/pauli.py +753 -0
- qiskit/quantum_info/operators/symplectic/pauli_list.py +1230 -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 +1196 -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 +845 -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 +773 -0
- qiskit/quantum_info/states/statevector.py +958 -0
- qiskit/quantum_info/states/utils.py +247 -0
- qiskit/result/__init__.py +73 -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/mitigation/__init__.py +13 -0
- qiskit/result/mitigation/base_readout_mitigator.py +79 -0
- qiskit/result/mitigation/correlated_readout_mitigator.py +277 -0
- qiskit/result/mitigation/local_readout_mitigator.py +328 -0
- qiskit/result/mitigation/utils.py +217 -0
- qiskit/result/models.py +234 -0
- qiskit/result/postprocess.py +239 -0
- qiskit/result/result.py +392 -0
- qiskit/result/sampled_expval.py +75 -0
- qiskit/result/utils.py +295 -0
- qiskit/scheduler/__init__.py +40 -0
- qiskit/scheduler/config.py +37 -0
- qiskit/scheduler/lowering.py +187 -0
- qiskit/scheduler/methods/__init__.py +15 -0
- qiskit/scheduler/methods/basic.py +140 -0
- qiskit/scheduler/schedule_circuit.py +69 -0
- qiskit/scheduler/sequence.py +104 -0
- qiskit/synthesis/__init__.py +220 -0
- qiskit/synthesis/arithmetic/__init__.py +16 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
- qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +102 -0
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +99 -0
- qiskit/synthesis/clifford/__init__.py +19 -0
- qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
- qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
- qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
- qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
- qiskit/synthesis/cnotdihedral/__init__.py +17 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
- qiskit/synthesis/discrete_basis/__init__.py +16 -0
- qiskit/synthesis/discrete_basis/commutator_decompose.py +241 -0
- qiskit/synthesis/discrete_basis/gate_sequence.py +415 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +163 -0
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +217 -0
- qiskit/synthesis/evolution/__init__.py +21 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +117 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +311 -0
- qiskit/synthesis/evolution/qdrift.py +138 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +215 -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 +276 -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 +262 -0
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
- qiskit/synthesis/multi_controlled/__init__.py +24 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +356 -0
- qiskit/synthesis/one_qubit/__init__.py +15 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
- qiskit/synthesis/permutation/__init__.py +18 -0
- qiskit/synthesis/permutation/permutation_full.py +78 -0
- qiskit/synthesis/permutation/permutation_lnn.py +54 -0
- qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
- qiskit/synthesis/permutation/permutation_utils.py +16 -0
- qiskit/synthesis/qft/__init__.py +16 -0
- qiskit/synthesis/qft/qft_decompose_full.py +97 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +79 -0
- qiskit/synthesis/stabilizer/__init__.py +16 -0
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
- qiskit/synthesis/two_qubit/__init__.py +19 -0
- qiskit/synthesis/two_qubit/local_invariance.py +63 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +700 -0
- qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
- qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
- qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
- qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
- qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
- qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
- qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
- qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
- qiskit/synthesis/unitary/__init__.py +13 -0
- qiskit/synthesis/unitary/aqc/__init__.py +177 -0
- qiskit/synthesis/unitary/aqc/approximate.py +116 -0
- qiskit/synthesis/unitary/aqc/aqc.py +175 -0
- qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
- qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
- qiskit/synthesis/unitary/qsd.py +288 -0
- qiskit/transpiler/__init__.py +1290 -0
- qiskit/transpiler/basepasses.py +221 -0
- qiskit/transpiler/coupling.py +500 -0
- qiskit/transpiler/exceptions.py +59 -0
- qiskit/transpiler/instruction_durations.py +281 -0
- qiskit/transpiler/layout.py +737 -0
- qiskit/transpiler/passes/__init__.py +312 -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 +137 -0
- qiskit/transpiler/passes/basis/decompose.py +131 -0
- qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +88 -0
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +109 -0
- qiskit/transpiler/passes/calibration/__init__.py +17 -0
- qiskit/transpiler/passes/calibration/base_builder.py +79 -0
- qiskit/transpiler/passes/calibration/builders.py +20 -0
- qiskit/transpiler/passes/calibration/exceptions.py +22 -0
- qiskit/transpiler/passes/calibration/pulse_gate.py +100 -0
- qiskit/transpiler/passes/calibration/rx_builder.py +164 -0
- qiskit/transpiler/passes/calibration/rzx_builder.py +411 -0
- qiskit/transpiler/passes/calibration/rzx_templates.py +51 -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 +123 -0
- qiskit/transpiler/passes/layout/csp_layout.py +132 -0
- qiskit/transpiler/passes/layout/dense_layout.py +202 -0
- qiskit/transpiler/passes/layout/disjoint_utils.py +219 -0
- qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +117 -0
- qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
- qiskit/transpiler/passes/layout/sabre_layout.py +487 -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 +263 -0
- qiskit/transpiler/passes/layout/vf2_post_layout.py +419 -0
- qiskit/transpiler/passes/layout/vf2_utils.py +260 -0
- qiskit/transpiler/passes/optimization/__init__.py +43 -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 +115 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +104 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +80 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +227 -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 +149 -0
- qiskit/transpiler/passes/optimization/cx_cancellation.py +65 -0
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +162 -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/normalize_rx_angle.py +149 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +268 -0
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +254 -0
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
- qiskit/transpiler/passes/optimization/optimize_annotated.py +448 -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 +69 -0
- qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +47 -0
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +40 -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 +638 -0
- qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
- qiskit/transpiler/passes/routing/__init__.py +22 -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 +395 -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 +447 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +392 -0
- qiskit/transpiler/passes/routing/stochastic_swap.py +532 -0
- qiskit/transpiler/passes/routing/utils.py +35 -0
- qiskit/transpiler/passes/scheduling/__init__.py +27 -0
- qiskit/transpiler/passes/scheduling/alap.py +153 -0
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +81 -0
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +255 -0
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +78 -0
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +107 -0
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +250 -0
- qiskit/transpiler/passes/scheduling/asap.py +175 -0
- qiskit/transpiler/passes/scheduling/base_scheduler.py +310 -0
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +312 -0
- qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +256 -0
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +452 -0
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +82 -0
- qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +127 -0
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +131 -0
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +94 -0
- qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +165 -0
- qiskit/transpiler/passes/synthesis/__init__.py +20 -0
- qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +854 -0
- qiskit/transpiler/passes/synthesis/hls_plugins.py +1559 -0
- qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
- qiskit/transpiler/passes/synthesis/plugin.py +734 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +297 -0
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +1076 -0
- qiskit/transpiler/passes/utils/__init__.py +33 -0
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
- qiskit/transpiler/passes/utils/check_gate_direction.py +52 -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 +65 -0
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +93 -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 +65 -0
- qiskit/transpiler/passes/utils/fixed_point.py +48 -0
- qiskit/transpiler/passes/utils/gate_direction.py +86 -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 +49 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +114 -0
- qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
- qiskit/transpiler/passmanager.py +490 -0
- qiskit/transpiler/passmanager_config.py +216 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +73 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1045 -0
- qiskit/transpiler/preset_passmanagers/common.py +649 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +626 -0
- qiskit/transpiler/preset_passmanagers/level0.py +113 -0
- qiskit/transpiler/preset_passmanagers/level1.py +120 -0
- qiskit/transpiler/preset_passmanagers/level2.py +119 -0
- qiskit/transpiler/preset_passmanagers/level3.py +119 -0
- qiskit/transpiler/preset_passmanagers/plugin.py +353 -0
- qiskit/transpiler/target.py +1319 -0
- qiskit/transpiler/timing_constraints.py +59 -0
- qiskit/user_config.py +262 -0
- qiskit/utils/__init__.py +89 -0
- qiskit/utils/classtools.py +146 -0
- qiskit/utils/deprecate_pulse.py +119 -0
- qiskit/utils/deprecation.py +490 -0
- qiskit/utils/lazy_tester.py +363 -0
- qiskit/utils/multiprocessing.py +56 -0
- qiskit/utils/optionals.py +347 -0
- qiskit/utils/parallel.py +191 -0
- qiskit/utils/units.py +143 -0
- qiskit/version.py +84 -0
- qiskit/visualization/__init__.py +288 -0
- qiskit/visualization/array.py +204 -0
- qiskit/visualization/bloch.py +778 -0
- qiskit/visualization/circuit/__init__.py +15 -0
- qiskit/visualization/circuit/_utils.py +675 -0
- qiskit/visualization/circuit/circuit_visualization.py +727 -0
- qiskit/visualization/circuit/latex.py +661 -0
- qiskit/visualization/circuit/matplotlib.py +2029 -0
- qiskit/visualization/circuit/qcstyle.py +278 -0
- qiskit/visualization/circuit/styles/__init__.py +13 -0
- qiskit/visualization/circuit/styles/bw.json +202 -0
- qiskit/visualization/circuit/styles/clifford.json +202 -0
- qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
- qiskit/visualization/circuit/styles/iqp.json +214 -0
- qiskit/visualization/circuit/styles/textbook.json +202 -0
- qiskit/visualization/circuit/text.py +1844 -0
- qiskit/visualization/circuit_visualization.py +19 -0
- qiskit/visualization/counts_visualization.py +481 -0
- qiskit/visualization/dag_visualization.py +316 -0
- qiskit/visualization/exceptions.py +21 -0
- qiskit/visualization/gate_map.py +1485 -0
- qiskit/visualization/library.py +37 -0
- qiskit/visualization/pass_manager_visualization.py +308 -0
- qiskit/visualization/pulse_v2/__init__.py +21 -0
- qiskit/visualization/pulse_v2/core.py +901 -0
- qiskit/visualization/pulse_v2/device_info.py +173 -0
- qiskit/visualization/pulse_v2/drawings.py +253 -0
- qiskit/visualization/pulse_v2/events.py +254 -0
- qiskit/visualization/pulse_v2/generators/__init__.py +40 -0
- qiskit/visualization/pulse_v2/generators/barrier.py +76 -0
- qiskit/visualization/pulse_v2/generators/chart.py +208 -0
- qiskit/visualization/pulse_v2/generators/frame.py +436 -0
- qiskit/visualization/pulse_v2/generators/snapshot.py +133 -0
- qiskit/visualization/pulse_v2/generators/waveform.py +645 -0
- qiskit/visualization/pulse_v2/interface.py +458 -0
- qiskit/visualization/pulse_v2/layouts.py +387 -0
- qiskit/visualization/pulse_v2/plotters/__init__.py +17 -0
- qiskit/visualization/pulse_v2/plotters/base_plotter.py +53 -0
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +201 -0
- qiskit/visualization/pulse_v2/stylesheet.py +312 -0
- qiskit/visualization/pulse_v2/types.py +242 -0
- qiskit/visualization/state_visualization.py +1518 -0
- qiskit/visualization/timeline/__init__.py +21 -0
- qiskit/visualization/timeline/core.py +480 -0
- qiskit/visualization/timeline/drawings.py +260 -0
- qiskit/visualization/timeline/generators.py +506 -0
- qiskit/visualization/timeline/interface.py +436 -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 +192 -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-1.3.0.dist-info/LICENSE.txt +203 -0
- qiskit-1.3.0.dist-info/METADATA +222 -0
- qiskit-1.3.0.dist-info/RECORD +836 -0
- qiskit-1.3.0.dist-info/WHEEL +5 -0
- qiskit-1.3.0.dist-info/entry_points.txt +76 -0
- qiskit-1.3.0.dist-info/top_level.txt +1 -0
@@ -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,202 @@
|
|
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.passes.layout import disjoint_utils
|
23
|
+
|
24
|
+
from qiskit._accelerate.dense_layout import best_subset
|
25
|
+
|
26
|
+
|
27
|
+
class DenseLayout(AnalysisPass):
|
28
|
+
"""Choose a Layout by finding the most connected subset of qubits.
|
29
|
+
|
30
|
+
This pass associates a physical qubit (int) to each virtual qubit
|
31
|
+
of the circuit (Qubit).
|
32
|
+
|
33
|
+
Note:
|
34
|
+
Even though a ``'layout'`` is not strictly a property of the DAG,
|
35
|
+
in the transpiler architecture it is best passed around between passes
|
36
|
+
by being set in ``property_set``.
|
37
|
+
"""
|
38
|
+
|
39
|
+
def __init__(self, coupling_map=None, backend_prop=None, target=None):
|
40
|
+
"""DenseLayout initializer.
|
41
|
+
|
42
|
+
Args:
|
43
|
+
coupling_map (Coupling): directed graph representing a coupling map.
|
44
|
+
backend_prop (BackendProperties): backend properties object
|
45
|
+
target (Target): A target representing the target backend.
|
46
|
+
"""
|
47
|
+
super().__init__()
|
48
|
+
self.coupling_map = coupling_map
|
49
|
+
self.backend_prop = backend_prop
|
50
|
+
self.target = target
|
51
|
+
self.adjacency_matrix = None
|
52
|
+
if target is not None:
|
53
|
+
self.coupling_map = target.build_coupling_map()
|
54
|
+
|
55
|
+
def run(self, dag):
|
56
|
+
"""Run the DenseLayout pass on `dag`.
|
57
|
+
|
58
|
+
Pick a convenient layout depending on the best matching
|
59
|
+
qubit connectivity, and set the property `layout`.
|
60
|
+
|
61
|
+
Args:
|
62
|
+
dag (DAGCircuit): DAG to find layout for.
|
63
|
+
|
64
|
+
Raises:
|
65
|
+
TranspilerError: if dag wider than self.coupling_map
|
66
|
+
"""
|
67
|
+
if self.coupling_map is None:
|
68
|
+
raise TranspilerError(
|
69
|
+
"A coupling_map or target with constrained qargs is necessary to run the pass."
|
70
|
+
)
|
71
|
+
layout_components = disjoint_utils.run_pass_over_connected_components(
|
72
|
+
dag,
|
73
|
+
self.coupling_map if self.target is None else self.target,
|
74
|
+
self._inner_run,
|
75
|
+
)
|
76
|
+
layout_mapping = {}
|
77
|
+
for component in layout_components:
|
78
|
+
layout_mapping.update(component)
|
79
|
+
layout = Layout(layout_mapping)
|
80
|
+
for qreg in dag.qregs.values():
|
81
|
+
layout.add_register(qreg)
|
82
|
+
self.property_set["layout"] = layout
|
83
|
+
|
84
|
+
def _inner_run(self, dag, coupling_map):
|
85
|
+
num_dag_qubits = len(dag.qubits)
|
86
|
+
if num_dag_qubits > coupling_map.size():
|
87
|
+
raise TranspilerError("Number of qubits greater than device.")
|
88
|
+
num_cx = 0
|
89
|
+
num_meas = 0
|
90
|
+
|
91
|
+
if self.target is not None:
|
92
|
+
num_cx = 1
|
93
|
+
num_meas = 1
|
94
|
+
else:
|
95
|
+
# Get avg number of cx and meas per qubit
|
96
|
+
ops = dag.count_ops(recurse=True)
|
97
|
+
if "cx" in ops.keys():
|
98
|
+
num_cx = ops["cx"]
|
99
|
+
if "measure" in ops.keys():
|
100
|
+
num_meas = ops["measure"]
|
101
|
+
|
102
|
+
best_sub = self._best_subset(num_dag_qubits, num_meas, num_cx, coupling_map)
|
103
|
+
layout_mapping = {
|
104
|
+
qubit: coupling_map.graph[int(best_sub[i])] for i, qubit in enumerate(dag.qubits)
|
105
|
+
}
|
106
|
+
return layout_mapping
|
107
|
+
|
108
|
+
def _best_subset(self, num_qubits, num_meas, num_cx, coupling_map):
|
109
|
+
"""Computes the qubit mapping with the best connectivity.
|
110
|
+
|
111
|
+
Args:
|
112
|
+
num_qubits (int): Number of subset qubits to consider.
|
113
|
+
|
114
|
+
Returns:
|
115
|
+
ndarray: Array of qubits to use for best connectivity mapping.
|
116
|
+
"""
|
117
|
+
from scipy.sparse import coo_matrix, csgraph
|
118
|
+
|
119
|
+
if num_qubits == 1:
|
120
|
+
return np.array([0])
|
121
|
+
if num_qubits == 0:
|
122
|
+
return []
|
123
|
+
|
124
|
+
adjacency_matrix = rustworkx.adjacency_matrix(coupling_map.graph)
|
125
|
+
reverse_index_map = {v: k for k, v in enumerate(coupling_map.graph.nodes())}
|
126
|
+
|
127
|
+
error_mat, use_error = _build_error_matrix(
|
128
|
+
coupling_map.size(),
|
129
|
+
reverse_index_map,
|
130
|
+
backend_prop=self.backend_prop,
|
131
|
+
coupling_map=self.coupling_map,
|
132
|
+
target=self.target,
|
133
|
+
)
|
134
|
+
|
135
|
+
rows, cols, best_map = best_subset(
|
136
|
+
num_qubits,
|
137
|
+
adjacency_matrix,
|
138
|
+
num_meas,
|
139
|
+
num_cx,
|
140
|
+
use_error,
|
141
|
+
coupling_map.is_symmetric,
|
142
|
+
error_mat,
|
143
|
+
)
|
144
|
+
data = [1] * len(rows)
|
145
|
+
sp_sub_graph = coo_matrix((data, (rows, cols)), shape=(num_qubits, num_qubits)).tocsr()
|
146
|
+
perm = csgraph.reverse_cuthill_mckee(sp_sub_graph)
|
147
|
+
best_map = best_map[perm]
|
148
|
+
return best_map
|
149
|
+
|
150
|
+
|
151
|
+
def _build_error_matrix(num_qubits, qubit_map, target=None, coupling_map=None, backend_prop=None):
|
152
|
+
error_mat = np.zeros((num_qubits, num_qubits))
|
153
|
+
use_error = False
|
154
|
+
if target is not None and target.qargs is not None:
|
155
|
+
for qargs in target.qargs:
|
156
|
+
# Ignore gates over 2q DenseLayout only works with 2q
|
157
|
+
if len(qargs) > 2:
|
158
|
+
continue
|
159
|
+
error = 0.0
|
160
|
+
ops = target.operation_names_for_qargs(qargs)
|
161
|
+
for op in ops:
|
162
|
+
props = target[op].get(qargs, None)
|
163
|
+
if props is not None and props.error is not None:
|
164
|
+
# Use max error rate to represent operation error
|
165
|
+
# on a qubit(s). If there is more than 1 operation available
|
166
|
+
# we don't know what will be used on the qubits eventually
|
167
|
+
# so we take the highest error operation as a proxy for
|
168
|
+
# the possible worst case.
|
169
|
+
error = max(error, props.error)
|
170
|
+
max_error = error
|
171
|
+
if any(qubit not in qubit_map for qubit in qargs):
|
172
|
+
continue
|
173
|
+
# TODO: Factor in T1 and T2 to error matrix after #7736
|
174
|
+
if len(qargs) == 1:
|
175
|
+
qubit = qubit_map[qargs[0]]
|
176
|
+
error_mat[qubit][qubit] = max_error
|
177
|
+
use_error = True
|
178
|
+
elif len(qargs) == 2:
|
179
|
+
error_mat[qubit_map[qargs[0]]][qubit_map[qargs[1]]] = max_error
|
180
|
+
use_error = True
|
181
|
+
elif backend_prop and coupling_map:
|
182
|
+
error_dict = {
|
183
|
+
tuple(gate.qubits): gate.parameters[0].value
|
184
|
+
for gate in backend_prop.gates
|
185
|
+
if len(gate.qubits) == 2
|
186
|
+
}
|
187
|
+
for edge in coupling_map.get_edges():
|
188
|
+
gate_error = error_dict.get(edge)
|
189
|
+
if gate_error is not None:
|
190
|
+
if edge[0] not in qubit_map or edge[1] not in qubit_map:
|
191
|
+
continue
|
192
|
+
error_mat[qubit_map[edge[0]]][qubit_map[edge[1]]] = gate_error
|
193
|
+
use_error = True
|
194
|
+
for index, qubit_data in enumerate(backend_prop.qubits):
|
195
|
+
if index not in qubit_map:
|
196
|
+
continue
|
197
|
+
for item in qubit_data:
|
198
|
+
if item.name == "readout_error":
|
199
|
+
mapped_index = qubit_map[index]
|
200
|
+
error_mat[mapped_index][mapped_index] = item.value
|
201
|
+
use_error = True
|
202
|
+
return error_mat, use_error
|
@@ -0,0 +1,219 @@
|
|
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 collections import defaultdict
|
16
|
+
from typing import List, Callable, TypeVar, Dict, Union
|
17
|
+
import uuid
|
18
|
+
|
19
|
+
import rustworkx as rx
|
20
|
+
from qiskit.dagcircuit import DAGOpNode
|
21
|
+
|
22
|
+
from qiskit.circuit import Qubit, Barrier, Clbit
|
23
|
+
from qiskit.dagcircuit.dagcircuit import DAGCircuit
|
24
|
+
from qiskit.dagcircuit.dagnode import DAGOutNode
|
25
|
+
from qiskit.transpiler.coupling import CouplingMap
|
26
|
+
from qiskit.transpiler.target import Target
|
27
|
+
from qiskit.transpiler.exceptions import TranspilerError
|
28
|
+
from qiskit.transpiler.passes.layout import vf2_utils
|
29
|
+
|
30
|
+
T = TypeVar("T")
|
31
|
+
|
32
|
+
|
33
|
+
def run_pass_over_connected_components(
|
34
|
+
dag: DAGCircuit,
|
35
|
+
components_source: Union[Target, CouplingMap],
|
36
|
+
run_func: Callable[[DAGCircuit, CouplingMap], T],
|
37
|
+
) -> List[T]:
|
38
|
+
"""Run a transpiler pass inner function over mapped components."""
|
39
|
+
if isinstance(components_source, Target):
|
40
|
+
coupling_map = components_source.build_coupling_map(filter_idle_qubits=True)
|
41
|
+
else:
|
42
|
+
coupling_map = components_source
|
43
|
+
cmap_components = coupling_map.connected_components()
|
44
|
+
# If graph is connected we only need to run the pass once
|
45
|
+
if len(cmap_components) == 1:
|
46
|
+
if dag.num_qubits() > cmap_components[0].size():
|
47
|
+
raise TranspilerError(
|
48
|
+
"A connected component of the DAGCircuit is too large for any of the connected "
|
49
|
+
"components in the coupling map."
|
50
|
+
)
|
51
|
+
return [run_func(dag, cmap_components[0])]
|
52
|
+
dag_components = separate_dag(dag)
|
53
|
+
mapped_components = map_components(dag_components, cmap_components)
|
54
|
+
out_component_pairs = []
|
55
|
+
for cmap_index, dags in mapped_components.items():
|
56
|
+
# Take the first dag from the mapped dag components and then
|
57
|
+
# compose it with any other dag components that are operating on the
|
58
|
+
# same coupling map connected component. This results in a subcircuit
|
59
|
+
# of possibly disjoint circuit components which we will run the layout
|
60
|
+
# pass on.
|
61
|
+
out_dag = dag_components[dags.pop()]
|
62
|
+
for dag_index in dags:
|
63
|
+
dag = dag_components[dag_index]
|
64
|
+
out_dag.add_qubits(dag.qubits)
|
65
|
+
out_dag.add_clbits(dag.clbits)
|
66
|
+
for qreg in dag.qregs:
|
67
|
+
out_dag.add_qreg(qreg)
|
68
|
+
for creg in dag.cregs:
|
69
|
+
out_dag.add_creg(creg)
|
70
|
+
out_dag.compose(dag, qubits=dag.qubits, clbits=dag.clbits)
|
71
|
+
out_component_pairs.append((out_dag, cmap_components[cmap_index]))
|
72
|
+
res = [run_func(out_dag, cmap) for out_dag, cmap in out_component_pairs]
|
73
|
+
return res
|
74
|
+
|
75
|
+
|
76
|
+
def map_components(
|
77
|
+
dag_components: List[DAGCircuit], cmap_components: List[CouplingMap]
|
78
|
+
) -> Dict[int, List[int]]:
|
79
|
+
"""Returns a map where the key is the index of each connected component in cmap_components and
|
80
|
+
the value is a list of indices from dag_components which should be placed onto it."""
|
81
|
+
free_qubits = {index: len(cmap.graph) for index, cmap in enumerate(cmap_components)}
|
82
|
+
out_mapping = defaultdict(list)
|
83
|
+
|
84
|
+
for dag_index, dag in sorted(
|
85
|
+
enumerate(dag_components), key=lambda x: x[1].num_qubits(), reverse=True
|
86
|
+
):
|
87
|
+
for cmap_index in sorted(
|
88
|
+
range(len(cmap_components)), key=lambda index: free_qubits[index], reverse=True
|
89
|
+
):
|
90
|
+
# TODO: Improve heuristic to involve connectivity and estimate
|
91
|
+
# swap cost
|
92
|
+
if dag.num_qubits() <= free_qubits[cmap_index]:
|
93
|
+
out_mapping[cmap_index].append(dag_index)
|
94
|
+
free_qubits[cmap_index] -= dag.num_qubits()
|
95
|
+
break
|
96
|
+
else:
|
97
|
+
raise TranspilerError(
|
98
|
+
"A connected component of the DAGCircuit is too large for any of the connected "
|
99
|
+
"components in the coupling map."
|
100
|
+
)
|
101
|
+
return out_mapping
|
102
|
+
|
103
|
+
|
104
|
+
def split_barriers(dag: DAGCircuit):
|
105
|
+
"""Mutate an input dag to split barriers into single qubit barriers."""
|
106
|
+
for node in dag.op_nodes(Barrier):
|
107
|
+
num_qubits = len(node.qargs)
|
108
|
+
if num_qubits == 1:
|
109
|
+
continue
|
110
|
+
if node.label:
|
111
|
+
barrier_uuid = f"{node.op.label}_uuid={uuid.uuid4()}"
|
112
|
+
else:
|
113
|
+
barrier_uuid = f"_none_uuid={uuid.uuid4()}"
|
114
|
+
split_dag = DAGCircuit()
|
115
|
+
split_dag.add_qubits([Qubit() for _ in range(num_qubits)])
|
116
|
+
for i in range(num_qubits):
|
117
|
+
split_dag.apply_operation_back(
|
118
|
+
Barrier(1, label=barrier_uuid),
|
119
|
+
qargs=(split_dag.qubits[i],),
|
120
|
+
check=False,
|
121
|
+
)
|
122
|
+
dag.substitute_node_with_dag(node, split_dag)
|
123
|
+
|
124
|
+
|
125
|
+
def combine_barriers(dag: DAGCircuit, retain_uuid: bool = True):
|
126
|
+
"""Mutate input dag to combine barriers with UUID labels into a single barrier."""
|
127
|
+
qubit_indices = {bit: index for index, bit in enumerate(dag.qubits)}
|
128
|
+
uuid_map: dict[str, DAGOpNode] = {}
|
129
|
+
for node in dag.op_nodes(Barrier):
|
130
|
+
if node.label:
|
131
|
+
if "_uuid=" in node.label:
|
132
|
+
barrier_uuid = node.label
|
133
|
+
else:
|
134
|
+
continue
|
135
|
+
if barrier_uuid in uuid_map:
|
136
|
+
other_node = uuid_map[barrier_uuid]
|
137
|
+
num_qubits = len(other_node.qargs) + len(node.qargs)
|
138
|
+
if not retain_uuid:
|
139
|
+
if isinstance(node.label, str) and node.label.startswith("_none_uuid="):
|
140
|
+
label = None
|
141
|
+
elif isinstance(node.label, str) and "_uuid=" in node.label:
|
142
|
+
label = "_uuid=".join(node.label.split("_uuid=")[:-1])
|
143
|
+
else:
|
144
|
+
label = barrier_uuid
|
145
|
+
else:
|
146
|
+
label = barrier_uuid
|
147
|
+
new_op = Barrier(num_qubits, label=label)
|
148
|
+
new_node = dag.replace_block_with_op([node, other_node], new_op, qubit_indices)
|
149
|
+
uuid_map[barrier_uuid] = new_node
|
150
|
+
else:
|
151
|
+
uuid_map[barrier_uuid] = node
|
152
|
+
|
153
|
+
|
154
|
+
def require_layout_isolated_to_component(
|
155
|
+
dag: DAGCircuit, components_source: Union[Target, CouplingMap]
|
156
|
+
):
|
157
|
+
"""
|
158
|
+
Check that the layout of the dag does not require connectivity across connected components
|
159
|
+
in the CouplingMap
|
160
|
+
|
161
|
+
Args:
|
162
|
+
dag: DAGCircuit to check.
|
163
|
+
components_source: Target to check against.
|
164
|
+
|
165
|
+
Raises:
|
166
|
+
TranspilerError: Chosen layout is not valid for the target disjoint connectivity.
|
167
|
+
"""
|
168
|
+
if isinstance(components_source, Target):
|
169
|
+
coupling_map = components_source.build_coupling_map(filter_idle_qubits=True)
|
170
|
+
else:
|
171
|
+
coupling_map = components_source
|
172
|
+
component_sets = [set(x.graph.nodes()) for x in coupling_map.connected_components()]
|
173
|
+
for inst in dag.two_qubit_ops():
|
174
|
+
component_index = None
|
175
|
+
for i, component_set in enumerate(component_sets):
|
176
|
+
if dag.find_bit(inst.qargs[0]).index in component_set:
|
177
|
+
component_index = i
|
178
|
+
break
|
179
|
+
if dag.find_bit(inst.qargs[1]).index not in component_sets[component_index]:
|
180
|
+
raise TranspilerError(
|
181
|
+
"The circuit has an invalid layout as two qubits need to interact in disconnected "
|
182
|
+
"components of the coupling map. The physical qubit "
|
183
|
+
f"{dag.find_bit(inst.qargs[1]).index} needs to interact with the "
|
184
|
+
f"qubit {dag.find_bit(inst.qargs[0]).index} and they belong to different components"
|
185
|
+
)
|
186
|
+
|
187
|
+
|
188
|
+
def separate_dag(dag: DAGCircuit) -> List[DAGCircuit]:
|
189
|
+
"""Separate a dag circuit into it's connected components."""
|
190
|
+
# Split barriers into single qubit barriers before splitting connected components
|
191
|
+
split_barriers(dag)
|
192
|
+
im_graph, _, qubit_map, __ = vf2_utils.build_interaction_graph(dag)
|
193
|
+
connected_components = rx.weakly_connected_components(im_graph)
|
194
|
+
component_qubits = []
|
195
|
+
for component in connected_components:
|
196
|
+
component_qubits.append({qubit_map[x] for x in component})
|
197
|
+
|
198
|
+
qubits = set(dag.qubits)
|
199
|
+
|
200
|
+
decomposed_dags = []
|
201
|
+
for dag_qubits in component_qubits:
|
202
|
+
new_dag = dag.copy_empty_like()
|
203
|
+
new_dag.remove_qubits(*qubits - dag_qubits)
|
204
|
+
new_dag.global_phase = 0
|
205
|
+
for node in dag.topological_op_nodes():
|
206
|
+
if dag_qubits.issuperset(node.qargs):
|
207
|
+
new_dag.apply_operation_back(node.op, node.qargs, node.cargs, check=False)
|
208
|
+
idle_clbits = []
|
209
|
+
for bit, node in new_dag.input_map.items():
|
210
|
+
succ_node = next(new_dag.successors(node))
|
211
|
+
if isinstance(succ_node, DAGOutNode) and isinstance(succ_node.wire, Clbit):
|
212
|
+
idle_clbits.append(bit)
|
213
|
+
new_dag.remove_clbits(*idle_clbits)
|
214
|
+
combine_barriers(new_dag)
|
215
|
+
decomposed_dags.append(new_dag)
|
216
|
+
# Reverse split barriers on input dag to avoid leaking out internal transformations as
|
217
|
+
# part of splitting
|
218
|
+
combine_barriers(dag, retain_uuid=False)
|
219
|
+
return decomposed_dags
|
@@ -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
|