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,154 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2021.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Compute the sum of two qubit registers using ripple-carry approach."""
|
14
|
+
|
15
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
16
|
+
from qiskit.circuit import QuantumRegister, AncillaRegister
|
17
|
+
|
18
|
+
|
19
|
+
def adder_ripple_c04(num_state_qubits: int, kind: str = "half") -> QuantumCircuit:
|
20
|
+
r"""A ripple-carry circuit to perform in-place addition on two qubit registers.
|
21
|
+
|
22
|
+
This circuit uses :math:`2n + O(1)` CCX gates and :math:`5n + O(1)` CX gates,
|
23
|
+
at a depth of :math:`2n + O(1)` [1]. The constant depends on the kind
|
24
|
+
of adder implemented.
|
25
|
+
|
26
|
+
As an example, a ripple-carry adder circuit that performs addition on two 3-qubit sized
|
27
|
+
registers with a carry-in bit (``kind="full"``) is as follows:
|
28
|
+
|
29
|
+
.. parsed-literal::
|
30
|
+
|
31
|
+
┌──────┐ ┌──────┐
|
32
|
+
cin_0: ┤2 ├─────────────────────────────────────┤2 ├
|
33
|
+
│ │┌──────┐ ┌──────┐│ │
|
34
|
+
a_0: ┤0 ├┤2 ├─────────────────────┤2 ├┤0 ├
|
35
|
+
│ ││ │┌──────┐ ┌──────┐│ ││ │
|
36
|
+
a_1: ┤ MAJ ├┤0 ├┤2 ├─────┤2 ├┤0 ├┤ UMA ├
|
37
|
+
│ ││ ││ │ │ ││ ││ │
|
38
|
+
a_2: ┤ ├┤ MAJ ├┤0 ├──■──┤0 ├┤ UMA ├┤ ├
|
39
|
+
│ ││ ││ │ │ │ ││ ││ │
|
40
|
+
b_0: ┤1 ├┤ ├┤ MAJ ├──┼──┤ UMA ├┤ ├┤1 ├
|
41
|
+
└──────┘│ ││ │ │ │ ││ │└──────┘
|
42
|
+
b_1: ────────┤1 ├┤ ├──┼──┤ ├┤1 ├────────
|
43
|
+
└──────┘│ │ │ │ │└──────┘
|
44
|
+
b_2: ────────────────┤1 ├──┼──┤1 ├────────────────
|
45
|
+
└──────┘┌─┴─┐└──────┘
|
46
|
+
cout_0: ────────────────────────┤ X ├────────────────────────
|
47
|
+
└───┘
|
48
|
+
|
49
|
+
Here *MAJ* and *UMA* gates correspond to the gates introduced in [1]. Note that
|
50
|
+
in this implementation the input register qubits are ordered as all qubits from
|
51
|
+
the first input register, followed by all qubits from the second input register.
|
52
|
+
|
53
|
+
Two different kinds of adders are supported. By setting the ``kind`` argument, you can also
|
54
|
+
choose a half-adder, which doesn't have a carry-in, and a fixed-sized-adder, which has neither
|
55
|
+
carry-in nor carry-out, and thus acts on fixed register sizes. Unlike the full-adder,
|
56
|
+
these circuits need one additional helper qubit.
|
57
|
+
|
58
|
+
The circuit diagram for the fixed-point adder (``kind="fixed"``) on 3-qubit sized inputs is
|
59
|
+
|
60
|
+
.. parsed-literal::
|
61
|
+
|
62
|
+
┌──────┐┌──────┐ ┌──────┐┌──────┐
|
63
|
+
a_0: ┤0 ├┤2 ├────────────────┤2 ├┤0 ├
|
64
|
+
│ ││ │┌──────┐┌──────┐│ ││ │
|
65
|
+
a_1: ┤ ├┤0 ├┤2 ├┤2 ├┤0 ├┤ ├
|
66
|
+
│ ││ ││ ││ ││ ││ │
|
67
|
+
a_2: ┤ ├┤ MAJ ├┤0 ├┤0 ├┤ UMA ├┤ ├
|
68
|
+
│ ││ ││ ││ ││ ││ │
|
69
|
+
b_0: ┤1 MAJ ├┤ ├┤ MAJ ├┤ UMA ├┤ ├┤1 UMA ├
|
70
|
+
│ ││ ││ ││ ││ ││ │
|
71
|
+
b_1: ┤ ├┤1 ├┤ ├┤ ├┤1 ├┤ ├
|
72
|
+
│ │└──────┘│ ││ │└──────┘│ │
|
73
|
+
b_2: ┤ ├────────┤1 ├┤1 ├────────┤ ├
|
74
|
+
│ │ └──────┘└──────┘ │ │
|
75
|
+
help_0: ┤2 ├────────────────────────────────┤2 ├
|
76
|
+
└──────┘ └──────┘
|
77
|
+
|
78
|
+
It has one less qubit than the full-adder since it doesn't have the carry-out, but uses
|
79
|
+
a helper qubit instead of the carry-in, so it only has one less qubit, not two.
|
80
|
+
|
81
|
+
Args:
|
82
|
+
num_state_qubits: The number of qubits in either input register for
|
83
|
+
state :math:`|a\rangle` or :math:`|b\rangle`. The two input
|
84
|
+
registers must have the same number of qubits.
|
85
|
+
kind: The kind of adder, can be ``"full"`` for a full adder, ``"half"`` for a half
|
86
|
+
adder, or ``"fixed"`` for a fixed-sized adder. A full adder includes both carry-in
|
87
|
+
and carry-out, a half only carry-out, and a fixed-sized adder neither carry-in
|
88
|
+
nor carry-out.
|
89
|
+
|
90
|
+
Raises:
|
91
|
+
ValueError: If ``num_state_qubits`` is lower than 1.
|
92
|
+
|
93
|
+
**References:**
|
94
|
+
|
95
|
+
[1] Cuccaro et al., A new quantum ripple-carry addition circuit, 2004.
|
96
|
+
`arXiv:quant-ph/0410184 <https://arxiv.org/pdf/quant-ph/0410184.pdf>`_
|
97
|
+
|
98
|
+
[2] Vedral et al., Quantum Networks for Elementary Arithmetic Operations, 1995.
|
99
|
+
`arXiv:quant-ph/9511018 <https://arxiv.org/pdf/quant-ph/9511018.pdf>`_
|
100
|
+
|
101
|
+
"""
|
102
|
+
if num_state_qubits < 1:
|
103
|
+
raise ValueError("The number of qubits must be at least 1.")
|
104
|
+
|
105
|
+
circuit = QuantumCircuit()
|
106
|
+
|
107
|
+
if kind == "full":
|
108
|
+
qr_c = QuantumRegister(1, name="cin")
|
109
|
+
circuit.add_register(qr_c)
|
110
|
+
else:
|
111
|
+
qr_c = AncillaRegister(1, name="help")
|
112
|
+
|
113
|
+
qr_a = QuantumRegister(num_state_qubits, name="a")
|
114
|
+
qr_b = QuantumRegister(num_state_qubits, name="b")
|
115
|
+
circuit.add_register(qr_a, qr_b)
|
116
|
+
|
117
|
+
if kind in ["full", "half"]:
|
118
|
+
qr_z = QuantumRegister(1, name="cout")
|
119
|
+
circuit.add_register(qr_z)
|
120
|
+
|
121
|
+
if kind != "full":
|
122
|
+
circuit.add_register(qr_c)
|
123
|
+
|
124
|
+
# build carry circuit for majority of 3 bits in-place
|
125
|
+
# corresponds to MAJ gate in [1]
|
126
|
+
qc_maj = QuantumCircuit(3, name="MAJ")
|
127
|
+
qc_maj.cx(0, 1)
|
128
|
+
qc_maj.cx(0, 2)
|
129
|
+
qc_maj.ccx(2, 1, 0)
|
130
|
+
maj_gate = qc_maj.to_gate()
|
131
|
+
|
132
|
+
# build circuit for reversing carry operation
|
133
|
+
# corresponds to UMA gate in [1]
|
134
|
+
qc_uma = QuantumCircuit(3, name="UMA")
|
135
|
+
qc_uma.ccx(2, 1, 0)
|
136
|
+
qc_uma.cx(0, 2)
|
137
|
+
qc_uma.cx(2, 1)
|
138
|
+
uma_gate = qc_uma.to_gate()
|
139
|
+
|
140
|
+
# build ripple-carry adder circuit
|
141
|
+
circuit.append(maj_gate, [qr_a[0], qr_b[0], qr_c[0]])
|
142
|
+
|
143
|
+
for i in range(num_state_qubits - 1):
|
144
|
+
circuit.append(maj_gate, [qr_a[i + 1], qr_b[i + 1], qr_a[i]])
|
145
|
+
|
146
|
+
if kind in ["full", "half"]:
|
147
|
+
circuit.cx(qr_a[-1], qr_z[0])
|
148
|
+
|
149
|
+
for i in reversed(range(num_state_qubits - 1)):
|
150
|
+
circuit.append(uma_gate, [qr_a[i + 1], qr_b[i + 1], qr_a[i]])
|
151
|
+
|
152
|
+
circuit.append(uma_gate, [qr_a[0], qr_b[0], qr_c[0]])
|
153
|
+
|
154
|
+
return circuit
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2021.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Compute the sum of two qubit registers using QFT."""
|
14
|
+
|
15
|
+
import numpy as np
|
16
|
+
|
17
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
18
|
+
from qiskit.circuit import QuantumRegister
|
19
|
+
from qiskit.circuit.library.basis_change import QFTGate
|
20
|
+
|
21
|
+
|
22
|
+
def adder_qft_d00(num_state_qubits: int, kind: str = "half") -> QuantumCircuit:
|
23
|
+
r"""A circuit that uses QFT to perform in-place addition on two qubit registers.
|
24
|
+
|
25
|
+
For registers with :math:`n` qubits, the QFT adder can perform addition modulo
|
26
|
+
:math:`2^n` (with ``kind="fixed"``) or ordinary addition by adding a carry qubits (with
|
27
|
+
``kind="half"``). The fixed adder uses :math:`(3n^2 - n)/2` :class:`.CPhaseGate` operators,
|
28
|
+
with an additional :math:`n` for the half adder.
|
29
|
+
|
30
|
+
As an example, a non-fixed_point QFT adder circuit that performs addition on two 2-qubit sized
|
31
|
+
registers is as follows:
|
32
|
+
|
33
|
+
.. parsed-literal::
|
34
|
+
|
35
|
+
a_0: ─────────■──────■────────■──────────────────────────────────
|
36
|
+
│ │ │
|
37
|
+
a_1: ─────────┼──────┼────────┼────────■──────■──────────────────
|
38
|
+
┌──────┐ │ │ │P(π/4) │ │P(π/2) ┌─────────┐
|
39
|
+
b_0: ┤0 ├─┼──────┼────────■────────┼──────■───────┤0 ├
|
40
|
+
│ │ │ │P(π/2) │P(π) │ │
|
41
|
+
b_1: ┤1 Qft ├─┼──────■─────────────────■──────────────┤1 qft_dg ├
|
42
|
+
│ │ │P(π) │ │
|
43
|
+
cout: ┤2 ├─■───────────────────────────────────────┤2 ├
|
44
|
+
└──────┘ └─────────┘
|
45
|
+
|
46
|
+
Args:
|
47
|
+
num_state_qubits: The number of qubits in either input register for
|
48
|
+
state :math:`|a\rangle` or :math:`|b\rangle`. The two input
|
49
|
+
registers must have the same number of qubits.
|
50
|
+
kind: The kind of adder, can be ``"half"`` for a half adder or
|
51
|
+
``"fixed"`` for a fixed-sized adder. A half adder contains a carry-out to represent
|
52
|
+
the most-significant bit, but the fixed-sized adder doesn't and hence performs
|
53
|
+
addition modulo ``2 ** num_state_qubits``.
|
54
|
+
|
55
|
+
**References:**
|
56
|
+
|
57
|
+
[1] T. G. Draper, Addition on a Quantum Computer, 2000.
|
58
|
+
`arXiv:quant-ph/0008033 <https://arxiv.org/pdf/quant-ph/0008033.pdf>`_
|
59
|
+
|
60
|
+
[2] Ruiz-Perez et al., Quantum arithmetic with the Quantum Fourier Transform, 2017.
|
61
|
+
`arXiv:1411.5949 <https://arxiv.org/pdf/1411.5949.pdf>`_
|
62
|
+
|
63
|
+
[3] Vedral et al., Quantum Networks for Elementary Arithmetic Operations, 1995.
|
64
|
+
`arXiv:quant-ph/9511018 <https://arxiv.org/pdf/quant-ph/9511018.pdf>`_
|
65
|
+
|
66
|
+
"""
|
67
|
+
|
68
|
+
if kind == "full":
|
69
|
+
raise ValueError("The DraperQFTAdder only supports 'half' and 'fixed' as ``kind``.")
|
70
|
+
|
71
|
+
if num_state_qubits < 1:
|
72
|
+
raise ValueError("The number of qubits must be at least 1.")
|
73
|
+
|
74
|
+
qr_a = QuantumRegister(num_state_qubits, name="a")
|
75
|
+
qr_b = QuantumRegister(num_state_qubits, name="b")
|
76
|
+
qr_list = [qr_a, qr_b]
|
77
|
+
|
78
|
+
if kind == "half":
|
79
|
+
qr_z = QuantumRegister(1, name="cout")
|
80
|
+
qr_list.append(qr_z)
|
81
|
+
|
82
|
+
# add registers
|
83
|
+
circuit = QuantumCircuit(*qr_list)
|
84
|
+
|
85
|
+
# define register containing the sum and number of qubits for QFT circuit
|
86
|
+
qr_sum = qr_b[:] if kind == "fixed" else qr_b[:] + qr_z[:]
|
87
|
+
num_sum = num_state_qubits if kind == "fixed" else num_state_qubits + 1
|
88
|
+
|
89
|
+
# build QFT adder circuit
|
90
|
+
qft = QFTGate(num_sum)
|
91
|
+
circuit.append(qft, qr_sum[:])
|
92
|
+
|
93
|
+
for j in range(num_state_qubits):
|
94
|
+
for k in range(num_sum - j):
|
95
|
+
lam = np.pi / (2**k)
|
96
|
+
# note: if we were able to remove the final swaps from the QFTGate, we could
|
97
|
+
# simply use qr_sum[(j + k)] here and avoid synthesizing two swap networks, which
|
98
|
+
# can be elided and cancelled by the compiler
|
99
|
+
circuit.cp(lam, qr_a[j], qr_sum[~(j + k)])
|
100
|
+
|
101
|
+
circuit.append(qft.inverse(), qr_sum[:])
|
102
|
+
|
103
|
+
return circuit
|
@@ -0,0 +1,161 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2021.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Compute the sum of two qubit registers using Classical Addition."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
from qiskit.circuit import Bit
|
17
|
+
|
18
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
19
|
+
from qiskit.circuit import QuantumRegister, AncillaRegister
|
20
|
+
|
21
|
+
|
22
|
+
def adder_ripple_v95(num_state_qubits: int, kind: str = "half") -> QuantumCircuit:
|
23
|
+
r"""The VBE ripple carry adder [1].
|
24
|
+
|
25
|
+
This method uses :math:`4n + O(1)` CCX gates and :math:`4n + 1` CX gates at a depth
|
26
|
+
of :math:`6n - 2` [2].
|
27
|
+
|
28
|
+
This circuit performs inplace addition of two equally-sized quantum registers.
|
29
|
+
As an example, a classical adder circuit that performs full addition (i.e. including
|
30
|
+
a carry-in bit) on two 2-qubit sized registers is as follows:
|
31
|
+
|
32
|
+
.. parsed-literal::
|
33
|
+
|
34
|
+
┌────────┐ ┌───────────┐┌──────┐
|
35
|
+
cin_0: ┤0 ├───────────────────────┤0 ├┤0 ├
|
36
|
+
│ │ │ ││ │
|
37
|
+
a_0: ┤1 ├───────────────────────┤1 ├┤1 ├
|
38
|
+
│ │┌────────┐ ┌──────┐│ ││ Sum │
|
39
|
+
a_1: ┤ ├┤1 ├──■──┤1 ├┤ ├┤ ├
|
40
|
+
│ ││ │ │ │ ││ ││ │
|
41
|
+
b_0: ┤2 Carry ├┤ ├──┼──┤ ├┤2 Carry_dg ├┤2 ├
|
42
|
+
│ ││ │┌─┴─┐│ ││ │└──────┘
|
43
|
+
b_1: ┤ ├┤2 Carry ├┤ X ├┤2 Sum ├┤ ├────────
|
44
|
+
│ ││ │└───┘│ ││ │
|
45
|
+
cout_0: ┤ ├┤3 ├─────┤ ├┤ ├────────
|
46
|
+
│ ││ │ │ ││ │
|
47
|
+
helper_0: ┤3 ├┤0 ├─────┤0 ├┤3 ├────────
|
48
|
+
└────────┘└────────┘ └──────┘└───────────┘
|
49
|
+
|
50
|
+
|
51
|
+
Here *Carry* and *Sum* gates correspond to the gates introduced in [1].
|
52
|
+
*Carry_dg* correspond to the inverse of the *Carry* gate. Note that
|
53
|
+
in this implementation the input register qubits are ordered as all qubits from
|
54
|
+
the first input register, followed by all qubits from the second input register.
|
55
|
+
This is different ordering as compared to Figure 2 in [1], which leads to a different
|
56
|
+
drawing of the circuit.
|
57
|
+
|
58
|
+
Args:
|
59
|
+
num_state_qubits: The size of the register.
|
60
|
+
kind: The kind of adder, can be ``"full"`` for a full adder, ``"half"`` for a half
|
61
|
+
adder, or ``"fixed"`` for a fixed-sized adder. A full adder includes both carry-in
|
62
|
+
and carry-out, a half only carry-out, and a fixed-sized adder neither carry-in
|
63
|
+
nor carry-out.
|
64
|
+
|
65
|
+
Raises:
|
66
|
+
ValueError: If ``num_state_qubits`` is lower than 1.
|
67
|
+
|
68
|
+
**References:**
|
69
|
+
|
70
|
+
[1] Vedral et al., Quantum Networks for Elementary Arithmetic Operations, 1995.
|
71
|
+
`arXiv:quant-ph/9511018 <https://arxiv.org/pdf/quant-ph/9511018.pdf>`_
|
72
|
+
|
73
|
+
[2] Cuccaro et al., A new quantum ripple-carry addition circuit, 2004.
|
74
|
+
`arXiv:quant-ph/0410184 <https://arxiv.org/pdf/quant-ph/0410184.pdf>`_
|
75
|
+
|
76
|
+
"""
|
77
|
+
if num_state_qubits < 1:
|
78
|
+
raise ValueError("The number of qubits must be at least 1.")
|
79
|
+
|
80
|
+
# define the input registers
|
81
|
+
registers: list[QuantumRegister | list[Bit]] = []
|
82
|
+
if kind == "full":
|
83
|
+
qr_cin = QuantumRegister(1, name="cin")
|
84
|
+
registers.append(qr_cin)
|
85
|
+
else:
|
86
|
+
qr_cin = QuantumRegister(0)
|
87
|
+
|
88
|
+
qr_a = QuantumRegister(num_state_qubits, name="a")
|
89
|
+
qr_b = QuantumRegister(num_state_qubits, name="b")
|
90
|
+
|
91
|
+
registers += [qr_a, qr_b]
|
92
|
+
|
93
|
+
if kind in ["half", "full"]:
|
94
|
+
qr_cout = QuantumRegister(1, name="cout")
|
95
|
+
registers.append(qr_cout)
|
96
|
+
else:
|
97
|
+
qr_cout = QuantumRegister(0)
|
98
|
+
|
99
|
+
if num_state_qubits > 1:
|
100
|
+
qr_help = AncillaRegister(num_state_qubits - 1, name="helper")
|
101
|
+
registers.append(qr_help)
|
102
|
+
else:
|
103
|
+
qr_help = AncillaRegister(0)
|
104
|
+
|
105
|
+
circuit = QuantumCircuit(*registers)
|
106
|
+
|
107
|
+
# the code is simplified a lot if we create a list of all carries and helpers
|
108
|
+
carries = qr_cin[:] + qr_help[:] + qr_cout[:]
|
109
|
+
|
110
|
+
# corresponds to Carry gate in [1]
|
111
|
+
qc_carry = QuantumCircuit(4, name="Carry")
|
112
|
+
qc_carry.ccx(1, 2, 3)
|
113
|
+
qc_carry.cx(1, 2)
|
114
|
+
qc_carry.ccx(0, 2, 3)
|
115
|
+
carry_gate = qc_carry.to_gate()
|
116
|
+
carry_gate_dg = carry_gate.inverse()
|
117
|
+
|
118
|
+
# corresponds to Sum gate in [1]
|
119
|
+
qc_sum = QuantumCircuit(3, name="Sum")
|
120
|
+
qc_sum.cx(1, 2)
|
121
|
+
qc_sum.cx(0, 2)
|
122
|
+
sum_gate = qc_sum.to_gate()
|
123
|
+
|
124
|
+
# handle all cases for the first qubits, depending on whether cin is available
|
125
|
+
i = 0
|
126
|
+
if kind == "half":
|
127
|
+
i += 1
|
128
|
+
circuit.ccx(qr_a[0], qr_b[0], carries[0])
|
129
|
+
elif kind == "fixed":
|
130
|
+
i += 1
|
131
|
+
if num_state_qubits == 1:
|
132
|
+
circuit.cx(qr_a[0], qr_b[0])
|
133
|
+
else:
|
134
|
+
circuit.ccx(qr_a[0], qr_b[0], carries[0])
|
135
|
+
|
136
|
+
for inp, out in zip(carries[:-1], carries[1:]):
|
137
|
+
circuit.append(carry_gate, [inp, qr_a[i], qr_b[i], out])
|
138
|
+
i += 1
|
139
|
+
|
140
|
+
if kind in ["full", "half"]: # final CX (cancels for the 'fixed' case)
|
141
|
+
circuit.cx(qr_a[-1], qr_b[-1])
|
142
|
+
|
143
|
+
if len(carries) > 1:
|
144
|
+
circuit.append(sum_gate, [carries[-2], qr_a[-1], qr_b[-1]])
|
145
|
+
|
146
|
+
i -= 2
|
147
|
+
for j, (inp, out) in enumerate(zip(reversed(carries[:-1]), reversed(carries[1:]))):
|
148
|
+
if j == 0:
|
149
|
+
if kind == "fixed":
|
150
|
+
i += 1
|
151
|
+
else:
|
152
|
+
continue
|
153
|
+
circuit.append(carry_gate_dg, [inp, qr_a[i], qr_b[i], out])
|
154
|
+
circuit.append(sum_gate, [inp, qr_a[i], qr_b[i]])
|
155
|
+
i -= 1
|
156
|
+
|
157
|
+
if kind in ["half", "fixed"] and num_state_qubits > 1:
|
158
|
+
circuit.ccx(qr_a[0], qr_b[0], carries[0])
|
159
|
+
circuit.cx(qr_a[0], qr_b[0])
|
160
|
+
|
161
|
+
return circuit
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 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
|
+
"""Comparator synthesis algorithms."""
|
14
|
+
|
15
|
+
from .compare_2s import synth_integer_comparator_2s
|
16
|
+
from .compare_greedy import synth_integer_comparator_greedy
|
@@ -0,0 +1,112 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 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
|
+
"""Integer comparator based on 2s complement."""
|
14
|
+
|
15
|
+
import math
|
16
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
17
|
+
from qiskit.circuit.library.boolean_logic.quantum_or import OrGate
|
18
|
+
|
19
|
+
|
20
|
+
def synth_integer_comparator_2s(
|
21
|
+
num_state_qubits: int, value: int, geq: bool = True
|
22
|
+
) -> QuantumCircuit:
|
23
|
+
r"""Implement an integer comparison based on 2s complement.
|
24
|
+
|
25
|
+
This is based on Appendix B of [1].
|
26
|
+
|
27
|
+
Args:
|
28
|
+
num_state_qubits: The number of qubits encoding the value to compare to.
|
29
|
+
value: The value to compare to.
|
30
|
+
geq: If ``True`` flip the target bit if the qubit state is :math:`\geq` than the value,
|
31
|
+
otherwise implement :math:`<`.
|
32
|
+
|
33
|
+
Returns:
|
34
|
+
A circuit implementing the integer comparator.
|
35
|
+
|
36
|
+
References:
|
37
|
+
|
38
|
+
[1] J. Gacon et al. "Quantum-enhanced simulation-based optimization"
|
39
|
+
`arXiv:2005.10780 <https://arxiv.org/abs/2005.10780>`__.
|
40
|
+
"""
|
41
|
+
circuit = QuantumCircuit(2 * num_state_qubits)
|
42
|
+
qr_state = circuit.qubits[:num_state_qubits]
|
43
|
+
q_compare = circuit.qubits[num_state_qubits]
|
44
|
+
qr_ancilla = circuit.qubits[num_state_qubits + 1 :]
|
45
|
+
|
46
|
+
if value <= 0: # condition always satisfied for non-positive values
|
47
|
+
if geq: # otherwise the condition is never satisfied
|
48
|
+
circuit.x(q_compare)
|
49
|
+
# condition never satisfied for values larger than or equal to 2^n
|
50
|
+
elif value < pow(2, num_state_qubits):
|
51
|
+
|
52
|
+
if num_state_qubits > 1:
|
53
|
+
twos = _get_twos_complement(num_state_qubits, value)
|
54
|
+
for i in range(num_state_qubits):
|
55
|
+
if i == 0:
|
56
|
+
if twos[i] == 1:
|
57
|
+
circuit.cx(qr_state[i], qr_ancilla[i])
|
58
|
+
elif i < num_state_qubits - 1:
|
59
|
+
if twos[i] == 1:
|
60
|
+
circuit.append(OrGate(2), [qr_state[i], qr_ancilla[i - 1], qr_ancilla[i]])
|
61
|
+
else:
|
62
|
+
circuit.ccx(qr_state[i], qr_ancilla[i - 1], qr_ancilla[i])
|
63
|
+
else:
|
64
|
+
if twos[i] == 1:
|
65
|
+
# OR needs the result argument as qubit not register, thus
|
66
|
+
# access the index [0]
|
67
|
+
circuit.append(OrGate(2), [qr_state[i], qr_ancilla[i - 1], q_compare])
|
68
|
+
else:
|
69
|
+
circuit.ccx(qr_state[i], qr_ancilla[i - 1], q_compare)
|
70
|
+
|
71
|
+
# flip result bit if geq flag is false
|
72
|
+
if not geq:
|
73
|
+
circuit.x(q_compare)
|
74
|
+
|
75
|
+
# uncompute ancillas state
|
76
|
+
for i in reversed(range(num_state_qubits - 1)):
|
77
|
+
if i == 0:
|
78
|
+
if twos[i] == 1:
|
79
|
+
circuit.cx(qr_state[i], qr_ancilla[i])
|
80
|
+
else:
|
81
|
+
if twos[i] == 1:
|
82
|
+
circuit.append(OrGate(2), [qr_state[i], qr_ancilla[i - 1], qr_ancilla[i]])
|
83
|
+
else:
|
84
|
+
circuit.ccx(qr_state[i], qr_ancilla[i - 1], qr_ancilla[i])
|
85
|
+
else:
|
86
|
+
|
87
|
+
# num_state_qubits == 1 and value == 1:
|
88
|
+
circuit.cx(qr_state[0], q_compare)
|
89
|
+
|
90
|
+
# flip result bit if geq flag is false
|
91
|
+
if not geq:
|
92
|
+
circuit.x(q_compare)
|
93
|
+
|
94
|
+
else:
|
95
|
+
if not geq: # otherwise the condition is never satisfied
|
96
|
+
circuit.x(q_compare)
|
97
|
+
|
98
|
+
return circuit
|
99
|
+
|
100
|
+
|
101
|
+
def _get_twos_complement(num_bits: int, value: int) -> list[int]:
|
102
|
+
"""Returns the 2's complement of ``self.value`` as array.
|
103
|
+
|
104
|
+
Returns:
|
105
|
+
The 2's complement of ``self.value``.
|
106
|
+
"""
|
107
|
+
twos_complement = pow(2, num_bits) - math.ceil(value)
|
108
|
+
twos_complement = f"{twos_complement:b}".rjust(num_bits, "0")
|
109
|
+
twos_complement = [
|
110
|
+
1 if twos_complement[i] == "1" else 0 for i in reversed(range(len(twos_complement)))
|
111
|
+
]
|
112
|
+
return twos_complement
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 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
|
+
"""Integer comparator based on an exponential number of multi-controlled gates."""
|
14
|
+
|
15
|
+
import numpy as np
|
16
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
17
|
+
|
18
|
+
|
19
|
+
def synth_integer_comparator_greedy(
|
20
|
+
num_state_qubits: int, value: int, geq: bool = True
|
21
|
+
) -> QuantumCircuit:
|
22
|
+
r"""Implement an integer comparison based on value-by-value comparison.
|
23
|
+
|
24
|
+
For ``value`` smaller than ``2 ** (num_state_qubits - 1)`` this circuit implements
|
25
|
+
``value`` multi-controlled gates with control states 0, 1, ..., ``value - 1``, such that
|
26
|
+
the target qubit is flipped if the qubit state represents any of the allowed values.
|
27
|
+
For ``value`` larger than that, ``geq`` is flipped. This implementation can
|
28
|
+
require an exponential number of gates. If auxiliary qubits are available, the implementation
|
29
|
+
provided by :func:`.synth_integer_comparator_2s` is more efficient.
|
30
|
+
|
31
|
+
Args:
|
32
|
+
num_state_qubits: The number of qubits encoding the value to compare to.
|
33
|
+
value: The value to compare to.
|
34
|
+
geq: If ``True`` flip the target bit if the qubit state is :math:`\geq` than the value,
|
35
|
+
otherwise implement :math:`<`.
|
36
|
+
|
37
|
+
Returns:
|
38
|
+
A circuit implementing the integer comparator.
|
39
|
+
|
40
|
+
"""
|
41
|
+
circuit = QuantumCircuit(num_state_qubits + 1)
|
42
|
+
|
43
|
+
if value <= 0: # condition always satisfied for non-positive values
|
44
|
+
if geq: # otherwise the condition is never satisfied
|
45
|
+
circuit.x(num_state_qubits)
|
46
|
+
|
47
|
+
return circuit
|
48
|
+
|
49
|
+
# make sure to always choose the comparison where we have to place less than
|
50
|
+
# (2 ** n)/2 MCX gates
|
51
|
+
value = int(np.ceil(value))
|
52
|
+
if (value < 2 ** (num_state_qubits - 1) and geq) or (
|
53
|
+
value > 2 ** (num_state_qubits - 1) and not geq
|
54
|
+
):
|
55
|
+
geq = not geq
|
56
|
+
circuit.x(num_state_qubits)
|
57
|
+
|
58
|
+
if geq:
|
59
|
+
accepted_values = range(value, 2**num_state_qubits)
|
60
|
+
else:
|
61
|
+
accepted_values = range(0, value)
|
62
|
+
|
63
|
+
for accepted_value in accepted_values:
|
64
|
+
circuit.mcx(list(range(num_state_qubits)), num_state_qubits, ctrl_state=accepted_value)
|
65
|
+
|
66
|
+
return circuit
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2021.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""The multiplier circuit library."""
|
14
|
+
|
15
|
+
from .hrs_cumulative_multiplier import multiplier_cumulative_h18
|
16
|
+
from .rg_qft_multiplier import multiplier_qft_r17
|