qiskit 2.0.3__cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -0
- qiskit/__init__.py +141 -0
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +73 -0
- qiskit/circuit/__init__.py +1343 -0
- qiskit/circuit/_add_control.py +312 -0
- qiskit/circuit/_classical_resource_map.py +150 -0
- qiskit/circuit/_standard_gates_commutations.py +3849 -0
- qiskit/circuit/_utils.py +167 -0
- qiskit/circuit/annotated_operation.py +279 -0
- qiskit/circuit/barrier.py +46 -0
- qiskit/circuit/classical/__init__.py +41 -0
- qiskit/circuit/classical/expr/__init__.py +266 -0
- qiskit/circuit/classical/expr/constructors.py +764 -0
- qiskit/circuit/classical/expr/expr.py +498 -0
- qiskit/circuit/classical/expr/visitors.py +375 -0
- qiskit/circuit/classical/types/__init__.py +113 -0
- qiskit/circuit/classical/types/ordering.py +229 -0
- qiskit/circuit/classical/types/types.py +153 -0
- qiskit/circuit/commutation_checker.py +133 -0
- qiskit/circuit/commutation_library.py +20 -0
- qiskit/circuit/controlflow/__init__.py +59 -0
- qiskit/circuit/controlflow/_builder_utils.py +211 -0
- qiskit/circuit/controlflow/box.py +163 -0
- qiskit/circuit/controlflow/break_loop.py +56 -0
- qiskit/circuit/controlflow/builder.py +791 -0
- qiskit/circuit/controlflow/continue_loop.py +56 -0
- qiskit/circuit/controlflow/control_flow.py +94 -0
- qiskit/circuit/controlflow/for_loop.py +218 -0
- qiskit/circuit/controlflow/if_else.py +498 -0
- qiskit/circuit/controlflow/switch_case.py +411 -0
- qiskit/circuit/controlflow/while_loop.py +166 -0
- qiskit/circuit/controlledgate.py +274 -0
- qiskit/circuit/delay.py +157 -0
- qiskit/circuit/duration.py +80 -0
- qiskit/circuit/equivalence.py +94 -0
- qiskit/circuit/equivalence_library.py +18 -0
- qiskit/circuit/exceptions.py +19 -0
- qiskit/circuit/gate.py +261 -0
- qiskit/circuit/instruction.py +564 -0
- qiskit/circuit/instructionset.py +132 -0
- qiskit/circuit/library/__init__.py +984 -0
- qiskit/circuit/library/arithmetic/__init__.py +40 -0
- qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +235 -0
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +131 -0
- qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
- qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -0
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +201 -0
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +502 -0
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +387 -0
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +493 -0
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
- qiskit/circuit/library/arithmetic/quadratic_form.py +364 -0
- qiskit/circuit/library/arithmetic/weighted_adder.py +409 -0
- qiskit/circuit/library/basis_change/__init__.py +15 -0
- qiskit/circuit/library/basis_change/qft.py +316 -0
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +316 -0
- qiskit/circuit/library/boolean_logic/__init__.py +18 -0
- qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
- qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
- qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
- qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -0
- qiskit/circuit/library/data_preparation/__init__.py +57 -0
- qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
- qiskit/circuit/library/data_preparation/initializer.py +107 -0
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
- qiskit/circuit/library/fourier_checking.py +160 -0
- qiskit/circuit/library/generalized_gates/__init__.py +30 -0
- qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
- qiskit/circuit/library/generalized_gates/gms.py +175 -0
- qiskit/circuit/library/generalized_gates/gr.py +219 -0
- qiskit/circuit/library/generalized_gates/isometry.py +370 -0
- qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
- qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
- qiskit/circuit/library/generalized_gates/pauli.py +84 -0
- qiskit/circuit/library/generalized_gates/permutation.py +198 -0
- qiskit/circuit/library/generalized_gates/rv.py +96 -0
- qiskit/circuit/library/generalized_gates/uc.py +303 -0
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
- qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
- qiskit/circuit/library/generalized_gates/ucry.py +32 -0
- qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
- qiskit/circuit/library/generalized_gates/unitary.py +217 -0
- qiskit/circuit/library/graph_state.py +172 -0
- qiskit/circuit/library/grover_operator.py +583 -0
- qiskit/circuit/library/hamiltonian_gate.py +142 -0
- qiskit/circuit/library/hidden_linear_function.py +163 -0
- qiskit/circuit/library/iqp.py +180 -0
- qiskit/circuit/library/n_local/__init__.py +45 -0
- qiskit/circuit/library/n_local/efficient_su2.py +282 -0
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +303 -0
- qiskit/circuit/library/n_local/n_local.py +1477 -0
- qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
- qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
- qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
- qiskit/circuit/library/n_local/two_local.py +289 -0
- qiskit/circuit/library/overlap.py +183 -0
- qiskit/circuit/library/pauli_evolution.py +201 -0
- qiskit/circuit/library/phase_estimation.py +177 -0
- qiskit/circuit/library/phase_oracle.py +239 -0
- qiskit/circuit/library/quantum_volume.py +180 -0
- qiskit/circuit/library/standard_gates/__init__.py +141 -0
- qiskit/circuit/library/standard_gates/dcx.py +77 -0
- qiskit/circuit/library/standard_gates/ecr.py +129 -0
- qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
- qiskit/circuit/library/standard_gates/global_phase.py +84 -0
- qiskit/circuit/library/standard_gates/h.py +253 -0
- qiskit/circuit/library/standard_gates/i.py +76 -0
- qiskit/circuit/library/standard_gates/iswap.py +133 -0
- qiskit/circuit/library/standard_gates/p.py +422 -0
- qiskit/circuit/library/standard_gates/r.py +114 -0
- qiskit/circuit/library/standard_gates/rx.py +293 -0
- qiskit/circuit/library/standard_gates/rxx.py +180 -0
- qiskit/circuit/library/standard_gates/ry.py +286 -0
- qiskit/circuit/library/standard_gates/ryy.py +180 -0
- qiskit/circuit/library/standard_gates/rz.py +307 -0
- qiskit/circuit/library/standard_gates/rzx.py +226 -0
- qiskit/circuit/library/standard_gates/rzz.py +193 -0
- qiskit/circuit/library/standard_gates/s.py +419 -0
- qiskit/circuit/library/standard_gates/swap.py +281 -0
- qiskit/circuit/library/standard_gates/sx.py +310 -0
- qiskit/circuit/library/standard_gates/t.py +178 -0
- qiskit/circuit/library/standard_gates/u.py +395 -0
- qiskit/circuit/library/standard_gates/u1.py +490 -0
- qiskit/circuit/library/standard_gates/u2.py +145 -0
- qiskit/circuit/library/standard_gates/u3.py +428 -0
- qiskit/circuit/library/standard_gates/x.py +1481 -0
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +202 -0
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +236 -0
- qiskit/circuit/library/standard_gates/y.py +257 -0
- qiskit/circuit/library/standard_gates/z.py +338 -0
- qiskit/circuit/library/templates/__init__.py +92 -0
- qiskit/circuit/library/templates/clifford/__init__.py +33 -0
- qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
- qiskit/circuit/library/templates/nct/__init__.py +67 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
- qiskit/circuit/library/templates/rzx/__init__.py +25 -0
- qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
- qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
- qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
- qiskit/circuit/measure.py +53 -0
- qiskit/circuit/operation.py +68 -0
- qiskit/circuit/parameter.py +179 -0
- qiskit/circuit/parameterexpression.py +703 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +140 -0
- qiskit/circuit/quantumcircuit.py +7540 -0
- qiskit/circuit/quantumcircuitdata.py +136 -0
- qiskit/circuit/random/__init__.py +15 -0
- qiskit/circuit/random/utils.py +366 -0
- qiskit/circuit/reset.py +37 -0
- qiskit/circuit/singleton.py +600 -0
- qiskit/circuit/store.py +89 -0
- qiskit/circuit/tools/__init__.py +16 -0
- qiskit/circuit/tools/pi_check.py +193 -0
- qiskit/circuit/twirling.py +145 -0
- qiskit/compiler/__init__.py +27 -0
- qiskit/compiler/transpiler.py +375 -0
- qiskit/converters/__init__.py +74 -0
- qiskit/converters/circuit_to_dag.py +80 -0
- qiskit/converters/circuit_to_dagdependency.py +49 -0
- qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
- qiskit/converters/circuit_to_gate.py +107 -0
- qiskit/converters/circuit_to_instruction.py +142 -0
- qiskit/converters/dag_to_circuit.py +79 -0
- qiskit/converters/dag_to_dagdependency.py +54 -0
- qiskit/converters/dag_to_dagdependency_v2.py +43 -0
- qiskit/converters/dagdependency_to_circuit.py +40 -0
- qiskit/converters/dagdependency_to_dag.py +48 -0
- qiskit/dagcircuit/__init__.py +55 -0
- qiskit/dagcircuit/collect_blocks.py +407 -0
- qiskit/dagcircuit/dagcircuit.py +24 -0
- qiskit/dagcircuit/dagdependency.py +612 -0
- qiskit/dagcircuit/dagdependency_v2.py +566 -0
- qiskit/dagcircuit/dagdepnode.py +160 -0
- qiskit/dagcircuit/dagnode.py +188 -0
- qiskit/dagcircuit/exceptions.py +42 -0
- qiskit/exceptions.py +153 -0
- qiskit/passmanager/__init__.py +258 -0
- qiskit/passmanager/base_tasks.py +230 -0
- qiskit/passmanager/compilation_status.py +74 -0
- qiskit/passmanager/exceptions.py +19 -0
- qiskit/passmanager/flow_controllers.py +116 -0
- qiskit/passmanager/passmanager.py +353 -0
- qiskit/primitives/__init__.py +490 -0
- qiskit/primitives/backend_estimator_v2.py +530 -0
- qiskit/primitives/backend_sampler_v2.py +339 -0
- qiskit/primitives/base/__init__.py +20 -0
- qiskit/primitives/base/base_estimator.py +247 -0
- qiskit/primitives/base/base_primitive_job.py +78 -0
- qiskit/primitives/base/base_primitive_v1.py +45 -0
- qiskit/primitives/base/base_result_v1.py +65 -0
- qiskit/primitives/base/base_sampler.py +196 -0
- qiskit/primitives/base/estimator_result_v1.py +46 -0
- qiskit/primitives/base/sampler_result_v1.py +45 -0
- qiskit/primitives/base/validation_v1.py +250 -0
- qiskit/primitives/containers/__init__.py +26 -0
- qiskit/primitives/containers/bindings_array.py +391 -0
- qiskit/primitives/containers/bit_array.py +764 -0
- qiskit/primitives/containers/data_bin.py +175 -0
- qiskit/primitives/containers/estimator_pub.py +222 -0
- qiskit/primitives/containers/object_array.py +94 -0
- qiskit/primitives/containers/observables_array.py +296 -0
- qiskit/primitives/containers/primitive_result.py +53 -0
- qiskit/primitives/containers/pub_result.py +51 -0
- qiskit/primitives/containers/sampler_pub.py +193 -0
- qiskit/primitives/containers/sampler_pub_result.py +74 -0
- qiskit/primitives/containers/shape.py +129 -0
- qiskit/primitives/primitive_job.py +81 -0
- qiskit/primitives/statevector_estimator.py +175 -0
- qiskit/primitives/statevector_sampler.py +290 -0
- qiskit/primitives/utils.py +72 -0
- qiskit/providers/__init__.py +677 -0
- qiskit/providers/backend.py +364 -0
- qiskit/providers/basic_provider/__init__.py +47 -0
- qiskit/providers/basic_provider/basic_provider.py +121 -0
- qiskit/providers/basic_provider/basic_provider_job.py +65 -0
- qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
- qiskit/providers/basic_provider/basic_simulator.py +693 -0
- qiskit/providers/basic_provider/exceptions.py +30 -0
- qiskit/providers/exceptions.py +33 -0
- qiskit/providers/fake_provider/__init__.py +69 -0
- qiskit/providers/fake_provider/generic_backend_v2.py +374 -0
- qiskit/providers/fake_provider/utils/__init__.py +15 -0
- qiskit/providers/job.py +147 -0
- qiskit/providers/jobstatus.py +30 -0
- qiskit/providers/options.py +273 -0
- qiskit/providers/providerutils.py +110 -0
- qiskit/qasm/libs/dummy/stdgates.inc +75 -0
- qiskit/qasm/libs/qelib1.inc +266 -0
- qiskit/qasm/libs/stdgates.inc +82 -0
- qiskit/qasm2/__init__.py +669 -0
- qiskit/qasm2/exceptions.py +27 -0
- qiskit/qasm2/export.py +364 -0
- qiskit/qasm2/parse.py +438 -0
- qiskit/qasm3/__init__.py +372 -0
- qiskit/qasm3/ast.py +782 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1340 -0
- qiskit/qasm3/printer.py +608 -0
- qiskit/qpy/__init__.py +1965 -0
- qiskit/qpy/binary_io/__init__.py +35 -0
- qiskit/qpy/binary_io/circuits.py +1455 -0
- qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
- qiskit/qpy/binary_io/schedules.py +308 -0
- qiskit/qpy/binary_io/value.py +1165 -0
- qiskit/qpy/common.py +353 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +442 -0
- qiskit/qpy/interface.py +344 -0
- qiskit/qpy/type_keys.py +409 -0
- qiskit/quantum_info/__init__.py +162 -0
- qiskit/quantum_info/analysis/__init__.py +17 -0
- qiskit/quantum_info/analysis/average.py +47 -0
- qiskit/quantum_info/analysis/distance.py +104 -0
- qiskit/quantum_info/analysis/make_observable.py +44 -0
- qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
- qiskit/quantum_info/operators/__init__.py +28 -0
- qiskit/quantum_info/operators/base_operator.py +145 -0
- qiskit/quantum_info/operators/channel/__init__.py +29 -0
- qiskit/quantum_info/operators/channel/chi.py +191 -0
- qiskit/quantum_info/operators/channel/choi.py +218 -0
- qiskit/quantum_info/operators/channel/kraus.py +337 -0
- qiskit/quantum_info/operators/channel/ptm.py +204 -0
- qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
- qiskit/quantum_info/operators/channel/stinespring.py +296 -0
- qiskit/quantum_info/operators/channel/superop.py +373 -0
- qiskit/quantum_info/operators/channel/transformations.py +490 -0
- qiskit/quantum_info/operators/custom_iterator.py +48 -0
- qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
- qiskit/quantum_info/operators/dihedral/dihedral.py +511 -0
- qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
- qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
- qiskit/quantum_info/operators/dihedral/random.py +64 -0
- qiskit/quantum_info/operators/linear_op.py +25 -0
- qiskit/quantum_info/operators/measures.py +418 -0
- qiskit/quantum_info/operators/mixins/__init__.py +52 -0
- qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
- qiskit/quantum_info/operators/mixins/group.py +171 -0
- qiskit/quantum_info/operators/mixins/linear.py +84 -0
- qiskit/quantum_info/operators/mixins/multiply.py +62 -0
- qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
- qiskit/quantum_info/operators/op_shape.py +525 -0
- qiskit/quantum_info/operators/operator.py +869 -0
- qiskit/quantum_info/operators/operator_utils.py +76 -0
- qiskit/quantum_info/operators/predicates.py +183 -0
- qiskit/quantum_info/operators/random.py +154 -0
- qiskit/quantum_info/operators/scalar_op.py +254 -0
- qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
- qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
- qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
- qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -0
- qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
- qiskit/quantum_info/operators/symplectic/random.py +117 -0
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1239 -0
- qiskit/quantum_info/operators/utils/__init__.py +20 -0
- qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
- qiskit/quantum_info/operators/utils/commutator.py +36 -0
- qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
- qiskit/quantum_info/quaternion.py +156 -0
- qiskit/quantum_info/random.py +26 -0
- qiskit/quantum_info/states/__init__.py +28 -0
- qiskit/quantum_info/states/densitymatrix.py +857 -0
- qiskit/quantum_info/states/measures.py +288 -0
- qiskit/quantum_info/states/quantum_state.py +503 -0
- qiskit/quantum_info/states/random.py +157 -0
- qiskit/quantum_info/states/stabilizerstate.py +805 -0
- qiskit/quantum_info/states/statevector.py +977 -0
- qiskit/quantum_info/states/utils.py +247 -0
- qiskit/result/__init__.py +61 -0
- qiskit/result/counts.py +189 -0
- qiskit/result/distributions/__init__.py +17 -0
- qiskit/result/distributions/probability.py +100 -0
- qiskit/result/distributions/quasi.py +154 -0
- qiskit/result/exceptions.py +40 -0
- qiskit/result/models.py +241 -0
- qiskit/result/postprocess.py +239 -0
- qiskit/result/result.py +385 -0
- qiskit/result/sampled_expval.py +74 -0
- qiskit/result/utils.py +294 -0
- qiskit/synthesis/__init__.py +240 -0
- qiskit/synthesis/arithmetic/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
- qiskit/synthesis/arithmetic/comparators/__init__.py +16 -0
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/synthesis/boolean/__init__.py +13 -0
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/clifford/__init__.py +19 -0
- qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
- qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
- qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
- qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
- qiskit/synthesis/cnotdihedral/__init__.py +17 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
- qiskit/synthesis/discrete_basis/__init__.py +16 -0
- qiskit/synthesis/discrete_basis/commutator_decompose.py +265 -0
- qiskit/synthesis/discrete_basis/gate_sequence.py +421 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +165 -0
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +240 -0
- qiskit/synthesis/evolution/__init__.py +21 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +120 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +313 -0
- qiskit/synthesis/evolution/qdrift.py +130 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +224 -0
- qiskit/synthesis/linear/__init__.py +26 -0
- qiskit/synthesis/linear/cnot_synth.py +69 -0
- qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
- qiskit/synthesis/linear/linear_depth_lnn.py +61 -0
- qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
- qiskit/synthesis/linear_phase/__init__.py +17 -0
- qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +61 -0
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
- qiskit/synthesis/multi_controlled/__init__.py +25 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +359 -0
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
- qiskit/synthesis/one_qubit/__init__.py +15 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
- qiskit/synthesis/permutation/__init__.py +18 -0
- qiskit/synthesis/permutation/permutation_full.py +78 -0
- qiskit/synthesis/permutation/permutation_lnn.py +54 -0
- qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
- qiskit/synthesis/permutation/permutation_utils.py +16 -0
- qiskit/synthesis/qft/__init__.py +16 -0
- qiskit/synthesis/qft/qft_decompose_full.py +97 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +79 -0
- qiskit/synthesis/stabilizer/__init__.py +16 -0
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
- qiskit/synthesis/two_qubit/__init__.py +20 -0
- qiskit/synthesis/two_qubit/local_invariance.py +63 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +583 -0
- qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
- qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
- qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
- qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
- qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
- qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
- qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
- qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
- qiskit/synthesis/unitary/__init__.py +13 -0
- qiskit/synthesis/unitary/aqc/__init__.py +177 -0
- qiskit/synthesis/unitary/aqc/approximate.py +116 -0
- qiskit/synthesis/unitary/aqc/aqc.py +175 -0
- qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
- qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
- qiskit/synthesis/unitary/qsd.py +288 -0
- qiskit/transpiler/__init__.py +1345 -0
- qiskit/transpiler/basepasses.py +190 -0
- qiskit/transpiler/coupling.py +500 -0
- qiskit/transpiler/exceptions.py +59 -0
- qiskit/transpiler/instruction_durations.py +281 -0
- qiskit/transpiler/layout.py +740 -0
- qiskit/transpiler/passes/__init__.py +276 -0
- qiskit/transpiler/passes/analysis/__init__.py +23 -0
- qiskit/transpiler/passes/analysis/count_ops.py +30 -0
- qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
- qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
- qiskit/transpiler/passes/analysis/depth.py +33 -0
- qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
- qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
- qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
- qiskit/transpiler/passes/analysis/size.py +36 -0
- qiskit/transpiler/passes/analysis/width.py +27 -0
- qiskit/transpiler/passes/basis/__init__.py +19 -0
- qiskit/transpiler/passes/basis/basis_translator.py +138 -0
- qiskit/transpiler/passes/basis/decompose.py +137 -0
- qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +84 -0
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +110 -0
- qiskit/transpiler/passes/layout/__init__.py +26 -0
- qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
- qiskit/transpiler/passes/layout/apply_layout.py +128 -0
- qiskit/transpiler/passes/layout/csp_layout.py +132 -0
- qiskit/transpiler/passes/layout/dense_layout.py +177 -0
- qiskit/transpiler/passes/layout/disjoint_utils.py +219 -0
- qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +116 -0
- qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
- qiskit/transpiler/passes/layout/sabre_layout.py +506 -0
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
- qiskit/transpiler/passes/layout/set_layout.py +69 -0
- qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
- qiskit/transpiler/passes/layout/vf2_layout.py +256 -0
- qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
- qiskit/transpiler/passes/layout/vf2_utils.py +235 -0
- qiskit/transpiler/passes/optimization/__init__.py +42 -0
- qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
- qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
- qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +117 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +109 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +85 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +242 -0
- qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
- qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
- qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +176 -0
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
- qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +267 -0
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +250 -0
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
- qiskit/transpiler/passes/optimization/optimize_annotated.py +449 -0
- qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
- qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
- qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
- qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +70 -0
- qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -0
- qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
- qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
- qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +639 -0
- qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
- qiskit/transpiler/passes/routing/__init__.py +21 -0
- qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
- qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
- qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
- qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
- qiskit/transpiler/passes/routing/basic_swap.py +166 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +397 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
- qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
- qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
- qiskit/transpiler/passes/routing/sabre_swap.py +463 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +408 -0
- qiskit/transpiler/passes/routing/utils.py +35 -0
- qiskit/transpiler/passes/scheduling/__init__.py +21 -0
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
- qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
- qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
- qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
- qiskit/transpiler/passes/synthesis/__init__.py +20 -0
- qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
- qiskit/transpiler/passes/synthesis/hls_plugins.py +1963 -0
- qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
- qiskit/transpiler/passes/synthesis/plugin.py +738 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +313 -0
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
- qiskit/transpiler/passes/utils/__init__.py +32 -0
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
- qiskit/transpiler/passes/utils/check_gate_direction.py +60 -0
- qiskit/transpiler/passes/utils/check_map.py +78 -0
- qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
- qiskit/transpiler/passes/utils/control_flow.py +61 -0
- qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
- qiskit/transpiler/passes/utils/error.py +69 -0
- qiskit/transpiler/passes/utils/filter_op_nodes.py +66 -0
- qiskit/transpiler/passes/utils/fixed_point.py +48 -0
- qiskit/transpiler/passes/utils/gate_direction.py +93 -0
- qiskit/transpiler/passes/utils/gates_basis.py +51 -0
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
- qiskit/transpiler/passes/utils/minimum_point.py +118 -0
- qiskit/transpiler/passes/utils/remove_barriers.py +50 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
- qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
- qiskit/transpiler/passmanager.py +503 -0
- qiskit/transpiler/passmanager_config.py +151 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +993 -0
- qiskit/transpiler/preset_passmanagers/common.py +672 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +437 -0
- qiskit/transpiler/preset_passmanagers/level0.py +104 -0
- qiskit/transpiler/preset_passmanagers/level1.py +108 -0
- qiskit/transpiler/preset_passmanagers/level2.py +109 -0
- qiskit/transpiler/preset_passmanagers/level3.py +110 -0
- qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
- qiskit/transpiler/target.py +905 -0
- qiskit/transpiler/timing_constraints.py +59 -0
- qiskit/user_config.py +266 -0
- qiskit/utils/__init__.py +90 -0
- qiskit/utils/classtools.py +146 -0
- qiskit/utils/deprecation.py +382 -0
- qiskit/utils/lazy_tester.py +363 -0
- qiskit/utils/optionals.py +354 -0
- qiskit/utils/parallel.py +318 -0
- qiskit/utils/units.py +146 -0
- qiskit/version.py +84 -0
- qiskit/visualization/__init__.py +290 -0
- qiskit/visualization/array.py +207 -0
- qiskit/visualization/bloch.py +778 -0
- qiskit/visualization/circuit/__init__.py +15 -0
- qiskit/visualization/circuit/_utils.py +675 -0
- qiskit/visualization/circuit/circuit_visualization.py +735 -0
- qiskit/visualization/circuit/latex.py +661 -0
- qiskit/visualization/circuit/matplotlib.py +2019 -0
- qiskit/visualization/circuit/qcstyle.py +278 -0
- qiskit/visualization/circuit/styles/__init__.py +13 -0
- qiskit/visualization/circuit/styles/bw.json +202 -0
- qiskit/visualization/circuit/styles/clifford.json +202 -0
- qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
- qiskit/visualization/circuit/styles/iqp.json +214 -0
- qiskit/visualization/circuit/styles/textbook.json +202 -0
- qiskit/visualization/circuit/text.py +1849 -0
- qiskit/visualization/circuit_visualization.py +19 -0
- qiskit/visualization/counts_visualization.py +487 -0
- qiskit/visualization/dag_visualization.py +318 -0
- qiskit/visualization/exceptions.py +21 -0
- qiskit/visualization/gate_map.py +1424 -0
- qiskit/visualization/library.py +40 -0
- qiskit/visualization/pass_manager_visualization.py +312 -0
- qiskit/visualization/state_visualization.py +1546 -0
- qiskit/visualization/timeline/__init__.py +21 -0
- qiskit/visualization/timeline/core.py +495 -0
- qiskit/visualization/timeline/drawings.py +260 -0
- qiskit/visualization/timeline/generators.py +506 -0
- qiskit/visualization/timeline/interface.py +444 -0
- qiskit/visualization/timeline/layouts.py +115 -0
- qiskit/visualization/timeline/plotters/__init__.py +16 -0
- qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
- qiskit/visualization/timeline/plotters/matplotlib.py +195 -0
- qiskit/visualization/timeline/stylesheet.py +301 -0
- qiskit/visualization/timeline/types.py +148 -0
- qiskit/visualization/transition_visualization.py +369 -0
- qiskit/visualization/utils.py +49 -0
- qiskit-2.0.3.dist-info/METADATA +220 -0
- qiskit-2.0.3.dist-info/RECORD +690 -0
- qiskit-2.0.3.dist-info/WHEEL +6 -0
- qiskit-2.0.3.dist-info/entry_points.txt +82 -0
- qiskit-2.0.3.dist-info/licenses/LICENSE.txt +203 -0
- qiskit-2.0.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,240 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2020.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Synthesize a single qubit gate to a discrete basis set."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
import numpy as np
|
18
|
+
|
19
|
+
from .gate_sequence import GateSequence
|
20
|
+
from .commutator_decompose import commutator_decompose
|
21
|
+
from .generate_basis_approximations import generate_basic_approximations, _1q_gates, _1q_inverses
|
22
|
+
|
23
|
+
|
24
|
+
class SolovayKitaevDecomposition:
|
25
|
+
"""The Solovay Kitaev discrete decomposition algorithm.
|
26
|
+
|
27
|
+
This class is called recursively by the transpiler pass, which is why it is separated.
|
28
|
+
See :class:`qiskit.transpiler.passes.SolovayKitaev` for more information.
|
29
|
+
"""
|
30
|
+
|
31
|
+
def __init__(
|
32
|
+
self, basic_approximations: str | dict[str, np.ndarray] | list[GateSequence] | None = None
|
33
|
+
) -> None:
|
34
|
+
"""
|
35
|
+
Args:
|
36
|
+
basic_approximations: A specification of the basic SO(3) approximations in terms
|
37
|
+
of discrete gates. At each iteration this algorithm, the remaining error is
|
38
|
+
approximated with the closest sequence of gates in this set.
|
39
|
+
If a ``str``, this specifies a ``.npy`` filename from which to load the
|
40
|
+
approximation. If a ``dict``, then this contains
|
41
|
+
``{gates: effective_SO3_matrix}`` pairs,
|
42
|
+
e.g. ``{"h t": np.array([[0, 0.7071, -0.7071], [0, -0.7071, -0.7071], [-1, 0, 0]]}``.
|
43
|
+
If a list, this contains the same information as the dict, but already converted to
|
44
|
+
:class:`.GateSequence` objects, which contain the SO(3) matrix and gates.
|
45
|
+
"""
|
46
|
+
if basic_approximations is None:
|
47
|
+
# generate a default basic approximation
|
48
|
+
basic_approximations = generate_basic_approximations(
|
49
|
+
basis_gates=["h", "t", "tdg"], depth=10
|
50
|
+
)
|
51
|
+
|
52
|
+
self.basic_approximations = self.load_basic_approximations(basic_approximations)
|
53
|
+
|
54
|
+
@staticmethod
|
55
|
+
def load_basic_approximations(data: list | str | dict) -> list[GateSequence]:
|
56
|
+
"""Load basic approximations.
|
57
|
+
|
58
|
+
Args:
|
59
|
+
data: If a string, specifies the path to the file from where to load the data.
|
60
|
+
If a dictionary, directly specifies the decompositions as ``{gates: matrix}``
|
61
|
+
or ``{gates: (matrix, global_phase)}``. There, ``gates`` are the names of the gates
|
62
|
+
producing the SO(3) matrix ``matrix``, e.g.
|
63
|
+
``{"h t": np.array([[0, 0.7071, -0.7071], [0, -0.7071, -0.7071], [-1, 0, 0]]}``
|
64
|
+
and the ``global_phase`` can be given to account for a global phase difference
|
65
|
+
between the U(2) matrix of the quantum gates and the stored SO(3) matrix.
|
66
|
+
If not given, the ``global_phase`` will be assumed to be 0.
|
67
|
+
|
68
|
+
Returns:
|
69
|
+
A list of basic approximations as type ``GateSequence``.
|
70
|
+
|
71
|
+
Raises:
|
72
|
+
ValueError: If the number of gate combinations and associated matrices does not match.
|
73
|
+
"""
|
74
|
+
# is already a list of GateSequences
|
75
|
+
if isinstance(data, list):
|
76
|
+
return data
|
77
|
+
|
78
|
+
# if a file, load the dictionary
|
79
|
+
if isinstance(data, str):
|
80
|
+
data = np.load(data, allow_pickle=True).item()
|
81
|
+
|
82
|
+
sequences = []
|
83
|
+
for gatestring, matrix_and_phase in data.items():
|
84
|
+
if isinstance(matrix_and_phase, tuple):
|
85
|
+
matrix, global_phase = matrix_and_phase
|
86
|
+
else:
|
87
|
+
matrix, global_phase = matrix_and_phase, 0
|
88
|
+
|
89
|
+
sequence = GateSequence()
|
90
|
+
sequence.gates = [_1q_gates[element] for element in gatestring.split()]
|
91
|
+
sequence.labels = [gate.name for gate in sequence.gates]
|
92
|
+
sequence.product = np.asarray(matrix)
|
93
|
+
sequence.global_phase = global_phase
|
94
|
+
sequences.append(sequence)
|
95
|
+
|
96
|
+
return sequences
|
97
|
+
|
98
|
+
def run(
|
99
|
+
self,
|
100
|
+
gate_matrix: np.ndarray,
|
101
|
+
recursion_degree: int,
|
102
|
+
return_dag: bool = False,
|
103
|
+
check_input: bool = True,
|
104
|
+
) -> "QuantumCircuit" | "DAGCircuit":
|
105
|
+
r"""Run the algorithm.
|
106
|
+
|
107
|
+
Args:
|
108
|
+
gate_matrix: The 2x2 matrix representing the gate. This matrix has to be SU(2)
|
109
|
+
up to global phase.
|
110
|
+
recursion_degree: The recursion degree, called :math:`n` in the paper.
|
111
|
+
return_dag: If ``True`` return a :class:`.DAGCircuit`, else a :class:`.QuantumCircuit`.
|
112
|
+
check_input: If ``True`` check that the input matrix is valid for the decomposition.
|
113
|
+
|
114
|
+
Returns:
|
115
|
+
A one-qubit circuit approximating the ``gate_matrix`` in the specified discrete basis.
|
116
|
+
"""
|
117
|
+
# make input matrix SU(2) and get the according global phase
|
118
|
+
z = 1 / np.sqrt(np.linalg.det(gate_matrix))
|
119
|
+
|
120
|
+
gate_matrix_su2 = z * gate_matrix
|
121
|
+
gate_matrix_as_sequence = GateSequence.from_matrix(gate_matrix_su2)
|
122
|
+
global_phase = np.arctan2(np.imag(z), np.real(z))
|
123
|
+
|
124
|
+
# get the decomposition as GateSequence type
|
125
|
+
decomposition = self._recurse(
|
126
|
+
gate_matrix_as_sequence, recursion_degree, check_input=check_input
|
127
|
+
)
|
128
|
+
|
129
|
+
# simplify
|
130
|
+
_remove_identities(decomposition)
|
131
|
+
_remove_inverse_follows_gate(decomposition)
|
132
|
+
|
133
|
+
# adjust to the correct SU(2) phase
|
134
|
+
adjust_phase = (
|
135
|
+
np.pi if _should_adjust_phase(decomposition._to_u2(), gate_matrix_su2) else 0.0
|
136
|
+
)
|
137
|
+
|
138
|
+
# convert to a circuit and attach the right phases
|
139
|
+
if return_dag:
|
140
|
+
out = decomposition.to_dag()
|
141
|
+
else:
|
142
|
+
out = decomposition.to_circuit()
|
143
|
+
|
144
|
+
out.global_phase += adjust_phase
|
145
|
+
out.global_phase -= global_phase
|
146
|
+
|
147
|
+
return out
|
148
|
+
|
149
|
+
def _recurse(self, sequence: GateSequence, n: int, check_input: bool = True) -> GateSequence:
|
150
|
+
"""Performs ``n`` iterations of the Solovay-Kitaev algorithm on ``sequence``.
|
151
|
+
|
152
|
+
Args:
|
153
|
+
sequence: ``GateSequence`` to which the Solovay-Kitaev algorithm is applied.
|
154
|
+
n: The number of iterations that the algorithm needs to run.
|
155
|
+
check_input: If ``True`` check that the input matrix represented by ``GateSequence``
|
156
|
+
is valid for the decomposition.
|
157
|
+
|
158
|
+
Returns:
|
159
|
+
GateSequence that approximates ``sequence``.
|
160
|
+
|
161
|
+
Raises:
|
162
|
+
ValueError: If the matrix in ``GateSequence`` does not represent an SO(3)-matrix.
|
163
|
+
"""
|
164
|
+
if sequence.product.shape != (3, 3):
|
165
|
+
raise ValueError("Shape of U must be (3, 3) but is", sequence.shape)
|
166
|
+
|
167
|
+
if n == 0:
|
168
|
+
res = self.find_basic_approximation(sequence)
|
169
|
+
|
170
|
+
else:
|
171
|
+
u_n1 = self._recurse(sequence, n - 1, check_input=check_input)
|
172
|
+
|
173
|
+
v_n, w_n = commutator_decompose(
|
174
|
+
sequence.dot(u_n1.adjoint()).product, check_input=check_input
|
175
|
+
)
|
176
|
+
|
177
|
+
v_n1 = self._recurse(v_n, n - 1, check_input=check_input)
|
178
|
+
w_n1 = self._recurse(w_n, n - 1, check_input=check_input)
|
179
|
+
res = v_n1.dot(w_n1).dot(v_n1.adjoint()).dot(w_n1.adjoint()).dot(u_n1)
|
180
|
+
|
181
|
+
return res
|
182
|
+
|
183
|
+
def find_basic_approximation(self, sequence: GateSequence) -> GateSequence:
|
184
|
+
"""Find ``GateSequence`` in ``self._basic_approximations`` that approximates ``sequence``.
|
185
|
+
|
186
|
+
Args:
|
187
|
+
sequence: ``GateSequence`` to find the approximation to.
|
188
|
+
|
189
|
+
Returns:
|
190
|
+
``GateSequence`` in ``self._basic_approximations`` that approximates ``sequence``.
|
191
|
+
"""
|
192
|
+
# TODO explore using a k-d tree here
|
193
|
+
|
194
|
+
def key(x):
|
195
|
+
return np.linalg.norm(np.subtract(x.product, sequence.product))
|
196
|
+
|
197
|
+
best = min(self.basic_approximations, key=key)
|
198
|
+
return best
|
199
|
+
|
200
|
+
|
201
|
+
def _remove_inverse_follows_gate(sequence):
|
202
|
+
index = 0
|
203
|
+
while index < len(sequence.gates) - 1:
|
204
|
+
curr_gate = sequence.gates[index]
|
205
|
+
next_gate = sequence.gates[index + 1]
|
206
|
+
if curr_gate.name in _1q_inverses:
|
207
|
+
remove = _1q_inverses[curr_gate.name] == next_gate.name
|
208
|
+
else:
|
209
|
+
remove = curr_gate.inverse() == next_gate
|
210
|
+
|
211
|
+
if remove:
|
212
|
+
# remove gates at index and index + 1
|
213
|
+
sequence.remove_cancelling_pair([index, index + 1])
|
214
|
+
# take a step back to see if we have uncovered a new pair, e.g.
|
215
|
+
# [h, s, sdg, h] at index = 1 removes s, sdg but if we continue at index 1
|
216
|
+
# we miss the uncovered [h, h] pair at indices 0 and 1
|
217
|
+
if index > 0:
|
218
|
+
index -= 1
|
219
|
+
else:
|
220
|
+
# next index
|
221
|
+
index += 1
|
222
|
+
|
223
|
+
|
224
|
+
def _remove_identities(sequence):
|
225
|
+
index = 0
|
226
|
+
while index < len(sequence.gates):
|
227
|
+
if sequence.gates[index].name == "id":
|
228
|
+
sequence.gates.pop(index)
|
229
|
+
else:
|
230
|
+
index += 1
|
231
|
+
|
232
|
+
|
233
|
+
def _should_adjust_phase(computed: np.ndarray, target: np.ndarray) -> bool:
|
234
|
+
"""
|
235
|
+
The implemented SolovayKitaevDecomposition has a global phase uncertainty of +-1,
|
236
|
+
due to approximating not the original SU(2) matrix but its projection onto SO(3).
|
237
|
+
This function returns ``True`` if the global phase of the computed approximation
|
238
|
+
should be adjusted (by adding pi) to better much the target.
|
239
|
+
"""
|
240
|
+
return np.linalg.norm(-computed - target) < np.linalg.norm(computed - target)
|
@@ -0,0 +1,21 @@
|
|
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
|
+
"""Synthesis for operator evolution gates."""
|
14
|
+
|
15
|
+
from .evolution_synthesis import EvolutionSynthesis
|
16
|
+
from .matrix_synthesis import MatrixExponential
|
17
|
+
from .product_formula import ProductFormula
|
18
|
+
from .lie_trotter import LieTrotter
|
19
|
+
from .suzuki_trotter import SuzukiTrotter
|
20
|
+
from .qdrift import QDrift
|
21
|
+
from .pauli_network import synth_pauli_network_rustiq
|
@@ -0,0 +1,48 @@
|
|
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
|
+
"""Evolution synthesis."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from abc import ABC, abstractmethod
|
18
|
+
from typing import Any
|
19
|
+
|
20
|
+
|
21
|
+
class EvolutionSynthesis(ABC):
|
22
|
+
"""Interface for evolution synthesis algorithms."""
|
23
|
+
|
24
|
+
@abstractmethod
|
25
|
+
def synthesize(self, evolution):
|
26
|
+
"""Synthesize an ``qiskit.circuit.library.PauliEvolutionGate``.
|
27
|
+
|
28
|
+
Args:
|
29
|
+
evolution (PauliEvolutionGate): The evolution gate to synthesize.
|
30
|
+
|
31
|
+
Returns:
|
32
|
+
QuantumCircuit: A circuit implementing the evolution.
|
33
|
+
"""
|
34
|
+
raise NotImplementedError
|
35
|
+
|
36
|
+
@property
|
37
|
+
def settings(self) -> dict[str, Any]:
|
38
|
+
"""Return the settings in a dictionary, which can be used to reconstruct the object.
|
39
|
+
|
40
|
+
Returns:
|
41
|
+
A dictionary containing the settings of this product formula.
|
42
|
+
|
43
|
+
Raises:
|
44
|
+
NotImplementedError: The interface does not implement this method.
|
45
|
+
"""
|
46
|
+
raise NotImplementedError(
|
47
|
+
"The settings property is not implemented for the base interface."
|
48
|
+
)
|
@@ -0,0 +1,120 @@
|
|
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
|
+
"""The Lie-Trotter product formula."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from collections.abc import Callable
|
18
|
+
from typing import Any
|
19
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
20
|
+
from qiskit.quantum_info.operators import SparsePauliOp, Pauli
|
21
|
+
|
22
|
+
from .suzuki_trotter import SuzukiTrotter
|
23
|
+
|
24
|
+
|
25
|
+
class LieTrotter(SuzukiTrotter):
|
26
|
+
r"""The Lie-Trotter product formula.
|
27
|
+
|
28
|
+
The Lie-Trotter formula approximates the exponential of two non-commuting operators
|
29
|
+
with products of their exponentials up to a second order error:
|
30
|
+
|
31
|
+
.. math::
|
32
|
+
|
33
|
+
e^{A + B} \approx e^{A}e^{B}.
|
34
|
+
|
35
|
+
In this implementation, the operators are provided as sum terms of a Pauli operator.
|
36
|
+
For example, we approximate
|
37
|
+
|
38
|
+
.. math::
|
39
|
+
|
40
|
+
e^{-it(XI + ZZ)} = e^{-it XI}e^{-it ZZ} + \mathcal{O}(t^2).
|
41
|
+
|
42
|
+
References:
|
43
|
+
|
44
|
+
[1]: D. Berry, G. Ahokas, R. Cleve and B. Sanders,
|
45
|
+
"Efficient quantum algorithms for simulating sparse Hamiltonians" (2006).
|
46
|
+
`arXiv:quant-ph/0508139 <https://arxiv.org/abs/quant-ph/0508139>`_
|
47
|
+
[2]: N. Hatano and M. Suzuki,
|
48
|
+
"Finding Exponential Product Formulas of Higher Orders" (2005).
|
49
|
+
`arXiv:math-ph/0506007 <https://arxiv.org/pdf/math-ph/0506007.pdf>`_
|
50
|
+
"""
|
51
|
+
|
52
|
+
def __init__(
|
53
|
+
self,
|
54
|
+
reps: int = 1,
|
55
|
+
insert_barriers: bool = False,
|
56
|
+
cx_structure: str = "chain",
|
57
|
+
atomic_evolution: (
|
58
|
+
Callable[[QuantumCircuit, Pauli | SparsePauliOp, float], None] | None
|
59
|
+
) = None,
|
60
|
+
wrap: bool = False,
|
61
|
+
preserve_order: bool = True,
|
62
|
+
*,
|
63
|
+
atomic_evolution_sparse_observable: bool = False,
|
64
|
+
) -> None:
|
65
|
+
r"""
|
66
|
+
Args:
|
67
|
+
reps: The number of time steps.
|
68
|
+
insert_barriers: Whether to insert barriers between the atomic evolutions.
|
69
|
+
cx_structure: How to arrange the CX gates for the Pauli evolutions, can be
|
70
|
+
``"chain"``, where next neighbor connections are used, or ``"fountain"``,
|
71
|
+
where all qubits are connected to one. This only takes effect when
|
72
|
+
``atomic_evolution is None``.
|
73
|
+
atomic_evolution: A function to apply the evolution of a single :class:`.Pauli`, or
|
74
|
+
:class:`.SparsePauliOp` of only commuting terms, to a circuit. The function takes in
|
75
|
+
three arguments: the circuit to append the evolution to, the Pauli operator to
|
76
|
+
evolve, and the evolution time. By default, a single Pauli evolution is decomposed
|
77
|
+
into a chain of ``CX`` gates and a single ``RZ`` gate.
|
78
|
+
wrap: Whether to wrap the atomic evolutions into custom gate objects. This only takes
|
79
|
+
effect when ``atomic_evolution is None``.
|
80
|
+
preserve_order: If ``False``, allows reordering the terms of the operator to
|
81
|
+
potentially yield a shallower evolution circuit. Not relevant
|
82
|
+
when synthesizing operator with a single term.
|
83
|
+
atomic_evolution_sparse_observable: If a custom ``atomic_evolution`` is passed,
|
84
|
+
which does not yet support :class:`.SparseObservable`\ s as input, set this
|
85
|
+
argument to ``False`` to automatically apply a conversion to :class:`.SparsePauliOp`.
|
86
|
+
This argument is supported until Qiskit 2.2, at which point all atomic evolutions
|
87
|
+
are required to support :class:`.SparseObservable`\ s as input.
|
88
|
+
"""
|
89
|
+
super().__init__(
|
90
|
+
1,
|
91
|
+
reps,
|
92
|
+
insert_barriers,
|
93
|
+
cx_structure,
|
94
|
+
atomic_evolution,
|
95
|
+
wrap,
|
96
|
+
preserve_order=preserve_order,
|
97
|
+
atomic_evolution_sparse_observable=atomic_evolution_sparse_observable,
|
98
|
+
)
|
99
|
+
|
100
|
+
@property
|
101
|
+
def settings(self) -> dict[str, Any]:
|
102
|
+
"""Return the settings in a dictionary, which can be used to reconstruct the object.
|
103
|
+
|
104
|
+
Returns:
|
105
|
+
A dictionary containing the settings of this product formula.
|
106
|
+
|
107
|
+
Raises:
|
108
|
+
NotImplementedError: If a custom atomic evolution is set, which cannot be serialized.
|
109
|
+
"""
|
110
|
+
if self._atomic_evolution is not None:
|
111
|
+
raise NotImplementedError(
|
112
|
+
"Cannot serialize a product formula with a custom atomic evolution."
|
113
|
+
)
|
114
|
+
|
115
|
+
return {
|
116
|
+
"reps": self.reps,
|
117
|
+
"insert_barriers": self.insert_barriers,
|
118
|
+
"cx_structure": self._cx_structure,
|
119
|
+
"wrap": self._wrap,
|
120
|
+
}
|
@@ -0,0 +1,47 @@
|
|
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
|
+
"""Exact synthesis of operator evolution via (exponentially expensive) matrix exponentiation."""
|
14
|
+
|
15
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
16
|
+
|
17
|
+
from .evolution_synthesis import EvolutionSynthesis
|
18
|
+
|
19
|
+
|
20
|
+
class MatrixExponential(EvolutionSynthesis):
|
21
|
+
r"""Exact operator evolution via matrix exponentiation and unitary synthesis.
|
22
|
+
|
23
|
+
This class synthesis the exponential of operators by calculating their exponentially-sized
|
24
|
+
matrix representation and using exact matrix exponentiation followed by unitary synthesis
|
25
|
+
to obtain a circuit. This process is not scalable and serves as comparison or benchmark
|
26
|
+
for small systems.
|
27
|
+
"""
|
28
|
+
|
29
|
+
def synthesize(self, evolution):
|
30
|
+
# pylint: disable=cyclic-import
|
31
|
+
from qiskit.circuit.library.hamiltonian_gate import HamiltonianGate
|
32
|
+
|
33
|
+
# get operators and time to evolve
|
34
|
+
operators = evolution.operator
|
35
|
+
time = evolution.time
|
36
|
+
|
37
|
+
if not isinstance(operators, list):
|
38
|
+
matrix = operators.to_matrix()
|
39
|
+
else:
|
40
|
+
matrix = sum(op.to_matrix() for op in operators)
|
41
|
+
|
42
|
+
# construct the evolution circuit
|
43
|
+
evolution_circuit = QuantumCircuit(operators[0].num_qubits)
|
44
|
+
gate = HamiltonianGate(matrix, time)
|
45
|
+
evolution_circuit.append(gate, evolution_circuit.qubits)
|
46
|
+
|
47
|
+
return evolution_circuit
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 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
|
+
"""Circuit synthesis for pauli evolution gates."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from qiskit.circuit import QuantumCircuit
|
18
|
+
|
19
|
+
from qiskit._accelerate.synthesis.evolution import (
|
20
|
+
pauli_network_synthesis as pauli_network_synthesis_inner,
|
21
|
+
)
|
22
|
+
|
23
|
+
|
24
|
+
def synth_pauli_network_rustiq(
|
25
|
+
num_qubits: int,
|
26
|
+
pauli_network: list,
|
27
|
+
optimize_count: bool = True,
|
28
|
+
preserve_order: bool = True,
|
29
|
+
upto_clifford: bool = False,
|
30
|
+
upto_phase: bool = False,
|
31
|
+
resynth_clifford_method: int = 0,
|
32
|
+
) -> QuantumCircuit:
|
33
|
+
"""
|
34
|
+
Calls Rustiq's pauli network synthesis algorithm.
|
35
|
+
|
36
|
+
The algorithm is described in [1]. The source code (in Rust) is available at
|
37
|
+
https://github.com/smartiel/rustiq-core.
|
38
|
+
|
39
|
+
Args:
|
40
|
+
num_qubits: the number of qubits over which the pauli network is defined.
|
41
|
+
pauli_network: a list of pauli rotations, represented in sparse format: a list of
|
42
|
+
triples such as `[("XX", [0, 3], theta), ("ZZ", [0, 1], 0.1)]`.
|
43
|
+
optimize_count: if `True` the synthesis algorithm will try to optimize the 2-qubit
|
44
|
+
gate count; and if `False` then the 2-qubit depth.
|
45
|
+
preserve_order: whether the order of paulis should be preserved, up to
|
46
|
+
commutativity. If the order is not preserved, the returned circuit will
|
47
|
+
generally not be equivalent to the given pauli network.
|
48
|
+
upto_clifford: if `True`, the final Clifford operator is not synthesized
|
49
|
+
and the returned circuit will generally not be equivalent to the given
|
50
|
+
pauli network. In addition, the argument `upto_phase` would be ignored.
|
51
|
+
upto_phase: if `True`, the global phase of the returned circuit may differ
|
52
|
+
from the global phase of the given pauli network. The argument is ignored
|
53
|
+
when `upto_clifford` is `True`.
|
54
|
+
resynth_clifford_method: describes the strategy to synthesize the final Clifford
|
55
|
+
operator. If `0` a naive approach is used, which doubles the number of gates
|
56
|
+
but preserves the global phase of the circuit. If `1`, the Clifford is
|
57
|
+
resynthesized using Qiskit's greedy Clifford synthesis algorithm. If `2`, it
|
58
|
+
is resynthesized by Rustiq itself. If `upto_phase` is `False`, the naive
|
59
|
+
approach is used, as neither synthesis method preserves the global phase.
|
60
|
+
|
61
|
+
Returns:
|
62
|
+
A circuit implementation of the pauli network.
|
63
|
+
|
64
|
+
References:
|
65
|
+
1. Timothée Goubault de Brugière and Simon Martiel,
|
66
|
+
*Faster and shorter synthesis of Hamiltonian simulation circuits*,
|
67
|
+
`arXiv:2404.03280 [quant-ph] <https://arxiv.org/abs/2404.03280>`_
|
68
|
+
|
69
|
+
"""
|
70
|
+
out = pauli_network_synthesis_inner(
|
71
|
+
num_qubits=num_qubits,
|
72
|
+
pauli_network=pauli_network,
|
73
|
+
optimize_count=optimize_count,
|
74
|
+
preserve_order=preserve_order,
|
75
|
+
upto_clifford=upto_clifford,
|
76
|
+
upto_phase=upto_phase,
|
77
|
+
resynth_clifford_method=resynth_clifford_method,
|
78
|
+
)
|
79
|
+
circuit = QuantumCircuit._from_circuit_data(out, add_regs=True)
|
80
|
+
return circuit
|