qiskit 2.0.3__cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -0
- qiskit/__init__.py +141 -0
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +73 -0
- qiskit/circuit/__init__.py +1343 -0
- qiskit/circuit/_add_control.py +312 -0
- qiskit/circuit/_classical_resource_map.py +150 -0
- qiskit/circuit/_standard_gates_commutations.py +3849 -0
- qiskit/circuit/_utils.py +167 -0
- qiskit/circuit/annotated_operation.py +279 -0
- qiskit/circuit/barrier.py +46 -0
- qiskit/circuit/classical/__init__.py +41 -0
- qiskit/circuit/classical/expr/__init__.py +266 -0
- qiskit/circuit/classical/expr/constructors.py +764 -0
- qiskit/circuit/classical/expr/expr.py +498 -0
- qiskit/circuit/classical/expr/visitors.py +375 -0
- qiskit/circuit/classical/types/__init__.py +113 -0
- qiskit/circuit/classical/types/ordering.py +229 -0
- qiskit/circuit/classical/types/types.py +153 -0
- qiskit/circuit/commutation_checker.py +133 -0
- qiskit/circuit/commutation_library.py +20 -0
- qiskit/circuit/controlflow/__init__.py +59 -0
- qiskit/circuit/controlflow/_builder_utils.py +211 -0
- qiskit/circuit/controlflow/box.py +163 -0
- qiskit/circuit/controlflow/break_loop.py +56 -0
- qiskit/circuit/controlflow/builder.py +791 -0
- qiskit/circuit/controlflow/continue_loop.py +56 -0
- qiskit/circuit/controlflow/control_flow.py +94 -0
- qiskit/circuit/controlflow/for_loop.py +218 -0
- qiskit/circuit/controlflow/if_else.py +498 -0
- qiskit/circuit/controlflow/switch_case.py +411 -0
- qiskit/circuit/controlflow/while_loop.py +166 -0
- qiskit/circuit/controlledgate.py +274 -0
- qiskit/circuit/delay.py +157 -0
- qiskit/circuit/duration.py +80 -0
- qiskit/circuit/equivalence.py +94 -0
- qiskit/circuit/equivalence_library.py +18 -0
- qiskit/circuit/exceptions.py +19 -0
- qiskit/circuit/gate.py +261 -0
- qiskit/circuit/instruction.py +564 -0
- qiskit/circuit/instructionset.py +132 -0
- qiskit/circuit/library/__init__.py +984 -0
- qiskit/circuit/library/arithmetic/__init__.py +40 -0
- qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +235 -0
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +131 -0
- qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
- qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -0
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +201 -0
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +502 -0
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +387 -0
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +493 -0
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
- qiskit/circuit/library/arithmetic/quadratic_form.py +364 -0
- qiskit/circuit/library/arithmetic/weighted_adder.py +409 -0
- qiskit/circuit/library/basis_change/__init__.py +15 -0
- qiskit/circuit/library/basis_change/qft.py +316 -0
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +316 -0
- qiskit/circuit/library/boolean_logic/__init__.py +18 -0
- qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
- qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
- qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
- qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -0
- qiskit/circuit/library/data_preparation/__init__.py +57 -0
- qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
- qiskit/circuit/library/data_preparation/initializer.py +107 -0
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
- qiskit/circuit/library/fourier_checking.py +160 -0
- qiskit/circuit/library/generalized_gates/__init__.py +30 -0
- qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
- qiskit/circuit/library/generalized_gates/gms.py +175 -0
- qiskit/circuit/library/generalized_gates/gr.py +219 -0
- qiskit/circuit/library/generalized_gates/isometry.py +370 -0
- qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
- qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
- qiskit/circuit/library/generalized_gates/pauli.py +84 -0
- qiskit/circuit/library/generalized_gates/permutation.py +198 -0
- qiskit/circuit/library/generalized_gates/rv.py +96 -0
- qiskit/circuit/library/generalized_gates/uc.py +303 -0
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
- qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
- qiskit/circuit/library/generalized_gates/ucry.py +32 -0
- qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
- qiskit/circuit/library/generalized_gates/unitary.py +217 -0
- qiskit/circuit/library/graph_state.py +172 -0
- qiskit/circuit/library/grover_operator.py +583 -0
- qiskit/circuit/library/hamiltonian_gate.py +142 -0
- qiskit/circuit/library/hidden_linear_function.py +163 -0
- qiskit/circuit/library/iqp.py +180 -0
- qiskit/circuit/library/n_local/__init__.py +45 -0
- qiskit/circuit/library/n_local/efficient_su2.py +282 -0
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +303 -0
- qiskit/circuit/library/n_local/n_local.py +1477 -0
- qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
- qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
- qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
- qiskit/circuit/library/n_local/two_local.py +289 -0
- qiskit/circuit/library/overlap.py +183 -0
- qiskit/circuit/library/pauli_evolution.py +201 -0
- qiskit/circuit/library/phase_estimation.py +177 -0
- qiskit/circuit/library/phase_oracle.py +239 -0
- qiskit/circuit/library/quantum_volume.py +180 -0
- qiskit/circuit/library/standard_gates/__init__.py +141 -0
- qiskit/circuit/library/standard_gates/dcx.py +77 -0
- qiskit/circuit/library/standard_gates/ecr.py +129 -0
- qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
- qiskit/circuit/library/standard_gates/global_phase.py +84 -0
- qiskit/circuit/library/standard_gates/h.py +253 -0
- qiskit/circuit/library/standard_gates/i.py +76 -0
- qiskit/circuit/library/standard_gates/iswap.py +133 -0
- qiskit/circuit/library/standard_gates/p.py +422 -0
- qiskit/circuit/library/standard_gates/r.py +114 -0
- qiskit/circuit/library/standard_gates/rx.py +293 -0
- qiskit/circuit/library/standard_gates/rxx.py +180 -0
- qiskit/circuit/library/standard_gates/ry.py +286 -0
- qiskit/circuit/library/standard_gates/ryy.py +180 -0
- qiskit/circuit/library/standard_gates/rz.py +307 -0
- qiskit/circuit/library/standard_gates/rzx.py +226 -0
- qiskit/circuit/library/standard_gates/rzz.py +193 -0
- qiskit/circuit/library/standard_gates/s.py +419 -0
- qiskit/circuit/library/standard_gates/swap.py +281 -0
- qiskit/circuit/library/standard_gates/sx.py +310 -0
- qiskit/circuit/library/standard_gates/t.py +178 -0
- qiskit/circuit/library/standard_gates/u.py +395 -0
- qiskit/circuit/library/standard_gates/u1.py +490 -0
- qiskit/circuit/library/standard_gates/u2.py +145 -0
- qiskit/circuit/library/standard_gates/u3.py +428 -0
- qiskit/circuit/library/standard_gates/x.py +1481 -0
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +202 -0
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +236 -0
- qiskit/circuit/library/standard_gates/y.py +257 -0
- qiskit/circuit/library/standard_gates/z.py +338 -0
- qiskit/circuit/library/templates/__init__.py +92 -0
- qiskit/circuit/library/templates/clifford/__init__.py +33 -0
- qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
- qiskit/circuit/library/templates/nct/__init__.py +67 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
- qiskit/circuit/library/templates/rzx/__init__.py +25 -0
- qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
- qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
- qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
- qiskit/circuit/measure.py +53 -0
- qiskit/circuit/operation.py +68 -0
- qiskit/circuit/parameter.py +179 -0
- qiskit/circuit/parameterexpression.py +703 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +140 -0
- qiskit/circuit/quantumcircuit.py +7540 -0
- qiskit/circuit/quantumcircuitdata.py +136 -0
- qiskit/circuit/random/__init__.py +15 -0
- qiskit/circuit/random/utils.py +366 -0
- qiskit/circuit/reset.py +37 -0
- qiskit/circuit/singleton.py +600 -0
- qiskit/circuit/store.py +89 -0
- qiskit/circuit/tools/__init__.py +16 -0
- qiskit/circuit/tools/pi_check.py +193 -0
- qiskit/circuit/twirling.py +145 -0
- qiskit/compiler/__init__.py +27 -0
- qiskit/compiler/transpiler.py +375 -0
- qiskit/converters/__init__.py +74 -0
- qiskit/converters/circuit_to_dag.py +80 -0
- qiskit/converters/circuit_to_dagdependency.py +49 -0
- qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
- qiskit/converters/circuit_to_gate.py +107 -0
- qiskit/converters/circuit_to_instruction.py +142 -0
- qiskit/converters/dag_to_circuit.py +79 -0
- qiskit/converters/dag_to_dagdependency.py +54 -0
- qiskit/converters/dag_to_dagdependency_v2.py +43 -0
- qiskit/converters/dagdependency_to_circuit.py +40 -0
- qiskit/converters/dagdependency_to_dag.py +48 -0
- qiskit/dagcircuit/__init__.py +55 -0
- qiskit/dagcircuit/collect_blocks.py +407 -0
- qiskit/dagcircuit/dagcircuit.py +24 -0
- qiskit/dagcircuit/dagdependency.py +612 -0
- qiskit/dagcircuit/dagdependency_v2.py +566 -0
- qiskit/dagcircuit/dagdepnode.py +160 -0
- qiskit/dagcircuit/dagnode.py +188 -0
- qiskit/dagcircuit/exceptions.py +42 -0
- qiskit/exceptions.py +153 -0
- qiskit/passmanager/__init__.py +258 -0
- qiskit/passmanager/base_tasks.py +230 -0
- qiskit/passmanager/compilation_status.py +74 -0
- qiskit/passmanager/exceptions.py +19 -0
- qiskit/passmanager/flow_controllers.py +116 -0
- qiskit/passmanager/passmanager.py +353 -0
- qiskit/primitives/__init__.py +490 -0
- qiskit/primitives/backend_estimator_v2.py +530 -0
- qiskit/primitives/backend_sampler_v2.py +339 -0
- qiskit/primitives/base/__init__.py +20 -0
- qiskit/primitives/base/base_estimator.py +247 -0
- qiskit/primitives/base/base_primitive_job.py +78 -0
- qiskit/primitives/base/base_primitive_v1.py +45 -0
- qiskit/primitives/base/base_result_v1.py +65 -0
- qiskit/primitives/base/base_sampler.py +196 -0
- qiskit/primitives/base/estimator_result_v1.py +46 -0
- qiskit/primitives/base/sampler_result_v1.py +45 -0
- qiskit/primitives/base/validation_v1.py +250 -0
- qiskit/primitives/containers/__init__.py +26 -0
- qiskit/primitives/containers/bindings_array.py +391 -0
- qiskit/primitives/containers/bit_array.py +764 -0
- qiskit/primitives/containers/data_bin.py +175 -0
- qiskit/primitives/containers/estimator_pub.py +222 -0
- qiskit/primitives/containers/object_array.py +94 -0
- qiskit/primitives/containers/observables_array.py +296 -0
- qiskit/primitives/containers/primitive_result.py +53 -0
- qiskit/primitives/containers/pub_result.py +51 -0
- qiskit/primitives/containers/sampler_pub.py +193 -0
- qiskit/primitives/containers/sampler_pub_result.py +74 -0
- qiskit/primitives/containers/shape.py +129 -0
- qiskit/primitives/primitive_job.py +81 -0
- qiskit/primitives/statevector_estimator.py +175 -0
- qiskit/primitives/statevector_sampler.py +290 -0
- qiskit/primitives/utils.py +72 -0
- qiskit/providers/__init__.py +677 -0
- qiskit/providers/backend.py +364 -0
- qiskit/providers/basic_provider/__init__.py +47 -0
- qiskit/providers/basic_provider/basic_provider.py +121 -0
- qiskit/providers/basic_provider/basic_provider_job.py +65 -0
- qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
- qiskit/providers/basic_provider/basic_simulator.py +693 -0
- qiskit/providers/basic_provider/exceptions.py +30 -0
- qiskit/providers/exceptions.py +33 -0
- qiskit/providers/fake_provider/__init__.py +69 -0
- qiskit/providers/fake_provider/generic_backend_v2.py +374 -0
- qiskit/providers/fake_provider/utils/__init__.py +15 -0
- qiskit/providers/job.py +147 -0
- qiskit/providers/jobstatus.py +30 -0
- qiskit/providers/options.py +273 -0
- qiskit/providers/providerutils.py +110 -0
- qiskit/qasm/libs/dummy/stdgates.inc +75 -0
- qiskit/qasm/libs/qelib1.inc +266 -0
- qiskit/qasm/libs/stdgates.inc +82 -0
- qiskit/qasm2/__init__.py +669 -0
- qiskit/qasm2/exceptions.py +27 -0
- qiskit/qasm2/export.py +364 -0
- qiskit/qasm2/parse.py +438 -0
- qiskit/qasm3/__init__.py +372 -0
- qiskit/qasm3/ast.py +782 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1340 -0
- qiskit/qasm3/printer.py +608 -0
- qiskit/qpy/__init__.py +1965 -0
- qiskit/qpy/binary_io/__init__.py +35 -0
- qiskit/qpy/binary_io/circuits.py +1455 -0
- qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
- qiskit/qpy/binary_io/schedules.py +308 -0
- qiskit/qpy/binary_io/value.py +1165 -0
- qiskit/qpy/common.py +353 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +442 -0
- qiskit/qpy/interface.py +344 -0
- qiskit/qpy/type_keys.py +409 -0
- qiskit/quantum_info/__init__.py +162 -0
- qiskit/quantum_info/analysis/__init__.py +17 -0
- qiskit/quantum_info/analysis/average.py +47 -0
- qiskit/quantum_info/analysis/distance.py +104 -0
- qiskit/quantum_info/analysis/make_observable.py +44 -0
- qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
- qiskit/quantum_info/operators/__init__.py +28 -0
- qiskit/quantum_info/operators/base_operator.py +145 -0
- qiskit/quantum_info/operators/channel/__init__.py +29 -0
- qiskit/quantum_info/operators/channel/chi.py +191 -0
- qiskit/quantum_info/operators/channel/choi.py +218 -0
- qiskit/quantum_info/operators/channel/kraus.py +337 -0
- qiskit/quantum_info/operators/channel/ptm.py +204 -0
- qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
- qiskit/quantum_info/operators/channel/stinespring.py +296 -0
- qiskit/quantum_info/operators/channel/superop.py +373 -0
- qiskit/quantum_info/operators/channel/transformations.py +490 -0
- qiskit/quantum_info/operators/custom_iterator.py +48 -0
- qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
- qiskit/quantum_info/operators/dihedral/dihedral.py +511 -0
- qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
- qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
- qiskit/quantum_info/operators/dihedral/random.py +64 -0
- qiskit/quantum_info/operators/linear_op.py +25 -0
- qiskit/quantum_info/operators/measures.py +418 -0
- qiskit/quantum_info/operators/mixins/__init__.py +52 -0
- qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
- qiskit/quantum_info/operators/mixins/group.py +171 -0
- qiskit/quantum_info/operators/mixins/linear.py +84 -0
- qiskit/quantum_info/operators/mixins/multiply.py +62 -0
- qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
- qiskit/quantum_info/operators/op_shape.py +525 -0
- qiskit/quantum_info/operators/operator.py +869 -0
- qiskit/quantum_info/operators/operator_utils.py +76 -0
- qiskit/quantum_info/operators/predicates.py +183 -0
- qiskit/quantum_info/operators/random.py +154 -0
- qiskit/quantum_info/operators/scalar_op.py +254 -0
- qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
- qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
- qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
- qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -0
- qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
- qiskit/quantum_info/operators/symplectic/random.py +117 -0
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1239 -0
- qiskit/quantum_info/operators/utils/__init__.py +20 -0
- qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
- qiskit/quantum_info/operators/utils/commutator.py +36 -0
- qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
- qiskit/quantum_info/quaternion.py +156 -0
- qiskit/quantum_info/random.py +26 -0
- qiskit/quantum_info/states/__init__.py +28 -0
- qiskit/quantum_info/states/densitymatrix.py +857 -0
- qiskit/quantum_info/states/measures.py +288 -0
- qiskit/quantum_info/states/quantum_state.py +503 -0
- qiskit/quantum_info/states/random.py +157 -0
- qiskit/quantum_info/states/stabilizerstate.py +805 -0
- qiskit/quantum_info/states/statevector.py +977 -0
- qiskit/quantum_info/states/utils.py +247 -0
- qiskit/result/__init__.py +61 -0
- qiskit/result/counts.py +189 -0
- qiskit/result/distributions/__init__.py +17 -0
- qiskit/result/distributions/probability.py +100 -0
- qiskit/result/distributions/quasi.py +154 -0
- qiskit/result/exceptions.py +40 -0
- qiskit/result/models.py +241 -0
- qiskit/result/postprocess.py +239 -0
- qiskit/result/result.py +385 -0
- qiskit/result/sampled_expval.py +74 -0
- qiskit/result/utils.py +294 -0
- qiskit/synthesis/__init__.py +240 -0
- qiskit/synthesis/arithmetic/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
- qiskit/synthesis/arithmetic/comparators/__init__.py +16 -0
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/synthesis/boolean/__init__.py +13 -0
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/clifford/__init__.py +19 -0
- qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
- qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
- qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
- qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
- qiskit/synthesis/cnotdihedral/__init__.py +17 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
- qiskit/synthesis/discrete_basis/__init__.py +16 -0
- qiskit/synthesis/discrete_basis/commutator_decompose.py +265 -0
- qiskit/synthesis/discrete_basis/gate_sequence.py +421 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +165 -0
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +240 -0
- qiskit/synthesis/evolution/__init__.py +21 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +120 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +313 -0
- qiskit/synthesis/evolution/qdrift.py +130 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +224 -0
- qiskit/synthesis/linear/__init__.py +26 -0
- qiskit/synthesis/linear/cnot_synth.py +69 -0
- qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
- qiskit/synthesis/linear/linear_depth_lnn.py +61 -0
- qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
- qiskit/synthesis/linear_phase/__init__.py +17 -0
- qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +61 -0
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
- qiskit/synthesis/multi_controlled/__init__.py +25 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +359 -0
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
- qiskit/synthesis/one_qubit/__init__.py +15 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
- qiskit/synthesis/permutation/__init__.py +18 -0
- qiskit/synthesis/permutation/permutation_full.py +78 -0
- qiskit/synthesis/permutation/permutation_lnn.py +54 -0
- qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
- qiskit/synthesis/permutation/permutation_utils.py +16 -0
- qiskit/synthesis/qft/__init__.py +16 -0
- qiskit/synthesis/qft/qft_decompose_full.py +97 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +79 -0
- qiskit/synthesis/stabilizer/__init__.py +16 -0
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
- qiskit/synthesis/two_qubit/__init__.py +20 -0
- qiskit/synthesis/two_qubit/local_invariance.py +63 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +583 -0
- qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
- qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
- qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
- qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
- qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
- qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
- qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
- qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
- qiskit/synthesis/unitary/__init__.py +13 -0
- qiskit/synthesis/unitary/aqc/__init__.py +177 -0
- qiskit/synthesis/unitary/aqc/approximate.py +116 -0
- qiskit/synthesis/unitary/aqc/aqc.py +175 -0
- qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
- qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
- qiskit/synthesis/unitary/qsd.py +288 -0
- qiskit/transpiler/__init__.py +1345 -0
- qiskit/transpiler/basepasses.py +190 -0
- qiskit/transpiler/coupling.py +500 -0
- qiskit/transpiler/exceptions.py +59 -0
- qiskit/transpiler/instruction_durations.py +281 -0
- qiskit/transpiler/layout.py +740 -0
- qiskit/transpiler/passes/__init__.py +276 -0
- qiskit/transpiler/passes/analysis/__init__.py +23 -0
- qiskit/transpiler/passes/analysis/count_ops.py +30 -0
- qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
- qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
- qiskit/transpiler/passes/analysis/depth.py +33 -0
- qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
- qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
- qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
- qiskit/transpiler/passes/analysis/size.py +36 -0
- qiskit/transpiler/passes/analysis/width.py +27 -0
- qiskit/transpiler/passes/basis/__init__.py +19 -0
- qiskit/transpiler/passes/basis/basis_translator.py +138 -0
- qiskit/transpiler/passes/basis/decompose.py +137 -0
- qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +84 -0
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +110 -0
- qiskit/transpiler/passes/layout/__init__.py +26 -0
- qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
- qiskit/transpiler/passes/layout/apply_layout.py +128 -0
- qiskit/transpiler/passes/layout/csp_layout.py +132 -0
- qiskit/transpiler/passes/layout/dense_layout.py +177 -0
- qiskit/transpiler/passes/layout/disjoint_utils.py +219 -0
- qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +116 -0
- qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
- qiskit/transpiler/passes/layout/sabre_layout.py +506 -0
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
- qiskit/transpiler/passes/layout/set_layout.py +69 -0
- qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
- qiskit/transpiler/passes/layout/vf2_layout.py +256 -0
- qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
- qiskit/transpiler/passes/layout/vf2_utils.py +235 -0
- qiskit/transpiler/passes/optimization/__init__.py +42 -0
- qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
- qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
- qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +117 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +109 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +85 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +242 -0
- qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
- qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
- qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +176 -0
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
- qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +267 -0
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +250 -0
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
- qiskit/transpiler/passes/optimization/optimize_annotated.py +449 -0
- qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
- qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
- qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
- qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +70 -0
- qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -0
- qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
- qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
- qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +639 -0
- qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
- qiskit/transpiler/passes/routing/__init__.py +21 -0
- qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
- qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
- qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
- qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
- qiskit/transpiler/passes/routing/basic_swap.py +166 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +397 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
- qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
- qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
- qiskit/transpiler/passes/routing/sabre_swap.py +463 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +408 -0
- qiskit/transpiler/passes/routing/utils.py +35 -0
- qiskit/transpiler/passes/scheduling/__init__.py +21 -0
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
- qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
- qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
- qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
- qiskit/transpiler/passes/synthesis/__init__.py +20 -0
- qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
- qiskit/transpiler/passes/synthesis/hls_plugins.py +1963 -0
- qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
- qiskit/transpiler/passes/synthesis/plugin.py +738 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +313 -0
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
- qiskit/transpiler/passes/utils/__init__.py +32 -0
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
- qiskit/transpiler/passes/utils/check_gate_direction.py +60 -0
- qiskit/transpiler/passes/utils/check_map.py +78 -0
- qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
- qiskit/transpiler/passes/utils/control_flow.py +61 -0
- qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
- qiskit/transpiler/passes/utils/error.py +69 -0
- qiskit/transpiler/passes/utils/filter_op_nodes.py +66 -0
- qiskit/transpiler/passes/utils/fixed_point.py +48 -0
- qiskit/transpiler/passes/utils/gate_direction.py +93 -0
- qiskit/transpiler/passes/utils/gates_basis.py +51 -0
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
- qiskit/transpiler/passes/utils/minimum_point.py +118 -0
- qiskit/transpiler/passes/utils/remove_barriers.py +50 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
- qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
- qiskit/transpiler/passmanager.py +503 -0
- qiskit/transpiler/passmanager_config.py +151 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +993 -0
- qiskit/transpiler/preset_passmanagers/common.py +672 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +437 -0
- qiskit/transpiler/preset_passmanagers/level0.py +104 -0
- qiskit/transpiler/preset_passmanagers/level1.py +108 -0
- qiskit/transpiler/preset_passmanagers/level2.py +109 -0
- qiskit/transpiler/preset_passmanagers/level3.py +110 -0
- qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
- qiskit/transpiler/target.py +905 -0
- qiskit/transpiler/timing_constraints.py +59 -0
- qiskit/user_config.py +266 -0
- qiskit/utils/__init__.py +90 -0
- qiskit/utils/classtools.py +146 -0
- qiskit/utils/deprecation.py +382 -0
- qiskit/utils/lazy_tester.py +363 -0
- qiskit/utils/optionals.py +354 -0
- qiskit/utils/parallel.py +318 -0
- qiskit/utils/units.py +146 -0
- qiskit/version.py +84 -0
- qiskit/visualization/__init__.py +290 -0
- qiskit/visualization/array.py +207 -0
- qiskit/visualization/bloch.py +778 -0
- qiskit/visualization/circuit/__init__.py +15 -0
- qiskit/visualization/circuit/_utils.py +675 -0
- qiskit/visualization/circuit/circuit_visualization.py +735 -0
- qiskit/visualization/circuit/latex.py +661 -0
- qiskit/visualization/circuit/matplotlib.py +2019 -0
- qiskit/visualization/circuit/qcstyle.py +278 -0
- qiskit/visualization/circuit/styles/__init__.py +13 -0
- qiskit/visualization/circuit/styles/bw.json +202 -0
- qiskit/visualization/circuit/styles/clifford.json +202 -0
- qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
- qiskit/visualization/circuit/styles/iqp.json +214 -0
- qiskit/visualization/circuit/styles/textbook.json +202 -0
- qiskit/visualization/circuit/text.py +1849 -0
- qiskit/visualization/circuit_visualization.py +19 -0
- qiskit/visualization/counts_visualization.py +487 -0
- qiskit/visualization/dag_visualization.py +318 -0
- qiskit/visualization/exceptions.py +21 -0
- qiskit/visualization/gate_map.py +1424 -0
- qiskit/visualization/library.py +40 -0
- qiskit/visualization/pass_manager_visualization.py +312 -0
- qiskit/visualization/state_visualization.py +1546 -0
- qiskit/visualization/timeline/__init__.py +21 -0
- qiskit/visualization/timeline/core.py +495 -0
- qiskit/visualization/timeline/drawings.py +260 -0
- qiskit/visualization/timeline/generators.py +506 -0
- qiskit/visualization/timeline/interface.py +444 -0
- qiskit/visualization/timeline/layouts.py +115 -0
- qiskit/visualization/timeline/plotters/__init__.py +16 -0
- qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
- qiskit/visualization/timeline/plotters/matplotlib.py +195 -0
- qiskit/visualization/timeline/stylesheet.py +301 -0
- qiskit/visualization/timeline/types.py +148 -0
- qiskit/visualization/transition_visualization.py +369 -0
- qiskit/visualization/utils.py +49 -0
- qiskit-2.0.3.dist-info/METADATA +220 -0
- qiskit-2.0.3.dist-info/RECORD +690 -0
- qiskit-2.0.3.dist-info/WHEEL +6 -0
- qiskit-2.0.3.dist-info/entry_points.txt +82 -0
- qiskit-2.0.3.dist-info/licenses/LICENSE.txt +203 -0
- qiskit-2.0.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,363 @@
|
|
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
|
+
"""A class implementing a (piecewise-) linear function on qubit amplitudes."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
import numpy as np
|
17
|
+
from qiskit.circuit import QuantumCircuit, Gate
|
18
|
+
|
19
|
+
from .piecewise_linear_pauli_rotations import (
|
20
|
+
PiecewiseLinearPauliRotations,
|
21
|
+
PiecewiseLinearPauliRotationsGate,
|
22
|
+
)
|
23
|
+
|
24
|
+
|
25
|
+
class LinearAmplitudeFunction(QuantumCircuit):
|
26
|
+
r"""A circuit implementing a (piecewise) linear function on qubit amplitudes.
|
27
|
+
|
28
|
+
An amplitude function :math:`F` of a function :math:`f` is a mapping
|
29
|
+
|
30
|
+
.. math::
|
31
|
+
|
32
|
+
F|x\rangle|0\rangle = \sqrt{1 - \hat{f}(x)} |x\rangle|0\rangle + \sqrt{\hat{f}(x)}
|
33
|
+
|x\rangle|1\rangle.
|
34
|
+
|
35
|
+
for a function :math:`\hat{f}: \{ 0, ..., 2^n - 1 \} \rightarrow [0, 1]`, where
|
36
|
+
:math:`|x\rangle` is a :math:`n` qubit state.
|
37
|
+
|
38
|
+
This circuit implements :math:`F` for piecewise linear functions :math:`\hat{f}`.
|
39
|
+
In this case, the mapping :math:`F` can be approximately implemented using a Taylor expansion
|
40
|
+
and linearly controlled Pauli-Y rotations, see [1, 2] for more detail. This approximation
|
41
|
+
uses a ``rescaling_factor`` to determine the accuracy of the Taylor expansion.
|
42
|
+
|
43
|
+
In general, the function of interest :math:`f` is defined from some interval :math:`[a,b]`,
|
44
|
+
the ``domain`` to :math:`[c,d]`, the ``image``, instead of :math:`\{ 1, ..., N \}` to
|
45
|
+
:math:`[0, 1]`. Using an affine transformation we can rescale :math:`f` to :math:`\hat{f}`:
|
46
|
+
|
47
|
+
.. math::
|
48
|
+
|
49
|
+
\hat{f}(x) = \frac{f(\phi(x)) - c}{d - c}
|
50
|
+
|
51
|
+
with
|
52
|
+
|
53
|
+
.. math::
|
54
|
+
|
55
|
+
\phi(x) = a + \frac{b - a}{2^n - 1} x.
|
56
|
+
|
57
|
+
If :math:`f` is a piecewise linear function on :math:`m` intervals
|
58
|
+
:math:`[p_{i-1}, p_i], i \in \{1, ..., m\}` with slopes :math:`\alpha_i` and
|
59
|
+
offsets :math:`\beta_i` it can be written as
|
60
|
+
|
61
|
+
.. math::
|
62
|
+
|
63
|
+
f(x) = \sum_{i=1}^m 1_{[p_{i-1}, p_i]}(x) (\alpha_i x + \beta_i)
|
64
|
+
|
65
|
+
where :math:`1_{[a, b]}` is an indication function that is 1 if the argument is in the interval
|
66
|
+
:math:`[a, b]` and otherwise 0. The breakpoints :math:`p_i` can be specified by the
|
67
|
+
``breakpoints`` argument.
|
68
|
+
|
69
|
+
References:
|
70
|
+
|
71
|
+
[1]: Woerner, S., & Egger, D. J. (2018).
|
72
|
+
Quantum Risk Analysis.
|
73
|
+
`arXiv:1806.06893 <http://arxiv.org/abs/1806.06893>`_
|
74
|
+
|
75
|
+
[2]: Gacon, J., Zoufal, C., & Woerner, S. (2020).
|
76
|
+
Quantum-Enhanced Simulation-Based Optimization.
|
77
|
+
`arXiv:2005.10780 <http://arxiv.org/abs/2005.10780>`_
|
78
|
+
"""
|
79
|
+
|
80
|
+
def __init__(
|
81
|
+
self,
|
82
|
+
num_state_qubits: int,
|
83
|
+
slope: float | list[float],
|
84
|
+
offset: float | list[float],
|
85
|
+
domain: tuple[float, float],
|
86
|
+
image: tuple[float, float],
|
87
|
+
rescaling_factor: float = 1,
|
88
|
+
breakpoints: list[float] | None = None,
|
89
|
+
name: str = "F",
|
90
|
+
) -> None:
|
91
|
+
r"""
|
92
|
+
Args:
|
93
|
+
num_state_qubits: The number of qubits used to encode the variable :math:`x`.
|
94
|
+
slope: The slope of the linear function. Can be a list of slopes if it is a piecewise
|
95
|
+
linear function.
|
96
|
+
offset: The offset of the linear function. Can be a list of offsets if it is a piecewise
|
97
|
+
linear function.
|
98
|
+
domain: The domain of the function as tuple :math:`(x_\min{}, x_\max{})`.
|
99
|
+
image: The image of the function as tuple :math:`(f_\min{}, f_\max{})`.
|
100
|
+
rescaling_factor: The rescaling factor to adjust the accuracy in the Taylor
|
101
|
+
approximation.
|
102
|
+
breakpoints: The breakpoints if the function is piecewise linear. If None, the function
|
103
|
+
is not piecewise.
|
104
|
+
name: Name of the circuit.
|
105
|
+
"""
|
106
|
+
if not hasattr(slope, "__len__"):
|
107
|
+
slope = [slope]
|
108
|
+
if not hasattr(offset, "__len__"):
|
109
|
+
offset = [offset]
|
110
|
+
|
111
|
+
# ensure that the breakpoints include the first point of the domain
|
112
|
+
if breakpoints is None:
|
113
|
+
breakpoints = [domain[0]]
|
114
|
+
else:
|
115
|
+
if not np.isclose(breakpoints[0], domain[0]):
|
116
|
+
breakpoints = [domain[0]] + breakpoints
|
117
|
+
|
118
|
+
_check_sizes_match(slope, offset, breakpoints)
|
119
|
+
_check_sorted_and_in_range(breakpoints, domain)
|
120
|
+
|
121
|
+
self._domain = domain
|
122
|
+
self._image = image
|
123
|
+
self._rescaling_factor = rescaling_factor
|
124
|
+
|
125
|
+
# do rescaling
|
126
|
+
a, b = domain
|
127
|
+
c, d = image
|
128
|
+
|
129
|
+
mapped_breakpoints = []
|
130
|
+
mapped_slope = []
|
131
|
+
mapped_offset = []
|
132
|
+
for i, point in enumerate(breakpoints):
|
133
|
+
mapped_breakpoint = (point - a) / (b - a) * (2**num_state_qubits - 1)
|
134
|
+
mapped_breakpoints += [mapped_breakpoint]
|
135
|
+
|
136
|
+
# factor (upper - lower) / (2^n - 1) is for the scaling of x to [l,u]
|
137
|
+
# note that the +l for mapping to [l,u] is already included in
|
138
|
+
# the offsets given as parameters
|
139
|
+
mapped_slope += [slope[i] * (b - a) / (2**num_state_qubits - 1)]
|
140
|
+
mapped_offset += [offset[i]]
|
141
|
+
|
142
|
+
# approximate linear behavior by scaling and contracting around pi/4
|
143
|
+
slope_angles = np.zeros(len(breakpoints))
|
144
|
+
offset_angles = np.pi / 4 * (1 - rescaling_factor) * np.ones(len(breakpoints))
|
145
|
+
for i in range(len(breakpoints)):
|
146
|
+
slope_angles[i] = np.pi * rescaling_factor * mapped_slope[i] / 2 / (d - c)
|
147
|
+
offset_angles[i] += np.pi * rescaling_factor * (mapped_offset[i] - c) / 2 / (d - c)
|
148
|
+
|
149
|
+
# use PWLPauliRotations to implement the function
|
150
|
+
pwl_pauli_rotation = PiecewiseLinearPauliRotations(
|
151
|
+
num_state_qubits, mapped_breakpoints, 2 * slope_angles, 2 * offset_angles, name=name
|
152
|
+
)
|
153
|
+
|
154
|
+
super().__init__(*pwl_pauli_rotation.qregs, name=name)
|
155
|
+
self.append(pwl_pauli_rotation.to_gate(), self.qubits)
|
156
|
+
|
157
|
+
def post_processing(self, scaled_value: float) -> float:
|
158
|
+
r"""Map the function value of the approximated :math:`\hat{f}` to :math:`f`.
|
159
|
+
|
160
|
+
Args:
|
161
|
+
scaled_value: A function value from the Taylor expansion of :math:`\hat{f}(x)`.
|
162
|
+
|
163
|
+
Returns:
|
164
|
+
The ``scaled_value`` mapped back to the domain of :math:`f`, by first inverting
|
165
|
+
the transformation used for the Taylor approximation and then mapping back from
|
166
|
+
:math:`[0, 1]` to the original domain.
|
167
|
+
"""
|
168
|
+
# revert the mapping applied in the Taylor approximation
|
169
|
+
value = scaled_value - 1 / 2 + np.pi / 4 * self._rescaling_factor
|
170
|
+
value *= 2 / np.pi / self._rescaling_factor
|
171
|
+
|
172
|
+
# map the value from [0, 1] back to the original domain
|
173
|
+
value *= self._image[1] - self._image[0]
|
174
|
+
value += self._image[0]
|
175
|
+
|
176
|
+
return value
|
177
|
+
|
178
|
+
|
179
|
+
class LinearAmplitudeFunctionGate(Gate):
|
180
|
+
r"""A circuit implementing a (piecewise) linear function on qubit amplitudes.
|
181
|
+
|
182
|
+
An amplitude function :math:`F` of a function :math:`f` is a mapping
|
183
|
+
|
184
|
+
.. math::
|
185
|
+
|
186
|
+
F|x\rangle|0\rangle = \sqrt{1 - \hat{f}(x)} |x\rangle|0\rangle + \sqrt{\hat{f}(x)}
|
187
|
+
|x\rangle|1\rangle.
|
188
|
+
|
189
|
+
for a function :math:`\hat{f}: \{ 0, ..., 2^n - 1 \} \rightarrow [0, 1]`, where
|
190
|
+
:math:`|x\rangle` is a :math:`n` qubit state.
|
191
|
+
|
192
|
+
This circuit implements :math:`F` for piecewise linear functions :math:`\hat{f}`.
|
193
|
+
In this case, the mapping :math:`F` can be approximately implemented using a Taylor expansion
|
194
|
+
and linearly controlled Pauli-Y rotations, see [1, 2] for more detail. This approximation
|
195
|
+
uses a ``rescaling_factor`` to determine the accuracy of the Taylor expansion.
|
196
|
+
|
197
|
+
In general, the function of interest :math:`f` is defined from some interval :math:`[a,b]`,
|
198
|
+
the ``domain`` to :math:`[c,d]`, the ``image``, instead of :math:`\{ 1, ..., N \}` to
|
199
|
+
:math:`[0, 1]`. Using an affine transformation we can rescale :math:`f` to :math:`\hat{f}`:
|
200
|
+
|
201
|
+
.. math::
|
202
|
+
|
203
|
+
\hat{f}(x) = \frac{f(\phi(x)) - c}{d - c}
|
204
|
+
|
205
|
+
with
|
206
|
+
|
207
|
+
.. math::
|
208
|
+
|
209
|
+
\phi(x) = a + \frac{b - a}{2^n - 1} x.
|
210
|
+
|
211
|
+
If :math:`f` is a piecewise linear function on :math:`m` intervals
|
212
|
+
:math:`[p_{i-1}, p_i], i \in \{1, ..., m\}` with slopes :math:`\alpha_i` and
|
213
|
+
offsets :math:`\beta_i` it can be written as
|
214
|
+
|
215
|
+
.. math::
|
216
|
+
|
217
|
+
f(x) = \sum_{i=1}^m 1_{[p_{i-1}, p_i]}(x) (\alpha_i x + \beta_i)
|
218
|
+
|
219
|
+
where :math:`1_{[a, b]}` is an indication function that is 1 if the argument is in the interval
|
220
|
+
:math:`[a, b]` and otherwise 0. The breakpoints :math:`p_i` can be specified by the
|
221
|
+
``breakpoints`` argument.
|
222
|
+
|
223
|
+
References:
|
224
|
+
|
225
|
+
[1]: Woerner, S., & Egger, D. J. (2018).
|
226
|
+
Quantum Risk Analysis.
|
227
|
+
`arXiv:1806.06893 <http://arxiv.org/abs/1806.06893>`_
|
228
|
+
|
229
|
+
[2]: Gacon, J., Zoufal, C., & Woerner, S. (2020).
|
230
|
+
Quantum-Enhanced Simulation-Based Optimization.
|
231
|
+
`arXiv:2005.10780 <http://arxiv.org/abs/2005.10780>`_
|
232
|
+
"""
|
233
|
+
|
234
|
+
def __init__(
|
235
|
+
self,
|
236
|
+
num_state_qubits: int,
|
237
|
+
slope: float | list[float],
|
238
|
+
offset: float | list[float],
|
239
|
+
domain: tuple[float, float],
|
240
|
+
image: tuple[float, float],
|
241
|
+
rescaling_factor: float = 1,
|
242
|
+
breakpoints: list[float] | None = None,
|
243
|
+
label: str = "F",
|
244
|
+
) -> None:
|
245
|
+
r"""
|
246
|
+
Args:
|
247
|
+
num_state_qubits: The number of qubits used to encode the variable :math:`x`.
|
248
|
+
slope: The slope of the linear function. Can be a list of slopes if it is a piecewise
|
249
|
+
linear function.
|
250
|
+
offset: The offset of the linear function. Can be a list of offsets if it is a piecewise
|
251
|
+
linear function.
|
252
|
+
domain: The domain of the function as tuple :math:`(x_\min{}, x_\max{})`.
|
253
|
+
image: The image of the function as tuple :math:`(f_\min{}, f_\max{})`.
|
254
|
+
rescaling_factor: The rescaling factor to adjust the accuracy in the Taylor
|
255
|
+
approximation.
|
256
|
+
breakpoints: The breakpoints if the function is piecewise linear. If None, the function
|
257
|
+
is not piecewise.
|
258
|
+
label: A label for the gate.
|
259
|
+
"""
|
260
|
+
if not hasattr(slope, "__len__"):
|
261
|
+
slope = [slope]
|
262
|
+
if not hasattr(offset, "__len__"):
|
263
|
+
offset = [offset]
|
264
|
+
|
265
|
+
# ensure that the breakpoints include the first point of the domain
|
266
|
+
if breakpoints is None:
|
267
|
+
breakpoints = [domain[0]]
|
268
|
+
else:
|
269
|
+
if not np.isclose(breakpoints[0], domain[0]):
|
270
|
+
breakpoints = [domain[0]] + breakpoints
|
271
|
+
|
272
|
+
_check_sizes_match(slope, offset, breakpoints)
|
273
|
+
_check_sorted_and_in_range(breakpoints, domain)
|
274
|
+
|
275
|
+
self.slope = slope
|
276
|
+
self.offset = offset
|
277
|
+
self.domain = domain
|
278
|
+
self.image = image
|
279
|
+
self.rescaling_factor = rescaling_factor
|
280
|
+
self.breakpoints = breakpoints
|
281
|
+
|
282
|
+
num_compare = int(len(breakpoints) > 1)
|
283
|
+
super().__init__("LinFunction", num_state_qubits + num_compare + 1, [], label=label)
|
284
|
+
|
285
|
+
def _define(self):
|
286
|
+
num_compare = int(len(self.breakpoints) > 1)
|
287
|
+
num_state_qubits = self.num_qubits - num_compare - 1
|
288
|
+
|
289
|
+
# do rescaling
|
290
|
+
a, b = self.domain
|
291
|
+
c, d = self.image
|
292
|
+
|
293
|
+
mapped_breakpoints = []
|
294
|
+
mapped_slope = []
|
295
|
+
mapped_offset = []
|
296
|
+
for i, point in enumerate(self.breakpoints):
|
297
|
+
mapped_breakpoint = (point - a) / (b - a) * (2**num_state_qubits - 1)
|
298
|
+
mapped_breakpoints += [mapped_breakpoint]
|
299
|
+
|
300
|
+
# factor (upper - lower) / (2^n - 1) is for the scaling of x to [l,u]
|
301
|
+
# note that the +l for mapping to [l,u] is already included in
|
302
|
+
# the offsets given as parameters
|
303
|
+
mapped_slope += [self.slope[i] * (b - a) / (2**num_state_qubits - 1)]
|
304
|
+
mapped_offset += [self.offset[i]]
|
305
|
+
|
306
|
+
# approximate linear behavior by scaling and contracting around pi/4
|
307
|
+
slope_angles = np.zeros(len(self.breakpoints))
|
308
|
+
offset_angles = np.pi / 4 * (1 - self.rescaling_factor) * np.ones_like(slope_angles)
|
309
|
+
for i, (slope_i, offset_i) in enumerate(zip(mapped_slope, mapped_offset)):
|
310
|
+
slope_angles[i] = np.pi * self.rescaling_factor * slope_i / 2 / (d - c)
|
311
|
+
offset_angles[i] += np.pi * self.rescaling_factor * (offset_i - c) / 2 / (d - c)
|
312
|
+
|
313
|
+
# use PWLPauliRotations to implement the function
|
314
|
+
pwl_pauli_rotation = PiecewiseLinearPauliRotationsGate(
|
315
|
+
num_state_qubits, mapped_breakpoints, 2 * slope_angles, 2 * offset_angles
|
316
|
+
)
|
317
|
+
|
318
|
+
self.definition = QuantumCircuit(pwl_pauli_rotation.num_qubits)
|
319
|
+
self.definition.append(pwl_pauli_rotation, self.definition.qubits)
|
320
|
+
|
321
|
+
def post_processing(self, scaled_value: float) -> float:
|
322
|
+
r"""Map the function value of the approximated :math:`\hat{f}` to :math:`f`.
|
323
|
+
|
324
|
+
Args:
|
325
|
+
scaled_value: A function value from the Taylor expansion of :math:`\hat{f}(x)`.
|
326
|
+
|
327
|
+
Returns:
|
328
|
+
The ``scaled_value`` mapped back to the domain of :math:`f`, by first inverting
|
329
|
+
the transformation used for the Taylor approximation and then mapping back from
|
330
|
+
:math:`[0, 1]` to the original domain.
|
331
|
+
"""
|
332
|
+
# revert the mapping applied in the Taylor approximation
|
333
|
+
value = scaled_value - 1 / 2 + np.pi / 4 * self.rescaling_factor
|
334
|
+
value *= 2 / np.pi / self.rescaling_factor
|
335
|
+
|
336
|
+
# map the value from [0, 1] back to the original domain
|
337
|
+
value *= self.image[1] - self.image[0]
|
338
|
+
value += self.image[0]
|
339
|
+
|
340
|
+
return value
|
341
|
+
|
342
|
+
|
343
|
+
def _check_sorted_and_in_range(breakpoints, domain):
|
344
|
+
if breakpoints is None:
|
345
|
+
return
|
346
|
+
|
347
|
+
# check if sorted
|
348
|
+
if not np.all(np.diff(breakpoints) > 0):
|
349
|
+
raise ValueError("Breakpoints must be unique and sorted.")
|
350
|
+
|
351
|
+
if breakpoints[0] < domain[0] or breakpoints[-1] > domain[1]:
|
352
|
+
raise ValueError("Breakpoints must be included in domain.")
|
353
|
+
|
354
|
+
|
355
|
+
def _check_sizes_match(slope, offset, breakpoints):
|
356
|
+
size = len(slope)
|
357
|
+
if len(offset) != size:
|
358
|
+
raise ValueError(f"Size mismatch of slope ({size}) and offset ({len(offset)}).")
|
359
|
+
if breakpoints is not None:
|
360
|
+
if len(breakpoints) != size:
|
361
|
+
raise ValueError(
|
362
|
+
f"Size mismatch of slope ({size}) and breakpoints ({len(breakpoints)})."
|
363
|
+
)
|
@@ -0,0 +1,243 @@
|
|
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
|
+
"""Linearly-controlled X, Y or Z rotation."""
|
15
|
+
|
16
|
+
from __future__ import annotations
|
17
|
+
from typing import Optional
|
18
|
+
|
19
|
+
from qiskit.circuit import QuantumRegister, QuantumCircuit, Gate
|
20
|
+
from qiskit.circuit.exceptions import CircuitError
|
21
|
+
|
22
|
+
from .functional_pauli_rotations import FunctionalPauliRotations
|
23
|
+
|
24
|
+
|
25
|
+
class LinearPauliRotations(FunctionalPauliRotations):
|
26
|
+
r"""Linearly-controlled X, Y or Z rotation.
|
27
|
+
|
28
|
+
For a register of state qubits :math:`|x\rangle`, a target qubit :math:`|0\rangle` and the
|
29
|
+
basis ``'Y'`` this circuit acts as:
|
30
|
+
|
31
|
+
.. code-block:: text
|
32
|
+
|
33
|
+
q_0: ─────────────────────────■───────── ... ──────────────────────
|
34
|
+
│
|
35
|
+
.
|
36
|
+
│
|
37
|
+
q_(n-1): ─────────────────────────┼───────── ... ───────────■──────────
|
38
|
+
┌────────────┐ ┌───────┴───────┐ ┌─────────┴─────────┐
|
39
|
+
q_n: ─┤ RY(offset) ├──┤ RY(2^0 slope) ├ ... ┤ RY(2^(n-1) slope) ├
|
40
|
+
└────────────┘ └───────────────┘ └───────────────────┘
|
41
|
+
|
42
|
+
This can for example be used to approximate linear functions, with :math:`a =` ``slope``:math:`/2`
|
43
|
+
and :math:`b =` ``offset``:math:`/2` and the basis ``'Y'``:
|
44
|
+
|
45
|
+
.. math::
|
46
|
+
|
47
|
+
|x\rangle |0\rangle \mapsto \cos(ax + b)|x\rangle|0\rangle + \sin(ax + b)|x\rangle |1\rangle
|
48
|
+
|
49
|
+
Since for small arguments :math:`\sin(x) \approx x` this operator can be used to approximate
|
50
|
+
linear functions.
|
51
|
+
"""
|
52
|
+
|
53
|
+
def __init__(
|
54
|
+
self,
|
55
|
+
num_state_qubits: Optional[int] = None,
|
56
|
+
slope: float = 1,
|
57
|
+
offset: float = 0,
|
58
|
+
basis: str = "Y",
|
59
|
+
name: str = "LinRot",
|
60
|
+
) -> None:
|
61
|
+
r"""Create a new linear rotation circuit.
|
62
|
+
|
63
|
+
Args:
|
64
|
+
num_state_qubits: The number of qubits representing the state :math:`|x\rangle`.
|
65
|
+
slope: The slope of the controlled rotation.
|
66
|
+
offset: The offset of the controlled rotation.
|
67
|
+
basis: The type of Pauli rotation ('X', 'Y', 'Z').
|
68
|
+
name: The name of the circuit object.
|
69
|
+
"""
|
70
|
+
super().__init__(num_state_qubits=num_state_qubits, basis=basis, name=name)
|
71
|
+
|
72
|
+
# define internal parameters
|
73
|
+
self._slope = None
|
74
|
+
self._offset = None
|
75
|
+
|
76
|
+
# store parameters
|
77
|
+
self.slope = slope
|
78
|
+
self.offset = offset
|
79
|
+
|
80
|
+
@property
|
81
|
+
def slope(self) -> float:
|
82
|
+
"""The multiplicative factor in the rotation angle of the controlled rotations.
|
83
|
+
|
84
|
+
The rotation angles are ``slope * 2^0``, ``slope * 2^1``, ... , ``slope * 2^(n-1)`` where
|
85
|
+
``n`` is the number of state qubits.
|
86
|
+
|
87
|
+
Returns:
|
88
|
+
The rotation angle common in all controlled rotations.
|
89
|
+
"""
|
90
|
+
return self._slope
|
91
|
+
|
92
|
+
@slope.setter
|
93
|
+
def slope(self, slope: float) -> None:
|
94
|
+
"""Set the multiplicative factor of the rotation angles.
|
95
|
+
|
96
|
+
Args:
|
97
|
+
The slope of the rotation angles.
|
98
|
+
"""
|
99
|
+
if self._slope is None or slope != self._slope:
|
100
|
+
self._invalidate()
|
101
|
+
self._slope = slope
|
102
|
+
|
103
|
+
@property
|
104
|
+
def offset(self) -> float:
|
105
|
+
"""The angle of the single qubit offset rotation on the target qubit.
|
106
|
+
|
107
|
+
Before applying the controlled rotations, a single rotation of angle ``offset`` is
|
108
|
+
applied to the target qubit.
|
109
|
+
|
110
|
+
Returns:
|
111
|
+
The offset angle.
|
112
|
+
"""
|
113
|
+
return self._offset
|
114
|
+
|
115
|
+
@offset.setter
|
116
|
+
def offset(self, offset: float) -> None:
|
117
|
+
"""Set the angle for the offset rotation on the target qubit.
|
118
|
+
|
119
|
+
Args:
|
120
|
+
offset: The offset rotation angle.
|
121
|
+
"""
|
122
|
+
if self._offset is None or offset != self._offset:
|
123
|
+
self._invalidate()
|
124
|
+
self._offset = offset
|
125
|
+
|
126
|
+
def _reset_registers(self, num_state_qubits: Optional[int]) -> None:
|
127
|
+
"""Set the number of state qubits.
|
128
|
+
|
129
|
+
Note that this changes the underlying quantum register, if the number of state qubits
|
130
|
+
changes.
|
131
|
+
|
132
|
+
Args:
|
133
|
+
num_state_qubits: The new number of qubits.
|
134
|
+
"""
|
135
|
+
self.qregs = []
|
136
|
+
|
137
|
+
if num_state_qubits:
|
138
|
+
# set new register of appropriate size
|
139
|
+
qr_state = QuantumRegister(num_state_qubits, name="state")
|
140
|
+
qr_target = QuantumRegister(1, name="target")
|
141
|
+
self.qregs = [qr_state, qr_target]
|
142
|
+
|
143
|
+
def _check_configuration(self, raise_on_failure: bool = True) -> bool:
|
144
|
+
"""Check if the current configuration is valid."""
|
145
|
+
valid = True
|
146
|
+
|
147
|
+
if self.num_state_qubits is None:
|
148
|
+
valid = False
|
149
|
+
if raise_on_failure:
|
150
|
+
raise AttributeError("The number of qubits has not been set.")
|
151
|
+
|
152
|
+
if self.num_qubits < self.num_state_qubits + 1:
|
153
|
+
valid = False
|
154
|
+
if raise_on_failure:
|
155
|
+
raise CircuitError(
|
156
|
+
"Not enough qubits in the circuit, need at least "
|
157
|
+
f"{self.num_state_qubits + 1}."
|
158
|
+
)
|
159
|
+
|
160
|
+
return valid
|
161
|
+
|
162
|
+
def _build(self):
|
163
|
+
"""If not already built, build the circuit."""
|
164
|
+
if self._is_built:
|
165
|
+
return
|
166
|
+
|
167
|
+
super()._build()
|
168
|
+
gate = LinearPauliRotationsGate(self.num_state_qubits, self.slope, self.offset, self.basis)
|
169
|
+
self.append(gate, self.qubits)
|
170
|
+
|
171
|
+
|
172
|
+
class LinearPauliRotationsGate(Gate):
|
173
|
+
r"""Linearly-controlled X, Y or Z rotation.
|
174
|
+
|
175
|
+
For a register of state qubits :math:`|x\rangle`, a target qubit :math:`|0\rangle` and the
|
176
|
+
basis ``'Y'`` this circuit acts as:
|
177
|
+
|
178
|
+
.. parsed-literal::
|
179
|
+
|
180
|
+
q_0: ─────────────────────────■───────── ... ──────────────────────
|
181
|
+
│
|
182
|
+
.
|
183
|
+
│
|
184
|
+
q_(n-1): ─────────────────────────┼───────── ... ───────────■──────────
|
185
|
+
┌────────────┐ ┌───────┴───────┐ ┌─────────┴─────────┐
|
186
|
+
q_n: ─┤ RY(offset) ├──┤ RY(2^0 slope) ├ ... ┤ RY(2^(n-1) slope) ├
|
187
|
+
└────────────┘ └───────────────┘ └───────────────────┘
|
188
|
+
|
189
|
+
This can for example be used to approximate linear functions, with :math:`a =` ``slope``:math:`/2`
|
190
|
+
and :math:`b =` ``offset``:math:`/2` and the basis ``'Y'``:
|
191
|
+
|
192
|
+
.. math::
|
193
|
+
|
194
|
+
|x\rangle |0\rangle \mapsto \cos(ax + b)|x\rangle|0\rangle + \sin(ax + b)|x\rangle |1\rangle
|
195
|
+
|
196
|
+
Since for small arguments :math:`\sin(x) \approx x` this operator can be used to approximate
|
197
|
+
linear functions.
|
198
|
+
"""
|
199
|
+
|
200
|
+
def __init__(
|
201
|
+
self,
|
202
|
+
num_state_qubits: int,
|
203
|
+
slope: float = 1,
|
204
|
+
offset: float = 0,
|
205
|
+
basis: str = "Y",
|
206
|
+
label: str | None = None,
|
207
|
+
) -> None:
|
208
|
+
r"""
|
209
|
+
Args:
|
210
|
+
num_state_qubits: The number of qubits representing the state :math:`|x\rangle`.
|
211
|
+
slope: The slope of the controlled rotation.
|
212
|
+
offset: The offset of the controlled rotation.
|
213
|
+
basis: The type of Pauli rotation ('X', 'Y', 'Z').
|
214
|
+
label: The label of the gate.
|
215
|
+
"""
|
216
|
+
super().__init__("LinPauliRot", num_state_qubits + 1, [], label=label)
|
217
|
+
self.slope = slope
|
218
|
+
self.offset = offset
|
219
|
+
self.basis = basis.lower()
|
220
|
+
|
221
|
+
def _define(self):
|
222
|
+
circuit = QuantumCircuit(self.num_qubits, name=self.name)
|
223
|
+
|
224
|
+
# build the circuit
|
225
|
+
qr_state = circuit.qubits[: self.num_qubits - 1]
|
226
|
+
qr_target = circuit.qubits[-1]
|
227
|
+
|
228
|
+
if self.basis == "x":
|
229
|
+
circuit.rx(self.offset, qr_target)
|
230
|
+
elif self.basis == "y":
|
231
|
+
circuit.ry(self.offset, qr_target)
|
232
|
+
else: # 'Z':
|
233
|
+
circuit.rz(self.offset, qr_target)
|
234
|
+
|
235
|
+
for i, q_i in enumerate(qr_state):
|
236
|
+
if self.basis == "x":
|
237
|
+
circuit.crx(self.slope * pow(2, i), q_i, qr_target)
|
238
|
+
elif self.basis == "y":
|
239
|
+
circuit.cry(self.slope * pow(2, i), q_i, qr_target)
|
240
|
+
else: # 'Z'
|
241
|
+
circuit.crz(self.slope * pow(2, i), q_i, qr_target)
|
242
|
+
|
243
|
+
self.definition = circuit
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2021.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""The multiplier circuit library."""
|
14
|
+
|
15
|
+
from .hrs_cumulative_multiplier import HRSCumulativeMultiplier
|
16
|
+
from .rg_qft_multiplier import RGQFTMultiplier
|
17
|
+
from .multiplier import MultiplierGate
|