qiskit 2.0.3__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 +141 -0
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +73 -0
- qiskit/circuit/__init__.py +1343 -0
- qiskit/circuit/_add_control.py +312 -0
- qiskit/circuit/_classical_resource_map.py +150 -0
- qiskit/circuit/_standard_gates_commutations.py +3849 -0
- qiskit/circuit/_utils.py +167 -0
- qiskit/circuit/annotated_operation.py +279 -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 +498 -0
- qiskit/circuit/classical/expr/visitors.py +375 -0
- qiskit/circuit/classical/types/__init__.py +113 -0
- qiskit/circuit/classical/types/ordering.py +229 -0
- qiskit/circuit/classical/types/types.py +153 -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 +163 -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 +157 -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 +502 -0
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +387 -0
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +493 -0
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
- qiskit/circuit/library/arithmetic/quadratic_form.py +364 -0
- qiskit/circuit/library/arithmetic/weighted_adder.py +409 -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 +316 -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 +159 -0
- qiskit/circuit/library/generalized_gates/gms.py +175 -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 +198 -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 +217 -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 +303 -0
- qiskit/circuit/library/n_local/n_local.py +1477 -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 +201 -0
- qiskit/circuit/library/phase_estimation.py +177 -0
- qiskit/circuit/library/phase_oracle.py +239 -0
- qiskit/circuit/library/quantum_volume.py +180 -0
- qiskit/circuit/library/standard_gates/__init__.py +141 -0
- qiskit/circuit/library/standard_gates/dcx.py +77 -0
- qiskit/circuit/library/standard_gates/ecr.py +129 -0
- qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
- qiskit/circuit/library/standard_gates/global_phase.py +84 -0
- qiskit/circuit/library/standard_gates/h.py +253 -0
- qiskit/circuit/library/standard_gates/i.py +76 -0
- qiskit/circuit/library/standard_gates/iswap.py +133 -0
- qiskit/circuit/library/standard_gates/p.py +422 -0
- qiskit/circuit/library/standard_gates/r.py +114 -0
- qiskit/circuit/library/standard_gates/rx.py +293 -0
- qiskit/circuit/library/standard_gates/rxx.py +180 -0
- qiskit/circuit/library/standard_gates/ry.py +286 -0
- qiskit/circuit/library/standard_gates/ryy.py +180 -0
- qiskit/circuit/library/standard_gates/rz.py +307 -0
- qiskit/circuit/library/standard_gates/rzx.py +226 -0
- qiskit/circuit/library/standard_gates/rzz.py +193 -0
- qiskit/circuit/library/standard_gates/s.py +419 -0
- qiskit/circuit/library/standard_gates/swap.py +281 -0
- qiskit/circuit/library/standard_gates/sx.py +310 -0
- qiskit/circuit/library/standard_gates/t.py +178 -0
- qiskit/circuit/library/standard_gates/u.py +395 -0
- qiskit/circuit/library/standard_gates/u1.py +490 -0
- qiskit/circuit/library/standard_gates/u2.py +145 -0
- qiskit/circuit/library/standard_gates/u3.py +428 -0
- qiskit/circuit/library/standard_gates/x.py +1481 -0
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +202 -0
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +236 -0
- qiskit/circuit/library/standard_gates/y.py +257 -0
- qiskit/circuit/library/standard_gates/z.py +338 -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 +179 -0
- qiskit/circuit/parameterexpression.py +703 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +140 -0
- qiskit/circuit/quantumcircuit.py +7540 -0
- qiskit/circuit/quantumcircuitdata.py +136 -0
- qiskit/circuit/random/__init__.py +15 -0
- qiskit/circuit/random/utils.py +366 -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 +193 -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 +55 -0
- qiskit/dagcircuit/collect_blocks.py +407 -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 +188 -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 +175 -0
- qiskit/primitives/containers/estimator_pub.py +222 -0
- qiskit/primitives/containers/object_array.py +94 -0
- qiskit/primitives/containers/observables_array.py +296 -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 +81 -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 +374 -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 +372 -0
- qiskit/qasm3/ast.py +782 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1340 -0
- qiskit/qasm3/printer.py +608 -0
- qiskit/qpy/__init__.py +1965 -0
- qiskit/qpy/binary_io/__init__.py +35 -0
- qiskit/qpy/binary_io/circuits.py +1455 -0
- qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
- qiskit/qpy/binary_io/schedules.py +308 -0
- qiskit/qpy/binary_io/value.py +1165 -0
- qiskit/qpy/common.py +353 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +442 -0
- qiskit/qpy/interface.py +344 -0
- qiskit/qpy/type_keys.py +409 -0
- qiskit/quantum_info/__init__.py +162 -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 +28 -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 +23 -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 +558 -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 +74 -0
- qiskit/result/utils.py +294 -0
- qiskit/synthesis/__init__.py +240 -0
- qiskit/synthesis/arithmetic/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -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/commutator_decompose.py +265 -0
- qiskit/synthesis/discrete_basis/gate_sequence.py +421 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +165 -0
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +240 -0
- qiskit/synthesis/evolution/__init__.py +21 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +120 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +313 -0
- qiskit/synthesis/evolution/qdrift.py +130 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +224 -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 +25 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +359 -0
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -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 +79 -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 +288 -0
- qiskit/transpiler/__init__.py +1345 -0
- qiskit/transpiler/basepasses.py +190 -0
- qiskit/transpiler/coupling.py +500 -0
- qiskit/transpiler/exceptions.py +59 -0
- qiskit/transpiler/instruction_durations.py +281 -0
- qiskit/transpiler/layout.py +740 -0
- qiskit/transpiler/passes/__init__.py +276 -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 +177 -0
- qiskit/transpiler/passes/layout/disjoint_utils.py +219 -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 +506 -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 +256 -0
- qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
- qiskit/transpiler/passes/layout/vf2_utils.py +235 -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 +250 -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_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 +639 -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 +463 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +408 -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 +16 -0
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -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 +20 -0
- qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -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 +1963 -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 +313 -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 +151 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +993 -0
- qiskit/transpiler/preset_passmanagers/common.py +672 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +437 -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 +354 -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 +675 -0
- qiskit/visualization/circuit/circuit_visualization.py +735 -0
- qiskit/visualization/circuit/latex.py +661 -0
- qiskit/visualization/circuit/matplotlib.py +2019 -0
- qiskit/visualization/circuit/qcstyle.py +278 -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_visualization.py +318 -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/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.0.3.dist-info/METADATA +220 -0
- qiskit-2.0.3.dist-info/RECORD +690 -0
- qiskit-2.0.3.dist-info/WHEEL +6 -0
- qiskit-2.0.3.dist-info/entry_points.txt +82 -0
- qiskit-2.0.3.dist-info/licenses/LICENSE.txt +203 -0
- qiskit-2.0.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,288 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2019.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""
|
14
|
+
Decompose a single-qubit unitary via Euler angles.
|
15
|
+
"""
|
16
|
+
from __future__ import annotations
|
17
|
+
from typing import TYPE_CHECKING
|
18
|
+
import numpy as np
|
19
|
+
|
20
|
+
from qiskit._accelerate import euler_one_qubit_decomposer
|
21
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
22
|
+
from qiskit.circuit import Qubit
|
23
|
+
from qiskit.circuit.library.standard_gates import (
|
24
|
+
UGate,
|
25
|
+
PhaseGate,
|
26
|
+
U3Gate,
|
27
|
+
U2Gate,
|
28
|
+
U1Gate,
|
29
|
+
RXGate,
|
30
|
+
RYGate,
|
31
|
+
RZGate,
|
32
|
+
RGate,
|
33
|
+
SXGate,
|
34
|
+
XGate,
|
35
|
+
)
|
36
|
+
from qiskit.exceptions import QiskitError
|
37
|
+
from qiskit.quantum_info.operators.predicates import is_unitary_matrix
|
38
|
+
from qiskit.circuit.gate import Gate
|
39
|
+
from qiskit.quantum_info.operators.operator import Operator
|
40
|
+
|
41
|
+
if TYPE_CHECKING:
|
42
|
+
from qiskit.dagcircuit import DAGCircuit
|
43
|
+
|
44
|
+
DEFAULT_ATOL = 1e-12
|
45
|
+
|
46
|
+
ONE_QUBIT_EULER_BASIS_GATES = {
|
47
|
+
"U3": ["u3"],
|
48
|
+
"U321": ["u3", "u2", "u1"],
|
49
|
+
"U": ["u"],
|
50
|
+
"PSX": ["p", "sx"],
|
51
|
+
"U1X": ["u1", "rx"],
|
52
|
+
"RR": ["r"],
|
53
|
+
"ZYZ": ["rz", "ry"],
|
54
|
+
"ZXZ": ["rz", "rx"],
|
55
|
+
"XZX": ["rz", "rx"],
|
56
|
+
"XYX": ["rx", "ry"],
|
57
|
+
"ZSXX": ["rz", "sx", "x"],
|
58
|
+
"ZSX": ["rz", "sx"],
|
59
|
+
}
|
60
|
+
|
61
|
+
NAME_MAP = {
|
62
|
+
"u": UGate,
|
63
|
+
"u1": U1Gate,
|
64
|
+
"u2": U2Gate,
|
65
|
+
"u3": U3Gate,
|
66
|
+
"p": PhaseGate,
|
67
|
+
"rx": RXGate,
|
68
|
+
"ry": RYGate,
|
69
|
+
"rz": RZGate,
|
70
|
+
"r": RGate,
|
71
|
+
"sx": SXGate,
|
72
|
+
"x": XGate,
|
73
|
+
}
|
74
|
+
|
75
|
+
|
76
|
+
class OneQubitEulerDecomposer:
|
77
|
+
r"""A class for decomposing 1-qubit unitaries into Euler angle rotations.
|
78
|
+
|
79
|
+
The resulting decomposition is parameterized by 3 Euler rotation angle
|
80
|
+
parameters :math:`(\theta, \phi, \lambda)`, and a phase parameter
|
81
|
+
:math:`\gamma`. The value of the parameters for an input unitary depends
|
82
|
+
on the decomposition basis. Allowed bases and the resulting circuits are
|
83
|
+
shown in the following table. Note that for the non-Euler bases (:math:`U3`,
|
84
|
+
:math:`U1X`, :math:`RR`), the :math:`ZYZ` Euler parameters are used.
|
85
|
+
|
86
|
+
.. list-table:: Supported circuit bases
|
87
|
+
:widths: auto
|
88
|
+
:header-rows: 1
|
89
|
+
|
90
|
+
* - Basis
|
91
|
+
- Euler Angle Basis
|
92
|
+
- Decomposition Circuit
|
93
|
+
* - 'ZYZ'
|
94
|
+
- :math:`Z(\phi) Y(\theta) Z(\lambda)`
|
95
|
+
- :math:`e^{i\gamma} R_Z(\phi).R_Y(\theta).R_Z(\lambda)`
|
96
|
+
* - 'ZXZ'
|
97
|
+
- :math:`Z(\phi) X(\theta) Z(\lambda)`
|
98
|
+
- :math:`e^{i\gamma} R_Z(\phi).R_X(\theta).R_Z(\lambda)`
|
99
|
+
* - 'XYX'
|
100
|
+
- :math:`X(\phi) Y(\theta) X(\lambda)`
|
101
|
+
- :math:`e^{i\gamma} R_X(\phi).R_Y(\theta).R_X(\lambda)`
|
102
|
+
* - 'XZX'
|
103
|
+
- :math:`X(\phi) Z(\theta) X(\lambda)`
|
104
|
+
- :math:`e^{i\gamma} R_X(\phi).R_Z(\theta).R_X(\lambda)`
|
105
|
+
* - 'U3'
|
106
|
+
- :math:`Z(\phi) Y(\theta) Z(\lambda)`
|
107
|
+
- :math:`e^{i\gamma} U_3(\theta,\phi,\lambda)`
|
108
|
+
* - 'U321'
|
109
|
+
- :math:`Z(\phi) Y(\theta) Z(\lambda)`
|
110
|
+
- :math:`e^{i\gamma} U_3(\theta,\phi,\lambda)`
|
111
|
+
* - 'U'
|
112
|
+
- :math:`Z(\phi) Y(\theta) Z(\lambda)`
|
113
|
+
- :math:`e^{i\gamma} U_3(\theta,\phi,\lambda)`
|
114
|
+
* - 'PSX'
|
115
|
+
- :math:`Z(\phi) Y(\theta) Z(\lambda)`
|
116
|
+
- :math:`e^{i\gamma} U_1(\phi+\pi).R_X\left(\frac{\pi}{2}\right).`
|
117
|
+
:math:`U_1(\theta+\pi).R_X\left(\frac{\pi}{2}\right).U_1(\lambda)`
|
118
|
+
* - 'ZSX'
|
119
|
+
- :math:`Z(\phi) Y(\theta) Z(\lambda)`
|
120
|
+
- :math:`e^{i\gamma} R_Z(\phi+\pi).\sqrt{X}.`
|
121
|
+
:math:`R_Z(\theta+\pi).\sqrt{X}.R_Z(\lambda)`
|
122
|
+
* - 'ZSXX'
|
123
|
+
- :math:`Z(\phi) Y(\theta) Z(\lambda)`
|
124
|
+
- :math:`e^{i\gamma} R_Z(\phi+\pi).\sqrt{X}.R_Z(\theta+\pi).\sqrt{X}.R_Z(\lambda)`
|
125
|
+
or
|
126
|
+
:math:`e^{i\gamma} R_Z(\phi+\pi).X.R_Z(\lambda)`
|
127
|
+
* - 'U1X'
|
128
|
+
- :math:`Z(\phi) Y(\theta) Z(\lambda)`
|
129
|
+
- :math:`e^{i\gamma} U_1(\phi+\pi).R_X\left(\frac{\pi}{2}\right).`
|
130
|
+
:math:`U_1(\theta+\pi).R_X\left(\frac{\pi}{2}\right).U_1(\lambda)`
|
131
|
+
* - 'RR'
|
132
|
+
- :math:`Z(\phi) Y(\theta) Z(\lambda)`
|
133
|
+
- :math:`e^{i\gamma} R\left(-\pi,\frac{\phi-\lambda+\pi}{2}\right).`
|
134
|
+
:math:`R\left(\theta+\pi,\frac{\pi}{2}-\lambda\right)`
|
135
|
+
|
136
|
+
.. automethod:: __call__
|
137
|
+
"""
|
138
|
+
|
139
|
+
def __init__(self, basis: str = "U3", use_dag: bool = False):
|
140
|
+
"""Initialize decomposer
|
141
|
+
|
142
|
+
Supported bases are: ``'U'``, ``'PSX'``, ``'ZSXX'``, ``'ZSX'``, ``'U321'``, ``'U3'``,
|
143
|
+
``'U1X'``, ``'RR'``, ``'ZYZ'``, ``'ZXZ'``, ``'XYX'``, ``'XZX'``.
|
144
|
+
|
145
|
+
Args:
|
146
|
+
basis: the decomposition basis [Default: ``'U3'``]
|
147
|
+
use_dag: If true the output from calls to the decomposer
|
148
|
+
will be a :class:`~qiskit.dagcircuit.DAGCircuit` object instead of
|
149
|
+
:class:`~qiskit.circuit.QuantumCircuit`.
|
150
|
+
|
151
|
+
Raises:
|
152
|
+
QiskitError: If input basis is not recognized.
|
153
|
+
"""
|
154
|
+
self.basis = basis # sets: self._basis, self._params, self._circuit
|
155
|
+
self.use_dag = use_dag
|
156
|
+
|
157
|
+
def build_circuit(self, gates, global_phase) -> QuantumCircuit | DAGCircuit:
|
158
|
+
"""Return the circuit or dag object from a list of gates."""
|
159
|
+
qr = [Qubit()]
|
160
|
+
lookup_gate = False
|
161
|
+
if len(gates) > 0 and isinstance(gates[0], tuple):
|
162
|
+
lookup_gate = True
|
163
|
+
|
164
|
+
from qiskit.dagcircuit import dagcircuit
|
165
|
+
|
166
|
+
dag = dagcircuit.DAGCircuit()
|
167
|
+
dag.global_phase = global_phase
|
168
|
+
dag.add_qubits(qr)
|
169
|
+
for gate_entry in gates:
|
170
|
+
if lookup_gate:
|
171
|
+
gate = NAME_MAP[gate_entry[0].name](*gate_entry[1])
|
172
|
+
else:
|
173
|
+
gate = gate_entry.name
|
174
|
+
|
175
|
+
dag.apply_operation_back(gate, (qr[0],), check=False)
|
176
|
+
return dag
|
177
|
+
|
178
|
+
def __call__(
|
179
|
+
self,
|
180
|
+
unitary: Operator | Gate | np.ndarray,
|
181
|
+
simplify: bool = True,
|
182
|
+
atol: float = DEFAULT_ATOL,
|
183
|
+
) -> QuantumCircuit | DAGCircuit:
|
184
|
+
"""Decompose single qubit gate into a circuit.
|
185
|
+
|
186
|
+
Args:
|
187
|
+
unitary: 1-qubit unitary matrix
|
188
|
+
simplify: reduce gate count in decomposition [Default: True].
|
189
|
+
atol: absolute tolerance for checking angles when simplifying
|
190
|
+
returned circuit [Default: 1e-12].
|
191
|
+
|
192
|
+
Returns:
|
193
|
+
QuantumCircuit: the decomposed single-qubit gate circuit
|
194
|
+
|
195
|
+
Raises:
|
196
|
+
QiskitError: if input is invalid or synthesis fails.
|
197
|
+
"""
|
198
|
+
if hasattr(unitary, "to_operator"):
|
199
|
+
# If input is a BaseOperator subclass this attempts to convert
|
200
|
+
# the object to an Operator so that we can extract the underlying
|
201
|
+
# numpy matrix from `Operator.data`.
|
202
|
+
unitary = unitary.to_operator().data
|
203
|
+
elif hasattr(unitary, "to_matrix"):
|
204
|
+
# If input is Gate subclass or some other class object that has
|
205
|
+
# a to_matrix method this will call that method.
|
206
|
+
unitary = unitary.to_matrix()
|
207
|
+
# Convert to numpy array in case not already an array
|
208
|
+
unitary = np.asarray(unitary, dtype=complex)
|
209
|
+
|
210
|
+
# Check input is a 2-qubit unitary
|
211
|
+
if unitary.shape != (2, 2):
|
212
|
+
raise QiskitError("OneQubitEulerDecomposer: expected 2x2 input matrix")
|
213
|
+
if not is_unitary_matrix(unitary):
|
214
|
+
raise QiskitError("OneQubitEulerDecomposer: input matrix is not unitary.")
|
215
|
+
return self._decompose(unitary, simplify=simplify, atol=atol)
|
216
|
+
|
217
|
+
def _decompose(self, unitary, simplify=True, atol=DEFAULT_ATOL):
|
218
|
+
if self.use_dag:
|
219
|
+
circuit_sequence = euler_one_qubit_decomposer.unitary_to_gate_sequence(
|
220
|
+
unitary, [self.basis], 0, None, simplify, atol
|
221
|
+
)
|
222
|
+
circuit = self.build_circuit(circuit_sequence, circuit_sequence.global_phase)
|
223
|
+
return circuit
|
224
|
+
return QuantumCircuit._from_circuit_data(
|
225
|
+
euler_one_qubit_decomposer.unitary_to_circuit(
|
226
|
+
unitary, [self.basis], 0, None, simplify, atol
|
227
|
+
),
|
228
|
+
add_regs=True,
|
229
|
+
)
|
230
|
+
|
231
|
+
@property
|
232
|
+
def basis(self):
|
233
|
+
"""The decomposition basis."""
|
234
|
+
return self._basis
|
235
|
+
|
236
|
+
@basis.setter
|
237
|
+
def basis(self, basis):
|
238
|
+
"""Set the decomposition basis."""
|
239
|
+
basis_methods = {
|
240
|
+
"U321": self._params_u3,
|
241
|
+
"U3": self._params_u3,
|
242
|
+
"U": self._params_u3,
|
243
|
+
"PSX": self._params_u1x,
|
244
|
+
"ZSX": self._params_u1x,
|
245
|
+
"ZSXX": self._params_u1x,
|
246
|
+
"U1X": self._params_u1x,
|
247
|
+
"RR": self._params_zyz,
|
248
|
+
"ZYZ": self._params_zyz,
|
249
|
+
"ZXZ": self._params_zxz,
|
250
|
+
"XYX": self._params_xyx,
|
251
|
+
"XZX": self._params_xzx,
|
252
|
+
}
|
253
|
+
if basis not in basis_methods:
|
254
|
+
raise QiskitError(f"OneQubitEulerDecomposer: unsupported basis {basis}")
|
255
|
+
self._basis = basis
|
256
|
+
self._params = basis_methods[basis]
|
257
|
+
|
258
|
+
def angles(self, unitary: np.ndarray) -> tuple:
|
259
|
+
"""Return the Euler angles for input array.
|
260
|
+
|
261
|
+
Args:
|
262
|
+
unitary: :math:`2\\times2` unitary matrix.
|
263
|
+
|
264
|
+
Returns:
|
265
|
+
tuple: ``(theta, phi, lambda)``.
|
266
|
+
"""
|
267
|
+
unitary = np.asarray(unitary, dtype=complex)
|
268
|
+
theta, phi, lam, _ = self._params(unitary)
|
269
|
+
return theta, phi, lam
|
270
|
+
|
271
|
+
def angles_and_phase(self, unitary: np.ndarray) -> tuple:
|
272
|
+
"""Return the Euler angles and phase for input array.
|
273
|
+
|
274
|
+
Args:
|
275
|
+
unitary: :math:`2\\times2`
|
276
|
+
|
277
|
+
Returns:
|
278
|
+
tuple: ``(theta, phi, lambda, phase)``.
|
279
|
+
"""
|
280
|
+
unitary = np.asarray(unitary, dtype=complex)
|
281
|
+
return self._params(unitary)
|
282
|
+
|
283
|
+
_params_zyz = staticmethod(euler_one_qubit_decomposer.params_zyz)
|
284
|
+
_params_zxz = staticmethod(euler_one_qubit_decomposer.params_zxz)
|
285
|
+
_params_xyx = staticmethod(euler_one_qubit_decomposer.params_xyx)
|
286
|
+
_params_xzx = staticmethod(euler_one_qubit_decomposer.params_xzx)
|
287
|
+
_params_u3 = staticmethod(euler_one_qubit_decomposer.params_u3)
|
288
|
+
_params_u1x = staticmethod(euler_one_qubit_decomposer.params_u1x)
|
@@ -0,0 +1,18 @@
|
|
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
|
+
"""Module containing synthesis algorithms for Permutation gates."""
|
14
|
+
|
15
|
+
|
16
|
+
from .permutation_lnn import synth_permutation_depth_lnn_kms
|
17
|
+
from .permutation_full import synth_permutation_basic, synth_permutation_acg
|
18
|
+
from .permutation_reverse_lnn import synth_permutation_reverse_lnn_kms
|
@@ -0,0 +1,78 @@
|
|
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
|
+
"""Synthesis algorithm for Permutation gates for full-connectivity."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
import numpy as np
|
18
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
19
|
+
from qiskit._accelerate.synthesis.permutation import (
|
20
|
+
_synth_permutation_basic,
|
21
|
+
_synth_permutation_acg,
|
22
|
+
)
|
23
|
+
|
24
|
+
|
25
|
+
def synth_permutation_basic(pattern: list[int] | np.ndarray[int]) -> QuantumCircuit:
|
26
|
+
"""Synthesize a permutation circuit for a fully-connected
|
27
|
+
architecture using sorting.
|
28
|
+
|
29
|
+
More precisely, if the input permutation is a cycle of length ``m``,
|
30
|
+
then this creates a quantum circuit with ``m-1`` SWAPs (and of depth ``m-1``);
|
31
|
+
if the input permutation consists of several disjoint cycles, then each cycle
|
32
|
+
is essentially treated independently.
|
33
|
+
|
34
|
+
Args:
|
35
|
+
pattern: Permutation pattern, describing
|
36
|
+
which qubits occupy the positions 0, 1, 2, etc. after applying the
|
37
|
+
permutation. That is, ``pattern[k] = m`` when the permutation maps
|
38
|
+
qubit ``m`` to position ``k``. As an example, the pattern ``[2, 4, 3, 0, 1]``
|
39
|
+
means that qubit ``2`` goes to position ``0``, qubit ``4`` goes to
|
40
|
+
position ``1``, etc.
|
41
|
+
|
42
|
+
Returns:
|
43
|
+
The synthesized quantum circuit.
|
44
|
+
"""
|
45
|
+
return QuantumCircuit._from_circuit_data(_synth_permutation_basic(pattern), add_regs=True)
|
46
|
+
|
47
|
+
|
48
|
+
def synth_permutation_acg(pattern: list[int] | np.ndarray[int]) -> QuantumCircuit:
|
49
|
+
"""Synthesize a permutation circuit for a fully-connected
|
50
|
+
architecture using the Alon, Chung, Graham method.
|
51
|
+
|
52
|
+
This produces a quantum circuit of depth 2 (measured in the number of SWAPs).
|
53
|
+
|
54
|
+
This implementation is based on the Proposition 4.1 in reference [1] with
|
55
|
+
the detailed proof given in Theorem 2 in reference [2]
|
56
|
+
|
57
|
+
Args:
|
58
|
+
pattern: Permutation pattern, describing
|
59
|
+
which qubits occupy the positions 0, 1, 2, etc. after applying the
|
60
|
+
permutation. That is, ``pattern[k] = m`` when the permutation maps
|
61
|
+
qubit ``m`` to position ``k``. As an example, the pattern ``[2, 4, 3, 0, 1]``
|
62
|
+
means that qubit ``2`` goes to position ``0``, qubit ``4`` goes to
|
63
|
+
position ``1``, etc.
|
64
|
+
|
65
|
+
Returns:
|
66
|
+
The synthesized quantum circuit.
|
67
|
+
|
68
|
+
References:
|
69
|
+
1. N. Alon, F. R. K. Chung, and R. L. Graham.
|
70
|
+
*Routing Permutations on Graphs Via Matchings.*,
|
71
|
+
Proceedings of the Twenty-Fifth Annual ACM Symposium on Theory of Computing(1993).
|
72
|
+
Pages 583–591.
|
73
|
+
`(Extended abstract) 10.1145/167088.167239 <https://doi.org/10.1145/167088.167239>`_
|
74
|
+
2. N. Alon, F. R. K. Chung, and R. L. Graham.
|
75
|
+
*Routing Permutations on Graphs Via Matchings.*,
|
76
|
+
`(Full paper) <https://www.cs.tau.ac.il/~nogaa/PDFS/r.pdf>`_
|
77
|
+
"""
|
78
|
+
return QuantumCircuit._from_circuit_data(_synth_permutation_acg(pattern), add_regs=True)
|
@@ -0,0 +1,54 @@
|
|
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
|
+
"""Depth-efficient synthesis algorithm for Permutation gates."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
import numpy as np
|
17
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
18
|
+
from qiskit._accelerate.synthesis.permutation import _synth_permutation_depth_lnn_kms
|
19
|
+
|
20
|
+
|
21
|
+
def synth_permutation_depth_lnn_kms(pattern: list[int] | np.ndarray[int]) -> QuantumCircuit:
|
22
|
+
"""Synthesize a permutation circuit for a linear nearest-neighbor
|
23
|
+
architecture using the Kutin, Moulton, Smithline method.
|
24
|
+
|
25
|
+
This is the permutation synthesis algorithm from [1], section 6.
|
26
|
+
It synthesizes any permutation of n qubits over linear nearest-neighbor
|
27
|
+
architecture using SWAP gates with depth at most :math:`n` and size at most
|
28
|
+
:math:`n(n-1)/2` (where both depth and size are measured with respect to SWAPs).
|
29
|
+
|
30
|
+
Args:
|
31
|
+
pattern: Permutation pattern, describing
|
32
|
+
which qubits occupy the positions 0, 1, 2, etc. after applying the
|
33
|
+
permutation. That is, ``pattern[k] = m`` when the permutation maps
|
34
|
+
qubit ``m`` to position ``k``. As an example, the pattern ``[2, 4, 3, 0, 1]``
|
35
|
+
means that qubit ``2`` goes to position ``0``, qubit ``4`` goes to
|
36
|
+
position ``1``, etc.
|
37
|
+
|
38
|
+
Returns:
|
39
|
+
The synthesized quantum circuit.
|
40
|
+
|
41
|
+
References:
|
42
|
+
1. Samuel A. Kutin, David Petrie Moulton and Lawren M. Smithline.
|
43
|
+
*Computation at a distance.*,
|
44
|
+
`arXiv:quant-ph/0701194v1 <https://arxiv.org/abs/quant-ph/0701194>`_
|
45
|
+
"""
|
46
|
+
|
47
|
+
# In Qiskit, the permutation pattern [2, 4, 3, 0, 1] means that
|
48
|
+
# the permutation that maps qubit 2 to position 0, 4 to 1, 3 to 2, 0 to 3, and 1 to 4.
|
49
|
+
# In the permutation synthesis code below the notation is opposite:
|
50
|
+
# [2, 4, 3, 0, 1] means that 0 maps to 2, 1 to 3, 2 to 3, 3 to 0, and 4 to 1.
|
51
|
+
# This is why we invert the pattern.
|
52
|
+
return QuantumCircuit._from_circuit_data(
|
53
|
+
_synth_permutation_depth_lnn_kms(pattern), add_regs=True
|
54
|
+
)
|
@@ -0,0 +1,93 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2024
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
"""
|
13
|
+
Synthesis of a reverse permutation for LNN connectivity.
|
14
|
+
"""
|
15
|
+
|
16
|
+
from qiskit.circuit import QuantumCircuit
|
17
|
+
from qiskit._accelerate.synthesis.permutation import (
|
18
|
+
synth_permutation_reverse_lnn_kms as synth_permutation_reverse_lnn_kms_inner,
|
19
|
+
)
|
20
|
+
|
21
|
+
|
22
|
+
def _append_cx_stage1(qc, n):
|
23
|
+
"""A single layer of CX gates."""
|
24
|
+
for i in range(n // 2):
|
25
|
+
qc.cx(2 * i, 2 * i + 1)
|
26
|
+
for i in range((n + 1) // 2 - 1):
|
27
|
+
qc.cx(2 * i + 2, 2 * i + 1)
|
28
|
+
return qc
|
29
|
+
|
30
|
+
|
31
|
+
def _append_cx_stage2(qc, n):
|
32
|
+
"""A single layer of CX gates."""
|
33
|
+
for i in range(n // 2):
|
34
|
+
qc.cx(2 * i + 1, 2 * i)
|
35
|
+
for i in range((n + 1) // 2 - 1):
|
36
|
+
qc.cx(2 * i + 1, 2 * i + 2)
|
37
|
+
return qc
|
38
|
+
|
39
|
+
|
40
|
+
def _append_reverse_permutation_lnn_kms(qc: QuantumCircuit, num_qubits: int) -> None:
|
41
|
+
"""
|
42
|
+
Append reverse permutation to a QuantumCircuit for linear nearest-neighbor architectures
|
43
|
+
using Kutin, Moulton, Smithline method.
|
44
|
+
|
45
|
+
Synthesis algorithm for reverse permutation from [1], section 5.
|
46
|
+
This algorithm synthesizes the reverse permutation on :math:`n` qubits over
|
47
|
+
a linear nearest-neighbor architecture using CX gates with depth :math:`2 * n + 2`.
|
48
|
+
|
49
|
+
Args:
|
50
|
+
qc: The original quantum circuit.
|
51
|
+
num_qubits: The number of qubits.
|
52
|
+
|
53
|
+
Returns:
|
54
|
+
The quantum circuit with appended reverse permutation.
|
55
|
+
|
56
|
+
References:
|
57
|
+
1. Kutin, S., Moulton, D. P., Smithline, L.,
|
58
|
+
*Computation at a distance*, Chicago J. Theor. Comput. Sci., vol. 2007, (2007),
|
59
|
+
`arXiv:quant-ph/0701194 <https://arxiv.org/abs/quant-ph/0701194>`_
|
60
|
+
"""
|
61
|
+
|
62
|
+
for _ in range((num_qubits + 1) // 2):
|
63
|
+
_append_cx_stage1(qc, num_qubits)
|
64
|
+
_append_cx_stage2(qc, num_qubits)
|
65
|
+
if (num_qubits % 2) == 0:
|
66
|
+
_append_cx_stage1(qc, num_qubits)
|
67
|
+
|
68
|
+
|
69
|
+
def synth_permutation_reverse_lnn_kms(num_qubits: int) -> QuantumCircuit:
|
70
|
+
"""
|
71
|
+
Synthesize reverse permutation for linear nearest-neighbor architectures using
|
72
|
+
Kutin, Moulton, Smithline method.
|
73
|
+
|
74
|
+
Synthesis algorithm for reverse permutation from [1], section 5.
|
75
|
+
This algorithm synthesizes the reverse permutation on :math:`n` qubits over
|
76
|
+
a linear nearest-neighbor architecture using CX gates with depth :math:`2 * n + 2`.
|
77
|
+
|
78
|
+
Args:
|
79
|
+
num_qubits: The number of qubits.
|
80
|
+
|
81
|
+
Returns:
|
82
|
+
The synthesized quantum circuit.
|
83
|
+
|
84
|
+
References:
|
85
|
+
1. Kutin, S., Moulton, D. P., Smithline, L.,
|
86
|
+
*Computation at a distance*, Chicago J. Theor. Comput. Sci., vol. 2007, (2007),
|
87
|
+
`arXiv:quant-ph/0701194 <https://arxiv.org/abs/quant-ph/0701194>`_
|
88
|
+
"""
|
89
|
+
|
90
|
+
# Call Rust implementation
|
91
|
+
return QuantumCircuit._from_circuit_data(
|
92
|
+
synth_permutation_reverse_lnn_kms_inner(num_qubits), add_regs=True
|
93
|
+
)
|
@@ -0,0 +1,16 @@
|
|
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
|
+
"""Utility functions for handling permutations."""
|
14
|
+
|
15
|
+
# pylint: disable=unused-import
|
16
|
+
from qiskit._accelerate.synthesis.permutation import _inverse_pattern, _validate_permutation
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2023.
|
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
|
+
"""Module containing stabilizer QFT circuit synthesis."""
|
14
|
+
|
15
|
+
from .qft_decompose_lnn import synth_qft_line
|
16
|
+
from .qft_decompose_full import synth_qft_full
|
@@ -0,0 +1,97 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2024.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
"""
|
13
|
+
Circuit synthesis for a QFT circuit.
|
14
|
+
"""
|
15
|
+
|
16
|
+
from __future__ import annotations
|
17
|
+
import warnings
|
18
|
+
import numpy as np
|
19
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
20
|
+
|
21
|
+
|
22
|
+
def synth_qft_full(
|
23
|
+
num_qubits: int,
|
24
|
+
do_swaps: bool = True,
|
25
|
+
approximation_degree: int = 0,
|
26
|
+
insert_barriers: bool = False,
|
27
|
+
inverse: bool = False,
|
28
|
+
name: str | None = None,
|
29
|
+
) -> QuantumCircuit:
|
30
|
+
"""Construct a circuit for the Quantum Fourier Transform using all-to-all connectivity.
|
31
|
+
|
32
|
+
.. note::
|
33
|
+
|
34
|
+
With the default value of ``do_swaps = True``, this synthesis algorithm creates a
|
35
|
+
circuit that faithfully implements the QFT operation. This circuit contains a sequence
|
36
|
+
of swap gates at the end, corresponding to reversing the order of its output qubits.
|
37
|
+
In some applications this reversal permutation can be avoided. Setting ``do_swaps = False``
|
38
|
+
creates a circuit without this reversal permutation, at the expense that this circuit
|
39
|
+
implements the "QFT-with-reversal" instead of QFT. Alternatively, the
|
40
|
+
:class:`~.ElidePermutations` transpiler pass is able to remove these swap gates.
|
41
|
+
|
42
|
+
Args:
|
43
|
+
num_qubits: The number of qubits on which the Quantum Fourier Transform acts.
|
44
|
+
do_swaps: Whether to synthesize the "QFT" or the "QFT-with-reversal" operation.
|
45
|
+
approximation_degree: The degree of approximation (0 for no approximation).
|
46
|
+
It is possible to implement the QFT approximately by ignoring
|
47
|
+
controlled-phase rotations with the angle beneath a threshold. This is discussed
|
48
|
+
in more detail in https://arxiv.org/abs/quant-ph/9601018 or
|
49
|
+
https://arxiv.org/abs/quant-ph/0403071.
|
50
|
+
insert_barriers: If ``True``, barriers are inserted for improved visualization.
|
51
|
+
inverse: If ``True``, the inverse Quantum Fourier Transform is constructed.
|
52
|
+
name: The name of the circuit.
|
53
|
+
|
54
|
+
Returns:
|
55
|
+
A circuit implementing the QFT operation.
|
56
|
+
|
57
|
+
"""
|
58
|
+
_warn_if_precision_loss(num_qubits - approximation_degree - 1)
|
59
|
+
circuit = QuantumCircuit(num_qubits, name=name)
|
60
|
+
|
61
|
+
for j in reversed(range(num_qubits)):
|
62
|
+
circuit.h(j)
|
63
|
+
num_entanglements = max(0, j - max(0, approximation_degree - (num_qubits - j - 1)))
|
64
|
+
for k in reversed(range(j - num_entanglements, j)):
|
65
|
+
# Use negative exponents so that the angle safely underflows to zero, rather than
|
66
|
+
# using a temporary variable that overflows to infinity in the worst case.
|
67
|
+
lam = np.pi * (2.0 ** (k - j))
|
68
|
+
circuit.cp(lam, j, k)
|
69
|
+
|
70
|
+
if insert_barriers:
|
71
|
+
circuit.barrier()
|
72
|
+
|
73
|
+
if do_swaps:
|
74
|
+
for i in range(num_qubits // 2):
|
75
|
+
circuit.swap(i, num_qubits - i - 1)
|
76
|
+
|
77
|
+
if inverse:
|
78
|
+
circuit = circuit.inverse()
|
79
|
+
|
80
|
+
return circuit
|
81
|
+
|
82
|
+
|
83
|
+
def _warn_if_precision_loss(max_num_entanglements):
|
84
|
+
"""Issue a warning if constructing the circuit will lose precision.
|
85
|
+
|
86
|
+
If we need an angle smaller than ``pi * 2**-1022``, we start to lose precision by going into
|
87
|
+
the subnormal numbers. We won't lose _all_ precision until an exponent of about 1075, but
|
88
|
+
beyond 1022 we're using fractional bits to represent leading zeros.
|
89
|
+
"""
|
90
|
+
if max_num_entanglements > -np.finfo(float).minexp: # > 1022 for doubles.
|
91
|
+
warnings.warn(
|
92
|
+
"precision loss in QFT."
|
93
|
+
f" The rotation needed to represent {max_num_entanglements} entanglements"
|
94
|
+
" is smaller than the smallest normal floating-point number.",
|
95
|
+
category=RuntimeWarning,
|
96
|
+
stacklevel=4,
|
97
|
+
)
|