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,370 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2022.
|
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
|
+
Layer classes for the fast gradient implementation.
|
15
|
+
"""
|
16
|
+
from __future__ import annotations
|
17
|
+
from abc import abstractmethod, ABC
|
18
|
+
from typing import Optional
|
19
|
+
import numpy as np
|
20
|
+
from .fast_grad_utils import (
|
21
|
+
bit_permutation_1q,
|
22
|
+
reverse_bits,
|
23
|
+
inverse_permutation,
|
24
|
+
bit_permutation_2q,
|
25
|
+
make_rz,
|
26
|
+
make_ry,
|
27
|
+
)
|
28
|
+
|
29
|
+
|
30
|
+
class LayerBase(ABC):
|
31
|
+
"""
|
32
|
+
Base class for any layer implementation. Each layer here is represented
|
33
|
+
by a 2x2 or 4x4 gate matrix ``G`` (applied to 1 or 2 qubits respectively)
|
34
|
+
interleaved with the identity ones:
|
35
|
+
``Layer = I kron I kron ... kron G kron ... kron I kron I``
|
36
|
+
"""
|
37
|
+
|
38
|
+
@abstractmethod
|
39
|
+
def set_from_matrix(self, mat: np.ndarray):
|
40
|
+
"""
|
41
|
+
Updates this layer from an external gate matrix.
|
42
|
+
|
43
|
+
Args:
|
44
|
+
mat: external gate matrix that initializes this layer's one.
|
45
|
+
"""
|
46
|
+
raise NotImplementedError()
|
47
|
+
|
48
|
+
@abstractmethod
|
49
|
+
def get_attr(self) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
|
50
|
+
"""
|
51
|
+
Returns gate matrix, direct and inverse permutations.
|
52
|
+
|
53
|
+
Returns:
|
54
|
+
(1) gate matrix; (2) direct permutation; (3) inverse permutations.
|
55
|
+
"""
|
56
|
+
raise NotImplementedError()
|
57
|
+
|
58
|
+
|
59
|
+
class Layer1Q(LayerBase):
|
60
|
+
"""
|
61
|
+
Layer represents a simple circuit where 1-qubit gate matrix (of size 2x2)
|
62
|
+
interleaves with the identity ones.
|
63
|
+
"""
|
64
|
+
|
65
|
+
def __init__(self, num_qubits: int, k: int, g2x2: Optional[np.ndarray] = None):
|
66
|
+
"""
|
67
|
+
Args:
|
68
|
+
num_qubits: number of qubits.
|
69
|
+
k: index of the bit where gate is applied.
|
70
|
+
g2x2: 2x2 matrix that makes up this layer along with identity ones,
|
71
|
+
or None (should be set up later).
|
72
|
+
"""
|
73
|
+
super().__init__()
|
74
|
+
|
75
|
+
# 2x2 gate matrix (1-qubit gate).
|
76
|
+
self._gmat = np.full((2, 2), fill_value=0, dtype=np.complex128)
|
77
|
+
if isinstance(g2x2, np.ndarray):
|
78
|
+
np.copyto(self._gmat, g2x2)
|
79
|
+
|
80
|
+
bit_flip = True
|
81
|
+
dim = 2**num_qubits
|
82
|
+
row_perm = reverse_bits(
|
83
|
+
bit_permutation_1q(n=num_qubits, k=k), nbits=num_qubits, enable=bit_flip
|
84
|
+
)
|
85
|
+
col_perm = reverse_bits(np.arange(dim, dtype=np.int64), nbits=num_qubits, enable=bit_flip)
|
86
|
+
self._perm = np.full((dim,), fill_value=0, dtype=np.int64)
|
87
|
+
self._perm[row_perm] = col_perm
|
88
|
+
self._inv_perm = inverse_permutation(self._perm)
|
89
|
+
|
90
|
+
def set_from_matrix(self, mat: np.ndarray):
|
91
|
+
"""See base class description."""
|
92
|
+
np.copyto(self._gmat, mat)
|
93
|
+
|
94
|
+
def get_attr(self) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
|
95
|
+
"""See base class description."""
|
96
|
+
return self._gmat, self._perm, self._inv_perm
|
97
|
+
|
98
|
+
|
99
|
+
class Layer2Q(LayerBase):
|
100
|
+
"""
|
101
|
+
Layer represents a simple circuit where 2-qubit gate matrix (of size 4x4)
|
102
|
+
interleaves with the identity ones.
|
103
|
+
"""
|
104
|
+
|
105
|
+
def __init__(self, num_qubits: int, j: int, k: int, g4x4: Optional[np.ndarray] = None):
|
106
|
+
"""
|
107
|
+
Args:
|
108
|
+
num_qubits: number of qubits.
|
109
|
+
j: index of the first (control) bit.
|
110
|
+
k: index of the second (target) bit.
|
111
|
+
g4x4: 4x4 matrix that makes up this layer along with identity ones,
|
112
|
+
or None (should be set up later).
|
113
|
+
"""
|
114
|
+
super().__init__()
|
115
|
+
|
116
|
+
# 4x4 gate matrix (2-qubit gate).
|
117
|
+
self._gmat = np.full((4, 4), fill_value=0, dtype=np.complex128)
|
118
|
+
if isinstance(g4x4, np.ndarray):
|
119
|
+
np.copyto(self._gmat, g4x4)
|
120
|
+
|
121
|
+
bit_flip = True
|
122
|
+
dim = 2**num_qubits
|
123
|
+
row_perm = reverse_bits(
|
124
|
+
bit_permutation_2q(n=num_qubits, j=j, k=k), nbits=num_qubits, enable=bit_flip
|
125
|
+
)
|
126
|
+
col_perm = reverse_bits(np.arange(dim, dtype=np.int64), nbits=num_qubits, enable=bit_flip)
|
127
|
+
self._perm = np.full((dim,), fill_value=0, dtype=np.int64)
|
128
|
+
self._perm[row_perm] = col_perm
|
129
|
+
self._inv_perm = inverse_permutation(self._perm)
|
130
|
+
|
131
|
+
def set_from_matrix(self, mat: np.ndarray):
|
132
|
+
"""See base class description."""
|
133
|
+
np.copyto(self._gmat, mat)
|
134
|
+
|
135
|
+
def get_attr(self) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
|
136
|
+
"""See base class description."""
|
137
|
+
return self._gmat, self._perm, self._inv_perm
|
138
|
+
|
139
|
+
|
140
|
+
def init_layer1q_matrices(thetas: np.ndarray, dst: np.ndarray) -> np.ndarray:
|
141
|
+
"""
|
142
|
+
Initializes 4x4 matrices of 2-qubit gates defined in the paper.
|
143
|
+
|
144
|
+
Args:
|
145
|
+
thetas: depth x 4 matrix of gate parameters for every layer, where
|
146
|
+
"depth" is the number of layers.
|
147
|
+
dst: destination array of size depth x 4 x 4 that will receive gate
|
148
|
+
matrices of each layer.
|
149
|
+
|
150
|
+
Returns:
|
151
|
+
Returns the "dst" array.
|
152
|
+
"""
|
153
|
+
n = thetas.shape[0]
|
154
|
+
tmp = np.full((4, 2, 2), fill_value=0, dtype=np.complex128)
|
155
|
+
for k in range(n):
|
156
|
+
th = thetas[k]
|
157
|
+
a = make_rz(th[0], out=tmp[0])
|
158
|
+
b = make_ry(th[1], out=tmp[1])
|
159
|
+
c = make_rz(th[2], out=tmp[2])
|
160
|
+
np.dot(np.dot(a, b, out=tmp[3]), c, out=dst[k])
|
161
|
+
return dst
|
162
|
+
|
163
|
+
|
164
|
+
def init_layer1q_deriv_matrices(thetas: np.ndarray, dst: np.ndarray) -> np.ndarray:
|
165
|
+
"""
|
166
|
+
Initializes 4x4 derivative matrices of 2-qubit gates defined in the paper.
|
167
|
+
|
168
|
+
Args:
|
169
|
+
thetas: depth x 4 matrix of gate parameters for every layer, where
|
170
|
+
"depth" is the number of layers.
|
171
|
+
dst: destination array of size depth x 4 x 4 x 4 that will receive gate
|
172
|
+
derivative matrices of each layer; there are 4 parameters per gate,
|
173
|
+
hence, 4 derivative matrices per layer.
|
174
|
+
|
175
|
+
Returns:
|
176
|
+
Returns the "dst" array.
|
177
|
+
"""
|
178
|
+
n = thetas.shape[0]
|
179
|
+
y = np.asarray([[0, -0.5], [0.5, 0]], dtype=np.complex128)
|
180
|
+
z = np.asarray([[-0.5j, 0], [0, 0.5j]], dtype=np.complex128)
|
181
|
+
tmp = np.full((5, 2, 2), fill_value=0, dtype=np.complex128)
|
182
|
+
for k in range(n):
|
183
|
+
th = thetas[k]
|
184
|
+
a = make_rz(th[0], out=tmp[0])
|
185
|
+
b = make_ry(th[1], out=tmp[1])
|
186
|
+
c = make_rz(th[2], out=tmp[2])
|
187
|
+
|
188
|
+
za = np.dot(z, a, out=tmp[3])
|
189
|
+
np.dot(np.dot(za, b, out=tmp[4]), c, out=dst[k, 0])
|
190
|
+
yb = np.dot(y, b, out=tmp[3])
|
191
|
+
np.dot(a, np.dot(yb, c, out=tmp[4]), out=dst[k, 1])
|
192
|
+
zc = np.dot(z, c, out=tmp[3])
|
193
|
+
np.dot(a, np.dot(b, zc, out=tmp[4]), out=dst[k, 2])
|
194
|
+
return dst
|
195
|
+
|
196
|
+
|
197
|
+
def init_layer2q_matrices(thetas: np.ndarray, dst: np.ndarray) -> np.ndarray:
|
198
|
+
"""
|
199
|
+
Initializes 4x4 matrices of 2-qubit gates defined in the paper.
|
200
|
+
|
201
|
+
Args:
|
202
|
+
thetas: depth x 4 matrix of gate parameters for every layer, where
|
203
|
+
"depth" is the number of layers.
|
204
|
+
dst: destination array of size depth x 4 x 4 that will receive gate
|
205
|
+
matrices of each layer.
|
206
|
+
|
207
|
+
Returns:
|
208
|
+
Returns the "dst" array.
|
209
|
+
"""
|
210
|
+
depth = thetas.shape[0]
|
211
|
+
for k in range(depth):
|
212
|
+
th = thetas[k]
|
213
|
+
cs0 = np.cos(0.5 * th[0]).item()
|
214
|
+
sn0 = np.sin(0.5 * th[0]).item()
|
215
|
+
ep1 = np.exp(0.5j * th[1]).item()
|
216
|
+
en1 = np.exp(-0.5j * th[1]).item()
|
217
|
+
cs2 = np.cos(0.5 * th[2]).item()
|
218
|
+
sn2 = np.sin(0.5 * th[2]).item()
|
219
|
+
cs3 = np.cos(0.5 * th[3]).item()
|
220
|
+
sn3 = np.sin(0.5 * th[3]).item()
|
221
|
+
ep1cs0 = ep1 * cs0
|
222
|
+
ep1sn0 = ep1 * sn0
|
223
|
+
en1cs0 = en1 * cs0
|
224
|
+
en1sn0 = en1 * sn0
|
225
|
+
sn2cs3 = sn2 * cs3
|
226
|
+
sn2sn3 = sn2 * sn3
|
227
|
+
cs2cs3 = cs2 * cs3
|
228
|
+
sn3cs2j = 1j * sn3 * cs2
|
229
|
+
sn2sn3j = 1j * sn2sn3
|
230
|
+
|
231
|
+
flat_dst = dst[k].ravel()
|
232
|
+
flat_dst[:] = [
|
233
|
+
-(sn2sn3j - cs2cs3) * en1cs0,
|
234
|
+
-(sn2cs3 + sn3cs2j) * en1cs0,
|
235
|
+
(sn2cs3 + sn3cs2j) * en1sn0,
|
236
|
+
(sn2sn3j - cs2cs3) * en1sn0,
|
237
|
+
(sn2cs3 - sn3cs2j) * en1cs0,
|
238
|
+
(sn2sn3j + cs2cs3) * en1cs0,
|
239
|
+
-(sn2sn3j + cs2cs3) * en1sn0,
|
240
|
+
(-sn2cs3 + sn3cs2j) * en1sn0,
|
241
|
+
(-sn2sn3j + cs2cs3) * ep1sn0,
|
242
|
+
-(sn2cs3 + sn3cs2j) * ep1sn0,
|
243
|
+
-(sn2cs3 + sn3cs2j) * ep1cs0,
|
244
|
+
(-sn2sn3j + cs2cs3) * ep1cs0,
|
245
|
+
(sn2cs3 - sn3cs2j) * ep1sn0,
|
246
|
+
(sn2sn3j + cs2cs3) * ep1sn0,
|
247
|
+
(sn2sn3j + cs2cs3) * ep1cs0,
|
248
|
+
(sn2cs3 - sn3cs2j) * ep1cs0,
|
249
|
+
]
|
250
|
+
return dst
|
251
|
+
|
252
|
+
|
253
|
+
def init_layer2q_deriv_matrices(thetas: np.ndarray, dst: np.ndarray) -> np.ndarray:
|
254
|
+
"""
|
255
|
+
Initializes 4 x 4 derivative matrices of 2-qubit gates defined in the paper.
|
256
|
+
|
257
|
+
Args:
|
258
|
+
thetas: depth x 4 matrix of gate parameters for every layer, where
|
259
|
+
"depth" is the number of layers.
|
260
|
+
dst: destination array of size depth x 4 x 4 x 4 that will receive gate
|
261
|
+
derivative matrices of each layer; there are 4 parameters per gate,
|
262
|
+
hence, 4 derivative matrices per layer.
|
263
|
+
|
264
|
+
Returns:
|
265
|
+
Returns the "dst" array.
|
266
|
+
"""
|
267
|
+
depth = thetas.shape[0]
|
268
|
+
for k in range(depth):
|
269
|
+
th = thetas[k]
|
270
|
+
cs0 = np.cos(0.5 * th[0]).item()
|
271
|
+
sn0 = np.sin(0.5 * th[0]).item()
|
272
|
+
ep1 = np.exp(0.5j * th[1]).item() * 0.5
|
273
|
+
en1 = np.exp(-0.5j * th[1]).item() * 0.5
|
274
|
+
cs2 = np.cos(0.5 * th[2]).item()
|
275
|
+
sn2 = np.sin(0.5 * th[2]).item()
|
276
|
+
cs3 = np.cos(0.5 * th[3]).item()
|
277
|
+
sn3 = np.sin(0.5 * th[3]).item()
|
278
|
+
ep1cs0 = ep1 * cs0
|
279
|
+
ep1sn0 = ep1 * sn0
|
280
|
+
en1cs0 = en1 * cs0
|
281
|
+
en1sn0 = en1 * sn0
|
282
|
+
sn2cs3 = sn2 * cs3
|
283
|
+
sn2sn3 = sn2 * sn3
|
284
|
+
sn3cs2 = sn3 * cs2
|
285
|
+
cs2cs3 = cs2 * cs3
|
286
|
+
sn2cs3j = 1j * sn2cs3
|
287
|
+
sn2sn3j = 1j * sn2sn3
|
288
|
+
sn3cs2j = 1j * sn3cs2
|
289
|
+
cs2cs3j = 1j * cs2cs3
|
290
|
+
|
291
|
+
flat_dst = dst[k, 0].ravel()
|
292
|
+
flat_dst[:] = [
|
293
|
+
(sn2sn3j - cs2cs3) * en1sn0,
|
294
|
+
(sn2cs3 + sn3cs2j) * en1sn0,
|
295
|
+
(sn2cs3 + sn3cs2j) * en1cs0,
|
296
|
+
(sn2sn3j - cs2cs3) * en1cs0,
|
297
|
+
(-sn2cs3 + sn3cs2j) * en1sn0,
|
298
|
+
-(sn2sn3j + cs2cs3) * en1sn0,
|
299
|
+
-(sn2sn3j + cs2cs3) * en1cs0,
|
300
|
+
(-sn2cs3 + sn3cs2j) * en1cs0,
|
301
|
+
(-sn2sn3j + cs2cs3) * ep1cs0,
|
302
|
+
-(sn2cs3 + sn3cs2j) * ep1cs0,
|
303
|
+
(sn2cs3 + sn3cs2j) * ep1sn0,
|
304
|
+
(sn2sn3j - cs2cs3) * ep1sn0,
|
305
|
+
(sn2cs3 - sn3cs2j) * ep1cs0,
|
306
|
+
(sn2sn3j + cs2cs3) * ep1cs0,
|
307
|
+
-(sn2sn3j + cs2cs3) * ep1sn0,
|
308
|
+
(-sn2cs3 + sn3cs2j) * ep1sn0,
|
309
|
+
]
|
310
|
+
|
311
|
+
flat_dst = dst[k, 1].ravel()
|
312
|
+
flat_dst[:] = [
|
313
|
+
-(sn2sn3 + cs2cs3j) * en1cs0,
|
314
|
+
(sn2cs3j - sn3cs2) * en1cs0,
|
315
|
+
-(sn2cs3j - sn3cs2) * en1sn0,
|
316
|
+
(sn2sn3 + cs2cs3j) * en1sn0,
|
317
|
+
-(sn2cs3j + sn3cs2) * en1cs0,
|
318
|
+
(sn2sn3 - cs2cs3j) * en1cs0,
|
319
|
+
(-sn2sn3 + cs2cs3j) * en1sn0,
|
320
|
+
(sn2cs3j + sn3cs2) * en1sn0,
|
321
|
+
(sn2sn3 + cs2cs3j) * ep1sn0,
|
322
|
+
(-sn2cs3j + sn3cs2) * ep1sn0,
|
323
|
+
(-sn2cs3j + sn3cs2) * ep1cs0,
|
324
|
+
(sn2sn3 + cs2cs3j) * ep1cs0,
|
325
|
+
(sn2cs3j + sn3cs2) * ep1sn0,
|
326
|
+
(-sn2sn3 + cs2cs3j) * ep1sn0,
|
327
|
+
(-sn2sn3 + cs2cs3j) * ep1cs0,
|
328
|
+
(sn2cs3j + sn3cs2) * ep1cs0,
|
329
|
+
]
|
330
|
+
|
331
|
+
flat_dst = dst[k, 2].ravel()
|
332
|
+
flat_dst[:] = [
|
333
|
+
-(sn2cs3 + sn3cs2j) * en1cs0,
|
334
|
+
(sn2sn3j - cs2cs3) * en1cs0,
|
335
|
+
-(sn2sn3j - cs2cs3) * en1sn0,
|
336
|
+
(sn2cs3 + sn3cs2j) * en1sn0,
|
337
|
+
(sn2sn3j + cs2cs3) * en1cs0,
|
338
|
+
(-sn2cs3 + sn3cs2j) * en1cs0,
|
339
|
+
(sn2cs3 - sn3cs2j) * en1sn0,
|
340
|
+
-(sn2sn3j + cs2cs3) * en1sn0,
|
341
|
+
-(sn2cs3 + sn3cs2j) * ep1sn0,
|
342
|
+
(sn2sn3j - cs2cs3) * ep1sn0,
|
343
|
+
(sn2sn3j - cs2cs3) * ep1cs0,
|
344
|
+
-(sn2cs3 + sn3cs2j) * ep1cs0,
|
345
|
+
(sn2sn3j + cs2cs3) * ep1sn0,
|
346
|
+
(-sn2cs3 + sn3cs2j) * ep1sn0,
|
347
|
+
(-sn2cs3 + sn3cs2j) * ep1cs0,
|
348
|
+
(sn2sn3j + cs2cs3) * ep1cs0,
|
349
|
+
]
|
350
|
+
|
351
|
+
flat_dst = dst[k, 3].ravel()
|
352
|
+
flat_dst[:] = [
|
353
|
+
-(sn2cs3j + sn3cs2) * en1cs0,
|
354
|
+
(sn2sn3 - cs2cs3j) * en1cs0,
|
355
|
+
(-sn2sn3 + cs2cs3j) * en1sn0,
|
356
|
+
(sn2cs3j + sn3cs2) * en1sn0,
|
357
|
+
-(sn2sn3 + cs2cs3j) * en1cs0,
|
358
|
+
(sn2cs3j - sn3cs2) * en1cs0,
|
359
|
+
-(sn2cs3j - sn3cs2) * en1sn0,
|
360
|
+
(sn2sn3 + cs2cs3j) * en1sn0,
|
361
|
+
-(sn2cs3j + sn3cs2) * ep1sn0,
|
362
|
+
(sn2sn3 - cs2cs3j) * ep1sn0,
|
363
|
+
(sn2sn3 - cs2cs3j) * ep1cs0,
|
364
|
+
-(sn2cs3j + sn3cs2) * ep1cs0,
|
365
|
+
-(sn2sn3 + cs2cs3j) * ep1sn0,
|
366
|
+
(sn2cs3j - sn3cs2) * ep1sn0,
|
367
|
+
(sn2cs3j - sn3cs2) * ep1cs0,
|
368
|
+
-(sn2sn3 + cs2cs3j) * ep1cs0,
|
369
|
+
]
|
370
|
+
return dst
|
@@ -0,0 +1,312 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2022.
|
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
|
+
Matrix designed for fast multiplication by permutation and block-diagonal ones.
|
15
|
+
"""
|
16
|
+
|
17
|
+
import numpy as np
|
18
|
+
from .layer import Layer1Q, Layer2Q
|
19
|
+
|
20
|
+
|
21
|
+
class PMatrix:
|
22
|
+
"""
|
23
|
+
Wrapper around a matrix that enables fast multiplication by permutation
|
24
|
+
matrices and block-diagonal ones.
|
25
|
+
"""
|
26
|
+
|
27
|
+
def __init__(self, num_qubits: int):
|
28
|
+
"""
|
29
|
+
Initializes the internal structures of this object but does not set
|
30
|
+
the matrix yet.
|
31
|
+
|
32
|
+
Args:
|
33
|
+
num_qubits: number of qubits.
|
34
|
+
"""
|
35
|
+
dim = 2**num_qubits
|
36
|
+
self._mat = np.empty(0)
|
37
|
+
self._dim = dim
|
38
|
+
self._temp_g2x2 = np.zeros((2, 2), dtype=np.complex128)
|
39
|
+
self._temp_g4x4 = np.zeros((4, 4), dtype=np.complex128)
|
40
|
+
self._temp_2x2 = self._temp_g2x2.copy()
|
41
|
+
self._temp_4x4 = self._temp_g4x4.copy()
|
42
|
+
self._identity_perm = np.arange(dim, dtype=np.int64)
|
43
|
+
self._left_perm = self._identity_perm.copy()
|
44
|
+
self._right_perm = self._identity_perm.copy()
|
45
|
+
self._temp_perm = self._identity_perm.copy()
|
46
|
+
self._temp_slice_dim_x_2 = np.zeros((dim, 2), dtype=np.complex128)
|
47
|
+
self._temp_slice_dim_x_4 = np.zeros((dim, 4), dtype=np.complex128)
|
48
|
+
self._idx_mat = self._init_index_matrix(dim)
|
49
|
+
self._temp_block_diag = np.zeros(self._idx_mat.shape, dtype=np.complex128)
|
50
|
+
|
51
|
+
def set_matrix(self, mat: np.ndarray):
|
52
|
+
"""
|
53
|
+
Copies specified matrix to internal storage. Once the matrix
|
54
|
+
is set, the object is ready for use.
|
55
|
+
|
56
|
+
**Note**, the matrix will be copied, mind the size issues.
|
57
|
+
|
58
|
+
Args:
|
59
|
+
mat: matrix we want to multiply on the left and on the right by
|
60
|
+
layer matrices.
|
61
|
+
"""
|
62
|
+
if self._mat.size == 0:
|
63
|
+
self._mat = mat.copy()
|
64
|
+
else:
|
65
|
+
np.copyto(self._mat, mat)
|
66
|
+
|
67
|
+
@staticmethod
|
68
|
+
def _init_index_matrix(dim: int) -> np.ndarray:
|
69
|
+
"""
|
70
|
+
Fast multiplication can be implemented by picking up a subset of
|
71
|
+
entries in a sparse matrix.
|
72
|
+
|
73
|
+
Args:
|
74
|
+
dim: problem dimensionality.
|
75
|
+
|
76
|
+
Returns:
|
77
|
+
2d-array of indices for the fast multiplication.
|
78
|
+
"""
|
79
|
+
all_idx = np.arange(dim * dim, dtype=np.int64).reshape(dim, dim)
|
80
|
+
idx = np.full((dim // 4, 4 * 4), fill_value=0, dtype=np.int64)
|
81
|
+
b = np.full((4, 4), fill_value=0, dtype=np.int64)
|
82
|
+
for i in range(0, dim, 4):
|
83
|
+
b[:, :] = all_idx[i : i + 4, i : i + 4]
|
84
|
+
idx[i // 4, :] = b.T.ravel()
|
85
|
+
return idx
|
86
|
+
|
87
|
+
def mul_right_q1(self, layer: Layer1Q, temp_mat: np.ndarray, dagger: bool):
|
88
|
+
"""
|
89
|
+
Multiplies ``NxN`` matrix, wrapped by this object, by a 1-qubit layer
|
90
|
+
matrix of the right, where ``N`` is the actual size of matrices involved,
|
91
|
+
``N = 2^{num. of qubits}``.
|
92
|
+
|
93
|
+
Args:
|
94
|
+
layer: 1-qubit layer, i.e. the layer with just one non-trivial
|
95
|
+
1-qubit gate and other gates are just identity operators.
|
96
|
+
temp_mat: a temporary NxN matrix used as a workspace.
|
97
|
+
dagger: if true, the right-hand side matrix will be taken as
|
98
|
+
conjugate transposed.
|
99
|
+
"""
|
100
|
+
|
101
|
+
gmat, perm, inv_perm = layer.get_attr()
|
102
|
+
mat = self._mat
|
103
|
+
dim = perm.size
|
104
|
+
|
105
|
+
# temp_mat <-- mat[:, right_perm[perm]] = mat[:, right_perm][:, perm]:
|
106
|
+
np.take(mat, np.take(self._right_perm, perm, out=self._temp_perm), axis=1, out=temp_mat)
|
107
|
+
|
108
|
+
# mat <-- mat[:, right_perm][:, perm] @ kron(I(N/4), gmat)^dagger, where
|
109
|
+
# conjugate-transposition might be or might be not applied:
|
110
|
+
gmat_right = np.conj(gmat, out=self._temp_g2x2).T if dagger else gmat
|
111
|
+
for i in range(0, dim, 2):
|
112
|
+
mat[:, i : i + 2] = np.dot(
|
113
|
+
temp_mat[:, i : i + 2], gmat_right, out=self._temp_slice_dim_x_2
|
114
|
+
)
|
115
|
+
|
116
|
+
# Update right permutation:
|
117
|
+
self._right_perm[:] = inv_perm
|
118
|
+
|
119
|
+
def mul_right_q2(self, layer: Layer2Q, temp_mat: np.ndarray, dagger: bool = True):
|
120
|
+
"""
|
121
|
+
Multiplies ``NxN`` matrix, wrapped by this object, by a 2-qubit layer
|
122
|
+
matrix on the right, where ``N`` is the actual size of matrices involved,
|
123
|
+
``N = 2^{num. of qubits}``.
|
124
|
+
|
125
|
+
Args:
|
126
|
+
layer: 2-qubit layer, i.e. the layer with just one non-trivial
|
127
|
+
2-qubit gate and other gates are just identity operators.
|
128
|
+
temp_mat: a temporary NxN matrix used as a workspace.
|
129
|
+
dagger: if true, the right-hand side matrix will be taken as
|
130
|
+
conjugate transposed.
|
131
|
+
"""
|
132
|
+
|
133
|
+
gmat, perm, inv_perm = layer.get_attr()
|
134
|
+
mat = self._mat
|
135
|
+
dim = perm.size
|
136
|
+
|
137
|
+
# temp_mat <-- mat[:, right_perm[perm]] = mat[:, right_perm][:, perm]:
|
138
|
+
np.take(mat, np.take(self._right_perm, perm, out=self._temp_perm), axis=1, out=temp_mat)
|
139
|
+
|
140
|
+
# mat <-- mat[:, right_perm][:, perm] @ kron(I(N/4), gmat)^dagger, where
|
141
|
+
# conjugate-transposition might be or might be not applied:
|
142
|
+
gmat_right = np.conj(gmat, out=self._temp_g4x4).T if dagger else gmat
|
143
|
+
for i in range(0, dim, 4):
|
144
|
+
mat[:, i : i + 4] = np.dot(
|
145
|
+
temp_mat[:, i : i + 4], gmat_right, out=self._temp_slice_dim_x_4
|
146
|
+
)
|
147
|
+
|
148
|
+
# Update right permutation:
|
149
|
+
self._right_perm[:] = inv_perm
|
150
|
+
|
151
|
+
def mul_left_q1(self, layer: Layer1Q, temp_mat: np.ndarray):
|
152
|
+
"""
|
153
|
+
Multiplies ``NxN`` matrix, wrapped by this object, by a 1-qubit layer
|
154
|
+
matrix of the left, where ``dim`` is the actual size of matrices involved,
|
155
|
+
``dim = 2^{num. of qubits}``.
|
156
|
+
|
157
|
+
Args:
|
158
|
+
layer: 1-qubit layer, i.e. the layer with just one non-trivial
|
159
|
+
1-qubit gate and other gates are just identity operators.
|
160
|
+
temp_mat: a temporary NxN matrix used as a workspace.
|
161
|
+
"""
|
162
|
+
mat = self._mat
|
163
|
+
gmat, perm, inv_perm = layer.get_attr()
|
164
|
+
dim = perm.size
|
165
|
+
|
166
|
+
# temp_mat <-- mat[left_perm[perm]] = mat[left_perm][perm]:
|
167
|
+
np.take(mat, np.take(self._left_perm, perm, out=self._temp_perm), axis=0, out=temp_mat)
|
168
|
+
|
169
|
+
# mat <-- kron(I(dim/4), gmat) @ mat[left_perm][perm]:
|
170
|
+
if dim > 512:
|
171
|
+
# Faster for large matrices.
|
172
|
+
for i in range(0, dim, 2):
|
173
|
+
np.dot(gmat, temp_mat[i : i + 2, :], out=mat[i : i + 2, :])
|
174
|
+
else:
|
175
|
+
# Faster for small matrices.
|
176
|
+
half = dim // 2
|
177
|
+
np.copyto(
|
178
|
+
mat.reshape((2, half, dim)), np.swapaxes(temp_mat.reshape((half, 2, dim)), 0, 1)
|
179
|
+
)
|
180
|
+
np.dot(gmat, mat.reshape(2, -1), out=temp_mat.reshape(2, -1))
|
181
|
+
np.copyto(
|
182
|
+
mat.reshape((half, 2, dim)), np.swapaxes(temp_mat.reshape((2, half, dim)), 0, 1)
|
183
|
+
)
|
184
|
+
|
185
|
+
# Update left permutation:
|
186
|
+
self._left_perm[:] = inv_perm
|
187
|
+
|
188
|
+
def mul_left_q2(self, layer: Layer2Q, temp_mat: np.ndarray):
|
189
|
+
"""
|
190
|
+
Multiplies ``NxN`` matrix, wrapped by this object, by a 2-qubit layer
|
191
|
+
matrix on the left, where ``dim`` is the actual size of matrices involved,
|
192
|
+
``dim = 2^{num. of qubits}``.
|
193
|
+
|
194
|
+
Args:
|
195
|
+
layer: 2-qubit layer, i.e. the layer with just one non-trivial
|
196
|
+
2-qubit gate and other gates are just identity operators.
|
197
|
+
temp_mat: a temporary NxN matrix used as a workspace.
|
198
|
+
"""
|
199
|
+
mat = self._mat
|
200
|
+
gmat, perm, inv_perm = layer.get_attr()
|
201
|
+
dim = perm.size
|
202
|
+
|
203
|
+
# temp_mat <-- mat[left_perm[perm]] = mat[left_perm][perm]:
|
204
|
+
np.take(mat, np.take(self._left_perm, perm, out=self._temp_perm), axis=0, out=temp_mat)
|
205
|
+
|
206
|
+
# mat <-- kron(I(dim/4), gmat) @ mat[left_perm][perm]:
|
207
|
+
if dim > 512:
|
208
|
+
# Faster for large matrices.
|
209
|
+
for i in range(0, dim, 4):
|
210
|
+
np.dot(gmat, temp_mat[i : i + 4, :], out=mat[i : i + 4, :])
|
211
|
+
else:
|
212
|
+
# Faster for small matrices.
|
213
|
+
half = dim // 4
|
214
|
+
np.copyto(
|
215
|
+
mat.reshape((4, half, dim)), np.swapaxes(temp_mat.reshape((half, 4, dim)), 0, 1)
|
216
|
+
)
|
217
|
+
np.dot(gmat, mat.reshape(4, -1), out=temp_mat.reshape(4, -1))
|
218
|
+
np.copyto(
|
219
|
+
mat.reshape((half, 4, dim)), np.swapaxes(temp_mat.reshape((4, half, dim)), 0, 1)
|
220
|
+
)
|
221
|
+
|
222
|
+
# Update left permutation:
|
223
|
+
self._left_perm[:] = inv_perm
|
224
|
+
|
225
|
+
def product_q1(self, layer: Layer1Q, tmp1: np.ndarray, tmp2: np.ndarray) -> np.complex128:
|
226
|
+
"""
|
227
|
+
Computes and returns: ``Trace(mat @ C) = Trace(mat @ P^T @ gmat @ P) =
|
228
|
+
Trace((P @ mat @ P^T) @ gmat) = Trace(C @ (P @ mat @ P^T)) =
|
229
|
+
vec(gmat^T)^T @ vec(P @ mat @ P^T)``, where mat is ``NxN`` matrix wrapped
|
230
|
+
by this object, ``C`` is matrix representation of the layer ``L``, and gmat
|
231
|
+
is 2x2 matrix of underlying 1-qubit gate.
|
232
|
+
|
233
|
+
**Note**: matrix of this class must be finalized beforehand.
|
234
|
+
|
235
|
+
Args:
|
236
|
+
layer: 1-qubit layer.
|
237
|
+
tmp1: temporary, external matrix used as a workspace.
|
238
|
+
tmp2: temporary, external matrix used as a workspace.
|
239
|
+
|
240
|
+
Returns:
|
241
|
+
trace of the matrix product.
|
242
|
+
"""
|
243
|
+
mat = self._mat
|
244
|
+
gmat, perm, _ = layer.get_attr()
|
245
|
+
|
246
|
+
# tmp2 = P @ mat @ P^T:
|
247
|
+
np.take(np.take(mat, perm, axis=0, out=tmp1), perm, axis=1, out=tmp2)
|
248
|
+
|
249
|
+
# matrix dot product = Tr(transposed(kron(I(dim/4), gmat)), (P @ mat @ P^T)):
|
250
|
+
gmat_t, tmp3 = self._temp_g2x2, self._temp_2x2
|
251
|
+
np.copyto(gmat_t, gmat.T)
|
252
|
+
_sum = 0.0
|
253
|
+
for i in range(0, mat.shape[0], 2):
|
254
|
+
tmp3[:, :] = tmp2[i : i + 2, i : i + 2]
|
255
|
+
_sum += np.dot(gmat_t.ravel(), tmp3.ravel())
|
256
|
+
|
257
|
+
return np.complex128(_sum)
|
258
|
+
|
259
|
+
def product_q2(self, layer: Layer2Q, tmp1: np.ndarray, tmp2: np.ndarray) -> np.complex128:
|
260
|
+
"""
|
261
|
+
Computes and returns: ``Trace(mat @ C) = Trace(mat @ P^T @ gmat @ P) =
|
262
|
+
Trace((P @ mat @ P^T) @ gmat) = Trace(C @ (P @ mat @ P^T)) =
|
263
|
+
vec(gmat^T)^T @ vec(P @ mat @ P^T)``, where mat is ``NxN`` matrix wrapped
|
264
|
+
by this object, ``C`` is matrix representation of the layer ``L``, and gmat
|
265
|
+
is 4x4 matrix of underlying 2-qubit gate.
|
266
|
+
|
267
|
+
**Note**: matrix of this class must be finalized beforehand.
|
268
|
+
|
269
|
+
Args:
|
270
|
+
layer: 2-qubit layer.
|
271
|
+
tmp1: temporary, external matrix used as a workspace.
|
272
|
+
tmp2: temporary, external matrix used as a workspace.
|
273
|
+
|
274
|
+
Returns:
|
275
|
+
trace of the matrix product.
|
276
|
+
"""
|
277
|
+
mat = self._mat
|
278
|
+
gmat, perm, _ = layer.get_attr()
|
279
|
+
|
280
|
+
# Compute the matrix dot product:
|
281
|
+
# Tr(transposed(kron(I(dim/4), gmat)), (P @ mat @ P^T)):
|
282
|
+
|
283
|
+
# The fastest version so far, but requires two NxN temp. matrices.
|
284
|
+
# tmp2 = P @ mat @ P^T:
|
285
|
+
np.take(np.take(mat, perm, axis=0, out=tmp1), perm, axis=1, out=tmp2)
|
286
|
+
|
287
|
+
bldia = self._temp_block_diag
|
288
|
+
np.take(tmp2.ravel(), self._idx_mat.ravel(), axis=0, out=bldia.ravel())
|
289
|
+
bldia *= gmat.reshape(-1, gmat.size)
|
290
|
+
return np.complex128(np.sum(bldia))
|
291
|
+
|
292
|
+
def finalize(self, temp_mat: np.ndarray) -> np.ndarray:
|
293
|
+
"""
|
294
|
+
Applies the left (row) and right (column) permutations to the matrix.
|
295
|
+
at the end of computation process.
|
296
|
+
|
297
|
+
Args:
|
298
|
+
temp_mat: temporary, external matrix.
|
299
|
+
|
300
|
+
Returns:
|
301
|
+
finalized matrix with all transformations applied.
|
302
|
+
"""
|
303
|
+
mat = self._mat
|
304
|
+
|
305
|
+
# mat <-- mat[left_perm][:, right_perm] = P_left @ mat @ transposed(P_right)
|
306
|
+
np.take(mat, self._left_perm, axis=0, out=temp_mat)
|
307
|
+
np.take(temp_mat, self._right_perm, axis=1, out=mat)
|
308
|
+
|
309
|
+
# Set both permutations to identity once they have been applied.
|
310
|
+
self._left_perm[:] = self._identity_perm
|
311
|
+
self._right_perm[:] = self._identity_perm
|
312
|
+
return self._mat
|