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,262 @@
|
|
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
|
+
Defines bare dataclasses which house polytope information, as well as a specialized data structure
|
15
|
+
which describes those two-qubit programs accessible to a given sequence of XX-type interactions.
|
16
|
+
"""
|
17
|
+
|
18
|
+
from __future__ import annotations
|
19
|
+
from copy import copy
|
20
|
+
from dataclasses import dataclass, field
|
21
|
+
from itertools import combinations
|
22
|
+
|
23
|
+
import numpy as np
|
24
|
+
|
25
|
+
from qiskit.exceptions import QiskitError
|
26
|
+
|
27
|
+
from .utilities import EPSILON
|
28
|
+
|
29
|
+
|
30
|
+
@dataclass
|
31
|
+
class ConvexPolytopeData:
|
32
|
+
"""
|
33
|
+
The raw data underlying a ConvexPolytope. Describes a single convex
|
34
|
+
polytope, specified by families of `inequalities` and `equalities`, each
|
35
|
+
entry of which respectively corresponds to
|
36
|
+
|
37
|
+
inequalities[j][0] + sum_i inequalities[j][i] * xi >= 0
|
38
|
+
|
39
|
+
and
|
40
|
+
|
41
|
+
equalities[j][0] + sum_i equalities[j][i] * xi == 0.
|
42
|
+
"""
|
43
|
+
|
44
|
+
inequalities: list[list[int]]
|
45
|
+
equalities: list[list[int]] = field(default_factory=list)
|
46
|
+
name: str = ""
|
47
|
+
|
48
|
+
|
49
|
+
@dataclass
|
50
|
+
class PolytopeData:
|
51
|
+
"""
|
52
|
+
The raw data of a union of convex polytopes.
|
53
|
+
"""
|
54
|
+
|
55
|
+
convex_subpolytopes: list[ConvexPolytopeData]
|
56
|
+
|
57
|
+
|
58
|
+
def polytope_has_element(polytope, point):
|
59
|
+
"""
|
60
|
+
Tests whether `polytope` contains `point.
|
61
|
+
"""
|
62
|
+
return all(
|
63
|
+
-EPSILON <= inequality[0] + sum(x * y for x, y in zip(point, inequality[1:]))
|
64
|
+
for inequality in polytope.inequalities
|
65
|
+
) and all(
|
66
|
+
abs(equality[0] + sum(x * y for x, y in zip(point, equality[1:]))) <= EPSILON
|
67
|
+
for equality in polytope.equalities
|
68
|
+
)
|
69
|
+
|
70
|
+
|
71
|
+
def manual_get_vertex(polytope, seed=42):
|
72
|
+
"""
|
73
|
+
Returns a single random vertex from `polytope`.
|
74
|
+
"""
|
75
|
+
rng = np.random.default_rng(seed)
|
76
|
+
|
77
|
+
if isinstance(polytope, PolytopeData):
|
78
|
+
paragraphs = copy(polytope.convex_subpolytopes)
|
79
|
+
elif isinstance(polytope, ConvexPolytopeData):
|
80
|
+
paragraphs = [polytope]
|
81
|
+
else:
|
82
|
+
raise TypeError(f"{type(polytope)} is not polytope-like.")
|
83
|
+
|
84
|
+
rng.shuffle(paragraphs)
|
85
|
+
for convex_subpolytope in paragraphs:
|
86
|
+
sentences = convex_subpolytope.inequalities + convex_subpolytope.equalities
|
87
|
+
if len(sentences) == 0:
|
88
|
+
continue
|
89
|
+
dimension = len(sentences[0]) - 1
|
90
|
+
rng.shuffle(sentences)
|
91
|
+
for inequalities in combinations(sentences, dimension):
|
92
|
+
matrix = np.array([x[1:] for x in inequalities])
|
93
|
+
b = np.array([x[0] for x in inequalities])
|
94
|
+
try:
|
95
|
+
vertex = np.linalg.inv(-matrix) @ b
|
96
|
+
if polytope_has_element(convex_subpolytope, vertex):
|
97
|
+
return vertex
|
98
|
+
except np.linalg.LinAlgError:
|
99
|
+
pass
|
100
|
+
|
101
|
+
raise QiskitError(f"Polytope has no feasible solutions:\n{polytope}")
|
102
|
+
|
103
|
+
|
104
|
+
@dataclass
|
105
|
+
class XXPolytope:
|
106
|
+
"""
|
107
|
+
Describes those two-qubit programs accessible to a given sequence of XX-type interactions.
|
108
|
+
|
109
|
+
NOTE: Strengths are normalized so that CX corresponds to pi / 4, which differs from Qiskit's
|
110
|
+
conventions around RZX elsewhere.
|
111
|
+
"""
|
112
|
+
|
113
|
+
# NOTE: This is _not_ a subclass of PolytopeData, because we're never going to call slow,
|
114
|
+
# generic PolytopeData functions on it.
|
115
|
+
|
116
|
+
total_strength: float = 0.0
|
117
|
+
max_strength: float = 0.0
|
118
|
+
place_strength: float = 0.0
|
119
|
+
|
120
|
+
@classmethod
|
121
|
+
def from_strengths(cls, *strengths):
|
122
|
+
"""
|
123
|
+
Constructs an XXPolytope from a sequence of strengths.
|
124
|
+
"""
|
125
|
+
total_strength, max_strength, place_strength = 0, 0, 0
|
126
|
+
for strength in strengths:
|
127
|
+
total_strength += strength
|
128
|
+
if strength >= max_strength:
|
129
|
+
max_strength, place_strength = strength, max_strength
|
130
|
+
elif strength >= place_strength:
|
131
|
+
place_strength = strength
|
132
|
+
|
133
|
+
return XXPolytope(
|
134
|
+
total_strength=total_strength, max_strength=max_strength, place_strength=place_strength
|
135
|
+
)
|
136
|
+
|
137
|
+
def add_strength(self, new_strength: float = 0.0):
|
138
|
+
"""
|
139
|
+
Returns a new XXPolytope with one new XX interaction appended.
|
140
|
+
"""
|
141
|
+
return XXPolytope(
|
142
|
+
total_strength=self.total_strength + new_strength,
|
143
|
+
max_strength=max(self.max_strength, new_strength),
|
144
|
+
place_strength=(
|
145
|
+
self.max_strength
|
146
|
+
if new_strength > self.max_strength
|
147
|
+
else new_strength if new_strength > self.place_strength else self.place_strength
|
148
|
+
),
|
149
|
+
)
|
150
|
+
|
151
|
+
@property
|
152
|
+
def _offsets(self):
|
153
|
+
"""
|
154
|
+
Returns b with A*x + b ≥ 0 iff x belongs to the XXPolytope.
|
155
|
+
"""
|
156
|
+
return np.array(
|
157
|
+
[
|
158
|
+
0,
|
159
|
+
0,
|
160
|
+
0,
|
161
|
+
np.pi / 2,
|
162
|
+
self.total_strength,
|
163
|
+
self.total_strength - 2 * self.max_strength,
|
164
|
+
self.total_strength - self.max_strength - self.place_strength,
|
165
|
+
]
|
166
|
+
)
|
167
|
+
|
168
|
+
def member(self, point):
|
169
|
+
"""
|
170
|
+
Returns True when `point` is a member of `self`.
|
171
|
+
"""
|
172
|
+
|
173
|
+
reflected_point = point.copy().reshape(-1, 3)
|
174
|
+
rows = reflected_point[:, 0] >= np.pi / 4 + EPSILON
|
175
|
+
reflected_point[rows, 0] = np.pi / 2 - reflected_point[rows, 0]
|
176
|
+
reflected_point = reflected_point.reshape(point.shape)
|
177
|
+
|
178
|
+
return np.all(
|
179
|
+
self._offsets + np.einsum("ij,...j->...i", A, reflected_point) >= -EPSILON, axis=-1
|
180
|
+
)
|
181
|
+
|
182
|
+
def nearest(self, point):
|
183
|
+
"""
|
184
|
+
Finds the nearest point (in Euclidean or infidelity distance) to `self`.
|
185
|
+
"""
|
186
|
+
# pylint:disable=invalid-name
|
187
|
+
|
188
|
+
# NOTE: A CAS says that there are no degenerate double intersections, and the only
|
189
|
+
# degenerate triple intersections are
|
190
|
+
#
|
191
|
+
# (1, -1, 0), (0, 0, 1), (-1, 1, 1) and (1, 1, 0), (0, 0, 1), (1, 1, 1).
|
192
|
+
#
|
193
|
+
# Skipping this pair won't save much work, so we don't bother.
|
194
|
+
|
195
|
+
# A1, A1inv, A2, A2inv, A3, A3inv
|
196
|
+
# These global variables contain projection matrices, computed once-and-for-all, which
|
197
|
+
# produce the Euclidean-nearest projection.
|
198
|
+
|
199
|
+
if isinstance(point, np.ndarray) and len(point.shape) == 1:
|
200
|
+
y0 = point.copy()
|
201
|
+
elif isinstance(point, list):
|
202
|
+
y0 = np.array(point)
|
203
|
+
else:
|
204
|
+
raise TypeError(f"Can't handle type of point: {point} ({type(point)})")
|
205
|
+
|
206
|
+
reflected_p = y0[0] > np.pi / 4 + EPSILON
|
207
|
+
if reflected_p:
|
208
|
+
y0[0] = np.pi / 2 - y0[0]
|
209
|
+
|
210
|
+
# short circuit in codimension 0
|
211
|
+
if self.member(y0):
|
212
|
+
if reflected_p:
|
213
|
+
y0[0] = np.pi / 2 - y0[0]
|
214
|
+
return y0
|
215
|
+
|
216
|
+
# codimension 1
|
217
|
+
b1 = self._offsets.reshape(7, 1)
|
218
|
+
A1y0 = np.einsum("ijk,k->ij", A1, y0)
|
219
|
+
nearest1 = np.einsum("ijk,ik->ij", A1inv, b1 + A1y0) - y0
|
220
|
+
|
221
|
+
# codimension 2
|
222
|
+
b2 = np.array([*combinations(self._offsets, 2)])
|
223
|
+
A2y0 = np.einsum("ijk,k->ij", A2, y0)
|
224
|
+
nearest2 = np.einsum("ijk,ik->ij", A2inv, b2 + A2y0) - y0
|
225
|
+
|
226
|
+
# codimension 3
|
227
|
+
b3 = np.array([*combinations(self._offsets, 3)])
|
228
|
+
nearest3 = np.einsum("ijk,ik->ij", A3inv, b3)
|
229
|
+
|
230
|
+
# pick the nearest
|
231
|
+
nearest = -np.concatenate([nearest1, nearest2, nearest3])
|
232
|
+
nearest = nearest[self.member(nearest)]
|
233
|
+
smallest_index = np.argmin(np.linalg.norm(nearest - y0, axis=1))
|
234
|
+
|
235
|
+
if reflected_p:
|
236
|
+
nearest[smallest_index][0] = np.pi / 2 - nearest[smallest_index][0]
|
237
|
+
return nearest[smallest_index]
|
238
|
+
|
239
|
+
|
240
|
+
A = np.array(
|
241
|
+
[
|
242
|
+
[1, -1, 0], # a ≥ b
|
243
|
+
[0, 1, -1], # b ≥ c
|
244
|
+
[0, 0, 1], # c ≥ 0
|
245
|
+
[-1, -1, 0], # pi/2 ≥ a + b
|
246
|
+
[-1, -1, -1], # strength
|
247
|
+
[1, -1, -1], # slant
|
248
|
+
[0, 0, -1], # frustrum
|
249
|
+
]
|
250
|
+
)
|
251
|
+
A1 = A.reshape(-1, 1, 3) # pylint:disable=too-many-function-args
|
252
|
+
A1inv = np.linalg.pinv(A1)
|
253
|
+
A2 = np.array([np.array([x, y], dtype=float) for (x, y) in combinations(A, 2)])
|
254
|
+
A2inv = np.linalg.pinv(A2)
|
255
|
+
A3 = np.array([np.array([x, y, z], dtype=float) for (x, y, z) in combinations(A, 3)])
|
256
|
+
A3inv = np.linalg.pinv(A3)
|
257
|
+
"""
|
258
|
+
These globals house matrices, computed once-and-for-all, which project onto the Euclidean-nearest
|
259
|
+
planes spanned by the planes/points/lines defined by the faces of any XX polytope.
|
260
|
+
|
261
|
+
See `XXPolytope.nearest`.
|
262
|
+
"""
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2021
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""
|
14
|
+
Depository for generic utility snippets.
|
15
|
+
"""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
import warnings
|
19
|
+
|
20
|
+
import numpy as np
|
21
|
+
|
22
|
+
|
23
|
+
EPSILON = 1e-6 # Fraction(1, 1_000_000)
|
24
|
+
|
25
|
+
|
26
|
+
# TODO: THIS IS A STOPGAP!!!
|
27
|
+
def safe_arccos(numerator, denominator):
|
28
|
+
"""
|
29
|
+
Computes arccos(n/d) with different (better?) numerical stability.
|
30
|
+
"""
|
31
|
+
threshold = 0.005
|
32
|
+
|
33
|
+
if abs(numerator) > abs(denominator) and abs(numerator - denominator) < threshold:
|
34
|
+
return 0.0
|
35
|
+
elif abs(numerator) > abs(denominator) and abs(numerator + denominator) < threshold:
|
36
|
+
return np.pi
|
37
|
+
else:
|
38
|
+
with warnings.catch_warnings():
|
39
|
+
warnings.filterwarnings("ignore", category=RuntimeWarning)
|
40
|
+
return np.arccos(numerator / denominator)
|
@@ -0,0 +1,133 @@
|
|
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
|
+
Simple circuit constructors for Weyl reflections.
|
15
|
+
"""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
import numpy as np
|
19
|
+
|
20
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
21
|
+
from qiskit.circuit.library.standard_gates import RXGate, RYGate, RZGate
|
22
|
+
|
23
|
+
|
24
|
+
reflection_options = {
|
25
|
+
"no reflection": ([1, 1, 1], 1, []),
|
26
|
+
"reflect XX, YY": ([-1, -1, 1], 1, [RZGate]),
|
27
|
+
"reflect XX, ZZ": ([-1, 1, -1], 1, [RYGate]),
|
28
|
+
"reflect YY, ZZ": ([1, -1, -1], 1, [RXGate]),
|
29
|
+
}
|
30
|
+
"""
|
31
|
+
A table of available reflection transformations on canonical coordinates.
|
32
|
+
Entries take the form
|
33
|
+
|
34
|
+
readable_name: (reflection scalars, global phase, [gate constructors]),
|
35
|
+
|
36
|
+
where reflection scalars (a, b, c) model the map (x, y, z) |-> (ax, by, cz),
|
37
|
+
global phase is a complex unit, and gate constructors are applied in sequence
|
38
|
+
and by conjugation to the first qubit and are passed pi as a parameter.
|
39
|
+
"""
|
40
|
+
|
41
|
+
shift_options = {
|
42
|
+
"no shift": ([0, 0, 0], 1, []),
|
43
|
+
"Z shift": ([0, 0, 1], 1j, [RZGate]),
|
44
|
+
"Y shift": ([0, 1, 0], -1j, [RYGate]),
|
45
|
+
"Y,Z shift": ([0, 1, 1], 1, [RYGate, RZGate]),
|
46
|
+
"X shift": ([1, 0, 0], -1j, [RXGate]),
|
47
|
+
"X,Z shift": ([1, 0, 1], 1, [RXGate, RZGate]),
|
48
|
+
"X,Y shift": ([1, 1, 0], -1, [RXGate, RYGate]),
|
49
|
+
"X,Y,Z shift": ([1, 1, 1], -1j, [RXGate, RYGate, RZGate]),
|
50
|
+
}
|
51
|
+
"""
|
52
|
+
A table of available shift transformations on canonical coordinates. Entries
|
53
|
+
take the form
|
54
|
+
|
55
|
+
readable name: (shift scalars, global phase, [gate constructors]),
|
56
|
+
|
57
|
+
where shift scalars model the map
|
58
|
+
|
59
|
+
(x, y, z) |-> (x + a pi / 2, y + b pi / 2, z + c pi / 2) ,
|
60
|
+
|
61
|
+
global phase is a complex unit, and gate constructors are applied to the first
|
62
|
+
and second qubits and are passed pi as a parameter.
|
63
|
+
"""
|
64
|
+
|
65
|
+
|
66
|
+
def apply_reflection(reflection_name, coordinate):
|
67
|
+
"""
|
68
|
+
Given a reflection type and a canonical coordinate, applies the reflection
|
69
|
+
and describes a circuit which enacts the reflection + a global phase shift.
|
70
|
+
"""
|
71
|
+
reflection_scalars, reflection_phase_shift, source_reflection_gates = reflection_options[
|
72
|
+
reflection_name
|
73
|
+
]
|
74
|
+
reflected_coord = [x * y for x, y in zip(reflection_scalars, coordinate)]
|
75
|
+
source_reflection = QuantumCircuit(2)
|
76
|
+
for gate in source_reflection_gates:
|
77
|
+
source_reflection.append(gate(np.pi), [0])
|
78
|
+
|
79
|
+
return reflected_coord, source_reflection, reflection_phase_shift
|
80
|
+
|
81
|
+
|
82
|
+
def apply_shift(shift_name, coordinate):
|
83
|
+
"""
|
84
|
+
Given a shift type and a canonical coordinate, applies the shift and
|
85
|
+
describes a circuit which enacts the shift + a global phase shift.
|
86
|
+
"""
|
87
|
+
shift_scalars, shift_phase_shift, source_shift_gates = shift_options[shift_name]
|
88
|
+
shifted_coord = [np.pi / 2 * x + y for x, y in zip(shift_scalars, coordinate)]
|
89
|
+
|
90
|
+
source_shift = QuantumCircuit(2)
|
91
|
+
for gate in source_shift_gates:
|
92
|
+
source_shift.append(gate(np.pi), [0])
|
93
|
+
source_shift.append(gate(np.pi), [1])
|
94
|
+
|
95
|
+
return shifted_coord, source_shift, shift_phase_shift
|
96
|
+
|
97
|
+
|
98
|
+
def canonical_rotation_circuit(first_index, second_index):
|
99
|
+
"""
|
100
|
+
Given a pair of distinct indices 0 ≤ (first_index, second_index) ≤ 2,
|
101
|
+
produces a two-qubit circuit which rotates a canonical gate
|
102
|
+
|
103
|
+
a0 XX + a1 YY + a2 ZZ
|
104
|
+
|
105
|
+
into
|
106
|
+
|
107
|
+
a[first] XX + a[second] YY + a[other] ZZ .
|
108
|
+
"""
|
109
|
+
conj = QuantumCircuit(2)
|
110
|
+
|
111
|
+
if (0, 1) == (first_index, second_index):
|
112
|
+
pass # no need to do anything
|
113
|
+
elif (0, 2) == (first_index, second_index):
|
114
|
+
conj.rx(-np.pi / 2, [0])
|
115
|
+
conj.rx(np.pi / 2, [1])
|
116
|
+
elif (1, 0) == (first_index, second_index):
|
117
|
+
conj.rz(-np.pi / 2, [0])
|
118
|
+
conj.rz(-np.pi / 2, [1])
|
119
|
+
elif (1, 2) == (first_index, second_index):
|
120
|
+
conj.rz(np.pi / 2, [0])
|
121
|
+
conj.rz(np.pi / 2, [1])
|
122
|
+
conj.ry(np.pi / 2, [0])
|
123
|
+
conj.ry(-np.pi / 2, [1])
|
124
|
+
elif (2, 0) == (first_index, second_index):
|
125
|
+
conj.rz(np.pi / 2, [0])
|
126
|
+
conj.rz(np.pi / 2, [1])
|
127
|
+
conj.rx(np.pi / 2, [0])
|
128
|
+
conj.rx(-np.pi / 2, [1])
|
129
|
+
elif (2, 1) == (first_index, second_index):
|
130
|
+
conj.ry(np.pi / 2, [0])
|
131
|
+
conj.ry(-np.pi / 2, [1])
|
132
|
+
|
133
|
+
return conj
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2023.
|
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
|
+
"""Module containing unitary synthesis methods."""
|
@@ -0,0 +1,177 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2022.
|
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
|
+
r"""
|
14
|
+
=====================================================================
|
15
|
+
Approximate Quantum Compiler (:mod:`qiskit.synthesis.unitary.aqc`)
|
16
|
+
=====================================================================
|
17
|
+
|
18
|
+
.. currentmodule:: qiskit.synthesis.unitary.aqc
|
19
|
+
|
20
|
+
Implementation of Approximate Quantum Compiler as described in the paper [1].
|
21
|
+
|
22
|
+
Interface
|
23
|
+
=========
|
24
|
+
|
25
|
+
The main public interface of this module is reached by passing ``unitary_synthesis_method='aqc'`` to
|
26
|
+
:func:`~.compiler.transpile`. This will swap the synthesis method to use
|
27
|
+
:class:`~.transpiler.passes.synthesis.AQCSynthesisPlugin`.
|
28
|
+
The individual classes are:
|
29
|
+
|
30
|
+
.. autosummary::
|
31
|
+
:toctree: ../stubs
|
32
|
+
:template: autosummary/class_no_inherited_members.rst
|
33
|
+
|
34
|
+
AQC
|
35
|
+
ApproximateCircuit
|
36
|
+
ApproximatingObjective
|
37
|
+
CNOTUnitCircuit
|
38
|
+
CNOTUnitObjective
|
39
|
+
DefaultCNOTUnitObjective
|
40
|
+
FastCNOTUnitObjective
|
41
|
+
|
42
|
+
|
43
|
+
Mathematical Detail
|
44
|
+
===================
|
45
|
+
|
46
|
+
We are interested in compiling a quantum circuit, which we formalize as finding the best
|
47
|
+
circuit representation in terms of an ordered gate sequence of a target unitary matrix
|
48
|
+
:math:`U\in U(d)`, with some additional hardware constraints. In particular, we look at
|
49
|
+
representations that could be constrained in terms of hardware connectivity, as well
|
50
|
+
as gate depth, and we choose a gate basis in terms of CNOT and rotation gates.
|
51
|
+
We recall that the combination of CNOT and rotation gates is universal in :math:`SU(d)` and
|
52
|
+
therefore it does not limit compilation.
|
53
|
+
|
54
|
+
To properly define what we mean by best circuit representation, we define the metric
|
55
|
+
as the Frobenius norm between the unitary matrix of the compiled circuit :math:`V` and
|
56
|
+
the target unitary matrix :math:`U`, i.e., :math:`\|V - U\|_{\mathrm{F}}`. This choice
|
57
|
+
is motivated by mathematical programming considerations, and it is related to other
|
58
|
+
formulations that appear in the literature. Let's take a look at the problem in more details.
|
59
|
+
|
60
|
+
Let :math:`n` be the number of qubits and :math:`d=2^n`. Given a CNOT structure :math:`ct`
|
61
|
+
and a vector of rotation angles :math:`\theta`, the parametric circuit forms a matrix
|
62
|
+
:math:`Vct(\theta)\in SU(d)`. If we are given a target circuit forming a matrix
|
63
|
+
:math:`U\in SU(d)`, then we would like to compute
|
64
|
+
|
65
|
+
.. math::
|
66
|
+
|
67
|
+
\mathrm{argmax}_{\theta}\frac{1}{d}|\langle Vct(\theta),U\rangle|
|
68
|
+
|
69
|
+
where the inner product is the Frobenius inner product. Note that
|
70
|
+
:math:`|\langle V,U\rangle|\leq d` for all unitaries :math:`U` and :math:`V`, so the objective
|
71
|
+
has range in :math:`[0,1]`.
|
72
|
+
|
73
|
+
Our strategy is to maximize
|
74
|
+
|
75
|
+
.. math::
|
76
|
+
|
77
|
+
\frac{1}{d}\Re \langle Vct(\theta),U\rangle
|
78
|
+
|
79
|
+
using its gradient. We will now discuss the specifics by going through an example.
|
80
|
+
|
81
|
+
While the range of :math:`Vct` is a subset of :math:`SU(d)` by construction, the target
|
82
|
+
circuit may form a general unitary matrix. However, for any :math:`U\in U(d)`,
|
83
|
+
|
84
|
+
.. math::
|
85
|
+
|
86
|
+
\frac{\exp(2\pi i k/d)}{\det(U)^{1/d}}U\in SU(d)\text{ for all }k\in\{0,\ldots,d-1\}.
|
87
|
+
|
88
|
+
Thus, we should normalize the target circuit by its global phase and then approximately
|
89
|
+
compile the normalized circuit. We can add the global phase back in afterwards.
|
90
|
+
|
91
|
+
In the algorithm let :math:`U'` denote the un-normalized target matrix and :math:`U`
|
92
|
+
the normalized target matrix. Now that we have :math:`U`, we give the gradient function
|
93
|
+
to the Nesterov's method optimizer and compute :math:`\theta`.
|
94
|
+
|
95
|
+
To add the global phase back in, we can form the control circuit as
|
96
|
+
|
97
|
+
.. math::
|
98
|
+
|
99
|
+
\frac{\langle Vct(\theta),U'\rangle}{|\langle Vct(\theta),U'\rangle|}Vct(\theta).
|
100
|
+
|
101
|
+
Note that while we optimized using Nesterov's method in the paper, this was for its convergence
|
102
|
+
guarantees, not its speed in practice. It is much faster to use L-BFGS which is used as a
|
103
|
+
default optimizer in this implementation.
|
104
|
+
|
105
|
+
A basic usage of the AQC algorithm should consist of the following steps::
|
106
|
+
|
107
|
+
# Define a target circuit as a unitary matrix
|
108
|
+
unitary = ...
|
109
|
+
|
110
|
+
# Define a number of qubits for the algorithm, at least 3 qubits
|
111
|
+
num_qubits = round(math.log2(unitary.shape[0]))
|
112
|
+
|
113
|
+
# Choose a layout of the CNOT structure for the approximate circuit, e.g. ``spin`` for
|
114
|
+
# a linear layout.
|
115
|
+
layout = options.get("layout") or "spin"
|
116
|
+
|
117
|
+
# Choose a connectivity type, e.g. ``full`` for full connectivity between qubits.
|
118
|
+
connectivity = options.get("connectivity") or "full"
|
119
|
+
|
120
|
+
# Define a targeted depth of the approximate circuit in the number of CNOT units.
|
121
|
+
depth = int(options.get("depth") or 0)
|
122
|
+
|
123
|
+
# Generate a network made of CNOT units
|
124
|
+
cnots = make_cnot_network(
|
125
|
+
num_qubits=num_qubits,
|
126
|
+
network_layout=layout,
|
127
|
+
connectivity_type=connectivity,
|
128
|
+
depth=depth
|
129
|
+
)
|
130
|
+
|
131
|
+
# Create an optimizer to be used by AQC
|
132
|
+
optimizer = partial(scipy.optimize.minimize, method="L-BFGS-B")
|
133
|
+
|
134
|
+
# Create an instance
|
135
|
+
aqc = AQC(optimizer)
|
136
|
+
|
137
|
+
# Create a template circuit that will approximate our target circuit
|
138
|
+
approximate_circuit = CNOTUnitCircuit(num_qubits=num_qubits, cnots=cnots)
|
139
|
+
|
140
|
+
# Create an objective that defines our optimization problem
|
141
|
+
approximating_objective = DefaultCNOTUnitObjective(num_qubits=num_qubits, cnots=cnots)
|
142
|
+
|
143
|
+
# Run optimization process to compile the unitary
|
144
|
+
aqc.compile_unitary(
|
145
|
+
target_matrix=unitary,
|
146
|
+
approximate_circuit=approximate_circuit,
|
147
|
+
approximating_objective=approximating_objective
|
148
|
+
)
|
149
|
+
|
150
|
+
Now ``approximate_circuit`` is a circuit that approximates the target unitary to a certain
|
151
|
+
degree and can be used instead of the original matrix.
|
152
|
+
|
153
|
+
This uses a helper function, :obj:`make_cnot_network`.
|
154
|
+
|
155
|
+
.. autofunction:: make_cnot_network
|
156
|
+
|
157
|
+
One can take advantage of accelerated version of objective function. It implements the same
|
158
|
+
mathematical algorithm as the default one ``DefaultCNOTUnitObjective`` but runs several times
|
159
|
+
faster. Instantiation of accelerated objective function class is similar to the default case:
|
160
|
+
|
161
|
+
# Create an objective that defines our optimization problem
|
162
|
+
approximating_objective = FastCNOTUnitObjective(num_qubits=num_qubits, cnots=cnots)
|
163
|
+
|
164
|
+
The rest of the code in the above example does not change.
|
165
|
+
|
166
|
+
References:
|
167
|
+
|
168
|
+
[1]: Liam Madden, Andrea Simonetto, Best Approximate Quantum Compiling Problems.
|
169
|
+
`arXiv:2106.05649 <https://arxiv.org/abs/2106.05649>`_
|
170
|
+
"""
|
171
|
+
|
172
|
+
from .approximate import ApproximateCircuit, ApproximatingObjective
|
173
|
+
from .aqc import AQC
|
174
|
+
from .cnot_structures import make_cnot_network
|
175
|
+
from .cnot_unit_circuit import CNOTUnitCircuit
|
176
|
+
from .cnot_unit_objective import CNOTUnitObjective, DefaultCNOTUnitObjective
|
177
|
+
from .fast_gradient.fast_gradient import FastCNOTUnitObjective
|