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,280 @@
|
|
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 typing
|
18
|
+
import warnings
|
19
|
+
import numpy as np
|
20
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
21
|
+
from qiskit.circuit.gate import Gate
|
22
|
+
from qiskit.circuit.library import get_standard_gate_name_mapping, IGate
|
23
|
+
from qiskit.utils.deprecation import deprecate_func
|
24
|
+
from qiskit._accelerate.synthesis.discrete_basis import (
|
25
|
+
SolovayKitaevSynthesis as RustSolovayKitaevSynthesis,
|
26
|
+
GateSequence,
|
27
|
+
)
|
28
|
+
|
29
|
+
if typing.TYPE_CHECKING:
|
30
|
+
from qiskit.dagcircuit import DAGCircuit
|
31
|
+
|
32
|
+
|
33
|
+
class SolovayKitaevDecomposition:
|
34
|
+
"""The Solovay Kitaev discrete decomposition algorithm.
|
35
|
+
|
36
|
+
This class is called recursively by the transpiler pass, which is why it is separated.
|
37
|
+
See :class:`~qiskit.transpiler.passes.SolovayKitaev` for more information.
|
38
|
+
"""
|
39
|
+
|
40
|
+
def __init__(
|
41
|
+
self,
|
42
|
+
basic_approximations: str | dict[str, np.ndarray] | list[GateSequence] | None = None,
|
43
|
+
*,
|
44
|
+
basis_gates: list[str | Gate] | None = None,
|
45
|
+
depth: int = 12,
|
46
|
+
check_input: bool = False,
|
47
|
+
) -> None:
|
48
|
+
"""
|
49
|
+
Args:
|
50
|
+
basic_approximations: A specification of the basic SO(3) approximations in terms
|
51
|
+
of discrete gates. At each iteration this algorithm, the remaining error is
|
52
|
+
approximated with the closest sequence of gates in this set.
|
53
|
+
If a ``str``, this specifies a filename from which to load the
|
54
|
+
approximation. If a ``dict``, then this contains
|
55
|
+
``{gates: effective_SO3_matrix}`` pairs,
|
56
|
+
e.g. ``{"h t": np.array([[0, 0.7071, -0.7071], [0, -0.7071, -0.7071], [-1, 0, 0]]}``.
|
57
|
+
If a list, this contains the same information as the dict, but already converted to
|
58
|
+
:class:`.GateSequence` objects, which contain the SO(3) matrix and gates.
|
59
|
+
|
60
|
+
Either this parameter, or ``basis_gates`` and ``depth`` can be specified.
|
61
|
+
basis_gates: A list of discrete (i.e., non-parameterized) standard gates.
|
62
|
+
Defaults to ``["h", "t", "tdg"]``.
|
63
|
+
depth: The number of basis gate combinations to consider in the basis set. This
|
64
|
+
determines how fast (and if) the algorithm converges and should be chosen
|
65
|
+
sufficiently high.
|
66
|
+
check_input: If ``True``, perform intermediate steps checking whether the matrices
|
67
|
+
are of expected form.
|
68
|
+
"""
|
69
|
+
if basic_approximations is None:
|
70
|
+
if basis_gates is not None:
|
71
|
+
basis_gates = normalize_gates(basis_gates)
|
72
|
+
self._sk = RustSolovayKitaevSynthesis(basis_gates, depth, None, check_input)
|
73
|
+
|
74
|
+
elif basis_gates is not None:
|
75
|
+
raise ValueError(
|
76
|
+
"Either basic_approximations or basis_gates + depth can be specified, not both."
|
77
|
+
)
|
78
|
+
|
79
|
+
else:
|
80
|
+
# Fast Rust path to load the file
|
81
|
+
if isinstance(basic_approximations, str) and basic_approximations[~3:] != ".npy":
|
82
|
+
self._sk = RustSolovayKitaevSynthesis.from_basic_approximations(
|
83
|
+
basic_approximations, True
|
84
|
+
)
|
85
|
+
else:
|
86
|
+
sequences = self.load_basic_approximations(basic_approximations)
|
87
|
+
self._sk = RustSolovayKitaevSynthesis.from_sequences(sequences, True)
|
88
|
+
|
89
|
+
self._depth = depth
|
90
|
+
self._check_input = check_input
|
91
|
+
self._basis_gates = basis_gates
|
92
|
+
|
93
|
+
@property
|
94
|
+
def depth(self) -> int:
|
95
|
+
"""The maximum gate depth of the basic approximations."""
|
96
|
+
return self._depth
|
97
|
+
|
98
|
+
@property
|
99
|
+
def check_input(self) -> bool:
|
100
|
+
"""Whether to perform runtime checks on the internal data."""
|
101
|
+
return self._check_input
|
102
|
+
|
103
|
+
@property
|
104
|
+
def basis_gates(self) -> list[str] | None:
|
105
|
+
"""The basis gate set of the basic approximations.
|
106
|
+
|
107
|
+
If ``None``, defaults to ``["h", "t", "tdg"]``.
|
108
|
+
"""
|
109
|
+
return self._basis_gates
|
110
|
+
|
111
|
+
@staticmethod
|
112
|
+
def load_basic_approximations(data: list | str | dict) -> list[GateSequence]:
|
113
|
+
"""Load basic approximations.
|
114
|
+
|
115
|
+
Args:
|
116
|
+
data: If a string, specifies the path to the file from where to load the data.
|
117
|
+
If a dictionary, directly specifies the decompositions as ``{gates: matrix}``
|
118
|
+
or ``{gates: (matrix, global_phase)}``. There, ``gates`` are the names of the gates
|
119
|
+
producing the SO(3) matrix ``matrix``, e.g.
|
120
|
+
``{"h t": np.array([[0, 0.7071, -0.7071], [0, -0.7071, -0.7071], [-1, 0, 0]]}``
|
121
|
+
and the ``global_phase`` can be given to account for a global phase difference
|
122
|
+
between the U(2) matrix of the quantum gates and the stored SO(3) matrix.
|
123
|
+
If not given, the ``global_phase`` will be assumed to be 0.
|
124
|
+
|
125
|
+
Returns:
|
126
|
+
A list of basic approximations as type ``GateSequence``.
|
127
|
+
|
128
|
+
Raises:
|
129
|
+
ValueError: If the number of gate combinations and associated matrices does not match.
|
130
|
+
"""
|
131
|
+
# new data format stored by the Rust internal class
|
132
|
+
if isinstance(data, str) and data[-4:] != ".npy":
|
133
|
+
sk = SolovayKitaevDecomposition(data)
|
134
|
+
return sk._sk.get_gate_sequences()
|
135
|
+
|
136
|
+
warnings.warn(
|
137
|
+
"It is suggested to pass basic_approximations in the binary format produced "
|
138
|
+
"by SolovayKitaevDecomposition.save_basic_approximations, which is more "
|
139
|
+
"performant than other formats. Other formats are pending deprecation "
|
140
|
+
"and will be deprecated in a future release.",
|
141
|
+
category=PendingDeprecationWarning,
|
142
|
+
)
|
143
|
+
|
144
|
+
# is already a list of GateSequences
|
145
|
+
if isinstance(data, list):
|
146
|
+
return data
|
147
|
+
|
148
|
+
# file is ``.npy``, load the dictionary it contains
|
149
|
+
if isinstance(data, str):
|
150
|
+
data = np.load(data, allow_pickle=True).item()
|
151
|
+
|
152
|
+
# parse the dictionary
|
153
|
+
sequences = []
|
154
|
+
for gatestring, matrix_and_phase in data.items():
|
155
|
+
if isinstance(matrix_and_phase, tuple):
|
156
|
+
matrix, global_phase = matrix_and_phase
|
157
|
+
else:
|
158
|
+
matrix, global_phase = matrix_and_phase, 0
|
159
|
+
|
160
|
+
# gates = [_1q_gates[element] for element in gatestring.split()]
|
161
|
+
gates = normalize_gates(gatestring.split())
|
162
|
+
sequence = GateSequence.from_gates_and_matrix(gates, matrix, global_phase)
|
163
|
+
sequences.append(sequence)
|
164
|
+
|
165
|
+
return sequences
|
166
|
+
|
167
|
+
def save_basic_approximations(self, filename: str):
|
168
|
+
"""Save the basic approximations into a file.
|
169
|
+
|
170
|
+
This can then be loaded again via the class initializer (preferred) or
|
171
|
+
via :meth:`load_basic_approximations`::
|
172
|
+
|
173
|
+
filename = "approximations.bin"
|
174
|
+
sk.save_basic_approximations(filename)
|
175
|
+
|
176
|
+
new_sk = SolovayKitaevDecomposition(filename)
|
177
|
+
|
178
|
+
Args:
|
179
|
+
filename: The filename to store the approximations in.
|
180
|
+
|
181
|
+
Raises:
|
182
|
+
ValueError: If the filename has a `.npy` extension. The format is not `.npy`,
|
183
|
+
and storing as such can cause errors when loading the file again.
|
184
|
+
"""
|
185
|
+
# Safety guard: previously, we serialized via npy, but this format is incompatible
|
186
|
+
# with the current serialization, using Rust's serde + bincode. While we can still load
|
187
|
+
# .npy files in legacy format, the new format should not be stored as .npy.
|
188
|
+
if filename[~3:] == ".npy":
|
189
|
+
raise ValueError(
|
190
|
+
"The basic approximations are not stored in npy format. "
|
191
|
+
"Choose a different file extension (e.g. .bin)."
|
192
|
+
)
|
193
|
+
self._sk.save_basic_approximations(filename)
|
194
|
+
|
195
|
+
def run(
|
196
|
+
self,
|
197
|
+
gate_matrix: np.ndarray | Gate,
|
198
|
+
recursion_degree: int,
|
199
|
+
return_dag: bool = False,
|
200
|
+
check_input: bool = True,
|
201
|
+
) -> QuantumCircuit | DAGCircuit:
|
202
|
+
r"""Run the algorithm.
|
203
|
+
|
204
|
+
Args:
|
205
|
+
gate_matrix: The single-qubit gate to approximate. Can either be a :class:`.Gate`, where
|
206
|
+
:meth:`.Gate.to_matrix` returns the matrix, or a :math:`2\times 2` unitary matrix
|
207
|
+
representing the gate.
|
208
|
+
recursion_degree: The recursion degree, called :math:`n` in the paper.
|
209
|
+
return_dag: If ``True`` return a :class:`.DAGCircuit`, else a :class:`.QuantumCircuit`.
|
210
|
+
check_input: If ``True`` check that the input matrix is valid for the decomposition.
|
211
|
+
Overrides the class attribute with the same name, but only for this function call.
|
212
|
+
|
213
|
+
Returns:
|
214
|
+
A one-qubit circuit approximating the ``gate_matrix`` in the specified discrete basis.
|
215
|
+
"""
|
216
|
+
# handle overriding the check_input setting
|
217
|
+
self_check_input = self.check_input
|
218
|
+
if check_input != self_check_input:
|
219
|
+
self._sk.do_checks = check_input
|
220
|
+
|
221
|
+
if isinstance(gate_matrix, Gate):
|
222
|
+
data = self._sk.synthesize(gate_matrix, recursion_degree)
|
223
|
+
else:
|
224
|
+
data = self._sk.synthesize_matrix(gate_matrix, recursion_degree)
|
225
|
+
|
226
|
+
if check_input != self_check_input:
|
227
|
+
self._sk.do_checks = self_check_input
|
228
|
+
|
229
|
+
circuit = QuantumCircuit._from_circuit_data(data, add_regs=True)
|
230
|
+
|
231
|
+
if return_dag:
|
232
|
+
from qiskit.converters import circuit_to_dag # pylint: disable=cyclic-import
|
233
|
+
|
234
|
+
return circuit_to_dag(circuit)
|
235
|
+
|
236
|
+
return circuit
|
237
|
+
|
238
|
+
def query_basic_approximation(self, gate: np.ndarray | Gate) -> QuantumCircuit:
|
239
|
+
"""Query a basic approximation of a matrix."""
|
240
|
+
if isinstance(gate, Gate):
|
241
|
+
data = self._sk.query_basic_approximation(gate)
|
242
|
+
else:
|
243
|
+
data = self._sk.query_basic_approximation_matrix(gate)
|
244
|
+
|
245
|
+
circuit = QuantumCircuit._from_circuit_data(data, add_regs=True)
|
246
|
+
return circuit
|
247
|
+
|
248
|
+
@deprecate_func(
|
249
|
+
since="2.1",
|
250
|
+
additional_msg="Use query_basic_approximation instead, which takes a Gate or matrix "
|
251
|
+
"as input and returns a QuantumCircuit object.",
|
252
|
+
pending=True,
|
253
|
+
)
|
254
|
+
def find_basic_approximation(self, sequence: GateSequence) -> GateSequence:
|
255
|
+
"""Find ``GateSequence`` in ``self._basic_approximations`` that approximates ``sequence``.
|
256
|
+
|
257
|
+
Args:
|
258
|
+
sequence: ``GateSequence`` to find the approximation to.
|
259
|
+
|
260
|
+
Returns:
|
261
|
+
``GateSequence`` in that approximates ``sequence``.
|
262
|
+
"""
|
263
|
+
return self._sk.find_basic_approximation(sequence)
|
264
|
+
|
265
|
+
|
266
|
+
def normalize_gates(gates: list[Gate | str]) -> list[Gate]:
|
267
|
+
"""Normalize a list[Gate | str] into list[Gate]."""
|
268
|
+
name_to_gate = get_standard_gate_name_mapping()
|
269
|
+
# special case: we used to support "i" as IGate, but the official name is "id", so
|
270
|
+
# we add it manually here
|
271
|
+
name_to_gate["i"] = IGate()
|
272
|
+
|
273
|
+
def normalize(gate: Gate | str) -> Gate:
|
274
|
+
if isinstance(gate, Gate):
|
275
|
+
return gate
|
276
|
+
if gate in name_to_gate:
|
277
|
+
return name_to_gate[gate]
|
278
|
+
raise ValueError(f"Unsupported gate: {gate}")
|
279
|
+
|
280
|
+
return list(map(normalize, gates))
|
@@ -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,123 @@
|
|
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
|
21
|
+
import qiskit.quantum_info
|
22
|
+
|
23
|
+
from .suzuki_trotter import SuzukiTrotter
|
24
|
+
|
25
|
+
|
26
|
+
class LieTrotter(SuzukiTrotter):
|
27
|
+
r"""The Lie-Trotter product formula.
|
28
|
+
|
29
|
+
The Lie-Trotter formula approximates the exponential of two non-commuting operators
|
30
|
+
with products of their exponentials up to a second order error:
|
31
|
+
|
32
|
+
.. math::
|
33
|
+
|
34
|
+
e^{A + B} \approx e^{A}e^{B}.
|
35
|
+
|
36
|
+
In this implementation, the operators are provided as sum terms of a Pauli operator.
|
37
|
+
For example, we approximate
|
38
|
+
|
39
|
+
.. math::
|
40
|
+
|
41
|
+
e^{-it(XI + ZZ)} = e^{-it XI}e^{-it ZZ} + \mathcal{O}(t^2).
|
42
|
+
|
43
|
+
References:
|
44
|
+
|
45
|
+
[1]: D. Berry, G. Ahokas, R. Cleve and B. Sanders,
|
46
|
+
"Efficient quantum algorithms for simulating sparse Hamiltonians" (2006).
|
47
|
+
`arXiv:quant-ph/0508139 <https://arxiv.org/abs/quant-ph/0508139>`_
|
48
|
+
[2]: N. Hatano and M. Suzuki,
|
49
|
+
"Finding Exponential Product Formulas of Higher Orders" (2005).
|
50
|
+
`arXiv:math-ph/0506007 <https://arxiv.org/pdf/math-ph/0506007.pdf>`_
|
51
|
+
"""
|
52
|
+
|
53
|
+
def __init__(
|
54
|
+
self,
|
55
|
+
reps: int = 1,
|
56
|
+
insert_barriers: bool = False,
|
57
|
+
cx_structure: str = "chain",
|
58
|
+
atomic_evolution: (
|
59
|
+
Callable[[QuantumCircuit, qiskit.quantum_info.Pauli | SparsePauliOp, float], None]
|
60
|
+
| None
|
61
|
+
) = None,
|
62
|
+
wrap: bool = False,
|
63
|
+
preserve_order: bool = True,
|
64
|
+
*,
|
65
|
+
atomic_evolution_sparse_observable: bool = False,
|
66
|
+
) -> None:
|
67
|
+
r"""
|
68
|
+
Args:
|
69
|
+
reps: The number of time steps.
|
70
|
+
insert_barriers: Whether to insert barriers between the atomic evolutions.
|
71
|
+
cx_structure: How to arrange the CX gates for the Pauli evolutions, can be
|
72
|
+
``"chain"``, where next neighbor connections are used, or ``"fountain"``,
|
73
|
+
where all qubits are connected to one. This only takes effect when
|
74
|
+
``atomic_evolution is None``.
|
75
|
+
atomic_evolution: A function to apply the evolution of a single
|
76
|
+
:class:`~.quantum_info.Pauli`, or :class:`.SparsePauliOp` of only commuting terms,
|
77
|
+
to a circuit. The function takes in three arguments: the circuit to append the
|
78
|
+
evolution to, the Pauli operator to evolve, and the evolution time. By default, a
|
79
|
+
single Pauli evolution is decomposed into a chain of ``CX`` gates and a single
|
80
|
+
``RZ`` gate.
|
81
|
+
wrap: Whether to wrap the atomic evolutions into custom gate objects. This only takes
|
82
|
+
effect when ``atomic_evolution is None``.
|
83
|
+
preserve_order: If ``False``, allows reordering the terms of the operator to
|
84
|
+
potentially yield a shallower evolution circuit. Not relevant
|
85
|
+
when synthesizing operator with a single term.
|
86
|
+
atomic_evolution_sparse_observable: If a custom ``atomic_evolution`` is passed,
|
87
|
+
which does not yet support :class:`.SparseObservable`\ s as input, set this
|
88
|
+
argument to ``False`` to automatically apply a conversion to :class:`.SparsePauliOp`.
|
89
|
+
This argument is supported until Qiskit 2.2, at which point all atomic evolutions
|
90
|
+
are required to support :class:`.SparseObservable`\ s as input.
|
91
|
+
"""
|
92
|
+
super().__init__(
|
93
|
+
1,
|
94
|
+
reps,
|
95
|
+
insert_barriers,
|
96
|
+
cx_structure,
|
97
|
+
atomic_evolution,
|
98
|
+
wrap,
|
99
|
+
preserve_order=preserve_order,
|
100
|
+
atomic_evolution_sparse_observable=atomic_evolution_sparse_observable,
|
101
|
+
)
|
102
|
+
|
103
|
+
@property
|
104
|
+
def settings(self) -> dict[str, Any]:
|
105
|
+
"""Return the settings in a dictionary, which can be used to reconstruct the object.
|
106
|
+
|
107
|
+
Returns:
|
108
|
+
A dictionary containing the settings of this product formula.
|
109
|
+
|
110
|
+
Raises:
|
111
|
+
NotImplementedError: If a custom atomic evolution is set, which cannot be serialized.
|
112
|
+
"""
|
113
|
+
if self._atomic_evolution is not None:
|
114
|
+
raise NotImplementedError(
|
115
|
+
"Cannot serialize a product formula with a custom atomic evolution."
|
116
|
+
)
|
117
|
+
|
118
|
+
return {
|
119
|
+
"reps": self.reps,
|
120
|
+
"insert_barriers": self.insert_barriers,
|
121
|
+
"cx_structure": self._cx_structure,
|
122
|
+
"wrap": self._wrap,
|
123
|
+
}
|
@@ -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
|