qiskit 2.1.0rc1__cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -0
- qiskit/__init__.py +159 -0
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +73 -0
- qiskit/circuit/__init__.py +1335 -0
- qiskit/circuit/_add_control.py +338 -0
- qiskit/circuit/_classical_resource_map.py +154 -0
- qiskit/circuit/_standard_gates_commutations.py +3849 -0
- qiskit/circuit/_utils.py +167 -0
- qiskit/circuit/annotated_operation.py +279 -0
- qiskit/circuit/annotation.py +404 -0
- qiskit/circuit/barrier.py +46 -0
- qiskit/circuit/classical/__init__.py +41 -0
- qiskit/circuit/classical/expr/__init__.py +266 -0
- qiskit/circuit/classical/expr/constructors.py +764 -0
- qiskit/circuit/classical/expr/expr.py +156 -0
- qiskit/circuit/classical/expr/visitors.py +381 -0
- qiskit/circuit/classical/types/__init__.py +113 -0
- qiskit/circuit/classical/types/ordering.py +229 -0
- qiskit/circuit/classical/types/types.py +30 -0
- qiskit/circuit/commutation_checker.py +133 -0
- qiskit/circuit/commutation_library.py +20 -0
- qiskit/circuit/controlflow/__init__.py +59 -0
- qiskit/circuit/controlflow/_builder_utils.py +211 -0
- qiskit/circuit/controlflow/box.py +188 -0
- qiskit/circuit/controlflow/break_loop.py +56 -0
- qiskit/circuit/controlflow/builder.py +791 -0
- qiskit/circuit/controlflow/continue_loop.py +56 -0
- qiskit/circuit/controlflow/control_flow.py +94 -0
- qiskit/circuit/controlflow/for_loop.py +218 -0
- qiskit/circuit/controlflow/if_else.py +498 -0
- qiskit/circuit/controlflow/switch_case.py +411 -0
- qiskit/circuit/controlflow/while_loop.py +166 -0
- qiskit/circuit/controlledgate.py +274 -0
- qiskit/circuit/delay.py +159 -0
- qiskit/circuit/duration.py +80 -0
- qiskit/circuit/equivalence.py +94 -0
- qiskit/circuit/equivalence_library.py +18 -0
- qiskit/circuit/exceptions.py +19 -0
- qiskit/circuit/gate.py +261 -0
- qiskit/circuit/instruction.py +564 -0
- qiskit/circuit/instructionset.py +132 -0
- qiskit/circuit/library/__init__.py +984 -0
- qiskit/circuit/library/arithmetic/__init__.py +40 -0
- qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +235 -0
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +131 -0
- qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
- qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -0
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +201 -0
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +506 -0
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +395 -0
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +501 -0
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
- qiskit/circuit/library/arithmetic/quadratic_form.py +370 -0
- qiskit/circuit/library/arithmetic/weighted_adder.py +428 -0
- qiskit/circuit/library/basis_change/__init__.py +15 -0
- qiskit/circuit/library/basis_change/qft.py +316 -0
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +322 -0
- qiskit/circuit/library/boolean_logic/__init__.py +18 -0
- qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
- qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
- qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
- qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -0
- qiskit/circuit/library/data_preparation/__init__.py +57 -0
- qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
- qiskit/circuit/library/data_preparation/initializer.py +107 -0
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
- qiskit/circuit/library/fourier_checking.py +160 -0
- qiskit/circuit/library/generalized_gates/__init__.py +30 -0
- qiskit/circuit/library/generalized_gates/diagonal.py +163 -0
- qiskit/circuit/library/generalized_gates/gms.py +179 -0
- qiskit/circuit/library/generalized_gates/gr.py +219 -0
- qiskit/circuit/library/generalized_gates/isometry.py +370 -0
- qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
- qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
- qiskit/circuit/library/generalized_gates/pauli.py +84 -0
- qiskit/circuit/library/generalized_gates/permutation.py +202 -0
- qiskit/circuit/library/generalized_gates/rv.py +96 -0
- qiskit/circuit/library/generalized_gates/uc.py +303 -0
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
- qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
- qiskit/circuit/library/generalized_gates/ucry.py +32 -0
- qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
- qiskit/circuit/library/generalized_gates/unitary.py +236 -0
- qiskit/circuit/library/graph_state.py +172 -0
- qiskit/circuit/library/grover_operator.py +583 -0
- qiskit/circuit/library/hamiltonian_gate.py +142 -0
- qiskit/circuit/library/hidden_linear_function.py +163 -0
- qiskit/circuit/library/iqp.py +180 -0
- qiskit/circuit/library/n_local/__init__.py +45 -0
- qiskit/circuit/library/n_local/efficient_su2.py +282 -0
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +301 -0
- qiskit/circuit/library/n_local/n_local.py +1478 -0
- qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
- qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
- qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
- qiskit/circuit/library/n_local/two_local.py +289 -0
- qiskit/circuit/library/overlap.py +183 -0
- qiskit/circuit/library/pauli_evolution.py +202 -0
- qiskit/circuit/library/phase_estimation.py +177 -0
- qiskit/circuit/library/phase_oracle.py +239 -0
- qiskit/circuit/library/quantum_volume.py +179 -0
- qiskit/circuit/library/standard_gates/__init__.py +141 -0
- qiskit/circuit/library/standard_gates/dcx.py +76 -0
- qiskit/circuit/library/standard_gates/ecr.py +126 -0
- qiskit/circuit/library/standard_gates/equivalence_library.py +1936 -0
- qiskit/circuit/library/standard_gates/global_phase.py +83 -0
- qiskit/circuit/library/standard_gates/h.py +230 -0
- qiskit/circuit/library/standard_gates/i.py +76 -0
- qiskit/circuit/library/standard_gates/iswap.py +115 -0
- qiskit/circuit/library/standard_gates/p.py +415 -0
- qiskit/circuit/library/standard_gates/r.py +108 -0
- qiskit/circuit/library/standard_gates/rx.py +269 -0
- qiskit/circuit/library/standard_gates/rxx.py +165 -0
- qiskit/circuit/library/standard_gates/ry.py +268 -0
- qiskit/circuit/library/standard_gates/ryy.py +165 -0
- qiskit/circuit/library/standard_gates/rz.py +290 -0
- qiskit/circuit/library/standard_gates/rzx.py +211 -0
- qiskit/circuit/library/standard_gates/rzz.py +181 -0
- qiskit/circuit/library/standard_gates/s.py +424 -0
- qiskit/circuit/library/standard_gates/swap.py +268 -0
- qiskit/circuit/library/standard_gates/sx.py +303 -0
- qiskit/circuit/library/standard_gates/t.py +169 -0
- qiskit/circuit/library/standard_gates/u.py +379 -0
- qiskit/circuit/library/standard_gates/u1.py +466 -0
- qiskit/circuit/library/standard_gates/u2.py +145 -0
- qiskit/circuit/library/standard_gates/u3.py +412 -0
- qiskit/circuit/library/standard_gates/x.py +1335 -0
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +164 -0
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +197 -0
- qiskit/circuit/library/standard_gates/y.py +253 -0
- qiskit/circuit/library/standard_gates/z.py +331 -0
- qiskit/circuit/library/templates/__init__.py +92 -0
- qiskit/circuit/library/templates/clifford/__init__.py +33 -0
- qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
- qiskit/circuit/library/templates/nct/__init__.py +67 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
- qiskit/circuit/library/templates/rzx/__init__.py +25 -0
- qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
- qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
- qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
- qiskit/circuit/measure.py +53 -0
- qiskit/circuit/operation.py +68 -0
- qiskit/circuit/parameter.py +188 -0
- qiskit/circuit/parameterexpression.py +737 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +140 -0
- qiskit/circuit/quantumcircuit.py +7610 -0
- qiskit/circuit/quantumcircuitdata.py +137 -0
- qiskit/circuit/random/__init__.py +50 -0
- qiskit/circuit/random/utils.py +755 -0
- qiskit/circuit/reset.py +37 -0
- qiskit/circuit/singleton.py +600 -0
- qiskit/circuit/store.py +89 -0
- qiskit/circuit/tools/__init__.py +16 -0
- qiskit/circuit/tools/pi_check.py +185 -0
- qiskit/circuit/twirling.py +145 -0
- qiskit/compiler/__init__.py +27 -0
- qiskit/compiler/transpiler.py +375 -0
- qiskit/converters/__init__.py +74 -0
- qiskit/converters/circuit_to_dag.py +80 -0
- qiskit/converters/circuit_to_dagdependency.py +49 -0
- qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
- qiskit/converters/circuit_to_gate.py +107 -0
- qiskit/converters/circuit_to_instruction.py +142 -0
- qiskit/converters/dag_to_circuit.py +79 -0
- qiskit/converters/dag_to_dagdependency.py +54 -0
- qiskit/converters/dag_to_dagdependency_v2.py +43 -0
- qiskit/converters/dagdependency_to_circuit.py +40 -0
- qiskit/converters/dagdependency_to_dag.py +48 -0
- qiskit/dagcircuit/__init__.py +44 -0
- qiskit/dagcircuit/collect_blocks.py +403 -0
- qiskit/dagcircuit/dagcircuit.py +24 -0
- qiskit/dagcircuit/dagdependency.py +612 -0
- qiskit/dagcircuit/dagdependency_v2.py +566 -0
- qiskit/dagcircuit/dagdepnode.py +160 -0
- qiskit/dagcircuit/dagnode.py +193 -0
- qiskit/dagcircuit/exceptions.py +42 -0
- qiskit/exceptions.py +153 -0
- qiskit/passmanager/__init__.py +258 -0
- qiskit/passmanager/base_tasks.py +230 -0
- qiskit/passmanager/compilation_status.py +74 -0
- qiskit/passmanager/exceptions.py +19 -0
- qiskit/passmanager/flow_controllers.py +116 -0
- qiskit/passmanager/passmanager.py +353 -0
- qiskit/primitives/__init__.py +490 -0
- qiskit/primitives/backend_estimator_v2.py +530 -0
- qiskit/primitives/backend_sampler_v2.py +339 -0
- qiskit/primitives/base/__init__.py +20 -0
- qiskit/primitives/base/base_estimator.py +247 -0
- qiskit/primitives/base/base_primitive_job.py +78 -0
- qiskit/primitives/base/base_primitive_v1.py +45 -0
- qiskit/primitives/base/base_result_v1.py +65 -0
- qiskit/primitives/base/base_sampler.py +196 -0
- qiskit/primitives/base/estimator_result_v1.py +46 -0
- qiskit/primitives/base/sampler_result_v1.py +45 -0
- qiskit/primitives/base/validation_v1.py +250 -0
- qiskit/primitives/containers/__init__.py +26 -0
- qiskit/primitives/containers/bindings_array.py +391 -0
- qiskit/primitives/containers/bit_array.py +764 -0
- qiskit/primitives/containers/data_bin.py +172 -0
- qiskit/primitives/containers/estimator_pub.py +222 -0
- qiskit/primitives/containers/object_array.py +94 -0
- qiskit/primitives/containers/observables_array.py +380 -0
- qiskit/primitives/containers/primitive_result.py +53 -0
- qiskit/primitives/containers/pub_result.py +51 -0
- qiskit/primitives/containers/sampler_pub.py +193 -0
- qiskit/primitives/containers/sampler_pub_result.py +74 -0
- qiskit/primitives/containers/shape.py +129 -0
- qiskit/primitives/primitive_job.py +100 -0
- qiskit/primitives/statevector_estimator.py +175 -0
- qiskit/primitives/statevector_sampler.py +290 -0
- qiskit/primitives/utils.py +72 -0
- qiskit/providers/__init__.py +677 -0
- qiskit/providers/backend.py +364 -0
- qiskit/providers/basic_provider/__init__.py +47 -0
- qiskit/providers/basic_provider/basic_provider.py +121 -0
- qiskit/providers/basic_provider/basic_provider_job.py +65 -0
- qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
- qiskit/providers/basic_provider/basic_simulator.py +693 -0
- qiskit/providers/basic_provider/exceptions.py +30 -0
- qiskit/providers/exceptions.py +33 -0
- qiskit/providers/fake_provider/__init__.py +69 -0
- qiskit/providers/fake_provider/generic_backend_v2.py +376 -0
- qiskit/providers/fake_provider/utils/__init__.py +15 -0
- qiskit/providers/job.py +147 -0
- qiskit/providers/jobstatus.py +30 -0
- qiskit/providers/options.py +273 -0
- qiskit/providers/providerutils.py +110 -0
- qiskit/qasm/libs/dummy/stdgates.inc +75 -0
- qiskit/qasm/libs/qelib1.inc +266 -0
- qiskit/qasm/libs/stdgates.inc +82 -0
- qiskit/qasm2/__init__.py +669 -0
- qiskit/qasm2/exceptions.py +27 -0
- qiskit/qasm2/export.py +364 -0
- qiskit/qasm2/parse.py +438 -0
- qiskit/qasm3/__init__.py +466 -0
- qiskit/qasm3/ast.py +796 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1363 -0
- qiskit/qasm3/printer.py +620 -0
- qiskit/qpy/__init__.py +2141 -0
- qiskit/qpy/binary_io/__init__.py +35 -0
- qiskit/qpy/binary_io/circuits.py +1687 -0
- qiskit/qpy/binary_io/parse_sympy_repr.py +126 -0
- qiskit/qpy/binary_io/schedules.py +288 -0
- qiskit/qpy/binary_io/value.py +1183 -0
- qiskit/qpy/common.py +361 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +458 -0
- qiskit/qpy/interface.py +384 -0
- qiskit/qpy/type_keys.py +415 -0
- qiskit/quantum_info/__init__.py +172 -0
- qiskit/quantum_info/analysis/__init__.py +17 -0
- qiskit/quantum_info/analysis/average.py +47 -0
- qiskit/quantum_info/analysis/distance.py +104 -0
- qiskit/quantum_info/analysis/make_observable.py +44 -0
- qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
- qiskit/quantum_info/operators/__init__.py +29 -0
- qiskit/quantum_info/operators/base_operator.py +145 -0
- qiskit/quantum_info/operators/channel/__init__.py +29 -0
- qiskit/quantum_info/operators/channel/chi.py +191 -0
- qiskit/quantum_info/operators/channel/choi.py +218 -0
- qiskit/quantum_info/operators/channel/kraus.py +337 -0
- qiskit/quantum_info/operators/channel/ptm.py +204 -0
- qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
- qiskit/quantum_info/operators/channel/stinespring.py +296 -0
- qiskit/quantum_info/operators/channel/superop.py +373 -0
- qiskit/quantum_info/operators/channel/transformations.py +490 -0
- qiskit/quantum_info/operators/custom_iterator.py +48 -0
- qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
- qiskit/quantum_info/operators/dihedral/dihedral.py +511 -0
- qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
- qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
- qiskit/quantum_info/operators/dihedral/random.py +64 -0
- qiskit/quantum_info/operators/linear_op.py +25 -0
- qiskit/quantum_info/operators/measures.py +418 -0
- qiskit/quantum_info/operators/mixins/__init__.py +52 -0
- qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
- qiskit/quantum_info/operators/mixins/group.py +171 -0
- qiskit/quantum_info/operators/mixins/linear.py +84 -0
- qiskit/quantum_info/operators/mixins/multiply.py +62 -0
- qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
- qiskit/quantum_info/operators/op_shape.py +525 -0
- qiskit/quantum_info/operators/operator.py +869 -0
- qiskit/quantum_info/operators/operator_utils.py +76 -0
- qiskit/quantum_info/operators/predicates.py +183 -0
- qiskit/quantum_info/operators/random.py +154 -0
- qiskit/quantum_info/operators/scalar_op.py +254 -0
- qiskit/quantum_info/operators/symplectic/__init__.py +24 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
- qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +584 -0
- qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
- qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -0
- qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
- qiskit/quantum_info/operators/symplectic/random.py +117 -0
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1239 -0
- qiskit/quantum_info/operators/utils/__init__.py +20 -0
- qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
- qiskit/quantum_info/operators/utils/commutator.py +36 -0
- qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
- qiskit/quantum_info/quaternion.py +156 -0
- qiskit/quantum_info/random.py +26 -0
- qiskit/quantum_info/states/__init__.py +28 -0
- qiskit/quantum_info/states/densitymatrix.py +857 -0
- qiskit/quantum_info/states/measures.py +288 -0
- qiskit/quantum_info/states/quantum_state.py +503 -0
- qiskit/quantum_info/states/random.py +157 -0
- qiskit/quantum_info/states/stabilizerstate.py +805 -0
- qiskit/quantum_info/states/statevector.py +977 -0
- qiskit/quantum_info/states/utils.py +247 -0
- qiskit/result/__init__.py +61 -0
- qiskit/result/counts.py +189 -0
- qiskit/result/distributions/__init__.py +17 -0
- qiskit/result/distributions/probability.py +100 -0
- qiskit/result/distributions/quasi.py +154 -0
- qiskit/result/exceptions.py +40 -0
- qiskit/result/models.py +241 -0
- qiskit/result/postprocess.py +239 -0
- qiskit/result/result.py +385 -0
- qiskit/result/sampled_expval.py +76 -0
- qiskit/result/utils.py +294 -0
- qiskit/synthesis/__init__.py +250 -0
- qiskit/synthesis/arithmetic/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +107 -0
- qiskit/synthesis/arithmetic/adders/rv_ripple_carry_adder.py +156 -0
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
- qiskit/synthesis/arithmetic/comparators/__init__.py +16 -0
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/synthesis/boolean/__init__.py +13 -0
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/clifford/__init__.py +19 -0
- qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
- qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
- qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
- qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
- qiskit/synthesis/cnotdihedral/__init__.py +17 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
- qiskit/synthesis/discrete_basis/__init__.py +16 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +53 -0
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +280 -0
- qiskit/synthesis/evolution/__init__.py +21 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +123 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +316 -0
- qiskit/synthesis/evolution/qdrift.py +133 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +227 -0
- qiskit/synthesis/linear/__init__.py +26 -0
- qiskit/synthesis/linear/cnot_synth.py +69 -0
- qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
- qiskit/synthesis/linear/linear_depth_lnn.py +61 -0
- qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
- qiskit/synthesis/linear_phase/__init__.py +17 -0
- qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +61 -0
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
- qiskit/synthesis/multi_controlled/__init__.py +29 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +583 -0
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +205 -0
- qiskit/synthesis/one_qubit/__init__.py +15 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
- qiskit/synthesis/permutation/__init__.py +18 -0
- qiskit/synthesis/permutation/permutation_full.py +78 -0
- qiskit/synthesis/permutation/permutation_lnn.py +54 -0
- qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
- qiskit/synthesis/permutation/permutation_utils.py +16 -0
- qiskit/synthesis/qft/__init__.py +16 -0
- qiskit/synthesis/qft/qft_decompose_full.py +97 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +61 -0
- qiskit/synthesis/stabilizer/__init__.py +16 -0
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
- qiskit/synthesis/two_qubit/__init__.py +20 -0
- qiskit/synthesis/two_qubit/local_invariance.py +63 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +583 -0
- qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
- qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
- qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
- qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
- qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
- qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
- qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
- qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
- qiskit/synthesis/unitary/__init__.py +13 -0
- qiskit/synthesis/unitary/aqc/__init__.py +177 -0
- qiskit/synthesis/unitary/aqc/approximate.py +116 -0
- qiskit/synthesis/unitary/aqc/aqc.py +175 -0
- qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
- qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
- qiskit/synthesis/unitary/qsd.py +359 -0
- qiskit/transpiler/__init__.py +1352 -0
- qiskit/transpiler/basepasses.py +190 -0
- qiskit/transpiler/coupling.py +500 -0
- qiskit/transpiler/exceptions.py +59 -0
- qiskit/transpiler/instruction_durations.py +263 -0
- qiskit/transpiler/layout.py +740 -0
- qiskit/transpiler/passes/__init__.py +278 -0
- qiskit/transpiler/passes/analysis/__init__.py +23 -0
- qiskit/transpiler/passes/analysis/count_ops.py +30 -0
- qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
- qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
- qiskit/transpiler/passes/analysis/depth.py +33 -0
- qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
- qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
- qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
- qiskit/transpiler/passes/analysis/size.py +36 -0
- qiskit/transpiler/passes/analysis/width.py +27 -0
- qiskit/transpiler/passes/basis/__init__.py +19 -0
- qiskit/transpiler/passes/basis/basis_translator.py +138 -0
- qiskit/transpiler/passes/basis/decompose.py +137 -0
- qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +84 -0
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +110 -0
- qiskit/transpiler/passes/layout/__init__.py +26 -0
- qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
- qiskit/transpiler/passes/layout/apply_layout.py +128 -0
- qiskit/transpiler/passes/layout/csp_layout.py +132 -0
- qiskit/transpiler/passes/layout/dense_layout.py +197 -0
- qiskit/transpiler/passes/layout/disjoint_utils.py +54 -0
- qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +116 -0
- qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
- qiskit/transpiler/passes/layout/sabre_layout.py +525 -0
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
- qiskit/transpiler/passes/layout/set_layout.py +69 -0
- qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
- qiskit/transpiler/passes/layout/vf2_layout.py +292 -0
- qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
- qiskit/transpiler/passes/layout/vf2_utils.py +245 -0
- qiskit/transpiler/passes/optimization/__init__.py +42 -0
- qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
- qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
- qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +117 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +109 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +85 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +242 -0
- qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
- qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
- qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +176 -0
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
- qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +267 -0
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +251 -0
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
- qiskit/transpiler/passes/optimization/optimize_annotated.py +449 -0
- qiskit/transpiler/passes/optimization/optimize_clifford_t.py +68 -0
- qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
- qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
- qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
- qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +70 -0
- qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -0
- qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
- qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
- qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +633 -0
- qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
- qiskit/transpiler/passes/routing/__init__.py +21 -0
- qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
- qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
- qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
- qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
- qiskit/transpiler/passes/routing/basic_swap.py +166 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +397 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
- qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
- qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
- qiskit/transpiler/passes/routing/sabre_swap.py +465 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +433 -0
- qiskit/transpiler/passes/routing/utils.py +35 -0
- qiskit/transpiler/passes/scheduling/__init__.py +21 -0
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
- qiskit/transpiler/passes/scheduling/padding/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
- qiskit/transpiler/passes/scheduling/padding/context_aware_dynamical_decoupling.py +876 -0
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
- qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
- qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
- qiskit/transpiler/passes/synthesis/__init__.py +21 -0
- qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
- qiskit/transpiler/passes/synthesis/clifford_unitary_synth_plugin.py +123 -0
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
- qiskit/transpiler/passes/synthesis/hls_plugins.py +2338 -0
- qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
- qiskit/transpiler/passes/synthesis/plugin.py +738 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +318 -0
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
- qiskit/transpiler/passes/utils/__init__.py +32 -0
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
- qiskit/transpiler/passes/utils/check_gate_direction.py +60 -0
- qiskit/transpiler/passes/utils/check_map.py +78 -0
- qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
- qiskit/transpiler/passes/utils/control_flow.py +61 -0
- qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
- qiskit/transpiler/passes/utils/error.py +69 -0
- qiskit/transpiler/passes/utils/filter_op_nodes.py +66 -0
- qiskit/transpiler/passes/utils/fixed_point.py +48 -0
- qiskit/transpiler/passes/utils/gate_direction.py +93 -0
- qiskit/transpiler/passes/utils/gates_basis.py +51 -0
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
- qiskit/transpiler/passes/utils/minimum_point.py +118 -0
- qiskit/transpiler/passes/utils/remove_barriers.py +50 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
- qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
- qiskit/transpiler/passmanager.py +503 -0
- qiskit/transpiler/passmanager_config.py +154 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1114 -0
- qiskit/transpiler/preset_passmanagers/common.py +773 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +443 -0
- qiskit/transpiler/preset_passmanagers/level0.py +104 -0
- qiskit/transpiler/preset_passmanagers/level1.py +108 -0
- qiskit/transpiler/preset_passmanagers/level2.py +109 -0
- qiskit/transpiler/preset_passmanagers/level3.py +110 -0
- qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
- qiskit/transpiler/target.py +905 -0
- qiskit/transpiler/timing_constraints.py +59 -0
- qiskit/user_config.py +266 -0
- qiskit/utils/__init__.py +90 -0
- qiskit/utils/classtools.py +146 -0
- qiskit/utils/deprecation.py +382 -0
- qiskit/utils/lazy_tester.py +363 -0
- qiskit/utils/optionals.py +355 -0
- qiskit/utils/parallel.py +318 -0
- qiskit/utils/units.py +146 -0
- qiskit/version.py +84 -0
- qiskit/visualization/__init__.py +290 -0
- qiskit/visualization/array.py +207 -0
- qiskit/visualization/bloch.py +778 -0
- qiskit/visualization/circuit/__init__.py +15 -0
- qiskit/visualization/circuit/_utils.py +677 -0
- qiskit/visualization/circuit/circuit_visualization.py +735 -0
- qiskit/visualization/circuit/latex.py +668 -0
- qiskit/visualization/circuit/matplotlib.py +2041 -0
- qiskit/visualization/circuit/qcstyle.py +130 -0
- qiskit/visualization/circuit/styles/__init__.py +13 -0
- qiskit/visualization/circuit/styles/bw.json +202 -0
- qiskit/visualization/circuit/styles/clifford.json +202 -0
- qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
- qiskit/visualization/circuit/styles/iqp.json +214 -0
- qiskit/visualization/circuit/styles/textbook.json +202 -0
- qiskit/visualization/circuit/text.py +1849 -0
- qiskit/visualization/circuit_visualization.py +19 -0
- qiskit/visualization/counts_visualization.py +487 -0
- qiskit/visualization/dag/__init__.py +13 -0
- qiskit/visualization/dag/dagstyle.py +103 -0
- qiskit/visualization/dag/styles/__init__.py +13 -0
- qiskit/visualization/dag/styles/color.json +10 -0
- qiskit/visualization/dag/styles/plain.json +5 -0
- qiskit/visualization/dag_visualization.py +389 -0
- qiskit/visualization/exceptions.py +21 -0
- qiskit/visualization/gate_map.py +1424 -0
- qiskit/visualization/library.py +40 -0
- qiskit/visualization/pass_manager_visualization.py +312 -0
- qiskit/visualization/state_visualization.py +1546 -0
- qiskit/visualization/style.py +223 -0
- qiskit/visualization/timeline/__init__.py +21 -0
- qiskit/visualization/timeline/core.py +495 -0
- qiskit/visualization/timeline/drawings.py +260 -0
- qiskit/visualization/timeline/generators.py +506 -0
- qiskit/visualization/timeline/interface.py +444 -0
- qiskit/visualization/timeline/layouts.py +115 -0
- qiskit/visualization/timeline/plotters/__init__.py +16 -0
- qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
- qiskit/visualization/timeline/plotters/matplotlib.py +195 -0
- qiskit/visualization/timeline/stylesheet.py +301 -0
- qiskit/visualization/timeline/types.py +148 -0
- qiskit/visualization/transition_visualization.py +369 -0
- qiskit/visualization/utils.py +49 -0
- qiskit-2.1.0rc1.dist-info/METADATA +221 -0
- qiskit-2.1.0rc1.dist-info/RECORD +699 -0
- qiskit-2.1.0rc1.dist-info/WHEEL +6 -0
- qiskit-2.1.0rc1.dist-info/entry_points.txt +88 -0
- qiskit-2.1.0rc1.dist-info/licenses/LICENSE.txt +203 -0
- qiskit-2.1.0rc1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,300 @@
|
|
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
|
+
Tools for building optimal circuits out of XX interactions.
|
15
|
+
|
16
|
+
Inputs:
|
17
|
+
+ A set of native XX operations, described as strengths.
|
18
|
+
+ A right-angled path, computed using the methods in `paths.py`.
|
19
|
+
|
20
|
+
Output:
|
21
|
+
+ A circuit which implements the target operation (expressed exactly as the exponential of
|
22
|
+
`a XX + b YY + c ZZ`) using the native operations and local gates.
|
23
|
+
"""
|
24
|
+
|
25
|
+
from __future__ import annotations
|
26
|
+
import cmath
|
27
|
+
from functools import reduce
|
28
|
+
import math
|
29
|
+
from operator import itemgetter
|
30
|
+
|
31
|
+
import numpy as np
|
32
|
+
|
33
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
34
|
+
from qiskit.circuit.library.standard_gates import RXXGate, RYYGate, RZGate
|
35
|
+
from qiskit.exceptions import QiskitError
|
36
|
+
|
37
|
+
from .paths import decomposition_hop
|
38
|
+
from .utilities import EPSILON, safe_arccos
|
39
|
+
from .weyl import (
|
40
|
+
apply_reflection,
|
41
|
+
apply_shift,
|
42
|
+
canonical_rotation_circuit,
|
43
|
+
reflection_options,
|
44
|
+
shift_options,
|
45
|
+
)
|
46
|
+
|
47
|
+
|
48
|
+
# pylint:disable=invalid-name
|
49
|
+
def decompose_xxyy_into_xxyy_xx(a_target, b_target, a_source, b_source, interaction):
|
50
|
+
"""
|
51
|
+
Consumes a target canonical interaction CAN(a_target, b_target) and source interactions
|
52
|
+
CAN(a1, b1), CAN(a2), then manufactures a circuit identity of the form
|
53
|
+
|
54
|
+
CAN(a_target, b_target) = (Zr, Zs) CAN(a_source, b_source) (Zu, Zv) CAN(interaction) (Zx, Zy).
|
55
|
+
|
56
|
+
Returns the 6-tuple (r, s, u, v, x, y).
|
57
|
+
"""
|
58
|
+
|
59
|
+
cplus, cminus = math.cos(a_source + b_source), math.cos(a_source - b_source)
|
60
|
+
splus, sminus = math.sin(a_source + b_source), math.sin(a_source - b_source)
|
61
|
+
ca, sa = np.cos(interaction), np.sin(interaction)
|
62
|
+
|
63
|
+
uplusv = (
|
64
|
+
1
|
65
|
+
/ 2
|
66
|
+
* safe_arccos(
|
67
|
+
cminus**2 * ca**2 + sminus**2 * sa**2 - np.cos(a_target - b_target) ** 2,
|
68
|
+
2 * cminus * ca * sminus * sa,
|
69
|
+
)
|
70
|
+
)
|
71
|
+
uminusv = (
|
72
|
+
1
|
73
|
+
/ 2
|
74
|
+
* safe_arccos(
|
75
|
+
cplus**2 * ca**2 + splus**2 * sa**2 - np.cos(a_target + b_target) ** 2,
|
76
|
+
2 * cplus * ca * splus * sa,
|
77
|
+
)
|
78
|
+
)
|
79
|
+
|
80
|
+
u, v = (uplusv + uminusv) / 2, (uplusv - uminusv) / 2
|
81
|
+
|
82
|
+
# NOTE: the target matrix is phase-free
|
83
|
+
middle_matrix = reduce(
|
84
|
+
np.dot,
|
85
|
+
[
|
86
|
+
RXXGate(2 * a_source).to_matrix() @ RYYGate(2 * b_source).to_matrix(),
|
87
|
+
np.kron(RZGate(2 * u).to_matrix(), RZGate(2 * v).to_matrix()),
|
88
|
+
RXXGate(2 * interaction).to_matrix(),
|
89
|
+
],
|
90
|
+
)
|
91
|
+
|
92
|
+
phase_solver = np.array(
|
93
|
+
[
|
94
|
+
[
|
95
|
+
1 / 4,
|
96
|
+
1 / 4,
|
97
|
+
1 / 4,
|
98
|
+
1 / 4,
|
99
|
+
],
|
100
|
+
[
|
101
|
+
1 / 4,
|
102
|
+
-1 / 4,
|
103
|
+
-1 / 4,
|
104
|
+
1 / 4,
|
105
|
+
],
|
106
|
+
[
|
107
|
+
1 / 4,
|
108
|
+
1 / 4,
|
109
|
+
-1 / 4,
|
110
|
+
-1 / 4,
|
111
|
+
],
|
112
|
+
[
|
113
|
+
1 / 4,
|
114
|
+
-1 / 4,
|
115
|
+
1 / 4,
|
116
|
+
-1 / 4,
|
117
|
+
],
|
118
|
+
]
|
119
|
+
)
|
120
|
+
inner_phases = [
|
121
|
+
cmath.phase(middle_matrix[0, 0]),
|
122
|
+
cmath.phase(middle_matrix[1, 1]),
|
123
|
+
cmath.phase(middle_matrix[1, 2]) + np.pi / 2,
|
124
|
+
cmath.phase(middle_matrix[0, 3]) + np.pi / 2,
|
125
|
+
]
|
126
|
+
r, s, x, y = np.dot(phase_solver, inner_phases)
|
127
|
+
|
128
|
+
# If there's a phase discrepancy, need to conjugate by an extra Z/2 (x) Z/2.
|
129
|
+
generated_matrix = reduce(
|
130
|
+
np.dot,
|
131
|
+
[
|
132
|
+
np.kron(RZGate(2 * r).to_matrix(), RZGate(2 * s).to_matrix()),
|
133
|
+
middle_matrix,
|
134
|
+
np.kron(RZGate(2 * x).to_matrix(), RZGate(2 * y).to_matrix()),
|
135
|
+
],
|
136
|
+
)
|
137
|
+
if (abs(cmath.phase(generated_matrix[3, 0]) - np.pi / 2) < 0.01 and a_target > b_target) or (
|
138
|
+
abs(cmath.phase(generated_matrix[3, 0]) + np.pi / 2) < 0.01 and a_target < b_target
|
139
|
+
):
|
140
|
+
x += np.pi / 4
|
141
|
+
y += np.pi / 4
|
142
|
+
r -= np.pi / 4
|
143
|
+
s -= np.pi / 4
|
144
|
+
|
145
|
+
return r, s, u, v, x, y
|
146
|
+
|
147
|
+
|
148
|
+
def xx_circuit_step(source, strength, target, embodiment):
|
149
|
+
"""
|
150
|
+
Builds a single step in an XX-based circuit.
|
151
|
+
|
152
|
+
`source` and `target` are positive canonical coordinates; `strength` is the interaction strength
|
153
|
+
at this step in the circuit as a canonical coordinate (so that CX = RZX(pi/2) corresponds to
|
154
|
+
pi/4); and `embodiment` is a Qiskit circuit which enacts the canonical gate of the prescribed
|
155
|
+
interaction `strength`.
|
156
|
+
"""
|
157
|
+
|
158
|
+
permute_source_for_overlap, permute_target_for_overlap = None, None
|
159
|
+
|
160
|
+
# apply all possible reflections, shifts to the source
|
161
|
+
for source_reflection_name in reflection_options:
|
162
|
+
reflected_source_coord, source_reflection, reflection_phase_shift = apply_reflection(
|
163
|
+
source_reflection_name, source
|
164
|
+
)
|
165
|
+
for source_shift_name in shift_options:
|
166
|
+
shifted_source_coord, source_shift, shift_phase_shift = apply_shift(
|
167
|
+
source_shift_name, reflected_source_coord
|
168
|
+
)
|
169
|
+
|
170
|
+
# check for overlap, back out permutation
|
171
|
+
source_shared, target_shared = None, None
|
172
|
+
for i, j in [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]:
|
173
|
+
|
174
|
+
if (
|
175
|
+
abs(np.mod(abs(shifted_source_coord[i] - target[j]), np.pi)) < EPSILON
|
176
|
+
or abs(np.mod(abs(shifted_source_coord[i] - target[j]), np.pi) - np.pi)
|
177
|
+
< EPSILON
|
178
|
+
):
|
179
|
+
source_shared, target_shared = i, j
|
180
|
+
break
|
181
|
+
if source_shared is None:
|
182
|
+
continue
|
183
|
+
|
184
|
+
# pick out the other coordinates
|
185
|
+
source_first, source_second = (x for x in [0, 1, 2] if x != source_shared)
|
186
|
+
target_first, target_second = (x for x in [0, 1, 2] if x != target_shared)
|
187
|
+
|
188
|
+
# check for arccos validity
|
189
|
+
r, s, u, v, x, y = decompose_xxyy_into_xxyy_xx(
|
190
|
+
float(target[target_first]),
|
191
|
+
float(target[target_second]),
|
192
|
+
float(shifted_source_coord[source_first]),
|
193
|
+
float(shifted_source_coord[source_second]),
|
194
|
+
float(strength),
|
195
|
+
)
|
196
|
+
if any(math.isnan(val) for val in (r, s, u, v, x, y)):
|
197
|
+
continue
|
198
|
+
|
199
|
+
# OK: this combination of things works.
|
200
|
+
# save the permutation which rotates the shared coordinate into ZZ.
|
201
|
+
permute_source_for_overlap = canonical_rotation_circuit(source_first, source_second)
|
202
|
+
permute_target_for_overlap = canonical_rotation_circuit(target_first, target_second)
|
203
|
+
break
|
204
|
+
|
205
|
+
if permute_source_for_overlap is not None:
|
206
|
+
break
|
207
|
+
|
208
|
+
if permute_source_for_overlap is None:
|
209
|
+
raise QiskitError(
|
210
|
+
"Error during RZX decomposition: Could not find a suitable Weyl "
|
211
|
+
f"reflection to match {source} to {target} along {strength}."
|
212
|
+
)
|
213
|
+
|
214
|
+
prefix_circuit, affix_circuit = QuantumCircuit(2), QuantumCircuit(2)
|
215
|
+
|
216
|
+
# the basic formula we're trying to work with is:
|
217
|
+
# target^p_t_f_o =
|
218
|
+
# rs * (source^s_reflection * s_shift)^p_s_f_o * uv * operation * xy
|
219
|
+
# but we're rearranging it into the form
|
220
|
+
# target = affix source prefix
|
221
|
+
# and computing just the prefix / affix circuits.
|
222
|
+
|
223
|
+
# the outermost prefix layer comes from the (inverse) target permutation.
|
224
|
+
prefix_circuit.compose(permute_target_for_overlap.inverse(), inplace=True)
|
225
|
+
# the middle prefix layer comes from the local Z rolls.
|
226
|
+
prefix_circuit.rz(2 * x, [0])
|
227
|
+
prefix_circuit.rz(2 * y, [1])
|
228
|
+
prefix_circuit.compose(embodiment, inplace=True)
|
229
|
+
prefix_circuit.rz(2 * u, [0])
|
230
|
+
prefix_circuit.rz(2 * v, [1])
|
231
|
+
# the innermost prefix layer is source_reflection, shifted by source_shift,
|
232
|
+
# finally conjugated by p_s_f_o.
|
233
|
+
prefix_circuit.compose(permute_source_for_overlap, inplace=True)
|
234
|
+
prefix_circuit.compose(source_reflection, inplace=True)
|
235
|
+
prefix_circuit.global_phase -= cmath.phase(reflection_phase_shift)
|
236
|
+
prefix_circuit.global_phase -= cmath.phase(shift_phase_shift)
|
237
|
+
|
238
|
+
# the affix circuit is constructed in reverse.
|
239
|
+
# first (i.e., innermost), we install the other half of the source transformations and p_s_f_o.
|
240
|
+
affix_circuit.compose(source_reflection.inverse(), inplace=True)
|
241
|
+
affix_circuit.compose(source_shift, inplace=True)
|
242
|
+
affix_circuit.compose(permute_source_for_overlap.inverse(), inplace=True)
|
243
|
+
# then, the other local rolls in the middle.
|
244
|
+
affix_circuit.rz(2 * r, [0])
|
245
|
+
affix_circuit.rz(2 * s, [1])
|
246
|
+
# finally, the other half of the p_t_f_o conjugation.
|
247
|
+
affix_circuit.compose(permute_target_for_overlap, inplace=True)
|
248
|
+
|
249
|
+
return {"prefix_circuit": prefix_circuit, "affix_circuit": affix_circuit}
|
250
|
+
|
251
|
+
|
252
|
+
def canonical_xx_circuit(target, strength_sequence, basis_embodiments):
|
253
|
+
"""
|
254
|
+
Assembles a Qiskit circuit from a specified `strength_sequence` of XX-type interactions which
|
255
|
+
emulates the canonical gate at canonical coordinate `target`. The circuits supplied by
|
256
|
+
`basis_embodiments` are used to instantiate the individual XX actions.
|
257
|
+
|
258
|
+
NOTE: The elements of `strength_sequence` are expected to be normalized so that np.pi/2
|
259
|
+
corresponds to RZX(np.pi/2) = CX; `target` is taken to be a positive canonical coordinate;
|
260
|
+
and `basis_embodiments` maps `strength_sequence` elements to circuits which instantiate
|
261
|
+
these gates.
|
262
|
+
"""
|
263
|
+
# empty decompositions are easy!
|
264
|
+
if len(strength_sequence) == 0:
|
265
|
+
return QuantumCircuit(2)
|
266
|
+
|
267
|
+
# assemble the prefix / affix circuits
|
268
|
+
prefix_circuit, affix_circuit = QuantumCircuit(2), QuantumCircuit(2)
|
269
|
+
while len(strength_sequence) > 1:
|
270
|
+
source = decomposition_hop(target, strength_sequence)
|
271
|
+
strength = strength_sequence[-1]
|
272
|
+
|
273
|
+
preceding_prefix_circuit, preceding_affix_circuit = itemgetter(
|
274
|
+
"prefix_circuit", "affix_circuit"
|
275
|
+
)(xx_circuit_step(source, strength / 2, target, basis_embodiments[strength]))
|
276
|
+
|
277
|
+
prefix_circuit.compose(preceding_prefix_circuit, inplace=True)
|
278
|
+
affix_circuit.compose(preceding_affix_circuit, inplace=True, front=True)
|
279
|
+
|
280
|
+
target, strength_sequence = source, strength_sequence[:-1]
|
281
|
+
|
282
|
+
circuit = prefix_circuit
|
283
|
+
|
284
|
+
# lastly, deal with the "leading" gate.
|
285
|
+
if target[0] <= np.pi / 4:
|
286
|
+
circuit.compose(basis_embodiments[strength_sequence[0]], inplace=True)
|
287
|
+
else:
|
288
|
+
_, source_reflection, reflection_phase_shift = apply_reflection("reflect XX, YY", [0, 0, 0])
|
289
|
+
_, source_shift, shift_phase_shift = apply_shift("X shift", [0, 0, 0])
|
290
|
+
|
291
|
+
circuit.compose(source_reflection, inplace=True)
|
292
|
+
circuit.compose(basis_embodiments[strength_sequence[0]], inplace=True)
|
293
|
+
circuit.compose(source_reflection.inverse(), inplace=True)
|
294
|
+
circuit.compose(source_shift, inplace=True)
|
295
|
+
circuit.global_phase -= cmath.phase(shift_phase_shift)
|
296
|
+
circuit.global_phase -= cmath.phase(reflection_phase_shift)
|
297
|
+
|
298
|
+
circuit.compose(affix_circuit, inplace=True)
|
299
|
+
|
300
|
+
return circuit
|
@@ -0,0 +1,324 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2021, 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
|
+
"""
|
14
|
+
Driver for a synthesis routine which emits optimal XX-based circuits.
|
15
|
+
"""
|
16
|
+
from __future__ import annotations
|
17
|
+
import heapq
|
18
|
+
import math
|
19
|
+
from operator import itemgetter
|
20
|
+
from typing import Callable
|
21
|
+
|
22
|
+
import numpy as np
|
23
|
+
|
24
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
25
|
+
from qiskit.circuit.library.standard_gates import RXXGate, RZXGate
|
26
|
+
from qiskit.exceptions import QiskitError
|
27
|
+
from qiskit.quantum_info.operators import Operator
|
28
|
+
from qiskit.synthesis.one_qubit.one_qubit_decompose import ONE_QUBIT_EULER_BASIS_GATES
|
29
|
+
from qiskit.synthesis.two_qubit.two_qubit_decompose import TwoQubitWeylDecomposition
|
30
|
+
|
31
|
+
from .circuits import apply_reflection, apply_shift, canonical_xx_circuit
|
32
|
+
from .utilities import EPSILON
|
33
|
+
from .polytopes import XXPolytope
|
34
|
+
|
35
|
+
|
36
|
+
def _average_infidelity(p, q):
|
37
|
+
"""
|
38
|
+
Computes the infidelity distance between two points p, q expressed in positive canonical
|
39
|
+
coordinates.
|
40
|
+
"""
|
41
|
+
|
42
|
+
a0, b0, c0 = p
|
43
|
+
a1, b1, c1 = q
|
44
|
+
|
45
|
+
return 1 - 1 / 20 * (
|
46
|
+
4
|
47
|
+
+ 16
|
48
|
+
* (
|
49
|
+
math.cos(a0 - a1) ** 2 * math.cos(b0 - b1) ** 2 * math.cos(c0 - c1) ** 2
|
50
|
+
+ math.sin(a0 - a1) ** 2 * math.sin(b0 - b1) ** 2 * math.sin(c0 - c1) ** 2
|
51
|
+
)
|
52
|
+
)
|
53
|
+
|
54
|
+
|
55
|
+
class XXDecomposer:
|
56
|
+
r"""
|
57
|
+
A class for optimal decomposition of 2-qubit unitaries into 2-qubit basis gates of ``XX`` type
|
58
|
+
(i.e., each locally equivalent to :math:`CAN(\alpha, 0, 0)` for a possibly varying :math:`alpha`).
|
59
|
+
|
60
|
+
Args:
|
61
|
+
basis_fidelity: available strengths and fidelity of each.
|
62
|
+
Can be either (1) a dictionary mapping ``XX`` angle values to fidelity at that angle; or
|
63
|
+
(2) a single float ``f``, interpreted as ``{pi: f, pi/2: f/2, pi/3: f/3}``.
|
64
|
+
euler_basis: Basis string provided to :class:`.OneQubitEulerDecomposer` for 1Q synthesis.
|
65
|
+
Defaults to ``"U"``.
|
66
|
+
embodiments: A dictionary mapping interaction strengths alpha to native circuits which
|
67
|
+
embody the gate :math:`CAN(\alpha, 0, 0)`. Strengths are taken so that :math:`\pi/2`
|
68
|
+
represents the class of a full :class:`.CXGate`.
|
69
|
+
backup_optimizer: If supplied, defers synthesis to this callable when :class:`.XXDecomposer`
|
70
|
+
has no efficient decomposition of its own. Useful for special cases involving 2 or 3
|
71
|
+
applications of :math:`XX(\pi/2)`, in which case standard synthesis methods provide lower
|
72
|
+
1Q gate count.
|
73
|
+
|
74
|
+
.. note::
|
75
|
+
If ``embodiments`` is not passed, or if an entry is missing, it will be populated as needed
|
76
|
+
using the method ``_default_embodiment``.
|
77
|
+
|
78
|
+
.. automethod:: __call__
|
79
|
+
"""
|
80
|
+
|
81
|
+
def __init__(
|
82
|
+
self,
|
83
|
+
basis_fidelity: dict | float = 1.0,
|
84
|
+
euler_basis: str = "U",
|
85
|
+
embodiments: dict[float, QuantumCircuit] | None = None,
|
86
|
+
backup_optimizer: Callable[..., QuantumCircuit] | None = None,
|
87
|
+
):
|
88
|
+
from qiskit.transpiler.passes.optimization.optimize_1q_decomposition import (
|
89
|
+
Optimize1qGatesDecomposition, # pylint: disable=cyclic-import
|
90
|
+
)
|
91
|
+
|
92
|
+
self._decomposer1q = Optimize1qGatesDecomposition(ONE_QUBIT_EULER_BASIS_GATES[euler_basis])
|
93
|
+
self.embodiments = embodiments if embodiments is not None else {}
|
94
|
+
self.backup_optimizer = backup_optimizer
|
95
|
+
self.basis_fidelity = basis_fidelity
|
96
|
+
|
97
|
+
# expose one of the basis gates so others can know what this decomposer targets
|
98
|
+
embodiment_circuit = next(iter(self.embodiments.values()), QuantumCircuit())
|
99
|
+
for instruction in embodiment_circuit:
|
100
|
+
if len(instruction.qubits) == 2:
|
101
|
+
self.gate = instruction.operation
|
102
|
+
break
|
103
|
+
else:
|
104
|
+
self.gate = RZXGate(np.pi / 2)
|
105
|
+
|
106
|
+
self._check_embodiments()
|
107
|
+
|
108
|
+
@staticmethod
|
109
|
+
def _default_embodiment(strength):
|
110
|
+
"""
|
111
|
+
If the user does not provide a custom implementation of XX(strength), then this routine
|
112
|
+
defines a default implementation using RZX.
|
113
|
+
"""
|
114
|
+
xx_circuit = QuantumCircuit(2)
|
115
|
+
|
116
|
+
# NOTE: One could branch here on `strength == np.pi / 2` and decide to use a CX-based
|
117
|
+
# circuit in this one case where it's available.
|
118
|
+
xx_circuit.h(0)
|
119
|
+
xx_circuit.rzx(strength, 0, 1)
|
120
|
+
xx_circuit.h(0)
|
121
|
+
|
122
|
+
return xx_circuit
|
123
|
+
|
124
|
+
def _check_embodiments(self):
|
125
|
+
"""
|
126
|
+
Checks that `self.embodiments` is populated with legal circuit embodiments: the key-value
|
127
|
+
pair (angle, circuit) satisfies Operator(circuit) approx RXX(angle).to_matrix().
|
128
|
+
"""
|
129
|
+
# pylint: disable=cyclic-import
|
130
|
+
from qiskit.quantum_info.operators.measures import average_gate_fidelity
|
131
|
+
|
132
|
+
for angle, embodiment in self.embodiments.items():
|
133
|
+
actual = Operator(RXXGate(angle))
|
134
|
+
purported = Operator(embodiment)
|
135
|
+
if average_gate_fidelity(actual, purported) < 1 - EPSILON:
|
136
|
+
raise QiskitError(
|
137
|
+
f"RXX embodiment provided for angle {angle} disagrees with RXXGate({angle})"
|
138
|
+
)
|
139
|
+
|
140
|
+
@staticmethod
|
141
|
+
def _best_decomposition(canonical_coordinate, available_strengths):
|
142
|
+
"""
|
143
|
+
Finds the cheapest sequence of `available_strengths` which supports the best approximation
|
144
|
+
to `canonical_coordinate`. Returns a dictionary with keys "cost", "point", and "operations".
|
145
|
+
|
146
|
+
NOTE: `canonical_coordinate` is a positive canonical coordinate. `strengths` is a dictionary
|
147
|
+
mapping the available strengths to their (infidelity) costs, with the strengths
|
148
|
+
themselves normalized so that pi/2 represents CX = RZX(pi/2).
|
149
|
+
"""
|
150
|
+
best_point, best_cost, best_sequence = [0, 0, 0], 1.0, []
|
151
|
+
priority_queue = []
|
152
|
+
heapq.heappush(priority_queue, (0, []))
|
153
|
+
canonical_coordinate = np.array(canonical_coordinate)
|
154
|
+
|
155
|
+
while True:
|
156
|
+
if len(priority_queue) == 0:
|
157
|
+
if len(available_strengths) == 0:
|
158
|
+
raise QiskitError(
|
159
|
+
"Attempting to synthesize entangling gate with no controlled gates in basis set."
|
160
|
+
)
|
161
|
+
raise QiskitError("Unable to synthesize a 2q unitary with the supplied basis set.")
|
162
|
+
|
163
|
+
sequence_cost, sequence = heapq.heappop(priority_queue)
|
164
|
+
|
165
|
+
strength_polytope = XXPolytope.from_strengths(*[x / 2 for x in sequence])
|
166
|
+
candidate_point = strength_polytope.nearest(canonical_coordinate)
|
167
|
+
candidate_cost = sequence_cost + _average_infidelity(
|
168
|
+
canonical_coordinate, candidate_point
|
169
|
+
)
|
170
|
+
|
171
|
+
if candidate_cost < best_cost:
|
172
|
+
best_point, best_cost, best_sequence = candidate_point, candidate_cost, sequence
|
173
|
+
|
174
|
+
if strength_polytope.member(canonical_coordinate):
|
175
|
+
break
|
176
|
+
|
177
|
+
for strength, extra_cost in available_strengths.items():
|
178
|
+
if len(sequence) == 0 or strength <= sequence[-1]:
|
179
|
+
heapq.heappush(
|
180
|
+
priority_queue, (sequence_cost + extra_cost, sequence + [strength])
|
181
|
+
)
|
182
|
+
|
183
|
+
return {"point": best_point, "cost": best_cost, "sequence": best_sequence}
|
184
|
+
|
185
|
+
def num_basis_gates(self, unitary: Operator | np.ndarray):
|
186
|
+
"""
|
187
|
+
Counts the number of gates that would be emitted during re-synthesis.
|
188
|
+
|
189
|
+
.. note::
|
190
|
+
This method is used by :class:`.ConsolidateBlocks`.
|
191
|
+
"""
|
192
|
+
strengths = self._strength_to_infidelity(1.0)
|
193
|
+
|
194
|
+
# get the associated _positive_ canonical coordinate
|
195
|
+
weyl_decomposition = TwoQubitWeylDecomposition(unitary)
|
196
|
+
target = [getattr(weyl_decomposition, x) for x in ("a", "b", "c")]
|
197
|
+
if target[-1] < -EPSILON:
|
198
|
+
target = [np.pi / 2 - target[0], target[1], -target[2]]
|
199
|
+
|
200
|
+
best_sequence = self._best_decomposition(target, strengths)["sequence"]
|
201
|
+
return len(best_sequence)
|
202
|
+
|
203
|
+
@staticmethod
|
204
|
+
def _strength_to_infidelity(basis_fidelity, approximate=False):
|
205
|
+
"""
|
206
|
+
Converts a dictionary mapping XX strengths to fidelities to a dictionary mapping XX
|
207
|
+
strengths to infidelities. Also supports one of the other formats Qiskit uses: if only a
|
208
|
+
lone float is supplied, it extends it from CX over CX/2 and CX/3 by linear decay.
|
209
|
+
"""
|
210
|
+
|
211
|
+
if isinstance(basis_fidelity, float):
|
212
|
+
if not approximate:
|
213
|
+
slope, offset = 1e-10, 1e-12
|
214
|
+
else:
|
215
|
+
slope, offset = (1 - basis_fidelity) / 2, (1 - basis_fidelity) / 2
|
216
|
+
return {
|
217
|
+
strength: slope * strength / (np.pi / 2) + offset
|
218
|
+
for strength in [np.pi / 2, np.pi / 4, np.pi / 6]
|
219
|
+
}
|
220
|
+
elif isinstance(basis_fidelity, dict):
|
221
|
+
return {
|
222
|
+
strength: (1 - fidelity if approximate else 1e-12 + 1e-10 * strength / (np.pi / 2))
|
223
|
+
for (strength, fidelity) in basis_fidelity.items()
|
224
|
+
}
|
225
|
+
|
226
|
+
raise TypeError("Unknown basis_fidelity payload.")
|
227
|
+
|
228
|
+
def __call__(
|
229
|
+
self,
|
230
|
+
unitary: Operator | np.ndarray,
|
231
|
+
basis_fidelity: dict | float | None = None,
|
232
|
+
approximate: bool = True,
|
233
|
+
use_dag: bool = False,
|
234
|
+
) -> QuantumCircuit:
|
235
|
+
r"""
|
236
|
+
Fashions a circuit which (perhaps approximately) models the special unitary operation
|
237
|
+
``unitary``, using the circuit templates supplied at initialization as ``embodiments``. The
|
238
|
+
routine uses ``basis_fidelity`` to select the optimal circuit template, including when
|
239
|
+
performing exact synthesis; the contents of ``basis_fidelity`` is a dictionary mapping
|
240
|
+
interaction strengths (scaled so that :math:`CX = RZX(\pi/2)` corresponds to :math:`\pi/2`)
|
241
|
+
to circuit fidelities.
|
242
|
+
|
243
|
+
Args:
|
244
|
+
unitary (Operator or ndarray): :math:`4 \times 4` unitary to synthesize.
|
245
|
+
basis_fidelity (dict or float): Fidelity of basis gates. Can be either (1) a dictionary
|
246
|
+
mapping ``XX`` angle values to fidelity at that angle; or (2) a single float ``f``,
|
247
|
+
interpreted as ``{pi: f, pi/2: f/2, pi/3: f/3}``.
|
248
|
+
If given, overrides the basis_fidelity given at init.
|
249
|
+
approximate (bool): Approximates if basis fidelities are less than 1.0 .
|
250
|
+
use_dag (bool): If true a :class:`.DAGCircuit` is returned instead of a
|
251
|
+
:class:`QuantumCircuit` when this class is called.
|
252
|
+
|
253
|
+
Returns:
|
254
|
+
QuantumCircuit: Synthesized circuit.
|
255
|
+
"""
|
256
|
+
basis_fidelity = basis_fidelity or self.basis_fidelity
|
257
|
+
strength_to_infidelity = self._strength_to_infidelity(
|
258
|
+
basis_fidelity, approximate=approximate
|
259
|
+
)
|
260
|
+
|
261
|
+
from qiskit.circuit.library import UnitaryGate # pylint: disable=cyclic-import
|
262
|
+
|
263
|
+
# get the associated _positive_ canonical coordinate
|
264
|
+
weyl_decomposition = TwoQubitWeylDecomposition(unitary)
|
265
|
+
target = [getattr(weyl_decomposition, x) for x in ("a", "b", "c")]
|
266
|
+
if target[-1] < -EPSILON:
|
267
|
+
target = [np.pi / 2 - target[0], target[1], -target[2]]
|
268
|
+
|
269
|
+
# scan for the best point
|
270
|
+
best_point, best_sequence = itemgetter("point", "sequence")(
|
271
|
+
self._best_decomposition(target, strength_to_infidelity)
|
272
|
+
)
|
273
|
+
# build the circuit building this canonical gate
|
274
|
+
embodiments = {
|
275
|
+
k: self.embodiments.get(k, self._default_embodiment(k))
|
276
|
+
for k, v in strength_to_infidelity.items()
|
277
|
+
}
|
278
|
+
circuit = canonical_xx_circuit(best_point, best_sequence, embodiments)
|
279
|
+
|
280
|
+
if (
|
281
|
+
best_sequence in ([np.pi / 2, np.pi / 2, np.pi / 2], [np.pi / 2, np.pi / 2])
|
282
|
+
and self.backup_optimizer is not None
|
283
|
+
):
|
284
|
+
pi2_fidelity = 1 - strength_to_infidelity[np.pi / 2]
|
285
|
+
return self.backup_optimizer(unitary, basis_fidelity=pi2_fidelity, use_dag=use_dag)
|
286
|
+
|
287
|
+
# change to positive canonical coordinates
|
288
|
+
if weyl_decomposition.c >= -EPSILON:
|
289
|
+
# if they're the same...
|
290
|
+
corrected_circuit = QuantumCircuit(2)
|
291
|
+
corrected_circuit.rz(np.pi, [0])
|
292
|
+
corrected_circuit.compose(circuit, [0, 1], inplace=True)
|
293
|
+
corrected_circuit.rz(-np.pi, [0])
|
294
|
+
circuit = corrected_circuit
|
295
|
+
else:
|
296
|
+
# else they're in the "positive" scissors part...
|
297
|
+
corrected_circuit = QuantumCircuit(2)
|
298
|
+
_, source_reflection, _ = apply_reflection("reflect XX, ZZ", [0, 0, 0])
|
299
|
+
_, source_shift, _ = apply_shift("X shift", [0, 0, 0])
|
300
|
+
|
301
|
+
corrected_circuit.compose(source_reflection.inverse(), inplace=True)
|
302
|
+
corrected_circuit.rz(np.pi, [0])
|
303
|
+
corrected_circuit.compose(circuit, [0, 1], inplace=True)
|
304
|
+
corrected_circuit.rz(-np.pi, [0])
|
305
|
+
corrected_circuit.compose(source_shift.inverse(), inplace=True)
|
306
|
+
corrected_circuit.compose(source_reflection, inplace=True)
|
307
|
+
corrected_circuit.global_phase += np.pi / 2
|
308
|
+
|
309
|
+
circuit = corrected_circuit
|
310
|
+
|
311
|
+
circ = QuantumCircuit(2, global_phase=weyl_decomposition.global_phase)
|
312
|
+
|
313
|
+
circ.append(UnitaryGate(weyl_decomposition.K2r), [0])
|
314
|
+
circ.append(UnitaryGate(weyl_decomposition.K2l), [1])
|
315
|
+
circ.compose(circuit, [0, 1], inplace=True)
|
316
|
+
circ.append(UnitaryGate(weyl_decomposition.K1r), [0])
|
317
|
+
circ.append(UnitaryGate(weyl_decomposition.K1l), [1])
|
318
|
+
|
319
|
+
circ = self._decomposer1q(circ)
|
320
|
+
if use_dag:
|
321
|
+
from qiskit.converters import circuit_to_dag
|
322
|
+
|
323
|
+
return circuit_to_dag(circ, copy_operations=False)
|
324
|
+
return circ
|