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,583 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2024.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
# pylint: disable=invalid-name
|
14
|
+
|
15
|
+
"""
|
16
|
+
Expand 2-qubit Unitary operators into an equivalent
|
17
|
+
decomposition over SU(2)+fixed 2q basis gate, using the KAK method.
|
18
|
+
|
19
|
+
May be exact or approximate expansion. In either case uses the minimal
|
20
|
+
number of basis applications.
|
21
|
+
|
22
|
+
Method is described in Appendix B of Cross, A. W., Bishop, L. S., Sheldon, S., Nation, P. D. &
|
23
|
+
Gambetta, J. M. Validating quantum computers using randomized model circuits.
|
24
|
+
arXiv:1811.12926 [quant-ph] (2018).
|
25
|
+
"""
|
26
|
+
from __future__ import annotations
|
27
|
+
import io
|
28
|
+
import base64
|
29
|
+
import warnings
|
30
|
+
from typing import Optional, Type, TYPE_CHECKING
|
31
|
+
|
32
|
+
import logging
|
33
|
+
|
34
|
+
import numpy as np
|
35
|
+
|
36
|
+
from qiskit.circuit import QuantumRegister, QuantumCircuit, Gate, CircuitInstruction
|
37
|
+
from qiskit.circuit.library.standard_gates import (
|
38
|
+
CXGate,
|
39
|
+
U3Gate,
|
40
|
+
U2Gate,
|
41
|
+
U1Gate,
|
42
|
+
UGate,
|
43
|
+
PhaseGate,
|
44
|
+
RXGate,
|
45
|
+
RYGate,
|
46
|
+
RZGate,
|
47
|
+
SXGate,
|
48
|
+
XGate,
|
49
|
+
RGate,
|
50
|
+
)
|
51
|
+
from qiskit.exceptions import QiskitError
|
52
|
+
from qiskit.quantum_info.operators import Operator
|
53
|
+
from qiskit.synthesis.one_qubit.one_qubit_decompose import (
|
54
|
+
DEFAULT_ATOL,
|
55
|
+
)
|
56
|
+
from qiskit.utils.deprecation import deprecate_func
|
57
|
+
from qiskit._accelerate import two_qubit_decompose
|
58
|
+
|
59
|
+
if TYPE_CHECKING:
|
60
|
+
from qiskit.dagcircuit.dagcircuit import DAGCircuit, DAGOpNode
|
61
|
+
|
62
|
+
logger = logging.getLogger(__name__)
|
63
|
+
|
64
|
+
|
65
|
+
GATE_NAME_MAP = {
|
66
|
+
"cx": CXGate,
|
67
|
+
"rx": RXGate,
|
68
|
+
"sx": SXGate,
|
69
|
+
"x": XGate,
|
70
|
+
"rz": RZGate,
|
71
|
+
"u": UGate,
|
72
|
+
"p": PhaseGate,
|
73
|
+
"u1": U1Gate,
|
74
|
+
"u2": U2Gate,
|
75
|
+
"u3": U3Gate,
|
76
|
+
"ry": RYGate,
|
77
|
+
"r": RGate,
|
78
|
+
}
|
79
|
+
|
80
|
+
|
81
|
+
def decompose_two_qubit_product_gate(special_unitary_matrix: np.ndarray):
|
82
|
+
r"""Decompose :math:`U = U_l \otimes U_r` where :math:`U \in SU(4)`,
|
83
|
+
and :math:`U_l,~U_r \in SU(2)`.
|
84
|
+
|
85
|
+
Args:
|
86
|
+
special_unitary_matrix: special unitary matrix to decompose
|
87
|
+
Raises:
|
88
|
+
QiskitError: if decomposition isn't possible.
|
89
|
+
"""
|
90
|
+
special_unitary_matrix = np.asarray(special_unitary_matrix, dtype=complex)
|
91
|
+
(L, R, phase) = two_qubit_decompose.decompose_two_qubit_product_gate(special_unitary_matrix)
|
92
|
+
|
93
|
+
temp = np.kron(L, R)
|
94
|
+
deviation = abs(abs(temp.conj().T.dot(special_unitary_matrix).trace()) - 4)
|
95
|
+
|
96
|
+
if deviation > 1.0e-13:
|
97
|
+
raise QiskitError(
|
98
|
+
"decompose_two_qubit_product_gate: decomposition failed: "
|
99
|
+
f"deviation too large: {deviation}"
|
100
|
+
)
|
101
|
+
|
102
|
+
return (L, R, phase)
|
103
|
+
|
104
|
+
|
105
|
+
class TwoQubitWeylDecomposition:
|
106
|
+
r"""Two-qubit Weyl decomposition.
|
107
|
+
|
108
|
+
Decompose two-qubit unitary
|
109
|
+
|
110
|
+
.. math::
|
111
|
+
|
112
|
+
U = ({K_1}^l \otimes {K_1}^r) e^{(i a XX + i b YY + i c ZZ)} ({K_2}^l \otimes {K_2}^r)
|
113
|
+
|
114
|
+
where
|
115
|
+
|
116
|
+
.. math::
|
117
|
+
|
118
|
+
U \in U(4),~
|
119
|
+
{K_1}^l, {K_1}^r, {K_2}^l, {K_2}^r \in SU(2)
|
120
|
+
|
121
|
+
and we stay in the "Weyl Chamber"
|
122
|
+
|
123
|
+
.. math::
|
124
|
+
|
125
|
+
\pi /4 \geq a \geq b \geq |c|
|
126
|
+
|
127
|
+
This class avoids some problems of numerical instability near high-symmetry loci within the Weyl
|
128
|
+
chamber. If there is a high-symmetry gate "nearby" (in terms of the requested average gate fidelity),
|
129
|
+
then it return a canonicalized decomposition of that high-symmetry gate.
|
130
|
+
|
131
|
+
References:
|
132
|
+
1. Cross, A. W., Bishop, L. S., Sheldon, S., Nation, P. D. & Gambetta, J. M.,
|
133
|
+
*Validating quantum computers using randomized model circuits*,
|
134
|
+
`arXiv:1811.12926 [quant-ph] <https://arxiv.org/abs/1811.12926>`_
|
135
|
+
2. B. Kraus, J. I. Cirac, *Optimal Creation of Entanglement Using a Two-Qubit Gate*,
|
136
|
+
`arXiv:0011050 [quant-ph] <https://arxiv.org/abs/quant-ph/0011050>`_
|
137
|
+
3. B. Drury, P. J. Love, *Constructive Quantum Shannon Decomposition from Cartan
|
138
|
+
Involutions*, `arXiv:0806.4015 [quant-ph] <https://arxiv.org/abs/0806.4015>`_
|
139
|
+
|
140
|
+
"""
|
141
|
+
|
142
|
+
# The parameters of the decomposition:
|
143
|
+
a: float
|
144
|
+
b: float
|
145
|
+
c: float
|
146
|
+
global_phase: float
|
147
|
+
K1l: np.ndarray
|
148
|
+
K2l: np.ndarray
|
149
|
+
K1r: np.ndarray
|
150
|
+
K2r: np.ndarray
|
151
|
+
|
152
|
+
unitary_matrix: np.ndarray # The unitary that was input
|
153
|
+
requested_fidelity: Optional[float] # None means no automatic specialization
|
154
|
+
calculated_fidelity: float # Fidelity after specialization
|
155
|
+
|
156
|
+
_specializations = two_qubit_decompose.Specialization
|
157
|
+
|
158
|
+
def __init__(
|
159
|
+
self,
|
160
|
+
unitary_matrix: np.ndarray,
|
161
|
+
fidelity: float | None = 1.0 - 1.0e-9,
|
162
|
+
*,
|
163
|
+
_specialization: two_qubit_decompose.Specialization | None = None,
|
164
|
+
):
|
165
|
+
unitary_matrix = np.asarray(unitary_matrix, dtype=complex)
|
166
|
+
self._inner_decomposition = two_qubit_decompose.TwoQubitWeylDecomposition(
|
167
|
+
unitary_matrix, fidelity=fidelity, _specialization=_specialization
|
168
|
+
)
|
169
|
+
self.a = self._inner_decomposition.a
|
170
|
+
self.b = self._inner_decomposition.b
|
171
|
+
self.c = self._inner_decomposition.c
|
172
|
+
self.global_phase = self._inner_decomposition.global_phase
|
173
|
+
self.K1l = self._inner_decomposition.K1l
|
174
|
+
self.K1r = self._inner_decomposition.K1r
|
175
|
+
self.K2l = self._inner_decomposition.K2l
|
176
|
+
self.K2r = self._inner_decomposition.K2r
|
177
|
+
self.unitary_matrix = unitary_matrix
|
178
|
+
self.requested_fidelity = fidelity
|
179
|
+
self.calculated_fidelity = self._inner_decomposition.calculated_fidelity
|
180
|
+
if logger.isEnabledFor(logging.DEBUG):
|
181
|
+
actual_fidelity = self.actual_fidelity()
|
182
|
+
logger.debug(
|
183
|
+
"Requested fidelity: %s calculated fidelity: %s actual fidelity %s",
|
184
|
+
self.requested_fidelity,
|
185
|
+
self.calculated_fidelity,
|
186
|
+
actual_fidelity,
|
187
|
+
)
|
188
|
+
if abs(self.calculated_fidelity - actual_fidelity) > 1.0e-12:
|
189
|
+
logger.warning(
|
190
|
+
"Requested fidelity different from actual by %s",
|
191
|
+
self.calculated_fidelity - actual_fidelity,
|
192
|
+
)
|
193
|
+
|
194
|
+
@deprecate_func(since="1.1.0", removal_timeline="in the 2.0.0 release")
|
195
|
+
def specialize(self):
|
196
|
+
"""Make changes to the decomposition to comply with any specializations.
|
197
|
+
|
198
|
+
This method will always raise a ``NotImplementedError`` because
|
199
|
+
there are no specializations to comply with in the current implementation.
|
200
|
+
"""
|
201
|
+
raise NotImplementedError
|
202
|
+
|
203
|
+
def circuit(
|
204
|
+
self, *, euler_basis: str | None = None, simplify: bool = False, atol: float = DEFAULT_ATOL
|
205
|
+
) -> QuantumCircuit:
|
206
|
+
"""Returns Weyl decomposition in circuit form."""
|
207
|
+
circuit_data = self._inner_decomposition.circuit(
|
208
|
+
euler_basis=euler_basis, simplify=simplify, atol=atol
|
209
|
+
)
|
210
|
+
return QuantumCircuit._from_circuit_data(circuit_data, add_regs=True)
|
211
|
+
|
212
|
+
def actual_fidelity(self, **kwargs) -> float:
|
213
|
+
"""Calculates the actual fidelity of the decomposed circuit to the input unitary."""
|
214
|
+
circ = self.circuit(**kwargs)
|
215
|
+
trace = np.trace(Operator(circ).data.T.conj() @ self.unitary_matrix)
|
216
|
+
return two_qubit_decompose.trace_to_fid(trace)
|
217
|
+
|
218
|
+
def __repr__(self):
|
219
|
+
"""Represent with enough precision to allow copy-paste debugging of all corner cases"""
|
220
|
+
prefix = f"{type(self).__qualname__}.from_bytes("
|
221
|
+
with io.BytesIO() as f:
|
222
|
+
np.save(f, self.unitary_matrix, allow_pickle=False)
|
223
|
+
b64 = base64.encodebytes(f.getvalue()).splitlines()
|
224
|
+
b64ascii = [repr(x) for x in b64]
|
225
|
+
b64ascii[-1] += ","
|
226
|
+
pretty = [f"# {x.rstrip()}" for x in str(self).splitlines()]
|
227
|
+
indent = "\n" + " " * 4
|
228
|
+
specialization_variant = str(self._inner_decomposition.specialization).split(".")[1]
|
229
|
+
specialization_repr = f"{type(self).__qualname__}._specializations.{specialization_variant}"
|
230
|
+
lines = (
|
231
|
+
[prefix]
|
232
|
+
+ pretty
|
233
|
+
+ b64ascii
|
234
|
+
+ [
|
235
|
+
f"requested_fidelity={self.requested_fidelity},",
|
236
|
+
f"_specialization={specialization_repr},",
|
237
|
+
f"calculated_fidelity={self.calculated_fidelity},",
|
238
|
+
f"actual_fidelity={self.actual_fidelity()},",
|
239
|
+
f"abc={(self.a, self.b, self.c)})",
|
240
|
+
]
|
241
|
+
)
|
242
|
+
return indent.join(lines)
|
243
|
+
|
244
|
+
@classmethod
|
245
|
+
def from_bytes(
|
246
|
+
cls,
|
247
|
+
bytes_in: bytes,
|
248
|
+
*,
|
249
|
+
requested_fidelity: float,
|
250
|
+
_specialization: two_qubit_decompose.Specialization | None = None,
|
251
|
+
**kwargs,
|
252
|
+
) -> "TwoQubitWeylDecomposition":
|
253
|
+
"""Decode bytes into :class:`.TwoQubitWeylDecomposition`."""
|
254
|
+
# Used by __repr__
|
255
|
+
del kwargs # Unused (just for display)
|
256
|
+
b64 = base64.decodebytes(bytes_in)
|
257
|
+
with io.BytesIO(b64) as f:
|
258
|
+
arr = np.load(f, allow_pickle=False)
|
259
|
+
return cls(arr, fidelity=requested_fidelity, _specialization=_specialization)
|
260
|
+
|
261
|
+
def __str__(self):
|
262
|
+
specialization = str(self._inner_decomposition.specialization).split(".")[1]
|
263
|
+
pre = f"{self.__class__.__name__} [specialization={specialization}] (\n\t"
|
264
|
+
circ_indent = "\n\t".join(self.circuit(simplify=True).draw("text").lines(-1))
|
265
|
+
return f"{pre}{circ_indent}\n)"
|
266
|
+
|
267
|
+
|
268
|
+
class TwoQubitControlledUDecomposer:
|
269
|
+
r"""Decompose two-qubit unitary in terms of a desired
|
270
|
+
:math:`U \sim U_d(\alpha, 0, 0) \sim \text{Ctrl-U}`
|
271
|
+
gate that is locally equivalent to an :class:`.RXXGate`."""
|
272
|
+
|
273
|
+
def __init__(self, rxx_equivalent_gate: Type[Gate], euler_basis: str = "ZXZ"):
|
274
|
+
r"""Initialize the KAK decomposition.
|
275
|
+
|
276
|
+
Args:
|
277
|
+
rxx_equivalent_gate: Gate that is locally equivalent to an :class:`.RXXGate`:
|
278
|
+
:math:`U \sim U_d(\alpha, 0, 0) \sim \text{Ctrl-U}` gate.
|
279
|
+
Valid options are [:class:`.RZZGate`, :class:`.RXXGate`, :class:`.RYYGate`,
|
280
|
+
:class:`.RZXGate`, :class:`.CPhaseGate`, :class:`.CRXGate`, :class:`.CRYGate`,
|
281
|
+
:class:`.CRZGate`].
|
282
|
+
euler_basis: Basis string to be provided to :class:`.OneQubitEulerDecomposer`
|
283
|
+
for 1Q synthesis.
|
284
|
+
Valid options are [``'ZXZ'``, ``'ZYZ'``, ``'XYX'``, ``'XZX'``, ``'U'``, ``'U3'``,
|
285
|
+
``'U321'``, ``'U1X'``, ``'PSX'``, ``'ZSX'``, ``'ZSXX'``, ``'RR'``].
|
286
|
+
|
287
|
+
Raises:
|
288
|
+
QiskitError: If the gate is not locally equivalent to an :class:`.RXXGate`.
|
289
|
+
"""
|
290
|
+
if rxx_equivalent_gate._standard_gate is not None:
|
291
|
+
self._inner_decomposer = two_qubit_decompose.TwoQubitControlledUDecomposer(
|
292
|
+
rxx_equivalent_gate._standard_gate, euler_basis
|
293
|
+
)
|
294
|
+
self.gate_name = rxx_equivalent_gate._standard_gate.name
|
295
|
+
else:
|
296
|
+
self._inner_decomposer = two_qubit_decompose.TwoQubitControlledUDecomposer(
|
297
|
+
rxx_equivalent_gate, euler_basis
|
298
|
+
)
|
299
|
+
self.rxx_equivalent_gate = rxx_equivalent_gate
|
300
|
+
self.scale = self._inner_decomposer.scale
|
301
|
+
self.euler_basis = euler_basis
|
302
|
+
|
303
|
+
def __call__(
|
304
|
+
self, unitary: Operator | np.ndarray, approximate=False, use_dag=False, *, atol=DEFAULT_ATOL
|
305
|
+
) -> QuantumCircuit:
|
306
|
+
"""Returns the Weyl decomposition in circuit form.
|
307
|
+
|
308
|
+
Args:
|
309
|
+
unitary (Operator or ndarray): :math:`4 \times 4` unitary to synthesize.
|
310
|
+
|
311
|
+
Returns:
|
312
|
+
QuantumCircuit: Synthesized quantum circuit.
|
313
|
+
|
314
|
+
Note: atol is passed to OneQubitEulerDecomposer.
|
315
|
+
"""
|
316
|
+
circ_data = self._inner_decomposer(np.asarray(unitary, dtype=complex), atol)
|
317
|
+
return QuantumCircuit._from_circuit_data(circ_data, add_regs=True)
|
318
|
+
|
319
|
+
|
320
|
+
class TwoQubitBasisDecomposer:
|
321
|
+
"""A class for decomposing 2-qubit unitaries into minimal number of uses of a 2-qubit
|
322
|
+
basis gate.
|
323
|
+
|
324
|
+
Args:
|
325
|
+
gate: Two-qubit gate to be used in the KAK decomposition.
|
326
|
+
basis_fidelity: Fidelity to be assumed for applications of KAK Gate. Defaults to ``1.0``.
|
327
|
+
euler_basis: Basis string to be provided to :class:`.OneQubitEulerDecomposer` for 1Q synthesis.
|
328
|
+
Valid options are [``'ZYZ'``, ``'ZXZ'``, ``'XYX'``, ``'U'``, ``'U3'``, ``'U1X'``,
|
329
|
+
``'PSX'``, ``'ZSX'``, ``'RR'``].
|
330
|
+
pulse_optimize: If ``True``, try to do decomposition which minimizes
|
331
|
+
local unitaries in between entangling gates. This will raise an exception if an
|
332
|
+
optimal decomposition is not implemented. Currently, only [{CX, SX, RZ}] is known.
|
333
|
+
If ``False``, don't attempt optimization. If ``None``, attempt optimization but don't raise
|
334
|
+
if unknown.
|
335
|
+
|
336
|
+
|
337
|
+
.. automethod:: __call__
|
338
|
+
"""
|
339
|
+
|
340
|
+
def __init__(
|
341
|
+
self,
|
342
|
+
gate: Gate,
|
343
|
+
basis_fidelity: float = 1.0,
|
344
|
+
euler_basis: str = "U",
|
345
|
+
pulse_optimize: bool | None = None,
|
346
|
+
):
|
347
|
+
self.gate = gate
|
348
|
+
self.basis_fidelity = basis_fidelity
|
349
|
+
self.pulse_optimize = pulse_optimize
|
350
|
+
# Use cx as gate name for pulse optimal decomposition detection
|
351
|
+
# otherwise use USER_GATE as a unique key to support custom gates
|
352
|
+
# including parameterized gates like UnitaryGate.
|
353
|
+
if isinstance(gate, CXGate):
|
354
|
+
gate_name = "cx"
|
355
|
+
else:
|
356
|
+
gate_name = "USER_GATE"
|
357
|
+
self.gate_name = gate_name
|
358
|
+
|
359
|
+
self._inner_decomposer = two_qubit_decompose.TwoQubitBasisDecomposer(
|
360
|
+
gate_name,
|
361
|
+
Operator(gate).data,
|
362
|
+
basis_fidelity=basis_fidelity,
|
363
|
+
euler_basis=euler_basis,
|
364
|
+
pulse_optimize=pulse_optimize,
|
365
|
+
)
|
366
|
+
self.is_supercontrolled = self._inner_decomposer.super_controlled
|
367
|
+
if not self.is_supercontrolled:
|
368
|
+
warnings.warn(
|
369
|
+
"Only know how to decompose properly for a supercontrolled basis gate.",
|
370
|
+
stacklevel=2,
|
371
|
+
)
|
372
|
+
|
373
|
+
def num_basis_gates(self, unitary):
|
374
|
+
"""Computes the number of basis gates needed in
|
375
|
+
a decomposition of input unitary
|
376
|
+
"""
|
377
|
+
unitary = np.asarray(unitary, dtype=complex)
|
378
|
+
return self._inner_decomposer.num_basis_gates(unitary)
|
379
|
+
|
380
|
+
@staticmethod
|
381
|
+
def decomp0(target):
|
382
|
+
r"""
|
383
|
+
Decompose target :math:`\sim U_d(x, y, z)` with :math:`0` uses of the basis gate.
|
384
|
+
Result :math:`U_r` has trace:
|
385
|
+
|
386
|
+
.. math::
|
387
|
+
|
388
|
+
\Big\vert\text{Tr}(U_r\cdot U_\text{target}^{\dag})\Big\vert =
|
389
|
+
4\Big\vert (\cos(x)\cos(y)\cos(z)+ j \sin(x)\sin(y)\sin(z)\Big\vert
|
390
|
+
|
391
|
+
which is optimal for all targets and bases
|
392
|
+
"""
|
393
|
+
|
394
|
+
return two_qubit_decompose.TwoQubitBasisDecomposer.decomp0(target)
|
395
|
+
|
396
|
+
def decomp1(self, target):
|
397
|
+
r"""Decompose target :math:`\sim U_d(x, y, z)` with :math:`1` use of the basis gate
|
398
|
+
:math:`\sim U_d(a, b, c)`.
|
399
|
+
Result :math:`U_r` has trace:
|
400
|
+
|
401
|
+
.. math::
|
402
|
+
|
403
|
+
\Big\vert\text{Tr}(U_r \cdot U_\text{target}^{\dag})\Big\vert =
|
404
|
+
4\Big\vert \cos(x-a)\cos(y-b)\cos(z-c) + j \sin(x-a)\sin(y-b)\sin(z-c)\Big\vert
|
405
|
+
|
406
|
+
which is optimal for all targets and bases with ``z==0`` or ``c==0``.
|
407
|
+
"""
|
408
|
+
return self._inner_decomposer.decomp1(target)
|
409
|
+
|
410
|
+
def decomp2_supercontrolled(self, target):
|
411
|
+
r"""
|
412
|
+
Decompose target :math:`\sim U_d(x, y, z)` with :math:`2` uses of the basis gate.
|
413
|
+
|
414
|
+
For supercontrolled basis :math:`\sim U_d(\pi/4, b, 0)`, all b, result :math:`U_r` has trace
|
415
|
+
|
416
|
+
.. math::
|
417
|
+
|
418
|
+
\Big\vert\text{Tr}(U_r \cdot U_\text{target}^\dag) \Big\vert = 4\cos(z)
|
419
|
+
|
420
|
+
which is the optimal approximation for basis of CNOT-class :math:`\sim U_d(\pi/4, 0, 0)`
|
421
|
+
or DCNOT-class :math:`\sim U_d(\pi/4, \pi/4, 0)` and any target. It may
|
422
|
+
be sub-optimal for :math:`b \neq 0` (i.e. there exists an exact decomposition for any target
|
423
|
+
using :math:`B \sim U_d(\pi/4, \pi/8, 0)`, but it may not be this decomposition).
|
424
|
+
This is an exact decomposition for supercontrolled basis and target :math:`\sim U_d(x, y, 0)`.
|
425
|
+
No guarantees for non-supercontrolled basis.
|
426
|
+
"""
|
427
|
+
return self._inner_decomposer.decomp2_supercontrolled(target)
|
428
|
+
|
429
|
+
def decomp3_supercontrolled(self, target):
|
430
|
+
r"""
|
431
|
+
Decompose target with :math:`3` uses of the basis.
|
432
|
+
This is an exact decomposition for supercontrolled basis :math:`\sim U_d(\pi/4, b, 0)`, all b,
|
433
|
+
and any target. No guarantees for non-supercontrolled basis.
|
434
|
+
"""
|
435
|
+
return self._inner_decomposer.decomp3_supercontrolled(target)
|
436
|
+
|
437
|
+
def __call__(
|
438
|
+
self,
|
439
|
+
unitary: Operator | np.ndarray,
|
440
|
+
basis_fidelity: float | None = None,
|
441
|
+
approximate: bool = True,
|
442
|
+
use_dag: bool = False,
|
443
|
+
*,
|
444
|
+
_num_basis_uses: int | None = None,
|
445
|
+
) -> QuantumCircuit | DAGCircuit:
|
446
|
+
r"""Decompose a two-qubit ``unitary`` over fixed basis and :math:`SU(2)` using the best
|
447
|
+
approximation given that each basis application has a finite ``basis_fidelity``.
|
448
|
+
|
449
|
+
Args:
|
450
|
+
unitary (Operator or ndarray): :math:`4 \times 4` unitary to synthesize.
|
451
|
+
basis_fidelity (float or None): Fidelity to be assumed for applications of KAK Gate.
|
452
|
+
If given, overrides ``basis_fidelity`` given at init.
|
453
|
+
approximate (bool): Approximates if basis fidelities are less than 1.0.
|
454
|
+
use_dag (bool): If true a :class:`.DAGCircuit` is returned instead of a
|
455
|
+
:class:`QuantumCircuit` when this class is called.
|
456
|
+
_num_basis_uses (int): force a particular approximation by passing a number in [0, 3].
|
457
|
+
|
458
|
+
Returns:
|
459
|
+
QuantumCircuit: Synthesized quantum circuit.
|
460
|
+
|
461
|
+
Raises:
|
462
|
+
QiskitError: if ``pulse_optimize`` is True but we don't know how to do it.
|
463
|
+
"""
|
464
|
+
|
465
|
+
if use_dag:
|
466
|
+
from qiskit.dagcircuit.dagcircuit import DAGCircuit
|
467
|
+
from qiskit.dagcircuit.dagnode import DAGOpNode
|
468
|
+
|
469
|
+
sequence = self._inner_decomposer(
|
470
|
+
np.asarray(unitary, dtype=complex),
|
471
|
+
basis_fidelity,
|
472
|
+
approximate,
|
473
|
+
_num_basis_uses=_num_basis_uses,
|
474
|
+
)
|
475
|
+
q = QuantumRegister(2)
|
476
|
+
|
477
|
+
dag = DAGCircuit()
|
478
|
+
dag.global_phase = sequence.global_phase
|
479
|
+
dag.add_qreg(q)
|
480
|
+
for gate, params, qubits in sequence:
|
481
|
+
if gate is None:
|
482
|
+
dag.apply_operation_back(self.gate, tuple(q[x] for x in qubits), check=False)
|
483
|
+
else:
|
484
|
+
op = CircuitInstruction.from_standard(
|
485
|
+
gate, qubits=tuple(q[x] for x in qubits), params=params
|
486
|
+
)
|
487
|
+
node = DAGOpNode.from_instruction(op)
|
488
|
+
dag._apply_op_node_back(node)
|
489
|
+
return dag
|
490
|
+
else:
|
491
|
+
if getattr(self.gate, "_standard_gate", None):
|
492
|
+
circ_data = self._inner_decomposer.to_circuit(
|
493
|
+
np.asarray(unitary, dtype=complex),
|
494
|
+
self.gate,
|
495
|
+
basis_fidelity,
|
496
|
+
approximate,
|
497
|
+
_num_basis_uses=_num_basis_uses,
|
498
|
+
)
|
499
|
+
return QuantumCircuit._from_circuit_data(circ_data, add_regs=True)
|
500
|
+
else:
|
501
|
+
sequence = self._inner_decomposer(
|
502
|
+
np.asarray(unitary, dtype=complex),
|
503
|
+
basis_fidelity,
|
504
|
+
approximate,
|
505
|
+
_num_basis_uses=_num_basis_uses,
|
506
|
+
)
|
507
|
+
q = QuantumRegister(2)
|
508
|
+
circ = QuantumCircuit(q, global_phase=sequence.global_phase)
|
509
|
+
for gate, params, qubits in sequence:
|
510
|
+
if gate is None:
|
511
|
+
circ._append(self.gate, qargs=tuple(q[x] for x in qubits))
|
512
|
+
else:
|
513
|
+
inst = CircuitInstruction.from_standard(
|
514
|
+
gate, qubits=tuple(q[x] for x in qubits), params=params
|
515
|
+
)
|
516
|
+
circ._append(inst)
|
517
|
+
return circ
|
518
|
+
|
519
|
+
def traces(self, target):
|
520
|
+
r"""
|
521
|
+
Give the expected traces :math:`\Big\vert\text{Tr}(U \cdot U_\text{target}^{\dag})\Big\vert`
|
522
|
+
for a different number of basis gates.
|
523
|
+
"""
|
524
|
+
return self._inner_decomposer.traces(target._inner_decomposition)
|
525
|
+
|
526
|
+
|
527
|
+
# This weird duplicated lazy structure is for backwards compatibility; Qiskit has historically
|
528
|
+
# always made ``two_qubit_cnot_decompose`` available publicly immediately on import, but it's quite
|
529
|
+
# expensive to construct, and we want to defer the object's creation until it's actually used. We
|
530
|
+
# only need to pass through the public methods that take `self` as a parameter. Using `__getattr__`
|
531
|
+
# doesn't work because it is only called if the normal resolution methods fail. Using
|
532
|
+
# `__getattribute__` is too messy for a simple one-off use object.
|
533
|
+
|
534
|
+
|
535
|
+
class _LazyTwoQubitCXDecomposer(TwoQubitBasisDecomposer):
|
536
|
+
__slots__ = ("_inner",)
|
537
|
+
|
538
|
+
def __init__(self): # pylint: disable=super-init-not-called
|
539
|
+
self._inner = None
|
540
|
+
|
541
|
+
def _load(self):
|
542
|
+
if self._inner is None:
|
543
|
+
self._inner = TwoQubitBasisDecomposer(CXGate())
|
544
|
+
|
545
|
+
def __call__(self, *args, **kwargs) -> QuantumCircuit:
|
546
|
+
self._load()
|
547
|
+
return self._inner(*args, **kwargs)
|
548
|
+
|
549
|
+
def traces(self, target):
|
550
|
+
self._load()
|
551
|
+
return self._inner.traces(target)
|
552
|
+
|
553
|
+
def decomp1(self, target):
|
554
|
+
self._load()
|
555
|
+
return self._inner.decomp1(target)
|
556
|
+
|
557
|
+
def decomp2_supercontrolled(self, target):
|
558
|
+
self._load()
|
559
|
+
return self._inner.decomp2_supercontrolled(target)
|
560
|
+
|
561
|
+
def decomp3_supercontrolled(self, target):
|
562
|
+
self._load()
|
563
|
+
return self._inner.decomp3_supercontrolled(target)
|
564
|
+
|
565
|
+
def num_basis_gates(self, unitary):
|
566
|
+
self._load()
|
567
|
+
return self._inner.num_basis_gates(unitary)
|
568
|
+
|
569
|
+
|
570
|
+
two_qubit_cnot_decompose = _LazyTwoQubitCXDecomposer()
|
571
|
+
"""
|
572
|
+
This is an instance of :class:`.TwoQubitBasisDecomposer` that always uses
|
573
|
+
``cx`` as the KAK gate for the basis decomposition. You can use this function
|
574
|
+
as a quick access to ``cx``-based 2-qubit decompositions.
|
575
|
+
|
576
|
+
Args:
|
577
|
+
unitary (Operator or np.ndarray): The 4x4 unitary to synthesize.
|
578
|
+
basis_fidelity (float or None): If given the assumed fidelity for applications of :class:`.CXGate`.
|
579
|
+
approximate (bool): If ``True`` approximate if ``basis_fidelity`` is less than 1.0.
|
580
|
+
|
581
|
+
Returns:
|
582
|
+
QuantumCircuit: The synthesized circuit of the input unitary.
|
583
|
+
"""
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2021
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""
|
14
|
+
Submodule symbol exports for XX decomposition.
|
15
|
+
"""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
from .decomposer import XXDecomposer
|
19
|
+
from .embodiments import XXEmbodiments
|