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,202 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2020.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Permutation circuit (the old way to specify permutations, which is required for
|
14
|
+
backward compatibility and which will be eventually deprecated) and the permutation
|
15
|
+
gate (the new way to specify permutations, allowing a variety of synthesis algorithms).
|
16
|
+
"""
|
17
|
+
|
18
|
+
from __future__ import annotations
|
19
|
+
|
20
|
+
import numpy as np
|
21
|
+
|
22
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
23
|
+
from qiskit.circuit.quantumcircuit import Gate
|
24
|
+
from qiskit.circuit.exceptions import CircuitError
|
25
|
+
from qiskit.utils.deprecation import deprecate_func
|
26
|
+
|
27
|
+
|
28
|
+
class Permutation(QuantumCircuit):
|
29
|
+
"""An n_qubit circuit that permutes qubits."""
|
30
|
+
|
31
|
+
@deprecate_func(
|
32
|
+
since="2.1",
|
33
|
+
additional_msg="Use PermutationGate instead.",
|
34
|
+
removal_timeline="in Qiskit 3.0",
|
35
|
+
)
|
36
|
+
def __init__(
|
37
|
+
self,
|
38
|
+
num_qubits: int,
|
39
|
+
pattern: list[int] | np.ndarray | None = None,
|
40
|
+
seed: int | None = None,
|
41
|
+
) -> None:
|
42
|
+
"""Return an n_qubit permutation circuit implemented using SWAPs.
|
43
|
+
|
44
|
+
Args:
|
45
|
+
num_qubits: circuit width.
|
46
|
+
pattern: permutation pattern, describing which qubits occupy the
|
47
|
+
positions 0, 1, 2, etc. after applying the permutation, that
|
48
|
+
is ``pattern[k] = m`` when the permutation maps qubit ``m``
|
49
|
+
to position ``k``. As an example, the pattern ``[2, 4, 3, 0, 1]``
|
50
|
+
means that qubit ``2`` goes to position ``0``, qubit ``4``
|
51
|
+
goes to the position ``1``, etc. The pattern can also be ``None``,
|
52
|
+
in which case a random permutation over ``num_qubits`` is
|
53
|
+
created.
|
54
|
+
seed: random seed in case a random permutation is requested.
|
55
|
+
|
56
|
+
Raises:
|
57
|
+
CircuitError: if permutation pattern is malformed.
|
58
|
+
|
59
|
+
Reference Circuit:
|
60
|
+
.. plot::
|
61
|
+
:alt: Diagram illustrating the previously described circuit.
|
62
|
+
|
63
|
+
from qiskit.circuit.library import Permutation
|
64
|
+
A = [2,4,3,0,1]
|
65
|
+
circuit = Permutation(5, A)
|
66
|
+
circuit.draw('mpl')
|
67
|
+
|
68
|
+
Expanded Circuit:
|
69
|
+
.. plot::
|
70
|
+
:alt: Diagram illustrating the previously described circuit.
|
71
|
+
|
72
|
+
from qiskit.circuit.library import Permutation
|
73
|
+
from qiskit.visualization.library import _generate_circuit_library_visualization
|
74
|
+
A = [2,4,3,0,1]
|
75
|
+
circuit = Permutation(5, A)
|
76
|
+
_generate_circuit_library_visualization(circuit.decompose())
|
77
|
+
"""
|
78
|
+
if pattern is not None:
|
79
|
+
if sorted(pattern) != list(range(num_qubits)):
|
80
|
+
raise CircuitError(
|
81
|
+
"Permutation pattern must be some ordering of 0..num_qubits-1 in a list."
|
82
|
+
)
|
83
|
+
pattern = np.array(pattern)
|
84
|
+
else:
|
85
|
+
rng = np.random.default_rng(seed)
|
86
|
+
pattern = np.arange(num_qubits)
|
87
|
+
rng.shuffle(pattern)
|
88
|
+
|
89
|
+
name = "permutation_" + np.array_str(pattern).replace(" ", ",")
|
90
|
+
|
91
|
+
super().__init__(num_qubits, name=name)
|
92
|
+
|
93
|
+
# pylint: disable=cyclic-import
|
94
|
+
from qiskit.synthesis.permutation import synth_permutation_basic
|
95
|
+
|
96
|
+
circuit = synth_permutation_basic(pattern)
|
97
|
+
circuit.name = name
|
98
|
+
|
99
|
+
all_qubits = self.qubits
|
100
|
+
self.append(circuit.to_gate(), all_qubits)
|
101
|
+
|
102
|
+
|
103
|
+
class PermutationGate(Gate):
|
104
|
+
"""A gate that permutes qubits."""
|
105
|
+
|
106
|
+
def __init__(
|
107
|
+
self,
|
108
|
+
pattern: list[int],
|
109
|
+
) -> None:
|
110
|
+
"""Return a permutation gate.
|
111
|
+
|
112
|
+
Args:
|
113
|
+
pattern: permutation pattern, describing which qubits occupy the
|
114
|
+
positions 0, 1, 2, etc. after applying the permutation, that
|
115
|
+
is ``pattern[k] = m`` when the permutation maps qubit ``m``
|
116
|
+
to position ``k``. As an example, the pattern ``[2, 4, 3, 0, 1]``
|
117
|
+
means that qubit ``2`` goes to position ``0``, qubit ``4``
|
118
|
+
goes to the position ``1``, etc.
|
119
|
+
|
120
|
+
Raises:
|
121
|
+
CircuitError: if permutation pattern is malformed.
|
122
|
+
|
123
|
+
Reference Circuit:
|
124
|
+
.. plot::
|
125
|
+
:alt: Diagram illustrating the previously described circuit.
|
126
|
+
|
127
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
128
|
+
from qiskit.circuit.library import PermutationGate
|
129
|
+
A = [2, 4, 3, 0, 1]
|
130
|
+
permutation = PermutationGate(A)
|
131
|
+
circuit = QuantumCircuit(5)
|
132
|
+
circuit.append(permutation, [0, 1, 2, 3, 4])
|
133
|
+
circuit.draw("mpl")
|
134
|
+
|
135
|
+
Expanded Circuit:
|
136
|
+
.. plot::
|
137
|
+
:alt: Diagram illustrating the previously described circuit.
|
138
|
+
|
139
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
140
|
+
from qiskit.circuit.library import PermutationGate
|
141
|
+
from qiskit.visualization.library import _generate_circuit_library_visualization
|
142
|
+
A = [2, 4, 3, 0, 1]
|
143
|
+
permutation = PermutationGate(A)
|
144
|
+
circuit = QuantumCircuit(5)
|
145
|
+
circuit.append(permutation, [0, 1, 2, 3, 4])
|
146
|
+
|
147
|
+
_generate_circuit_library_visualization(circuit.decompose())
|
148
|
+
"""
|
149
|
+
num_qubits = len(pattern)
|
150
|
+
if sorted(pattern) != list(range(num_qubits)):
|
151
|
+
raise CircuitError(
|
152
|
+
"Permutation pattern must be some ordering of 0..num_qubits-1 in a list."
|
153
|
+
)
|
154
|
+
pattern = np.array(pattern, dtype=np.int32)
|
155
|
+
|
156
|
+
super().__init__(name="permutation", num_qubits=num_qubits, params=[pattern])
|
157
|
+
|
158
|
+
def __array__(self, dtype=None, copy=None):
|
159
|
+
"""Return a numpy.array for the Permutation gate."""
|
160
|
+
if copy is False:
|
161
|
+
raise ValueError("unable to avoid copy while creating an array as requested")
|
162
|
+
|
163
|
+
nq = len(self.pattern)
|
164
|
+
mat = np.zeros((2**nq, 2**nq), dtype=dtype)
|
165
|
+
|
166
|
+
for r in range(2**nq):
|
167
|
+
# convert row to bitstring, reverse, apply permutation pattern, reverse again,
|
168
|
+
# and convert to row
|
169
|
+
bit = bin(r)[2:].zfill(nq)[::-1]
|
170
|
+
permuted_bit = "".join([bit[j] for j in self.pattern])
|
171
|
+
pr = int(permuted_bit[::-1], 2)
|
172
|
+
mat[pr, r] = 1
|
173
|
+
|
174
|
+
return mat
|
175
|
+
|
176
|
+
def validate_parameter(self, parameter):
|
177
|
+
"""Parameter validation."""
|
178
|
+
return parameter
|
179
|
+
|
180
|
+
@property
|
181
|
+
def pattern(self) -> np.ndarray[bool]:
|
182
|
+
"""Returns the permutation pattern defining this permutation."""
|
183
|
+
return self.params[0]
|
184
|
+
|
185
|
+
def inverse(self, annotated: bool = False) -> PermutationGate:
|
186
|
+
"""Returns the inverse of the permutation."""
|
187
|
+
|
188
|
+
# pylint: disable=cyclic-import
|
189
|
+
from qiskit.synthesis.permutation.permutation_utils import _inverse_pattern
|
190
|
+
|
191
|
+
return PermutationGate(pattern=_inverse_pattern(self.pattern))
|
192
|
+
|
193
|
+
def _qasm_decomposition(self):
|
194
|
+
# pylint: disable=cyclic-import
|
195
|
+
from qiskit.synthesis.permutation import synth_permutation_basic
|
196
|
+
|
197
|
+
name = f"permutation__{'_'.join(str(n) for n in self.pattern)}_"
|
198
|
+
|
199
|
+
out = synth_permutation_basic(self.pattern)
|
200
|
+
out.name = name
|
201
|
+
|
202
|
+
return out.to_gate()
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2020
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Rotation around an arbitrary axis on the Bloch sphere."""
|
14
|
+
|
15
|
+
import math
|
16
|
+
import numpy
|
17
|
+
from qiskit.circuit.gate import Gate
|
18
|
+
from qiskit.circuit.exceptions import CircuitError
|
19
|
+
|
20
|
+
|
21
|
+
class RVGate(Gate):
|
22
|
+
r"""Rotation around arbitrary rotation axis :math:`\vec{v}` where :math:`\|\vec{v}\|_2` is
|
23
|
+
angle of rotation in radians.
|
24
|
+
|
25
|
+
Can be applied to a :class:`~qiskit.circuit.QuantumCircuit`
|
26
|
+
with the :meth:`~qiskit.circuit.QuantumCircuit.rv` method.
|
27
|
+
|
28
|
+
**Circuit symbol:**
|
29
|
+
|
30
|
+
.. code-block:: text
|
31
|
+
|
32
|
+
┌─────────────────┐
|
33
|
+
q_0: ┤ RV(v_x,v_y,v_z) ├
|
34
|
+
└─────────────────┘
|
35
|
+
|
36
|
+
**Matrix Representation:**
|
37
|
+
|
38
|
+
.. math::
|
39
|
+
|
40
|
+
\newcommand{\rotationangle}{\frac{\|\vec{v}\|_2}{2}}
|
41
|
+
R(\vec{v}) = e^{-i \vec{v}\cdot\vec{\sigma} / 2} =
|
42
|
+
\begin{pmatrix}
|
43
|
+
\cos\left(\rotationangle\right)
|
44
|
+
-i \frac{v_z}{\|\vec{v}\|_2} \sin\left(\rotationangle\right)
|
45
|
+
& -(i \frac{v_x}{\|\vec{v}\|_2}
|
46
|
+
+ \frac{v_y}{\|\vec{v}\|_2}) \sin\left(\rotationangle\right) \\
|
47
|
+
-(i \frac{v_x}{\|\vec{v}\|_2}
|
48
|
+
- \frac{v_y}{\|\vec{v}\|_2}) \sin\left(\rotationangle\right)
|
49
|
+
& \cos\left(\rotationangle\right)
|
50
|
+
+ i \frac{v_z}{\|\vec{v}\|_2} \sin\left(\rotationangle\right)
|
51
|
+
\end{pmatrix}
|
52
|
+
"""
|
53
|
+
|
54
|
+
def __init__(self, v_x: float, v_y: float, v_z: float, basis: str = "U"):
|
55
|
+
"""
|
56
|
+
Args:
|
57
|
+
v_x: x-component
|
58
|
+
v_y: y-component
|
59
|
+
v_z: z-component
|
60
|
+
basis: basis (see
|
61
|
+
:class:`~qiskit.synthesis.one_qubit.one_qubit_decompose.OneQubitEulerDecomposer`)
|
62
|
+
"""
|
63
|
+
# pylint: disable=cyclic-import
|
64
|
+
from qiskit.synthesis.one_qubit.one_qubit_decompose import OneQubitEulerDecomposer
|
65
|
+
|
66
|
+
super().__init__("rv", 1, [v_x, v_y, v_z])
|
67
|
+
self._decomposer = OneQubitEulerDecomposer(basis=basis)
|
68
|
+
|
69
|
+
def _define(self):
|
70
|
+
try:
|
71
|
+
self.definition = self._decomposer(self.to_matrix())
|
72
|
+
except TypeError as ex:
|
73
|
+
raise CircuitError(
|
74
|
+
f"The {self.name} gate cannot be decomposed with unbound parameters"
|
75
|
+
) from ex
|
76
|
+
|
77
|
+
def inverse(self, annotated: bool = False):
|
78
|
+
"""Invert this gate."""
|
79
|
+
vx, vy, vz = self.params
|
80
|
+
return RVGate(-vx, -vy, -vz)
|
81
|
+
|
82
|
+
def to_matrix(self) -> numpy.ndarray:
|
83
|
+
"""Return a numpy.array for the R(v) gate."""
|
84
|
+
v = numpy.asarray(self.params, dtype=float)
|
85
|
+
angle = math.sqrt(v.dot(v))
|
86
|
+
if angle == 0:
|
87
|
+
return numpy.array([[1, 0], [0, 1]])
|
88
|
+
nx, ny, nz = v / angle
|
89
|
+
sin = math.sin(angle / 2)
|
90
|
+
cos = math.cos(angle / 2)
|
91
|
+
return numpy.array(
|
92
|
+
[
|
93
|
+
[cos - 1j * nz * sin, (-ny - 1j * nx) * sin],
|
94
|
+
[(ny - 1j * nx) * sin, cos + 1j * nz * sin],
|
95
|
+
]
|
96
|
+
)
|
@@ -0,0 +1,303 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2020, 2024.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
# The structure of the code is based on Emanuel Malvetti's semester thesis at
|
14
|
+
# ETH in 2018, which was supervised by Raban Iten and Prof. Renato Renner.
|
15
|
+
|
16
|
+
# pylint: disable=invalid-name
|
17
|
+
# pylint: disable=missing-param-doc
|
18
|
+
# pylint: disable=missing-type-doc
|
19
|
+
|
20
|
+
"""Uniformly controlled gates (also called multiplexed gates)."""
|
21
|
+
|
22
|
+
from __future__ import annotations
|
23
|
+
|
24
|
+
import math
|
25
|
+
|
26
|
+
import numpy as np
|
27
|
+
|
28
|
+
from qiskit.circuit.gate import Gate
|
29
|
+
from qiskit.circuit.library.standard_gates.h import HGate
|
30
|
+
from qiskit.quantum_info.operators.predicates import is_unitary_matrix
|
31
|
+
from qiskit.circuit import QuantumRegister
|
32
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
33
|
+
from qiskit.circuit.exceptions import CircuitError
|
34
|
+
from qiskit.exceptions import QiskitError
|
35
|
+
from qiskit._accelerate import uc_gate
|
36
|
+
|
37
|
+
from .diagonal import DiagonalGate
|
38
|
+
|
39
|
+
_EPS = 1e-10 # global variable used to chop very small numbers to zero
|
40
|
+
|
41
|
+
|
42
|
+
class UCGate(Gate):
|
43
|
+
r"""Uniformly controlled gate (also called multiplexed gate).
|
44
|
+
|
45
|
+
These gates can have several control qubits and a single target qubit.
|
46
|
+
If the k control qubits are in the state :math:`|i\rangle` (in the computational basis),
|
47
|
+
a single-qubit unitary :math:`U_i` is applied to the target qubit.
|
48
|
+
|
49
|
+
This gate is represented by a block-diagonal matrix, where each block is a
|
50
|
+
:math:`2\times 2` unitary, that is
|
51
|
+
|
52
|
+
.. math::
|
53
|
+
|
54
|
+
\begin{pmatrix}
|
55
|
+
U_0 & 0 & \cdots & 0 \\
|
56
|
+
0 & U_1 & \cdots & 0 \\
|
57
|
+
\vdots & & \ddots & \vdots \\
|
58
|
+
0 & 0 & \cdots & U_{2^{k-1}}
|
59
|
+
\end{pmatrix}.
|
60
|
+
|
61
|
+
The decomposition is based on Ref. [1].
|
62
|
+
|
63
|
+
Unnecessary controls and repeated operators can be removed as described in Ref [2].
|
64
|
+
|
65
|
+
**References:**
|
66
|
+
|
67
|
+
[1] Bergholm et al., Quantum circuits with uniformly controlled one-qubit gates (2005).
|
68
|
+
`Phys. Rev. A 71, 052330 <https://journals.aps.org/pra/abstract/10.1103/PhysRevA.71.052330>`__.
|
69
|
+
|
70
|
+
[2] de Carvalho et al., Quantum multiplexer simplification for state preparation (2024).
|
71
|
+
`arXiv:2409.05618 <https://arxiv.org/abs/2409.05618>`__.
|
72
|
+
|
73
|
+
"""
|
74
|
+
|
75
|
+
def __init__(
|
76
|
+
self, gate_list: list[np.ndarray], up_to_diagonal: bool = False, mux_simp: bool = True
|
77
|
+
):
|
78
|
+
r"""
|
79
|
+
Args:
|
80
|
+
gate_list: List of two qubit unitaries :math:`[U_0, ..., U_{2^{k-1}}]`, where each
|
81
|
+
single-qubit unitary :math:`U_i` is given as a :math:`2 \times 2` numpy array.
|
82
|
+
up_to_diagonal: Determines if the gate is implemented up to a diagonal.
|
83
|
+
or if it is decomposed completely (default: False).
|
84
|
+
If the ``UCGate`` :math:`U` is decomposed up to a diagonal :math:`D`, this means
|
85
|
+
that the circuit implements a unitary :math:`U'` such that :math:`D U' = U`.
|
86
|
+
mux_simp: Determines whether the search for repetitions is conducted (default: True).
|
87
|
+
The intention is to perform a possible simplification in the number of controls
|
88
|
+
and operators.
|
89
|
+
|
90
|
+
Raises:
|
91
|
+
QiskitError: in case of bad input to the constructor
|
92
|
+
"""
|
93
|
+
# check input format
|
94
|
+
if not isinstance(gate_list, list):
|
95
|
+
raise QiskitError("The single-qubit unitaries are not provided in a list.")
|
96
|
+
for gate in gate_list:
|
97
|
+
if not gate.shape == (2, 2):
|
98
|
+
raise QiskitError("The dimension of a controlled gate is not equal to (2,2).")
|
99
|
+
if not gate_list:
|
100
|
+
raise QiskitError("The gate list cannot be empty.")
|
101
|
+
|
102
|
+
# Check if number of gates in gate_list is a positive power of two
|
103
|
+
num_contr = math.log2(len(gate_list))
|
104
|
+
if num_contr < 0 or not num_contr.is_integer():
|
105
|
+
raise QiskitError(
|
106
|
+
"The number of controlled single-qubit gates is not a non-negative power of 2."
|
107
|
+
)
|
108
|
+
|
109
|
+
# Check if the single-qubit gates are unitaries
|
110
|
+
for gate in gate_list:
|
111
|
+
if not is_unitary_matrix(gate, _EPS):
|
112
|
+
raise QiskitError("A controlled gate is not unitary.")
|
113
|
+
|
114
|
+
new_controls = set()
|
115
|
+
if mux_simp:
|
116
|
+
new_controls, gate_list = self._simplify(gate_list, num_contr)
|
117
|
+
self.simp_contr = (mux_simp, new_controls)
|
118
|
+
|
119
|
+
# Create new gate.
|
120
|
+
super().__init__("multiplexer", int(num_contr) + 1, gate_list)
|
121
|
+
self.up_to_diagonal = up_to_diagonal
|
122
|
+
|
123
|
+
def _simplify(self, gate_list, num_contr):
|
124
|
+
"""https://arxiv.org/abs/2409.05618"""
|
125
|
+
|
126
|
+
c = set()
|
127
|
+
nc = set()
|
128
|
+
mux_copy = gate_list.copy()
|
129
|
+
|
130
|
+
for i in range(int(num_contr)):
|
131
|
+
c.add(i + 1)
|
132
|
+
|
133
|
+
if len(gate_list) > 1:
|
134
|
+
nc, mux_copy = self._repetition_search(gate_list, num_contr, mux_copy)
|
135
|
+
|
136
|
+
new_controls = {x for x in c if x not in nc}
|
137
|
+
new_mux = [gate for gate in mux_copy if gate is not None]
|
138
|
+
return new_controls, new_mux
|
139
|
+
|
140
|
+
def _repetition_search(self, mux, level, mux_copy):
|
141
|
+
nc = set()
|
142
|
+
d = 1
|
143
|
+
while d <= len(mux) / 2:
|
144
|
+
disentanglement = False
|
145
|
+
if np.allclose(mux[d], mux[0]):
|
146
|
+
mux_org = mux_copy.copy()
|
147
|
+
repetitions = len(mux) / (2 * d)
|
148
|
+
p = 0
|
149
|
+
while repetitions > 0:
|
150
|
+
repetitions -= 1
|
151
|
+
valid, mux_copy = self._repetition_verify(p, d, mux, mux_copy)
|
152
|
+
p = p + 2 * d
|
153
|
+
if not valid:
|
154
|
+
mux_copy = mux_org
|
155
|
+
break
|
156
|
+
if repetitions == 0:
|
157
|
+
disentanglement = True
|
158
|
+
|
159
|
+
if disentanglement:
|
160
|
+
removed_contr = level - math.log2(d)
|
161
|
+
nc.add(removed_contr)
|
162
|
+
d = 2 * d
|
163
|
+
return nc, mux_copy
|
164
|
+
|
165
|
+
def _repetition_verify(self, base, d, mux, mux_copy):
|
166
|
+
i = 0
|
167
|
+
next_base = base + d
|
168
|
+
while i < d:
|
169
|
+
if not np.allclose(mux[base], mux[next_base]):
|
170
|
+
return False, mux_copy
|
171
|
+
mux_copy[next_base] = None
|
172
|
+
base, next_base, i = base + 1, next_base + 1, i + 1
|
173
|
+
return True, mux_copy
|
174
|
+
|
175
|
+
def inverse(self, annotated: bool = False) -> Gate:
|
176
|
+
"""Return the inverse.
|
177
|
+
|
178
|
+
This does not re-compute the decomposition for the multiplexer with the inverse of the
|
179
|
+
gates but simply inverts the existing decomposition.
|
180
|
+
"""
|
181
|
+
if not annotated:
|
182
|
+
inverse_gate = Gate(
|
183
|
+
name=self.name + "_dg", num_qubits=self.num_qubits, params=[]
|
184
|
+
) # removing the params because arrays are deprecated
|
185
|
+
|
186
|
+
definition = QuantumCircuit(*self.definition.qregs)
|
187
|
+
for inst in reversed(self._definition):
|
188
|
+
definition._append(
|
189
|
+
inst.replace(operation=inst.operation.inverse(annotated=annotated))
|
190
|
+
)
|
191
|
+
|
192
|
+
definition.global_phase = -self.definition.global_phase
|
193
|
+
|
194
|
+
inverse_gate.definition = definition
|
195
|
+
else:
|
196
|
+
inverse_gate = super().inverse(annotated=annotated)
|
197
|
+
return inverse_gate
|
198
|
+
|
199
|
+
def _get_diagonal(self):
|
200
|
+
# Important: for a control list q_controls = [q[0],...,q_[k-1]] the
|
201
|
+
# diagonal gate is provided in the computational basis of the qubits
|
202
|
+
# q[k-1],...,q[0],q_target, decreasingly ordered with respect to the
|
203
|
+
# significance of the qubit in the computational basis
|
204
|
+
_, diag = self._dec_ucg()
|
205
|
+
if self.simp_contr[1]:
|
206
|
+
q_controls = [self.num_qubits - i for i in self.simp_contr[1]]
|
207
|
+
q_controls.reverse()
|
208
|
+
for i in range(self.num_qubits):
|
209
|
+
if i not in [0] + q_controls:
|
210
|
+
d = 2**i
|
211
|
+
new_diag = []
|
212
|
+
n = len(diag)
|
213
|
+
for j in range(n):
|
214
|
+
new_diag.append(diag[j])
|
215
|
+
if (j + 1) % d == 0:
|
216
|
+
new_diag.extend(diag[j + 1 - d : j + 1])
|
217
|
+
diag = np.array(new_diag)
|
218
|
+
return diag
|
219
|
+
|
220
|
+
def _define(self):
|
221
|
+
ucg_circuit, _ = self._dec_ucg()
|
222
|
+
self.definition = ucg_circuit
|
223
|
+
|
224
|
+
def _dec_ucg(self):
|
225
|
+
"""
|
226
|
+
Call to create a circuit that implements the uniformly controlled gate. If
|
227
|
+
up_to_diagonal=True, the circuit implements the gate up to a diagonal gate and
|
228
|
+
the diagonal gate is also returned.
|
229
|
+
"""
|
230
|
+
diag = np.ones(2**self.num_qubits).tolist()
|
231
|
+
q = QuantumRegister(self.num_qubits, "q")
|
232
|
+
q_target = q[0]
|
233
|
+
mux_simplify = self.simp_contr[0]
|
234
|
+
|
235
|
+
if mux_simplify:
|
236
|
+
q_controls = [q[self.num_qubits - i] for i in self.simp_contr[1]]
|
237
|
+
q_controls.reverse()
|
238
|
+
else:
|
239
|
+
q_controls = q[1:]
|
240
|
+
|
241
|
+
circuit = QuantumCircuit(q, name="uc")
|
242
|
+
# If there is no control, we use the ZYZ decomposition
|
243
|
+
if not q_controls:
|
244
|
+
circuit.unitary(self.params[0], q[0])
|
245
|
+
return circuit, diag
|
246
|
+
# If there is at least one control, first,
|
247
|
+
# we find the single qubit gates of the decomposition.
|
248
|
+
(single_qubit_gates, diag) = self._dec_ucg_help()
|
249
|
+
# Now, it is easy to place the C-NOT gates and some Hadamards and Rz(pi/2) gates
|
250
|
+
# (which are absorbed into the single-qubit unitaries) to get back the full decomposition.
|
251
|
+
for i, gate in enumerate(single_qubit_gates):
|
252
|
+
# Absorb Hadamards and Rz(pi/2) gates
|
253
|
+
if i == 0:
|
254
|
+
squ = HGate().to_matrix().dot(gate)
|
255
|
+
elif i == len(single_qubit_gates) - 1:
|
256
|
+
squ = gate.dot(UCGate._rz(np.pi / 2)).dot(HGate().to_matrix())
|
257
|
+
else:
|
258
|
+
squ = (
|
259
|
+
HGate()
|
260
|
+
.to_matrix()
|
261
|
+
.dot(gate.dot(UCGate._rz(np.pi / 2)))
|
262
|
+
.dot(HGate().to_matrix())
|
263
|
+
)
|
264
|
+
# Add single-qubit gate
|
265
|
+
circuit.unitary(squ, [q_target])
|
266
|
+
# The number of the control qubit is given by the number of zeros at the end
|
267
|
+
# of the binary representation of (i+1)
|
268
|
+
binary_rep = np.binary_repr(i + 1)
|
269
|
+
num_trailing_zeros = len(binary_rep) - len(binary_rep.rstrip("0"))
|
270
|
+
q_contr_index = num_trailing_zeros
|
271
|
+
# Add C-NOT gate
|
272
|
+
if not i == len(single_qubit_gates) - 1:
|
273
|
+
circuit.cx(q_controls[q_contr_index], q_target)
|
274
|
+
circuit.global_phase -= 0.25 * np.pi
|
275
|
+
if not self.up_to_diagonal:
|
276
|
+
# Important: the diagonal gate is given in the computational basis of the qubits
|
277
|
+
# q[k-1],...,q[0],q_target (ordered with decreasing significance),
|
278
|
+
# where q[i] are the control qubits and t denotes the target qubit.
|
279
|
+
diagonal = DiagonalGate(diag)
|
280
|
+
|
281
|
+
circuit.append(diagonal, [q_target] + q_controls)
|
282
|
+
return circuit, diag
|
283
|
+
|
284
|
+
def _dec_ucg_help(self):
|
285
|
+
"""
|
286
|
+
This method finds the single qubit gate arising in the decomposition of UCGates given in
|
287
|
+
https://arxiv.org/pdf/quant-ph/0410066.pdf.
|
288
|
+
"""
|
289
|
+
single_qubit_gates = [np.asarray(gate, dtype=complex, order="f") for gate in self.params]
|
290
|
+
if self.simp_contr[0]:
|
291
|
+
return uc_gate.dec_ucg_help(single_qubit_gates, len(self.simp_contr[1]) + 1)
|
292
|
+
return uc_gate.dec_ucg_help(single_qubit_gates, self.num_qubits)
|
293
|
+
|
294
|
+
@staticmethod
|
295
|
+
def _rz(alpha):
|
296
|
+
return np.array([[np.exp(1j * alpha / 2), 0], [0, np.exp(-1j * alpha / 2)]])
|
297
|
+
|
298
|
+
def validate_parameter(self, parameter):
|
299
|
+
"""Uniformly controlled gate parameter has to be an ndarray."""
|
300
|
+
if isinstance(parameter, np.ndarray):
|
301
|
+
return parameter
|
302
|
+
else:
|
303
|
+
raise CircuitError(f"invalid param type {type(parameter)} in gate {self.name}")
|