qiskit 1.3.0b1__cp39-abi3-macosx_10_9_x86_64.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 +127 -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 +365 -0
- qiskit/assembler/disassemble.py +310 -0
- qiskit/assembler/run_config.py +77 -0
- qiskit/circuit/__init__.py +1270 -0
- qiskit/circuit/_classical_resource_map.py +148 -0
- qiskit/circuit/_standard_gates_commutations.py +3264 -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 +48 -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 +503 -0
- qiskit/circuit/controlflow/switch_case.py +417 -0
- qiskit/circuit/controlflow/while_loop.py +163 -0
- qiskit/circuit/controlledgate.py +274 -0
- qiskit/circuit/delay.py +106 -0
- qiskit/circuit/duration.py +95 -0
- qiskit/circuit/equivalence.py +295 -0
- qiskit/circuit/equivalence_library.py +18 -0
- qiskit/circuit/exceptions.py +19 -0
- qiskit/circuit/gate.py +261 -0
- qiskit/circuit/instruction.py +676 -0
- qiskit/circuit/instructionset.py +177 -0
- qiskit/circuit/library/__init__.py +572 -0
- qiskit/circuit/library/arithmetic/__init__.py +27 -0
- qiskit/circuit/library/arithmetic/adders/__init__.py +17 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +58 -0
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +159 -0
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +116 -0
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +165 -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 +16 -0
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +138 -0
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +101 -0
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +101 -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 +331 -0
- qiskit/circuit/library/blueprintcircuit.py +216 -0
- qiskit/circuit/library/boolean_logic/__init__.py +18 -0
- qiskit/circuit/library/boolean_logic/inner_product.py +78 -0
- qiskit/circuit/library/boolean_logic/quantum_and.py +97 -0
- qiskit/circuit/library/boolean_logic/quantum_or.py +98 -0
- qiskit/circuit/library/boolean_logic/quantum_xor.py +71 -0
- qiskit/circuit/library/data_preparation/__init__.py +54 -0
- qiskit/circuit/library/data_preparation/initializer.py +107 -0
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +343 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
- qiskit/circuit/library/data_preparation/z_feature_map.py +104 -0
- qiskit/circuit/library/data_preparation/zz_feature_map.py +118 -0
- qiskit/circuit/library/fourier_checking.py +97 -0
- qiskit/circuit/library/generalized_gates/__init__.py +30 -0
- qiskit/circuit/library/generalized_gates/diagonal.py +165 -0
- qiskit/circuit/library/generalized_gates/gms.py +121 -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 +312 -0
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
- qiskit/circuit/library/generalized_gates/mcmt.py +256 -0
- qiskit/circuit/library/generalized_gates/pauli.py +85 -0
- qiskit/circuit/library/generalized_gates/permutation.py +192 -0
- qiskit/circuit/library/generalized_gates/rv.py +97 -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 +86 -0
- qiskit/circuit/library/grover_operator.py +311 -0
- qiskit/circuit/library/hamiltonian_gate.py +142 -0
- qiskit/circuit/library/hidden_linear_function.py +98 -0
- qiskit/circuit/library/iqp.py +96 -0
- qiskit/circuit/library/n_local/__init__.py +33 -0
- qiskit/circuit/library/n_local/efficient_su2.py +164 -0
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +256 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +173 -0
- qiskit/circuit/library/n_local/n_local.py +1071 -0
- qiskit/circuit/library/n_local/pauli_two_design.py +141 -0
- qiskit/circuit/library/n_local/qaoa_ansatz.py +287 -0
- qiskit/circuit/library/n_local/real_amplitudes.py +186 -0
- qiskit/circuit/library/n_local/two_local.py +282 -0
- qiskit/circuit/library/overlap.py +117 -0
- qiskit/circuit/library/pauli_evolution.py +184 -0
- qiskit/circuit/library/phase_estimation.py +99 -0
- qiskit/circuit/library/phase_oracle.py +153 -0
- qiskit/circuit/library/quantum_volume.py +115 -0
- qiskit/circuit/library/standard_gates/__init__.py +123 -0
- qiskit/circuit/library/standard_gates/dcx.py +77 -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 +257 -0
- qiskit/circuit/library/standard_gates/i.py +75 -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 +433 -0
- qiskit/circuit/library/standard_gates/r.py +117 -0
- qiskit/circuit/library/standard_gates/rx.py +302 -0
- qiskit/circuit/library/standard_gates/rxx.py +183 -0
- qiskit/circuit/library/standard_gates/ry.py +297 -0
- qiskit/circuit/library/standard_gates/ryy.py +183 -0
- qiskit/circuit/library/standard_gates/rz.py +318 -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 +314 -0
- qiskit/circuit/library/standard_gates/t.py +179 -0
- qiskit/circuit/library/standard_gates/u.py +395 -0
- qiskit/circuit/library/standard_gates/u1.py +451 -0
- qiskit/circuit/library/standard_gates/u2.py +146 -0
- qiskit/circuit/library/standard_gates/u3.py +408 -0
- qiskit/circuit/library/standard_gates/x.py +1527 -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 +261 -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 +33 -0
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +32 -0
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +33 -0
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +36 -0
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +36 -0
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +39 -0
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +39 -0
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +39 -0
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +39 -0
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +39 -0
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +41 -0
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +41 -0
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +40 -0
- qiskit/circuit/library/templates/nct/__init__.py +67 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +32 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +33 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +35 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +37 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +37 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +38 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +38 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +38 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +37 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +38 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +42 -0
- qiskit/circuit/library/templates/rzx/__init__.py +25 -0
- qiskit/circuit/library/templates/rzx/rzx_cy.py +46 -0
- qiskit/circuit/library/templates/rzx/rzx_xz.py +53 -0
- qiskit/circuit/library/templates/rzx/rzx_yz.py +43 -0
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +67 -0
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +58 -0
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +57 -0
- qiskit/circuit/measure.py +44 -0
- qiskit/circuit/operation.py +67 -0
- qiskit/circuit/parameter.py +174 -0
- qiskit/circuit/parameterexpression.py +559 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +120 -0
- qiskit/circuit/quantumcircuit.py +6793 -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 +604 -0
- qiskit/circuit/store.py +95 -0
- qiskit/circuit/tools/__init__.py +16 -0
- qiskit/circuit/tools/pi_check.py +190 -0
- qiskit/compiler/__init__.py +33 -0
- qiskit/compiler/assembler.py +668 -0
- qiskit/compiler/scheduler.py +107 -0
- qiskit/compiler/sequencer.py +69 -0
- qiskit/compiler/transpiler.py +478 -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 +77 -0
- qiskit/converters/dag_to_dagdependency.py +55 -0
- qiskit/converters/dag_to_dagdependency_v2.py +44 -0
- qiskit/converters/dagdependency_to_circuit.py +42 -0
- qiskit/converters/dagdependency_to_dag.py +49 -0
- qiskit/dagcircuit/__init__.py +44 -0
- qiskit/dagcircuit/collect_blocks.py +391 -0
- qiskit/dagcircuit/dagcircuit.py +24 -0
- qiskit/dagcircuit/dagdependency.py +633 -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 +483 -0
- qiskit/primitives/backend_estimator_v2.py +434 -0
- qiskit/primitives/backend_sampler.py +222 -0
- qiskit/primitives/backend_sampler_v2.py +296 -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 +165 -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 +656 -0
- qiskit/providers/backend_compat.py +452 -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 +811 -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 +44 -0
- qiskit/providers/fake_provider/fake_qasm_backend.py +77 -0
- qiskit/providers/fake_provider/generic_backend_v2.py +1019 -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 +303 -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 +2213 -0
- qiskit/pulse/calibration_entries.py +378 -0
- qiskit/pulse/channels.py +225 -0
- qiskit/pulse/configuration.py +245 -0
- qiskit/pulse/exceptions.py +43 -0
- qiskit/pulse/filters.py +309 -0
- qiskit/pulse/instruction_schedule_map.py +409 -0
- qiskit/pulse/instructions/__init__.py +67 -0
- qiskit/pulse/instructions/acquire.py +148 -0
- qiskit/pulse/instructions/delay.py +69 -0
- qiskit/pulse/instructions/directives.py +146 -0
- qiskit/pulse/instructions/frequency.py +132 -0
- qiskit/pulse/instructions/instruction.py +268 -0
- qiskit/pulse/instructions/phase.py +149 -0
- qiskit/pulse/instructions/play.py +97 -0
- qiskit/pulse/instructions/reference.py +98 -0
- qiskit/pulse/instructions/snapshot.py +80 -0
- qiskit/pulse/library/__init__.py +97 -0
- qiskit/pulse/library/continuous.py +430 -0
- qiskit/pulse/library/pulse.py +146 -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 +1960 -0
- qiskit/pulse/library/waveform.py +134 -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 +1855 -0
- qiskit/pulse/transforms/__init__.py +106 -0
- qiskit/pulse/transforms/alignments.py +404 -0
- qiskit/pulse/transforms/base_transforms.py +71 -0
- qiskit/pulse/transforms/canonicalization.py +498 -0
- qiskit/pulse/transforms/dag.py +115 -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 +370 -0
- qiskit/qasm2/parse.py +408 -0
- qiskit/qasm3/__init__.py +366 -0
- qiskit/qasm3/ast.py +630 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1273 -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 +895 -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 +1641 -0
- qiskit/qpy/binary_io/__init__.py +36 -0
- qiskit/qpy/binary_io/circuits.py +1460 -0
- qiskit/qpy/binary_io/schedules.py +636 -0
- qiskit/qpy/binary_io/value.py +728 -0
- qiskit/qpy/common.py +306 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +394 -0
- qiskit/qpy/interface.py +341 -0
- qiskit/qpy/type_keys.py +572 -0
- qiskit/quantum_info/__init__.py +158 -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 +468 -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 +819 -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 +727 -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 +751 -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 +1175 -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 +269 -0
- qiskit/result/mitigation/local_readout_mitigator.py +320 -0
- qiskit/result/mitigation/utils.py +160 -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 +35 -0
- qiskit/scheduler/lowering.py +187 -0
- qiskit/scheduler/methods/__init__.py +15 -0
- qiskit/scheduler/methods/basic.py +137 -0
- qiskit/scheduler/schedule_circuit.py +67 -0
- qiskit/scheduler/sequence.py +102 -0
- qiskit/synthesis/__init__.py +195 -0
- qiskit/synthesis/clifford/__init__.py +19 -0
- qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
- qiskit/synthesis/clifford/clifford_decompose_bm.py +47 -0
- qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +57 -0
- qiskit/synthesis/clifford/clifford_decompose_layers.py +446 -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 +20 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +143 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/product_formula.py +384 -0
- qiskit/synthesis/evolution/qdrift.py +131 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +155 -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 +23 -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 +79 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +78 -0
- qiskit/synthesis/stabilizer/__init__.py +16 -0
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +193 -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 +759 -0
- qiskit/synthesis/two_qubit/weyl.py +97 -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 +1283 -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 +310 -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 +693 -0
- qiskit/transpiler/passes/basis/decompose.py +98 -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 +98 -0
- qiskit/transpiler/passes/calibration/rx_builder.py +160 -0
- qiskit/transpiler/passes/calibration/rzx_builder.py +395 -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 +217 -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 +482 -0
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +220 -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 +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 +115 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +88 -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 +232 -0
- qiskit/transpiler/passes/optimization/cx_cancellation.py +65 -0
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +160 -0
- qiskit/transpiler/passes/optimization/elide_permutations.py +114 -0
- qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +93 -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 +260 -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_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 +443 -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 +105 -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 +308 -0
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +307 -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 +441 -0
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +79 -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 +90 -0
- qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +160 -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 +691 -0
- qiskit/transpiler/passes/synthesis/hls_plugins.py +928 -0
- qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
- qiskit/transpiler/passes/synthesis/plugin.py +734 -0
- qiskit/transpiler/passes/synthesis/qubit_tracker.py +132 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +297 -0
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +1055 -0
- qiskit/transpiler/passes/utils/__init__.py +33 -0
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +95 -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 +88 -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 +349 -0
- qiskit/transpiler/passes/utils/gates_basis.py +74 -0
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +162 -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 +198 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +73 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1019 -0
- qiskit/transpiler/preset_passmanagers/common.py +647 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +543 -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 +1261 -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/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 +726 -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 +319 -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 +456 -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 +457 -0
- qiskit/visualization/timeline/drawings.py +260 -0
- qiskit/visualization/timeline/generators.py +506 -0
- qiskit/visualization/timeline/interface.py +424 -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.0b1.dist-info/LICENSE.txt +203 -0
- qiskit-1.3.0b1.dist-info/METADATA +221 -0
- qiskit-1.3.0b1.dist-info/RECORD +825 -0
- qiskit-1.3.0b1.dist-info/WHEEL +5 -0
- qiskit-1.3.0b1.dist-info/entry_points.txt +57 -0
- qiskit-1.3.0b1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,232 @@
|
|
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
|
+
"""Replace each block of consecutive gates by a single Unitary node."""
|
14
|
+
from __future__ import annotations
|
15
|
+
|
16
|
+
import numpy as np
|
17
|
+
|
18
|
+
from qiskit.circuit.classicalregister import ClassicalRegister
|
19
|
+
from qiskit.circuit.quantumregister import QuantumRegister
|
20
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
21
|
+
from qiskit.dagcircuit.dagnode import DAGOpNode
|
22
|
+
from qiskit.quantum_info import Operator
|
23
|
+
from qiskit.synthesis.two_qubit import TwoQubitBasisDecomposer
|
24
|
+
from qiskit.circuit.library.generalized_gates.unitary import UnitaryGate
|
25
|
+
from qiskit.circuit.library.standard_gates import CXGate
|
26
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
27
|
+
from qiskit.transpiler.passmanager import PassManager
|
28
|
+
from qiskit.transpiler.passes.synthesis import unitary_synthesis
|
29
|
+
from qiskit.circuit.controlflow import CONTROL_FLOW_OP_NAMES
|
30
|
+
from qiskit._accelerate.convert_2q_block_matrix import blocks_to_matrix
|
31
|
+
from qiskit.exceptions import QiskitError
|
32
|
+
|
33
|
+
from .collect_1q_runs import Collect1qRuns
|
34
|
+
from .collect_2q_blocks import Collect2qBlocks
|
35
|
+
|
36
|
+
|
37
|
+
class ConsolidateBlocks(TransformationPass):
|
38
|
+
"""Replace each block of consecutive gates by a single Unitary node.
|
39
|
+
|
40
|
+
Pass to consolidate sequences of uninterrupted gates acting on
|
41
|
+
the same qubits into a Unitary node, to be resynthesized later,
|
42
|
+
to a potentially more optimal subcircuit.
|
43
|
+
|
44
|
+
Notes:
|
45
|
+
This pass assumes that the 'blocks_list' property that it reads is
|
46
|
+
given such that blocks are in topological order. The blocks are
|
47
|
+
collected by a previous pass, such as `Collect2qBlocks`.
|
48
|
+
"""
|
49
|
+
|
50
|
+
def __init__(
|
51
|
+
self,
|
52
|
+
kak_basis_gate=None,
|
53
|
+
force_consolidate=False,
|
54
|
+
basis_gates=None,
|
55
|
+
approximation_degree=1.0,
|
56
|
+
target=None,
|
57
|
+
):
|
58
|
+
"""ConsolidateBlocks initializer.
|
59
|
+
|
60
|
+
If ``kak_basis_gate`` is not ``None`` it will be used as the basis gate for KAK decomposition.
|
61
|
+
Otherwise, if ``basis_gates`` is not ``None`` a basis gate will be chosen from this list.
|
62
|
+
Otherwise, the basis gate will be :class:`.CXGate`.
|
63
|
+
|
64
|
+
Args:
|
65
|
+
kak_basis_gate (Gate): Basis gate for KAK decomposition.
|
66
|
+
force_consolidate (bool): Force block consolidation.
|
67
|
+
basis_gates (List(str)): Basis gates from which to choose a KAK gate.
|
68
|
+
approximation_degree (float): a float between :math:`[0.0, 1.0]`. Lower approximates more.
|
69
|
+
target (Target): The target object for the compilation target backend.
|
70
|
+
"""
|
71
|
+
super().__init__()
|
72
|
+
self.basis_gates = None
|
73
|
+
self.target = target
|
74
|
+
if basis_gates is not None:
|
75
|
+
self.basis_gates = set(basis_gates)
|
76
|
+
self.force_consolidate = force_consolidate
|
77
|
+
|
78
|
+
if kak_basis_gate is not None:
|
79
|
+
self.decomposer = TwoQubitBasisDecomposer(kak_basis_gate)
|
80
|
+
elif basis_gates is not None:
|
81
|
+
self.decomposer = unitary_synthesis._decomposer_2q_from_basis_gates(
|
82
|
+
basis_gates, approximation_degree=approximation_degree
|
83
|
+
)
|
84
|
+
else:
|
85
|
+
self.decomposer = TwoQubitBasisDecomposer(CXGate())
|
86
|
+
|
87
|
+
def run(self, dag):
|
88
|
+
"""Run the ConsolidateBlocks pass on `dag`.
|
89
|
+
|
90
|
+
Iterate over each block and replace it with an equivalent Unitary
|
91
|
+
on the same wires.
|
92
|
+
"""
|
93
|
+
if self.decomposer is None:
|
94
|
+
return dag
|
95
|
+
|
96
|
+
blocks = self.property_set["block_list"] or []
|
97
|
+
basis_gate_name = self.decomposer.gate.name
|
98
|
+
all_block_gates = set()
|
99
|
+
for block in blocks:
|
100
|
+
if len(block) == 1 and self._check_not_in_basis(dag, block[0].name, block[0].qargs):
|
101
|
+
all_block_gates.add(block[0])
|
102
|
+
dag.substitute_node(block[0], UnitaryGate(block[0].op.to_matrix()))
|
103
|
+
else:
|
104
|
+
basis_count = 0
|
105
|
+
outside_basis = False
|
106
|
+
block_qargs = set()
|
107
|
+
block_cargs = set()
|
108
|
+
for nd in block:
|
109
|
+
block_qargs |= set(nd.qargs)
|
110
|
+
if isinstance(nd, DAGOpNode) and getattr(nd, "condition", None):
|
111
|
+
block_cargs |= set(getattr(nd, "condition", None)[0])
|
112
|
+
all_block_gates.add(nd)
|
113
|
+
block_index_map = self._block_qargs_to_indices(dag, block_qargs)
|
114
|
+
for nd in block:
|
115
|
+
if nd.name == basis_gate_name:
|
116
|
+
basis_count += 1
|
117
|
+
if self._check_not_in_basis(dag, nd.name, nd.qargs):
|
118
|
+
outside_basis = True
|
119
|
+
if len(block_qargs) > 2:
|
120
|
+
q = QuantumRegister(len(block_qargs))
|
121
|
+
qc = QuantumCircuit(q)
|
122
|
+
if block_cargs:
|
123
|
+
c = ClassicalRegister(len(block_cargs))
|
124
|
+
qc.add_register(c)
|
125
|
+
for nd in block:
|
126
|
+
qc.append(nd.op, [q[block_index_map[i]] for i in nd.qargs])
|
127
|
+
unitary = UnitaryGate(Operator(qc), check_input=False)
|
128
|
+
else:
|
129
|
+
try:
|
130
|
+
matrix = blocks_to_matrix(block, block_index_map)
|
131
|
+
except QiskitError:
|
132
|
+
# If building a matrix for the block fails we should not consolidate it
|
133
|
+
# because there is nothing we can do with it.
|
134
|
+
continue
|
135
|
+
unitary = UnitaryGate(matrix, check_input=False)
|
136
|
+
|
137
|
+
max_2q_depth = 20 # If depth > 20, there will be 1q gates to consolidate.
|
138
|
+
if ( # pylint: disable=too-many-boolean-expressions
|
139
|
+
self.force_consolidate
|
140
|
+
or unitary.num_qubits > 2
|
141
|
+
or self.decomposer.num_basis_gates(matrix) < basis_count
|
142
|
+
or len(block) > max_2q_depth
|
143
|
+
or ((self.basis_gates is not None) and outside_basis)
|
144
|
+
or ((self.target is not None) and outside_basis)
|
145
|
+
):
|
146
|
+
identity = np.eye(2**unitary.num_qubits)
|
147
|
+
if np.allclose(identity, unitary.to_matrix()):
|
148
|
+
for node in block:
|
149
|
+
dag.remove_op_node(node)
|
150
|
+
else:
|
151
|
+
dag.replace_block_with_op(
|
152
|
+
block, unitary, block_index_map, cycle_check=False
|
153
|
+
)
|
154
|
+
# If 1q runs are collected before consolidate those too
|
155
|
+
runs = self.property_set["run_list"] or []
|
156
|
+
identity_1q = np.eye(2)
|
157
|
+
for run in runs:
|
158
|
+
if any(gate in all_block_gates for gate in run):
|
159
|
+
continue
|
160
|
+
if len(run) == 1 and not self._check_not_in_basis(dag, run[0].name, run[0].qargs):
|
161
|
+
dag.substitute_node(run[0], UnitaryGate(run[0].op.to_matrix(), check_input=False))
|
162
|
+
else:
|
163
|
+
qubit = run[0].qargs[0]
|
164
|
+
operator = run[0].op.to_matrix()
|
165
|
+
already_in_block = False
|
166
|
+
for gate in run[1:]:
|
167
|
+
if gate in all_block_gates:
|
168
|
+
already_in_block = True
|
169
|
+
operator = gate.op.to_matrix().dot(operator)
|
170
|
+
if already_in_block:
|
171
|
+
continue
|
172
|
+
unitary = UnitaryGate(operator, check_input=False)
|
173
|
+
if np.allclose(identity_1q, unitary.to_matrix()):
|
174
|
+
for node in run:
|
175
|
+
dag.remove_op_node(node)
|
176
|
+
else:
|
177
|
+
dag.replace_block_with_op(run, unitary, {qubit: 0}, cycle_check=False)
|
178
|
+
|
179
|
+
dag = self._handle_control_flow_ops(dag)
|
180
|
+
|
181
|
+
# Clear collected blocks and runs as they are no longer valid after consolidation
|
182
|
+
if "run_list" in self.property_set:
|
183
|
+
del self.property_set["run_list"]
|
184
|
+
if "block_list" in self.property_set:
|
185
|
+
del self.property_set["block_list"]
|
186
|
+
|
187
|
+
return dag
|
188
|
+
|
189
|
+
def _handle_control_flow_ops(self, dag):
|
190
|
+
"""
|
191
|
+
This is similar to transpiler/passes/utils/control_flow.py except that the
|
192
|
+
collect blocks is redone for the control flow blocks.
|
193
|
+
"""
|
194
|
+
|
195
|
+
pass_manager = PassManager()
|
196
|
+
if "run_list" in self.property_set:
|
197
|
+
pass_manager.append(Collect1qRuns())
|
198
|
+
if "block_list" in self.property_set:
|
199
|
+
pass_manager.append(Collect2qBlocks())
|
200
|
+
|
201
|
+
pass_manager.append(self)
|
202
|
+
for node in dag.op_nodes():
|
203
|
+
if node.name not in CONTROL_FLOW_OP_NAMES:
|
204
|
+
continue
|
205
|
+
dag.substitute_node(
|
206
|
+
node,
|
207
|
+
node.op.replace_blocks(pass_manager.run(block) for block in node.op.blocks),
|
208
|
+
propagate_condition=False,
|
209
|
+
)
|
210
|
+
return dag
|
211
|
+
|
212
|
+
def _check_not_in_basis(self, dag, gate_name, qargs):
|
213
|
+
if self.target is not None:
|
214
|
+
return not self.target.instruction_supported(
|
215
|
+
gate_name, tuple(dag.find_bit(qubit).index for qubit in qargs)
|
216
|
+
)
|
217
|
+
else:
|
218
|
+
return self.basis_gates and gate_name not in self.basis_gates
|
219
|
+
|
220
|
+
def _block_qargs_to_indices(self, dag, block_qargs):
|
221
|
+
"""Map each qubit in block_qargs to its wire position among the block's wires.
|
222
|
+
Args:
|
223
|
+
block_qargs (list): list of qubits that a block acts on
|
224
|
+
global_index_map (dict): mapping from each qubit in the
|
225
|
+
circuit to its wire position within that circuit
|
226
|
+
Returns:
|
227
|
+
dict: mapping from qarg to position in block
|
228
|
+
"""
|
229
|
+
block_indices = [dag.find_bit(q).index for q in block_qargs]
|
230
|
+
ordered_block_indices = {bit: index for index, bit in enumerate(sorted(block_indices))}
|
231
|
+
block_positions = {q: ordered_block_indices[dag.find_bit(q).index] for q in block_qargs}
|
232
|
+
return block_positions
|
@@ -0,0 +1,65 @@
|
|
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
|
+
"""Cancel back-to-back ``cx`` gates in dag."""
|
14
|
+
|
15
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
16
|
+
from qiskit.transpiler.passes.utils import control_flow
|
17
|
+
from qiskit.utils.deprecation import deprecate_func
|
18
|
+
|
19
|
+
|
20
|
+
class CXCancellation(TransformationPass):
|
21
|
+
"""Cancel back-to-back ``cx`` gates in dag."""
|
22
|
+
|
23
|
+
@deprecate_func(
|
24
|
+
additional_msg=(
|
25
|
+
"Instead, use :class:`~.InverseCancellation`, which is a more generic pass."
|
26
|
+
),
|
27
|
+
since="1.1.0",
|
28
|
+
)
|
29
|
+
def __init__(self, *args, **kwargs):
|
30
|
+
super().__init__(*args, **kwargs)
|
31
|
+
|
32
|
+
@control_flow.trivial_recurse
|
33
|
+
def run(self, dag):
|
34
|
+
"""Run the CXCancellation pass on `dag`.
|
35
|
+
|
36
|
+
Args:
|
37
|
+
dag (DAGCircuit): the directed acyclic graph to run on.
|
38
|
+
|
39
|
+
Returns:
|
40
|
+
DAGCircuit: Transformed DAG.
|
41
|
+
"""
|
42
|
+
cx_runs = dag.collect_runs(["cx"])
|
43
|
+
for cx_run in cx_runs:
|
44
|
+
# Although one `cx_run` will always have the same set of qubits,
|
45
|
+
# the order of these qubits matters (CXi_j != CXj_i).
|
46
|
+
# Therefore, we have to partition each run into chunks where the qargs
|
47
|
+
# are in the same order, and only cancel out CXs within each chunk.
|
48
|
+
partitions = []
|
49
|
+
chunk = []
|
50
|
+
for i in range(len(cx_run) - 1):
|
51
|
+
chunk.append(cx_run[i])
|
52
|
+
if cx_run[i].qargs != cx_run[i + 1].qargs:
|
53
|
+
partitions.append(chunk)
|
54
|
+
chunk = []
|
55
|
+
chunk.append(cx_run[-1])
|
56
|
+
partitions.append(chunk)
|
57
|
+
|
58
|
+
# Remove an even number of CX gates from each chunk
|
59
|
+
for chunk in partitions:
|
60
|
+
if len(chunk) % 2 == 0:
|
61
|
+
dag.remove_op_node(chunk[0])
|
62
|
+
for node in chunk[1:]:
|
63
|
+
dag.remove_op_node(node)
|
64
|
+
|
65
|
+
return dag
|
@@ -0,0 +1,160 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2021.
|
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
|
+
"""Weyl decomposition of two-qubit gates in terms of echoed cross-resonance gates."""
|
14
|
+
|
15
|
+
from typing import Tuple
|
16
|
+
|
17
|
+
from qiskit.circuit import QuantumRegister
|
18
|
+
from qiskit.circuit.library.standard_gates import RZXGate, HGate, XGate
|
19
|
+
|
20
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
21
|
+
from qiskit.transpiler.exceptions import TranspilerError
|
22
|
+
from qiskit.transpiler.layout import Layout
|
23
|
+
from qiskit.transpiler.passes.calibration.rzx_builder import _check_calibration_type, CRCalType
|
24
|
+
|
25
|
+
from qiskit.dagcircuit import DAGCircuit
|
26
|
+
from qiskit.converters import circuit_to_dag
|
27
|
+
|
28
|
+
|
29
|
+
class EchoRZXWeylDecomposition(TransformationPass):
|
30
|
+
"""Rewrite two-qubit gates using the Weyl decomposition.
|
31
|
+
|
32
|
+
This transpiler pass rewrites two-qubit gates in terms of echoed cross-resonance gates according
|
33
|
+
to the Weyl decomposition. A two-qubit gate will be replaced with at most six non-echoed RZXGates.
|
34
|
+
Each pair of RZXGates forms an echoed RZXGate.
|
35
|
+
"""
|
36
|
+
|
37
|
+
def __init__(self, instruction_schedule_map=None, target=None):
|
38
|
+
"""EchoRZXWeylDecomposition pass.
|
39
|
+
|
40
|
+
Args:
|
41
|
+
instruction_schedule_map (InstructionScheduleMap): the mapping from circuit
|
42
|
+
:class:`~.circuit.Instruction` names and arguments to :class:`.Schedule`\\ s.
|
43
|
+
target (Target): The :class:`~.Target` representing the target backend, if both
|
44
|
+
``instruction_schedule_map`` and ``target`` are specified then this argument will take
|
45
|
+
precedence and ``instruction_schedule_map`` will be ignored.
|
46
|
+
"""
|
47
|
+
super().__init__()
|
48
|
+
self._inst_map = instruction_schedule_map
|
49
|
+
if target is not None:
|
50
|
+
self._inst_map = target.instruction_schedule_map()
|
51
|
+
|
52
|
+
def _is_native(self, qubit_pair: Tuple) -> bool:
|
53
|
+
"""Return the direction of the qubit pair that is native."""
|
54
|
+
cal_type, _, _ = _check_calibration_type(self._inst_map, qubit_pair)
|
55
|
+
return cal_type in [
|
56
|
+
CRCalType.ECR_CX_FORWARD,
|
57
|
+
CRCalType.ECR_FORWARD,
|
58
|
+
CRCalType.DIRECT_CX_FORWARD,
|
59
|
+
]
|
60
|
+
|
61
|
+
@staticmethod
|
62
|
+
def _echo_rzx_dag(theta):
|
63
|
+
"""Return the following circuit
|
64
|
+
|
65
|
+
.. parsed-literal::
|
66
|
+
|
67
|
+
┌───────────────┐┌───┐┌────────────────┐┌───┐
|
68
|
+
q_0: ┤0 ├┤ X ├┤0 ├┤ X ├
|
69
|
+
│ Rzx(theta/2) │└───┘│ Rzx(-theta/2) │└───┘
|
70
|
+
q_1: ┤1 ├─────┤1 ├─────
|
71
|
+
└───────────────┘ └────────────────┘
|
72
|
+
"""
|
73
|
+
rzx_dag = DAGCircuit()
|
74
|
+
qr = QuantumRegister(2)
|
75
|
+
rzx_dag.add_qreg(qr)
|
76
|
+
rzx_dag.apply_operation_back(RZXGate(theta / 2), [qr[0], qr[1]], [])
|
77
|
+
rzx_dag.apply_operation_back(XGate(), [qr[0]], [])
|
78
|
+
rzx_dag.apply_operation_back(RZXGate(-theta / 2), [qr[0], qr[1]], [])
|
79
|
+
rzx_dag.apply_operation_back(XGate(), [qr[0]], [])
|
80
|
+
return rzx_dag
|
81
|
+
|
82
|
+
@staticmethod
|
83
|
+
def _reverse_echo_rzx_dag(theta):
|
84
|
+
"""Return the following circuit
|
85
|
+
|
86
|
+
.. parsed-literal::
|
87
|
+
|
88
|
+
┌───┐┌───────────────┐ ┌────────────────┐┌───┐
|
89
|
+
q_0: ┤ H ├┤1 ├─────┤1 ├┤ H ├─────
|
90
|
+
├───┤│ Rzx(theta/2) │┌───┐│ Rzx(-theta/2) │├───┤┌───┐
|
91
|
+
q_1: ┤ H ├┤0 ├┤ X ├┤0 ├┤ X ├┤ H ├
|
92
|
+
└───┘└───────────────┘└───┘└────────────────┘└───┘└───┘
|
93
|
+
"""
|
94
|
+
reverse_rzx_dag = DAGCircuit()
|
95
|
+
qr = QuantumRegister(2)
|
96
|
+
reverse_rzx_dag.add_qreg(qr)
|
97
|
+
reverse_rzx_dag.apply_operation_back(HGate(), [qr[0]], [])
|
98
|
+
reverse_rzx_dag.apply_operation_back(HGate(), [qr[1]], [])
|
99
|
+
reverse_rzx_dag.apply_operation_back(RZXGate(theta / 2), [qr[1], qr[0]], [])
|
100
|
+
reverse_rzx_dag.apply_operation_back(XGate(), [qr[1]], [])
|
101
|
+
reverse_rzx_dag.apply_operation_back(RZXGate(-theta / 2), [qr[1], qr[0]], [])
|
102
|
+
reverse_rzx_dag.apply_operation_back(XGate(), [qr[1]], [])
|
103
|
+
reverse_rzx_dag.apply_operation_back(HGate(), [qr[0]], [])
|
104
|
+
reverse_rzx_dag.apply_operation_back(HGate(), [qr[1]], [])
|
105
|
+
return reverse_rzx_dag
|
106
|
+
|
107
|
+
def run(self, dag: DAGCircuit):
|
108
|
+
"""Run the EchoRZXWeylDecomposition pass on `dag`.
|
109
|
+
|
110
|
+
Rewrites two-qubit gates in an arbitrary circuit in terms of echoed cross-resonance
|
111
|
+
gates by computing the Weyl decomposition of the corresponding unitary. Modifies the
|
112
|
+
input dag.
|
113
|
+
|
114
|
+
Args:
|
115
|
+
dag (DAGCircuit): DAG to rewrite.
|
116
|
+
|
117
|
+
Returns:
|
118
|
+
DAGCircuit: The modified dag.
|
119
|
+
|
120
|
+
Raises:
|
121
|
+
TranspilerError: If the circuit cannot be rewritten.
|
122
|
+
"""
|
123
|
+
|
124
|
+
# pylint: disable=cyclic-import
|
125
|
+
from qiskit.quantum_info import Operator
|
126
|
+
from qiskit.synthesis.two_qubit.two_qubit_decompose import TwoQubitControlledUDecomposer
|
127
|
+
|
128
|
+
if len(dag.qregs) > 1:
|
129
|
+
raise TranspilerError(
|
130
|
+
"EchoRZXWeylDecomposition expects a single qreg input DAG,"
|
131
|
+
f"but input DAG had qregs: {dag.qregs}."
|
132
|
+
)
|
133
|
+
|
134
|
+
trivial_layout = Layout.generate_trivial_layout(*dag.qregs.values())
|
135
|
+
|
136
|
+
decomposer = TwoQubitControlledUDecomposer(RZXGate)
|
137
|
+
|
138
|
+
for node in dag.two_qubit_ops():
|
139
|
+
|
140
|
+
unitary = Operator(node.op).data
|
141
|
+
dag_weyl = circuit_to_dag(decomposer(unitary))
|
142
|
+
dag.substitute_node_with_dag(node, dag_weyl)
|
143
|
+
|
144
|
+
for node in dag.two_qubit_ops():
|
145
|
+
if node.name == "rzx":
|
146
|
+
control = node.qargs[0]
|
147
|
+
target = node.qargs[1]
|
148
|
+
|
149
|
+
physical_q0 = trivial_layout[control]
|
150
|
+
physical_q1 = trivial_layout[target]
|
151
|
+
|
152
|
+
is_native = self._is_native((physical_q0, physical_q1))
|
153
|
+
|
154
|
+
theta = node.op.params[0]
|
155
|
+
if is_native:
|
156
|
+
dag.substitute_node_with_dag(node, self._echo_rzx_dag(theta))
|
157
|
+
else:
|
158
|
+
dag.substitute_node_with_dag(node, self._reverse_echo_rzx_dag(theta))
|
159
|
+
|
160
|
+
return dag
|
@@ -0,0 +1,114 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2023
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
|
14
|
+
"""Remove any swap gates in the circuit by pushing it through into a qubit permutation."""
|
15
|
+
|
16
|
+
import logging
|
17
|
+
|
18
|
+
from qiskit.circuit.library.standard_gates import SwapGate
|
19
|
+
from qiskit.circuit.library.generalized_gates import PermutationGate
|
20
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
21
|
+
from qiskit.transpiler.layout import Layout
|
22
|
+
|
23
|
+
logger = logging.getLogger(__name__)
|
24
|
+
|
25
|
+
|
26
|
+
class ElidePermutations(TransformationPass):
|
27
|
+
r"""Remove permutation operations from a pre-layout circuit
|
28
|
+
|
29
|
+
This pass is intended to be run before a layout (mapping virtual qubits
|
30
|
+
to physical qubits) is set during the transpilation pipeline. This
|
31
|
+
pass iterates over the :class:`~.DAGCircuit` and when a :class:`~.SwapGate`
|
32
|
+
or :class:`~.PermutationGate` are encountered it permutes the virtual qubits in
|
33
|
+
the circuit and removes the swap gate. This will effectively remove any
|
34
|
+
:class:`~SwapGate`\s or :class:`~PermutationGate` in the circuit prior to running
|
35
|
+
layout. If this pass is run after a layout has been set it will become a no-op
|
36
|
+
(and log a warning) as this optimization is not sound after physical qubits are
|
37
|
+
selected and there are connectivity constraints to adhere to.
|
38
|
+
|
39
|
+
For tracking purposes this pass sets 3 values in the property set if there
|
40
|
+
are any :class:`~.SwapGate` or :class:`~.PermutationGate` objects in the circuit
|
41
|
+
and the pass isn't a no-op.
|
42
|
+
|
43
|
+
* ``original_layout``: The trivial :class:`~.Layout` for the input to this pass being run
|
44
|
+
* ``original_qubit_indices``: The mapping of qubit objects to positional indices for the state
|
45
|
+
of the circuit as input to this pass.
|
46
|
+
* ``virtual_permutation_layout``: A :class:`~.Layout` object mapping input qubits to the output
|
47
|
+
state after eliding permutations.
|
48
|
+
|
49
|
+
These three properties are needed for the transpiler to track the permutations in the out
|
50
|
+
:attr:`.QuantumCircuit.layout` attribute. The elision of permutations is equivalent to a
|
51
|
+
``final_layout`` set by routing and all three of these attributes are needed in the case
|
52
|
+
"""
|
53
|
+
|
54
|
+
def run(self, dag):
|
55
|
+
"""Run the ElidePermutations pass on ``dag``.
|
56
|
+
|
57
|
+
Args:
|
58
|
+
dag (DAGCircuit): the DAG to be optimized.
|
59
|
+
|
60
|
+
Returns:
|
61
|
+
DAGCircuit: the optimized DAG.
|
62
|
+
"""
|
63
|
+
if self.property_set["layout"] is not None:
|
64
|
+
logger.warning(
|
65
|
+
"ElidePermutations is not valid after a layout has been set. This indicates "
|
66
|
+
"an invalid pass manager construction."
|
67
|
+
)
|
68
|
+
return dag
|
69
|
+
|
70
|
+
op_count = dag.count_ops(recurse=False)
|
71
|
+
if op_count.get("swap", 0) == 0 and op_count.get("permutation", 0) == 0:
|
72
|
+
return dag
|
73
|
+
|
74
|
+
new_dag = dag.copy_empty_like()
|
75
|
+
qubit_mapping = list(range(len(dag.qubits)))
|
76
|
+
|
77
|
+
def _apply_mapping(qargs):
|
78
|
+
return tuple(dag.qubits[qubit_mapping[dag.find_bit(qubit).index]] for qubit in qargs)
|
79
|
+
|
80
|
+
for node in dag.topological_op_nodes():
|
81
|
+
if not isinstance(node.op, (SwapGate, PermutationGate)):
|
82
|
+
new_dag.apply_operation_back(
|
83
|
+
node.op, _apply_mapping(node.qargs), node.cargs, check=False
|
84
|
+
)
|
85
|
+
elif getattr(node.op, "condition", None) is not None:
|
86
|
+
new_dag.apply_operation_back(
|
87
|
+
node.op, _apply_mapping(node.qargs), node.cargs, check=False
|
88
|
+
)
|
89
|
+
elif isinstance(node.op, SwapGate):
|
90
|
+
index_0 = dag.find_bit(node.qargs[0]).index
|
91
|
+
index_1 = dag.find_bit(node.qargs[1]).index
|
92
|
+
qubit_mapping[index_1], qubit_mapping[index_0] = (
|
93
|
+
qubit_mapping[index_0],
|
94
|
+
qubit_mapping[index_1],
|
95
|
+
)
|
96
|
+
elif isinstance(node.op, PermutationGate):
|
97
|
+
starting_indices = [qubit_mapping[dag.find_bit(qarg).index] for qarg in node.qargs]
|
98
|
+
pattern = node.op.params[0]
|
99
|
+
pattern_indices = [qubit_mapping[idx] for idx in pattern]
|
100
|
+
for i, j in zip(starting_indices, pattern_indices):
|
101
|
+
qubit_mapping[i] = j
|
102
|
+
input_qubit_mapping = {qubit: index for index, qubit in enumerate(dag.qubits)}
|
103
|
+
self.property_set["original_layout"] = Layout(input_qubit_mapping)
|
104
|
+
if self.property_set["original_qubit_indices"] is None:
|
105
|
+
self.property_set["original_qubit_indices"] = input_qubit_mapping
|
106
|
+
|
107
|
+
new_layout = Layout({dag.qubits[out]: idx for idx, out in enumerate(qubit_mapping)})
|
108
|
+
if current_layout := self.property_set["virtual_permutation_layout"]:
|
109
|
+
self.property_set["virtual_permutation_layout"] = new_layout.compose(
|
110
|
+
current_layout.inverse(dag.qubits, dag.qubits), dag.qubits
|
111
|
+
)
|
112
|
+
else:
|
113
|
+
self.property_set["virtual_permutation_layout"] = new_layout
|
114
|
+
return new_dag
|