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,237 @@
|
|
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
|
+
Utility functions in the fast gradient implementation.
|
15
|
+
"""
|
16
|
+
from __future__ import annotations
|
17
|
+
from typing import Union
|
18
|
+
import numpy as np
|
19
|
+
|
20
|
+
|
21
|
+
def is_permutation(x: np.ndarray) -> bool:
|
22
|
+
"""
|
23
|
+
Checks if array is really an index permutation.
|
24
|
+
|
25
|
+
Args:
|
26
|
+
1D-array of integers that supposedly represents a permutation.
|
27
|
+
|
28
|
+
Returns:
|
29
|
+
True, if array is really a permutation of indices.
|
30
|
+
"""
|
31
|
+
return (
|
32
|
+
isinstance(x, np.ndarray)
|
33
|
+
and x.ndim == 1
|
34
|
+
and x.dtype == np.int64
|
35
|
+
and np.all(np.sort(x) == np.arange(x.size, dtype=np.int64))
|
36
|
+
)
|
37
|
+
|
38
|
+
|
39
|
+
def reverse_bits(x: Union[int, np.ndarray], nbits: int, enable: bool) -> Union[int, np.ndarray]:
|
40
|
+
"""
|
41
|
+
Reverses the bit order in a number of ``nbits`` length.
|
42
|
+
If ``x`` is an array, then operation is applied to every entry.
|
43
|
+
|
44
|
+
Args:
|
45
|
+
x: either a single integer or an array of integers.
|
46
|
+
nbits: number of meaningful bits in the number x.
|
47
|
+
enable: apply reverse operation, if enabled, otherwise leave unchanged.
|
48
|
+
|
49
|
+
Returns:
|
50
|
+
a number or array of numbers with reversed bits.
|
51
|
+
"""
|
52
|
+
|
53
|
+
if not enable:
|
54
|
+
if isinstance(x, int):
|
55
|
+
pass
|
56
|
+
else:
|
57
|
+
x = x.copy()
|
58
|
+
return x
|
59
|
+
|
60
|
+
if isinstance(x, int):
|
61
|
+
res: int | np.ndarray = int(0)
|
62
|
+
else:
|
63
|
+
x = x.copy()
|
64
|
+
res = np.full_like(x, fill_value=0)
|
65
|
+
|
66
|
+
for _ in range(nbits):
|
67
|
+
res <<= 1
|
68
|
+
res |= x & 1
|
69
|
+
x >>= 1
|
70
|
+
return res
|
71
|
+
|
72
|
+
|
73
|
+
def swap_bits(num: int, a: int, b: int) -> int:
|
74
|
+
"""
|
75
|
+
Swaps the bits at positions 'a' and 'b' in the number 'num'.
|
76
|
+
|
77
|
+
Args:
|
78
|
+
num: an integer number where bits should be swapped.
|
79
|
+
a: index of the first bit to be swapped.
|
80
|
+
b: index of the second bit to be swapped.
|
81
|
+
|
82
|
+
Returns:
|
83
|
+
the number with swapped bits.
|
84
|
+
"""
|
85
|
+
x = ((num >> a) ^ (num >> b)) & 1
|
86
|
+
return num ^ ((x << a) | (x << b))
|
87
|
+
|
88
|
+
|
89
|
+
def bit_permutation_1q(n: int, k: int) -> np.ndarray:
|
90
|
+
"""
|
91
|
+
Constructs index permutation that brings a circuit consisting of a single
|
92
|
+
1-qubit gate to "standard form": ``kron(I(2^n/2), G)``, as we call it. Here n
|
93
|
+
is the number of qubits, ``G`` is a 2x2 gate matrix, ``I(2^n/2)`` is the identity
|
94
|
+
matrix of size ``(2^n/2)x(2^n/2)``, and the full size of the circuit matrix is
|
95
|
+
``(2^n)x(2^n)``. Circuit matrix in standard form becomes block-diagonal (with
|
96
|
+
sub-matrices ``G`` on the main diagonal). Multiplication of such a matrix and
|
97
|
+
a dense one is much faster than generic dense-dense product. Moreover,
|
98
|
+
we do not need to keep the entire circuit matrix in memory but just 2x2 ``G``
|
99
|
+
one. This saves a lot of memory when the number of qubits is large.
|
100
|
+
|
101
|
+
Args:
|
102
|
+
n: number of qubits.
|
103
|
+
k: index of qubit where single 1-qubit gate is applied.
|
104
|
+
|
105
|
+
Returns:
|
106
|
+
permutation that brings the whole layer to the standard form.
|
107
|
+
"""
|
108
|
+
perm = np.arange(2**n, dtype=np.int64)
|
109
|
+
if k != n - 1:
|
110
|
+
for v in range(2**n):
|
111
|
+
perm[v] = swap_bits(v, k, n - 1)
|
112
|
+
return perm
|
113
|
+
|
114
|
+
|
115
|
+
def bit_permutation_2q(n: int, j: int, k: int) -> np.ndarray:
|
116
|
+
"""
|
117
|
+
Constructs index permutation that brings a circuit consisting of a single
|
118
|
+
2-qubit gate to "standard form": ``kron(I(2^n/4), G)``, as we call it. Here ``n``
|
119
|
+
is the number of qubits, ``G`` is a 4x4 gate matrix, ``I(2^n/4)`` is the identity
|
120
|
+
matrix of size ``(2^n/4)x(2^n/4)``, and the full size of the circuit matrix is
|
121
|
+
``(2^n)x(2^n)``. Circuit matrix in standard form becomes block-diagonal (with
|
122
|
+
sub-matrices ``G`` on the main diagonal). Multiplication of such a matrix and
|
123
|
+
a dense one is much faster than generic dense-dense product. Moreover,
|
124
|
+
we do not need to keep the entire circuit matrix in memory but just 4x4 ``G``
|
125
|
+
one. This saves a lot of memory when the number of qubits is large.
|
126
|
+
|
127
|
+
Args:
|
128
|
+
n: number of qubits.
|
129
|
+
j: index of control qubit where single 2-qubit gate is applied.
|
130
|
+
k: index of target qubit where single 2-qubit gate is applied.
|
131
|
+
|
132
|
+
Returns:
|
133
|
+
permutation that brings the whole layer to the standard form.
|
134
|
+
"""
|
135
|
+
dim = 2**n
|
136
|
+
perm = np.arange(dim, dtype=np.int64)
|
137
|
+
if j < n - 2:
|
138
|
+
if k < n - 2:
|
139
|
+
for v in range(dim):
|
140
|
+
perm[v] = swap_bits(swap_bits(v, j, n - 2), k, n - 1)
|
141
|
+
elif k == n - 2:
|
142
|
+
for v in range(dim):
|
143
|
+
perm[v] = swap_bits(swap_bits(v, n - 2, n - 1), j, n - 2)
|
144
|
+
else:
|
145
|
+
for v in range(dim):
|
146
|
+
perm[v] = swap_bits(v, j, n - 2)
|
147
|
+
elif j == n - 2:
|
148
|
+
if k < n - 2:
|
149
|
+
for v in range(dim):
|
150
|
+
perm[v] = swap_bits(v, k, n - 1)
|
151
|
+
else:
|
152
|
+
pass
|
153
|
+
else:
|
154
|
+
if k < n - 2:
|
155
|
+
for v in range(dim):
|
156
|
+
perm[v] = swap_bits(swap_bits(v, n - 2, n - 1), k, n - 1)
|
157
|
+
else:
|
158
|
+
for v in range(dim):
|
159
|
+
perm[v] = swap_bits(v, n - 2, n - 1)
|
160
|
+
return perm
|
161
|
+
|
162
|
+
|
163
|
+
def inverse_permutation(perm: np.ndarray) -> np.ndarray:
|
164
|
+
"""
|
165
|
+
Returns inverse permutation.
|
166
|
+
|
167
|
+
Args:
|
168
|
+
perm: permutation to be reversed.
|
169
|
+
|
170
|
+
Returns:
|
171
|
+
inverse permutation.
|
172
|
+
"""
|
173
|
+
inv = np.zeros_like(perm)
|
174
|
+
inv[perm] = np.arange(perm.size, dtype=np.int64)
|
175
|
+
return inv
|
176
|
+
|
177
|
+
|
178
|
+
def make_rx(phi: float, out: np.ndarray) -> np.ndarray:
|
179
|
+
"""
|
180
|
+
Makes a 2x2 matrix that corresponds to X-rotation gate.
|
181
|
+
This is a fast implementation that does not allocate the output matrix.
|
182
|
+
|
183
|
+
Args:
|
184
|
+
phi: rotation angle.
|
185
|
+
out: placeholder for the result (2x2, complex-valued matrix).
|
186
|
+
|
187
|
+
Returns:
|
188
|
+
rotation gate, same object as referenced by "out".
|
189
|
+
"""
|
190
|
+
a = 0.5 * phi
|
191
|
+
cs, sn = np.cos(a).item(), -1j * np.sin(a).item()
|
192
|
+
out[0, 0] = cs
|
193
|
+
out[0, 1] = sn
|
194
|
+
out[1, 0] = sn
|
195
|
+
out[1, 1] = cs
|
196
|
+
return out
|
197
|
+
|
198
|
+
|
199
|
+
def make_ry(phi: float, out: np.ndarray) -> np.ndarray:
|
200
|
+
"""
|
201
|
+
Makes a 2x2 matrix that corresponds to Y-rotation gate.
|
202
|
+
This is a fast implementation that does not allocate the output matrix.
|
203
|
+
|
204
|
+
Args:
|
205
|
+
phi: rotation angle.
|
206
|
+
out: placeholder for the result (2x2, complex-valued matrix).
|
207
|
+
|
208
|
+
Returns:
|
209
|
+
rotation gate, same object as referenced by "out".
|
210
|
+
"""
|
211
|
+
a = 0.5 * phi
|
212
|
+
cs, sn = np.cos(a).item(), np.sin(a).item()
|
213
|
+
out[0, 0] = cs
|
214
|
+
out[0, 1] = -sn
|
215
|
+
out[1, 0] = sn
|
216
|
+
out[1, 1] = cs
|
217
|
+
return out
|
218
|
+
|
219
|
+
|
220
|
+
def make_rz(phi: float, out: np.ndarray) -> np.ndarray:
|
221
|
+
"""
|
222
|
+
Makes a 2x2 matrix that corresponds to Z-rotation gate.
|
223
|
+
This is a fast implementation that does not allocate the output matrix.
|
224
|
+
|
225
|
+
Args:
|
226
|
+
phi: rotation angle.
|
227
|
+
out: placeholder for the result (2x2, complex-valued matrix).
|
228
|
+
|
229
|
+
Returns:
|
230
|
+
rotation gate, same object as referenced by "out".
|
231
|
+
"""
|
232
|
+
exp = np.exp(0.5j * phi).item()
|
233
|
+
out[0, 0] = 1.0 / exp
|
234
|
+
out[0, 1] = 0
|
235
|
+
out[1, 0] = 0
|
236
|
+
out[1, 1] = exp
|
237
|
+
return out
|
@@ -0,0 +1,226 @@
|
|
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
|
+
Implementation of the fast objective function class.
|
15
|
+
"""
|
16
|
+
|
17
|
+
import math
|
18
|
+
import warnings
|
19
|
+
import numpy as np
|
20
|
+
|
21
|
+
from .layer import (
|
22
|
+
LayerBase,
|
23
|
+
Layer2Q,
|
24
|
+
Layer1Q,
|
25
|
+
init_layer2q_matrices,
|
26
|
+
init_layer2q_deriv_matrices,
|
27
|
+
init_layer1q_matrices,
|
28
|
+
init_layer1q_deriv_matrices,
|
29
|
+
)
|
30
|
+
from .pmatrix import PMatrix
|
31
|
+
from ..cnot_unit_objective import CNOTUnitObjective
|
32
|
+
|
33
|
+
|
34
|
+
class FastCNOTUnitObjective(CNOTUnitObjective):
|
35
|
+
"""
|
36
|
+
Implementation of objective function and gradient calculator, which is
|
37
|
+
similar to
|
38
|
+
:class:`~qiskit.transpiler.aqc.DefaultCNOTUnitObjective`
|
39
|
+
but several times faster.
|
40
|
+
"""
|
41
|
+
|
42
|
+
def __init__(self, num_qubits: int, cnots: np.ndarray):
|
43
|
+
super().__init__(num_qubits, cnots)
|
44
|
+
|
45
|
+
if not 2 <= num_qubits <= 16:
|
46
|
+
raise ValueError("expects number of qubits in the range [2..16]")
|
47
|
+
|
48
|
+
dim = 2**num_qubits
|
49
|
+
self._ucf_mat = PMatrix(num_qubits) # U^dagger @ C @ F
|
50
|
+
self._fuc_mat = PMatrix(num_qubits) # F @ U^dagger @ C
|
51
|
+
self._circ_thetas = np.zeros((self.num_thetas,)) # last thetas used
|
52
|
+
|
53
|
+
# array of C-layers:
|
54
|
+
self._c_layers = np.asarray([object()] * self.num_cnots, dtype=LayerBase)
|
55
|
+
# array of F-layers:
|
56
|
+
self._f_layers = np.asarray([object()] * num_qubits, dtype=LayerBase)
|
57
|
+
# 4x4 C-gate matrices:
|
58
|
+
self._c_gates = np.full((self.num_cnots, 4, 4), fill_value=0, dtype=np.complex128)
|
59
|
+
# derivatives of 4x4 C-gate matrices:
|
60
|
+
self._c_dervs = np.full((self.num_cnots, 4, 4, 4), fill_value=0, dtype=np.complex128)
|
61
|
+
# 4x4 F-gate matrices:
|
62
|
+
self._f_gates = np.full((num_qubits, 2, 2), fill_value=0, dtype=np.complex128)
|
63
|
+
# derivatives of 4x4 F-gate matrices:
|
64
|
+
self._f_dervs = np.full((num_qubits, 3, 2, 2), fill_value=0, dtype=np.complex128)
|
65
|
+
# temporary NxN matrices:
|
66
|
+
self._tmp1 = np.full((dim, dim), fill_value=0, dtype=np.complex128)
|
67
|
+
self._tmp2 = np.full((dim, dim), fill_value=0, dtype=np.complex128)
|
68
|
+
|
69
|
+
# Create layers of 2-qubit gates.
|
70
|
+
for q in range(self.num_cnots):
|
71
|
+
j = int(cnots[0, q])
|
72
|
+
k = int(cnots[1, q])
|
73
|
+
self._c_layers[q] = Layer2Q(num_qubits=num_qubits, j=j, k=k)
|
74
|
+
|
75
|
+
# Create layers of 1-qubit gates.
|
76
|
+
for k in range(num_qubits):
|
77
|
+
self._f_layers[k] = Layer1Q(num_qubits=num_qubits, k=k)
|
78
|
+
|
79
|
+
def objective(self, param_values: np.ndarray) -> float:
|
80
|
+
"""
|
81
|
+
Computes the objective function and some intermediate data for
|
82
|
+
the subsequent gradient computation.
|
83
|
+
See description of the base class method.
|
84
|
+
"""
|
85
|
+
depth, n = self.num_cnots, self._num_qubits
|
86
|
+
|
87
|
+
# Memorize the last angular parameters used to compute the objective.
|
88
|
+
if self._circ_thetas.size == 0:
|
89
|
+
self._circ_thetas = np.zeros((self.num_thetas,))
|
90
|
+
np.copyto(self._circ_thetas, param_values)
|
91
|
+
|
92
|
+
thetas4d = param_values[: 4 * depth].reshape(depth, 4)
|
93
|
+
thetas3n = param_values[4 * depth :].reshape(n, 3)
|
94
|
+
|
95
|
+
init_layer2q_matrices(thetas=thetas4d, dst=self._c_gates)
|
96
|
+
init_layer2q_deriv_matrices(thetas=thetas4d, dst=self._c_dervs)
|
97
|
+
init_layer1q_matrices(thetas=thetas3n, dst=self._f_gates)
|
98
|
+
init_layer1q_deriv_matrices(thetas=thetas3n, dst=self._f_dervs)
|
99
|
+
|
100
|
+
self._init_layers()
|
101
|
+
self._calc_ucf_fuc()
|
102
|
+
objective_value = self._calc_objective_function()
|
103
|
+
return objective_value
|
104
|
+
|
105
|
+
def gradient(self, param_values: np.ndarray) -> np.ndarray:
|
106
|
+
"""
|
107
|
+
Computes the gradient of objective function.
|
108
|
+
See description of the base class method.
|
109
|
+
"""
|
110
|
+
|
111
|
+
# If thetas are the same as used for objective value calculation
|
112
|
+
# before calling this function, then we re-use the computations,
|
113
|
+
# otherwise we have to re-compute the objective.
|
114
|
+
tol = math.sqrt(np.finfo(float).eps)
|
115
|
+
if not np.allclose(param_values, self._circ_thetas, atol=tol, rtol=tol):
|
116
|
+
self.objective(param_values)
|
117
|
+
warnings.warn("gradient is computed before the objective")
|
118
|
+
|
119
|
+
grad = np.full((param_values.size,), fill_value=0, dtype=np.float64)
|
120
|
+
grad4d = grad[: 4 * self.num_cnots].reshape(self.num_cnots, 4)
|
121
|
+
grad3n = grad[4 * self.num_cnots :].reshape(self._num_qubits, 3)
|
122
|
+
self._calc_gradient4d(grad4d)
|
123
|
+
self._calc_gradient3n(grad3n)
|
124
|
+
return grad
|
125
|
+
|
126
|
+
def _init_layers(self):
|
127
|
+
"""
|
128
|
+
Initializes C-layers and F-layers by corresponding gate matrices.
|
129
|
+
"""
|
130
|
+
c_gates = self._c_gates
|
131
|
+
c_layers = self._c_layers
|
132
|
+
for q in range(self.num_cnots):
|
133
|
+
c_layers[q].set_from_matrix(mat=c_gates[q])
|
134
|
+
|
135
|
+
f_gates = self._f_gates
|
136
|
+
f_layers = self._f_layers
|
137
|
+
for q in range(self._num_qubits):
|
138
|
+
f_layers[q].set_from_matrix(mat=f_gates[q])
|
139
|
+
|
140
|
+
def _calc_ucf_fuc(self):
|
141
|
+
"""
|
142
|
+
Computes matrices ``ucf_mat`` and ``fuc_mat``. Both remain non-finalized.
|
143
|
+
"""
|
144
|
+
ucf_mat = self._ucf_mat
|
145
|
+
fuc_mat = self._fuc_mat
|
146
|
+
tmp1 = self._tmp1
|
147
|
+
c_layers = self._c_layers
|
148
|
+
f_layers = self._f_layers
|
149
|
+
depth, n = self.num_cnots, self._num_qubits
|
150
|
+
|
151
|
+
# tmp1 = U^dagger.
|
152
|
+
np.conj(self.target_matrix.T, out=tmp1)
|
153
|
+
|
154
|
+
# ucf_mat = fuc_mat = U^dagger @ C = U^dagger @ C_{depth-1} @ ... @ C_{0}.
|
155
|
+
self._ucf_mat.set_matrix(tmp1)
|
156
|
+
for q in range(depth - 1, -1, -1):
|
157
|
+
ucf_mat.mul_right_q2(c_layers[q], temp_mat=tmp1, dagger=False)
|
158
|
+
fuc_mat.set_matrix(ucf_mat.finalize(temp_mat=tmp1))
|
159
|
+
|
160
|
+
# fuc_mat = F @ U^dagger @ C = F_{n-1} @ ... @ F_{0} @ U^dagger @ C.
|
161
|
+
for q in range(n):
|
162
|
+
fuc_mat.mul_left_q1(f_layers[q], temp_mat=tmp1)
|
163
|
+
|
164
|
+
# ucf_mat = U^dagger @ C @ F = U^dagger @ C @ F_{n-1} @ ... @ F_{0}.
|
165
|
+
for q in range(n - 1, -1, -1):
|
166
|
+
ucf_mat.mul_right_q1(f_layers[q], temp_mat=tmp1, dagger=False)
|
167
|
+
|
168
|
+
def _calc_objective_function(self) -> float:
|
169
|
+
"""
|
170
|
+
Computes the value of objective function.
|
171
|
+
"""
|
172
|
+
ucf = self._ucf_mat.finalize(temp_mat=self._tmp1)
|
173
|
+
trace_ucf = np.trace(ucf)
|
174
|
+
fobj = abs((2**self._num_qubits) - float(np.real(trace_ucf)))
|
175
|
+
|
176
|
+
return fobj
|
177
|
+
|
178
|
+
def _calc_gradient4d(self, grad4d: np.ndarray):
|
179
|
+
"""
|
180
|
+
Calculates a part gradient contributed by 2-qubit gates.
|
181
|
+
"""
|
182
|
+
fuc = self._fuc_mat
|
183
|
+
tmp1, tmp2 = self._tmp1, self._tmp2
|
184
|
+
c_gates = self._c_gates
|
185
|
+
c_dervs = self._c_dervs
|
186
|
+
c_layers = self._c_layers
|
187
|
+
for q in range(self.num_cnots):
|
188
|
+
# fuc[q] <-- C[q-1] @ fuc[q-1] @ C[q].conj.T. Note, c_layers[q] has
|
189
|
+
# been initialized in _init_layers(), however, c_layers[q-1] was
|
190
|
+
# reused on the previous step, see below, so we need to restore it.
|
191
|
+
if q > 0:
|
192
|
+
c_layers[q - 1].set_from_matrix(mat=c_gates[q - 1])
|
193
|
+
fuc.mul_left_q2(c_layers[q - 1], temp_mat=tmp1)
|
194
|
+
fuc.mul_right_q2(c_layers[q], temp_mat=tmp1, dagger=True)
|
195
|
+
fuc.finalize(temp_mat=tmp1)
|
196
|
+
# Compute gradient components. We reuse c_layers[q] several times.
|
197
|
+
for i in range(4):
|
198
|
+
c_layers[q].set_from_matrix(mat=c_dervs[q, i])
|
199
|
+
grad4d[q, i] = (-1) * np.real(
|
200
|
+
fuc.product_q2(layer=c_layers[q], tmp1=tmp1, tmp2=tmp2)
|
201
|
+
)
|
202
|
+
|
203
|
+
def _calc_gradient3n(self, grad3n: np.ndarray):
|
204
|
+
"""
|
205
|
+
Calculates a part gradient contributed by 1-qubit gates.
|
206
|
+
"""
|
207
|
+
ucf = self._ucf_mat
|
208
|
+
tmp1, tmp2 = self._tmp1, self._tmp2
|
209
|
+
f_gates = self._f_gates
|
210
|
+
f_dervs = self._f_dervs
|
211
|
+
f_layers = self._f_layers
|
212
|
+
for q in range(self._num_qubits):
|
213
|
+
# ucf[q] <-- F[q-1] @ ucf[q-1] @ F[q].conj.T. Note, f_layers[q] has
|
214
|
+
# been initialized in _init_layers(), however, f_layers[q-1] was
|
215
|
+
# reused on the previous step, see below, so we need to restore it.
|
216
|
+
if q > 0:
|
217
|
+
f_layers[q - 1].set_from_matrix(mat=f_gates[q - 1])
|
218
|
+
ucf.mul_left_q1(f_layers[q - 1], temp_mat=tmp1)
|
219
|
+
ucf.mul_right_q1(f_layers[q], temp_mat=tmp1, dagger=True)
|
220
|
+
ucf.finalize(temp_mat=tmp1)
|
221
|
+
# Compute gradient components. We reuse f_layers[q] several times.
|
222
|
+
for i in range(3):
|
223
|
+
f_layers[q].set_from_matrix(mat=f_dervs[q, i])
|
224
|
+
grad3n[q, i] = (-1) * np.real(
|
225
|
+
ucf.product_q1(layer=f_layers[q], tmp1=tmp1, tmp2=tmp2)
|
226
|
+
)
|