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,490 @@
|
|
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
|
+
# pylint: disable=too-many-return-statements
|
14
|
+
|
15
|
+
|
16
|
+
"""
|
17
|
+
Transformations between QuantumChannel representations.
|
18
|
+
"""
|
19
|
+
|
20
|
+
from __future__ import annotations
|
21
|
+
import math
|
22
|
+
import numpy as np
|
23
|
+
|
24
|
+
from qiskit.exceptions import QiskitError
|
25
|
+
from qiskit.quantum_info.operators.predicates import is_hermitian_matrix
|
26
|
+
from qiskit.quantum_info.operators.predicates import ATOL_DEFAULT
|
27
|
+
|
28
|
+
|
29
|
+
def _transform_rep(input_rep, output_rep, data, input_dim, output_dim):
|
30
|
+
"""Transform a QuantumChannel between representation."""
|
31
|
+
if input_rep == output_rep:
|
32
|
+
return data
|
33
|
+
if output_rep == "Choi":
|
34
|
+
return _to_choi(input_rep, data, input_dim, output_dim)
|
35
|
+
if output_rep == "Operator":
|
36
|
+
return _to_operator(input_rep, data, input_dim, output_dim)
|
37
|
+
if output_rep == "SuperOp":
|
38
|
+
return _to_superop(input_rep, data, input_dim, output_dim)
|
39
|
+
if output_rep == "Kraus":
|
40
|
+
return _to_kraus(input_rep, data, input_dim, output_dim)
|
41
|
+
if output_rep == "Chi":
|
42
|
+
return _to_chi(input_rep, data, input_dim, output_dim)
|
43
|
+
if output_rep == "PTM":
|
44
|
+
return _to_ptm(input_rep, data, input_dim, output_dim)
|
45
|
+
if output_rep == "Stinespring":
|
46
|
+
return _to_stinespring(input_rep, data, input_dim, output_dim)
|
47
|
+
raise QiskitError(f"Invalid QuantumChannel {output_rep}")
|
48
|
+
|
49
|
+
|
50
|
+
def _to_choi(rep, data, input_dim, output_dim):
|
51
|
+
"""Transform a QuantumChannel to the Choi representation."""
|
52
|
+
if rep == "Choi":
|
53
|
+
return data
|
54
|
+
if rep == "Operator":
|
55
|
+
return _from_operator("Choi", data, input_dim, output_dim)
|
56
|
+
if rep == "SuperOp":
|
57
|
+
return _superop_to_choi(data, input_dim, output_dim)
|
58
|
+
if rep == "Kraus":
|
59
|
+
return _kraus_to_choi(data)
|
60
|
+
if rep == "Chi":
|
61
|
+
return _chi_to_choi(data, input_dim)
|
62
|
+
if rep == "PTM":
|
63
|
+
data = _ptm_to_superop(data, input_dim)
|
64
|
+
return _superop_to_choi(data, input_dim, output_dim)
|
65
|
+
if rep == "Stinespring":
|
66
|
+
return _stinespring_to_choi(data, input_dim, output_dim)
|
67
|
+
raise QiskitError(f"Invalid QuantumChannel {rep}")
|
68
|
+
|
69
|
+
|
70
|
+
def _to_superop(rep, data, input_dim, output_dim):
|
71
|
+
"""Transform a QuantumChannel to the SuperOp representation."""
|
72
|
+
if rep == "SuperOp":
|
73
|
+
return data
|
74
|
+
if rep == "Operator":
|
75
|
+
return _from_operator("SuperOp", data, input_dim, output_dim)
|
76
|
+
if rep == "Choi":
|
77
|
+
return _choi_to_superop(data, input_dim, output_dim)
|
78
|
+
if rep == "Kraus":
|
79
|
+
return _kraus_to_superop(data)
|
80
|
+
if rep == "Chi":
|
81
|
+
data = _chi_to_choi(data, input_dim)
|
82
|
+
return _choi_to_superop(data, input_dim, output_dim)
|
83
|
+
if rep == "PTM":
|
84
|
+
return _ptm_to_superop(data, input_dim)
|
85
|
+
if rep == "Stinespring":
|
86
|
+
return _stinespring_to_superop(data, input_dim, output_dim)
|
87
|
+
raise QiskitError(f"Invalid QuantumChannel {rep}")
|
88
|
+
|
89
|
+
|
90
|
+
def _to_kraus(rep, data, input_dim, output_dim):
|
91
|
+
"""Transform a QuantumChannel to the Kraus representation."""
|
92
|
+
if rep == "Kraus":
|
93
|
+
return data
|
94
|
+
if rep == "Stinespring":
|
95
|
+
return _stinespring_to_kraus(data, output_dim)
|
96
|
+
if rep == "Operator":
|
97
|
+
return _from_operator("Kraus", data, input_dim, output_dim)
|
98
|
+
# Convert via Choi and Kraus
|
99
|
+
if rep != "Choi":
|
100
|
+
data = _to_choi(rep, data, input_dim, output_dim)
|
101
|
+
return _choi_to_kraus(data, input_dim, output_dim)
|
102
|
+
|
103
|
+
|
104
|
+
def _to_chi(rep, data, input_dim, output_dim):
|
105
|
+
"""Transform a QuantumChannel to the Chi representation."""
|
106
|
+
if rep == "Chi":
|
107
|
+
return data
|
108
|
+
# Check valid n-qubit input
|
109
|
+
_check_nqubit_dim(input_dim, output_dim)
|
110
|
+
if rep == "Operator":
|
111
|
+
return _from_operator("Chi", data, input_dim, output_dim)
|
112
|
+
# Convert via Choi representation
|
113
|
+
if rep != "Choi":
|
114
|
+
data = _to_choi(rep, data, input_dim, output_dim)
|
115
|
+
return _choi_to_chi(data, input_dim)
|
116
|
+
|
117
|
+
|
118
|
+
def _to_ptm(rep, data, input_dim, output_dim):
|
119
|
+
"""Transform a QuantumChannel to the PTM representation."""
|
120
|
+
if rep == "PTM":
|
121
|
+
return data
|
122
|
+
# Check valid n-qubit input
|
123
|
+
_check_nqubit_dim(input_dim, output_dim)
|
124
|
+
if rep == "Operator":
|
125
|
+
return _from_operator("PTM", data, input_dim, output_dim)
|
126
|
+
# Convert via Superoperator representation
|
127
|
+
if rep != "SuperOp":
|
128
|
+
data = _to_superop(rep, data, input_dim, output_dim)
|
129
|
+
return _superop_to_ptm(data, input_dim)
|
130
|
+
|
131
|
+
|
132
|
+
def _to_stinespring(rep, data, input_dim, output_dim):
|
133
|
+
"""Transform a QuantumChannel to the Stinespring representation."""
|
134
|
+
if rep == "Stinespring":
|
135
|
+
return data
|
136
|
+
if rep == "Operator":
|
137
|
+
return _from_operator("Stinespring", data, input_dim, output_dim)
|
138
|
+
# Convert via Superoperator representation
|
139
|
+
if rep != "Kraus":
|
140
|
+
data = _to_kraus(rep, data, input_dim, output_dim)
|
141
|
+
return _kraus_to_stinespring(data, input_dim, output_dim)
|
142
|
+
|
143
|
+
|
144
|
+
def _to_operator(rep, data, input_dim, output_dim):
|
145
|
+
"""Transform a QuantumChannel to the Operator representation."""
|
146
|
+
if rep == "Operator":
|
147
|
+
return data
|
148
|
+
if rep == "Stinespring":
|
149
|
+
return _stinespring_to_operator(data, output_dim)
|
150
|
+
# Convert via Kraus representation
|
151
|
+
if rep != "Kraus":
|
152
|
+
data = _to_kraus(rep, data, input_dim, output_dim)
|
153
|
+
return _kraus_to_operator(data)
|
154
|
+
|
155
|
+
|
156
|
+
def _from_operator(rep, data, input_dim, output_dim):
|
157
|
+
"""Transform Operator representation to other representation."""
|
158
|
+
if rep == "Operator":
|
159
|
+
return data
|
160
|
+
if rep == "SuperOp":
|
161
|
+
return np.kron(np.conj(data), data)
|
162
|
+
if rep == "Choi":
|
163
|
+
vec = np.ravel(data, order="F")
|
164
|
+
return np.outer(vec, np.conj(vec))
|
165
|
+
if rep == "Kraus":
|
166
|
+
return [data], None
|
167
|
+
if rep == "Stinespring":
|
168
|
+
return data, None
|
169
|
+
if rep == "Chi":
|
170
|
+
_check_nqubit_dim(input_dim, output_dim)
|
171
|
+
data = _from_operator("Choi", data, input_dim, output_dim)
|
172
|
+
return _choi_to_chi(data, input_dim)
|
173
|
+
if rep == "PTM":
|
174
|
+
_check_nqubit_dim(input_dim, output_dim)
|
175
|
+
data = _from_operator("SuperOp", data, input_dim, output_dim)
|
176
|
+
return _superop_to_ptm(data, input_dim)
|
177
|
+
raise QiskitError(f"Invalid QuantumChannel {rep}")
|
178
|
+
|
179
|
+
|
180
|
+
def _kraus_to_operator(data):
|
181
|
+
"""Transform Kraus representation to Operator representation."""
|
182
|
+
if data[1] is not None or len(data[0]) > 1:
|
183
|
+
raise QiskitError("Channel cannot be converted to Operator representation")
|
184
|
+
return data[0][0]
|
185
|
+
|
186
|
+
|
187
|
+
def _stinespring_to_operator(data, output_dim):
|
188
|
+
"""Transform Stinespring representation to Operator representation."""
|
189
|
+
trace_dim = data[0].shape[0] // output_dim
|
190
|
+
if data[1] is not None or trace_dim != 1:
|
191
|
+
raise QiskitError("Channel cannot be converted to Operator representation")
|
192
|
+
return data[0]
|
193
|
+
|
194
|
+
|
195
|
+
def _superop_to_choi(data, input_dim, output_dim):
|
196
|
+
"""Transform SuperOp representation to Choi representation."""
|
197
|
+
shape = (output_dim, output_dim, input_dim, input_dim)
|
198
|
+
return _reshuffle(data, shape)
|
199
|
+
|
200
|
+
|
201
|
+
def _choi_to_superop(data, input_dim, output_dim):
|
202
|
+
"""Transform Choi to SuperOp representation."""
|
203
|
+
shape = (input_dim, output_dim, input_dim, output_dim)
|
204
|
+
return _reshuffle(data, shape)
|
205
|
+
|
206
|
+
|
207
|
+
def _kraus_to_choi(data):
|
208
|
+
"""Transform Kraus representation to Choi representation."""
|
209
|
+
choi = 0
|
210
|
+
kraus_l, kraus_r = data
|
211
|
+
if kraus_r is None:
|
212
|
+
for i in kraus_l:
|
213
|
+
vec = i.ravel(order="F")
|
214
|
+
choi += np.outer(vec, vec.conj())
|
215
|
+
else:
|
216
|
+
for i, j in zip(kraus_l, kraus_r):
|
217
|
+
choi += np.outer(i.ravel(order="F"), j.ravel(order="F").conj())
|
218
|
+
return choi
|
219
|
+
|
220
|
+
|
221
|
+
def _choi_to_kraus(data, input_dim, output_dim, atol=ATOL_DEFAULT):
|
222
|
+
"""Transform Choi representation to Kraus representation."""
|
223
|
+
import scipy.linalg
|
224
|
+
|
225
|
+
# Check if hermitian matrix
|
226
|
+
if is_hermitian_matrix(data, atol=atol):
|
227
|
+
# Ideally we'd use `eigh`, but `scipy.linalg.eigh` has stability problems on macOS (at a
|
228
|
+
# minimum from SciPy 1.1 to 1.13 with the bundled OpenBLAS, or ~0.3.6 before they started
|
229
|
+
# bundling one in). The Schur form of a Hermitian matrix is guaranteed diagonal:
|
230
|
+
#
|
231
|
+
# H = U T U+ for upper-triangular T.
|
232
|
+
# => H+ = U T+ U+
|
233
|
+
# => T = T+ because H = H+, and thus T cannot have super-diagonal elements.
|
234
|
+
#
|
235
|
+
# So the eigenvalues are on the diagonal, therefore the basis-transformation matrix must be
|
236
|
+
# a spanning set of the eigenspace.
|
237
|
+
#
|
238
|
+
# In addition, to prevent `numpy.linalg` errors when the matrix A is ill-conditioned,
|
239
|
+
# we apply a small perturbation, replacing A by A + eI. Since (A + eI)x = kx is
|
240
|
+
# equivalent to Ax = (k-e)x, it means that the eigenvectors of A + eI and A are the same,
|
241
|
+
# and we can perfectly recover the eigenvalues of A from the eigenvalues of A + eI by
|
242
|
+
# subtracting e.
|
243
|
+
apply_perturbation = np.linalg.cond(data) >= 1e10
|
244
|
+
|
245
|
+
if apply_perturbation:
|
246
|
+
data += 1e-10 * np.eye(data.shape[0])
|
247
|
+
|
248
|
+
triangular, vecs = scipy.linalg.schur(data)
|
249
|
+
values = triangular.diagonal().real
|
250
|
+
|
251
|
+
if apply_perturbation:
|
252
|
+
values = values - 1e-10
|
253
|
+
|
254
|
+
# If we're not a CP map, fall-through back to the generalization handling. Since we needed
|
255
|
+
# to get the eigenvalues anyway, we can do the CP check manually rather than deferring to a
|
256
|
+
# separate re-calculation.
|
257
|
+
if all(values >= -atol):
|
258
|
+
kraus = [
|
259
|
+
math.sqrt(value) * vec.reshape((output_dim, input_dim), order="F")
|
260
|
+
for value, vec in zip(values, vecs.T)
|
261
|
+
if abs(value) > atol
|
262
|
+
]
|
263
|
+
# If we are converting a zero matrix, we need to return a Kraus set with a single
|
264
|
+
# zero-element Kraus matrix
|
265
|
+
if not kraus:
|
266
|
+
kraus = [np.zeros((output_dim, input_dim), dtype=complex)]
|
267
|
+
return kraus, None
|
268
|
+
# Fall through.
|
269
|
+
# Non-CP-map generalized Kraus representation.
|
270
|
+
mat_u, svals, mat_vh = scipy.linalg.svd(data)
|
271
|
+
kraus_l = []
|
272
|
+
kraus_r = []
|
273
|
+
for val, vec_l, vec_r in zip(svals, mat_u.T, mat_vh.conj()):
|
274
|
+
kraus_l.append(np.sqrt(val) * vec_l.reshape((output_dim, input_dim), order="F"))
|
275
|
+
kraus_r.append(np.sqrt(val) * vec_r.reshape((output_dim, input_dim), order="F"))
|
276
|
+
return kraus_l, kraus_r
|
277
|
+
|
278
|
+
|
279
|
+
def _stinespring_to_kraus(data, output_dim):
|
280
|
+
"""Transform Stinespring representation to Kraus representation."""
|
281
|
+
kraus_pair = []
|
282
|
+
for stine in data:
|
283
|
+
if stine is None:
|
284
|
+
kraus_pair.append(None)
|
285
|
+
else:
|
286
|
+
trace_dim = stine.shape[0] // output_dim
|
287
|
+
iden = np.eye(output_dim)
|
288
|
+
kraus = []
|
289
|
+
for j in range(trace_dim):
|
290
|
+
vec = np.zeros(trace_dim)
|
291
|
+
vec[j] = 1
|
292
|
+
kraus.append(np.kron(iden, vec[None, :]).dot(stine))
|
293
|
+
kraus_pair.append(kraus)
|
294
|
+
return tuple(kraus_pair)
|
295
|
+
|
296
|
+
|
297
|
+
def _stinespring_to_choi(data, input_dim, output_dim):
|
298
|
+
"""Transform Stinespring representation to Choi representation."""
|
299
|
+
trace_dim = data[0].shape[0] // output_dim
|
300
|
+
stine_l = np.reshape(data[0], (output_dim, trace_dim, input_dim))
|
301
|
+
if data[1] is None:
|
302
|
+
stine_r = stine_l
|
303
|
+
else:
|
304
|
+
stine_r = np.reshape(data[1], (output_dim, trace_dim, input_dim))
|
305
|
+
return np.reshape(
|
306
|
+
np.einsum("iAj,kAl->jilk", stine_l, stine_r.conj()), 2 * [input_dim * output_dim]
|
307
|
+
)
|
308
|
+
|
309
|
+
|
310
|
+
def _stinespring_to_superop(data, input_dim, output_dim):
|
311
|
+
"""Transform Stinespring representation to SuperOp representation."""
|
312
|
+
trace_dim = data[0].shape[0] // output_dim
|
313
|
+
stine_l = np.reshape(data[0], (output_dim, trace_dim, input_dim))
|
314
|
+
if data[1] is None:
|
315
|
+
stine_r = stine_l
|
316
|
+
else:
|
317
|
+
stine_r = np.reshape(data[1], (output_dim, trace_dim, input_dim))
|
318
|
+
return np.reshape(
|
319
|
+
np.einsum("iAj,kAl->ikjl", stine_r.conj(), stine_l),
|
320
|
+
(output_dim * output_dim, input_dim * input_dim),
|
321
|
+
)
|
322
|
+
|
323
|
+
|
324
|
+
def _kraus_to_stinespring(data, input_dim, output_dim):
|
325
|
+
"""Transform Kraus representation to Stinespring representation."""
|
326
|
+
stine_pair = [None, None]
|
327
|
+
for i, kraus in enumerate(data):
|
328
|
+
if kraus is not None:
|
329
|
+
num_kraus = len(kraus)
|
330
|
+
stine = np.zeros((output_dim * num_kraus, input_dim), dtype=complex)
|
331
|
+
for j, mat in enumerate(kraus):
|
332
|
+
vec = np.zeros(num_kraus)
|
333
|
+
vec[j] = 1
|
334
|
+
stine += np.kron(mat, vec[:, None])
|
335
|
+
stine_pair[i] = stine
|
336
|
+
return tuple(stine_pair)
|
337
|
+
|
338
|
+
|
339
|
+
def _kraus_to_superop(data):
|
340
|
+
"""Transform Kraus representation to SuperOp representation."""
|
341
|
+
kraus_l, kraus_r = data
|
342
|
+
superop = 0
|
343
|
+
if kraus_r is None:
|
344
|
+
for i in kraus_l:
|
345
|
+
superop += np.kron(np.conj(i), i)
|
346
|
+
else:
|
347
|
+
for i, j in zip(kraus_l, kraus_r):
|
348
|
+
superop += np.kron(np.conj(j), i)
|
349
|
+
return superop
|
350
|
+
|
351
|
+
|
352
|
+
def _chi_to_choi(data, input_dim):
|
353
|
+
"""Transform Chi representation to a Choi representation."""
|
354
|
+
num_qubits = int(math.log2(input_dim))
|
355
|
+
return _transform_from_pauli(data, num_qubits)
|
356
|
+
|
357
|
+
|
358
|
+
def _choi_to_chi(data, input_dim):
|
359
|
+
"""Transform Choi representation to the Chi representation."""
|
360
|
+
num_qubits = int(math.log2(input_dim))
|
361
|
+
return _transform_to_pauli(data, num_qubits)
|
362
|
+
|
363
|
+
|
364
|
+
def _ptm_to_superop(data, input_dim):
|
365
|
+
"""Transform PTM representation to SuperOp representation."""
|
366
|
+
num_qubits = int(math.log2(input_dim))
|
367
|
+
return _transform_from_pauli(data, num_qubits)
|
368
|
+
|
369
|
+
|
370
|
+
def _superop_to_ptm(data, input_dim):
|
371
|
+
"""Transform SuperOp representation to PTM representation."""
|
372
|
+
num_qubits = int(math.log2(input_dim))
|
373
|
+
return _transform_to_pauli(data, num_qubits)
|
374
|
+
|
375
|
+
|
376
|
+
def _bipartite_tensor(mat1, mat2, shape1=None, shape2=None):
|
377
|
+
"""Tensor product (A ⊗ B) to bipartite matrices and reravel indices.
|
378
|
+
|
379
|
+
This is used for tensor product of superoperators and Choi matrices.
|
380
|
+
|
381
|
+
Args:
|
382
|
+
mat1 (matrix_like): a bipartite matrix A
|
383
|
+
mat2 (matrix_like): a bipartite matrix B
|
384
|
+
shape1 (tuple): bipartite-shape for matrix A (a0, a1, a2, a3)
|
385
|
+
shape2 (tuple): bipartite-shape for matrix B (b0, b1, b2, b3)
|
386
|
+
|
387
|
+
Returns:
|
388
|
+
np.array: a bipartite matrix for reravel(A ⊗ B).
|
389
|
+
|
390
|
+
Raises:
|
391
|
+
QiskitError: if input matrices are wrong shape.
|
392
|
+
"""
|
393
|
+
# Convert inputs to numpy arrays
|
394
|
+
mat1 = np.array(mat1)
|
395
|
+
mat2 = np.array(mat2)
|
396
|
+
|
397
|
+
# Determine bipartite dimensions if not provided
|
398
|
+
dim_a0, dim_a1 = mat1.shape
|
399
|
+
dim_b0, dim_b1 = mat2.shape
|
400
|
+
if shape1 is None:
|
401
|
+
sdim_a0 = int(math.sqrt(dim_a0))
|
402
|
+
sdim_a1 = int(math.sqrt(dim_a1))
|
403
|
+
shape1 = (sdim_a0, sdim_a0, sdim_a1, sdim_a1)
|
404
|
+
if shape2 is None:
|
405
|
+
sdim_b0 = int(math.sqrt(dim_b0))
|
406
|
+
sdim_b1 = int(math.sqrt(dim_b1))
|
407
|
+
shape2 = (sdim_b0, sdim_b0, sdim_b1, sdim_b1)
|
408
|
+
# Check dimensions
|
409
|
+
if len(shape1) != 4 or shape1[0] * shape1[1] != dim_a0 or shape1[2] * shape1[3] != dim_a1:
|
410
|
+
raise QiskitError("Invalid shape_a")
|
411
|
+
if len(shape2) != 4 or shape2[0] * shape2[1] != dim_b0 or shape2[2] * shape2[3] != dim_b1:
|
412
|
+
raise QiskitError("Invalid shape_b")
|
413
|
+
|
414
|
+
return _reravel(mat1, mat2, shape1, shape2)
|
415
|
+
|
416
|
+
|
417
|
+
def _reravel(mat1, mat2, shape1, shape2):
|
418
|
+
"""Reravel two bipartite matrices."""
|
419
|
+
# Reshuffle indices
|
420
|
+
left_dims = shape1[:2] + shape2[:2]
|
421
|
+
right_dims = shape1[2:] + shape2[2:]
|
422
|
+
tensor_shape = left_dims + right_dims
|
423
|
+
final_shape = (np.prod(left_dims), np.prod(right_dims))
|
424
|
+
# Tensor product matrices
|
425
|
+
data = np.kron(mat1, mat2)
|
426
|
+
data = np.reshape(
|
427
|
+
np.transpose(np.reshape(data, tensor_shape), (0, 2, 1, 3, 4, 6, 5, 7)), final_shape
|
428
|
+
)
|
429
|
+
return data
|
430
|
+
|
431
|
+
|
432
|
+
def _transform_to_pauli(data, num_qubits):
|
433
|
+
"""Change of basis of bipartite matrix representation."""
|
434
|
+
# Change basis: um_{i=0}^3 |i>><\sigma_i|
|
435
|
+
basis_mat = np.array(
|
436
|
+
[[1, 0, 0, 1], [0, 1, 1, 0], [0, -1j, 1j, 0], [1, 0j, 0, -1]], dtype=complex
|
437
|
+
)
|
438
|
+
# Note that we manually renormalized after change of basis
|
439
|
+
# to avoid rounding errors from square-roots of 2.
|
440
|
+
cob = basis_mat
|
441
|
+
for _ in range(num_qubits - 1):
|
442
|
+
dim = int(math.sqrt(len(cob)))
|
443
|
+
cob = np.reshape(
|
444
|
+
np.transpose(
|
445
|
+
np.reshape(np.kron(basis_mat, cob), (4, dim * dim, 2, 2, dim, dim)),
|
446
|
+
(0, 1, 2, 4, 3, 5),
|
447
|
+
),
|
448
|
+
(4 * dim * dim, 4 * dim * dim),
|
449
|
+
)
|
450
|
+
return np.dot(np.dot(cob, data), cob.conj().T) / 2**num_qubits
|
451
|
+
|
452
|
+
|
453
|
+
def _transform_from_pauli(data, num_qubits):
|
454
|
+
"""Change of basis of bipartite matrix representation."""
|
455
|
+
# Change basis: sum_{i=0}^3 =|\sigma_i>><i|
|
456
|
+
basis_mat = np.array(
|
457
|
+
[[1, 0, 0, 1], [0, 1, 1j, 0], [0, 1, -1j, 0], [1, 0j, 0, -1]], dtype=complex
|
458
|
+
)
|
459
|
+
# Note that we manually renormalized after change of basis
|
460
|
+
# to avoid rounding errors from square-roots of 2.
|
461
|
+
cob = basis_mat
|
462
|
+
for _ in range(num_qubits - 1):
|
463
|
+
dim = int(math.sqrt(len(cob)))
|
464
|
+
cob = np.reshape(
|
465
|
+
np.transpose(
|
466
|
+
np.reshape(np.kron(basis_mat, cob), (2, 2, dim, dim, 4, dim * dim)),
|
467
|
+
(0, 2, 1, 3, 4, 5),
|
468
|
+
),
|
469
|
+
(4 * dim * dim, 4 * dim * dim),
|
470
|
+
)
|
471
|
+
return np.dot(np.dot(cob, data), cob.conj().T) / 2**num_qubits
|
472
|
+
|
473
|
+
|
474
|
+
def _reshuffle(mat, shape):
|
475
|
+
"""Reshuffle the indices of a bipartite matrix A[ij,kl] -> A[lj,ki]."""
|
476
|
+
return np.reshape(
|
477
|
+
np.transpose(np.reshape(mat, shape), (3, 1, 2, 0)),
|
478
|
+
(shape[3] * shape[1], shape[0] * shape[2]),
|
479
|
+
)
|
480
|
+
|
481
|
+
|
482
|
+
def _check_nqubit_dim(input_dim, output_dim):
|
483
|
+
"""Return true if dims correspond to an n-qubit channel."""
|
484
|
+
if input_dim != output_dim:
|
485
|
+
raise QiskitError(
|
486
|
+
f"Not an n-qubit channel: input_dim ({input_dim}) != output_dim ({output_dim})"
|
487
|
+
)
|
488
|
+
num_qubits = int(math.log2(input_dim))
|
489
|
+
if 2**num_qubits != input_dim:
|
490
|
+
raise QiskitError("Not an n-qubit channel: input_dim != 2 ** n")
|
@@ -0,0 +1,48 @@
|
|
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
|
+
Custom Lazy Iterator class
|
14
|
+
"""
|
15
|
+
|
16
|
+
from __future__ import annotations
|
17
|
+
from abc import ABC, abstractmethod
|
18
|
+
|
19
|
+
|
20
|
+
class CustomIterator(ABC):
|
21
|
+
"""Lazy custom iteration and item access."""
|
22
|
+
|
23
|
+
def __init__(self, obj):
|
24
|
+
self.obj = obj
|
25
|
+
self._iter = 0
|
26
|
+
|
27
|
+
@abstractmethod
|
28
|
+
def __getitem__(self, key):
|
29
|
+
"""Get next item"""
|
30
|
+
# This method should be overridden for lazy conversion of
|
31
|
+
# iterator only at a given key value
|
32
|
+
pass
|
33
|
+
|
34
|
+
def __repr__(self):
|
35
|
+
return f"<{type(self.obj)}_iterator at {hex(id(self))}>"
|
36
|
+
|
37
|
+
def __len__(self):
|
38
|
+
return len(self.obj)
|
39
|
+
|
40
|
+
def __iter__(self):
|
41
|
+
self._iter = 0
|
42
|
+
return self
|
43
|
+
|
44
|
+
def __next__(self):
|
45
|
+
if self._iter >= len(self):
|
46
|
+
raise StopIteration
|
47
|
+
self._iter += 1
|
48
|
+
return self[self._iter - 1]
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2019, 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
|
+
CNOTDihedral Operators
|
15
|
+
"""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
from .dihedral import CNOTDihedral
|