qiskit 2.0.3__cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -0
- qiskit/__init__.py +141 -0
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +73 -0
- qiskit/circuit/__init__.py +1343 -0
- qiskit/circuit/_add_control.py +312 -0
- qiskit/circuit/_classical_resource_map.py +150 -0
- qiskit/circuit/_standard_gates_commutations.py +3849 -0
- qiskit/circuit/_utils.py +167 -0
- qiskit/circuit/annotated_operation.py +279 -0
- qiskit/circuit/barrier.py +46 -0
- qiskit/circuit/classical/__init__.py +41 -0
- qiskit/circuit/classical/expr/__init__.py +266 -0
- qiskit/circuit/classical/expr/constructors.py +764 -0
- qiskit/circuit/classical/expr/expr.py +498 -0
- qiskit/circuit/classical/expr/visitors.py +375 -0
- qiskit/circuit/classical/types/__init__.py +113 -0
- qiskit/circuit/classical/types/ordering.py +229 -0
- qiskit/circuit/classical/types/types.py +153 -0
- qiskit/circuit/commutation_checker.py +133 -0
- qiskit/circuit/commutation_library.py +20 -0
- qiskit/circuit/controlflow/__init__.py +59 -0
- qiskit/circuit/controlflow/_builder_utils.py +211 -0
- qiskit/circuit/controlflow/box.py +163 -0
- qiskit/circuit/controlflow/break_loop.py +56 -0
- qiskit/circuit/controlflow/builder.py +791 -0
- qiskit/circuit/controlflow/continue_loop.py +56 -0
- qiskit/circuit/controlflow/control_flow.py +94 -0
- qiskit/circuit/controlflow/for_loop.py +218 -0
- qiskit/circuit/controlflow/if_else.py +498 -0
- qiskit/circuit/controlflow/switch_case.py +411 -0
- qiskit/circuit/controlflow/while_loop.py +166 -0
- qiskit/circuit/controlledgate.py +274 -0
- qiskit/circuit/delay.py +157 -0
- qiskit/circuit/duration.py +80 -0
- qiskit/circuit/equivalence.py +94 -0
- qiskit/circuit/equivalence_library.py +18 -0
- qiskit/circuit/exceptions.py +19 -0
- qiskit/circuit/gate.py +261 -0
- qiskit/circuit/instruction.py +564 -0
- qiskit/circuit/instructionset.py +132 -0
- qiskit/circuit/library/__init__.py +984 -0
- qiskit/circuit/library/arithmetic/__init__.py +40 -0
- qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +235 -0
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +131 -0
- qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
- qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -0
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +201 -0
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +502 -0
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +387 -0
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +493 -0
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
- qiskit/circuit/library/arithmetic/quadratic_form.py +364 -0
- qiskit/circuit/library/arithmetic/weighted_adder.py +409 -0
- qiskit/circuit/library/basis_change/__init__.py +15 -0
- qiskit/circuit/library/basis_change/qft.py +316 -0
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +316 -0
- qiskit/circuit/library/boolean_logic/__init__.py +18 -0
- qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
- qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
- qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
- qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -0
- qiskit/circuit/library/data_preparation/__init__.py +57 -0
- qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
- qiskit/circuit/library/data_preparation/initializer.py +107 -0
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
- qiskit/circuit/library/fourier_checking.py +160 -0
- qiskit/circuit/library/generalized_gates/__init__.py +30 -0
- qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
- qiskit/circuit/library/generalized_gates/gms.py +175 -0
- qiskit/circuit/library/generalized_gates/gr.py +219 -0
- qiskit/circuit/library/generalized_gates/isometry.py +370 -0
- qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
- qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
- qiskit/circuit/library/generalized_gates/pauli.py +84 -0
- qiskit/circuit/library/generalized_gates/permutation.py +198 -0
- qiskit/circuit/library/generalized_gates/rv.py +96 -0
- qiskit/circuit/library/generalized_gates/uc.py +303 -0
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
- qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
- qiskit/circuit/library/generalized_gates/ucry.py +32 -0
- qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
- qiskit/circuit/library/generalized_gates/unitary.py +217 -0
- qiskit/circuit/library/graph_state.py +172 -0
- qiskit/circuit/library/grover_operator.py +583 -0
- qiskit/circuit/library/hamiltonian_gate.py +142 -0
- qiskit/circuit/library/hidden_linear_function.py +163 -0
- qiskit/circuit/library/iqp.py +180 -0
- qiskit/circuit/library/n_local/__init__.py +45 -0
- qiskit/circuit/library/n_local/efficient_su2.py +282 -0
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +303 -0
- qiskit/circuit/library/n_local/n_local.py +1477 -0
- qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
- qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
- qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
- qiskit/circuit/library/n_local/two_local.py +289 -0
- qiskit/circuit/library/overlap.py +183 -0
- qiskit/circuit/library/pauli_evolution.py +201 -0
- qiskit/circuit/library/phase_estimation.py +177 -0
- qiskit/circuit/library/phase_oracle.py +239 -0
- qiskit/circuit/library/quantum_volume.py +180 -0
- qiskit/circuit/library/standard_gates/__init__.py +141 -0
- qiskit/circuit/library/standard_gates/dcx.py +77 -0
- qiskit/circuit/library/standard_gates/ecr.py +129 -0
- qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
- qiskit/circuit/library/standard_gates/global_phase.py +84 -0
- qiskit/circuit/library/standard_gates/h.py +253 -0
- qiskit/circuit/library/standard_gates/i.py +76 -0
- qiskit/circuit/library/standard_gates/iswap.py +133 -0
- qiskit/circuit/library/standard_gates/p.py +422 -0
- qiskit/circuit/library/standard_gates/r.py +114 -0
- qiskit/circuit/library/standard_gates/rx.py +293 -0
- qiskit/circuit/library/standard_gates/rxx.py +180 -0
- qiskit/circuit/library/standard_gates/ry.py +286 -0
- qiskit/circuit/library/standard_gates/ryy.py +180 -0
- qiskit/circuit/library/standard_gates/rz.py +307 -0
- qiskit/circuit/library/standard_gates/rzx.py +226 -0
- qiskit/circuit/library/standard_gates/rzz.py +193 -0
- qiskit/circuit/library/standard_gates/s.py +419 -0
- qiskit/circuit/library/standard_gates/swap.py +281 -0
- qiskit/circuit/library/standard_gates/sx.py +310 -0
- qiskit/circuit/library/standard_gates/t.py +178 -0
- qiskit/circuit/library/standard_gates/u.py +395 -0
- qiskit/circuit/library/standard_gates/u1.py +490 -0
- qiskit/circuit/library/standard_gates/u2.py +145 -0
- qiskit/circuit/library/standard_gates/u3.py +428 -0
- qiskit/circuit/library/standard_gates/x.py +1481 -0
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +202 -0
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +236 -0
- qiskit/circuit/library/standard_gates/y.py +257 -0
- qiskit/circuit/library/standard_gates/z.py +338 -0
- qiskit/circuit/library/templates/__init__.py +92 -0
- qiskit/circuit/library/templates/clifford/__init__.py +33 -0
- qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
- qiskit/circuit/library/templates/nct/__init__.py +67 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
- qiskit/circuit/library/templates/rzx/__init__.py +25 -0
- qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
- qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
- qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
- qiskit/circuit/measure.py +53 -0
- qiskit/circuit/operation.py +68 -0
- qiskit/circuit/parameter.py +179 -0
- qiskit/circuit/parameterexpression.py +703 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +140 -0
- qiskit/circuit/quantumcircuit.py +7540 -0
- qiskit/circuit/quantumcircuitdata.py +136 -0
- qiskit/circuit/random/__init__.py +15 -0
- qiskit/circuit/random/utils.py +366 -0
- qiskit/circuit/reset.py +37 -0
- qiskit/circuit/singleton.py +600 -0
- qiskit/circuit/store.py +89 -0
- qiskit/circuit/tools/__init__.py +16 -0
- qiskit/circuit/tools/pi_check.py +193 -0
- qiskit/circuit/twirling.py +145 -0
- qiskit/compiler/__init__.py +27 -0
- qiskit/compiler/transpiler.py +375 -0
- qiskit/converters/__init__.py +74 -0
- qiskit/converters/circuit_to_dag.py +80 -0
- qiskit/converters/circuit_to_dagdependency.py +49 -0
- qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
- qiskit/converters/circuit_to_gate.py +107 -0
- qiskit/converters/circuit_to_instruction.py +142 -0
- qiskit/converters/dag_to_circuit.py +79 -0
- qiskit/converters/dag_to_dagdependency.py +54 -0
- qiskit/converters/dag_to_dagdependency_v2.py +43 -0
- qiskit/converters/dagdependency_to_circuit.py +40 -0
- qiskit/converters/dagdependency_to_dag.py +48 -0
- qiskit/dagcircuit/__init__.py +55 -0
- qiskit/dagcircuit/collect_blocks.py +407 -0
- qiskit/dagcircuit/dagcircuit.py +24 -0
- qiskit/dagcircuit/dagdependency.py +612 -0
- qiskit/dagcircuit/dagdependency_v2.py +566 -0
- qiskit/dagcircuit/dagdepnode.py +160 -0
- qiskit/dagcircuit/dagnode.py +188 -0
- qiskit/dagcircuit/exceptions.py +42 -0
- qiskit/exceptions.py +153 -0
- qiskit/passmanager/__init__.py +258 -0
- qiskit/passmanager/base_tasks.py +230 -0
- qiskit/passmanager/compilation_status.py +74 -0
- qiskit/passmanager/exceptions.py +19 -0
- qiskit/passmanager/flow_controllers.py +116 -0
- qiskit/passmanager/passmanager.py +353 -0
- qiskit/primitives/__init__.py +490 -0
- qiskit/primitives/backend_estimator_v2.py +530 -0
- qiskit/primitives/backend_sampler_v2.py +339 -0
- qiskit/primitives/base/__init__.py +20 -0
- qiskit/primitives/base/base_estimator.py +247 -0
- qiskit/primitives/base/base_primitive_job.py +78 -0
- qiskit/primitives/base/base_primitive_v1.py +45 -0
- qiskit/primitives/base/base_result_v1.py +65 -0
- qiskit/primitives/base/base_sampler.py +196 -0
- qiskit/primitives/base/estimator_result_v1.py +46 -0
- qiskit/primitives/base/sampler_result_v1.py +45 -0
- qiskit/primitives/base/validation_v1.py +250 -0
- qiskit/primitives/containers/__init__.py +26 -0
- qiskit/primitives/containers/bindings_array.py +391 -0
- qiskit/primitives/containers/bit_array.py +764 -0
- qiskit/primitives/containers/data_bin.py +175 -0
- qiskit/primitives/containers/estimator_pub.py +222 -0
- qiskit/primitives/containers/object_array.py +94 -0
- qiskit/primitives/containers/observables_array.py +296 -0
- qiskit/primitives/containers/primitive_result.py +53 -0
- qiskit/primitives/containers/pub_result.py +51 -0
- qiskit/primitives/containers/sampler_pub.py +193 -0
- qiskit/primitives/containers/sampler_pub_result.py +74 -0
- qiskit/primitives/containers/shape.py +129 -0
- qiskit/primitives/primitive_job.py +81 -0
- qiskit/primitives/statevector_estimator.py +175 -0
- qiskit/primitives/statevector_sampler.py +290 -0
- qiskit/primitives/utils.py +72 -0
- qiskit/providers/__init__.py +677 -0
- qiskit/providers/backend.py +364 -0
- qiskit/providers/basic_provider/__init__.py +47 -0
- qiskit/providers/basic_provider/basic_provider.py +121 -0
- qiskit/providers/basic_provider/basic_provider_job.py +65 -0
- qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
- qiskit/providers/basic_provider/basic_simulator.py +693 -0
- qiskit/providers/basic_provider/exceptions.py +30 -0
- qiskit/providers/exceptions.py +33 -0
- qiskit/providers/fake_provider/__init__.py +69 -0
- qiskit/providers/fake_provider/generic_backend_v2.py +374 -0
- qiskit/providers/fake_provider/utils/__init__.py +15 -0
- qiskit/providers/job.py +147 -0
- qiskit/providers/jobstatus.py +30 -0
- qiskit/providers/options.py +273 -0
- qiskit/providers/providerutils.py +110 -0
- qiskit/qasm/libs/dummy/stdgates.inc +75 -0
- qiskit/qasm/libs/qelib1.inc +266 -0
- qiskit/qasm/libs/stdgates.inc +82 -0
- qiskit/qasm2/__init__.py +669 -0
- qiskit/qasm2/exceptions.py +27 -0
- qiskit/qasm2/export.py +364 -0
- qiskit/qasm2/parse.py +438 -0
- qiskit/qasm3/__init__.py +372 -0
- qiskit/qasm3/ast.py +782 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1340 -0
- qiskit/qasm3/printer.py +608 -0
- qiskit/qpy/__init__.py +1965 -0
- qiskit/qpy/binary_io/__init__.py +35 -0
- qiskit/qpy/binary_io/circuits.py +1455 -0
- qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
- qiskit/qpy/binary_io/schedules.py +308 -0
- qiskit/qpy/binary_io/value.py +1165 -0
- qiskit/qpy/common.py +353 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +442 -0
- qiskit/qpy/interface.py +344 -0
- qiskit/qpy/type_keys.py +409 -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 +104 -0
- qiskit/quantum_info/analysis/make_observable.py +44 -0
- qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
- qiskit/quantum_info/operators/__init__.py +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 +373 -0
- qiskit/quantum_info/operators/channel/transformations.py +490 -0
- qiskit/quantum_info/operators/custom_iterator.py +48 -0
- qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
- qiskit/quantum_info/operators/dihedral/dihedral.py +511 -0
- qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
- qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
- qiskit/quantum_info/operators/dihedral/random.py +64 -0
- qiskit/quantum_info/operators/linear_op.py +25 -0
- qiskit/quantum_info/operators/measures.py +418 -0
- qiskit/quantum_info/operators/mixins/__init__.py +52 -0
- qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
- qiskit/quantum_info/operators/mixins/group.py +171 -0
- qiskit/quantum_info/operators/mixins/linear.py +84 -0
- qiskit/quantum_info/operators/mixins/multiply.py +62 -0
- qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
- qiskit/quantum_info/operators/op_shape.py +525 -0
- qiskit/quantum_info/operators/operator.py +869 -0
- qiskit/quantum_info/operators/operator_utils.py +76 -0
- qiskit/quantum_info/operators/predicates.py +183 -0
- qiskit/quantum_info/operators/random.py +154 -0
- qiskit/quantum_info/operators/scalar_op.py +254 -0
- qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
- qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
- qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
- qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -0
- qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
- qiskit/quantum_info/operators/symplectic/random.py +117 -0
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1239 -0
- qiskit/quantum_info/operators/utils/__init__.py +20 -0
- qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
- qiskit/quantum_info/operators/utils/commutator.py +36 -0
- qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
- qiskit/quantum_info/quaternion.py +156 -0
- qiskit/quantum_info/random.py +26 -0
- qiskit/quantum_info/states/__init__.py +28 -0
- qiskit/quantum_info/states/densitymatrix.py +857 -0
- qiskit/quantum_info/states/measures.py +288 -0
- qiskit/quantum_info/states/quantum_state.py +503 -0
- qiskit/quantum_info/states/random.py +157 -0
- qiskit/quantum_info/states/stabilizerstate.py +805 -0
- qiskit/quantum_info/states/statevector.py +977 -0
- qiskit/quantum_info/states/utils.py +247 -0
- qiskit/result/__init__.py +61 -0
- qiskit/result/counts.py +189 -0
- qiskit/result/distributions/__init__.py +17 -0
- qiskit/result/distributions/probability.py +100 -0
- qiskit/result/distributions/quasi.py +154 -0
- qiskit/result/exceptions.py +40 -0
- qiskit/result/models.py +241 -0
- qiskit/result/postprocess.py +239 -0
- qiskit/result/result.py +385 -0
- qiskit/result/sampled_expval.py +74 -0
- qiskit/result/utils.py +294 -0
- qiskit/synthesis/__init__.py +240 -0
- qiskit/synthesis/arithmetic/__init__.py +18 -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/comparators/__init__.py +16 -0
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/synthesis/boolean/__init__.py +13 -0
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/clifford/__init__.py +19 -0
- qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
- qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
- qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
- qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
- qiskit/synthesis/cnotdihedral/__init__.py +17 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
- qiskit/synthesis/discrete_basis/__init__.py +16 -0
- qiskit/synthesis/discrete_basis/commutator_decompose.py +265 -0
- qiskit/synthesis/discrete_basis/gate_sequence.py +421 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +165 -0
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +240 -0
- qiskit/synthesis/evolution/__init__.py +21 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +120 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +313 -0
- qiskit/synthesis/evolution/qdrift.py +130 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +224 -0
- qiskit/synthesis/linear/__init__.py +26 -0
- qiskit/synthesis/linear/cnot_synth.py +69 -0
- qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
- qiskit/synthesis/linear/linear_depth_lnn.py +61 -0
- qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
- qiskit/synthesis/linear_phase/__init__.py +17 -0
- qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +61 -0
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
- qiskit/synthesis/multi_controlled/__init__.py +25 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +359 -0
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -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 +20 -0
- qiskit/synthesis/two_qubit/local_invariance.py +63 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +583 -0
- qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
- qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
- qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
- qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
- qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
- qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
- qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
- qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
- qiskit/synthesis/unitary/__init__.py +13 -0
- qiskit/synthesis/unitary/aqc/__init__.py +177 -0
- qiskit/synthesis/unitary/aqc/approximate.py +116 -0
- qiskit/synthesis/unitary/aqc/aqc.py +175 -0
- qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
- qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
- qiskit/synthesis/unitary/qsd.py +288 -0
- qiskit/transpiler/__init__.py +1345 -0
- qiskit/transpiler/basepasses.py +190 -0
- qiskit/transpiler/coupling.py +500 -0
- qiskit/transpiler/exceptions.py +59 -0
- qiskit/transpiler/instruction_durations.py +281 -0
- qiskit/transpiler/layout.py +740 -0
- qiskit/transpiler/passes/__init__.py +276 -0
- qiskit/transpiler/passes/analysis/__init__.py +23 -0
- qiskit/transpiler/passes/analysis/count_ops.py +30 -0
- qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
- qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
- qiskit/transpiler/passes/analysis/depth.py +33 -0
- qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
- qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
- qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
- qiskit/transpiler/passes/analysis/size.py +36 -0
- qiskit/transpiler/passes/analysis/width.py +27 -0
- qiskit/transpiler/passes/basis/__init__.py +19 -0
- qiskit/transpiler/passes/basis/basis_translator.py +138 -0
- qiskit/transpiler/passes/basis/decompose.py +137 -0
- qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +84 -0
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +110 -0
- qiskit/transpiler/passes/layout/__init__.py +26 -0
- qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
- qiskit/transpiler/passes/layout/apply_layout.py +128 -0
- qiskit/transpiler/passes/layout/csp_layout.py +132 -0
- qiskit/transpiler/passes/layout/dense_layout.py +177 -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 +116 -0
- qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
- qiskit/transpiler/passes/layout/sabre_layout.py +506 -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 +256 -0
- qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
- qiskit/transpiler/passes/layout/vf2_utils.py +235 -0
- qiskit/transpiler/passes/optimization/__init__.py +42 -0
- qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
- qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
- qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +117 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +109 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +85 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +242 -0
- qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
- qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
- qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +176 -0
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
- qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +267 -0
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +250 -0
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
- qiskit/transpiler/passes/optimization/optimize_annotated.py +449 -0
- qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
- qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
- qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
- qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +70 -0
- qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -0
- qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
- qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
- qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +639 -0
- qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
- qiskit/transpiler/passes/routing/__init__.py +21 -0
- qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
- qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
- qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
- qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
- qiskit/transpiler/passes/routing/basic_swap.py +166 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +397 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
- qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
- qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
- qiskit/transpiler/passes/routing/sabre_swap.py +463 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +408 -0
- qiskit/transpiler/passes/routing/utils.py +35 -0
- qiskit/transpiler/passes/scheduling/__init__.py +21 -0
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
- qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
- qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
- qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
- qiskit/transpiler/passes/synthesis/__init__.py +20 -0
- qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
- qiskit/transpiler/passes/synthesis/hls_plugins.py +1963 -0
- qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
- qiskit/transpiler/passes/synthesis/plugin.py +738 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +313 -0
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
- qiskit/transpiler/passes/utils/__init__.py +32 -0
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
- qiskit/transpiler/passes/utils/check_gate_direction.py +60 -0
- qiskit/transpiler/passes/utils/check_map.py +78 -0
- qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
- qiskit/transpiler/passes/utils/control_flow.py +61 -0
- qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
- qiskit/transpiler/passes/utils/error.py +69 -0
- qiskit/transpiler/passes/utils/filter_op_nodes.py +66 -0
- qiskit/transpiler/passes/utils/fixed_point.py +48 -0
- qiskit/transpiler/passes/utils/gate_direction.py +93 -0
- qiskit/transpiler/passes/utils/gates_basis.py +51 -0
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
- qiskit/transpiler/passes/utils/minimum_point.py +118 -0
- qiskit/transpiler/passes/utils/remove_barriers.py +50 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
- qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
- qiskit/transpiler/passmanager.py +503 -0
- qiskit/transpiler/passmanager_config.py +151 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +993 -0
- qiskit/transpiler/preset_passmanagers/common.py +672 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +437 -0
- qiskit/transpiler/preset_passmanagers/level0.py +104 -0
- qiskit/transpiler/preset_passmanagers/level1.py +108 -0
- qiskit/transpiler/preset_passmanagers/level2.py +109 -0
- qiskit/transpiler/preset_passmanagers/level3.py +110 -0
- qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
- qiskit/transpiler/target.py +905 -0
- qiskit/transpiler/timing_constraints.py +59 -0
- qiskit/user_config.py +266 -0
- qiskit/utils/__init__.py +90 -0
- qiskit/utils/classtools.py +146 -0
- qiskit/utils/deprecation.py +382 -0
- qiskit/utils/lazy_tester.py +363 -0
- qiskit/utils/optionals.py +354 -0
- qiskit/utils/parallel.py +318 -0
- qiskit/utils/units.py +146 -0
- qiskit/version.py +84 -0
- qiskit/visualization/__init__.py +290 -0
- qiskit/visualization/array.py +207 -0
- qiskit/visualization/bloch.py +778 -0
- qiskit/visualization/circuit/__init__.py +15 -0
- qiskit/visualization/circuit/_utils.py +675 -0
- qiskit/visualization/circuit/circuit_visualization.py +735 -0
- qiskit/visualization/circuit/latex.py +661 -0
- qiskit/visualization/circuit/matplotlib.py +2019 -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 +1849 -0
- qiskit/visualization/circuit_visualization.py +19 -0
- qiskit/visualization/counts_visualization.py +487 -0
- qiskit/visualization/dag_visualization.py +318 -0
- qiskit/visualization/exceptions.py +21 -0
- qiskit/visualization/gate_map.py +1424 -0
- qiskit/visualization/library.py +40 -0
- qiskit/visualization/pass_manager_visualization.py +312 -0
- qiskit/visualization/state_visualization.py +1546 -0
- qiskit/visualization/timeline/__init__.py +21 -0
- qiskit/visualization/timeline/core.py +495 -0
- qiskit/visualization/timeline/drawings.py +260 -0
- qiskit/visualization/timeline/generators.py +506 -0
- qiskit/visualization/timeline/interface.py +444 -0
- qiskit/visualization/timeline/layouts.py +115 -0
- qiskit/visualization/timeline/plotters/__init__.py +16 -0
- qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
- qiskit/visualization/timeline/plotters/matplotlib.py +195 -0
- qiskit/visualization/timeline/stylesheet.py +301 -0
- qiskit/visualization/timeline/types.py +148 -0
- qiskit/visualization/transition_visualization.py +369 -0
- qiskit/visualization/utils.py +49 -0
- qiskit-2.0.3.dist-info/METADATA +220 -0
- qiskit-2.0.3.dist-info/RECORD +690 -0
- qiskit-2.0.3.dist-info/WHEEL +6 -0
- qiskit-2.0.3.dist-info/entry_points.txt +82 -0
- qiskit-2.0.3.dist-info/licenses/LICENSE.txt +203 -0
- qiskit-2.0.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,19 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2018.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""
|
14
|
+
Module for the primary interface to the circuit drawers.
|
15
|
+
"""
|
16
|
+
|
17
|
+
# Temporary import from 0.22.0 to be deprecated in future
|
18
|
+
# pylint: disable=unused-import
|
19
|
+
from .circuit.circuit_visualization import circuit_drawer
|
@@ -0,0 +1,487 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2018.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""
|
14
|
+
Visualization functions for measurement counts.
|
15
|
+
"""
|
16
|
+
|
17
|
+
from collections import OrderedDict
|
18
|
+
import functools
|
19
|
+
|
20
|
+
import numpy as np
|
21
|
+
|
22
|
+
from qiskit.utils import optionals as _optionals
|
23
|
+
from qiskit.result import QuasiDistribution, ProbDistribution
|
24
|
+
from .exceptions import VisualizationError
|
25
|
+
from .utils import matplotlib_close_if_inline
|
26
|
+
|
27
|
+
|
28
|
+
def hamming_distance(str1, str2):
|
29
|
+
"""Calculate the Hamming distance between two bit strings
|
30
|
+
|
31
|
+
Args:
|
32
|
+
str1 (str): First string.
|
33
|
+
str2 (str): Second string.
|
34
|
+
Returns:
|
35
|
+
int: Distance between strings.
|
36
|
+
Raises:
|
37
|
+
VisualizationError: Strings not same length
|
38
|
+
"""
|
39
|
+
if len(str1) != len(str2):
|
40
|
+
raise VisualizationError("Strings not same length.")
|
41
|
+
return sum(s1 != s2 for s1, s2 in zip(str1, str2))
|
42
|
+
|
43
|
+
|
44
|
+
VALID_SORTS = ["asc", "desc", "hamming", "value", "value_desc"]
|
45
|
+
DIST_MEAS = {"hamming": hamming_distance}
|
46
|
+
|
47
|
+
|
48
|
+
def _is_deprecated_data_format(data) -> bool:
|
49
|
+
if not isinstance(data, list):
|
50
|
+
data = [data]
|
51
|
+
for dat in data:
|
52
|
+
if isinstance(dat, (QuasiDistribution, ProbDistribution)) or isinstance(
|
53
|
+
next(iter(dat.values())), float
|
54
|
+
):
|
55
|
+
return True
|
56
|
+
return False
|
57
|
+
|
58
|
+
|
59
|
+
def plot_histogram(
|
60
|
+
data,
|
61
|
+
figsize=None,
|
62
|
+
color=None,
|
63
|
+
number_to_keep=None,
|
64
|
+
sort="asc",
|
65
|
+
target_string=None,
|
66
|
+
legend=None,
|
67
|
+
bar_labels=True,
|
68
|
+
title=None,
|
69
|
+
ax=None,
|
70
|
+
filename=None,
|
71
|
+
):
|
72
|
+
"""Plot a histogram of input counts data.
|
73
|
+
|
74
|
+
Args:
|
75
|
+
data (list or dict): This is either a list of dictionaries or a single
|
76
|
+
dict containing the values to represent (ex ``{'001': 130}``)
|
77
|
+
|
78
|
+
figsize (tuple): Figure size in inches.
|
79
|
+
color (list or str): String or list of strings for histogram bar colors.
|
80
|
+
number_to_keep (int): The number of terms to plot per dataset. The rest is made into a
|
81
|
+
single bar called 'rest'. If multiple datasets are given, the ``number_to_keep``
|
82
|
+
applies to each dataset individually, which may result in more bars than
|
83
|
+
``number_to_keep + 1``. The ``number_to_keep`` applies to the total values, rather than
|
84
|
+
the x-axis sort.
|
85
|
+
sort (string): Could be `'asc'`, `'desc'`, `'hamming'`, `'value'`, or
|
86
|
+
`'value_desc'`. If set to `'value'` or `'value_desc'` the x axis
|
87
|
+
will be sorted by the number of counts for each bitstring.
|
88
|
+
Defaults to `'asc'`.
|
89
|
+
target_string (str): Target string if 'sort' is a distance measure.
|
90
|
+
legend(list): A list of strings to use for labels of the data.
|
91
|
+
The number of entries must match the length of data (if data is a
|
92
|
+
list or 1 if it's a dict)
|
93
|
+
bar_labels (bool): Label each bar in histogram with counts value.
|
94
|
+
title (str): A string to use for the plot title
|
95
|
+
ax (matplotlib.axes.Axes): An optional Axes object to be used for
|
96
|
+
the visualization output. If none is specified a new matplotlib
|
97
|
+
Figure will be created and used. Additionally, if specified there
|
98
|
+
will be no returned Figure since it is redundant.
|
99
|
+
filename (str): file path to save image to.
|
100
|
+
|
101
|
+
Returns:
|
102
|
+
matplotlib.Figure:
|
103
|
+
A figure for the rendered histogram, if the ``ax``
|
104
|
+
kwarg is not set.
|
105
|
+
|
106
|
+
Raises:
|
107
|
+
MissingOptionalLibraryError: Matplotlib not available.
|
108
|
+
VisualizationError: When legend is provided and the length doesn't
|
109
|
+
match the input data.
|
110
|
+
VisualizationError: Input must be Counts or a dict
|
111
|
+
|
112
|
+
Examples:
|
113
|
+
.. plot::
|
114
|
+
:alt: Output from the previous code.
|
115
|
+
:include-source:
|
116
|
+
|
117
|
+
# Plot two counts in the same figure with legends and colors specified.
|
118
|
+
|
119
|
+
from qiskit.visualization import plot_histogram
|
120
|
+
|
121
|
+
counts1 = {'00': 525, '11': 499}
|
122
|
+
counts2 = {'00': 511, '11': 514}
|
123
|
+
|
124
|
+
legend = ['First execution', 'Second execution']
|
125
|
+
|
126
|
+
plot_histogram([counts1, counts2], legend=legend, color=['crimson','midnightblue'],
|
127
|
+
title="New Histogram")
|
128
|
+
|
129
|
+
# You can sort the bitstrings using different methods.
|
130
|
+
|
131
|
+
counts = {'001': 596, '011': 211, '010': 50, '000': 117, '101': 33, '111': 8,
|
132
|
+
'100': 6, '110': 3}
|
133
|
+
|
134
|
+
# Sort by the counts in descending order
|
135
|
+
hist1 = plot_histogram(counts, sort='value_desc')
|
136
|
+
|
137
|
+
# Sort by the hamming distance (the number of bit flips to change from
|
138
|
+
# one bitstring to the other) from a target string.
|
139
|
+
hist2 = plot_histogram(counts, sort='hamming', target_string='001')
|
140
|
+
"""
|
141
|
+
if not isinstance(data, list):
|
142
|
+
data = [data]
|
143
|
+
|
144
|
+
kind = "counts"
|
145
|
+
for dat in data:
|
146
|
+
if isinstance(dat, (QuasiDistribution, ProbDistribution)) or isinstance(
|
147
|
+
next(iter(dat.values())), float
|
148
|
+
):
|
149
|
+
kind = "distribution"
|
150
|
+
return _plotting_core(
|
151
|
+
data,
|
152
|
+
figsize,
|
153
|
+
color,
|
154
|
+
number_to_keep,
|
155
|
+
sort,
|
156
|
+
target_string,
|
157
|
+
legend,
|
158
|
+
bar_labels,
|
159
|
+
title,
|
160
|
+
ax,
|
161
|
+
filename,
|
162
|
+
kind=kind,
|
163
|
+
)
|
164
|
+
|
165
|
+
|
166
|
+
def plot_distribution(
|
167
|
+
data,
|
168
|
+
figsize=(7, 5),
|
169
|
+
color=None,
|
170
|
+
number_to_keep=None,
|
171
|
+
sort="asc",
|
172
|
+
target_string=None,
|
173
|
+
legend=None,
|
174
|
+
bar_labels=True,
|
175
|
+
title=None,
|
176
|
+
ax=None,
|
177
|
+
filename=None,
|
178
|
+
):
|
179
|
+
"""Plot a distribution from input sampled data.
|
180
|
+
|
181
|
+
Args:
|
182
|
+
data (list or dict): This is either a list of dictionaries or a single
|
183
|
+
dict containing the values to represent (ex {'001': 130})
|
184
|
+
figsize (tuple): Figure size in inches.
|
185
|
+
color (list or str): String or list of strings for distribution bar colors.
|
186
|
+
number_to_keep (int): The number of terms to plot per dataset. The rest is made into a
|
187
|
+
single bar called 'rest'. If multiple datasets are given, the ``number_to_keep``
|
188
|
+
applies to each dataset individually, which may result in more bars than
|
189
|
+
``number_to_keep + 1``. The ``number_to_keep`` applies to the total values, rather than
|
190
|
+
the x-axis sort.
|
191
|
+
sort (string): Could be `'asc'`, `'desc'`, `'hamming'`, `'value'`, or
|
192
|
+
`'value_desc'`. If set to `'value'` or `'value_desc'` the x axis
|
193
|
+
will be sorted by the maximum probability for each bitstring.
|
194
|
+
Defaults to `'asc'`.
|
195
|
+
target_string (str): Target string if 'sort' is a distance measure.
|
196
|
+
legend(list): A list of strings to use for labels of the data.
|
197
|
+
The number of entries must match the length of data (if data is a
|
198
|
+
list or 1 if it's a dict)
|
199
|
+
bar_labels (bool): Label each bar in histogram with probability value.
|
200
|
+
title (str): A string to use for the plot title
|
201
|
+
ax (matplotlib.axes.Axes): An optional Axes object to be used for
|
202
|
+
the visualization output. If none is specified a new matplotlib
|
203
|
+
Figure will be created and used. Additionally, if specified there
|
204
|
+
will be no returned Figure since it is redundant.
|
205
|
+
filename (str): file path to save image to.
|
206
|
+
|
207
|
+
Returns:
|
208
|
+
matplotlib.Figure:
|
209
|
+
A figure for the rendered distribution, if the ``ax``
|
210
|
+
kwarg is not set.
|
211
|
+
|
212
|
+
Raises:
|
213
|
+
MissingOptionalLibraryError: Matplotlib not available.
|
214
|
+
VisualizationError: When legend is provided and the length doesn't
|
215
|
+
match the input data.
|
216
|
+
|
217
|
+
Examples:
|
218
|
+
.. plot::
|
219
|
+
:alt: Output from the previous code.
|
220
|
+
:include-source:
|
221
|
+
|
222
|
+
# Plot two counts in the same figure with legends and colors specified.
|
223
|
+
|
224
|
+
from qiskit.visualization import plot_distribution
|
225
|
+
|
226
|
+
counts1 = {'00': 525, '11': 499}
|
227
|
+
counts2 = {'00': 511, '11': 514}
|
228
|
+
|
229
|
+
legend = ['First execution', 'Second execution']
|
230
|
+
|
231
|
+
plot_distribution([counts1, counts2], legend=legend, color=['crimson','midnightblue'],
|
232
|
+
title="New Distribution")
|
233
|
+
|
234
|
+
# You can sort the bitstrings using different methods.
|
235
|
+
|
236
|
+
counts = {'001': 596, '011': 211, '010': 50, '000': 117, '101': 33, '111': 8,
|
237
|
+
'100': 6, '110': 3}
|
238
|
+
|
239
|
+
# Sort by the counts in descending order
|
240
|
+
dist1 = plot_distribution(counts, sort='value_desc')
|
241
|
+
|
242
|
+
# Sort by the hamming distance (the number of bit flips to change from
|
243
|
+
# one bitstring to the other) from a target string.
|
244
|
+
dist2 = plot_distribution(counts, sort='hamming', target_string='001')
|
245
|
+
|
246
|
+
"""
|
247
|
+
return _plotting_core(
|
248
|
+
data,
|
249
|
+
figsize,
|
250
|
+
color,
|
251
|
+
number_to_keep,
|
252
|
+
sort,
|
253
|
+
target_string,
|
254
|
+
legend,
|
255
|
+
bar_labels,
|
256
|
+
title,
|
257
|
+
ax,
|
258
|
+
filename,
|
259
|
+
kind="distribution",
|
260
|
+
)
|
261
|
+
|
262
|
+
|
263
|
+
@_optionals.HAS_MATPLOTLIB.require_in_call
|
264
|
+
def _plotting_core(
|
265
|
+
data,
|
266
|
+
figsize=(7, 5),
|
267
|
+
color=None,
|
268
|
+
number_to_keep=None,
|
269
|
+
sort="asc",
|
270
|
+
target_string=None,
|
271
|
+
legend=None,
|
272
|
+
bar_labels=True,
|
273
|
+
title=None,
|
274
|
+
ax=None,
|
275
|
+
filename=None,
|
276
|
+
kind="counts",
|
277
|
+
):
|
278
|
+
import matplotlib.pyplot as plt
|
279
|
+
from matplotlib.ticker import MaxNLocator
|
280
|
+
|
281
|
+
if sort not in VALID_SORTS:
|
282
|
+
raise VisualizationError(
|
283
|
+
"Value of sort option, %s, isn't a "
|
284
|
+
"valid choice. Must be 'asc', "
|
285
|
+
"'desc', 'hamming', 'value', 'value_desc'"
|
286
|
+
)
|
287
|
+
if sort in DIST_MEAS and target_string is None:
|
288
|
+
err_msg = "Must define target_string when using distance measure."
|
289
|
+
raise VisualizationError(err_msg)
|
290
|
+
|
291
|
+
if isinstance(data, dict):
|
292
|
+
data = [data]
|
293
|
+
|
294
|
+
if legend and len(legend) != len(data):
|
295
|
+
raise VisualizationError(
|
296
|
+
f"Length of legend ({len(legend)}) doesn't match number of input executions ({len(data)})."
|
297
|
+
)
|
298
|
+
|
299
|
+
# Set bar colors
|
300
|
+
if color is None:
|
301
|
+
color = plt.rcParams["axes.prop_cycle"].by_key()["color"]
|
302
|
+
elif isinstance(color, str):
|
303
|
+
color = [color]
|
304
|
+
|
305
|
+
if ax is None:
|
306
|
+
fig, ax = plt.subplots(figsize=figsize)
|
307
|
+
else:
|
308
|
+
fig = None
|
309
|
+
|
310
|
+
labels = sorted(functools.reduce(lambda x, y: x.union(y.keys()), data, set()))
|
311
|
+
if number_to_keep is not None:
|
312
|
+
labels.append("rest")
|
313
|
+
|
314
|
+
if sort in DIST_MEAS:
|
315
|
+
dist = []
|
316
|
+
for item in labels:
|
317
|
+
dist.append(DIST_MEAS[sort](item, target_string) if item != "rest" else 0)
|
318
|
+
|
319
|
+
labels = [list(x) for x in zip(*sorted(zip(dist, labels), key=lambda pair: pair[0]))][1]
|
320
|
+
elif "value" in sort:
|
321
|
+
combined_counts = {}
|
322
|
+
if isinstance(data, dict):
|
323
|
+
combined_counts = data
|
324
|
+
else:
|
325
|
+
for counts in data:
|
326
|
+
for count in counts:
|
327
|
+
prev_count = combined_counts.get(count, 0)
|
328
|
+
combined_counts[count] = max(prev_count, counts[count])
|
329
|
+
labels = sorted(combined_counts.keys(), key=lambda key: combined_counts[key])
|
330
|
+
|
331
|
+
length = len(data)
|
332
|
+
width = 1 / (len(data) + 1) # the width of the bars
|
333
|
+
|
334
|
+
labels_dict, all_pvalues, all_inds = _plot_data(data, labels, number_to_keep, kind=kind)
|
335
|
+
rects = []
|
336
|
+
for item, _ in enumerate(data):
|
337
|
+
label = None
|
338
|
+
for idx, val in enumerate(all_pvalues[item]):
|
339
|
+
if not idx and legend:
|
340
|
+
label = legend[item]
|
341
|
+
if val > 0:
|
342
|
+
rects.append(
|
343
|
+
ax.bar(
|
344
|
+
idx + item * width,
|
345
|
+
val,
|
346
|
+
width,
|
347
|
+
label=label,
|
348
|
+
color=color[item % len(color)],
|
349
|
+
zorder=2,
|
350
|
+
)
|
351
|
+
)
|
352
|
+
label = None
|
353
|
+
bar_center = (width / 2) * (length - 1)
|
354
|
+
ax.set_xticks(all_inds[item] + bar_center)
|
355
|
+
ax.set_xticklabels(labels_dict.keys(), rotation=70, ha="right", rotation_mode="anchor")
|
356
|
+
# attach some text labels
|
357
|
+
if bar_labels:
|
358
|
+
for rect in rects:
|
359
|
+
for rec in rect:
|
360
|
+
height = rec.get_height()
|
361
|
+
if kind == "distribution":
|
362
|
+
height = round(height, 3)
|
363
|
+
if height >= 1e-3:
|
364
|
+
ax.text(
|
365
|
+
rec.get_x() + rec.get_width() / 2.0,
|
366
|
+
1.05 * height,
|
367
|
+
str(height),
|
368
|
+
ha="center",
|
369
|
+
va="bottom",
|
370
|
+
zorder=3,
|
371
|
+
)
|
372
|
+
else:
|
373
|
+
ax.text(
|
374
|
+
rec.get_x() + rec.get_width() / 2.0,
|
375
|
+
1.05 * height,
|
376
|
+
"0",
|
377
|
+
ha="center",
|
378
|
+
va="bottom",
|
379
|
+
zorder=3,
|
380
|
+
)
|
381
|
+
|
382
|
+
# add some text for labels, title, and axes ticks
|
383
|
+
if kind == "counts":
|
384
|
+
ax.set_ylabel("Count", fontsize=14)
|
385
|
+
else:
|
386
|
+
ax.set_ylabel("Quasi-probability", fontsize=14)
|
387
|
+
all_vals = np.concatenate(all_pvalues).ravel()
|
388
|
+
min_ylim = 0.0
|
389
|
+
if kind == "distribution":
|
390
|
+
min_ylim = min(0.0, min(1.1 * val for val in all_vals))
|
391
|
+
ax.set_ylim([min_ylim, min([1.1 * sum(all_vals), max(1.1 * val for val in all_vals)])])
|
392
|
+
if "desc" in sort:
|
393
|
+
ax.invert_xaxis()
|
394
|
+
|
395
|
+
ax.yaxis.set_major_locator(MaxNLocator(5))
|
396
|
+
plt.grid(which="major", axis="y", zorder=0, linestyle="--")
|
397
|
+
if title:
|
398
|
+
plt.title(title)
|
399
|
+
|
400
|
+
if legend:
|
401
|
+
ax.legend(
|
402
|
+
loc="upper left",
|
403
|
+
bbox_to_anchor=(1.01, 1.0),
|
404
|
+
ncol=1,
|
405
|
+
borderaxespad=0,
|
406
|
+
frameon=True,
|
407
|
+
)
|
408
|
+
if fig:
|
409
|
+
matplotlib_close_if_inline(fig)
|
410
|
+
if filename is None:
|
411
|
+
try:
|
412
|
+
fig.tight_layout()
|
413
|
+
except AttributeError:
|
414
|
+
pass
|
415
|
+
return fig
|
416
|
+
else:
|
417
|
+
return fig.savefig(filename)
|
418
|
+
|
419
|
+
|
420
|
+
def _keep_largest_items(execution, number_to_keep):
|
421
|
+
"""Keep only the largest values in a dictionary, and sum the rest into a new key 'rest'."""
|
422
|
+
sorted_counts = sorted(execution.items(), key=lambda p: p[1])
|
423
|
+
rest = sum(count for key, count in sorted_counts[:-number_to_keep])
|
424
|
+
return dict(sorted_counts[-number_to_keep:], rest=rest)
|
425
|
+
|
426
|
+
|
427
|
+
def _unify_labels(data):
|
428
|
+
"""Make all dictionaries in data have the same set of keys, using 0 for missing values."""
|
429
|
+
data = tuple(data)
|
430
|
+
all_labels = set().union(*(execution.keys() for execution in data))
|
431
|
+
base = {label: 0 for label in all_labels}
|
432
|
+
out = []
|
433
|
+
for execution in data:
|
434
|
+
new_execution = base.copy()
|
435
|
+
new_execution.update(execution)
|
436
|
+
out.append(new_execution)
|
437
|
+
return out
|
438
|
+
|
439
|
+
|
440
|
+
def _plot_data(data, labels, number_to_keep, kind="counts"):
|
441
|
+
"""Generate the data needed for plotting counts.
|
442
|
+
|
443
|
+
Parameters:
|
444
|
+
data (list or dict): This is either a list of dictionaries or a single
|
445
|
+
dict containing the values to represent (ex {'001': 130})
|
446
|
+
labels (list): The list of bitstring labels for the plot.
|
447
|
+
number_to_keep (int): The number of terms to plot and rest
|
448
|
+
is made into a single bar called 'rest'.
|
449
|
+
kind (str): One of 'counts' or 'distribution`
|
450
|
+
|
451
|
+
Returns:
|
452
|
+
tuple: tuple containing:
|
453
|
+
(dict): The labels actually used in the plotting.
|
454
|
+
(list): List of ndarrays for the bars in each experiment.
|
455
|
+
(list): Indices for the locations of the bars for each
|
456
|
+
experiment.
|
457
|
+
"""
|
458
|
+
labels_dict = OrderedDict()
|
459
|
+
all_pvalues = []
|
460
|
+
all_inds = []
|
461
|
+
|
462
|
+
if isinstance(data, dict):
|
463
|
+
data = [data]
|
464
|
+
if number_to_keep is not None:
|
465
|
+
data = _unify_labels(_keep_largest_items(execution, number_to_keep) for execution in data)
|
466
|
+
|
467
|
+
for execution in data:
|
468
|
+
values = []
|
469
|
+
for key in labels:
|
470
|
+
if key not in execution:
|
471
|
+
if number_to_keep is None:
|
472
|
+
labels_dict[key] = 1
|
473
|
+
values.append(0)
|
474
|
+
else:
|
475
|
+
labels_dict[key] = 1
|
476
|
+
values.append(execution[key])
|
477
|
+
if kind == "counts":
|
478
|
+
pvalues = np.array(values, dtype=int)
|
479
|
+
else:
|
480
|
+
pvalues = np.array(values, dtype=float)
|
481
|
+
pvalues /= np.sum(pvalues)
|
482
|
+
all_pvalues.append(pvalues)
|
483
|
+
numelem = len(values)
|
484
|
+
ind = np.arange(numelem) # the x locations for the groups
|
485
|
+
all_inds.append(ind)
|
486
|
+
|
487
|
+
return labels_dict, all_pvalues, all_inds
|