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,295 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2020.
|
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
|
+
"""Gate equivalence library."""
|
14
|
+
|
15
|
+
import copy
|
16
|
+
from collections import namedtuple
|
17
|
+
|
18
|
+
from rustworkx.visualization import graphviz_draw
|
19
|
+
import rustworkx as rx
|
20
|
+
|
21
|
+
from qiskit.exceptions import InvalidFileError
|
22
|
+
from .exceptions import CircuitError
|
23
|
+
from .parameter import Parameter
|
24
|
+
from .parameterexpression import ParameterExpression
|
25
|
+
|
26
|
+
Key = namedtuple("Key", ["name", "num_qubits"])
|
27
|
+
Equivalence = namedtuple("Equivalence", ["params", "circuit"]) # Ordered to match Gate.params
|
28
|
+
NodeData = namedtuple("NodeData", ["key", "equivs"])
|
29
|
+
EdgeData = namedtuple("EdgeData", ["index", "num_gates", "rule", "source"])
|
30
|
+
|
31
|
+
|
32
|
+
class EquivalenceLibrary:
|
33
|
+
"""A library providing a one-way mapping of Gates to their equivalent
|
34
|
+
implementations as QuantumCircuits."""
|
35
|
+
|
36
|
+
def __init__(self, *, base=None):
|
37
|
+
"""Create a new equivalence library.
|
38
|
+
|
39
|
+
Args:
|
40
|
+
base (Optional[EquivalenceLibrary]): Base equivalence library to
|
41
|
+
be referenced if an entry is not found in this library.
|
42
|
+
"""
|
43
|
+
self._base = base
|
44
|
+
|
45
|
+
if base is None:
|
46
|
+
self._graph = rx.PyDiGraph()
|
47
|
+
self._key_to_node_index = {}
|
48
|
+
# Some unique identifier for rules.
|
49
|
+
self._rule_id = 0
|
50
|
+
else:
|
51
|
+
self._graph = base._graph.copy()
|
52
|
+
self._key_to_node_index = copy.deepcopy(base._key_to_node_index)
|
53
|
+
self._rule_id = base._rule_id
|
54
|
+
|
55
|
+
@property
|
56
|
+
def graph(self) -> rx.PyDiGraph:
|
57
|
+
"""Return graph representing the equivalence library data.
|
58
|
+
|
59
|
+
This property should be treated as read-only as it provides
|
60
|
+
a reference to the internal state of the :class:`~.EquivalenceLibrary` object.
|
61
|
+
If the graph returned by this property is mutated it could corrupt the
|
62
|
+
the contents of the object. If you need to modify the output ``PyDiGraph``
|
63
|
+
be sure to make a copy prior to any modification.
|
64
|
+
|
65
|
+
Returns:
|
66
|
+
PyDiGraph: A graph object with equivalence data in each node.
|
67
|
+
"""
|
68
|
+
return self._graph
|
69
|
+
|
70
|
+
def _set_default_node(self, key):
|
71
|
+
"""Create a new node if key not found"""
|
72
|
+
if key not in self._key_to_node_index:
|
73
|
+
self._key_to_node_index[key] = self._graph.add_node(NodeData(key=key, equivs=[]))
|
74
|
+
return self._key_to_node_index[key]
|
75
|
+
|
76
|
+
def add_equivalence(self, gate, equivalent_circuit):
|
77
|
+
"""Add a new equivalence to the library. Future queries for the Gate
|
78
|
+
will include the given circuit, in addition to all existing equivalences
|
79
|
+
(including those from base).
|
80
|
+
|
81
|
+
Parameterized Gates (those including `qiskit.circuit.Parameters` in their
|
82
|
+
`Gate.params`) can be marked equivalent to parameterized circuits,
|
83
|
+
provided the parameters match.
|
84
|
+
|
85
|
+
Args:
|
86
|
+
gate (Gate): A Gate instance.
|
87
|
+
equivalent_circuit (QuantumCircuit): A circuit equivalently
|
88
|
+
implementing the given Gate.
|
89
|
+
"""
|
90
|
+
|
91
|
+
_raise_if_shape_mismatch(gate, equivalent_circuit)
|
92
|
+
_raise_if_param_mismatch(gate.params, equivalent_circuit.parameters)
|
93
|
+
|
94
|
+
key = Key(name=gate.name, num_qubits=gate.num_qubits)
|
95
|
+
equiv = Equivalence(params=gate.params.copy(), circuit=equivalent_circuit.copy())
|
96
|
+
|
97
|
+
target = self._set_default_node(key)
|
98
|
+
self._graph[target].equivs.append(equiv)
|
99
|
+
|
100
|
+
sources = {
|
101
|
+
Key(name=instruction.operation.name, num_qubits=len(instruction.qubits))
|
102
|
+
for instruction in equivalent_circuit
|
103
|
+
}
|
104
|
+
edges = [
|
105
|
+
(
|
106
|
+
self._set_default_node(source),
|
107
|
+
target,
|
108
|
+
EdgeData(index=self._rule_id, num_gates=len(sources), rule=equiv, source=source),
|
109
|
+
)
|
110
|
+
for source in sources
|
111
|
+
]
|
112
|
+
self._graph.add_edges_from(edges)
|
113
|
+
self._rule_id += 1
|
114
|
+
|
115
|
+
def has_entry(self, gate):
|
116
|
+
"""Check if a library contains any decompositions for gate.
|
117
|
+
|
118
|
+
Args:
|
119
|
+
gate (Gate): A Gate instance.
|
120
|
+
|
121
|
+
Returns:
|
122
|
+
Bool: True if gate has a known decomposition in the library.
|
123
|
+
False otherwise.
|
124
|
+
"""
|
125
|
+
key = Key(name=gate.name, num_qubits=gate.num_qubits)
|
126
|
+
|
127
|
+
return key in self._key_to_node_index
|
128
|
+
|
129
|
+
def set_entry(self, gate, entry):
|
130
|
+
"""Set the equivalence record for a Gate. Future queries for the Gate
|
131
|
+
will return only the circuits provided.
|
132
|
+
|
133
|
+
Parameterized Gates (those including `qiskit.circuit.Parameters` in their
|
134
|
+
`Gate.params`) can be marked equivalent to parameterized circuits,
|
135
|
+
provided the parameters match.
|
136
|
+
|
137
|
+
Args:
|
138
|
+
gate (Gate): A Gate instance.
|
139
|
+
entry (List['QuantumCircuit']) : A list of QuantumCircuits, each
|
140
|
+
equivalently implementing the given Gate.
|
141
|
+
"""
|
142
|
+
for equiv in entry:
|
143
|
+
_raise_if_shape_mismatch(gate, equiv)
|
144
|
+
_raise_if_param_mismatch(gate.params, equiv.parameters)
|
145
|
+
|
146
|
+
node_index = self._set_default_node(Key(name=gate.name, num_qubits=gate.num_qubits))
|
147
|
+
# Remove previous equivalences of this node, leaving in place any later equivalences that
|
148
|
+
# were added that use `gate`.
|
149
|
+
self._graph[node_index].equivs.clear()
|
150
|
+
for parent, child, _ in self._graph.in_edges(node_index):
|
151
|
+
# `child` should always be ourselves, but there might be parallel edges.
|
152
|
+
self._graph.remove_edge(parent, child)
|
153
|
+
for equivalence in entry:
|
154
|
+
self.add_equivalence(gate, equivalence)
|
155
|
+
|
156
|
+
def get_entry(self, gate):
|
157
|
+
"""Gets the set of QuantumCircuits circuits from the library which
|
158
|
+
equivalently implement the given Gate.
|
159
|
+
|
160
|
+
Parameterized circuits will have their parameters replaced with the
|
161
|
+
corresponding entries from Gate.params.
|
162
|
+
|
163
|
+
Args:
|
164
|
+
gate (Gate) - Gate: A Gate instance.
|
165
|
+
|
166
|
+
Returns:
|
167
|
+
List[QuantumCircuit]: A list of equivalent QuantumCircuits. If empty,
|
168
|
+
library contains no known decompositions of Gate.
|
169
|
+
|
170
|
+
Returned circuits will be ordered according to their insertion in
|
171
|
+
the library, from earliest to latest, from top to base. The
|
172
|
+
ordering of the StandardEquivalenceLibrary will not generally be
|
173
|
+
consistent across Qiskit versions.
|
174
|
+
"""
|
175
|
+
key = Key(name=gate.name, num_qubits=gate.num_qubits)
|
176
|
+
query_params = gate.params
|
177
|
+
|
178
|
+
return [_rebind_equiv(equiv, query_params) for equiv in self._get_equivalences(key)]
|
179
|
+
|
180
|
+
def keys(self):
|
181
|
+
"""Return list of keys to key to node index map.
|
182
|
+
|
183
|
+
Returns:
|
184
|
+
List: Keys to the key to node index map.
|
185
|
+
"""
|
186
|
+
return self._key_to_node_index.keys()
|
187
|
+
|
188
|
+
def node_index(self, key):
|
189
|
+
"""Return node index for a given key.
|
190
|
+
|
191
|
+
Args:
|
192
|
+
key (Key): Key to an equivalence.
|
193
|
+
|
194
|
+
Returns:
|
195
|
+
Int: Index to the node in the graph for the given key.
|
196
|
+
"""
|
197
|
+
return self._key_to_node_index[key]
|
198
|
+
|
199
|
+
def draw(self, filename=None):
|
200
|
+
"""Draws the equivalence relations available in the library.
|
201
|
+
|
202
|
+
Args:
|
203
|
+
filename (str): An optional path to write the output image to
|
204
|
+
if specified this method will return None.
|
205
|
+
|
206
|
+
Returns:
|
207
|
+
PIL.Image or IPython.display.SVG: Drawn equivalence library as an
|
208
|
+
IPython SVG if in a jupyter notebook, or as a PIL.Image otherwise.
|
209
|
+
|
210
|
+
Raises:
|
211
|
+
InvalidFileError: if filename is not valid.
|
212
|
+
"""
|
213
|
+
image_type = None
|
214
|
+
if filename:
|
215
|
+
if "." not in filename:
|
216
|
+
raise InvalidFileError("Parameter 'filename' must be in format 'name.extension'")
|
217
|
+
image_type = filename.split(".")[-1]
|
218
|
+
return graphviz_draw(
|
219
|
+
self._build_basis_graph(),
|
220
|
+
lambda node: {"label": node["label"]},
|
221
|
+
lambda edge: edge,
|
222
|
+
filename=filename,
|
223
|
+
image_type=image_type,
|
224
|
+
)
|
225
|
+
|
226
|
+
def _build_basis_graph(self):
|
227
|
+
graph = rx.PyDiGraph()
|
228
|
+
|
229
|
+
node_map = {}
|
230
|
+
for key in self._key_to_node_index:
|
231
|
+
name, num_qubits = key
|
232
|
+
equivalences = self._get_equivalences(key)
|
233
|
+
|
234
|
+
basis = frozenset([f"{name}/{num_qubits}"])
|
235
|
+
for params, decomp in equivalences:
|
236
|
+
decomp_basis = frozenset(
|
237
|
+
f"{name}/{num_qubits}"
|
238
|
+
for name, num_qubits in {
|
239
|
+
(instruction.operation.name, instruction.operation.num_qubits)
|
240
|
+
for instruction in decomp.data
|
241
|
+
}
|
242
|
+
)
|
243
|
+
if basis not in node_map:
|
244
|
+
basis_node = graph.add_node({"basis": basis, "label": str(set(basis))})
|
245
|
+
node_map[basis] = basis_node
|
246
|
+
if decomp_basis not in node_map:
|
247
|
+
decomp_basis_node = graph.add_node(
|
248
|
+
{"basis": decomp_basis, "label": str(set(decomp_basis))}
|
249
|
+
)
|
250
|
+
node_map[decomp_basis] = decomp_basis_node
|
251
|
+
|
252
|
+
label = f"{str(params)}\n{str(decomp) if num_qubits <= 5 else '...'}"
|
253
|
+
graph.add_edge(
|
254
|
+
node_map[basis],
|
255
|
+
node_map[decomp_basis],
|
256
|
+
{"label": label, "fontname": "Courier", "fontsize": str(8)},
|
257
|
+
)
|
258
|
+
|
259
|
+
return graph
|
260
|
+
|
261
|
+
def _get_equivalences(self, key):
|
262
|
+
"""Get all the equivalences for the given key"""
|
263
|
+
return (
|
264
|
+
self._graph[self._key_to_node_index[key]].equivs
|
265
|
+
if key in self._key_to_node_index
|
266
|
+
else []
|
267
|
+
)
|
268
|
+
|
269
|
+
|
270
|
+
def _raise_if_param_mismatch(gate_params, circuit_parameters):
|
271
|
+
gate_parameters = [p for p in gate_params if isinstance(p, ParameterExpression)]
|
272
|
+
|
273
|
+
if set(gate_parameters) != circuit_parameters:
|
274
|
+
raise CircuitError(
|
275
|
+
"Cannot add equivalence between circuit and gate "
|
276
|
+
f"of different parameters. Gate params: {gate_parameters}. "
|
277
|
+
f"Circuit params: {circuit_parameters}."
|
278
|
+
)
|
279
|
+
|
280
|
+
|
281
|
+
def _raise_if_shape_mismatch(gate, circuit):
|
282
|
+
if gate.num_qubits != circuit.num_qubits or gate.num_clbits != circuit.num_clbits:
|
283
|
+
raise CircuitError(
|
284
|
+
"Cannot add equivalence between circuit and gate "
|
285
|
+
f"of different shapes. Gate: {gate.num_qubits} qubits and {gate.num_clbits} clbits. "
|
286
|
+
f"Circuit: {circuit.num_qubits} qubits and {circuit.num_clbits} clbits."
|
287
|
+
)
|
288
|
+
|
289
|
+
|
290
|
+
def _rebind_equiv(equiv, query_params):
|
291
|
+
equiv_params, equiv_circuit = equiv
|
292
|
+
param_map = {x: y for x, y in zip(equiv_params, query_params) if isinstance(x, Parameter)}
|
293
|
+
equiv = equiv_circuit.assign_parameters(param_map, inplace=False, flat_input=True)
|
294
|
+
|
295
|
+
return equiv
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2020.
|
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
|
+
"""Session gates."""
|
14
|
+
|
15
|
+
from .library.standard_gates.equivalence_library import StandardEquivalenceLibrary
|
16
|
+
from .equivalence import EquivalenceLibrary
|
17
|
+
|
18
|
+
SessionEquivalenceLibrary = EquivalenceLibrary(base=StandardEquivalenceLibrary)
|
@@ -0,0 +1,19 @@
|
|
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
|
+
"""Exceptions for errors raised while handling Quantum Circuits."""
|
14
|
+
|
15
|
+
from qiskit.exceptions import QiskitError
|
16
|
+
|
17
|
+
|
18
|
+
class CircuitError(QiskitError):
|
19
|
+
"""Base class for errors raised while processing a circuit."""
|
qiskit/circuit/gate.py
ADDED
@@ -0,0 +1,261 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017.
|
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
|
+
"""Unitary gate."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
from typing import Iterator, Iterable
|
17
|
+
import numpy as np
|
18
|
+
|
19
|
+
from qiskit.circuit.parameterexpression import ParameterExpression
|
20
|
+
from qiskit.circuit.exceptions import CircuitError
|
21
|
+
from .annotated_operation import AnnotatedOperation, ControlModifier, PowerModifier
|
22
|
+
from .instruction import Instruction
|
23
|
+
|
24
|
+
|
25
|
+
class Gate(Instruction):
|
26
|
+
"""Unitary gate."""
|
27
|
+
|
28
|
+
def __init__(
|
29
|
+
self,
|
30
|
+
name: str,
|
31
|
+
num_qubits: int,
|
32
|
+
params: list,
|
33
|
+
label: str | None = None,
|
34
|
+
duration=None,
|
35
|
+
unit="dt",
|
36
|
+
) -> None:
|
37
|
+
"""Create a new gate.
|
38
|
+
|
39
|
+
Args:
|
40
|
+
name: The Qobj name of the gate.
|
41
|
+
num_qubits: The number of qubits the gate acts on.
|
42
|
+
params: A list of parameters.
|
43
|
+
label: An optional label for the gate.
|
44
|
+
"""
|
45
|
+
self.definition = None
|
46
|
+
super().__init__(name, num_qubits, 0, params, label=label, duration=duration, unit=unit)
|
47
|
+
|
48
|
+
# Set higher priority than Numpy array and matrix classes
|
49
|
+
__array_priority__ = 20
|
50
|
+
|
51
|
+
def to_matrix(self) -> np.ndarray:
|
52
|
+
"""Return a Numpy.array for the gate unitary matrix.
|
53
|
+
|
54
|
+
Returns:
|
55
|
+
np.ndarray: if the Gate subclass has a matrix definition.
|
56
|
+
|
57
|
+
Raises:
|
58
|
+
CircuitError: If a Gate subclass does not implement this method an
|
59
|
+
exception will be raised when this base class method is called.
|
60
|
+
"""
|
61
|
+
if hasattr(self, "__array__"):
|
62
|
+
return self.__array__(dtype=complex)
|
63
|
+
raise CircuitError(f"to_matrix not defined for this {type(self)}")
|
64
|
+
|
65
|
+
def power(self, exponent: float, annotated: bool = False):
|
66
|
+
"""Raise this gate to the power of ``exponent``.
|
67
|
+
|
68
|
+
Implemented either as a unitary gate (ref. :class:`~.library.UnitaryGate`)
|
69
|
+
or as an annotated operation (ref. :class:`.AnnotatedOperation`). In the case of several standard
|
70
|
+
gates, such as :class:`.RXGate`, when the power of a gate can be expressed in terms of another
|
71
|
+
standard gate that is returned directly.
|
72
|
+
|
73
|
+
Args:
|
74
|
+
exponent (float): the power to raise the gate to
|
75
|
+
annotated (bool): indicates whether the power gate can be implemented
|
76
|
+
as an annotated operation. In the case of several standard
|
77
|
+
gates, such as :class:`.RXGate`, this argument is ignored when
|
78
|
+
the power of a gate can be expressed in terms of another
|
79
|
+
standard gate.
|
80
|
+
|
81
|
+
Returns:
|
82
|
+
An operation implementing ``gate^exponent``
|
83
|
+
|
84
|
+
Raises:
|
85
|
+
CircuitError: If gate is not unitary
|
86
|
+
"""
|
87
|
+
# pylint: disable=cyclic-import
|
88
|
+
from qiskit.quantum_info.operators import Operator
|
89
|
+
from qiskit.circuit.library.generalized_gates.unitary import UnitaryGate
|
90
|
+
|
91
|
+
if not annotated:
|
92
|
+
return UnitaryGate(Operator(self).power(exponent), label=f"{self.name}^{exponent}")
|
93
|
+
else:
|
94
|
+
return AnnotatedOperation(self, PowerModifier(exponent))
|
95
|
+
|
96
|
+
def __pow__(self, exponent: float) -> "Gate":
|
97
|
+
return self.power(exponent)
|
98
|
+
|
99
|
+
def _return_repeat(self, exponent: float) -> "Gate":
|
100
|
+
gate = Gate(name=f"{self.name}*{exponent}", num_qubits=self.num_qubits, params=[])
|
101
|
+
gate.validate_parameter = self.validate_parameter
|
102
|
+
gate.params = self.params
|
103
|
+
return gate
|
104
|
+
|
105
|
+
def control(
|
106
|
+
self,
|
107
|
+
num_ctrl_qubits: int = 1,
|
108
|
+
label: str | None = None,
|
109
|
+
ctrl_state: int | str | None = None,
|
110
|
+
annotated: bool | None = None,
|
111
|
+
):
|
112
|
+
"""Return the controlled version of itself.
|
113
|
+
|
114
|
+
Implemented either as a controlled gate (ref. :class:`.ControlledGate`)
|
115
|
+
or as an annotated operation (ref. :class:`.AnnotatedOperation`).
|
116
|
+
|
117
|
+
Args:
|
118
|
+
num_ctrl_qubits: number of controls to add to gate (default: ``1``)
|
119
|
+
label: optional gate label. Ignored if implemented as an annotated
|
120
|
+
operation.
|
121
|
+
ctrl_state: the control state in decimal or as a bitstring
|
122
|
+
(e.g. ``'111'``). If ``None``, use ``2**num_ctrl_qubits-1``.
|
123
|
+
annotated: indicates whether the controlled gate is implemented
|
124
|
+
as an annotated gate. If ``None``, this is set to ``False``
|
125
|
+
if the controlled gate can directly be constructed, and otherwise
|
126
|
+
set to ``True``. This allows defering the construction process in case the
|
127
|
+
synthesis of the controlled gate requires more information (e.g.
|
128
|
+
values of unbound parameters).
|
129
|
+
|
130
|
+
Returns:
|
131
|
+
Controlled version of the given operation.
|
132
|
+
|
133
|
+
Raises:
|
134
|
+
QiskitError: unrecognized mode or invalid ctrl_state
|
135
|
+
"""
|
136
|
+
if not annotated: # captures both None and False
|
137
|
+
# pylint: disable=cyclic-import
|
138
|
+
from .add_control import add_control
|
139
|
+
|
140
|
+
return add_control(self, num_ctrl_qubits, label, ctrl_state)
|
141
|
+
|
142
|
+
else:
|
143
|
+
return AnnotatedOperation(
|
144
|
+
self, ControlModifier(num_ctrl_qubits=num_ctrl_qubits, ctrl_state=ctrl_state)
|
145
|
+
)
|
146
|
+
|
147
|
+
@staticmethod
|
148
|
+
def _broadcast_single_argument(qarg: list) -> Iterator[tuple[list, list]]:
|
149
|
+
"""Expands a single argument.
|
150
|
+
|
151
|
+
For example: [q[0], q[1]] -> [q[0]], [q[1]]
|
152
|
+
"""
|
153
|
+
# [q[0], q[1]] -> [q[0]]
|
154
|
+
# -> [q[1]]
|
155
|
+
for arg0 in qarg:
|
156
|
+
yield [arg0], []
|
157
|
+
|
158
|
+
@staticmethod
|
159
|
+
def _broadcast_2_arguments(qarg0: list, qarg1: list) -> Iterator[tuple[list, list]]:
|
160
|
+
if len(qarg0) == len(qarg1):
|
161
|
+
# [[q[0], q[1]], [r[0], r[1]]] -> [q[0], r[0]]
|
162
|
+
# -> [q[1], r[1]]
|
163
|
+
for arg0, arg1 in zip(qarg0, qarg1):
|
164
|
+
yield [arg0, arg1], []
|
165
|
+
elif len(qarg0) == 1:
|
166
|
+
# [[q[0]], [r[0], r[1]]] -> [q[0], r[0]]
|
167
|
+
# -> [q[0], r[1]]
|
168
|
+
for arg1 in qarg1:
|
169
|
+
yield [qarg0[0], arg1], []
|
170
|
+
elif len(qarg1) == 1:
|
171
|
+
# [[q[0], q[1]], [r[0]]] -> [q[0], r[0]]
|
172
|
+
# -> [q[1], r[0]]
|
173
|
+
for arg0 in qarg0:
|
174
|
+
yield [arg0, qarg1[0]], []
|
175
|
+
else:
|
176
|
+
raise CircuitError(
|
177
|
+
f"Not sure how to combine these two-qubit arguments:\n {qarg0}\n {qarg1}"
|
178
|
+
)
|
179
|
+
|
180
|
+
@staticmethod
|
181
|
+
def _broadcast_3_or_more_args(qargs: list) -> Iterator[tuple[list, list]]:
|
182
|
+
if all(len(qarg) == len(qargs[0]) for qarg in qargs):
|
183
|
+
for arg in zip(*qargs):
|
184
|
+
yield list(arg), []
|
185
|
+
else:
|
186
|
+
raise CircuitError(f"Not sure how to combine these qubit arguments:\n {qargs}\n")
|
187
|
+
|
188
|
+
def broadcast_arguments(self, qargs: list, cargs: list) -> Iterable[tuple[list, list]]:
|
189
|
+
"""Validation and handling of the arguments and its relationship.
|
190
|
+
|
191
|
+
For example, ``cx([q[0],q[1]], q[2])`` means ``cx(q[0], q[2]); cx(q[1], q[2])``. This
|
192
|
+
method yields the arguments in the right grouping. In the given example::
|
193
|
+
|
194
|
+
in: [[q[0],q[1]], q[2]],[]
|
195
|
+
outs: [q[0], q[2]], []
|
196
|
+
[q[1], q[2]], []
|
197
|
+
|
198
|
+
The general broadcasting rules are:
|
199
|
+
|
200
|
+
* If len(qargs) == 1::
|
201
|
+
|
202
|
+
[q[0], q[1]] -> [q[0]],[q[1]]
|
203
|
+
|
204
|
+
* If len(qargs) == 2::
|
205
|
+
|
206
|
+
[[q[0], q[1]], [r[0], r[1]]] -> [q[0], r[0]], [q[1], r[1]]
|
207
|
+
[[q[0]], [r[0], r[1]]] -> [q[0], r[0]], [q[0], r[1]]
|
208
|
+
[[q[0], q[1]], [r[0]]] -> [q[0], r[0]], [q[1], r[0]]
|
209
|
+
|
210
|
+
* If len(qargs) >= 3::
|
211
|
+
|
212
|
+
[q[0], q[1]], [r[0], r[1]], ...] -> [q[0], r[0], ...], [q[1], r[1], ...]
|
213
|
+
|
214
|
+
Args:
|
215
|
+
qargs: List of quantum bit arguments.
|
216
|
+
cargs: List of classical bit arguments.
|
217
|
+
|
218
|
+
Returns:
|
219
|
+
A tuple with single arguments.
|
220
|
+
|
221
|
+
Raises:
|
222
|
+
CircuitError: If the input is not valid. For example, the number of
|
223
|
+
arguments does not match the gate expectation.
|
224
|
+
"""
|
225
|
+
if len(qargs) != self.num_qubits or cargs:
|
226
|
+
raise CircuitError(
|
227
|
+
f"The amount of qubit({len(qargs)})/clbit({len(cargs)}) arguments does"
|
228
|
+
f" not match the gate expectation ({self.num_qubits})."
|
229
|
+
)
|
230
|
+
|
231
|
+
if any(not qarg for qarg in qargs):
|
232
|
+
raise CircuitError("One or more of the arguments are empty")
|
233
|
+
|
234
|
+
if len(qargs) == 0:
|
235
|
+
return [
|
236
|
+
([], []),
|
237
|
+
]
|
238
|
+
if len(qargs) == 1:
|
239
|
+
return Gate._broadcast_single_argument(qargs[0])
|
240
|
+
elif len(qargs) == 2:
|
241
|
+
return Gate._broadcast_2_arguments(qargs[0], qargs[1])
|
242
|
+
elif len(qargs) >= 3:
|
243
|
+
return Gate._broadcast_3_or_more_args(qargs)
|
244
|
+
else:
|
245
|
+
raise CircuitError(f"This gate cannot handle {len(qargs)} arguments")
|
246
|
+
|
247
|
+
def validate_parameter(self, parameter):
|
248
|
+
"""Gate parameters should be int, float, or ParameterExpression"""
|
249
|
+
if isinstance(parameter, ParameterExpression):
|
250
|
+
if len(parameter.parameters) > 0:
|
251
|
+
return parameter # expression has free parameters, we cannot validate it
|
252
|
+
if not parameter.is_real():
|
253
|
+
msg = f"Bound parameter expression is complex in gate {self.name}"
|
254
|
+
raise CircuitError(msg)
|
255
|
+
return parameter # per default assume parameters must be real when bound
|
256
|
+
if isinstance(parameter, (int, float)):
|
257
|
+
return parameter
|
258
|
+
elif isinstance(parameter, (np.integer, np.floating)):
|
259
|
+
return parameter.item()
|
260
|
+
else:
|
261
|
+
raise CircuitError(f"Invalid param type {type(parameter)} for gate {self.name}.")
|