qiskit 2.1.0rc1__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 +159 -0
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +73 -0
- qiskit/circuit/__init__.py +1335 -0
- qiskit/circuit/_add_control.py +338 -0
- qiskit/circuit/_classical_resource_map.py +154 -0
- qiskit/circuit/_standard_gates_commutations.py +3849 -0
- qiskit/circuit/_utils.py +167 -0
- qiskit/circuit/annotated_operation.py +279 -0
- qiskit/circuit/annotation.py +404 -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 +156 -0
- qiskit/circuit/classical/expr/visitors.py +381 -0
- qiskit/circuit/classical/types/__init__.py +113 -0
- qiskit/circuit/classical/types/ordering.py +229 -0
- qiskit/circuit/classical/types/types.py +30 -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 +188 -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 +159 -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 +506 -0
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +395 -0
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +501 -0
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
- qiskit/circuit/library/arithmetic/quadratic_form.py +370 -0
- qiskit/circuit/library/arithmetic/weighted_adder.py +428 -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 +322 -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 +163 -0
- qiskit/circuit/library/generalized_gates/gms.py +179 -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 +202 -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 +236 -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 +301 -0
- qiskit/circuit/library/n_local/n_local.py +1478 -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 +202 -0
- qiskit/circuit/library/phase_estimation.py +177 -0
- qiskit/circuit/library/phase_oracle.py +239 -0
- qiskit/circuit/library/quantum_volume.py +179 -0
- qiskit/circuit/library/standard_gates/__init__.py +141 -0
- qiskit/circuit/library/standard_gates/dcx.py +76 -0
- qiskit/circuit/library/standard_gates/ecr.py +126 -0
- qiskit/circuit/library/standard_gates/equivalence_library.py +1936 -0
- qiskit/circuit/library/standard_gates/global_phase.py +83 -0
- qiskit/circuit/library/standard_gates/h.py +230 -0
- qiskit/circuit/library/standard_gates/i.py +76 -0
- qiskit/circuit/library/standard_gates/iswap.py +115 -0
- qiskit/circuit/library/standard_gates/p.py +415 -0
- qiskit/circuit/library/standard_gates/r.py +108 -0
- qiskit/circuit/library/standard_gates/rx.py +269 -0
- qiskit/circuit/library/standard_gates/rxx.py +165 -0
- qiskit/circuit/library/standard_gates/ry.py +268 -0
- qiskit/circuit/library/standard_gates/ryy.py +165 -0
- qiskit/circuit/library/standard_gates/rz.py +290 -0
- qiskit/circuit/library/standard_gates/rzx.py +211 -0
- qiskit/circuit/library/standard_gates/rzz.py +181 -0
- qiskit/circuit/library/standard_gates/s.py +424 -0
- qiskit/circuit/library/standard_gates/swap.py +268 -0
- qiskit/circuit/library/standard_gates/sx.py +303 -0
- qiskit/circuit/library/standard_gates/t.py +169 -0
- qiskit/circuit/library/standard_gates/u.py +379 -0
- qiskit/circuit/library/standard_gates/u1.py +466 -0
- qiskit/circuit/library/standard_gates/u2.py +145 -0
- qiskit/circuit/library/standard_gates/u3.py +412 -0
- qiskit/circuit/library/standard_gates/x.py +1335 -0
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +164 -0
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +197 -0
- qiskit/circuit/library/standard_gates/y.py +253 -0
- qiskit/circuit/library/standard_gates/z.py +331 -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 +188 -0
- qiskit/circuit/parameterexpression.py +737 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +140 -0
- qiskit/circuit/quantumcircuit.py +7610 -0
- qiskit/circuit/quantumcircuitdata.py +137 -0
- qiskit/circuit/random/__init__.py +50 -0
- qiskit/circuit/random/utils.py +755 -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 +185 -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 +44 -0
- qiskit/dagcircuit/collect_blocks.py +403 -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 +193 -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 +172 -0
- qiskit/primitives/containers/estimator_pub.py +222 -0
- qiskit/primitives/containers/object_array.py +94 -0
- qiskit/primitives/containers/observables_array.py +380 -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 +100 -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 +376 -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 +466 -0
- qiskit/qasm3/ast.py +796 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1363 -0
- qiskit/qasm3/printer.py +620 -0
- qiskit/qpy/__init__.py +2141 -0
- qiskit/qpy/binary_io/__init__.py +35 -0
- qiskit/qpy/binary_io/circuits.py +1687 -0
- qiskit/qpy/binary_io/parse_sympy_repr.py +126 -0
- qiskit/qpy/binary_io/schedules.py +288 -0
- qiskit/qpy/binary_io/value.py +1183 -0
- qiskit/qpy/common.py +361 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +458 -0
- qiskit/qpy/interface.py +384 -0
- qiskit/qpy/type_keys.py +415 -0
- qiskit/quantum_info/__init__.py +172 -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 +29 -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 +24 -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 +584 -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 +76 -0
- qiskit/result/utils.py +294 -0
- qiskit/synthesis/__init__.py +250 -0
- qiskit/synthesis/arithmetic/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +107 -0
- qiskit/synthesis/arithmetic/adders/rv_ripple_carry_adder.py +156 -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/generate_basis_approximations.py +53 -0
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +280 -0
- qiskit/synthesis/evolution/__init__.py +21 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +123 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +316 -0
- qiskit/synthesis/evolution/qdrift.py +133 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +227 -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 +29 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +583 -0
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +205 -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 +61 -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 +359 -0
- qiskit/transpiler/__init__.py +1352 -0
- qiskit/transpiler/basepasses.py +190 -0
- qiskit/transpiler/coupling.py +500 -0
- qiskit/transpiler/exceptions.py +59 -0
- qiskit/transpiler/instruction_durations.py +263 -0
- qiskit/transpiler/layout.py +740 -0
- qiskit/transpiler/passes/__init__.py +278 -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 +197 -0
- qiskit/transpiler/passes/layout/disjoint_utils.py +54 -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 +525 -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 +292 -0
- qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
- qiskit/transpiler/passes/layout/vf2_utils.py +245 -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 +251 -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_clifford_t.py +68 -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 +633 -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 +465 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +433 -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 +17 -0
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
- qiskit/transpiler/passes/scheduling/padding/context_aware_dynamical_decoupling.py +876 -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 +21 -0
- qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
- qiskit/transpiler/passes/synthesis/clifford_unitary_synth_plugin.py +123 -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 +2338 -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 +318 -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 +154 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1114 -0
- qiskit/transpiler/preset_passmanagers/common.py +773 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +443 -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 +355 -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 +677 -0
- qiskit/visualization/circuit/circuit_visualization.py +735 -0
- qiskit/visualization/circuit/latex.py +668 -0
- qiskit/visualization/circuit/matplotlib.py +2041 -0
- qiskit/visualization/circuit/qcstyle.py +130 -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/__init__.py +13 -0
- qiskit/visualization/dag/dagstyle.py +103 -0
- qiskit/visualization/dag/styles/__init__.py +13 -0
- qiskit/visualization/dag/styles/color.json +10 -0
- qiskit/visualization/dag/styles/plain.json +5 -0
- qiskit/visualization/dag_visualization.py +389 -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/style.py +223 -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.1.0rc1.dist-info/METADATA +221 -0
- qiskit-2.1.0rc1.dist-info/RECORD +699 -0
- qiskit-2.1.0rc1.dist-info/WHEEL +6 -0
- qiskit-2.1.0rc1.dist-info/entry_points.txt +88 -0
- qiskit-2.1.0rc1.dist-info/licenses/LICENSE.txt +203 -0
- qiskit-2.1.0rc1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,418 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""
|
14
|
+
A collection of useful quantum information functions for operators.
|
15
|
+
"""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
import logging
|
19
|
+
import numpy as np
|
20
|
+
|
21
|
+
from qiskit.exceptions import QiskitError, MissingOptionalLibraryError
|
22
|
+
from qiskit.circuit.gate import Gate
|
23
|
+
from qiskit.quantum_info.operators.base_operator import BaseOperator
|
24
|
+
from qiskit.quantum_info.operators.operator import Operator
|
25
|
+
from qiskit.quantum_info.operators.channel.quantum_channel import QuantumChannel
|
26
|
+
from qiskit.quantum_info.operators.channel import Choi, SuperOp
|
27
|
+
from qiskit.quantum_info.states.densitymatrix import DensityMatrix
|
28
|
+
from qiskit.quantum_info.states.measures import state_fidelity
|
29
|
+
from qiskit.utils import optionals as _optionals
|
30
|
+
|
31
|
+
logger = logging.getLogger(__name__)
|
32
|
+
|
33
|
+
|
34
|
+
def process_fidelity(
|
35
|
+
channel: Operator | QuantumChannel,
|
36
|
+
target: Operator | QuantumChannel | None = None,
|
37
|
+
require_cp: bool = True,
|
38
|
+
require_tp: bool = True,
|
39
|
+
) -> float:
|
40
|
+
r"""Return the process fidelity of a noisy quantum channel.
|
41
|
+
|
42
|
+
|
43
|
+
The process fidelity :math:`F_{\text{pro}}(\mathcal{E}, \mathcal{F})`
|
44
|
+
between two quantum channels :math:`\mathcal{E}, \mathcal{F}` is given by
|
45
|
+
|
46
|
+
.. math::
|
47
|
+
F_{\text{pro}}(\mathcal{E}, \mathcal{F})
|
48
|
+
= F(\rho_{\mathcal{E}}, \rho_{\mathcal{F}})
|
49
|
+
|
50
|
+
where :math:`F` is the :func:`~qiskit.quantum_info.state_fidelity`,
|
51
|
+
:math:`\rho_{\mathcal{E}} = \Lambda_{\mathcal{E}} / d` is the
|
52
|
+
normalized :class:`~qiskit.quantum_info.Choi` matrix for the channel
|
53
|
+
:math:`\mathcal{E}`, and :math:`d` is the input dimension of
|
54
|
+
:math:`\mathcal{E}`.
|
55
|
+
|
56
|
+
When the target channel is unitary this is equivalent to
|
57
|
+
|
58
|
+
.. math::
|
59
|
+
F_{\text{pro}}(\mathcal{E}, U)
|
60
|
+
= \frac{Tr[S_U^\dagger S_{\mathcal{E}}]}{d^2}
|
61
|
+
|
62
|
+
where :math:`S_{\mathcal{E}}, S_{U}` are the
|
63
|
+
:class:`~qiskit.quantum_info.SuperOp` matrices for the *input* quantum
|
64
|
+
channel :math:`\mathcal{E}` and *target* unitary :math:`U` respectively,
|
65
|
+
and :math:`d` is the input dimension of the channel.
|
66
|
+
|
67
|
+
Args:
|
68
|
+
channel (Operator or QuantumChannel): input quantum channel.
|
69
|
+
target (Operator or QuantumChannel or None): target quantum channel.
|
70
|
+
If `None` target is the identity operator [Default: None].
|
71
|
+
require_cp (bool): check if input and target channels are
|
72
|
+
completely-positive and if non-CP log warning
|
73
|
+
containing negative eigenvalues of Choi-matrix
|
74
|
+
[Default: True].
|
75
|
+
require_tp (bool): check if input and target channels are
|
76
|
+
trace-preserving and if non-TP log warning
|
77
|
+
containing negative eigenvalues of partial
|
78
|
+
Choi-matrix :math:`Tr_{\text{out}}[\mathcal{E}] - I`
|
79
|
+
[Default: True].
|
80
|
+
|
81
|
+
Returns:
|
82
|
+
float: The process fidelity :math:`F_{\text{pro}}`.
|
83
|
+
|
84
|
+
Raises:
|
85
|
+
QiskitError: if the channel and target do not have the same dimensions.
|
86
|
+
"""
|
87
|
+
# Format inputs
|
88
|
+
channel = _input_formatter(channel, SuperOp, "process_fidelity", "channel")
|
89
|
+
target = _input_formatter(target, Operator, "process_fidelity", "target")
|
90
|
+
|
91
|
+
if target:
|
92
|
+
# Validate dimensions
|
93
|
+
if channel.dim != target.dim:
|
94
|
+
raise QiskitError(
|
95
|
+
"Input quantum channel and target unitary must have the same "
|
96
|
+
f"dimensions ({channel.dim} != {target.dim})."
|
97
|
+
)
|
98
|
+
|
99
|
+
# Validate complete-positivity and trace-preserving
|
100
|
+
for label, chan in [("Input", channel), ("Target", target)]:
|
101
|
+
if chan is not None and require_cp:
|
102
|
+
cp_cond = _cp_condition(chan)
|
103
|
+
neg = cp_cond < -1 * chan.atol
|
104
|
+
if np.any(neg):
|
105
|
+
logger.warning(
|
106
|
+
"%s channel is not CP. Choi-matrix has negative eigenvalues: %s",
|
107
|
+
label,
|
108
|
+
cp_cond[neg],
|
109
|
+
)
|
110
|
+
if chan is not None and require_tp:
|
111
|
+
tp_cond = _tp_condition(chan)
|
112
|
+
non_zero = np.logical_not(np.isclose(tp_cond, 0, atol=chan.atol, rtol=chan.rtol))
|
113
|
+
if np.any(non_zero):
|
114
|
+
logger.warning(
|
115
|
+
"%s channel is not TP. Tr_2[Choi] - I has non-zero eigenvalues: %s",
|
116
|
+
label,
|
117
|
+
tp_cond[non_zero],
|
118
|
+
)
|
119
|
+
|
120
|
+
if isinstance(target, Operator):
|
121
|
+
# Compute fidelity with unitary target by applying the inverse
|
122
|
+
# to channel and computing fidelity with the identity
|
123
|
+
channel = channel.compose(target.adjoint())
|
124
|
+
target = None
|
125
|
+
|
126
|
+
input_dim, _ = channel.dim
|
127
|
+
if target is None:
|
128
|
+
# Compute process fidelity with identity channel
|
129
|
+
if isinstance(channel, Operator):
|
130
|
+
# |Tr[U]/dim| ** 2
|
131
|
+
fid = np.abs(np.trace(channel.data) / input_dim) ** 2
|
132
|
+
else:
|
133
|
+
# Tr[S] / (dim ** 2)
|
134
|
+
fid = np.trace(SuperOp(channel).data) / (input_dim**2)
|
135
|
+
return float(np.real(fid))
|
136
|
+
|
137
|
+
# For comparing two non-unitary channels we compute the state fidelity of
|
138
|
+
# the normalized Choi-matrices. This is equivalent to the previous definition
|
139
|
+
# when the target is a unitary channel.
|
140
|
+
state1 = DensityMatrix(Choi(channel).data / input_dim)
|
141
|
+
state2 = DensityMatrix(Choi(target).data / input_dim)
|
142
|
+
return state_fidelity(state1, state2, validate=False)
|
143
|
+
|
144
|
+
|
145
|
+
def average_gate_fidelity(
|
146
|
+
channel: QuantumChannel | Operator,
|
147
|
+
target: Operator | None = None,
|
148
|
+
require_cp: bool = True,
|
149
|
+
require_tp: bool = False,
|
150
|
+
) -> float:
|
151
|
+
r"""Return the average gate fidelity of a noisy quantum channel.
|
152
|
+
|
153
|
+
The average gate fidelity :math:`F_{\text{ave}}` is given by
|
154
|
+
|
155
|
+
.. math::
|
156
|
+
\begin{aligned}
|
157
|
+
F_{\text{ave}}(\mathcal{E}, U)
|
158
|
+
&= \int d\psi \langle\psi|U^\dagger
|
159
|
+
\mathcal{E}(|\psi\rangle\!\langle\psi|)U|\psi\rangle \\
|
160
|
+
&= \frac{d F_{\text{pro}}(\mathcal{E}, U) + 1}{d + 1}
|
161
|
+
\end{aligned}
|
162
|
+
|
163
|
+
where :math:`F_{\text{pro}}(\mathcal{E}, U)` is the
|
164
|
+
:meth:`~qiskit.quantum_info.process_fidelity` of the input quantum
|
165
|
+
*channel* :math:`\mathcal{E}` with a *target* unitary :math:`U`, and
|
166
|
+
:math:`d` is the dimension of the *channel*.
|
167
|
+
|
168
|
+
Args:
|
169
|
+
channel (QuantumChannel or Operator): noisy quantum channel.
|
170
|
+
target (Operator or None): target unitary operator.
|
171
|
+
If `None` target is the identity operator [Default: None].
|
172
|
+
require_cp (bool): check if input and target channels are
|
173
|
+
completely-positive and if non-CP log warning
|
174
|
+
containing negative eigenvalues of Choi-matrix
|
175
|
+
[Default: True].
|
176
|
+
require_tp (bool): check if input and target channels are
|
177
|
+
trace-preserving and if non-TP log warning
|
178
|
+
containing negative eigenvalues of partial
|
179
|
+
Choi-matrix :math:`Tr_{\text{out}}[\mathcal{E}] - I`
|
180
|
+
[Default: True].
|
181
|
+
|
182
|
+
Returns:
|
183
|
+
float: The average gate fidelity :math:`F_{\text{ave}}`.
|
184
|
+
|
185
|
+
Raises:
|
186
|
+
QiskitError: if the channel and target do not have the same dimensions,
|
187
|
+
or have different input and output dimensions.
|
188
|
+
"""
|
189
|
+
# Format inputs
|
190
|
+
channel = _input_formatter(channel, SuperOp, "average_gate_fidelity", "channel")
|
191
|
+
target = _input_formatter(target, Operator, "average_gate_fidelity", "target")
|
192
|
+
|
193
|
+
if target is not None:
|
194
|
+
try:
|
195
|
+
target = Operator(target)
|
196
|
+
except QiskitError as ex:
|
197
|
+
raise QiskitError(
|
198
|
+
"Target channel is not a unitary channel. To compare "
|
199
|
+
"two non-unitary channels use the "
|
200
|
+
"`qiskit.quantum_info.process_fidelity` function instead."
|
201
|
+
) from ex
|
202
|
+
dim, _ = channel.dim
|
203
|
+
f_pro = process_fidelity(channel, target=target, require_cp=require_cp, require_tp=require_tp)
|
204
|
+
return (dim * f_pro + 1) / (dim + 1)
|
205
|
+
|
206
|
+
|
207
|
+
def gate_error(
|
208
|
+
channel: QuantumChannel,
|
209
|
+
target: Operator | None = None,
|
210
|
+
require_cp: bool = True,
|
211
|
+
require_tp: bool = False,
|
212
|
+
) -> float:
|
213
|
+
r"""Return the gate error of a noisy quantum channel.
|
214
|
+
|
215
|
+
The gate error :math:`E` is given by the average gate infidelity
|
216
|
+
|
217
|
+
.. math::
|
218
|
+
E(\mathcal{E}, U) = 1 - F_{\text{ave}}(\mathcal{E}, U)
|
219
|
+
|
220
|
+
where :math:`F_{\text{ave}}(\mathcal{E}, U)` is the
|
221
|
+
:meth:`~qiskit.quantum_info.average_gate_fidelity` of the input
|
222
|
+
quantum *channel* :math:`\mathcal{E}` with a *target* unitary
|
223
|
+
:math:`U`.
|
224
|
+
|
225
|
+
Args:
|
226
|
+
channel (QuantumChannel): noisy quantum channel.
|
227
|
+
target (Operator or None): target unitary operator.
|
228
|
+
If `None` target is the identity operator [Default: None].
|
229
|
+
require_cp (bool): check if input and target channels are
|
230
|
+
completely-positive and if non-CP log warning
|
231
|
+
containing negative eigenvalues of Choi-matrix
|
232
|
+
[Default: True].
|
233
|
+
require_tp (bool): check if input and target channels are
|
234
|
+
trace-preserving and if non-TP log warning
|
235
|
+
containing negative eigenvalues of partial
|
236
|
+
Choi-matrix :math:`Tr_{\text{out}}[\mathcal{E}] - I`
|
237
|
+
[Default: True].
|
238
|
+
|
239
|
+
Returns:
|
240
|
+
float: The average gate error :math:`E`.
|
241
|
+
|
242
|
+
Raises:
|
243
|
+
QiskitError: if the channel and target do not have the same dimensions,
|
244
|
+
or have different input and output dimensions.
|
245
|
+
"""
|
246
|
+
# Format inputs
|
247
|
+
channel = _input_formatter(channel, SuperOp, "gate_error", "channel")
|
248
|
+
target = _input_formatter(target, Operator, "gate_error", "target")
|
249
|
+
return 1 - average_gate_fidelity(
|
250
|
+
channel, target=target, require_cp=require_cp, require_tp=require_tp
|
251
|
+
)
|
252
|
+
|
253
|
+
|
254
|
+
def diamond_norm(choi: Choi | QuantumChannel, solver: str = "SCS", **kwargs) -> float:
|
255
|
+
r"""Return the diamond norm of the input quantum channel object.
|
256
|
+
|
257
|
+
This function computes the completely-bounded trace-norm (often
|
258
|
+
referred to as the diamond-norm) of the input quantum channel object
|
259
|
+
using the semidefinite-program from reference [1].
|
260
|
+
|
261
|
+
Args:
|
262
|
+
choi(Choi or QuantumChannel): a quantum channel object or
|
263
|
+
Choi-matrix array.
|
264
|
+
solver (str): The solver to use.
|
265
|
+
kwargs: optional arguments to pass to CVXPY solver.
|
266
|
+
|
267
|
+
Returns:
|
268
|
+
float: The completely-bounded trace norm :math:`\|\mathcal{E}\|_{\diamond}`.
|
269
|
+
|
270
|
+
Raises:
|
271
|
+
QiskitError: if CVXPY package cannot be found.
|
272
|
+
|
273
|
+
Additional Information:
|
274
|
+
The input to this function is typically *not* a CPTP quantum
|
275
|
+
channel, but rather the *difference* between two quantum channels
|
276
|
+
:math:`\|\Delta\mathcal{E}\|_\diamond` where
|
277
|
+
:math:`\Delta\mathcal{E} = \mathcal{E}_1 - \mathcal{E}_2`.
|
278
|
+
|
279
|
+
Reference:
|
280
|
+
J. Watrous. "Simpler semidefinite programs for completely bounded
|
281
|
+
norms", arXiv:1207.5726 [quant-ph] (2012).
|
282
|
+
|
283
|
+
.. note::
|
284
|
+
|
285
|
+
This function requires the optional CVXPY package to be installed.
|
286
|
+
Any additional kwargs will be passed to the ``cvxpy.solve``
|
287
|
+
function. See the CVXPY documentation for information on available
|
288
|
+
SDP solvers.
|
289
|
+
"""
|
290
|
+
from scipy import sparse
|
291
|
+
|
292
|
+
cvxpy = _cvxpy_check("`diamond_norm`") # Check CVXPY is installed
|
293
|
+
|
294
|
+
choi = Choi(_input_formatter(choi, Choi, "diamond_norm", "choi"))
|
295
|
+
|
296
|
+
def cvx_bmat(mat_r, mat_i):
|
297
|
+
"""Block matrix for embedding complex matrix in reals"""
|
298
|
+
return cvxpy.bmat([[mat_r, -mat_i], [mat_i, mat_r]])
|
299
|
+
|
300
|
+
# Dimension of input and output spaces
|
301
|
+
dim_in = choi._input_dim
|
302
|
+
dim_out = choi._output_dim
|
303
|
+
size = dim_in * dim_out
|
304
|
+
|
305
|
+
# SDP Variables to convert to real valued problem
|
306
|
+
r0_r = cvxpy.Variable((dim_in, dim_in))
|
307
|
+
r0_i = cvxpy.Variable((dim_in, dim_in))
|
308
|
+
r0 = cvx_bmat(r0_r, r0_i)
|
309
|
+
|
310
|
+
r1_r = cvxpy.Variable((dim_in, dim_in))
|
311
|
+
r1_i = cvxpy.Variable((dim_in, dim_in))
|
312
|
+
r1 = cvx_bmat(r1_r, r1_i)
|
313
|
+
|
314
|
+
x_r = cvxpy.Variable((size, size))
|
315
|
+
x_i = cvxpy.Variable((size, size))
|
316
|
+
iden = sparse.eye(dim_out)
|
317
|
+
|
318
|
+
# Watrous uses row-vec convention for his Choi matrix while we use
|
319
|
+
# col-vec. It turns out row-vec convention is required for CVXPY too
|
320
|
+
# since the cvxpy.kron function must have a constant as its first argument.
|
321
|
+
c_r = cvxpy.bmat([[cvxpy.kron(iden, r0_r), x_r], [x_r.T, cvxpy.kron(iden, r1_r)]])
|
322
|
+
c_i = cvxpy.bmat([[cvxpy.kron(iden, r0_i), x_i], [-x_i.T, cvxpy.kron(iden, r1_i)]])
|
323
|
+
c = cvx_bmat(c_r, c_i)
|
324
|
+
|
325
|
+
# Convert col-vec convention Choi-matrix to row-vec convention and
|
326
|
+
# then take Transpose: Choi_C -> Choi_R.T
|
327
|
+
choi_rt = np.transpose(
|
328
|
+
np.reshape(choi.data, (dim_in, dim_out, dim_in, dim_out)), (3, 2, 1, 0)
|
329
|
+
).reshape(choi.data.shape)
|
330
|
+
choi_rt_r = choi_rt.real
|
331
|
+
choi_rt_i = choi_rt.imag
|
332
|
+
|
333
|
+
# Constraints
|
334
|
+
cons = [
|
335
|
+
r0 >> 0,
|
336
|
+
r0_r == r0_r.T,
|
337
|
+
r0_i == -r0_i.T,
|
338
|
+
cvxpy.trace(r0_r) == 1,
|
339
|
+
r1 >> 0,
|
340
|
+
r1_r == r1_r.T,
|
341
|
+
r1_i == -r1_i.T,
|
342
|
+
cvxpy.trace(r1_r) == 1,
|
343
|
+
c >> 0,
|
344
|
+
]
|
345
|
+
|
346
|
+
# Objective function
|
347
|
+
obj = cvxpy.Maximize(cvxpy.trace(choi_rt_r @ x_r) + cvxpy.trace(choi_rt_i @ x_i))
|
348
|
+
prob = cvxpy.Problem(obj, cons)
|
349
|
+
sol = prob.solve(solver=solver, **kwargs)
|
350
|
+
return sol
|
351
|
+
|
352
|
+
|
353
|
+
def _cvxpy_check(name):
|
354
|
+
"""Check that a supported CVXPY version is installed"""
|
355
|
+
# Check if CVXPY package is installed
|
356
|
+
_optionals.HAS_CVXPY.require_now(name)
|
357
|
+
import cvxpy
|
358
|
+
|
359
|
+
# Check CVXPY version
|
360
|
+
version = cvxpy.__version__
|
361
|
+
if version[0] != "1":
|
362
|
+
raise MissingOptionalLibraryError(
|
363
|
+
"CVXPY >= 1.0",
|
364
|
+
"diamond_norm",
|
365
|
+
msg=f"Incompatible CVXPY version {version} found.",
|
366
|
+
)
|
367
|
+
return cvxpy
|
368
|
+
|
369
|
+
|
370
|
+
# pylint: disable=too-many-return-statements
|
371
|
+
def _input_formatter(obj, fallback_class, func_name, arg_name):
|
372
|
+
"""Formatting function for input conversion"""
|
373
|
+
# Empty input
|
374
|
+
if obj is None:
|
375
|
+
return obj
|
376
|
+
|
377
|
+
# Channel-like input
|
378
|
+
if isinstance(obj, QuantumChannel):
|
379
|
+
return obj
|
380
|
+
if hasattr(obj, "to_quantumchannel"):
|
381
|
+
return obj.to_quantumchannel()
|
382
|
+
if hasattr(obj, "to_channel"):
|
383
|
+
return obj.to_channel()
|
384
|
+
|
385
|
+
# Unitary-like input
|
386
|
+
if isinstance(obj, (Gate, BaseOperator)):
|
387
|
+
return Operator(obj)
|
388
|
+
if hasattr(obj, "to_operator"):
|
389
|
+
return obj.to_operator()
|
390
|
+
raise TypeError(
|
391
|
+
f"invalid type supplied to {arg_name} of {func_name}."
|
392
|
+
f" A {fallback_class.__name__} is best."
|
393
|
+
)
|
394
|
+
|
395
|
+
|
396
|
+
def _cp_condition(channel):
|
397
|
+
"""Return Choi-matrix eigenvalues for checking if channel is CP"""
|
398
|
+
if isinstance(channel, QuantumChannel):
|
399
|
+
if not isinstance(channel, Choi):
|
400
|
+
channel = Choi(channel)
|
401
|
+
return np.linalg.eigvalsh(channel.data)
|
402
|
+
unitary = Operator(channel).data
|
403
|
+
return np.tensordot(unitary, unitary.conj(), axes=([0, 1], [0, 1])).real
|
404
|
+
|
405
|
+
|
406
|
+
def _tp_condition(channel):
|
407
|
+
"""Return partial tr Choi-matrix eigenvalues for checking if channel is TP"""
|
408
|
+
if isinstance(channel, QuantumChannel):
|
409
|
+
if not isinstance(channel, Choi):
|
410
|
+
channel = Choi(channel)
|
411
|
+
choi = channel.data
|
412
|
+
dims = tuple(np.sqrt(choi.shape).astype(int))
|
413
|
+
shape = dims + dims
|
414
|
+
tr_choi = np.trace(np.reshape(choi, shape), axis1=1, axis2=3)
|
415
|
+
else:
|
416
|
+
unitary = Operator(channel).data
|
417
|
+
tr_choi = np.tensordot(unitary, unitary.conj(), axes=(0, 0))
|
418
|
+
return np.linalg.eigvalsh(tr_choi - np.eye(len(tr_choi)))
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2021.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""
|
14
|
+
Operator Mixins
|
15
|
+
"""
|
16
|
+
|
17
|
+
from inspect import getdoc
|
18
|
+
|
19
|
+
from .group import GroupMixin
|
20
|
+
from .adjoint import AdjointMixin
|
21
|
+
from .linear import LinearMixin
|
22
|
+
from .multiply import MultiplyMixin
|
23
|
+
from .tolerances import TolerancesMixin
|
24
|
+
|
25
|
+
|
26
|
+
def generate_apidocs(cls):
|
27
|
+
"""Decorator to format API docstrings for classes using Mixins.
|
28
|
+
|
29
|
+
This runs string replacement on the docstrings of the mixin
|
30
|
+
methods to replace the placeholder CLASS with the class
|
31
|
+
name `cls.__name__`.
|
32
|
+
|
33
|
+
Args:
|
34
|
+
cls (type): The class to format docstrings.
|
35
|
+
|
36
|
+
Returns:
|
37
|
+
cls: the original class with updated docstrings.
|
38
|
+
"""
|
39
|
+
|
40
|
+
def _replace_name(mixin, methods):
|
41
|
+
if issubclass(cls, mixin):
|
42
|
+
for i in methods:
|
43
|
+
meth = getattr(cls, i)
|
44
|
+
doc = getdoc(meth)
|
45
|
+
if doc is not None:
|
46
|
+
meth.__doc__ = doc.replace("CLASS", cls.__name__)
|
47
|
+
|
48
|
+
_replace_name(GroupMixin, ("tensor", "expand", "compose", "dot", "power"))
|
49
|
+
_replace_name(AdjointMixin, ("transpose", "conjugate", "adjoint"))
|
50
|
+
_replace_name(MultiplyMixin, ("_multiply",))
|
51
|
+
_replace_name(LinearMixin, ("_add",))
|
52
|
+
return cls
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2021.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""
|
14
|
+
Mixin for gate operator interface.
|
15
|
+
"""
|
16
|
+
|
17
|
+
import sys
|
18
|
+
from abc import ABC, abstractmethod
|
19
|
+
|
20
|
+
if sys.version_info >= (3, 11):
|
21
|
+
from typing import Self
|
22
|
+
else:
|
23
|
+
from typing_extensions import Self
|
24
|
+
|
25
|
+
|
26
|
+
class AdjointMixin(ABC):
|
27
|
+
"""Abstract Mixin for operator adjoint and transpose operations.
|
28
|
+
|
29
|
+
This class defines the following methods
|
30
|
+
|
31
|
+
- :meth:`transpose`
|
32
|
+
- :meth:`conjugate`
|
33
|
+
- :meth:`adjoint`
|
34
|
+
|
35
|
+
The following abstract methods must be implemented by subclasses
|
36
|
+
using this mixin
|
37
|
+
|
38
|
+
- ``conjugate(self)``
|
39
|
+
- ``transpose(self)``
|
40
|
+
"""
|
41
|
+
|
42
|
+
def adjoint(self) -> Self:
|
43
|
+
"""Return the adjoint of the CLASS."""
|
44
|
+
return self.conjugate().transpose()
|
45
|
+
|
46
|
+
@abstractmethod
|
47
|
+
def conjugate(self) -> Self:
|
48
|
+
"""Return the conjugate of the CLASS."""
|
49
|
+
|
50
|
+
@abstractmethod
|
51
|
+
def transpose(self) -> Self:
|
52
|
+
"""Return the transpose of the CLASS."""
|
@@ -0,0 +1,171 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2021.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""
|
14
|
+
Mixin for gate operator interface.
|
15
|
+
"""
|
16
|
+
|
17
|
+
import sys
|
18
|
+
from abc import ABC, abstractmethod
|
19
|
+
from numbers import Integral
|
20
|
+
|
21
|
+
from qiskit.exceptions import QiskitError
|
22
|
+
|
23
|
+
if sys.version_info >= (3, 11):
|
24
|
+
from typing import Self
|
25
|
+
else:
|
26
|
+
from typing_extensions import Self
|
27
|
+
|
28
|
+
|
29
|
+
class GroupMixin(ABC):
|
30
|
+
"""Abstract Mixin for operator group operations.
|
31
|
+
|
32
|
+
This class defines the following methods
|
33
|
+
|
34
|
+
- :meth:`compose`
|
35
|
+
- :meth:`dot`
|
36
|
+
- :meth:`tensor`
|
37
|
+
- :meth:`expand`
|
38
|
+
- :meth:`power`
|
39
|
+
|
40
|
+
And the following operator overloads:
|
41
|
+
|
42
|
+
- ``&``, ``__and__`` -> :meth:`compose`
|
43
|
+
- ``@``, ``__matmul__`` -> :meth:`dot`
|
44
|
+
- ``^``, ``__xor__`` -> `:meth:`tensor`
|
45
|
+
- ``**``, ``__pow__`` -> :meth:`power`
|
46
|
+
|
47
|
+
The following abstract methods must be implemented by subclasses
|
48
|
+
using this mixin
|
49
|
+
|
50
|
+
- ``compose(self, other, qargs=None, inplace=False)``
|
51
|
+
- ``tensor(self, other)``
|
52
|
+
- ``expand(self, other)``
|
53
|
+
"""
|
54
|
+
|
55
|
+
def __and__(self, other) -> Self:
|
56
|
+
return self.compose(other)
|
57
|
+
|
58
|
+
def __pow__(self, n) -> Self:
|
59
|
+
return self.power(n)
|
60
|
+
|
61
|
+
def __xor__(self, other) -> Self:
|
62
|
+
return self.tensor(other)
|
63
|
+
|
64
|
+
def __matmul__(self, other) -> Self:
|
65
|
+
return self.dot(other)
|
66
|
+
|
67
|
+
@abstractmethod
|
68
|
+
def tensor(self, other) -> Self:
|
69
|
+
r"""Return the tensor product with another CLASS.
|
70
|
+
|
71
|
+
Args:
|
72
|
+
other (CLASS): a CLASS object.
|
73
|
+
|
74
|
+
Returns:
|
75
|
+
CLASS: the tensor product :math:`a \otimes b`, where :math:`a`
|
76
|
+
is the current CLASS, and :math:`b` is the other CLASS.
|
77
|
+
|
78
|
+
.. note::
|
79
|
+
The tensor product can be obtained using the ``^`` binary operator.
|
80
|
+
Hence ``a.tensor(b)`` is equivalent to ``a ^ b``.
|
81
|
+
|
82
|
+
.. note:
|
83
|
+
Tensor uses reversed operator ordering to :meth:`expand`.
|
84
|
+
For two operators of the same type ``a.tensor(b) = b.expand(a)``.
|
85
|
+
"""
|
86
|
+
|
87
|
+
@abstractmethod
|
88
|
+
def expand(self, other) -> Self:
|
89
|
+
r"""Return the reverse-order tensor product with another CLASS.
|
90
|
+
|
91
|
+
Args:
|
92
|
+
other (CLASS): a CLASS object.
|
93
|
+
|
94
|
+
Returns:
|
95
|
+
CLASS: the tensor product :math:`b \otimes a`, where :math:`a`
|
96
|
+
is the current CLASS, and :math:`b` is the other CLASS.
|
97
|
+
|
98
|
+
.. note:
|
99
|
+
Expand is the opposite operator ordering to :meth:`tensor`.
|
100
|
+
For two operators of the same type ``a.expand(b) = b.tensor(a)``.
|
101
|
+
"""
|
102
|
+
|
103
|
+
@abstractmethod
|
104
|
+
def compose(self, other, qargs=None, front=False) -> Self:
|
105
|
+
"""Return the operator composition with another CLASS.
|
106
|
+
|
107
|
+
Args:
|
108
|
+
other (CLASS): a CLASS object.
|
109
|
+
qargs (list or None): Optional, a list of subsystem positions to
|
110
|
+
apply other on. If None apply on all
|
111
|
+
subsystems (default: None).
|
112
|
+
front (bool): If True compose using right operator multiplication,
|
113
|
+
instead of left multiplication [default: False].
|
114
|
+
|
115
|
+
Returns:
|
116
|
+
CLASS: The composed CLASS.
|
117
|
+
|
118
|
+
Raises:
|
119
|
+
QiskitError: if other cannot be converted to an operator, or has
|
120
|
+
incompatible dimensions for specified subsystems.
|
121
|
+
|
122
|
+
.. note::
|
123
|
+
Composition (``&``) by default is defined as `left` matrix multiplication for
|
124
|
+
matrix operators, while ``@`` (equivalent to :meth:`dot`) is defined as `right` matrix
|
125
|
+
multiplication. That is that ``A & B == A.compose(B)`` is equivalent to
|
126
|
+
``B @ A == B.dot(A)`` when ``A`` and ``B`` are of the same type.
|
127
|
+
|
128
|
+
Setting the ``front=True`` kwarg changes this to `right` matrix
|
129
|
+
multiplication and is equivalent to the :meth:`dot` method
|
130
|
+
``A.dot(B) == A.compose(B, front=True)``.
|
131
|
+
"""
|
132
|
+
|
133
|
+
def dot(self, other, qargs=None) -> Self:
|
134
|
+
"""Return the right multiplied operator self * other.
|
135
|
+
|
136
|
+
Args:
|
137
|
+
other (CLASS): an operator object.
|
138
|
+
qargs (list or None): Optional, a list of subsystem positions to
|
139
|
+
apply other on. If None apply on all
|
140
|
+
subsystems (default: None).
|
141
|
+
|
142
|
+
Returns:
|
143
|
+
CLASS: The right matrix multiplied CLASS.
|
144
|
+
|
145
|
+
.. note::
|
146
|
+
The dot product can be obtained using the ``@`` binary operator.
|
147
|
+
Hence ``a.dot(b)`` is equivalent to ``a @ b``.
|
148
|
+
"""
|
149
|
+
return self.compose(other, qargs=qargs, front=True)
|
150
|
+
|
151
|
+
def power(self, n) -> Self:
|
152
|
+
"""Return the compose of a operator with itself n times.
|
153
|
+
|
154
|
+
Args:
|
155
|
+
n (int): the number of times to compose with self (n>0).
|
156
|
+
|
157
|
+
Returns:
|
158
|
+
CLASS: the n-times composed operator.
|
159
|
+
|
160
|
+
Raises:
|
161
|
+
QiskitError: if the input and output dimensions of the operator
|
162
|
+
are not equal, or the power is not a positive integer.
|
163
|
+
"""
|
164
|
+
# NOTE: if a subclass can have negative or non-integer powers
|
165
|
+
# this method should be overridden in that class.
|
166
|
+
if not isinstance(n, Integral) or n < 1:
|
167
|
+
raise QiskitError("Can only power with positive integer powers.")
|
168
|
+
ret = self
|
169
|
+
for _ in range(1, n):
|
170
|
+
ret = ret.dot(self)
|
171
|
+
return ret
|