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,336 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017.
|
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
|
+
"""Prepare a quantum state from the state where all qubits are 0."""
|
13
|
+
|
14
|
+
from typing import Union, Optional
|
15
|
+
|
16
|
+
import math
|
17
|
+
import numpy as np
|
18
|
+
|
19
|
+
from qiskit.exceptions import QiskitError
|
20
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
21
|
+
from qiskit.circuit import QuantumRegister
|
22
|
+
from qiskit.circuit.gate import Gate
|
23
|
+
from qiskit.circuit.library.standard_gates.x import XGate
|
24
|
+
from qiskit.circuit.library.standard_gates.h import HGate
|
25
|
+
from qiskit.circuit.library.standard_gates.s import SGate, SdgGate
|
26
|
+
from qiskit.circuit.library.generalized_gates import Isometry
|
27
|
+
from qiskit.circuit.exceptions import CircuitError
|
28
|
+
from qiskit.quantum_info.states.statevector import (
|
29
|
+
Statevector,
|
30
|
+
) # pylint: disable=cyclic-import
|
31
|
+
|
32
|
+
_EPS = 1e-10 # global variable used to chop very small numbers to zero
|
33
|
+
|
34
|
+
|
35
|
+
class StatePreparation(Gate):
|
36
|
+
"""Complex amplitude state preparation.
|
37
|
+
|
38
|
+
Class that implements the (complex amplitude) state preparation of some
|
39
|
+
flexible collection of qubit registers.
|
40
|
+
"""
|
41
|
+
|
42
|
+
def __init__(
|
43
|
+
self,
|
44
|
+
params: Union[str, list, int, Statevector],
|
45
|
+
num_qubits: Optional[int] = None,
|
46
|
+
inverse: bool = False,
|
47
|
+
label: Optional[str] = None,
|
48
|
+
normalize: bool = False,
|
49
|
+
):
|
50
|
+
r"""
|
51
|
+
Args:
|
52
|
+
params:
|
53
|
+
* Statevector: Statevector to initialize to.
|
54
|
+
* list: vector of complex amplitudes to initialize to.
|
55
|
+
* string: labels of basis states of the Pauli eigenstates Z, X, Y. See
|
56
|
+
:meth:`.Statevector.from_label`.
|
57
|
+
Notice the order of the labels is reversed with respect to the qubit index to
|
58
|
+
be applied to. Example label '01' initializes the qubit zero to :math:`|1\rangle`
|
59
|
+
and the qubit one to :math:`|0\rangle`.
|
60
|
+
* int: an integer that is used as a bitmap indicating which qubits to initialize
|
61
|
+
to :math:`|1\rangle`. Example: setting params to 5 would initialize qubit 0 and qubit 2
|
62
|
+
to :math:`|1\rangle` and qubit 1 to :math:`|0\rangle`.
|
63
|
+
num_qubits: This parameter is only used if params is an int. Indicates the total
|
64
|
+
number of qubits in the `initialize` call. Example: `initialize` covers 5 qubits
|
65
|
+
and params is 3. This allows qubits 0 and 1 to be initialized to :math:`|1\rangle`
|
66
|
+
and the remaining 3 qubits to be initialized to :math:`|0\rangle`.
|
67
|
+
inverse: if True, the inverse state is constructed.
|
68
|
+
label: An optional label for the gate
|
69
|
+
normalize (bool): Whether to normalize an input array to a unit vector.
|
70
|
+
|
71
|
+
Raises:
|
72
|
+
QiskitError: ``num_qubits`` parameter used when ``params`` is not an integer
|
73
|
+
|
74
|
+
When a Statevector argument is passed the state is prepared based on the
|
75
|
+
:class:`~.library.Isometry` synthesis described in [1].
|
76
|
+
|
77
|
+
References:
|
78
|
+
1. Iten et al., Quantum circuits for isometries (2016).
|
79
|
+
`Phys. Rev. A 93, 032318
|
80
|
+
<https://journals.aps.org/pra/abstract/10.1103/PhysRevA.93.032318>`__.
|
81
|
+
|
82
|
+
"""
|
83
|
+
self._params_arg = params
|
84
|
+
self._inverse = inverse
|
85
|
+
self._name = "state_preparation_dg" if self._inverse else "state_preparation"
|
86
|
+
|
87
|
+
if label is None:
|
88
|
+
self._label = "State Preparation Dg" if self._inverse else "State Preparation"
|
89
|
+
else:
|
90
|
+
self._label = f"{label} Dg" if self._inverse else label
|
91
|
+
|
92
|
+
if isinstance(params, Statevector):
|
93
|
+
params = params.data
|
94
|
+
|
95
|
+
if not isinstance(params, int) and num_qubits is not None:
|
96
|
+
raise QiskitError(
|
97
|
+
"The num_qubits parameter to StatePreparation should only be"
|
98
|
+
" used when params is an integer"
|
99
|
+
)
|
100
|
+
self._from_label = isinstance(params, str)
|
101
|
+
self._from_int = isinstance(params, int)
|
102
|
+
|
103
|
+
# if initialized from a vector, check that the parameters are normalized
|
104
|
+
if not self._from_label and not self._from_int:
|
105
|
+
norm = np.linalg.norm(params)
|
106
|
+
if normalize:
|
107
|
+
params = np.array(params, dtype=np.complex128) / norm
|
108
|
+
elif not math.isclose(norm, 1.0, abs_tol=_EPS):
|
109
|
+
raise QiskitError(f"Sum of amplitudes-squared is not 1, but {norm}.")
|
110
|
+
|
111
|
+
num_qubits = self._get_num_qubits(num_qubits, params)
|
112
|
+
params = [params] if isinstance(params, int) else params
|
113
|
+
|
114
|
+
super().__init__(self._name, num_qubits, params, label=self._label)
|
115
|
+
|
116
|
+
def _define(self):
|
117
|
+
if self._from_label:
|
118
|
+
self.definition = self._define_from_label()
|
119
|
+
elif self._from_int:
|
120
|
+
self.definition = self._define_from_int()
|
121
|
+
else:
|
122
|
+
self.definition = self._define_synthesis_isom()
|
123
|
+
|
124
|
+
def _define_from_label(self):
|
125
|
+
q = QuantumRegister(self.num_qubits, "q")
|
126
|
+
initialize_circuit = QuantumCircuit(q, name="init_def")
|
127
|
+
|
128
|
+
for qubit, param in enumerate(reversed(self.params)):
|
129
|
+
if param == "1":
|
130
|
+
initialize_circuit.append(XGate(), [q[qubit]])
|
131
|
+
elif param == "+":
|
132
|
+
initialize_circuit.append(HGate(), [q[qubit]])
|
133
|
+
elif param == "-":
|
134
|
+
initialize_circuit.append(XGate(), [q[qubit]])
|
135
|
+
initialize_circuit.append(HGate(), [q[qubit]])
|
136
|
+
elif param == "r": # |+i>
|
137
|
+
initialize_circuit.append(HGate(), [q[qubit]])
|
138
|
+
initialize_circuit.append(SGate(), [q[qubit]])
|
139
|
+
elif param == "l": # |-i>
|
140
|
+
initialize_circuit.append(HGate(), [q[qubit]])
|
141
|
+
initialize_circuit.append(SdgGate(), [q[qubit]])
|
142
|
+
|
143
|
+
if self._inverse:
|
144
|
+
initialize_circuit = initialize_circuit.inverse()
|
145
|
+
|
146
|
+
return initialize_circuit
|
147
|
+
|
148
|
+
def _define_from_int(self):
|
149
|
+
q = QuantumRegister(self.num_qubits, "q")
|
150
|
+
initialize_circuit = QuantumCircuit(q, name="init_def")
|
151
|
+
|
152
|
+
# Convert to int since QuantumCircuit converted to complex
|
153
|
+
# and make a bit string and reverse it
|
154
|
+
intstr = f"{int(np.real(self.params[0])):0{self.num_qubits}b}"[::-1]
|
155
|
+
|
156
|
+
# Raise if number of bits is greater than num_qubits
|
157
|
+
if len(intstr) > self.num_qubits:
|
158
|
+
raise QiskitError(
|
159
|
+
f"StatePreparation integer has {len(intstr)} bits, but this exceeds the"
|
160
|
+
f" number of qubits in the circuit, {self.num_qubits}."
|
161
|
+
)
|
162
|
+
|
163
|
+
for qubit, bit in enumerate(intstr):
|
164
|
+
if bit == "1":
|
165
|
+
initialize_circuit.append(XGate(), [q[qubit]])
|
166
|
+
|
167
|
+
# note: X is it's own inverse, so even if self._inverse is True,
|
168
|
+
# we don't need to invert anything
|
169
|
+
return initialize_circuit
|
170
|
+
|
171
|
+
def _define_synthesis_isom(self):
|
172
|
+
"""Calculate a subcircuit that implements this initialization via isometry"""
|
173
|
+
q = QuantumRegister(self.num_qubits, "q")
|
174
|
+
initialize_circuit = QuantumCircuit(q, name="init_def")
|
175
|
+
|
176
|
+
isom = Isometry(self.params, 0, 0)
|
177
|
+
initialize_circuit.compose(isom.definition, copy=False, inplace=True)
|
178
|
+
|
179
|
+
# invert the circuit to create the desired vector from zero (assuming
|
180
|
+
# the qubits are in the zero state)
|
181
|
+
if self._inverse is True:
|
182
|
+
return initialize_circuit.inverse()
|
183
|
+
|
184
|
+
return initialize_circuit
|
185
|
+
|
186
|
+
def _get_num_qubits(self, num_qubits, params):
|
187
|
+
"""Get number of qubits needed for state preparation"""
|
188
|
+
if isinstance(params, str):
|
189
|
+
num_qubits = len(params)
|
190
|
+
elif isinstance(params, int):
|
191
|
+
if num_qubits is None:
|
192
|
+
num_qubits = int(math.log2(params)) + 1
|
193
|
+
else:
|
194
|
+
num_qubits = math.log2(len(params))
|
195
|
+
|
196
|
+
# Check if param is a power of 2
|
197
|
+
if num_qubits == 0 or not num_qubits.is_integer():
|
198
|
+
raise QiskitError("Desired statevector length not a positive power of 2.")
|
199
|
+
|
200
|
+
num_qubits = int(num_qubits)
|
201
|
+
return num_qubits
|
202
|
+
|
203
|
+
def inverse(self, annotated: bool = False):
|
204
|
+
"""Return inverted StatePreparation"""
|
205
|
+
|
206
|
+
label = (
|
207
|
+
None if self._label in ("State Preparation", "State Preparation Dg") else self._label
|
208
|
+
)
|
209
|
+
|
210
|
+
return StatePreparation(self._params_arg, inverse=not self._inverse, label=label)
|
211
|
+
|
212
|
+
def broadcast_arguments(self, qargs, cargs):
|
213
|
+
flat_qargs = [qarg for sublist in qargs for qarg in sublist]
|
214
|
+
|
215
|
+
if self.num_qubits != len(flat_qargs):
|
216
|
+
raise QiskitError(
|
217
|
+
f"StatePreparation parameter vector has {2**self.num_qubits}"
|
218
|
+
f" elements, therefore expects {self.num_qubits} "
|
219
|
+
f"qubits. However, {len(flat_qargs)} were provided."
|
220
|
+
)
|
221
|
+
yield flat_qargs, []
|
222
|
+
|
223
|
+
def validate_parameter(self, parameter):
|
224
|
+
"""StatePreparation instruction parameter can be str, int, float, and complex."""
|
225
|
+
|
226
|
+
# StatePreparation instruction parameter can be str
|
227
|
+
if isinstance(parameter, str):
|
228
|
+
if parameter in ["0", "1", "+", "-", "l", "r"]:
|
229
|
+
return parameter
|
230
|
+
raise CircuitError(
|
231
|
+
f"invalid param label {type(parameter)} for instruction {self.name}. Label should be "
|
232
|
+
"0, 1, +, -, l, or r "
|
233
|
+
)
|
234
|
+
|
235
|
+
# StatePreparation instruction parameter can be int, float, and complex.
|
236
|
+
if isinstance(parameter, (int, float, complex)):
|
237
|
+
return complex(parameter)
|
238
|
+
elif isinstance(parameter, np.number):
|
239
|
+
return complex(parameter.item())
|
240
|
+
else:
|
241
|
+
raise CircuitError(f"invalid param type {type(parameter)} for instruction {self.name}")
|
242
|
+
|
243
|
+
def _return_repeat(self, exponent: float) -> "Gate":
|
244
|
+
return Gate(name=f"{self.name}*{exponent}", num_qubits=self.num_qubits, params=[])
|
245
|
+
|
246
|
+
|
247
|
+
class UniformSuperpositionGate(Gate):
|
248
|
+
r"""Implements a uniform superposition state.
|
249
|
+
|
250
|
+
This gate is used to create the uniform superposition state
|
251
|
+
:math:`\frac{1}{\sqrt{M}} \sum_{j=0}^{M-1} |j\rangle` when it acts on an input
|
252
|
+
state :math:`|0...0\rangle`. Note, that `M` is not required to be
|
253
|
+
a power of 2, in which case the uniform superposition could be
|
254
|
+
prepared by a single layer of Hadamard gates.
|
255
|
+
|
256
|
+
.. note::
|
257
|
+
|
258
|
+
This class uses the Shukla-Vedula algorithm [1], which only needs
|
259
|
+
:math:`O(\log_2 (M))` qubits and :math:`O(\log_2 (M))` gates,
|
260
|
+
to prepare the superposition.
|
261
|
+
|
262
|
+
**References:**
|
263
|
+
[1]: A. Shukla and P. Vedula (2024), An efficient quantum algorithm for preparation
|
264
|
+
of uniform quantum superposition states, `Quantum Inf Process 23, 38
|
265
|
+
<https://link.springer.com/article/10.1007/s11128-024-04258-4>`_.
|
266
|
+
"""
|
267
|
+
|
268
|
+
def __init__(
|
269
|
+
self,
|
270
|
+
num_superpos_states: int = 2,
|
271
|
+
num_qubits: Optional[int] = None,
|
272
|
+
):
|
273
|
+
r"""
|
274
|
+
Args:
|
275
|
+
num_superpos_states (int):
|
276
|
+
A positive integer M = num_superpos_states (> 1) representing the number of computational
|
277
|
+
basis states with an amplitude of 1/sqrt(M) in the uniform superposition
|
278
|
+
state (:math:`\frac{1}{\sqrt{M}} \sum_{j=0}^{M-1} |j\rangle`, where
|
279
|
+
:math:`1< M <= 2^n`). Note that the remaining (:math:`2^n - M`) computational basis
|
280
|
+
states have zero amplitudes. Here M need not be an integer power of 2.
|
281
|
+
|
282
|
+
num_qubits (int):
|
283
|
+
A positive integer representing the number of qubits used. If num_qubits is None
|
284
|
+
or is not specified, then num_qubits is set to ceil(log2(num_superpos_states)).
|
285
|
+
|
286
|
+
Raises:
|
287
|
+
ValueError: num_qubits must be an integer greater than or equal to log2(num_superpos_states).
|
288
|
+
|
289
|
+
"""
|
290
|
+
if num_superpos_states <= 1:
|
291
|
+
raise ValueError("num_superpos_states must be a positive integer greater than 1.")
|
292
|
+
if num_qubits is None:
|
293
|
+
num_qubits = int(math.ceil(math.log2(num_superpos_states)))
|
294
|
+
else:
|
295
|
+
if not (isinstance(num_qubits, int) and (num_qubits >= math.log2(num_superpos_states))):
|
296
|
+
raise ValueError(
|
297
|
+
"num_qubits must be an integer greater than or equal to log2(num_superpos_states)."
|
298
|
+
)
|
299
|
+
super().__init__("USup", num_qubits, [num_superpos_states])
|
300
|
+
|
301
|
+
def _define(self):
|
302
|
+
|
303
|
+
qc = QuantumCircuit(self._num_qubits)
|
304
|
+
|
305
|
+
num_superpos_states = self.params[0]
|
306
|
+
|
307
|
+
if (
|
308
|
+
num_superpos_states & (num_superpos_states - 1)
|
309
|
+
) == 0: # if num_superpos_states is an integer power of 2
|
310
|
+
m = int(math.log2(num_superpos_states))
|
311
|
+
qc.h(range(m))
|
312
|
+
self.definition = qc
|
313
|
+
return
|
314
|
+
|
315
|
+
n_value = [int(x) for x in reversed(np.binary_repr(num_superpos_states))]
|
316
|
+
k = len(n_value)
|
317
|
+
l_value = [index for (index, item) in enumerate(n_value) if item == 1] # Locations of '1's
|
318
|
+
|
319
|
+
qc.x(l_value[1:k])
|
320
|
+
m_current_value = 2 ** l_value[0]
|
321
|
+
theta = -2 * np.arccos(np.sqrt(m_current_value / num_superpos_states))
|
322
|
+
|
323
|
+
if l_value[0] > 0: # if num_superpos_states is even
|
324
|
+
qc.h(range(l_value[0]))
|
325
|
+
qc.ry(theta, l_value[1])
|
326
|
+
qc.ch(l_value[1], range(l_value[0], l_value[1]), ctrl_state="0")
|
327
|
+
|
328
|
+
for m in range(1, len(l_value) - 1):
|
329
|
+
theta = -2 * np.arccos(
|
330
|
+
np.sqrt(2 ** l_value[m] / (num_superpos_states - m_current_value))
|
331
|
+
)
|
332
|
+
qc.cry(theta, l_value[m], l_value[m + 1], ctrl_state="0")
|
333
|
+
qc.ch(l_value[m + 1], range(l_value[m], l_value[m + 1]), ctrl_state="0")
|
334
|
+
m_current_value = m_current_value + 2 ** l_value[m]
|
335
|
+
|
336
|
+
self.definition = qc
|
@@ -0,0 +1,160 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2020.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Fourier checking circuit."""
|
14
|
+
|
15
|
+
from collections.abc import Sequence
|
16
|
+
import math
|
17
|
+
|
18
|
+
from qiskit.circuit import QuantumCircuit
|
19
|
+
from qiskit.circuit.exceptions import CircuitError
|
20
|
+
from qiskit.utils.deprecation import deprecate_func
|
21
|
+
|
22
|
+
from .generalized_gates.diagonal import Diagonal, DiagonalGate
|
23
|
+
|
24
|
+
|
25
|
+
class FourierChecking(QuantumCircuit):
|
26
|
+
"""Fourier checking circuit.
|
27
|
+
|
28
|
+
The circuit for the Fourier checking algorithm, introduced in [1],
|
29
|
+
involves a layer of Hadamards, the function :math:`f`, another layer of
|
30
|
+
Hadamards, the function :math:`g`, followed by a final layer of Hadamards.
|
31
|
+
The functions :math:`f` and :math:`g` are classical functions realized
|
32
|
+
as phase oracles (diagonal operators with {-1, 1} on the diagonal).
|
33
|
+
|
34
|
+
The probability of observing the all-zeros string is :math:`p(f,g)`.
|
35
|
+
The algorithm solves the promise Fourier checking problem,
|
36
|
+
which decides if f is correlated with the Fourier transform
|
37
|
+
of g, by testing if :math:`p(f,g) <= 0.01` or :math:`p(f,g) >= 0.05`,
|
38
|
+
promised that one or the other of these is true.
|
39
|
+
|
40
|
+
The functions :math:`f` and :math:`g` are currently implemented
|
41
|
+
from their truth tables but could be represented concisely and
|
42
|
+
implemented efficiently for special classes of functions.
|
43
|
+
|
44
|
+
Fourier checking is a special case of :math:`k`-fold forrelation [2].
|
45
|
+
|
46
|
+
**Reference:**
|
47
|
+
|
48
|
+
[1] S. Aaronson, BQP and the Polynomial Hierarchy, 2009 (Section 3.2).
|
49
|
+
`arXiv:0910.4698 <https://arxiv.org/abs/0910.4698>`_
|
50
|
+
|
51
|
+
[2] S. Aaronson, A. Ambainis, Forrelation: a problem that
|
52
|
+
optimally separates quantum from classical computing, 2014.
|
53
|
+
`arXiv:1411.5729 <https://arxiv.org/abs/1411.5729>`_
|
54
|
+
"""
|
55
|
+
|
56
|
+
@deprecate_func(
|
57
|
+
since="2.1",
|
58
|
+
additional_msg="Use qiskit.circuit.library.fourier_checking instead.",
|
59
|
+
removal_timeline="in Qiskit 3.0",
|
60
|
+
)
|
61
|
+
def __init__(self, f: Sequence[int], g: Sequence[int]) -> None:
|
62
|
+
"""Create Fourier checking circuit.
|
63
|
+
|
64
|
+
Args:
|
65
|
+
f: truth table for f, length 2**n list of {1,-1}.
|
66
|
+
g: truth table for g, length 2**n list of {1,-1}.
|
67
|
+
|
68
|
+
Raises:
|
69
|
+
CircuitError: if the inputs f and g are not valid.
|
70
|
+
|
71
|
+
Reference Circuit:
|
72
|
+
.. plot::
|
73
|
+
:alt: Diagram illustrating the previously described circuit.
|
74
|
+
|
75
|
+
from qiskit.circuit.library import FourierChecking
|
76
|
+
from qiskit.visualization.library import _generate_circuit_library_visualization
|
77
|
+
f = [1, -1, -1, -1]
|
78
|
+
g = [1, 1, -1, -1]
|
79
|
+
circuit = FourierChecking(f, g)
|
80
|
+
_generate_circuit_library_visualization(circuit)
|
81
|
+
"""
|
82
|
+
num_qubits = math.log2(len(f))
|
83
|
+
|
84
|
+
if len(f) != len(g) or num_qubits == 0 or not num_qubits.is_integer():
|
85
|
+
raise CircuitError(
|
86
|
+
"The functions f and g must be given as truth "
|
87
|
+
"tables, each as a list of 2**n entries of "
|
88
|
+
"{1, -1}."
|
89
|
+
)
|
90
|
+
|
91
|
+
# This definition circuit is not replaced by the circuit produced by fourier_checking,
|
92
|
+
# as the latter produces a slightly different circuit, with DiagonalGates instead
|
93
|
+
# of Diagonal circuits.
|
94
|
+
circuit = QuantumCircuit(int(num_qubits), name=f"fc: {f}, {g}")
|
95
|
+
circuit.h(circuit.qubits)
|
96
|
+
circuit.compose(Diagonal(f), inplace=True)
|
97
|
+
circuit.h(circuit.qubits)
|
98
|
+
circuit.compose(Diagonal(g), inplace=True)
|
99
|
+
circuit.h(circuit.qubits)
|
100
|
+
super().__init__(*circuit.qregs, name=circuit.name)
|
101
|
+
self.compose(circuit.to_gate(), qubits=self.qubits, inplace=True)
|
102
|
+
|
103
|
+
|
104
|
+
def fourier_checking(f: Sequence[int], g: Sequence[int]) -> QuantumCircuit:
|
105
|
+
"""Fourier checking circuit.
|
106
|
+
|
107
|
+
The circuit for the Fourier checking algorithm, introduced in [1],
|
108
|
+
involves a layer of Hadamards, the function :math:`f`, another layer of
|
109
|
+
Hadamards, the function :math:`g`, followed by a final layer of Hadamards.
|
110
|
+
The functions :math:`f` and :math:`g` are classical functions realized
|
111
|
+
as phase oracles (diagonal operators with {-1, 1} on the diagonal).
|
112
|
+
|
113
|
+
The probability of observing the all-zeros string is :math:`p(f,g)`.
|
114
|
+
The algorithm solves the promise Fourier checking problem,
|
115
|
+
which decides if f is correlated with the Fourier transform
|
116
|
+
of g, by testing if :math:`p(f,g) <= 0.01` or :math:`p(f,g) >= 0.05`,
|
117
|
+
promised that one or the other of these is true.
|
118
|
+
|
119
|
+
The functions :math:`f` and :math:`g` are currently implemented
|
120
|
+
from their truth tables but could be represented concisely and
|
121
|
+
implemented efficiently for special classes of functions.
|
122
|
+
|
123
|
+
Fourier checking is a special case of :math:`k`-fold forrelation [2].
|
124
|
+
|
125
|
+
**Reference Circuit:**
|
126
|
+
|
127
|
+
.. plot::
|
128
|
+
:alt: Circuit diagram output by the previous code.
|
129
|
+
:include-source:
|
130
|
+
|
131
|
+
from qiskit.circuit.library import fourier_checking
|
132
|
+
circuit = fourier_checking([1, -1, -1, -1], [1, 1, -1, -1])
|
133
|
+
circuit.draw('mpl')
|
134
|
+
|
135
|
+
**Reference:**
|
136
|
+
|
137
|
+
[1] S. Aaronson, BQP and the Polynomial Hierarchy, 2009 (Section 3.2).
|
138
|
+
`arXiv:0910.4698 <https://arxiv.org/abs/0910.4698>`_
|
139
|
+
|
140
|
+
[2] S. Aaronson, A. Ambainis, Forrelation: a problem that
|
141
|
+
optimally separates quantum from classical computing, 2014.
|
142
|
+
`arXiv:1411.5729 <https://arxiv.org/abs/1411.5729>`_
|
143
|
+
"""
|
144
|
+
num_qubits = math.log2(len(f))
|
145
|
+
|
146
|
+
if len(f) != len(g) or num_qubits == 0 or not num_qubits.is_integer():
|
147
|
+
raise CircuitError(
|
148
|
+
"The functions f and g must be given as truth "
|
149
|
+
"tables, each as a list of 2**n entries of "
|
150
|
+
"{1, -1}."
|
151
|
+
)
|
152
|
+
num_qubits = int(num_qubits)
|
153
|
+
|
154
|
+
circuit = QuantumCircuit(num_qubits, name=f"fc: {f}, {g}")
|
155
|
+
circuit.h(circuit.qubits)
|
156
|
+
circuit.append(DiagonalGate(f), range(num_qubits))
|
157
|
+
circuit.h(circuit.qubits)
|
158
|
+
circuit.append(DiagonalGate(g), range(num_qubits))
|
159
|
+
circuit.h(circuit.qubits)
|
160
|
+
return circuit
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2020.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""The circuit library module on generalized gates."""
|
14
|
+
|
15
|
+
from .diagonal import Diagonal, DiagonalGate
|
16
|
+
from .permutation import Permutation, PermutationGate
|
17
|
+
from .mcmt import MCMT, MCMTVChain, MCMTGate
|
18
|
+
from .gms import GMS, MSGate
|
19
|
+
from .gr import GR, GRX, GRY, GRZ
|
20
|
+
from .pauli import PauliGate
|
21
|
+
from .rv import RVGate
|
22
|
+
from .linear_function import LinearFunction
|
23
|
+
from .isometry import Isometry
|
24
|
+
from .uc import UCGate
|
25
|
+
from .uc_pauli_rot import UCPauliRotGate
|
26
|
+
from .ucrx import UCRXGate
|
27
|
+
from .ucry import UCRYGate
|
28
|
+
from .ucrz import UCRZGate
|
29
|
+
from .unitary import UnitaryGate
|
30
|
+
from .mcg_up_to_diagonal import MCGupDiag
|
@@ -0,0 +1,163 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2020.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
|
14
|
+
"""Diagonal matrix circuit."""
|
15
|
+
|
16
|
+
from __future__ import annotations
|
17
|
+
from collections.abc import Sequence
|
18
|
+
|
19
|
+
import cmath
|
20
|
+
import math
|
21
|
+
import numpy as np
|
22
|
+
|
23
|
+
from qiskit.circuit.gate import Gate
|
24
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
25
|
+
from qiskit.circuit.exceptions import CircuitError
|
26
|
+
from qiskit.circuit.annotated_operation import AnnotatedOperation, InverseModifier
|
27
|
+
from qiskit.utils.deprecation import deprecate_func
|
28
|
+
|
29
|
+
from .ucrz import UCRZGate
|
30
|
+
|
31
|
+
_EPS = 1e-10
|
32
|
+
|
33
|
+
|
34
|
+
class Diagonal(QuantumCircuit):
|
35
|
+
"""Circuit implementing a diagonal transformation."""
|
36
|
+
|
37
|
+
@deprecate_func(
|
38
|
+
since="2.1",
|
39
|
+
additional_msg="Use DiagonalGate instead.",
|
40
|
+
removal_timeline="in Qiskit 3.0",
|
41
|
+
)
|
42
|
+
def __init__(self, diag: Sequence[complex]) -> None:
|
43
|
+
r"""
|
44
|
+
Args:
|
45
|
+
diag: List of the :math:`2^k` diagonal entries (for a diagonal gate on :math:`k` qubits).
|
46
|
+
|
47
|
+
Raises:
|
48
|
+
CircuitError: if the list of the diagonal entries or the qubit list is in bad format;
|
49
|
+
if the number of diagonal entries is not :math:`2^k`, where :math:`k` denotes the
|
50
|
+
number of qubits.
|
51
|
+
"""
|
52
|
+
DiagonalGate._check_input(diag)
|
53
|
+
num_qubits = int(math.log2(len(diag)))
|
54
|
+
|
55
|
+
super().__init__(num_qubits, name="Diagonal")
|
56
|
+
self.append(DiagonalGate(diag), self.qubits)
|
57
|
+
|
58
|
+
|
59
|
+
class DiagonalGate(Gate):
|
60
|
+
r"""A generic diagonal quantum gate.
|
61
|
+
|
62
|
+
Matrix form:
|
63
|
+
|
64
|
+
.. math::
|
65
|
+
\text{DiagonalGate}\ q_0, q_1, .., q_{n-1} =
|
66
|
+
\begin{pmatrix}
|
67
|
+
D[0] & 0 & \dots & 0 \\
|
68
|
+
0 & D[1] & \dots & 0 \\
|
69
|
+
\vdots & \vdots & \ddots & 0 \\
|
70
|
+
0 & 0 & \dots & D[n-1]
|
71
|
+
\end{pmatrix}
|
72
|
+
|
73
|
+
Diagonal gates are useful as representations of Boolean functions,
|
74
|
+
as they can map from :math:`\{0,1\}^{2^n}` to :math:`\{0,1\}^{2^n}` space. For example a phase
|
75
|
+
oracle can be seen as a diagonal gate with :math:`\{1, -1\}` on the diagonals. Such
|
76
|
+
an oracle will induce a :math:`+1` or :math`-1` phase on the amplitude of any corresponding
|
77
|
+
basis state.
|
78
|
+
|
79
|
+
Diagonal gates appear in many classically hard oracular problems such as
|
80
|
+
Forrelation or Hidden Shift circuits.
|
81
|
+
|
82
|
+
Diagonal gates are represented and simulated more efficiently than a dense
|
83
|
+
:math:`2^n \times 2^n` unitary matrix.
|
84
|
+
|
85
|
+
The reference implementation is via the method described in
|
86
|
+
Theorem 7 of [1]. The code is based on Emanuel Malvetti's semester thesis
|
87
|
+
at ETH in 2018, supervised by Raban Iten and Prof. Renato Renner.
|
88
|
+
|
89
|
+
**Reference:**
|
90
|
+
|
91
|
+
[1] Shende et al., Synthesis of Quantum Logic Circuits, 2009
|
92
|
+
`arXiv:0406176 <https://arxiv.org/pdf/quant-ph/0406176.pdf>`_
|
93
|
+
"""
|
94
|
+
|
95
|
+
def __init__(self, diag: Sequence[complex]) -> None:
|
96
|
+
r"""
|
97
|
+
Args:
|
98
|
+
diag: list of the :math:`2^k` diagonal entries (for a diagonal gate on :math:`k` qubits).
|
99
|
+
"""
|
100
|
+
self._check_input(diag)
|
101
|
+
num_qubits = int(math.log2(len(diag)))
|
102
|
+
|
103
|
+
super().__init__("diagonal", num_qubits, diag)
|
104
|
+
|
105
|
+
def _define(self):
|
106
|
+
# Since the diagonal is a unitary, all its entries have absolute value
|
107
|
+
# one and the diagonal is fully specified by the phases of its entries.
|
108
|
+
diag_phases = [cmath.phase(z) for z in self.params]
|
109
|
+
n = len(diag_phases)
|
110
|
+
circuit = QuantumCircuit(self.num_qubits)
|
111
|
+
|
112
|
+
while n >= 2:
|
113
|
+
angles_rz = []
|
114
|
+
for i in range(0, n, 2):
|
115
|
+
diag_phases[i // 2], rz_angle = _extract_rz(diag_phases[i], diag_phases[i + 1])
|
116
|
+
angles_rz.append(rz_angle)
|
117
|
+
num_act_qubits = int(math.log2(n))
|
118
|
+
ctrl_qubits = list(range(self.num_qubits - num_act_qubits + 1, self.num_qubits))
|
119
|
+
target_qubit = self.num_qubits - num_act_qubits
|
120
|
+
|
121
|
+
ucrz = UCRZGate(angles_rz)
|
122
|
+
circuit.append(ucrz, [target_qubit] + ctrl_qubits)
|
123
|
+
|
124
|
+
n //= 2
|
125
|
+
circuit.global_phase += diag_phases[0]
|
126
|
+
|
127
|
+
self.definition = circuit
|
128
|
+
|
129
|
+
def validate_parameter(self, parameter):
|
130
|
+
"""Diagonal Gate parameter should accept complex
|
131
|
+
(in addition to the Gate parameter types) and always return build-in complex."""
|
132
|
+
if isinstance(parameter, complex):
|
133
|
+
return complex(parameter)
|
134
|
+
else:
|
135
|
+
return complex(super().validate_parameter(parameter))
|
136
|
+
|
137
|
+
def inverse(self, annotated: bool = False):
|
138
|
+
"""Return the inverse of the diagonal gate."""
|
139
|
+
if annotated:
|
140
|
+
return AnnotatedOperation(self.copy(), InverseModifier)
|
141
|
+
|
142
|
+
return DiagonalGate([np.conj(entry) for entry in self.params])
|
143
|
+
|
144
|
+
@staticmethod
|
145
|
+
def _check_input(diag):
|
146
|
+
"""Check if ``diag`` is in valid format."""
|
147
|
+
if not isinstance(diag, (list, np.ndarray)):
|
148
|
+
raise CircuitError("Diagonal entries must be in a list or numpy array.")
|
149
|
+
num_qubits = math.log2(len(diag))
|
150
|
+
if num_qubits < 1 or not num_qubits.is_integer():
|
151
|
+
raise CircuitError("The number of diagonal entries is not a positive power of 2.")
|
152
|
+
if not np.allclose(np.abs(diag), 1, atol=_EPS):
|
153
|
+
raise CircuitError("A diagonal element does not have absolute value one.")
|
154
|
+
|
155
|
+
|
156
|
+
def _extract_rz(phi1, phi2):
|
157
|
+
"""
|
158
|
+
Extract a Rz rotation (angle given by first output) such that exp(j*phase)*Rz(z_angle)
|
159
|
+
is equal to the diagonal matrix with entires exp(1j*ph1) and exp(1j*ph2).
|
160
|
+
"""
|
161
|
+
phase = (phi1 + phi2) / 2.0
|
162
|
+
z_angle = phi2 - phi1
|
163
|
+
return phase, z_angle
|