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,76 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2024.
|
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
|
+
Additional utilities for Operators.
|
15
|
+
"""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
|
19
|
+
from qiskit.quantum_info import Operator
|
20
|
+
from qiskit.quantum_info.operators.predicates import matrix_equal
|
21
|
+
|
22
|
+
|
23
|
+
def _equal_with_ancillas(
|
24
|
+
op1: Operator,
|
25
|
+
op2: Operator,
|
26
|
+
ancilla_qubits: list[int],
|
27
|
+
ignore_phase: bool = False,
|
28
|
+
rtol: float | None = None,
|
29
|
+
atol: float | None = None,
|
30
|
+
) -> bool:
|
31
|
+
r"""Test if two Operators are equal on the subspace where ancilla qubits
|
32
|
+
are :math:`|0\rangle`.
|
33
|
+
|
34
|
+
Args:
|
35
|
+
op1 (Operator): an operator object.
|
36
|
+
op2 (Operator): an operator object.
|
37
|
+
ancilla_qubits (list[int]): a list of clean ancilla qubits.
|
38
|
+
ignore_phase (bool): ignore complex-phase difference between matrices.
|
39
|
+
rtol (float): relative tolerance value for comparison.
|
40
|
+
atol (float): absolute tolerance value for comparison.
|
41
|
+
|
42
|
+
Returns:
|
43
|
+
bool: True iff operators are equal up to clean ancilla qubits.
|
44
|
+
"""
|
45
|
+
if op1.dim != op2.dim:
|
46
|
+
return False
|
47
|
+
|
48
|
+
if atol is None:
|
49
|
+
atol = op1.atol
|
50
|
+
if rtol is None:
|
51
|
+
rtol = op1.rtol
|
52
|
+
|
53
|
+
num_qubits = op1._op_shape._num_qargs_l
|
54
|
+
num_non_ancillas = num_qubits - len(ancilla_qubits)
|
55
|
+
|
56
|
+
# Find a permutation that moves all ancilla qubits to the back
|
57
|
+
pattern = []
|
58
|
+
ancillas = []
|
59
|
+
for q in range(num_qubits):
|
60
|
+
if q not in ancilla_qubits:
|
61
|
+
pattern.append(q)
|
62
|
+
else:
|
63
|
+
ancillas.append(q)
|
64
|
+
pattern = pattern + ancillas
|
65
|
+
|
66
|
+
# Apply this permutation to both operators
|
67
|
+
permuted1 = op1.apply_permutation(pattern)
|
68
|
+
permuted2 = op2.apply_permutation(pattern)
|
69
|
+
|
70
|
+
# Restrict to the subspace where ancillas are 0
|
71
|
+
restricted1 = permuted1.data[: 2**num_non_ancillas, : 2**num_qubits]
|
72
|
+
restricted2 = permuted2.data[: 2**num_non_ancillas, : 2**num_qubits]
|
73
|
+
|
74
|
+
return matrix_equal(
|
75
|
+
restricted1, restricted2.data, ignore_phase=ignore_phase, rtol=rtol, atol=atol
|
76
|
+
)
|
@@ -0,0 +1,183 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2019.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""
|
14
|
+
Predicates for operators.
|
15
|
+
"""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
import numpy as np
|
19
|
+
|
20
|
+
ATOL_DEFAULT = 1e-8
|
21
|
+
RTOL_DEFAULT = 1e-5
|
22
|
+
|
23
|
+
|
24
|
+
def matrix_equal(mat1, mat2, ignore_phase=False, rtol=RTOL_DEFAULT, atol=ATOL_DEFAULT, props=None):
|
25
|
+
# pylint: disable-next=consider-using-f-string
|
26
|
+
"""Test if two arrays are equal.
|
27
|
+
|
28
|
+
The final comparison is implemented using Numpy.allclose. See its
|
29
|
+
documentation for additional information on tolerance parameters.
|
30
|
+
|
31
|
+
If ignore_phase is True both matrices will be multiplied by
|
32
|
+
exp(-1j * theta) where `theta` is the first nphase for a
|
33
|
+
first non-zero matrix element `|a| * exp(1j * theta)`.
|
34
|
+
|
35
|
+
Args:
|
36
|
+
mat1 (matrix_like): a matrix
|
37
|
+
mat2 (matrix_like): a matrix
|
38
|
+
ignore_phase (bool): ignore complex-phase differences between
|
39
|
+
matrices [Default: False]
|
40
|
+
rtol (double): the relative tolerance parameter [Default {}].
|
41
|
+
atol (double): the absolute tolerance parameter [Default {}].
|
42
|
+
props (dict | None): if not ``None`` and ``ignore_phase`` is ``True``
|
43
|
+
returns the phase difference between the two matrices under
|
44
|
+
``props['phase_difference']``
|
45
|
+
|
46
|
+
Returns:
|
47
|
+
bool: True if the matrices are equal or False otherwise.
|
48
|
+
""".format(
|
49
|
+
RTOL_DEFAULT, ATOL_DEFAULT
|
50
|
+
)
|
51
|
+
|
52
|
+
if atol is None:
|
53
|
+
atol = ATOL_DEFAULT
|
54
|
+
if rtol is None:
|
55
|
+
rtol = RTOL_DEFAULT
|
56
|
+
|
57
|
+
if not isinstance(mat1, np.ndarray):
|
58
|
+
mat1 = np.array(mat1)
|
59
|
+
if not isinstance(mat2, np.ndarray):
|
60
|
+
mat2 = np.array(mat2)
|
61
|
+
|
62
|
+
if mat1.shape != mat2.shape:
|
63
|
+
return False
|
64
|
+
|
65
|
+
if ignore_phase:
|
66
|
+
phase_difference = 0
|
67
|
+
|
68
|
+
# Get phase of first non-zero entry of mat1 and mat2
|
69
|
+
# and multiply all entries by the conjugate
|
70
|
+
for elt in mat1.flat:
|
71
|
+
if abs(elt) > atol:
|
72
|
+
angle = np.angle(elt)
|
73
|
+
phase_difference -= angle
|
74
|
+
mat1 = np.exp(-1j * angle) * mat1
|
75
|
+
break
|
76
|
+
for elt in mat2.flat:
|
77
|
+
if abs(elt) > atol:
|
78
|
+
angle = np.angle(elt)
|
79
|
+
phase_difference += angle
|
80
|
+
mat2 = np.exp(-1j * np.angle(elt)) * mat2
|
81
|
+
break
|
82
|
+
if props is not None:
|
83
|
+
props["phase_difference"] = phase_difference
|
84
|
+
|
85
|
+
return np.allclose(mat1, mat2, rtol=rtol, atol=atol)
|
86
|
+
|
87
|
+
|
88
|
+
def is_square_matrix(mat):
|
89
|
+
"""Test if an array is a square matrix."""
|
90
|
+
mat = np.array(mat)
|
91
|
+
if mat.ndim != 2:
|
92
|
+
return False
|
93
|
+
shape = mat.shape
|
94
|
+
return shape[0] == shape[1]
|
95
|
+
|
96
|
+
|
97
|
+
def is_diagonal_matrix(mat, rtol=RTOL_DEFAULT, atol=ATOL_DEFAULT):
|
98
|
+
"""Test if an array is a diagonal matrix"""
|
99
|
+
if atol is None:
|
100
|
+
atol = ATOL_DEFAULT
|
101
|
+
if rtol is None:
|
102
|
+
rtol = RTOL_DEFAULT
|
103
|
+
mat = np.array(mat)
|
104
|
+
if mat.ndim != 2:
|
105
|
+
return False
|
106
|
+
return np.allclose(mat, np.diag(np.diagonal(mat)), rtol=rtol, atol=atol)
|
107
|
+
|
108
|
+
|
109
|
+
def is_symmetric_matrix(op, rtol=RTOL_DEFAULT, atol=ATOL_DEFAULT):
|
110
|
+
"""Test if an array is a symmetric matrix"""
|
111
|
+
if atol is None:
|
112
|
+
atol = ATOL_DEFAULT
|
113
|
+
if rtol is None:
|
114
|
+
rtol = RTOL_DEFAULT
|
115
|
+
mat = np.array(op)
|
116
|
+
if mat.ndim != 2:
|
117
|
+
return False
|
118
|
+
return np.allclose(mat, mat.T, rtol=rtol, atol=atol)
|
119
|
+
|
120
|
+
|
121
|
+
def is_hermitian_matrix(mat, rtol=RTOL_DEFAULT, atol=ATOL_DEFAULT):
|
122
|
+
"""Test if an array is a Hermitian matrix"""
|
123
|
+
if atol is None:
|
124
|
+
atol = ATOL_DEFAULT
|
125
|
+
if rtol is None:
|
126
|
+
rtol = RTOL_DEFAULT
|
127
|
+
mat = np.array(mat)
|
128
|
+
if mat.ndim != 2:
|
129
|
+
return False
|
130
|
+
return np.allclose(mat, np.conj(mat.T), rtol=rtol, atol=atol)
|
131
|
+
|
132
|
+
|
133
|
+
def is_positive_semidefinite_matrix(mat, rtol=RTOL_DEFAULT, atol=ATOL_DEFAULT):
|
134
|
+
"""Test if a matrix is positive semidefinite"""
|
135
|
+
if atol is None:
|
136
|
+
atol = ATOL_DEFAULT
|
137
|
+
if rtol is None:
|
138
|
+
rtol = RTOL_DEFAULT
|
139
|
+
if not is_hermitian_matrix(mat, rtol=rtol, atol=atol):
|
140
|
+
return False
|
141
|
+
# Check eigenvalues are all positive
|
142
|
+
vals = np.linalg.eigvalsh(mat)
|
143
|
+
for v in vals:
|
144
|
+
if v < -atol:
|
145
|
+
return False
|
146
|
+
return True
|
147
|
+
|
148
|
+
|
149
|
+
def is_identity_matrix(mat, ignore_phase=False, rtol=RTOL_DEFAULT, atol=ATOL_DEFAULT):
|
150
|
+
"""Test if an array is an identity matrix."""
|
151
|
+
if atol is None:
|
152
|
+
atol = ATOL_DEFAULT
|
153
|
+
if rtol is None:
|
154
|
+
rtol = RTOL_DEFAULT
|
155
|
+
mat = np.array(mat)
|
156
|
+
if mat.ndim != 2:
|
157
|
+
return False
|
158
|
+
if ignore_phase:
|
159
|
+
# If the matrix is equal to an identity up to a phase, we can
|
160
|
+
# remove the phase by multiplying each entry by the complex
|
161
|
+
# conjugate of the phase of the [0, 0] entry.
|
162
|
+
theta = np.angle(mat[0, 0])
|
163
|
+
mat = np.exp(-1j * theta) * mat
|
164
|
+
# Check if square identity
|
165
|
+
iden = np.eye(len(mat))
|
166
|
+
return np.allclose(mat, iden, rtol=rtol, atol=atol)
|
167
|
+
|
168
|
+
|
169
|
+
def is_unitary_matrix(mat, rtol=RTOL_DEFAULT, atol=ATOL_DEFAULT):
|
170
|
+
"""Test if an array is a unitary matrix."""
|
171
|
+
mat = np.array(mat)
|
172
|
+
# Compute A^dagger.A and see if it is identity matrix
|
173
|
+
mat = np.conj(mat.T).dot(mat)
|
174
|
+
return is_identity_matrix(mat, ignore_phase=False, rtol=rtol, atol=atol)
|
175
|
+
|
176
|
+
|
177
|
+
def is_isometry(mat, rtol=RTOL_DEFAULT, atol=ATOL_DEFAULT):
|
178
|
+
"""Test if an array is an isometry."""
|
179
|
+
mat = np.array(mat)
|
180
|
+
# Compute A^dagger.A and see if it is identity matrix
|
181
|
+
iden = np.eye(mat.shape[1])
|
182
|
+
mat = np.conj(mat.T).dot(mat)
|
183
|
+
return np.allclose(mat, iden, rtol=rtol, atol=atol)
|
@@ -0,0 +1,154 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2020.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""
|
14
|
+
Methods to create random operators.
|
15
|
+
"""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
|
19
|
+
import numpy as np
|
20
|
+
from numpy.random import default_rng
|
21
|
+
|
22
|
+
from qiskit.exceptions import QiskitError
|
23
|
+
from qiskit.quantum_info.operators import Operator, Stinespring
|
24
|
+
|
25
|
+
# pylint: disable=unused-import
|
26
|
+
from .dihedral.random import random_cnotdihedral
|
27
|
+
from .symplectic.random import random_clifford, random_pauli, random_pauli_list
|
28
|
+
|
29
|
+
DEFAULT_RNG = default_rng()
|
30
|
+
|
31
|
+
|
32
|
+
def random_unitary(dims: int | tuple, seed: int | np.random.Generator | None = None):
|
33
|
+
"""Return a random unitary Operator.
|
34
|
+
|
35
|
+
The operator is sampled from the unitary Haar measure.
|
36
|
+
|
37
|
+
Args:
|
38
|
+
dims (int or tuple): the input dimensions of the Operator.
|
39
|
+
seed (int or np.random.Generator): Optional. Set a fixed seed or
|
40
|
+
generator for RNG.
|
41
|
+
|
42
|
+
Returns:
|
43
|
+
Operator: a unitary operator.
|
44
|
+
"""
|
45
|
+
if seed is None:
|
46
|
+
random_state = DEFAULT_RNG
|
47
|
+
elif isinstance(seed, np.random.Generator):
|
48
|
+
random_state = seed
|
49
|
+
else:
|
50
|
+
random_state = default_rng(seed)
|
51
|
+
|
52
|
+
dim = np.prod(dims)
|
53
|
+
from scipy import stats
|
54
|
+
|
55
|
+
mat = stats.unitary_group.rvs(dim, random_state=random_state)
|
56
|
+
return Operator(mat, input_dims=dims, output_dims=dims)
|
57
|
+
|
58
|
+
|
59
|
+
def random_hermitian(
|
60
|
+
dims: int | tuple, traceless: bool = False, seed: int | np.random.Generator | None = None
|
61
|
+
):
|
62
|
+
"""Return a random hermitian Operator.
|
63
|
+
|
64
|
+
The operator is sampled from Gaussian Unitary Ensemble.
|
65
|
+
|
66
|
+
Args:
|
67
|
+
dims (int or tuple): the input dimension of the Operator.
|
68
|
+
traceless (bool): Optional. If True subtract diagonal entries to
|
69
|
+
return a traceless hermitian operator
|
70
|
+
(Default: False).
|
71
|
+
seed (int or np.random.Generator): Optional. Set a fixed seed or
|
72
|
+
generator for RNG.
|
73
|
+
|
74
|
+
Returns:
|
75
|
+
Operator: a Hermitian operator.
|
76
|
+
"""
|
77
|
+
if seed is None:
|
78
|
+
rng = DEFAULT_RNG
|
79
|
+
elif isinstance(seed, np.random.Generator):
|
80
|
+
rng = seed
|
81
|
+
else:
|
82
|
+
rng = default_rng(seed)
|
83
|
+
|
84
|
+
# Total dimension
|
85
|
+
dim = np.prod(dims)
|
86
|
+
from scipy import stats
|
87
|
+
|
88
|
+
if traceless:
|
89
|
+
mat = np.zeros((dim, dim), dtype=complex)
|
90
|
+
else:
|
91
|
+
# Generate diagonal part of matrix for Gaussian N(0, 1)
|
92
|
+
mat = np.diag(stats.norm.rvs(scale=1, size=dim, random_state=rng).astype(complex))
|
93
|
+
|
94
|
+
# Generate lower triangular values from Gaussian N(0, 0.5)
|
95
|
+
num_tril = (dim * (dim - 1)) // 2
|
96
|
+
real_tril = stats.norm.rvs(scale=0.5, size=num_tril, random_state=rng)
|
97
|
+
imag_tril = stats.norm.rvs(scale=0.5, size=num_tril, random_state=rng)
|
98
|
+
# Get lower triangular indices
|
99
|
+
rows, cols = np.tril_indices(dim, -1)
|
100
|
+
mat[(rows, cols)] = real_tril + 1j * imag_tril
|
101
|
+
mat[(cols, rows)] = real_tril - 1j * imag_tril
|
102
|
+
return Operator(mat, input_dims=dims, output_dims=dims)
|
103
|
+
|
104
|
+
|
105
|
+
def random_quantum_channel(
|
106
|
+
input_dims: int | tuple | None = None,
|
107
|
+
output_dims: int | tuple | None = None,
|
108
|
+
rank: int | None = None,
|
109
|
+
seed: int | np.random.Generator | None = None,
|
110
|
+
):
|
111
|
+
"""Return a random CPTP quantum channel.
|
112
|
+
|
113
|
+
This constructs the Stinespring operator for the quantum channel by
|
114
|
+
sampling a random isometry from the unitary Haar measure.
|
115
|
+
|
116
|
+
Args:
|
117
|
+
input_dims (int or tuple): the input dimension of the channel.
|
118
|
+
output_dims (int or tuple): the input dimension of the channel.
|
119
|
+
rank (int): Optional. The rank of the quantum channel Choi-matrix.
|
120
|
+
seed (int or np.random.Generator): Optional. Set a fixed seed or
|
121
|
+
generator for RNG.
|
122
|
+
|
123
|
+
Returns:
|
124
|
+
Stinespring: a quantum channel operator.
|
125
|
+
|
126
|
+
Raises:
|
127
|
+
QiskitError: if rank or dimensions are invalid.
|
128
|
+
"""
|
129
|
+
# Determine total input and output dimensions
|
130
|
+
if input_dims is None and output_dims is None:
|
131
|
+
raise QiskitError(
|
132
|
+
"No dimensions specified: input_dims and output_dims cannot both be None."
|
133
|
+
)
|
134
|
+
if input_dims is None:
|
135
|
+
input_dims = output_dims
|
136
|
+
elif output_dims is None:
|
137
|
+
output_dims = input_dims
|
138
|
+
|
139
|
+
d_in = np.prod(input_dims)
|
140
|
+
d_out = np.prod(output_dims)
|
141
|
+
|
142
|
+
# If rank is not specified set to the maximum rank for the
|
143
|
+
# Choi matrix (input_dim * output_dim)
|
144
|
+
if rank is None or rank > d_in * d_out:
|
145
|
+
rank = d_in * d_out
|
146
|
+
if rank < 1:
|
147
|
+
raise QiskitError(f"Rank {rank} must be greater than 0.")
|
148
|
+
from scipy import stats
|
149
|
+
|
150
|
+
# Generate a random unitary matrix
|
151
|
+
unitary = stats.unitary_group.rvs(max(rank * d_out, d_in), random_state=seed)
|
152
|
+
|
153
|
+
# Truncate columns to produce an isometry
|
154
|
+
return Stinespring(unitary[:, :d_in], input_dims=input_dims, output_dims=output_dims)
|
@@ -0,0 +1,254 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2020.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""
|
14
|
+
ScalarOp class
|
15
|
+
"""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
import copy as _copy
|
19
|
+
from numbers import Number
|
20
|
+
import numpy as np
|
21
|
+
|
22
|
+
from qiskit.exceptions import QiskitError
|
23
|
+
from qiskit.quantum_info.operators.base_operator import BaseOperator
|
24
|
+
from qiskit.quantum_info.operators.linear_op import LinearOp
|
25
|
+
from qiskit.quantum_info.operators.operator import Operator
|
26
|
+
from qiskit.quantum_info.operators.mixins import generate_apidocs
|
27
|
+
|
28
|
+
|
29
|
+
class ScalarOp(LinearOp):
|
30
|
+
"""Scalar identity operator class.
|
31
|
+
|
32
|
+
This is a symbolic representation of an scalar identity operator on
|
33
|
+
multiple subsystems. It may be used to initialize a symbolic scalar
|
34
|
+
multiplication of an identity and then be implicitly converted to other
|
35
|
+
kinds of operator subclasses by using the :meth:`compose`, :meth:`dot`,
|
36
|
+
:meth:`tensor`, :meth:`expand` methods.
|
37
|
+
"""
|
38
|
+
|
39
|
+
def __init__(self, dims: int | tuple | None = None, coeff: Number = 1):
|
40
|
+
"""Initialize an operator object.
|
41
|
+
|
42
|
+
Args:
|
43
|
+
dims (int or tuple): subsystem dimensions.
|
44
|
+
coeff (Number): scalar coefficient for the identity
|
45
|
+
operator (Default: 1).
|
46
|
+
|
47
|
+
Raises:
|
48
|
+
QiskitError: If the optional coefficient is invalid.
|
49
|
+
"""
|
50
|
+
if not isinstance(coeff, Number):
|
51
|
+
raise QiskitError(f"coeff {coeff} must be a number.")
|
52
|
+
self._coeff = coeff
|
53
|
+
super().__init__(input_dims=dims, output_dims=dims)
|
54
|
+
|
55
|
+
def __array__(self, dtype=None, copy=None):
|
56
|
+
if copy is False:
|
57
|
+
raise ValueError("could not produce matrix without calculation")
|
58
|
+
arr = self.to_matrix()
|
59
|
+
return arr if dtype is None else arr.astype(dtype, copy=False)
|
60
|
+
|
61
|
+
def __repr__(self):
|
62
|
+
return f"ScalarOp({self.input_dims()}, coeff={self.coeff})"
|
63
|
+
|
64
|
+
@property
|
65
|
+
def coeff(self):
|
66
|
+
"""Return the coefficient"""
|
67
|
+
return self._coeff
|
68
|
+
|
69
|
+
def conjugate(self):
|
70
|
+
ret = self.copy()
|
71
|
+
ret._coeff = np.conjugate(self.coeff)
|
72
|
+
return ret
|
73
|
+
|
74
|
+
def transpose(self):
|
75
|
+
return self.copy()
|
76
|
+
|
77
|
+
def is_unitary(self, atol=None, rtol=None):
|
78
|
+
"""Return True if operator is a unitary matrix."""
|
79
|
+
if atol is None:
|
80
|
+
atol = self.atol
|
81
|
+
if rtol is None:
|
82
|
+
rtol = self.rtol
|
83
|
+
return np.isclose(np.abs(self.coeff), 1, atol=atol, rtol=rtol)
|
84
|
+
|
85
|
+
def to_matrix(self):
|
86
|
+
"""Convert to a Numpy matrix."""
|
87
|
+
dim, _ = self.dim
|
88
|
+
iden = np.eye(dim, dtype=complex)
|
89
|
+
return self.coeff * iden
|
90
|
+
|
91
|
+
def to_operator(self) -> Operator:
|
92
|
+
"""Convert to an Operator object."""
|
93
|
+
return Operator(
|
94
|
+
self.to_matrix(), input_dims=self.input_dims(), output_dims=self.output_dims()
|
95
|
+
)
|
96
|
+
|
97
|
+
def compose(self, other: ScalarOp, qargs: list | None = None, front: bool = False) -> ScalarOp:
|
98
|
+
if qargs is None:
|
99
|
+
qargs = getattr(other, "qargs", None)
|
100
|
+
if not isinstance(other, BaseOperator):
|
101
|
+
other = Operator(other)
|
102
|
+
|
103
|
+
new_shape = self._op_shape.compose(other._op_shape, qargs, front)
|
104
|
+
|
105
|
+
# If other is also an ScalarOp we only need to
|
106
|
+
# update the coefficient and dimensions
|
107
|
+
if isinstance(other, ScalarOp):
|
108
|
+
ret = _copy.copy(self)
|
109
|
+
ret._coeff = self.coeff * other.coeff
|
110
|
+
ret._op_shape = new_shape
|
111
|
+
return ret
|
112
|
+
|
113
|
+
# If we are composing on the full system we return the
|
114
|
+
# other operator with reshaped dimensions
|
115
|
+
if qargs is None:
|
116
|
+
ret = _copy.copy(other)
|
117
|
+
ret._op_shape = new_shape
|
118
|
+
# Other operator might not support scalar multiplication
|
119
|
+
# so we treat the identity as a special case to avoid a
|
120
|
+
# possible error
|
121
|
+
if self.coeff == 1:
|
122
|
+
return ret
|
123
|
+
return self.coeff * ret
|
124
|
+
|
125
|
+
# For qargs composition we initialize the scalar operator
|
126
|
+
# as an instance of the other BaseOperators subclass. We then
|
127
|
+
# perform subsystem qargs composition using the BaseOperator
|
128
|
+
# subclasses compose method.
|
129
|
+
# Note that this will raise an error if the other operator does
|
130
|
+
# not support initialization from a ScalarOp or the ScalarOps
|
131
|
+
# `to_operator` method).
|
132
|
+
return other.__class__(self).compose(other, qargs=qargs, front=front)
|
133
|
+
|
134
|
+
def power(self, n: float) -> ScalarOp:
|
135
|
+
"""Return the power of the ScalarOp.
|
136
|
+
|
137
|
+
Args:
|
138
|
+
n (float): the exponent for the scalar op.
|
139
|
+
|
140
|
+
Returns:
|
141
|
+
ScalarOp: the ``coeff ** n`` ScalarOp.
|
142
|
+
"""
|
143
|
+
ret = self.copy()
|
144
|
+
ret._coeff = self.coeff**n
|
145
|
+
return ret
|
146
|
+
|
147
|
+
def tensor(self, other: ScalarOp) -> ScalarOp:
|
148
|
+
if not isinstance(other, BaseOperator):
|
149
|
+
other = Operator(other)
|
150
|
+
|
151
|
+
if isinstance(other, ScalarOp):
|
152
|
+
ret = _copy.copy(self)
|
153
|
+
ret._coeff = self.coeff * other.coeff
|
154
|
+
ret._op_shape = self._op_shape.tensor(other._op_shape)
|
155
|
+
return ret
|
156
|
+
|
157
|
+
return other.expand(self)
|
158
|
+
|
159
|
+
def expand(self, other: ScalarOp) -> ScalarOp:
|
160
|
+
if not isinstance(other, BaseOperator):
|
161
|
+
other = Operator(other)
|
162
|
+
|
163
|
+
if isinstance(other, ScalarOp):
|
164
|
+
ret = _copy.copy(self)
|
165
|
+
ret._coeff = self.coeff * other.coeff
|
166
|
+
ret._op_shape = self._op_shape.expand(other._op_shape)
|
167
|
+
return ret
|
168
|
+
|
169
|
+
return other.tensor(self)
|
170
|
+
|
171
|
+
def _add(self, other, qargs=None):
|
172
|
+
"""Return the operator self + other.
|
173
|
+
|
174
|
+
If ``qargs`` are specified the other operator will be added
|
175
|
+
assuming it is identity on all other subsystems.
|
176
|
+
|
177
|
+
Args:
|
178
|
+
other (BaseOperator): an operator object.
|
179
|
+
qargs (None or list): optional subsystems to subtract on
|
180
|
+
(Default: None)
|
181
|
+
|
182
|
+
Returns:
|
183
|
+
ScalarOp: if other is an ScalarOp.
|
184
|
+
BaseOperator: if other is not an ScalarOp.
|
185
|
+
|
186
|
+
Raises:
|
187
|
+
QiskitError: if other has incompatible dimensions.
|
188
|
+
"""
|
189
|
+
if qargs is None:
|
190
|
+
qargs = getattr(other, "qargs", None)
|
191
|
+
|
192
|
+
if not isinstance(other, BaseOperator):
|
193
|
+
other = Operator(other)
|
194
|
+
|
195
|
+
self._op_shape._validate_add(other._op_shape, qargs)
|
196
|
+
|
197
|
+
# Next if we are adding two ScalarOps we return a ScalarOp
|
198
|
+
if isinstance(other, ScalarOp):
|
199
|
+
return ScalarOp(self.input_dims(), coeff=self.coeff + other.coeff)
|
200
|
+
|
201
|
+
# If qargs are specified we have to pad the other BaseOperator
|
202
|
+
# with identities on remaining subsystems. We do this by
|
203
|
+
# composing it with an identity ScalarOp.
|
204
|
+
other = ScalarOp._pad_with_identity(self, other, qargs)
|
205
|
+
|
206
|
+
# First we check the special case where coeff=0. In this case
|
207
|
+
# we simply return the other operator reshaped so that its
|
208
|
+
# subsystem dimensions are equal to the current operator for the
|
209
|
+
# case where total dimensions agree but subsystem dimensions differ.
|
210
|
+
if self.coeff == 0:
|
211
|
+
return other.reshape(self.input_dims(), self.output_dims())
|
212
|
+
|
213
|
+
# Finally if we are adding another BaseOperator subclass
|
214
|
+
# we use that subclasses `_add` method and reshape the
|
215
|
+
# final dimensions.
|
216
|
+
return other.reshape(self.input_dims(), self.output_dims())._add(self)
|
217
|
+
|
218
|
+
def _multiply(self, other):
|
219
|
+
"""Return the ScalarOp other * self.
|
220
|
+
|
221
|
+
Args:
|
222
|
+
other (Number): a complex number.
|
223
|
+
|
224
|
+
Returns:
|
225
|
+
ScalarOp: the scaled identity operator other * self.
|
226
|
+
|
227
|
+
Raises:
|
228
|
+
QiskitError: if other is not a valid complex number.
|
229
|
+
"""
|
230
|
+
if not isinstance(other, Number):
|
231
|
+
raise QiskitError(f"other ({other}) is not a number")
|
232
|
+
ret = self.copy()
|
233
|
+
ret._coeff = other * self.coeff
|
234
|
+
return ret
|
235
|
+
|
236
|
+
@staticmethod
|
237
|
+
def _pad_with_identity(current, other, qargs=None):
|
238
|
+
"""Pad another operator with identities.
|
239
|
+
|
240
|
+
Args:
|
241
|
+
current (BaseOperator): current operator.
|
242
|
+
other (BaseOperator): other operator.
|
243
|
+
qargs (None or list): qargs
|
244
|
+
|
245
|
+
Returns:
|
246
|
+
BaseOperator: the padded operator.
|
247
|
+
"""
|
248
|
+
if qargs is None:
|
249
|
+
return other
|
250
|
+
return ScalarOp(current.input_dims()).compose(other, qargs=qargs)
|
251
|
+
|
252
|
+
|
253
|
+
# Update docstrings for API docs
|
254
|
+
generate_apidocs(ScalarOp)
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2020.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""
|
14
|
+
Symplectic Operators
|
15
|
+
"""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
|
19
|
+
from .clifford import Clifford
|
20
|
+
from .clifford_circuits import get_clifford_gate_names
|
21
|
+
from .pauli import Pauli
|
22
|
+
from .pauli_list import PauliList
|
23
|
+
from .pauli_utils import pauli_basis
|
24
|
+
from .sparse_pauli_op import SparsePauliOp
|