qiskit 1.3.0__cp39-abi3-win32.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -0
- qiskit/__init__.py +146 -0
- qiskit/_accelerate.pyd +0 -0
- qiskit/_numpy_compat.py +73 -0
- qiskit/assembler/__init__.py +42 -0
- qiskit/assembler/assemble_circuits.py +451 -0
- qiskit/assembler/assemble_schedules.py +367 -0
- qiskit/assembler/disassemble.py +310 -0
- qiskit/assembler/run_config.py +77 -0
- qiskit/circuit/__init__.py +1313 -0
- qiskit/circuit/_classical_resource_map.py +148 -0
- qiskit/circuit/_standard_gates_commutations.py +3849 -0
- qiskit/circuit/_utils.py +167 -0
- qiskit/circuit/add_control.py +274 -0
- qiskit/circuit/annotated_operation.py +279 -0
- qiskit/circuit/barrier.py +50 -0
- qiskit/circuit/bit.py +94 -0
- qiskit/circuit/classical/__init__.py +41 -0
- qiskit/circuit/classical/expr/__init__.py +238 -0
- qiskit/circuit/classical/expr/constructors.py +556 -0
- qiskit/circuit/classical/expr/expr.py +397 -0
- qiskit/circuit/classical/expr/visitors.py +300 -0
- qiskit/circuit/classical/types/__init__.py +109 -0
- qiskit/circuit/classical/types/ordering.py +222 -0
- qiskit/circuit/classical/types/types.py +117 -0
- qiskit/circuit/classicalfunction/__init__.py +140 -0
- qiskit/circuit/classicalfunction/boolean_expression.py +129 -0
- qiskit/circuit/classicalfunction/classical_element.py +54 -0
- qiskit/circuit/classicalfunction/classical_function_visitor.py +155 -0
- qiskit/circuit/classicalfunction/classicalfunction.py +173 -0
- qiskit/circuit/classicalfunction/exceptions.py +35 -0
- qiskit/circuit/classicalfunction/types.py +18 -0
- qiskit/circuit/classicalfunction/utils.py +91 -0
- qiskit/circuit/classicalregister.py +57 -0
- qiskit/circuit/commutation_checker.py +106 -0
- qiskit/circuit/commutation_library.py +20 -0
- qiskit/circuit/controlflow/__init__.py +28 -0
- qiskit/circuit/controlflow/_builder_utils.py +207 -0
- qiskit/circuit/controlflow/break_loop.py +56 -0
- qiskit/circuit/controlflow/builder.py +691 -0
- qiskit/circuit/controlflow/continue_loop.py +58 -0
- qiskit/circuit/controlflow/control_flow.py +84 -0
- qiskit/circuit/controlflow/for_loop.py +217 -0
- qiskit/circuit/controlflow/if_else.py +511 -0
- qiskit/circuit/controlflow/switch_case.py +417 -0
- qiskit/circuit/controlflow/while_loop.py +171 -0
- qiskit/circuit/controlledgate.py +274 -0
- qiskit/circuit/delay.py +123 -0
- qiskit/circuit/duration.py +95 -0
- qiskit/circuit/equivalence.py +94 -0
- qiskit/circuit/equivalence_library.py +18 -0
- qiskit/circuit/exceptions.py +19 -0
- qiskit/circuit/gate.py +263 -0
- qiskit/circuit/instruction.py +697 -0
- qiskit/circuit/instructionset.py +179 -0
- qiskit/circuit/library/__init__.py +668 -0
- qiskit/circuit/library/arithmetic/__init__.py +34 -0
- qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +210 -0
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +88 -0
- qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
- qiskit/circuit/library/arithmetic/integer_comparator.py +243 -0
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +196 -0
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +189 -0
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +192 -0
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +353 -0
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +277 -0
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +317 -0
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +335 -0
- qiskit/circuit/library/arithmetic/quadratic_form.py +198 -0
- qiskit/circuit/library/arithmetic/weighted_adder.py +337 -0
- qiskit/circuit/library/basis_change/__init__.py +15 -0
- qiskit/circuit/library/basis_change/qft.py +313 -0
- qiskit/circuit/library/blueprintcircuit.py +280 -0
- qiskit/circuit/library/boolean_logic/__init__.py +18 -0
- qiskit/circuit/library/boolean_logic/inner_product.py +155 -0
- qiskit/circuit/library/boolean_logic/quantum_and.py +200 -0
- qiskit/circuit/library/boolean_logic/quantum_or.py +202 -0
- qiskit/circuit/library/boolean_logic/quantum_xor.py +165 -0
- qiskit/circuit/library/data_preparation/__init__.py +57 -0
- qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
- qiskit/circuit/library/data_preparation/initializer.py +107 -0
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
- qiskit/circuit/library/fourier_checking.py +158 -0
- qiskit/circuit/library/generalized_gates/__init__.py +30 -0
- qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
- qiskit/circuit/library/generalized_gates/gms.py +174 -0
- qiskit/circuit/library/generalized_gates/gr.py +215 -0
- qiskit/circuit/library/generalized_gates/isometry.py +370 -0
- qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
- qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
- qiskit/circuit/library/generalized_gates/pauli.py +85 -0
- qiskit/circuit/library/generalized_gates/permutation.py +194 -0
- qiskit/circuit/library/generalized_gates/rv.py +96 -0
- qiskit/circuit/library/generalized_gates/uc.py +213 -0
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
- qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
- qiskit/circuit/library/generalized_gates/ucry.py +32 -0
- qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
- qiskit/circuit/library/generalized_gates/unitary.py +215 -0
- qiskit/circuit/library/graph_state.py +169 -0
- qiskit/circuit/library/grover_operator.py +579 -0
- qiskit/circuit/library/hamiltonian_gate.py +142 -0
- qiskit/circuit/library/hidden_linear_function.py +161 -0
- qiskit/circuit/library/iqp.py +175 -0
- qiskit/circuit/library/n_local/__init__.py +45 -0
- qiskit/circuit/library/n_local/efficient_su2.py +277 -0
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +515 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +297 -0
- qiskit/circuit/library/n_local/n_local.py +1472 -0
- qiskit/circuit/library/n_local/pauli_two_design.py +243 -0
- qiskit/circuit/library/n_local/qaoa_ansatz.py +366 -0
- qiskit/circuit/library/n_local/real_amplitudes.py +306 -0
- qiskit/circuit/library/n_local/two_local.py +289 -0
- qiskit/circuit/library/overlap.py +182 -0
- qiskit/circuit/library/pauli_evolution.py +186 -0
- qiskit/circuit/library/phase_estimation.py +175 -0
- qiskit/circuit/library/phase_oracle.py +153 -0
- qiskit/circuit/library/quantum_volume.py +167 -0
- qiskit/circuit/library/standard_gates/__init__.py +142 -0
- qiskit/circuit/library/standard_gates/dcx.py +78 -0
- qiskit/circuit/library/standard_gates/ecr.py +130 -0
- qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
- qiskit/circuit/library/standard_gates/global_phase.py +85 -0
- qiskit/circuit/library/standard_gates/h.py +258 -0
- qiskit/circuit/library/standard_gates/i.py +76 -0
- qiskit/circuit/library/standard_gates/iswap.py +134 -0
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +405 -0
- qiskit/circuit/library/standard_gates/p.py +441 -0
- qiskit/circuit/library/standard_gates/r.py +117 -0
- qiskit/circuit/library/standard_gates/rx.py +303 -0
- qiskit/circuit/library/standard_gates/rxx.py +183 -0
- qiskit/circuit/library/standard_gates/ry.py +298 -0
- qiskit/circuit/library/standard_gates/ryy.py +183 -0
- qiskit/circuit/library/standard_gates/rz.py +319 -0
- qiskit/circuit/library/standard_gates/rzx.py +229 -0
- qiskit/circuit/library/standard_gates/rzz.py +196 -0
- qiskit/circuit/library/standard_gates/s.py +428 -0
- qiskit/circuit/library/standard_gates/swap.py +288 -0
- qiskit/circuit/library/standard_gates/sx.py +315 -0
- qiskit/circuit/library/standard_gates/t.py +179 -0
- qiskit/circuit/library/standard_gates/u.py +403 -0
- qiskit/circuit/library/standard_gates/u1.py +501 -0
- qiskit/circuit/library/standard_gates/u2.py +149 -0
- qiskit/circuit/library/standard_gates/u3.py +436 -0
- qiskit/circuit/library/standard_gates/x.py +1529 -0
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +235 -0
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +239 -0
- qiskit/circuit/library/standard_gates/y.py +262 -0
- qiskit/circuit/library/standard_gates/z.py +348 -0
- qiskit/circuit/library/templates/__init__.py +92 -0
- qiskit/circuit/library/templates/clifford/__init__.py +33 -0
- qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
- qiskit/circuit/library/templates/nct/__init__.py +67 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
- qiskit/circuit/library/templates/rzx/__init__.py +25 -0
- qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
- qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
- qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
- qiskit/circuit/measure.py +44 -0
- qiskit/circuit/operation.py +67 -0
- qiskit/circuit/parameter.py +178 -0
- qiskit/circuit/parameterexpression.py +692 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +120 -0
- qiskit/circuit/quantumcircuit.py +6829 -0
- qiskit/circuit/quantumcircuitdata.py +136 -0
- qiskit/circuit/quantumregister.py +75 -0
- qiskit/circuit/random/__init__.py +15 -0
- qiskit/circuit/random/utils.py +358 -0
- qiskit/circuit/register.py +233 -0
- qiskit/circuit/reset.py +34 -0
- qiskit/circuit/singleton.py +606 -0
- qiskit/circuit/store.py +97 -0
- qiskit/circuit/tools/__init__.py +16 -0
- qiskit/circuit/tools/pi_check.py +190 -0
- qiskit/circuit/twirling.py +145 -0
- qiskit/compiler/__init__.py +33 -0
- qiskit/compiler/assembler.py +681 -0
- qiskit/compiler/scheduler.py +109 -0
- qiskit/compiler/sequencer.py +71 -0
- qiskit/compiler/transpiler.py +533 -0
- qiskit/converters/__init__.py +74 -0
- qiskit/converters/circuit_to_dag.py +78 -0
- qiskit/converters/circuit_to_dagdependency.py +51 -0
- qiskit/converters/circuit_to_dagdependency_v2.py +47 -0
- qiskit/converters/circuit_to_gate.py +107 -0
- qiskit/converters/circuit_to_instruction.py +155 -0
- qiskit/converters/dag_to_circuit.py +79 -0
- qiskit/converters/dag_to_dagdependency.py +55 -0
- qiskit/converters/dag_to_dagdependency_v2.py +44 -0
- qiskit/converters/dagdependency_to_circuit.py +46 -0
- qiskit/converters/dagdependency_to_dag.py +54 -0
- qiskit/dagcircuit/__init__.py +44 -0
- qiskit/dagcircuit/collect_blocks.py +391 -0
- qiskit/dagcircuit/dagcircuit.py +24 -0
- qiskit/dagcircuit/dagdependency.py +646 -0
- qiskit/dagcircuit/dagdependency_v2.py +641 -0
- qiskit/dagcircuit/dagdepnode.py +160 -0
- qiskit/dagcircuit/dagnode.py +176 -0
- qiskit/dagcircuit/exceptions.py +42 -0
- qiskit/exceptions.py +153 -0
- qiskit/passmanager/__init__.py +240 -0
- qiskit/passmanager/base_tasks.py +230 -0
- qiskit/passmanager/compilation_status.py +74 -0
- qiskit/passmanager/exceptions.py +19 -0
- qiskit/passmanager/flow_controllers.py +116 -0
- qiskit/passmanager/passmanager.py +333 -0
- qiskit/primitives/__init__.py +481 -0
- qiskit/primitives/backend_estimator.py +486 -0
- qiskit/primitives/backend_estimator_v2.py +434 -0
- qiskit/primitives/backend_sampler.py +222 -0
- qiskit/primitives/backend_sampler_v2.py +339 -0
- qiskit/primitives/base/__init__.py +20 -0
- qiskit/primitives/base/base_estimator.py +252 -0
- qiskit/primitives/base/base_primitive.py +45 -0
- qiskit/primitives/base/base_primitive_job.py +78 -0
- qiskit/primitives/base/base_result.py +65 -0
- qiskit/primitives/base/base_sampler.py +204 -0
- qiskit/primitives/base/estimator_result.py +46 -0
- qiskit/primitives/base/sampler_result.py +45 -0
- qiskit/primitives/base/validation.py +231 -0
- qiskit/primitives/containers/__init__.py +26 -0
- qiskit/primitives/containers/bindings_array.py +389 -0
- qiskit/primitives/containers/bit_array.py +741 -0
- qiskit/primitives/containers/data_bin.py +173 -0
- qiskit/primitives/containers/estimator_pub.py +222 -0
- qiskit/primitives/containers/object_array.py +94 -0
- qiskit/primitives/containers/observables_array.py +279 -0
- qiskit/primitives/containers/primitive_result.py +53 -0
- qiskit/primitives/containers/pub_result.py +51 -0
- qiskit/primitives/containers/sampler_pub.py +193 -0
- qiskit/primitives/containers/sampler_pub_result.py +74 -0
- qiskit/primitives/containers/shape.py +129 -0
- qiskit/primitives/estimator.py +172 -0
- qiskit/primitives/primitive_job.py +81 -0
- qiskit/primitives/sampler.py +162 -0
- qiskit/primitives/statevector_estimator.py +174 -0
- qiskit/primitives/statevector_sampler.py +292 -0
- qiskit/primitives/utils.py +247 -0
- qiskit/providers/__init__.py +803 -0
- qiskit/providers/backend.py +667 -0
- qiskit/providers/backend_compat.py +472 -0
- qiskit/providers/basic_provider/__init__.py +45 -0
- qiskit/providers/basic_provider/basic_provider.py +101 -0
- qiskit/providers/basic_provider/basic_provider_job.py +65 -0
- qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
- qiskit/providers/basic_provider/basic_simulator.py +821 -0
- qiskit/providers/basic_provider/exceptions.py +30 -0
- qiskit/providers/exceptions.py +45 -0
- qiskit/providers/fake_provider/__init__.py +105 -0
- qiskit/providers/fake_provider/backends_v1/__init__.py +22 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +37 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_20q/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +43 -0
- qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +50 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +41 -0
- qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +44 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +1 -0
- qiskit/providers/fake_provider/fake_1q.py +91 -0
- qiskit/providers/fake_provider/fake_backend.py +165 -0
- qiskit/providers/fake_provider/fake_openpulse_2q.py +391 -0
- qiskit/providers/fake_provider/fake_openpulse_3q.py +340 -0
- qiskit/providers/fake_provider/fake_pulse_backend.py +49 -0
- qiskit/providers/fake_provider/fake_qasm_backend.py +77 -0
- qiskit/providers/fake_provider/generic_backend_v2.py +1035 -0
- qiskit/providers/fake_provider/utils/__init__.py +15 -0
- qiskit/providers/fake_provider/utils/backend_converter.py +150 -0
- qiskit/providers/fake_provider/utils/json_decoder.py +109 -0
- qiskit/providers/job.py +147 -0
- qiskit/providers/jobstatus.py +30 -0
- qiskit/providers/models/__init__.py +89 -0
- qiskit/providers/models/backendconfiguration.py +1040 -0
- qiskit/providers/models/backendproperties.py +517 -0
- qiskit/providers/models/backendstatus.py +94 -0
- qiskit/providers/models/jobstatus.py +66 -0
- qiskit/providers/models/pulsedefaults.py +305 -0
- qiskit/providers/options.py +273 -0
- qiskit/providers/provider.py +95 -0
- qiskit/providers/providerutils.py +110 -0
- qiskit/pulse/__init__.py +158 -0
- qiskit/pulse/builder.py +2254 -0
- qiskit/pulse/calibration_entries.py +381 -0
- qiskit/pulse/channels.py +227 -0
- qiskit/pulse/configuration.py +245 -0
- qiskit/pulse/exceptions.py +45 -0
- qiskit/pulse/filters.py +309 -0
- qiskit/pulse/instruction_schedule_map.py +424 -0
- qiskit/pulse/instructions/__init__.py +67 -0
- qiskit/pulse/instructions/acquire.py +150 -0
- qiskit/pulse/instructions/delay.py +71 -0
- qiskit/pulse/instructions/directives.py +154 -0
- qiskit/pulse/instructions/frequency.py +135 -0
- qiskit/pulse/instructions/instruction.py +270 -0
- qiskit/pulse/instructions/phase.py +152 -0
- qiskit/pulse/instructions/play.py +99 -0
- qiskit/pulse/instructions/reference.py +100 -0
- qiskit/pulse/instructions/snapshot.py +82 -0
- qiskit/pulse/library/__init__.py +97 -0
- qiskit/pulse/library/continuous.py +430 -0
- qiskit/pulse/library/pulse.py +148 -0
- qiskit/pulse/library/samplers/__init__.py +15 -0
- qiskit/pulse/library/samplers/decorators.py +295 -0
- qiskit/pulse/library/samplers/strategies.py +71 -0
- qiskit/pulse/library/symbolic_pulses.py +1988 -0
- qiskit/pulse/library/waveform.py +136 -0
- qiskit/pulse/macros.py +262 -0
- qiskit/pulse/parameter_manager.py +445 -0
- qiskit/pulse/parser.py +314 -0
- qiskit/pulse/reference_manager.py +58 -0
- qiskit/pulse/schedule.py +1854 -0
- qiskit/pulse/transforms/__init__.py +106 -0
- qiskit/pulse/transforms/alignments.py +406 -0
- qiskit/pulse/transforms/base_transforms.py +71 -0
- qiskit/pulse/transforms/canonicalization.py +498 -0
- qiskit/pulse/transforms/dag.py +122 -0
- qiskit/pulse/utils.py +149 -0
- qiskit/qasm/libs/dummy/stdgates.inc +75 -0
- qiskit/qasm/libs/qelib1.inc +266 -0
- qiskit/qasm/libs/stdgates.inc +82 -0
- qiskit/qasm2/__init__.py +654 -0
- qiskit/qasm2/exceptions.py +27 -0
- qiskit/qasm2/export.py +372 -0
- qiskit/qasm2/parse.py +452 -0
- qiskit/qasm3/__init__.py +367 -0
- qiskit/qasm3/ast.py +738 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1299 -0
- qiskit/qasm3/printer.py +577 -0
- qiskit/qobj/__init__.py +75 -0
- qiskit/qobj/common.py +81 -0
- qiskit/qobj/converters/__init__.py +18 -0
- qiskit/qobj/converters/lo_config.py +177 -0
- qiskit/qobj/converters/pulse_instruction.py +897 -0
- qiskit/qobj/pulse_qobj.py +709 -0
- qiskit/qobj/qasm_qobj.py +708 -0
- qiskit/qobj/utils.py +46 -0
- qiskit/qpy/__init__.py +1822 -0
- qiskit/qpy/binary_io/__init__.py +36 -0
- qiskit/qpy/binary_io/circuits.py +1475 -0
- qiskit/qpy/binary_io/schedules.py +635 -0
- qiskit/qpy/binary_io/value.py +1025 -0
- qiskit/qpy/common.py +350 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +401 -0
- qiskit/qpy/interface.py +377 -0
- qiskit/qpy/type_keys.py +572 -0
- qiskit/quantum_info/__init__.py +162 -0
- qiskit/quantum_info/analysis/__init__.py +17 -0
- qiskit/quantum_info/analysis/average.py +47 -0
- qiskit/quantum_info/analysis/distance.py +102 -0
- qiskit/quantum_info/analysis/make_observable.py +44 -0
- qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
- qiskit/quantum_info/operators/__init__.py +28 -0
- qiskit/quantum_info/operators/base_operator.py +145 -0
- qiskit/quantum_info/operators/channel/__init__.py +29 -0
- qiskit/quantum_info/operators/channel/chi.py +191 -0
- qiskit/quantum_info/operators/channel/choi.py +218 -0
- qiskit/quantum_info/operators/channel/kraus.py +337 -0
- qiskit/quantum_info/operators/channel/ptm.py +204 -0
- qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
- qiskit/quantum_info/operators/channel/stinespring.py +296 -0
- qiskit/quantum_info/operators/channel/superop.py +377 -0
- qiskit/quantum_info/operators/channel/transformations.py +475 -0
- qiskit/quantum_info/operators/custom_iterator.py +48 -0
- qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
- qiskit/quantum_info/operators/dihedral/dihedral.py +509 -0
- qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
- qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
- qiskit/quantum_info/operators/dihedral/random.py +64 -0
- qiskit/quantum_info/operators/linear_op.py +25 -0
- qiskit/quantum_info/operators/measures.py +418 -0
- qiskit/quantum_info/operators/mixins/__init__.py +52 -0
- qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
- qiskit/quantum_info/operators/mixins/group.py +171 -0
- qiskit/quantum_info/operators/mixins/linear.py +84 -0
- qiskit/quantum_info/operators/mixins/multiply.py +62 -0
- qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
- qiskit/quantum_info/operators/op_shape.py +525 -0
- qiskit/quantum_info/operators/operator.py +865 -0
- qiskit/quantum_info/operators/operator_utils.py +76 -0
- qiskit/quantum_info/operators/predicates.py +183 -0
- qiskit/quantum_info/operators/random.py +154 -0
- qiskit/quantum_info/operators/scalar_op.py +254 -0
- qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
- qiskit/quantum_info/operators/symplectic/clifford.py +1030 -0
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
- qiskit/quantum_info/operators/symplectic/pauli.py +753 -0
- qiskit/quantum_info/operators/symplectic/pauli_list.py +1230 -0
- qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
- qiskit/quantum_info/operators/symplectic/random.py +117 -0
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1196 -0
- qiskit/quantum_info/operators/utils/__init__.py +20 -0
- qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
- qiskit/quantum_info/operators/utils/commutator.py +36 -0
- qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
- qiskit/quantum_info/quaternion.py +156 -0
- qiskit/quantum_info/random.py +26 -0
- qiskit/quantum_info/states/__init__.py +28 -0
- qiskit/quantum_info/states/densitymatrix.py +845 -0
- qiskit/quantum_info/states/measures.py +288 -0
- qiskit/quantum_info/states/quantum_state.py +503 -0
- qiskit/quantum_info/states/random.py +157 -0
- qiskit/quantum_info/states/stabilizerstate.py +773 -0
- qiskit/quantum_info/states/statevector.py +958 -0
- qiskit/quantum_info/states/utils.py +247 -0
- qiskit/result/__init__.py +73 -0
- qiskit/result/counts.py +189 -0
- qiskit/result/distributions/__init__.py +17 -0
- qiskit/result/distributions/probability.py +100 -0
- qiskit/result/distributions/quasi.py +154 -0
- qiskit/result/exceptions.py +40 -0
- qiskit/result/mitigation/__init__.py +13 -0
- qiskit/result/mitigation/base_readout_mitigator.py +79 -0
- qiskit/result/mitigation/correlated_readout_mitigator.py +277 -0
- qiskit/result/mitigation/local_readout_mitigator.py +328 -0
- qiskit/result/mitigation/utils.py +217 -0
- qiskit/result/models.py +234 -0
- qiskit/result/postprocess.py +239 -0
- qiskit/result/result.py +392 -0
- qiskit/result/sampled_expval.py +75 -0
- qiskit/result/utils.py +295 -0
- qiskit/scheduler/__init__.py +40 -0
- qiskit/scheduler/config.py +37 -0
- qiskit/scheduler/lowering.py +187 -0
- qiskit/scheduler/methods/__init__.py +15 -0
- qiskit/scheduler/methods/basic.py +140 -0
- qiskit/scheduler/schedule_circuit.py +69 -0
- qiskit/scheduler/sequence.py +104 -0
- qiskit/synthesis/__init__.py +220 -0
- qiskit/synthesis/arithmetic/__init__.py +16 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
- qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +102 -0
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +99 -0
- qiskit/synthesis/clifford/__init__.py +19 -0
- qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
- qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
- qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
- qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
- qiskit/synthesis/cnotdihedral/__init__.py +17 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
- qiskit/synthesis/discrete_basis/__init__.py +16 -0
- qiskit/synthesis/discrete_basis/commutator_decompose.py +241 -0
- qiskit/synthesis/discrete_basis/gate_sequence.py +415 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +163 -0
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +217 -0
- qiskit/synthesis/evolution/__init__.py +21 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +117 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +311 -0
- qiskit/synthesis/evolution/qdrift.py +138 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +215 -0
- qiskit/synthesis/linear/__init__.py +26 -0
- qiskit/synthesis/linear/cnot_synth.py +69 -0
- qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
- qiskit/synthesis/linear/linear_depth_lnn.py +276 -0
- qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
- qiskit/synthesis/linear_phase/__init__.py +17 -0
- qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +262 -0
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
- qiskit/synthesis/multi_controlled/__init__.py +24 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +356 -0
- qiskit/synthesis/one_qubit/__init__.py +15 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
- qiskit/synthesis/permutation/__init__.py +18 -0
- qiskit/synthesis/permutation/permutation_full.py +78 -0
- qiskit/synthesis/permutation/permutation_lnn.py +54 -0
- qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
- qiskit/synthesis/permutation/permutation_utils.py +16 -0
- qiskit/synthesis/qft/__init__.py +16 -0
- qiskit/synthesis/qft/qft_decompose_full.py +97 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +79 -0
- qiskit/synthesis/stabilizer/__init__.py +16 -0
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
- qiskit/synthesis/two_qubit/__init__.py +19 -0
- qiskit/synthesis/two_qubit/local_invariance.py +63 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +700 -0
- qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
- qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
- qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
- qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
- qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
- qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
- qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
- qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
- qiskit/synthesis/unitary/__init__.py +13 -0
- qiskit/synthesis/unitary/aqc/__init__.py +177 -0
- qiskit/synthesis/unitary/aqc/approximate.py +116 -0
- qiskit/synthesis/unitary/aqc/aqc.py +175 -0
- qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
- qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
- qiskit/synthesis/unitary/qsd.py +288 -0
- qiskit/transpiler/__init__.py +1290 -0
- qiskit/transpiler/basepasses.py +221 -0
- qiskit/transpiler/coupling.py +500 -0
- qiskit/transpiler/exceptions.py +59 -0
- qiskit/transpiler/instruction_durations.py +281 -0
- qiskit/transpiler/layout.py +737 -0
- qiskit/transpiler/passes/__init__.py +312 -0
- qiskit/transpiler/passes/analysis/__init__.py +23 -0
- qiskit/transpiler/passes/analysis/count_ops.py +30 -0
- qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
- qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
- qiskit/transpiler/passes/analysis/depth.py +33 -0
- qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
- qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
- qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
- qiskit/transpiler/passes/analysis/size.py +36 -0
- qiskit/transpiler/passes/analysis/width.py +27 -0
- qiskit/transpiler/passes/basis/__init__.py +19 -0
- qiskit/transpiler/passes/basis/basis_translator.py +137 -0
- qiskit/transpiler/passes/basis/decompose.py +131 -0
- qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +88 -0
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +109 -0
- qiskit/transpiler/passes/calibration/__init__.py +17 -0
- qiskit/transpiler/passes/calibration/base_builder.py +79 -0
- qiskit/transpiler/passes/calibration/builders.py +20 -0
- qiskit/transpiler/passes/calibration/exceptions.py +22 -0
- qiskit/transpiler/passes/calibration/pulse_gate.py +100 -0
- qiskit/transpiler/passes/calibration/rx_builder.py +164 -0
- qiskit/transpiler/passes/calibration/rzx_builder.py +411 -0
- qiskit/transpiler/passes/calibration/rzx_templates.py +51 -0
- qiskit/transpiler/passes/layout/__init__.py +26 -0
- qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
- qiskit/transpiler/passes/layout/apply_layout.py +123 -0
- qiskit/transpiler/passes/layout/csp_layout.py +132 -0
- qiskit/transpiler/passes/layout/dense_layout.py +202 -0
- qiskit/transpiler/passes/layout/disjoint_utils.py +219 -0
- qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +117 -0
- qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
- qiskit/transpiler/passes/layout/sabre_layout.py +487 -0
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
- qiskit/transpiler/passes/layout/set_layout.py +69 -0
- qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
- qiskit/transpiler/passes/layout/vf2_layout.py +263 -0
- qiskit/transpiler/passes/layout/vf2_post_layout.py +419 -0
- qiskit/transpiler/passes/layout/vf2_utils.py +260 -0
- qiskit/transpiler/passes/optimization/__init__.py +43 -0
- qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
- qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
- qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +115 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +104 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +80 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +227 -0
- qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
- qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
- qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +149 -0
- qiskit/transpiler/passes/optimization/cx_cancellation.py +65 -0
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +162 -0
- qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
- qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
- qiskit/transpiler/passes/optimization/normalize_rx_angle.py +149 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +268 -0
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +254 -0
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
- qiskit/transpiler/passes/optimization/optimize_annotated.py +448 -0
- qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
- qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
- qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
- qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +69 -0
- qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +47 -0
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +40 -0
- qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
- qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
- qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +638 -0
- qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
- qiskit/transpiler/passes/routing/__init__.py +22 -0
- qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
- qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
- qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
- qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
- qiskit/transpiler/passes/routing/basic_swap.py +166 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +395 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
- qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
- qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
- qiskit/transpiler/passes/routing/sabre_swap.py +447 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +392 -0
- qiskit/transpiler/passes/routing/stochastic_swap.py +532 -0
- qiskit/transpiler/passes/routing/utils.py +35 -0
- qiskit/transpiler/passes/scheduling/__init__.py +27 -0
- qiskit/transpiler/passes/scheduling/alap.py +153 -0
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +81 -0
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +255 -0
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +78 -0
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +107 -0
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +250 -0
- qiskit/transpiler/passes/scheduling/asap.py +175 -0
- qiskit/transpiler/passes/scheduling/base_scheduler.py +310 -0
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +312 -0
- qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +256 -0
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +452 -0
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +82 -0
- qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +127 -0
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +131 -0
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +94 -0
- qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +165 -0
- qiskit/transpiler/passes/synthesis/__init__.py +20 -0
- qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +854 -0
- qiskit/transpiler/passes/synthesis/hls_plugins.py +1559 -0
- qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
- qiskit/transpiler/passes/synthesis/plugin.py +734 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +297 -0
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +1076 -0
- qiskit/transpiler/passes/utils/__init__.py +33 -0
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
- qiskit/transpiler/passes/utils/check_gate_direction.py +52 -0
- qiskit/transpiler/passes/utils/check_map.py +78 -0
- qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
- qiskit/transpiler/passes/utils/control_flow.py +65 -0
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +93 -0
- qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
- qiskit/transpiler/passes/utils/error.py +69 -0
- qiskit/transpiler/passes/utils/filter_op_nodes.py +65 -0
- qiskit/transpiler/passes/utils/fixed_point.py +48 -0
- qiskit/transpiler/passes/utils/gate_direction.py +86 -0
- qiskit/transpiler/passes/utils/gates_basis.py +51 -0
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
- qiskit/transpiler/passes/utils/minimum_point.py +118 -0
- qiskit/transpiler/passes/utils/remove_barriers.py +49 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +114 -0
- qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
- qiskit/transpiler/passmanager.py +490 -0
- qiskit/transpiler/passmanager_config.py +216 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +73 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1045 -0
- qiskit/transpiler/preset_passmanagers/common.py +649 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +626 -0
- qiskit/transpiler/preset_passmanagers/level0.py +113 -0
- qiskit/transpiler/preset_passmanagers/level1.py +120 -0
- qiskit/transpiler/preset_passmanagers/level2.py +119 -0
- qiskit/transpiler/preset_passmanagers/level3.py +119 -0
- qiskit/transpiler/preset_passmanagers/plugin.py +353 -0
- qiskit/transpiler/target.py +1319 -0
- qiskit/transpiler/timing_constraints.py +59 -0
- qiskit/user_config.py +262 -0
- qiskit/utils/__init__.py +89 -0
- qiskit/utils/classtools.py +146 -0
- qiskit/utils/deprecate_pulse.py +119 -0
- qiskit/utils/deprecation.py +490 -0
- qiskit/utils/lazy_tester.py +363 -0
- qiskit/utils/multiprocessing.py +56 -0
- qiskit/utils/optionals.py +347 -0
- qiskit/utils/parallel.py +191 -0
- qiskit/utils/units.py +143 -0
- qiskit/version.py +84 -0
- qiskit/visualization/__init__.py +288 -0
- qiskit/visualization/array.py +204 -0
- qiskit/visualization/bloch.py +778 -0
- qiskit/visualization/circuit/__init__.py +15 -0
- qiskit/visualization/circuit/_utils.py +675 -0
- qiskit/visualization/circuit/circuit_visualization.py +727 -0
- qiskit/visualization/circuit/latex.py +661 -0
- qiskit/visualization/circuit/matplotlib.py +2029 -0
- qiskit/visualization/circuit/qcstyle.py +278 -0
- qiskit/visualization/circuit/styles/__init__.py +13 -0
- qiskit/visualization/circuit/styles/bw.json +202 -0
- qiskit/visualization/circuit/styles/clifford.json +202 -0
- qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
- qiskit/visualization/circuit/styles/iqp.json +214 -0
- qiskit/visualization/circuit/styles/textbook.json +202 -0
- qiskit/visualization/circuit/text.py +1844 -0
- qiskit/visualization/circuit_visualization.py +19 -0
- qiskit/visualization/counts_visualization.py +481 -0
- qiskit/visualization/dag_visualization.py +316 -0
- qiskit/visualization/exceptions.py +21 -0
- qiskit/visualization/gate_map.py +1485 -0
- qiskit/visualization/library.py +37 -0
- qiskit/visualization/pass_manager_visualization.py +308 -0
- qiskit/visualization/pulse_v2/__init__.py +21 -0
- qiskit/visualization/pulse_v2/core.py +901 -0
- qiskit/visualization/pulse_v2/device_info.py +173 -0
- qiskit/visualization/pulse_v2/drawings.py +253 -0
- qiskit/visualization/pulse_v2/events.py +254 -0
- qiskit/visualization/pulse_v2/generators/__init__.py +40 -0
- qiskit/visualization/pulse_v2/generators/barrier.py +76 -0
- qiskit/visualization/pulse_v2/generators/chart.py +208 -0
- qiskit/visualization/pulse_v2/generators/frame.py +436 -0
- qiskit/visualization/pulse_v2/generators/snapshot.py +133 -0
- qiskit/visualization/pulse_v2/generators/waveform.py +645 -0
- qiskit/visualization/pulse_v2/interface.py +458 -0
- qiskit/visualization/pulse_v2/layouts.py +387 -0
- qiskit/visualization/pulse_v2/plotters/__init__.py +17 -0
- qiskit/visualization/pulse_v2/plotters/base_plotter.py +53 -0
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +201 -0
- qiskit/visualization/pulse_v2/stylesheet.py +312 -0
- qiskit/visualization/pulse_v2/types.py +242 -0
- qiskit/visualization/state_visualization.py +1518 -0
- qiskit/visualization/timeline/__init__.py +21 -0
- qiskit/visualization/timeline/core.py +480 -0
- qiskit/visualization/timeline/drawings.py +260 -0
- qiskit/visualization/timeline/generators.py +506 -0
- qiskit/visualization/timeline/interface.py +436 -0
- qiskit/visualization/timeline/layouts.py +115 -0
- qiskit/visualization/timeline/plotters/__init__.py +16 -0
- qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
- qiskit/visualization/timeline/plotters/matplotlib.py +192 -0
- qiskit/visualization/timeline/stylesheet.py +301 -0
- qiskit/visualization/timeline/types.py +148 -0
- qiskit/visualization/transition_visualization.py +369 -0
- qiskit/visualization/utils.py +49 -0
- qiskit-1.3.0.dist-info/LICENSE.txt +203 -0
- qiskit-1.3.0.dist-info/METADATA +222 -0
- qiskit-1.3.0.dist-info/RECORD +836 -0
- qiskit-1.3.0.dist-info/WHEEL +5 -0
- qiskit-1.3.0.dist-info/entry_points.txt +76 -0
- qiskit-1.3.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,305 @@
|
|
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
|
+
|
14
|
+
"""Model and schema for pulse defaults."""
|
15
|
+
import warnings
|
16
|
+
from typing import Any, Dict, List
|
17
|
+
|
18
|
+
from qiskit.pulse.instruction_schedule_map import InstructionScheduleMap, PulseQobjDef
|
19
|
+
from qiskit.qobj import PulseLibraryItem, PulseQobjInstruction
|
20
|
+
from qiskit.qobj.converters import QobjToInstructionConverter
|
21
|
+
from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
|
22
|
+
|
23
|
+
|
24
|
+
class MeasurementKernel:
|
25
|
+
"""Class representing a Measurement Kernel."""
|
26
|
+
|
27
|
+
def __init__(self, name, params):
|
28
|
+
"""Initialize a MeasurementKernel object
|
29
|
+
|
30
|
+
Args:
|
31
|
+
name (str): The name of the measurement kernel
|
32
|
+
params: The parameters of the measurement kernel
|
33
|
+
"""
|
34
|
+
self.name = name
|
35
|
+
self.params = params
|
36
|
+
|
37
|
+
def to_dict(self):
|
38
|
+
"""Return a dictionary format representation of the MeasurementKernel.
|
39
|
+
|
40
|
+
Returns:
|
41
|
+
dict: The dictionary form of the MeasurementKernel.
|
42
|
+
"""
|
43
|
+
return {"name": self.name, "params": self.params}
|
44
|
+
|
45
|
+
@classmethod
|
46
|
+
def from_dict(cls, data):
|
47
|
+
"""Create a new MeasurementKernel object from a dictionary.
|
48
|
+
|
49
|
+
Args:
|
50
|
+
data (dict): A dictionary representing the MeasurementKernel
|
51
|
+
to create. It will be in the same format as output by
|
52
|
+
:meth:`to_dict`.
|
53
|
+
|
54
|
+
Returns:
|
55
|
+
MeasurementKernel: The MeasurementKernel from the input dictionary.
|
56
|
+
"""
|
57
|
+
return cls(**data)
|
58
|
+
|
59
|
+
|
60
|
+
class Discriminator:
|
61
|
+
"""Class representing a Discriminator."""
|
62
|
+
|
63
|
+
def __init__(self, name, params):
|
64
|
+
"""Initialize a Discriminator object
|
65
|
+
|
66
|
+
Args:
|
67
|
+
name (str): The name of the discriminator
|
68
|
+
params: The parameters of the discriminator
|
69
|
+
"""
|
70
|
+
self.name = name
|
71
|
+
self.params = params
|
72
|
+
|
73
|
+
def to_dict(self):
|
74
|
+
"""Return a dictionary format representation of the Discriminator.
|
75
|
+
|
76
|
+
Returns:
|
77
|
+
dict: The dictionary form of the Discriminator.
|
78
|
+
"""
|
79
|
+
return {"name": self.name, "params": self.params}
|
80
|
+
|
81
|
+
@classmethod
|
82
|
+
def from_dict(cls, data):
|
83
|
+
"""Create a new Discriminator object from a dictionary.
|
84
|
+
|
85
|
+
Args:
|
86
|
+
data (dict): A dictionary representing the Discriminator
|
87
|
+
to create. It will be in the same format as output by
|
88
|
+
:meth:`to_dict`.
|
89
|
+
|
90
|
+
Returns:
|
91
|
+
Discriminator: The Discriminator from the input dictionary.
|
92
|
+
"""
|
93
|
+
return cls(**data)
|
94
|
+
|
95
|
+
|
96
|
+
class Command:
|
97
|
+
"""Class representing a Command.
|
98
|
+
|
99
|
+
Attributes:
|
100
|
+
name: Pulse command name.
|
101
|
+
"""
|
102
|
+
|
103
|
+
_data = {}
|
104
|
+
|
105
|
+
def __init__(self, name: str, qubits=None, sequence=None, **kwargs):
|
106
|
+
"""Initialize a Command object
|
107
|
+
|
108
|
+
Args:
|
109
|
+
name (str): The name of the command
|
110
|
+
qubits: The qubits for the command
|
111
|
+
sequence (PulseQobjInstruction): The sequence for the Command
|
112
|
+
kwargs: Optional additional fields
|
113
|
+
"""
|
114
|
+
self._data = {}
|
115
|
+
self.name = name
|
116
|
+
if qubits is not None:
|
117
|
+
self.qubits = qubits
|
118
|
+
if sequence is not None:
|
119
|
+
self.sequence = sequence
|
120
|
+
self._data.update(kwargs)
|
121
|
+
|
122
|
+
def __getattr__(self, name):
|
123
|
+
try:
|
124
|
+
return self._data[name]
|
125
|
+
except KeyError as ex:
|
126
|
+
raise AttributeError(f"Attribute {name} is not defined") from ex
|
127
|
+
|
128
|
+
def to_dict(self):
|
129
|
+
"""Return a dictionary format representation of the Command.
|
130
|
+
|
131
|
+
Returns:
|
132
|
+
dict: The dictionary form of the Command.
|
133
|
+
"""
|
134
|
+
out_dict = {"name": self.name}
|
135
|
+
if hasattr(self, "qubits"):
|
136
|
+
out_dict["qubits"] = self.qubits
|
137
|
+
if hasattr(self, "sequence"):
|
138
|
+
out_dict["sequence"] = [x.to_dict() for x in self.sequence]
|
139
|
+
out_dict.update(self._data)
|
140
|
+
return out_dict
|
141
|
+
|
142
|
+
@classmethod
|
143
|
+
def from_dict(cls, data):
|
144
|
+
"""Create a new Command object from a dictionary.
|
145
|
+
|
146
|
+
Args:
|
147
|
+
data (dict): A dictionary representing the ``Command``
|
148
|
+
to create. It will be in the same format as output by
|
149
|
+
:meth:`to_dict`.
|
150
|
+
|
151
|
+
Returns:
|
152
|
+
Command: The ``Command`` from the input dictionary.
|
153
|
+
"""
|
154
|
+
# Pulse command data is nested dictionary.
|
155
|
+
# To avoid deepcopy and avoid mutating the source object, create new dict here.
|
156
|
+
in_data = {}
|
157
|
+
for key, value in data.items():
|
158
|
+
if key == "sequence":
|
159
|
+
in_data[key] = list(map(PulseQobjInstruction.from_dict, value))
|
160
|
+
else:
|
161
|
+
in_data[key] = value
|
162
|
+
return cls(**in_data)
|
163
|
+
|
164
|
+
|
165
|
+
class PulseDefaults:
|
166
|
+
"""Description of default settings for Pulse systems. These are instructions or settings that
|
167
|
+
may be good starting points for the Pulse user. The user may modify these defaults for custom
|
168
|
+
scheduling.
|
169
|
+
"""
|
170
|
+
|
171
|
+
_data = {}
|
172
|
+
|
173
|
+
@deprecate_pulse_dependency
|
174
|
+
def __init__(
|
175
|
+
self,
|
176
|
+
qubit_freq_est: List[float],
|
177
|
+
meas_freq_est: List[float],
|
178
|
+
buffer: int,
|
179
|
+
pulse_library: List[PulseLibraryItem],
|
180
|
+
cmd_def: List[Command],
|
181
|
+
meas_kernel: MeasurementKernel = None,
|
182
|
+
discriminator: Discriminator = None,
|
183
|
+
**kwargs: Dict[str, Any],
|
184
|
+
):
|
185
|
+
"""
|
186
|
+
Validate and reformat transport layer inputs to initialize.
|
187
|
+
Args:
|
188
|
+
qubit_freq_est: Estimated qubit frequencies in GHz.
|
189
|
+
meas_freq_est: Estimated measurement cavity frequencies in GHz.
|
190
|
+
buffer: Default buffer time (in units of dt) between pulses.
|
191
|
+
pulse_library: Pulse name and sample definitions.
|
192
|
+
cmd_def: Operation name and definition in terms of Commands.
|
193
|
+
meas_kernel: The measurement kernels
|
194
|
+
discriminator: The discriminators
|
195
|
+
**kwargs: Other attributes for the super class.
|
196
|
+
"""
|
197
|
+
self._data = {}
|
198
|
+
self.buffer = buffer
|
199
|
+
self.qubit_freq_est = [freq * 1e9 for freq in qubit_freq_est]
|
200
|
+
"""Qubit frequencies in Hertz."""
|
201
|
+
self.meas_freq_est = [freq * 1e9 for freq in meas_freq_est]
|
202
|
+
"""Measurement frequencies in Hertz."""
|
203
|
+
self.pulse_library = pulse_library
|
204
|
+
self.cmd_def = cmd_def
|
205
|
+
self.instruction_schedule_map = InstructionScheduleMap()
|
206
|
+
self.converter = QobjToInstructionConverter(pulse_library)
|
207
|
+
|
208
|
+
for inst in cmd_def:
|
209
|
+
entry = PulseQobjDef(converter=self.converter, name=inst.name)
|
210
|
+
entry.define(inst.sequence, user_provided=False)
|
211
|
+
self.instruction_schedule_map._add(
|
212
|
+
instruction_name=inst.name,
|
213
|
+
qubits=tuple(inst.qubits),
|
214
|
+
entry=entry,
|
215
|
+
)
|
216
|
+
|
217
|
+
if meas_kernel is not None:
|
218
|
+
self.meas_kernel = meas_kernel
|
219
|
+
if discriminator is not None:
|
220
|
+
self.discriminator = discriminator
|
221
|
+
|
222
|
+
self._data.update(kwargs)
|
223
|
+
|
224
|
+
def __getattr__(self, name):
|
225
|
+
try:
|
226
|
+
return self._data[name]
|
227
|
+
except KeyError as ex:
|
228
|
+
raise AttributeError(f"Attribute {name} is not defined") from ex
|
229
|
+
|
230
|
+
def to_dict(self):
|
231
|
+
"""Return a dictionary format representation of the PulseDefaults.
|
232
|
+
Returns:
|
233
|
+
dict: The dictionary form of the PulseDefaults.
|
234
|
+
"""
|
235
|
+
out_dict = {
|
236
|
+
"qubit_freq_est": self.qubit_freq_est,
|
237
|
+
"meas_freq_est": self.qubit_freq_est,
|
238
|
+
"buffer": self.buffer,
|
239
|
+
"pulse_library": [x.to_dict() for x in self.pulse_library],
|
240
|
+
"cmd_def": [x.to_dict() for x in self.cmd_def],
|
241
|
+
}
|
242
|
+
if hasattr(self, "meas_kernel"):
|
243
|
+
out_dict["meas_kernel"] = self.meas_kernel.to_dict()
|
244
|
+
if hasattr(self, "discriminator"):
|
245
|
+
out_dict["discriminator"] = self.discriminator.to_dict()
|
246
|
+
for key, value in self.__dict__.items():
|
247
|
+
if key not in [
|
248
|
+
"qubit_freq_est",
|
249
|
+
"meas_freq_est",
|
250
|
+
"buffer",
|
251
|
+
"pulse_library",
|
252
|
+
"cmd_def",
|
253
|
+
"meas_kernel",
|
254
|
+
"discriminator",
|
255
|
+
"converter",
|
256
|
+
"instruction_schedule_map",
|
257
|
+
]:
|
258
|
+
out_dict[key] = value
|
259
|
+
out_dict.update(self._data)
|
260
|
+
|
261
|
+
out_dict["qubit_freq_est"] = [freq * 1e-9 for freq in self.qubit_freq_est]
|
262
|
+
out_dict["meas_freq_est"] = [freq * 1e-9 for freq in self.meas_freq_est]
|
263
|
+
return out_dict
|
264
|
+
|
265
|
+
@classmethod
|
266
|
+
def from_dict(cls, data):
|
267
|
+
"""Create a new PulseDefaults object from a dictionary.
|
268
|
+
|
269
|
+
Args:
|
270
|
+
data (dict): A dictionary representing the PulseDefaults
|
271
|
+
to create. It will be in the same format as output by
|
272
|
+
:meth:`to_dict`.
|
273
|
+
Returns:
|
274
|
+
PulseDefaults: The PulseDefaults from the input dictionary.
|
275
|
+
"""
|
276
|
+
schema = {
|
277
|
+
"pulse_library": PulseLibraryItem, # The class PulseLibraryItem is deprecated
|
278
|
+
"cmd_def": Command,
|
279
|
+
"meas_kernel": MeasurementKernel,
|
280
|
+
"discriminator": Discriminator,
|
281
|
+
}
|
282
|
+
|
283
|
+
# Pulse defaults data is nested dictionary.
|
284
|
+
# To avoid deepcopy and avoid mutating the source object, create new dict here.
|
285
|
+
in_data = {}
|
286
|
+
for key, value in data.items():
|
287
|
+
if key in schema:
|
288
|
+
with warnings.catch_warnings():
|
289
|
+
# The class PulseLibraryItem is deprecated
|
290
|
+
warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
|
291
|
+
if isinstance(value, list):
|
292
|
+
in_data[key] = list(map(schema[key].from_dict, value))
|
293
|
+
else:
|
294
|
+
in_data[key] = schema[key].from_dict(value)
|
295
|
+
else:
|
296
|
+
in_data[key] = value
|
297
|
+
|
298
|
+
return cls(**in_data)
|
299
|
+
|
300
|
+
def __str__(self):
|
301
|
+
qubit_freqs = [freq / 1e9 for freq in self.qubit_freq_est]
|
302
|
+
meas_freqs = [freq / 1e9 for freq in self.meas_freq_est]
|
303
|
+
qfreq = f"Qubit Frequencies [GHz]\n{qubit_freqs}"
|
304
|
+
mfreq = f"Measurement Frequencies [GHz]\n{meas_freqs} "
|
305
|
+
return f"<{self.__class__.__name__}({str(self.instruction_schedule_map)}{qfreq}\n{mfreq})>"
|
@@ -0,0 +1,273 @@
|
|
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
|
+
"""Container class for backend options."""
|
14
|
+
|
15
|
+
import io
|
16
|
+
from collections.abc import Mapping
|
17
|
+
|
18
|
+
|
19
|
+
class Options(Mapping):
|
20
|
+
"""Base options object
|
21
|
+
|
22
|
+
This class is what all backend options are based
|
23
|
+
on. The properties of the class are intended to be all dynamically
|
24
|
+
adjustable so that a user can reconfigure the backend on demand. If a
|
25
|
+
property is immutable to the user (eg something like number of qubits)
|
26
|
+
that should be a configuration of the backend class itself instead of the
|
27
|
+
options.
|
28
|
+
|
29
|
+
Instances of this class behave like dictionaries. Accessing an
|
30
|
+
option with a default value can be done with the `get()` method:
|
31
|
+
|
32
|
+
>>> options = Options(opt1=1, opt2=2)
|
33
|
+
>>> options.get("opt1")
|
34
|
+
1
|
35
|
+
>>> options.get("opt3", default="hello")
|
36
|
+
'hello'
|
37
|
+
|
38
|
+
Key-value pairs for all options can be retrieved using the `items()` method:
|
39
|
+
|
40
|
+
>>> list(options.items())
|
41
|
+
[('opt1', 1), ('opt2', 2)]
|
42
|
+
|
43
|
+
Options can be updated by name:
|
44
|
+
|
45
|
+
>>> options["opt1"] = 3
|
46
|
+
>>> options.get("opt1")
|
47
|
+
3
|
48
|
+
|
49
|
+
Runtime validators can be registered. See `set_validator`.
|
50
|
+
Updates through `update_options` and indexing (`__setitem__`) validate
|
51
|
+
the new value before performing the update and raise `ValueError` if
|
52
|
+
the new value is invalid.
|
53
|
+
|
54
|
+
>>> options.set_validator("opt1", (1, 5))
|
55
|
+
>>> options["opt1"] = 4
|
56
|
+
>>> options["opt1"]
|
57
|
+
4
|
58
|
+
>>> options["opt1"] = 10 # doctest: +ELLIPSIS
|
59
|
+
Traceback (most recent call last):
|
60
|
+
...
|
61
|
+
ValueError: ...
|
62
|
+
"""
|
63
|
+
|
64
|
+
# Here there are dragons.
|
65
|
+
|
66
|
+
# This class preamble is an abhorrent hack to make `Options` work similarly to a
|
67
|
+
# SimpleNamespace, but with its instance methods and attributes in a separate namespace. This
|
68
|
+
# is required to make the initial release of Qiskit Terra 0.19 compatible with already released
|
69
|
+
# versions of Qiskit Experiments, which rely on both of
|
70
|
+
# options.my_key = my_value
|
71
|
+
# transpile(qc, **options.__dict__)
|
72
|
+
# working.
|
73
|
+
#
|
74
|
+
# Making `__dict__` a property which gets a slotted attribute solves the second line. The
|
75
|
+
# slotted attributes are not stored in a `__dict__` anyway, and `__slots__` classes suppress the
|
76
|
+
# creation of `__dict__`. That leaves it free for us to override it with a property, which
|
77
|
+
# returns the options namespace `_fields`.
|
78
|
+
#
|
79
|
+
# We need to make attribute setting simply set options as well, to support statements of the
|
80
|
+
# form `options.key = value`. We also need to ensure that existing uses do not override any new
|
81
|
+
# methods. We do this by overriding `__setattr__` to purely write into our `_fields` dict
|
82
|
+
# instead. This has the highly unusual behavior that
|
83
|
+
# >>> options = Options()
|
84
|
+
# >>> options.validator = "my validator option setting"
|
85
|
+
# >>> options.validator
|
86
|
+
# {}
|
87
|
+
# >>> options.get("validator")
|
88
|
+
# "my validator option setting"
|
89
|
+
# This is the most we can do to support the old interface; _getting_ attributes must return the
|
90
|
+
# new forms where appropriate, but setting will work with anything. All options can always be
|
91
|
+
# returned by `Options.get`. To initialise the attributes in `__init__`, we need to dodge the
|
92
|
+
# overriding of `__setattr__`, and upcall to `object.__setattr__`.
|
93
|
+
#
|
94
|
+
# To support copying and pickling, we also have to define how to set our state, because Python's
|
95
|
+
# normal way of trying to get attributes in the unpickle will fail.
|
96
|
+
#
|
97
|
+
# This is a terrible hack, and is purely to ensure that Terra 0.19 does not break versions of
|
98
|
+
# other Qiskit-family packages that are already deployed. It should be removed as soon as
|
99
|
+
# possible.
|
100
|
+
|
101
|
+
__slots__ = ("_fields", "validator")
|
102
|
+
|
103
|
+
# implementation of the Mapping ABC:
|
104
|
+
|
105
|
+
def __getitem__(self, key):
|
106
|
+
return self._fields[key]
|
107
|
+
|
108
|
+
def __iter__(self):
|
109
|
+
return iter(self._fields)
|
110
|
+
|
111
|
+
def __len__(self):
|
112
|
+
return len(self._fields)
|
113
|
+
|
114
|
+
# Allow modifying the options (validated)
|
115
|
+
|
116
|
+
def __setitem__(self, key, value):
|
117
|
+
self.update_options(**{key: value})
|
118
|
+
|
119
|
+
# backwards-compatibility with Qiskit Experiments:
|
120
|
+
|
121
|
+
@property
|
122
|
+
def __dict__(self):
|
123
|
+
return self._fields
|
124
|
+
|
125
|
+
# SimpleNamespace-like access to options:
|
126
|
+
|
127
|
+
def __getattr__(self, name):
|
128
|
+
# This does not interrupt the normal lookup of things like methods or `_fields`, because
|
129
|
+
# those are successfully resolved by the normal Python lookup apparatus. If we are here,
|
130
|
+
# then lookup has failed, so we must be looking for an option. If the user has manually
|
131
|
+
# called `self.__getattr__("_fields")` then they'll get the option not the full dict, but
|
132
|
+
# that's not really our fault. `getattr(self, "_fields")` will still find the dict.
|
133
|
+
try:
|
134
|
+
return self._fields[name]
|
135
|
+
except KeyError as ex:
|
136
|
+
raise AttributeError(f"Option {name} is not defined") from ex
|
137
|
+
|
138
|
+
# setting options with the namespace interface is not validated
|
139
|
+
def __setattr__(self, key, value):
|
140
|
+
self._fields[key] = value
|
141
|
+
|
142
|
+
# custom pickling:
|
143
|
+
|
144
|
+
def __getstate__(self):
|
145
|
+
return (self._fields, self.validator)
|
146
|
+
|
147
|
+
def __setstate__(self, state):
|
148
|
+
_fields, validator = state
|
149
|
+
super().__setattr__("_fields", _fields)
|
150
|
+
super().__setattr__("validator", validator)
|
151
|
+
|
152
|
+
def __copy__(self):
|
153
|
+
"""Return a copy of the Options.
|
154
|
+
|
155
|
+
The returned option and validator values are shallow copies of the originals.
|
156
|
+
"""
|
157
|
+
out = self.__new__(type(self)) # pylint:disable=no-value-for-parameter
|
158
|
+
out.__setstate__((self._fields.copy(), self.validator.copy()))
|
159
|
+
return out
|
160
|
+
|
161
|
+
def __init__(self, **kwargs):
|
162
|
+
super().__setattr__("_fields", kwargs)
|
163
|
+
super().__setattr__("validator", {})
|
164
|
+
|
165
|
+
# The eldritch horrors are over, and normal service resumes below. Beware that while
|
166
|
+
# `__setattr__` is overridden, you cannot do `self.x = y` (but `self.x[key] = y` is fine). This
|
167
|
+
# should not be necessary, but if _absolutely_ required, you must do
|
168
|
+
# super().__setattr__("x", y)
|
169
|
+
# to avoid just setting a value in `_fields`.
|
170
|
+
|
171
|
+
def __repr__(self):
|
172
|
+
items = (f"{k}={v!r}" for k, v in self._fields.items())
|
173
|
+
return f"{type(self).__name__}({', '.join(items)})"
|
174
|
+
|
175
|
+
def __eq__(self, other):
|
176
|
+
if isinstance(self, Options) and isinstance(other, Options):
|
177
|
+
return self._fields == other._fields
|
178
|
+
return NotImplemented
|
179
|
+
|
180
|
+
def set_validator(self, field, validator_value):
|
181
|
+
"""Set an optional validator for a field in the options
|
182
|
+
|
183
|
+
Setting a validator enables changes to an options values to be
|
184
|
+
validated for correctness when :meth:`~qiskit.providers.Options.update_options`
|
185
|
+
is called. For example if you have a numeric field like
|
186
|
+
``shots`` you can specify a bounds tuple that set an upper and lower
|
187
|
+
bound on the value such as::
|
188
|
+
|
189
|
+
options.set_validator("shots", (1, 4096))
|
190
|
+
|
191
|
+
In this case whenever the ``"shots"`` option is updated by the user
|
192
|
+
it will enforce that the value is >=1 and <=4096. A ``ValueError`` will
|
193
|
+
be raised if it's outside those bounds. If a validator is already present
|
194
|
+
for the specified field it will be silently overridden.
|
195
|
+
|
196
|
+
Args:
|
197
|
+
field (str): The field name to set the validator on
|
198
|
+
validator_value (list or tuple or type): The value to use for the
|
199
|
+
validator depending on the type indicates on how the value for
|
200
|
+
a field is enforced. If a tuple is passed in it must have a
|
201
|
+
length of two and will enforce the min and max value
|
202
|
+
(inclusive) for an integer or float value option. If it's a
|
203
|
+
list it will list the valid values for a field. If it's a
|
204
|
+
``type`` the validator will just enforce the value is of a
|
205
|
+
certain type.
|
206
|
+
Raises:
|
207
|
+
KeyError: If field is not present in the options object
|
208
|
+
ValueError: If the ``validator_value`` has an invalid value for a
|
209
|
+
given type
|
210
|
+
TypeError: If ``validator_value`` is not a valid type
|
211
|
+
"""
|
212
|
+
|
213
|
+
if field not in self._fields:
|
214
|
+
raise KeyError(f"Field '{field}' is not present in this options object")
|
215
|
+
if isinstance(validator_value, tuple):
|
216
|
+
if len(validator_value) != 2:
|
217
|
+
raise ValueError(
|
218
|
+
"A tuple validator must be of the form '(lower, upper)' "
|
219
|
+
"where lower and upper are the lower and upper bounds "
|
220
|
+
"inclusive of the numeric value"
|
221
|
+
)
|
222
|
+
elif isinstance(validator_value, list):
|
223
|
+
if len(validator_value) == 0:
|
224
|
+
raise ValueError("A list validator must have at least one entry")
|
225
|
+
elif isinstance(validator_value, type):
|
226
|
+
pass
|
227
|
+
else:
|
228
|
+
raise TypeError(
|
229
|
+
f"{type(validator_value)} is not a valid validator type, it "
|
230
|
+
"must be a tuple, list, or class/type"
|
231
|
+
)
|
232
|
+
self.validator[field] = validator_value # pylint: disable=unsupported-assignment-operation
|
233
|
+
|
234
|
+
def update_options(self, **fields):
|
235
|
+
"""Update options with kwargs"""
|
236
|
+
for field_name, field in fields.items():
|
237
|
+
field_validator = self.validator.get(field_name, None)
|
238
|
+
if isinstance(field_validator, tuple):
|
239
|
+
if field > field_validator[1] or field < field_validator[0]:
|
240
|
+
raise ValueError(
|
241
|
+
f"Specified value for '{field_name}' is not a valid value, "
|
242
|
+
f"must be >={field_validator[0]} or <={field_validator[1]}"
|
243
|
+
)
|
244
|
+
elif isinstance(field_validator, list):
|
245
|
+
if field not in field_validator:
|
246
|
+
raise ValueError(
|
247
|
+
f"Specified value for {field_name} is not a valid choice, "
|
248
|
+
f"must be one of {field_validator}"
|
249
|
+
)
|
250
|
+
elif isinstance(field_validator, type):
|
251
|
+
if not isinstance(field, field_validator):
|
252
|
+
raise TypeError(
|
253
|
+
f"Specified value for {field_name} is not of required type {field_validator}"
|
254
|
+
)
|
255
|
+
|
256
|
+
self._fields.update(fields)
|
257
|
+
|
258
|
+
def __str__(self):
|
259
|
+
no_validator = super().__str__()
|
260
|
+
if not self.validator:
|
261
|
+
return no_validator
|
262
|
+
else:
|
263
|
+
out_str = io.StringIO()
|
264
|
+
out_str.write(no_validator)
|
265
|
+
out_str.write("\nWhere:\n")
|
266
|
+
for field, value in self.validator.items():
|
267
|
+
if isinstance(value, tuple):
|
268
|
+
out_str.write(f"\t{field} is >= {value[0]} and <= {value[1]}\n")
|
269
|
+
elif isinstance(value, list):
|
270
|
+
out_str.write(f"\t{field} is one of {value}\n")
|
271
|
+
elif isinstance(value, type):
|
272
|
+
out_str.write(f"\t{field} is of type {value}\n")
|
273
|
+
return out_str.getvalue()
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 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
|
+
"""Base class for a provider."""
|
14
|
+
|
15
|
+
from abc import ABC, abstractmethod
|
16
|
+
|
17
|
+
from qiskit.providers.exceptions import QiskitBackendNotFoundError
|
18
|
+
from qiskit.utils import deprecate_func
|
19
|
+
|
20
|
+
|
21
|
+
class Provider:
|
22
|
+
"""Base common type for all versioned Provider abstract classes.
|
23
|
+
|
24
|
+
Note this class should not be inherited from directly, it is intended
|
25
|
+
to be used for type checking. When implementing a provider you should use
|
26
|
+
the versioned abstract classes as the parent class and not this class
|
27
|
+
directly.
|
28
|
+
"""
|
29
|
+
|
30
|
+
version = 0
|
31
|
+
|
32
|
+
@deprecate_func(
|
33
|
+
since=1.1,
|
34
|
+
additional_msg="The abstract Provider and ProviderV1 classes are deprecated and will be "
|
35
|
+
"removed in 2.0. You can just remove it as the parent class and a `get_backend` "
|
36
|
+
"method that returns the backends from `self.backend`.",
|
37
|
+
)
|
38
|
+
def __init__(self):
|
39
|
+
pass
|
40
|
+
|
41
|
+
|
42
|
+
class ProviderV1(Provider, ABC):
|
43
|
+
"""Base class for a Backend Provider."""
|
44
|
+
|
45
|
+
version = 1
|
46
|
+
|
47
|
+
@deprecate_func(
|
48
|
+
since=1.1,
|
49
|
+
additional_msg="The abstract Provider and ProviderV1 classes are deprecated and will be "
|
50
|
+
"removed in 2.0. You can just remove it as the parent class and a `get_backend` "
|
51
|
+
"method that returns the backends from `self.backend`.",
|
52
|
+
)
|
53
|
+
def get_backend(self, name=None, **kwargs):
|
54
|
+
"""Return a single backend matching the specified filtering.
|
55
|
+
|
56
|
+
Args:
|
57
|
+
name (str): name of the backend.
|
58
|
+
**kwargs: dict used for filtering.
|
59
|
+
|
60
|
+
Returns:
|
61
|
+
Backend: a backend matching the filtering.
|
62
|
+
|
63
|
+
Raises:
|
64
|
+
QiskitBackendNotFoundError: if no backend could be found or
|
65
|
+
more than one backend matches the filtering criteria.
|
66
|
+
"""
|
67
|
+
backends = self.backends(name, **kwargs)
|
68
|
+
if len(backends) > 1:
|
69
|
+
raise QiskitBackendNotFoundError("More than one backend matches the criteria")
|
70
|
+
if not backends:
|
71
|
+
raise QiskitBackendNotFoundError("No backend matches the criteria")
|
72
|
+
|
73
|
+
return backends[0]
|
74
|
+
|
75
|
+
@abstractmethod
|
76
|
+
def backends(self, name=None, **kwargs):
|
77
|
+
"""Return a list of backends matching the specified filtering.
|
78
|
+
|
79
|
+
Args:
|
80
|
+
name (str): name of the backend.
|
81
|
+
**kwargs: dict used for filtering.
|
82
|
+
|
83
|
+
Returns:
|
84
|
+
list[Backend]: a list of Backends that match the filtering
|
85
|
+
criteria.
|
86
|
+
"""
|
87
|
+
pass
|
88
|
+
|
89
|
+
def __eq__(self, other):
|
90
|
+
"""Equality comparison.
|
91
|
+
|
92
|
+
By default, it is assumed that two `Providers` from the same class are
|
93
|
+
equal. Subclassed providers can override this behavior.
|
94
|
+
"""
|
95
|
+
return type(self).__name__ == type(other).__name__
|