qiskit 2.1.0rc1__cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -0
- qiskit/__init__.py +159 -0
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +73 -0
- qiskit/circuit/__init__.py +1335 -0
- qiskit/circuit/_add_control.py +338 -0
- qiskit/circuit/_classical_resource_map.py +154 -0
- qiskit/circuit/_standard_gates_commutations.py +3849 -0
- qiskit/circuit/_utils.py +167 -0
- qiskit/circuit/annotated_operation.py +279 -0
- qiskit/circuit/annotation.py +404 -0
- qiskit/circuit/barrier.py +46 -0
- qiskit/circuit/classical/__init__.py +41 -0
- qiskit/circuit/classical/expr/__init__.py +266 -0
- qiskit/circuit/classical/expr/constructors.py +764 -0
- qiskit/circuit/classical/expr/expr.py +156 -0
- qiskit/circuit/classical/expr/visitors.py +381 -0
- qiskit/circuit/classical/types/__init__.py +113 -0
- qiskit/circuit/classical/types/ordering.py +229 -0
- qiskit/circuit/classical/types/types.py +30 -0
- qiskit/circuit/commutation_checker.py +133 -0
- qiskit/circuit/commutation_library.py +20 -0
- qiskit/circuit/controlflow/__init__.py +59 -0
- qiskit/circuit/controlflow/_builder_utils.py +211 -0
- qiskit/circuit/controlflow/box.py +188 -0
- qiskit/circuit/controlflow/break_loop.py +56 -0
- qiskit/circuit/controlflow/builder.py +791 -0
- qiskit/circuit/controlflow/continue_loop.py +56 -0
- qiskit/circuit/controlflow/control_flow.py +94 -0
- qiskit/circuit/controlflow/for_loop.py +218 -0
- qiskit/circuit/controlflow/if_else.py +498 -0
- qiskit/circuit/controlflow/switch_case.py +411 -0
- qiskit/circuit/controlflow/while_loop.py +166 -0
- qiskit/circuit/controlledgate.py +274 -0
- qiskit/circuit/delay.py +159 -0
- qiskit/circuit/duration.py +80 -0
- qiskit/circuit/equivalence.py +94 -0
- qiskit/circuit/equivalence_library.py +18 -0
- qiskit/circuit/exceptions.py +19 -0
- qiskit/circuit/gate.py +261 -0
- qiskit/circuit/instruction.py +564 -0
- qiskit/circuit/instructionset.py +132 -0
- qiskit/circuit/library/__init__.py +984 -0
- qiskit/circuit/library/arithmetic/__init__.py +40 -0
- qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +235 -0
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +131 -0
- qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
- qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -0
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +201 -0
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +506 -0
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +395 -0
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +501 -0
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
- qiskit/circuit/library/arithmetic/quadratic_form.py +370 -0
- qiskit/circuit/library/arithmetic/weighted_adder.py +428 -0
- qiskit/circuit/library/basis_change/__init__.py +15 -0
- qiskit/circuit/library/basis_change/qft.py +316 -0
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +322 -0
- qiskit/circuit/library/boolean_logic/__init__.py +18 -0
- qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
- qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
- qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
- qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -0
- qiskit/circuit/library/data_preparation/__init__.py +57 -0
- qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
- qiskit/circuit/library/data_preparation/initializer.py +107 -0
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
- qiskit/circuit/library/fourier_checking.py +160 -0
- qiskit/circuit/library/generalized_gates/__init__.py +30 -0
- qiskit/circuit/library/generalized_gates/diagonal.py +163 -0
- qiskit/circuit/library/generalized_gates/gms.py +179 -0
- qiskit/circuit/library/generalized_gates/gr.py +219 -0
- qiskit/circuit/library/generalized_gates/isometry.py +370 -0
- qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
- qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
- qiskit/circuit/library/generalized_gates/pauli.py +84 -0
- qiskit/circuit/library/generalized_gates/permutation.py +202 -0
- qiskit/circuit/library/generalized_gates/rv.py +96 -0
- qiskit/circuit/library/generalized_gates/uc.py +303 -0
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
- qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
- qiskit/circuit/library/generalized_gates/ucry.py +32 -0
- qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
- qiskit/circuit/library/generalized_gates/unitary.py +236 -0
- qiskit/circuit/library/graph_state.py +172 -0
- qiskit/circuit/library/grover_operator.py +583 -0
- qiskit/circuit/library/hamiltonian_gate.py +142 -0
- qiskit/circuit/library/hidden_linear_function.py +163 -0
- qiskit/circuit/library/iqp.py +180 -0
- qiskit/circuit/library/n_local/__init__.py +45 -0
- qiskit/circuit/library/n_local/efficient_su2.py +282 -0
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +301 -0
- qiskit/circuit/library/n_local/n_local.py +1478 -0
- qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
- qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
- qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
- qiskit/circuit/library/n_local/two_local.py +289 -0
- qiskit/circuit/library/overlap.py +183 -0
- qiskit/circuit/library/pauli_evolution.py +202 -0
- qiskit/circuit/library/phase_estimation.py +177 -0
- qiskit/circuit/library/phase_oracle.py +239 -0
- qiskit/circuit/library/quantum_volume.py +179 -0
- qiskit/circuit/library/standard_gates/__init__.py +141 -0
- qiskit/circuit/library/standard_gates/dcx.py +76 -0
- qiskit/circuit/library/standard_gates/ecr.py +126 -0
- qiskit/circuit/library/standard_gates/equivalence_library.py +1936 -0
- qiskit/circuit/library/standard_gates/global_phase.py +83 -0
- qiskit/circuit/library/standard_gates/h.py +230 -0
- qiskit/circuit/library/standard_gates/i.py +76 -0
- qiskit/circuit/library/standard_gates/iswap.py +115 -0
- qiskit/circuit/library/standard_gates/p.py +415 -0
- qiskit/circuit/library/standard_gates/r.py +108 -0
- qiskit/circuit/library/standard_gates/rx.py +269 -0
- qiskit/circuit/library/standard_gates/rxx.py +165 -0
- qiskit/circuit/library/standard_gates/ry.py +268 -0
- qiskit/circuit/library/standard_gates/ryy.py +165 -0
- qiskit/circuit/library/standard_gates/rz.py +290 -0
- qiskit/circuit/library/standard_gates/rzx.py +211 -0
- qiskit/circuit/library/standard_gates/rzz.py +181 -0
- qiskit/circuit/library/standard_gates/s.py +424 -0
- qiskit/circuit/library/standard_gates/swap.py +268 -0
- qiskit/circuit/library/standard_gates/sx.py +303 -0
- qiskit/circuit/library/standard_gates/t.py +169 -0
- qiskit/circuit/library/standard_gates/u.py +379 -0
- qiskit/circuit/library/standard_gates/u1.py +466 -0
- qiskit/circuit/library/standard_gates/u2.py +145 -0
- qiskit/circuit/library/standard_gates/u3.py +412 -0
- qiskit/circuit/library/standard_gates/x.py +1335 -0
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +164 -0
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +197 -0
- qiskit/circuit/library/standard_gates/y.py +253 -0
- qiskit/circuit/library/standard_gates/z.py +331 -0
- qiskit/circuit/library/templates/__init__.py +92 -0
- qiskit/circuit/library/templates/clifford/__init__.py +33 -0
- qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
- qiskit/circuit/library/templates/nct/__init__.py +67 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
- qiskit/circuit/library/templates/rzx/__init__.py +25 -0
- qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
- qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
- qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
- qiskit/circuit/measure.py +53 -0
- qiskit/circuit/operation.py +68 -0
- qiskit/circuit/parameter.py +188 -0
- qiskit/circuit/parameterexpression.py +737 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +140 -0
- qiskit/circuit/quantumcircuit.py +7610 -0
- qiskit/circuit/quantumcircuitdata.py +137 -0
- qiskit/circuit/random/__init__.py +50 -0
- qiskit/circuit/random/utils.py +755 -0
- qiskit/circuit/reset.py +37 -0
- qiskit/circuit/singleton.py +600 -0
- qiskit/circuit/store.py +89 -0
- qiskit/circuit/tools/__init__.py +16 -0
- qiskit/circuit/tools/pi_check.py +185 -0
- qiskit/circuit/twirling.py +145 -0
- qiskit/compiler/__init__.py +27 -0
- qiskit/compiler/transpiler.py +375 -0
- qiskit/converters/__init__.py +74 -0
- qiskit/converters/circuit_to_dag.py +80 -0
- qiskit/converters/circuit_to_dagdependency.py +49 -0
- qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
- qiskit/converters/circuit_to_gate.py +107 -0
- qiskit/converters/circuit_to_instruction.py +142 -0
- qiskit/converters/dag_to_circuit.py +79 -0
- qiskit/converters/dag_to_dagdependency.py +54 -0
- qiskit/converters/dag_to_dagdependency_v2.py +43 -0
- qiskit/converters/dagdependency_to_circuit.py +40 -0
- qiskit/converters/dagdependency_to_dag.py +48 -0
- qiskit/dagcircuit/__init__.py +44 -0
- qiskit/dagcircuit/collect_blocks.py +403 -0
- qiskit/dagcircuit/dagcircuit.py +24 -0
- qiskit/dagcircuit/dagdependency.py +612 -0
- qiskit/dagcircuit/dagdependency_v2.py +566 -0
- qiskit/dagcircuit/dagdepnode.py +160 -0
- qiskit/dagcircuit/dagnode.py +193 -0
- qiskit/dagcircuit/exceptions.py +42 -0
- qiskit/exceptions.py +153 -0
- qiskit/passmanager/__init__.py +258 -0
- qiskit/passmanager/base_tasks.py +230 -0
- qiskit/passmanager/compilation_status.py +74 -0
- qiskit/passmanager/exceptions.py +19 -0
- qiskit/passmanager/flow_controllers.py +116 -0
- qiskit/passmanager/passmanager.py +353 -0
- qiskit/primitives/__init__.py +490 -0
- qiskit/primitives/backend_estimator_v2.py +530 -0
- qiskit/primitives/backend_sampler_v2.py +339 -0
- qiskit/primitives/base/__init__.py +20 -0
- qiskit/primitives/base/base_estimator.py +247 -0
- qiskit/primitives/base/base_primitive_job.py +78 -0
- qiskit/primitives/base/base_primitive_v1.py +45 -0
- qiskit/primitives/base/base_result_v1.py +65 -0
- qiskit/primitives/base/base_sampler.py +196 -0
- qiskit/primitives/base/estimator_result_v1.py +46 -0
- qiskit/primitives/base/sampler_result_v1.py +45 -0
- qiskit/primitives/base/validation_v1.py +250 -0
- qiskit/primitives/containers/__init__.py +26 -0
- qiskit/primitives/containers/bindings_array.py +391 -0
- qiskit/primitives/containers/bit_array.py +764 -0
- qiskit/primitives/containers/data_bin.py +172 -0
- qiskit/primitives/containers/estimator_pub.py +222 -0
- qiskit/primitives/containers/object_array.py +94 -0
- qiskit/primitives/containers/observables_array.py +380 -0
- qiskit/primitives/containers/primitive_result.py +53 -0
- qiskit/primitives/containers/pub_result.py +51 -0
- qiskit/primitives/containers/sampler_pub.py +193 -0
- qiskit/primitives/containers/sampler_pub_result.py +74 -0
- qiskit/primitives/containers/shape.py +129 -0
- qiskit/primitives/primitive_job.py +100 -0
- qiskit/primitives/statevector_estimator.py +175 -0
- qiskit/primitives/statevector_sampler.py +290 -0
- qiskit/primitives/utils.py +72 -0
- qiskit/providers/__init__.py +677 -0
- qiskit/providers/backend.py +364 -0
- qiskit/providers/basic_provider/__init__.py +47 -0
- qiskit/providers/basic_provider/basic_provider.py +121 -0
- qiskit/providers/basic_provider/basic_provider_job.py +65 -0
- qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
- qiskit/providers/basic_provider/basic_simulator.py +693 -0
- qiskit/providers/basic_provider/exceptions.py +30 -0
- qiskit/providers/exceptions.py +33 -0
- qiskit/providers/fake_provider/__init__.py +69 -0
- qiskit/providers/fake_provider/generic_backend_v2.py +376 -0
- qiskit/providers/fake_provider/utils/__init__.py +15 -0
- qiskit/providers/job.py +147 -0
- qiskit/providers/jobstatus.py +30 -0
- qiskit/providers/options.py +273 -0
- qiskit/providers/providerutils.py +110 -0
- qiskit/qasm/libs/dummy/stdgates.inc +75 -0
- qiskit/qasm/libs/qelib1.inc +266 -0
- qiskit/qasm/libs/stdgates.inc +82 -0
- qiskit/qasm2/__init__.py +669 -0
- qiskit/qasm2/exceptions.py +27 -0
- qiskit/qasm2/export.py +364 -0
- qiskit/qasm2/parse.py +438 -0
- qiskit/qasm3/__init__.py +466 -0
- qiskit/qasm3/ast.py +796 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1363 -0
- qiskit/qasm3/printer.py +620 -0
- qiskit/qpy/__init__.py +2141 -0
- qiskit/qpy/binary_io/__init__.py +35 -0
- qiskit/qpy/binary_io/circuits.py +1687 -0
- qiskit/qpy/binary_io/parse_sympy_repr.py +126 -0
- qiskit/qpy/binary_io/schedules.py +288 -0
- qiskit/qpy/binary_io/value.py +1183 -0
- qiskit/qpy/common.py +361 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +458 -0
- qiskit/qpy/interface.py +384 -0
- qiskit/qpy/type_keys.py +415 -0
- qiskit/quantum_info/__init__.py +172 -0
- qiskit/quantum_info/analysis/__init__.py +17 -0
- qiskit/quantum_info/analysis/average.py +47 -0
- qiskit/quantum_info/analysis/distance.py +104 -0
- qiskit/quantum_info/analysis/make_observable.py +44 -0
- qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
- qiskit/quantum_info/operators/__init__.py +29 -0
- qiskit/quantum_info/operators/base_operator.py +145 -0
- qiskit/quantum_info/operators/channel/__init__.py +29 -0
- qiskit/quantum_info/operators/channel/chi.py +191 -0
- qiskit/quantum_info/operators/channel/choi.py +218 -0
- qiskit/quantum_info/operators/channel/kraus.py +337 -0
- qiskit/quantum_info/operators/channel/ptm.py +204 -0
- qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
- qiskit/quantum_info/operators/channel/stinespring.py +296 -0
- qiskit/quantum_info/operators/channel/superop.py +373 -0
- qiskit/quantum_info/operators/channel/transformations.py +490 -0
- qiskit/quantum_info/operators/custom_iterator.py +48 -0
- qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
- qiskit/quantum_info/operators/dihedral/dihedral.py +511 -0
- qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
- qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
- qiskit/quantum_info/operators/dihedral/random.py +64 -0
- qiskit/quantum_info/operators/linear_op.py +25 -0
- qiskit/quantum_info/operators/measures.py +418 -0
- qiskit/quantum_info/operators/mixins/__init__.py +52 -0
- qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
- qiskit/quantum_info/operators/mixins/group.py +171 -0
- qiskit/quantum_info/operators/mixins/linear.py +84 -0
- qiskit/quantum_info/operators/mixins/multiply.py +62 -0
- qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
- qiskit/quantum_info/operators/op_shape.py +525 -0
- qiskit/quantum_info/operators/operator.py +869 -0
- qiskit/quantum_info/operators/operator_utils.py +76 -0
- qiskit/quantum_info/operators/predicates.py +183 -0
- qiskit/quantum_info/operators/random.py +154 -0
- qiskit/quantum_info/operators/scalar_op.py +254 -0
- qiskit/quantum_info/operators/symplectic/__init__.py +24 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
- qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +584 -0
- qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
- qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -0
- qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
- qiskit/quantum_info/operators/symplectic/random.py +117 -0
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1239 -0
- qiskit/quantum_info/operators/utils/__init__.py +20 -0
- qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
- qiskit/quantum_info/operators/utils/commutator.py +36 -0
- qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
- qiskit/quantum_info/quaternion.py +156 -0
- qiskit/quantum_info/random.py +26 -0
- qiskit/quantum_info/states/__init__.py +28 -0
- qiskit/quantum_info/states/densitymatrix.py +857 -0
- qiskit/quantum_info/states/measures.py +288 -0
- qiskit/quantum_info/states/quantum_state.py +503 -0
- qiskit/quantum_info/states/random.py +157 -0
- qiskit/quantum_info/states/stabilizerstate.py +805 -0
- qiskit/quantum_info/states/statevector.py +977 -0
- qiskit/quantum_info/states/utils.py +247 -0
- qiskit/result/__init__.py +61 -0
- qiskit/result/counts.py +189 -0
- qiskit/result/distributions/__init__.py +17 -0
- qiskit/result/distributions/probability.py +100 -0
- qiskit/result/distributions/quasi.py +154 -0
- qiskit/result/exceptions.py +40 -0
- qiskit/result/models.py +241 -0
- qiskit/result/postprocess.py +239 -0
- qiskit/result/result.py +385 -0
- qiskit/result/sampled_expval.py +76 -0
- qiskit/result/utils.py +294 -0
- qiskit/synthesis/__init__.py +250 -0
- qiskit/synthesis/arithmetic/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +107 -0
- qiskit/synthesis/arithmetic/adders/rv_ripple_carry_adder.py +156 -0
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
- qiskit/synthesis/arithmetic/comparators/__init__.py +16 -0
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/synthesis/boolean/__init__.py +13 -0
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/clifford/__init__.py +19 -0
- qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
- qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
- qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
- qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
- qiskit/synthesis/cnotdihedral/__init__.py +17 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
- qiskit/synthesis/discrete_basis/__init__.py +16 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +53 -0
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +280 -0
- qiskit/synthesis/evolution/__init__.py +21 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +123 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +316 -0
- qiskit/synthesis/evolution/qdrift.py +133 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +227 -0
- qiskit/synthesis/linear/__init__.py +26 -0
- qiskit/synthesis/linear/cnot_synth.py +69 -0
- qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
- qiskit/synthesis/linear/linear_depth_lnn.py +61 -0
- qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
- qiskit/synthesis/linear_phase/__init__.py +17 -0
- qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +61 -0
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
- qiskit/synthesis/multi_controlled/__init__.py +29 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +583 -0
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +205 -0
- qiskit/synthesis/one_qubit/__init__.py +15 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
- qiskit/synthesis/permutation/__init__.py +18 -0
- qiskit/synthesis/permutation/permutation_full.py +78 -0
- qiskit/synthesis/permutation/permutation_lnn.py +54 -0
- qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
- qiskit/synthesis/permutation/permutation_utils.py +16 -0
- qiskit/synthesis/qft/__init__.py +16 -0
- qiskit/synthesis/qft/qft_decompose_full.py +97 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +61 -0
- qiskit/synthesis/stabilizer/__init__.py +16 -0
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
- qiskit/synthesis/two_qubit/__init__.py +20 -0
- qiskit/synthesis/two_qubit/local_invariance.py +63 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +583 -0
- qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
- qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
- qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
- qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
- qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
- qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
- qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
- qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
- qiskit/synthesis/unitary/__init__.py +13 -0
- qiskit/synthesis/unitary/aqc/__init__.py +177 -0
- qiskit/synthesis/unitary/aqc/approximate.py +116 -0
- qiskit/synthesis/unitary/aqc/aqc.py +175 -0
- qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
- qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
- qiskit/synthesis/unitary/qsd.py +359 -0
- qiskit/transpiler/__init__.py +1352 -0
- qiskit/transpiler/basepasses.py +190 -0
- qiskit/transpiler/coupling.py +500 -0
- qiskit/transpiler/exceptions.py +59 -0
- qiskit/transpiler/instruction_durations.py +263 -0
- qiskit/transpiler/layout.py +740 -0
- qiskit/transpiler/passes/__init__.py +278 -0
- qiskit/transpiler/passes/analysis/__init__.py +23 -0
- qiskit/transpiler/passes/analysis/count_ops.py +30 -0
- qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
- qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
- qiskit/transpiler/passes/analysis/depth.py +33 -0
- qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
- qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
- qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
- qiskit/transpiler/passes/analysis/size.py +36 -0
- qiskit/transpiler/passes/analysis/width.py +27 -0
- qiskit/transpiler/passes/basis/__init__.py +19 -0
- qiskit/transpiler/passes/basis/basis_translator.py +138 -0
- qiskit/transpiler/passes/basis/decompose.py +137 -0
- qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +84 -0
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +110 -0
- qiskit/transpiler/passes/layout/__init__.py +26 -0
- qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
- qiskit/transpiler/passes/layout/apply_layout.py +128 -0
- qiskit/transpiler/passes/layout/csp_layout.py +132 -0
- qiskit/transpiler/passes/layout/dense_layout.py +197 -0
- qiskit/transpiler/passes/layout/disjoint_utils.py +54 -0
- qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +116 -0
- qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
- qiskit/transpiler/passes/layout/sabre_layout.py +525 -0
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
- qiskit/transpiler/passes/layout/set_layout.py +69 -0
- qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
- qiskit/transpiler/passes/layout/vf2_layout.py +292 -0
- qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
- qiskit/transpiler/passes/layout/vf2_utils.py +245 -0
- qiskit/transpiler/passes/optimization/__init__.py +42 -0
- qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
- qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
- qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +117 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +109 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +85 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +242 -0
- qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
- qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
- qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +176 -0
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
- qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +267 -0
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +251 -0
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
- qiskit/transpiler/passes/optimization/optimize_annotated.py +449 -0
- qiskit/transpiler/passes/optimization/optimize_clifford_t.py +68 -0
- qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
- qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
- qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
- qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +70 -0
- qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -0
- qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
- qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
- qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +633 -0
- qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
- qiskit/transpiler/passes/routing/__init__.py +21 -0
- qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
- qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
- qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
- qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
- qiskit/transpiler/passes/routing/basic_swap.py +166 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +397 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
- qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
- qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
- qiskit/transpiler/passes/routing/sabre_swap.py +465 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +433 -0
- qiskit/transpiler/passes/routing/utils.py +35 -0
- qiskit/transpiler/passes/scheduling/__init__.py +21 -0
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
- qiskit/transpiler/passes/scheduling/padding/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
- qiskit/transpiler/passes/scheduling/padding/context_aware_dynamical_decoupling.py +876 -0
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
- qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
- qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
- qiskit/transpiler/passes/synthesis/__init__.py +21 -0
- qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
- qiskit/transpiler/passes/synthesis/clifford_unitary_synth_plugin.py +123 -0
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
- qiskit/transpiler/passes/synthesis/hls_plugins.py +2338 -0
- qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
- qiskit/transpiler/passes/synthesis/plugin.py +738 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +318 -0
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
- qiskit/transpiler/passes/utils/__init__.py +32 -0
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
- qiskit/transpiler/passes/utils/check_gate_direction.py +60 -0
- qiskit/transpiler/passes/utils/check_map.py +78 -0
- qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
- qiskit/transpiler/passes/utils/control_flow.py +61 -0
- qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
- qiskit/transpiler/passes/utils/error.py +69 -0
- qiskit/transpiler/passes/utils/filter_op_nodes.py +66 -0
- qiskit/transpiler/passes/utils/fixed_point.py +48 -0
- qiskit/transpiler/passes/utils/gate_direction.py +93 -0
- qiskit/transpiler/passes/utils/gates_basis.py +51 -0
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
- qiskit/transpiler/passes/utils/minimum_point.py +118 -0
- qiskit/transpiler/passes/utils/remove_barriers.py +50 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
- qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
- qiskit/transpiler/passmanager.py +503 -0
- qiskit/transpiler/passmanager_config.py +154 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1114 -0
- qiskit/transpiler/preset_passmanagers/common.py +773 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +443 -0
- qiskit/transpiler/preset_passmanagers/level0.py +104 -0
- qiskit/transpiler/preset_passmanagers/level1.py +108 -0
- qiskit/transpiler/preset_passmanagers/level2.py +109 -0
- qiskit/transpiler/preset_passmanagers/level3.py +110 -0
- qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
- qiskit/transpiler/target.py +905 -0
- qiskit/transpiler/timing_constraints.py +59 -0
- qiskit/user_config.py +266 -0
- qiskit/utils/__init__.py +90 -0
- qiskit/utils/classtools.py +146 -0
- qiskit/utils/deprecation.py +382 -0
- qiskit/utils/lazy_tester.py +363 -0
- qiskit/utils/optionals.py +355 -0
- qiskit/utils/parallel.py +318 -0
- qiskit/utils/units.py +146 -0
- qiskit/version.py +84 -0
- qiskit/visualization/__init__.py +290 -0
- qiskit/visualization/array.py +207 -0
- qiskit/visualization/bloch.py +778 -0
- qiskit/visualization/circuit/__init__.py +15 -0
- qiskit/visualization/circuit/_utils.py +677 -0
- qiskit/visualization/circuit/circuit_visualization.py +735 -0
- qiskit/visualization/circuit/latex.py +668 -0
- qiskit/visualization/circuit/matplotlib.py +2041 -0
- qiskit/visualization/circuit/qcstyle.py +130 -0
- qiskit/visualization/circuit/styles/__init__.py +13 -0
- qiskit/visualization/circuit/styles/bw.json +202 -0
- qiskit/visualization/circuit/styles/clifford.json +202 -0
- qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
- qiskit/visualization/circuit/styles/iqp.json +214 -0
- qiskit/visualization/circuit/styles/textbook.json +202 -0
- qiskit/visualization/circuit/text.py +1849 -0
- qiskit/visualization/circuit_visualization.py +19 -0
- qiskit/visualization/counts_visualization.py +487 -0
- qiskit/visualization/dag/__init__.py +13 -0
- qiskit/visualization/dag/dagstyle.py +103 -0
- qiskit/visualization/dag/styles/__init__.py +13 -0
- qiskit/visualization/dag/styles/color.json +10 -0
- qiskit/visualization/dag/styles/plain.json +5 -0
- qiskit/visualization/dag_visualization.py +389 -0
- qiskit/visualization/exceptions.py +21 -0
- qiskit/visualization/gate_map.py +1424 -0
- qiskit/visualization/library.py +40 -0
- qiskit/visualization/pass_manager_visualization.py +312 -0
- qiskit/visualization/state_visualization.py +1546 -0
- qiskit/visualization/style.py +223 -0
- qiskit/visualization/timeline/__init__.py +21 -0
- qiskit/visualization/timeline/core.py +495 -0
- qiskit/visualization/timeline/drawings.py +260 -0
- qiskit/visualization/timeline/generators.py +506 -0
- qiskit/visualization/timeline/interface.py +444 -0
- qiskit/visualization/timeline/layouts.py +115 -0
- qiskit/visualization/timeline/plotters/__init__.py +16 -0
- qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
- qiskit/visualization/timeline/plotters/matplotlib.py +195 -0
- qiskit/visualization/timeline/stylesheet.py +301 -0
- qiskit/visualization/timeline/types.py +148 -0
- qiskit/visualization/transition_visualization.py +369 -0
- qiskit/visualization/utils.py +49 -0
- qiskit-2.1.0rc1.dist-info/METADATA +221 -0
- qiskit-2.1.0rc1.dist-info/RECORD +699 -0
- qiskit-2.1.0rc1.dist-info/WHEEL +6 -0
- qiskit-2.1.0rc1.dist-info/entry_points.txt +88 -0
- qiskit-2.1.0rc1.dist-info/licenses/LICENSE.txt +203 -0
- qiskit-2.1.0rc1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,40 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 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 arithmetic circuit library."""
|
14
|
+
|
15
|
+
from .functional_pauli_rotations import FunctionalPauliRotations
|
16
|
+
from .integer_comparator import IntegerComparator, IntegerComparatorGate
|
17
|
+
from .linear_pauli_rotations import LinearPauliRotations, LinearPauliRotationsGate
|
18
|
+
from .piecewise_linear_pauli_rotations import (
|
19
|
+
PiecewiseLinearPauliRotations,
|
20
|
+
PiecewiseLinearPauliRotationsGate,
|
21
|
+
)
|
22
|
+
from .piecewise_polynomial_pauli_rotations import (
|
23
|
+
PiecewisePolynomialPauliRotations,
|
24
|
+
PiecewisePolynomialPauliRotationsGate,
|
25
|
+
)
|
26
|
+
from .polynomial_pauli_rotations import PolynomialPauliRotations, PolynomialPauliRotationsGate
|
27
|
+
from .weighted_adder import WeightedAdder, WeightedSumGate
|
28
|
+
from .quadratic_form import QuadraticForm, QuadraticFormGate
|
29
|
+
from .linear_amplitude_function import LinearAmplitudeFunction, LinearAmplitudeFunctionGate
|
30
|
+
from .piecewise_chebyshev import PiecewiseChebyshev, PiecewiseChebyshevGate
|
31
|
+
from .exact_reciprocal import ExactReciprocal, ExactReciprocalGate
|
32
|
+
from .adders import (
|
33
|
+
VBERippleCarryAdder,
|
34
|
+
CDKMRippleCarryAdder,
|
35
|
+
DraperQFTAdder,
|
36
|
+
ModularAdderGate,
|
37
|
+
HalfAdderGate,
|
38
|
+
FullAdderGate,
|
39
|
+
)
|
40
|
+
from .multipliers import HRSCumulativeMultiplier, RGQFTMultiplier, MultiplierGate
|
@@ -0,0 +1,18 @@
|
|
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 adder circuit library."""
|
14
|
+
|
15
|
+
from .cdkm_ripple_carry_adder import CDKMRippleCarryAdder
|
16
|
+
from .draper_qft_adder import DraperQFTAdder
|
17
|
+
from .vbe_ripple_carry_adder import VBERippleCarryAdder
|
18
|
+
from .adder import ModularAdderGate, HalfAdderGate, FullAdderGate
|
@@ -0,0 +1,235 @@
|
|
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 equally sized qubit registers."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from qiskit.circuit import QuantumCircuit, Gate
|
18
|
+
from qiskit.utils.deprecation import deprecate_func
|
19
|
+
|
20
|
+
|
21
|
+
class Adder(QuantumCircuit):
|
22
|
+
r"""Compute the sum of two equally sized qubit registers.
|
23
|
+
|
24
|
+
For two registers :math:`|a\rangle_n` and :math:`|b\rangle_n` with :math:`n` qubits each, an
|
25
|
+
adder performs the following operation
|
26
|
+
|
27
|
+
.. math::
|
28
|
+
|
29
|
+
|a\rangle_n |b\rangle_n \mapsto |a\rangle_n |a + b\rangle_{n + 1}.
|
30
|
+
|
31
|
+
The quantum register :math:`|a\rangle_n` (and analogously :math:`|b\rangle_n`)
|
32
|
+
|
33
|
+
.. math::
|
34
|
+
|
35
|
+
|a\rangle_n = |a_0\rangle \otimes \cdots \otimes |a_{n - 1}\rangle,
|
36
|
+
|
37
|
+
for :math:`a_i \in \{0, 1\}`, is associated with the integer value
|
38
|
+
|
39
|
+
.. math::
|
40
|
+
|
41
|
+
a = 2^{0}a_{0} + 2^{1}a_{1} + \cdots + 2^{n - 1}a_{n - 1}.
|
42
|
+
|
43
|
+
"""
|
44
|
+
|
45
|
+
@deprecate_func(
|
46
|
+
since="2.1",
|
47
|
+
additional_msg=(
|
48
|
+
"Use the adder gates provided in qiskit.circuit.library.arithmetic instead. "
|
49
|
+
"The gate type depends on the adder kind: fixed, half, full are represented by "
|
50
|
+
"ModularAdderGate, HalfAdderGate, FullAdderGate, respectively. For different adder "
|
51
|
+
"implementations, see https://quantum.cloud.ibm.com/docs/api/qiskit/synthesis.",
|
52
|
+
),
|
53
|
+
removal_timeline="in Qiskit 3.0",
|
54
|
+
)
|
55
|
+
def __init__(self, num_state_qubits: int, name: str = "Adder") -> None:
|
56
|
+
"""
|
57
|
+
Args:
|
58
|
+
num_state_qubits: The number of qubits in each of the registers.
|
59
|
+
name: The name of the circuit.
|
60
|
+
"""
|
61
|
+
super().__init__(name=name)
|
62
|
+
self._num_state_qubits = num_state_qubits
|
63
|
+
|
64
|
+
@property
|
65
|
+
def num_state_qubits(self) -> int:
|
66
|
+
"""The number of state qubits, i.e. the number of bits in each input register.
|
67
|
+
|
68
|
+
Returns:
|
69
|
+
The number of state qubits.
|
70
|
+
"""
|
71
|
+
return self._num_state_qubits
|
72
|
+
|
73
|
+
|
74
|
+
class HalfAdderGate(Gate):
|
75
|
+
r"""Compute the sum of two equally-sized qubit registers, including a carry-out bit.
|
76
|
+
|
77
|
+
For two registers :math:`|a\rangle_n` and :math:`|b\rangle_n` with :math:`n` qubits each, an
|
78
|
+
adder performs the following operation
|
79
|
+
|
80
|
+
.. math::
|
81
|
+
|
82
|
+
|a\rangle_n |b\rangle_n \mapsto |a\rangle_n |a + b\rangle_{n + 1}.
|
83
|
+
|
84
|
+
The quantum register :math:`|a\rangle_n` (and analogously :math:`|b\rangle_n`)
|
85
|
+
|
86
|
+
.. math::
|
87
|
+
|
88
|
+
|a\rangle_n = |a_0\rangle \otimes \cdots \otimes |a_{n - 1}\rangle,
|
89
|
+
|
90
|
+
for :math:`a_i \in \{0, 1\}`, is associated with the integer value
|
91
|
+
|
92
|
+
.. math::
|
93
|
+
|
94
|
+
a = 2^{0}a_{0} + 2^{1}a_{1} + \cdots + 2^{n - 1}a_{n - 1}.
|
95
|
+
|
96
|
+
"""
|
97
|
+
|
98
|
+
def __init__(self, num_state_qubits: int, label: str | None = None) -> None:
|
99
|
+
"""
|
100
|
+
Args:
|
101
|
+
num_state_qubits: The number of qubits in each of the registers.
|
102
|
+
name: The name of the circuit.
|
103
|
+
"""
|
104
|
+
if num_state_qubits < 1:
|
105
|
+
raise ValueError("Need at least 1 state qubit.")
|
106
|
+
|
107
|
+
super().__init__("HalfAdder", 2 * num_state_qubits + 1, [], label=label)
|
108
|
+
self._num_state_qubits = num_state_qubits
|
109
|
+
|
110
|
+
@property
|
111
|
+
def num_state_qubits(self) -> int:
|
112
|
+
"""The number of state qubits, i.e. the number of bits in each input register.
|
113
|
+
|
114
|
+
Returns:
|
115
|
+
The number of state qubits.
|
116
|
+
"""
|
117
|
+
return self._num_state_qubits
|
118
|
+
|
119
|
+
def _define(self):
|
120
|
+
"""Populates self.definition with some decomposition of this gate."""
|
121
|
+
from qiskit.synthesis.arithmetic import adder_ripple_r25
|
122
|
+
|
123
|
+
# This particular decomposition does not use any ancilla qubits.
|
124
|
+
# Note that the transpiler may choose a different decomposition
|
125
|
+
# based on the number of ancilla qubits available.
|
126
|
+
self.definition = adder_ripple_r25(self.num_state_qubits)
|
127
|
+
|
128
|
+
|
129
|
+
class ModularAdderGate(Gate):
|
130
|
+
r"""Compute the sum modulo :math:`2^n` of two :math:`n`-sized qubit registers.
|
131
|
+
|
132
|
+
For two registers :math:`|a\rangle_n` and :math:`|b\rangle_n` with :math:`n` qubits each, an
|
133
|
+
adder performs the following operation
|
134
|
+
|
135
|
+
.. math::
|
136
|
+
|
137
|
+
|a\rangle_n |b\rangle_n \mapsto |a\rangle_n |a + b \text{ mod } 2^n\rangle_n.
|
138
|
+
|
139
|
+
The quantum register :math:`|a\rangle_n` (and analogously :math:`|b\rangle_n`)
|
140
|
+
|
141
|
+
.. math::
|
142
|
+
|
143
|
+
|a\rangle_n = |a_0\rangle \otimes \cdots \otimes |a_{n - 1}\rangle,
|
144
|
+
|
145
|
+
for :math:`a_i \in \{0, 1\}`, is associated with the integer value
|
146
|
+
|
147
|
+
.. math::
|
148
|
+
|
149
|
+
a = 2^{0}a_{0} + 2^{1}a_{1} + \cdots + 2^{n - 1}a_{n - 1}.
|
150
|
+
|
151
|
+
"""
|
152
|
+
|
153
|
+
def __init__(self, num_state_qubits: int, label: str | None = None) -> None:
|
154
|
+
"""
|
155
|
+
Args:
|
156
|
+
num_state_qubits: The number of qubits in each of the registers.
|
157
|
+
name: The name of the circuit.
|
158
|
+
"""
|
159
|
+
if num_state_qubits < 1:
|
160
|
+
raise ValueError("Need at least 1 state qubit.")
|
161
|
+
|
162
|
+
super().__init__("ModularAdder", 2 * num_state_qubits, [], label=label)
|
163
|
+
self._num_state_qubits = num_state_qubits
|
164
|
+
|
165
|
+
@property
|
166
|
+
def num_state_qubits(self) -> int:
|
167
|
+
"""The number of state qubits, i.e. the number of bits in each input register.
|
168
|
+
|
169
|
+
Returns:
|
170
|
+
The number of state qubits.
|
171
|
+
"""
|
172
|
+
return self._num_state_qubits
|
173
|
+
|
174
|
+
def _define(self):
|
175
|
+
"""Populates self.definition with some decomposition of this gate."""
|
176
|
+
from qiskit.synthesis.arithmetic import adder_qft_d00
|
177
|
+
|
178
|
+
# This particular decomposition does not use any ancilla qubits.
|
179
|
+
# Note that the transpiler may choose a different decomposition
|
180
|
+
# based on the number of ancilla qubits available.
|
181
|
+
self.definition = adder_qft_d00(self.num_state_qubits, kind="fixed")
|
182
|
+
|
183
|
+
|
184
|
+
class FullAdderGate(Gate):
|
185
|
+
r"""Compute the sum of two :math:`n`-sized qubit registers, including carry-in and -out bits.
|
186
|
+
|
187
|
+
For two registers :math:`|a\rangle_n` and :math:`|b\rangle_n` with :math:`n` qubits each, an
|
188
|
+
adder performs the following operation
|
189
|
+
|
190
|
+
.. math::
|
191
|
+
|
192
|
+
|c_{\text{in}}\rangle_1 |a\rangle_n |b\rangle_n
|
193
|
+
\mapsto |a\rangle_n |c_{\text{in}} + a + b \rangle_{n + 1}.
|
194
|
+
|
195
|
+
The quantum register :math:`|a\rangle_n` (and analogously :math:`|b\rangle_n`)
|
196
|
+
|
197
|
+
.. math::
|
198
|
+
|
199
|
+
|a\rangle_n = |a_0\rangle \otimes \cdots \otimes |a_{n - 1}\rangle,
|
200
|
+
|
201
|
+
for :math:`a_i \in \{0, 1\}`, is associated with the integer value
|
202
|
+
|
203
|
+
.. math::
|
204
|
+
|
205
|
+
a = 2^{0}a_{0} + 2^{1}a_{1} + \cdots + 2^{n - 1}a_{n - 1}.
|
206
|
+
|
207
|
+
"""
|
208
|
+
|
209
|
+
def __init__(self, num_state_qubits: int, label: str | None = None) -> None:
|
210
|
+
"""
|
211
|
+
Args:
|
212
|
+
num_state_qubits: The number of qubits in each of the registers.
|
213
|
+
name: The name of the circuit.
|
214
|
+
"""
|
215
|
+
if num_state_qubits < 1:
|
216
|
+
raise ValueError("Need at least 1 state qubit.")
|
217
|
+
|
218
|
+
super().__init__("FullAdder", 2 * num_state_qubits + 2, [], label=label)
|
219
|
+
self._num_state_qubits = num_state_qubits
|
220
|
+
|
221
|
+
@property
|
222
|
+
def num_state_qubits(self) -> int:
|
223
|
+
"""The number of state qubits, i.e. the number of bits in each input register.
|
224
|
+
|
225
|
+
Returns:
|
226
|
+
The number of state qubits.
|
227
|
+
"""
|
228
|
+
return self._num_state_qubits
|
229
|
+
|
230
|
+
def _define(self):
|
231
|
+
"""Populates self.definition with a decomposition of this gate."""
|
232
|
+
from qiskit.synthesis.arithmetic import adder_ripple_c04
|
233
|
+
|
234
|
+
# In the case of a full adder, this method does not use any ancilla qubits
|
235
|
+
self.definition = adder_ripple_c04(self.num_state_qubits, kind="full")
|
@@ -0,0 +1,123 @@
|
|
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.synthesis.arithmetic import adder_ripple_c04
|
16
|
+
from .adder import Adder
|
17
|
+
|
18
|
+
|
19
|
+
class CDKMRippleCarryAdder(Adder):
|
20
|
+
r"""A ripple-carry circuit to perform in-place addition on two qubit registers.
|
21
|
+
|
22
|
+
As an example, a ripple-carry adder circuit that performs addition on two 3-qubit sized
|
23
|
+
registers with a carry-in bit (``kind="full"``) is as follows:
|
24
|
+
|
25
|
+
.. code-block:: text
|
26
|
+
|
27
|
+
┌──────┐ ┌──────┐
|
28
|
+
cin_0: ┤2 ├─────────────────────────────────────┤2 ├
|
29
|
+
│ │┌──────┐ ┌──────┐│ │
|
30
|
+
a_0: ┤0 ├┤2 ├─────────────────────┤2 ├┤0 ├
|
31
|
+
│ ││ │┌──────┐ ┌──────┐│ ││ │
|
32
|
+
a_1: ┤ MAJ ├┤0 ├┤2 ├─────┤2 ├┤0 ├┤ UMA ├
|
33
|
+
│ ││ ││ │ │ ││ ││ │
|
34
|
+
a_2: ┤ ├┤ MAJ ├┤0 ├──■──┤0 ├┤ UMA ├┤ ├
|
35
|
+
│ ││ ││ │ │ │ ││ ││ │
|
36
|
+
b_0: ┤1 ├┤ ├┤ MAJ ├──┼──┤ UMA ├┤ ├┤1 ├
|
37
|
+
└──────┘│ ││ │ │ │ ││ │└──────┘
|
38
|
+
b_1: ────────┤1 ├┤ ├──┼──┤ ├┤1 ├────────
|
39
|
+
└──────┘│ │ │ │ │└──────┘
|
40
|
+
b_2: ────────────────┤1 ├──┼──┤1 ├────────────────
|
41
|
+
└──────┘┌─┴─┐└──────┘
|
42
|
+
cout_0: ────────────────────────┤ X ├────────────────────────
|
43
|
+
└───┘
|
44
|
+
|
45
|
+
Here *MAJ* and *UMA* gates correspond to the gates introduced in [1]. Note that
|
46
|
+
in this implementation the input register qubits are ordered as all qubits from
|
47
|
+
the first input register, followed by all qubits from the second input register.
|
48
|
+
|
49
|
+
Two different kinds of adders are supported. By setting the ``kind`` argument, you can also
|
50
|
+
choose a half-adder, which doesn't have a carry-in, and a fixed-sized-adder, which has neither
|
51
|
+
carry-in nor carry-out, and thus acts on fixed register sizes. Unlike the full-adder,
|
52
|
+
these circuits need one additional helper qubit.
|
53
|
+
|
54
|
+
The circuit diagram for the fixed-point adder (``kind="fixed"``) on 3-qubit sized inputs is
|
55
|
+
|
56
|
+
.. code-block:: text
|
57
|
+
|
58
|
+
┌──────┐┌──────┐ ┌──────┐┌──────┐
|
59
|
+
a_0: ┤0 ├┤2 ├────────────────┤2 ├┤0 ├
|
60
|
+
│ ││ │┌──────┐┌──────┐│ ││ │
|
61
|
+
a_1: ┤ ├┤0 ├┤2 ├┤2 ├┤0 ├┤ ├
|
62
|
+
│ ││ ││ ││ ││ ││ │
|
63
|
+
a_2: ┤ ├┤ MAJ ├┤0 ├┤0 ├┤ UMA ├┤ ├
|
64
|
+
│ ││ ││ ││ ││ ││ │
|
65
|
+
b_0: ┤1 MAJ ├┤ ├┤ MAJ ├┤ UMA ├┤ ├┤1 UMA ├
|
66
|
+
│ ││ ││ ││ ││ ││ │
|
67
|
+
b_1: ┤ ├┤1 ├┤ ├┤ ├┤1 ├┤ ├
|
68
|
+
│ │└──────┘│ ││ │└──────┘│ │
|
69
|
+
b_2: ┤ ├────────┤1 ├┤1 ├────────┤ ├
|
70
|
+
│ │ └──────┘└──────┘ │ │
|
71
|
+
help_0: ┤2 ├────────────────────────────────┤2 ├
|
72
|
+
└──────┘ └──────┘
|
73
|
+
|
74
|
+
It has one less qubit than the full-adder since it doesn't have the carry-out, but uses
|
75
|
+
a helper qubit instead of the carry-in, so it only has one less qubit, not two.
|
76
|
+
|
77
|
+
.. seealso::
|
78
|
+
|
79
|
+
The following generic gate objects perform additions, like this circuit class,
|
80
|
+
but allow the compiler to select the optimal decomposition based on the context.
|
81
|
+
Specific implementations can be set via the :class:`.HLSConfig`, e.g. this circuit
|
82
|
+
can be chosen via ``Adder=["ripple_c04"]``.
|
83
|
+
|
84
|
+
:class:`.ModularAdderGate`: A generic inplace adder, modulo :math:`2^n`. This
|
85
|
+
is functionally equivalent to ``kind="fixed"``.
|
86
|
+
|
87
|
+
:class:`.AdderGate`: A generic inplace adder. This
|
88
|
+
is functionally equivalent to ``kind="half"``.
|
89
|
+
|
90
|
+
:class:`.FullAdderGate`: A generic inplace adder, with a carry-in bit. This
|
91
|
+
is functionally equivalent to ``kind="full"``.
|
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
|
+
|
103
|
+
def __init__(
|
104
|
+
self, num_state_qubits: int, kind: str = "full", name: str = "CDKMRippleCarryAdder"
|
105
|
+
) -> None:
|
106
|
+
r"""
|
107
|
+
Args:
|
108
|
+
num_state_qubits: The number of qubits in either input register for
|
109
|
+
state :math:`|a\rangle` or :math:`|b\rangle`. The two input
|
110
|
+
registers must have the same number of qubits.
|
111
|
+
kind: The kind of adder, can be ``'full'`` for a full adder, ``'half'`` for a half
|
112
|
+
adder, or ``'fixed'`` for a fixed-sized adder. A full adder includes both carry-in
|
113
|
+
and carry-out, a half only carry-out, and a fixed-sized adder neither carry-in
|
114
|
+
nor carry-out.
|
115
|
+
name: The name of the circuit object.
|
116
|
+
Raises:
|
117
|
+
ValueError: If ``num_state_qubits`` is lower than 1.
|
118
|
+
"""
|
119
|
+
super().__init__(num_state_qubits, name=name)
|
120
|
+
circuit = adder_ripple_c04(num_state_qubits, kind)
|
121
|
+
|
122
|
+
self.add_register(*circuit.qregs)
|
123
|
+
self.append(circuit.to_gate(), self.qubits)
|
@@ -0,0 +1,129 @@
|
|
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 QFT
|
20
|
+
|
21
|
+
from .adder import Adder
|
22
|
+
|
23
|
+
|
24
|
+
class DraperQFTAdder(Adder):
|
25
|
+
r"""A circuit that uses QFT to perform in-place addition on two qubit registers.
|
26
|
+
|
27
|
+
For registers with :math:`n` qubits, the QFT adder can perform addition modulo
|
28
|
+
:math:`2^n` (with ``kind="fixed"``) or ordinary addition by adding a carry qubits (with
|
29
|
+
``kind="half"``).
|
30
|
+
|
31
|
+
As an example, a non-fixed_point QFT adder circuit that performs addition on two 2-qubit sized
|
32
|
+
registers is as follows:
|
33
|
+
|
34
|
+
.. code-block:: text
|
35
|
+
|
36
|
+
a_0: ─────────■──────■────────────────────────■────────────────
|
37
|
+
│ │ │
|
38
|
+
a_1: ─────────┼──────┼────────■──────■────────┼────────────────
|
39
|
+
┌──────┐ │P(π) │ │ │ │ ┌───────┐
|
40
|
+
b_0: ┤0 ├─■──────┼────────┼──────┼────────┼───────┤0 ├
|
41
|
+
│ │ │P(π/2) │P(π) │ │ │ │
|
42
|
+
b_1: ┤1 qft ├────────■────────■──────┼────────┼───────┤1 iqft ├
|
43
|
+
│ │ │P(π/2) │P(π/4) │ │
|
44
|
+
cout_0: ┤2 ├────────────────────────■────────■───────┤2 ├
|
45
|
+
└──────┘ └───────┘
|
46
|
+
|
47
|
+
.. seealso::
|
48
|
+
|
49
|
+
The following generic gate objects perform additions, like this circuit class,
|
50
|
+
but allow the compiler to select the optimal decomposition based on the context.
|
51
|
+
Specific implementations can be set via the :class:`.HLSConfig`, e.g. this
|
52
|
+
circuit can be chosen via ``Adder=["qft_d00"]``.
|
53
|
+
|
54
|
+
:class:`.ModularAdderGate`: A generic inplace adder, modulo :math:`2^n`. This
|
55
|
+
is functionally equivalent to ``kind="fixed"``.
|
56
|
+
|
57
|
+
:class:`.AdderGate`: A generic inplace adder. This
|
58
|
+
is functionally equivalent to ``kind="half"``.
|
59
|
+
|
60
|
+
**References:**
|
61
|
+
|
62
|
+
[1] T. G. Draper, Addition on a Quantum Computer, 2000.
|
63
|
+
`arXiv:quant-ph/0008033 <https://arxiv.org/pdf/quant-ph/0008033.pdf>`_
|
64
|
+
|
65
|
+
[2] Ruiz-Perez et al., Quantum arithmetic with the Quantum Fourier Transform, 2017.
|
66
|
+
`arXiv:1411.5949 <https://arxiv.org/pdf/1411.5949.pdf>`_
|
67
|
+
|
68
|
+
[3] Vedral et al., Quantum Networks for Elementary Arithmetic Operations, 1995.
|
69
|
+
`arXiv:quant-ph/9511018 <https://arxiv.org/pdf/quant-ph/9511018.pdf>`_
|
70
|
+
|
71
|
+
"""
|
72
|
+
|
73
|
+
def __init__(
|
74
|
+
self, num_state_qubits: int, kind: str = "fixed", name: str = "DraperQFTAdder"
|
75
|
+
) -> None:
|
76
|
+
r"""
|
77
|
+
Args:
|
78
|
+
num_state_qubits: The number of qubits in either input register for
|
79
|
+
state :math:`|a\rangle` or :math:`|b\rangle`. The two input
|
80
|
+
registers must have the same number of qubits.
|
81
|
+
kind: The kind of adder, can be ``'half'`` for a half adder or
|
82
|
+
``'fixed'`` for a fixed-sized adder. A half adder contains a carry-out to represent
|
83
|
+
the most-significant bit, but the fixed-sized adder doesn't and hence performs
|
84
|
+
addition modulo ``2 ** num_state_qubits``.
|
85
|
+
name: The name of the circuit object.
|
86
|
+
Raises:
|
87
|
+
ValueError: If ``num_state_qubits`` is lower than 1.
|
88
|
+
"""
|
89
|
+
if kind == "full":
|
90
|
+
raise ValueError("The DraperQFTAdder only supports 'half' and 'fixed' as ``kind``.")
|
91
|
+
|
92
|
+
if num_state_qubits < 1:
|
93
|
+
raise ValueError("The number of qubits must be at least 1.")
|
94
|
+
|
95
|
+
super().__init__(num_state_qubits, name=name)
|
96
|
+
|
97
|
+
qr_a = QuantumRegister(num_state_qubits, name="a")
|
98
|
+
qr_b = QuantumRegister(num_state_qubits, name="b")
|
99
|
+
qr_list = [qr_a, qr_b]
|
100
|
+
|
101
|
+
if kind == "half":
|
102
|
+
qr_z = QuantumRegister(1, name="cout")
|
103
|
+
qr_list.append(qr_z)
|
104
|
+
|
105
|
+
# add registers
|
106
|
+
self.add_register(*qr_list)
|
107
|
+
|
108
|
+
# define register containing the sum and number of qubits for QFT circuit
|
109
|
+
qr_sum = qr_b[:] if kind == "fixed" else qr_b[:] + qr_z[:]
|
110
|
+
num_qubits_qft = num_state_qubits if kind == "fixed" else num_state_qubits + 1
|
111
|
+
|
112
|
+
circuit = QuantumCircuit(*self.qregs, name=name)
|
113
|
+
|
114
|
+
# build QFT adder circuit
|
115
|
+
circuit.append(QFT(num_qubits_qft, do_swaps=False).to_gate(), qr_sum[:])
|
116
|
+
|
117
|
+
for j in range(num_state_qubits):
|
118
|
+
for k in range(num_state_qubits - j):
|
119
|
+
lam = np.pi / (2**k)
|
120
|
+
circuit.cp(lam, qr_a[j], qr_b[j + k])
|
121
|
+
|
122
|
+
if kind == "half":
|
123
|
+
for j in range(num_state_qubits):
|
124
|
+
lam = np.pi / (2 ** (j + 1))
|
125
|
+
circuit.cp(lam, qr_a[num_state_qubits - j - 1], qr_z[0])
|
126
|
+
|
127
|
+
circuit.append(QFT(num_qubits_qft, do_swaps=False).inverse().to_gate(), qr_sum[:])
|
128
|
+
|
129
|
+
self.append(circuit.to_gate(), self.qubits)
|
@@ -0,0 +1,95 @@
|
|
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.synthesis.arithmetic import adder_ripple_v95
|
17
|
+
from .adder import Adder
|
18
|
+
|
19
|
+
|
20
|
+
class VBERippleCarryAdder(Adder):
|
21
|
+
r"""The VBE ripple carry adder [1].
|
22
|
+
|
23
|
+
This circuit performs inplace addition of two equally-sized quantum registers.
|
24
|
+
As an example, a classical adder circuit that performs full addition (i.e. including
|
25
|
+
a carry-in bit) on two 2-qubit sized registers is as follows:
|
26
|
+
|
27
|
+
.. code-block:: text
|
28
|
+
|
29
|
+
┌────────┐ ┌───────────┐┌──────┐
|
30
|
+
cin_0: ┤0 ├───────────────────────┤0 ├┤0 ├
|
31
|
+
│ │ │ ││ │
|
32
|
+
a_0: ┤1 ├───────────────────────┤1 ├┤1 ├
|
33
|
+
│ │┌────────┐ ┌──────┐│ ││ Sum │
|
34
|
+
a_1: ┤ ├┤1 ├──■──┤1 ├┤ ├┤ ├
|
35
|
+
│ ││ │ │ │ ││ ││ │
|
36
|
+
b_0: ┤2 Carry ├┤ ├──┼──┤ ├┤2 Carry_dg ├┤2 ├
|
37
|
+
│ ││ │┌─┴─┐│ ││ │└──────┘
|
38
|
+
b_1: ┤ ├┤2 Carry ├┤ X ├┤2 Sum ├┤ ├────────
|
39
|
+
│ ││ │└───┘│ ││ │
|
40
|
+
cout_0: ┤ ├┤3 ├─────┤ ├┤ ├────────
|
41
|
+
│ ││ │ │ ││ │
|
42
|
+
helper_0: ┤3 ├┤0 ├─────┤0 ├┤3 ├────────
|
43
|
+
└────────┘└────────┘ └──────┘└───────────┘
|
44
|
+
|
45
|
+
|
46
|
+
Here *Carry* and *Sum* gates correspond to the gates introduced in [1].
|
47
|
+
*Carry_dg* correspond to the inverse of the *Carry* gate. Note that
|
48
|
+
in this implementation the input register qubits are ordered as all qubits from
|
49
|
+
the first input register, followed by all qubits from the second input register.
|
50
|
+
This is different ordering as compared to Figure 2 in [1], which leads to a different
|
51
|
+
drawing of the circuit.
|
52
|
+
|
53
|
+
.. seealso::
|
54
|
+
|
55
|
+
The following generic gate objects perform additions, like this circuit class,
|
56
|
+
but allow the compiler to select the optimal decomposition based on the context.
|
57
|
+
Specific implementations can be set via the :class:`.HLSConfig`, e.g. this circuit
|
58
|
+
can be chosen via ``Adder=["ripple_v95"]``.
|
59
|
+
|
60
|
+
:class:`.ModularAdderGate`: A generic inplace adder, modulo :math:`2^n`. This
|
61
|
+
is functionally equivalent to ``kind="fixed"``.
|
62
|
+
|
63
|
+
:class:`.AdderGate`: A generic inplace adder. This
|
64
|
+
is functionally equivalent to ``kind="half"``.
|
65
|
+
|
66
|
+
:class:`.FullAdderGate`: A generic inplace adder, with a carry-in bit. This
|
67
|
+
is functionally equivalent to ``kind="full"``.
|
68
|
+
|
69
|
+
**References:**
|
70
|
+
|
71
|
+
[1] Vedral et al., Quantum Networks for Elementary Arithmetic Operations, 1995.
|
72
|
+
`arXiv:quant-ph/9511018 <https://arxiv.org/pdf/quant-ph/9511018.pdf>`_
|
73
|
+
|
74
|
+
"""
|
75
|
+
|
76
|
+
def __init__(
|
77
|
+
self, num_state_qubits: int, kind: str = "full", name: str = "VBERippleCarryAdder"
|
78
|
+
) -> None:
|
79
|
+
"""
|
80
|
+
Args:
|
81
|
+
num_state_qubits: The size of the register.
|
82
|
+
kind: The kind of adder, can be ``'full'`` for a full adder, ``'half'`` for a half
|
83
|
+
adder, or ``'fixed'`` for a fixed-sized adder. A full adder includes both carry-in
|
84
|
+
and carry-out, a half only carry-out, and a fixed-sized adder neither carry-in
|
85
|
+
nor carry-out.
|
86
|
+
name: The name of the circuit.
|
87
|
+
|
88
|
+
Raises:
|
89
|
+
ValueError: If ``num_state_qubits`` is lower than 1.
|
90
|
+
"""
|
91
|
+
super().__init__(num_state_qubits, name=name)
|
92
|
+
circuit = adder_ripple_v95(num_state_qubits, kind)
|
93
|
+
|
94
|
+
self.add_register(*circuit.qregs)
|
95
|
+
self.append(circuit.to_gate(), self.qubits)
|