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,520 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2021, 2024.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""The evolved operator ansatz."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
from collections.abc import Sequence
|
17
|
+
|
18
|
+
import typing
|
19
|
+
import warnings
|
20
|
+
import itertools
|
21
|
+
import numpy as np
|
22
|
+
|
23
|
+
from qiskit.circuit.library.pauli_evolution import PauliEvolutionGate
|
24
|
+
from qiskit.circuit.parameter import Parameter
|
25
|
+
from qiskit.circuit.parametervector import ParameterVector
|
26
|
+
from qiskit.circuit import QuantumRegister
|
27
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
28
|
+
from qiskit.quantum_info import Operator, Pauli, SparsePauliOp
|
29
|
+
from qiskit.quantum_info.operators.base_operator import BaseOperator
|
30
|
+
from qiskit.synthesis.evolution.product_formula import real_or_fail
|
31
|
+
|
32
|
+
from qiskit._accelerate.circuit_library import pauli_evolution
|
33
|
+
|
34
|
+
from .n_local import NLocal
|
35
|
+
|
36
|
+
if typing.TYPE_CHECKING:
|
37
|
+
from qiskit.synthesis.evolution import EvolutionSynthesis
|
38
|
+
|
39
|
+
|
40
|
+
def evolved_operator_ansatz(
|
41
|
+
operators: BaseOperator | Sequence[BaseOperator],
|
42
|
+
reps: int = 1,
|
43
|
+
evolution: EvolutionSynthesis | None = None,
|
44
|
+
insert_barriers: bool = False,
|
45
|
+
name: str = "EvolvedOps",
|
46
|
+
parameter_prefix: str | Sequence[str] = "t",
|
47
|
+
remove_identities: bool = True,
|
48
|
+
flatten: bool | None = None,
|
49
|
+
) -> QuantumCircuit:
|
50
|
+
r"""Construct an ansatz out of operator evolutions.
|
51
|
+
|
52
|
+
For a set of operators :math:`[O_1, ..., O_J]` and :math:`R` repetitions (``reps``), this circuit
|
53
|
+
is defined as
|
54
|
+
|
55
|
+
.. math::
|
56
|
+
|
57
|
+
\prod_{r=1}^{R} \left( \prod_{j=J}^1 e^{-i\theta_{j, r} O_j} \right)
|
58
|
+
|
59
|
+
where the exponentials :math:`exp(-i\theta O_j)` are expanded using the product formula
|
60
|
+
specified by ``evolution``.
|
61
|
+
|
62
|
+
Examples:
|
63
|
+
|
64
|
+
.. plot::
|
65
|
+
:alt: Circuit diagram output by the previous code.
|
66
|
+
:include-source:
|
67
|
+
|
68
|
+
from qiskit.circuit.library import evolved_operator_ansatz
|
69
|
+
from qiskit.quantum_info import Pauli
|
70
|
+
|
71
|
+
ops = [Pauli("ZZI"), Pauli("IZZ"), Pauli("IXI")]
|
72
|
+
ansatz = evolved_operator_ansatz(ops, reps=3, insert_barriers=True)
|
73
|
+
ansatz.draw("mpl")
|
74
|
+
|
75
|
+
Args:
|
76
|
+
operators: The operators to evolve. Can be a single operator or a sequence thereof.
|
77
|
+
reps: The number of times to repeat the evolved operators.
|
78
|
+
evolution: A specification of which evolution synthesis to use for the
|
79
|
+
:class:`.PauliEvolutionGate`. Defaults to first order Trotterization. Note, that
|
80
|
+
operators of type :class:`.Operator` are evolved using the :class:`.HamiltonianGate`,
|
81
|
+
as there are no Hamiltonian terms to expand in Trotterization.
|
82
|
+
insert_barriers: Whether to insert barriers in between each evolution.
|
83
|
+
name: The name of the circuit.
|
84
|
+
parameter_prefix: Set the names of the circuit parameters. If a string, the same prefix
|
85
|
+
will be used for each parameters. Can also be a list to specify a prefix per
|
86
|
+
operator.
|
87
|
+
remove_identities: If ``True``, ignore identity operators (note that we do not check
|
88
|
+
:class:`.Operator` inputs). This will also remove parameters associated with identities.
|
89
|
+
flatten: If ``True``, a flat circuit is returned instead of nesting it inside multiple
|
90
|
+
layers of gate objects. Setting this to ``False`` is significantly less performant,
|
91
|
+
especially for parameter binding, but can be desirable for a cleaner visualization.
|
92
|
+
"""
|
93
|
+
if reps < 0:
|
94
|
+
raise ValueError("reps must be a non-negative integer.")
|
95
|
+
|
96
|
+
if isinstance(operators, BaseOperator):
|
97
|
+
operators = [operators]
|
98
|
+
elif len(operators) == 0:
|
99
|
+
return QuantumCircuit()
|
100
|
+
|
101
|
+
num_operators = len(operators)
|
102
|
+
if not isinstance(parameter_prefix, str):
|
103
|
+
if num_operators != len(parameter_prefix):
|
104
|
+
raise ValueError(
|
105
|
+
f"Mismatching number of operators ({len(operators)}) and parameter_prefix "
|
106
|
+
f"({len(parameter_prefix)})."
|
107
|
+
)
|
108
|
+
|
109
|
+
num_qubits = operators[0].num_qubits
|
110
|
+
if remove_identities:
|
111
|
+
operators, parameter_prefix = _remove_identities(operators, parameter_prefix)
|
112
|
+
|
113
|
+
if any(op.num_qubits != num_qubits for op in operators):
|
114
|
+
raise ValueError("Inconsistent numbers of qubits in the operators.")
|
115
|
+
|
116
|
+
# get the total number of parameters
|
117
|
+
if isinstance(parameter_prefix, str):
|
118
|
+
parameters = ParameterVector(parameter_prefix, reps * num_operators)
|
119
|
+
param_iter = iter(parameters)
|
120
|
+
else:
|
121
|
+
# this creates the parameter vectors per operator, e.g.
|
122
|
+
# [[a0, a1, a2, ...], [b0, b1, b2, ...], [c0, c1, c2, ...]]
|
123
|
+
# and turns them into an iterator
|
124
|
+
# a0 -> b0 -> c0 -> a1 -> b1 -> c1 -> a2 -> ...
|
125
|
+
per_operator = [ParameterVector(prefix, reps).params for prefix in parameter_prefix]
|
126
|
+
param_iter = itertools.chain.from_iterable(zip(*per_operator))
|
127
|
+
|
128
|
+
# fast, Rust-path
|
129
|
+
if (
|
130
|
+
flatten is not False # captures None and True
|
131
|
+
and evolution is None
|
132
|
+
and all(isinstance(op, SparsePauliOp) for op in operators)
|
133
|
+
):
|
134
|
+
sparse_labels = [op.to_sparse_list() for op in operators]
|
135
|
+
expanded_paulis = []
|
136
|
+
for _ in range(reps):
|
137
|
+
for term in sparse_labels:
|
138
|
+
param = next(param_iter)
|
139
|
+
expanded_paulis += [
|
140
|
+
(pauli, indices, 2 * real_or_fail(coeff) * param)
|
141
|
+
for pauli, indices, coeff in term
|
142
|
+
]
|
143
|
+
|
144
|
+
data = pauli_evolution(num_qubits, expanded_paulis, insert_barriers, False)
|
145
|
+
circuit = QuantumCircuit._from_circuit_data(data, add_regs=True)
|
146
|
+
circuit.name = name
|
147
|
+
|
148
|
+
return circuit
|
149
|
+
|
150
|
+
# slower, Python-path
|
151
|
+
if evolution is None:
|
152
|
+
from qiskit.synthesis.evolution import LieTrotter
|
153
|
+
|
154
|
+
evolution = LieTrotter(insert_barriers=insert_barriers)
|
155
|
+
|
156
|
+
circuit = QuantumCircuit(num_qubits, name=name)
|
157
|
+
|
158
|
+
# pylint: disable=cyclic-import
|
159
|
+
from qiskit.circuit.library.hamiltonian_gate import HamiltonianGate
|
160
|
+
|
161
|
+
for rep in range(reps):
|
162
|
+
for i, op in enumerate(operators):
|
163
|
+
if isinstance(op, Operator):
|
164
|
+
gate = HamiltonianGate(op, next(param_iter))
|
165
|
+
if flatten:
|
166
|
+
warnings.warn(
|
167
|
+
"Cannot flatten the evolution of an Operator, flatten is set to "
|
168
|
+
"False for this operator."
|
169
|
+
)
|
170
|
+
flatten_operator = False
|
171
|
+
|
172
|
+
elif isinstance(op, BaseOperator):
|
173
|
+
gate = PauliEvolutionGate(op, next(param_iter), synthesis=evolution)
|
174
|
+
flatten_operator = flatten is True or flatten is None
|
175
|
+
else:
|
176
|
+
raise ValueError(f"Unsupported operator type: {type(op)}")
|
177
|
+
|
178
|
+
if flatten_operator:
|
179
|
+
circuit.compose(gate.definition, inplace=True)
|
180
|
+
else:
|
181
|
+
circuit.append(gate, circuit.qubits)
|
182
|
+
|
183
|
+
if insert_barriers and (rep < reps - 1 or i < num_operators - 1):
|
184
|
+
circuit.barrier()
|
185
|
+
|
186
|
+
return circuit
|
187
|
+
|
188
|
+
|
189
|
+
def hamiltonian_variational_ansatz(
|
190
|
+
hamiltonian: SparsePauliOp | Sequence[SparsePauliOp],
|
191
|
+
reps: int = 1,
|
192
|
+
insert_barriers: bool = False,
|
193
|
+
name: str = "HVA",
|
194
|
+
parameter_prefix: str = "t",
|
195
|
+
) -> QuantumCircuit:
|
196
|
+
r"""Construct a Hamiltonian variational ansatz.
|
197
|
+
|
198
|
+
For a Hamiltonian :math:`H = \sum_{k=1}^K H_k` where the terms :math:`H_k` consist of only
|
199
|
+
commuting Paulis, but the terms do not commute among each other :math:`[H_k, H_{k'}] \neq 0`, the
|
200
|
+
Hamiltonian variational ansatz (HVA) is
|
201
|
+
|
202
|
+
.. math::
|
203
|
+
|
204
|
+
\prod_{r=1}^{R} \left( \prod_{k=K}^1 e^{-i\theta_{k, r} H_k} \right)
|
205
|
+
|
206
|
+
where the exponentials :math:`exp(-i\theta H_k)` are implemented exactly [1, 2]. Note that this
|
207
|
+
differs from :func:`.evolved_operator_ansatz`, where no assumptions on the structure of the
|
208
|
+
operators are done.
|
209
|
+
|
210
|
+
The Hamiltonian can be passed as :class:`.SparsePauliOp`, in which case we split the Hamiltonian
|
211
|
+
into commuting terms :math:`\{H_k\}_k`. Note, that this may not be optimal and if the
|
212
|
+
minimal set of commuting terms is known it can be passed as sequence into this function.
|
213
|
+
|
214
|
+
Examples:
|
215
|
+
|
216
|
+
A single operator will be split into commuting terms automatically:
|
217
|
+
|
218
|
+
.. plot::
|
219
|
+
:alt: Circuit diagram output by the previous code.
|
220
|
+
:include-source:
|
221
|
+
|
222
|
+
from qiskit.quantum_info import SparsePauliOp
|
223
|
+
from qiskit.circuit.library import hamiltonian_variational_ansatz
|
224
|
+
|
225
|
+
# this Hamiltonian will be split into the two terms [ZZI, IZZ] and [IXI]
|
226
|
+
hamiltonian = SparsePauliOp(["ZZI", "IZZ", "IXI"])
|
227
|
+
ansatz = hamiltonian_variational_ansatz(hamiltonian, reps=2)
|
228
|
+
ansatz.draw("mpl")
|
229
|
+
|
230
|
+
Alternatively, we can directly provide the terms:
|
231
|
+
|
232
|
+
.. plot::
|
233
|
+
:alt: Circuit diagram output by the previous code.
|
234
|
+
:include-source:
|
235
|
+
|
236
|
+
from qiskit.quantum_info import SparsePauliOp
|
237
|
+
from qiskit.circuit.library import hamiltonian_variational_ansatz
|
238
|
+
|
239
|
+
zz = SparsePauliOp(["ZZI", "IZZ"])
|
240
|
+
x = SparsePauliOp(["IXI"])
|
241
|
+
ansatz = hamiltonian_variational_ansatz([zz, x], reps=2)
|
242
|
+
ansatz.draw("mpl")
|
243
|
+
|
244
|
+
|
245
|
+
Args:
|
246
|
+
hamiltonian: The Hamiltonian to evolve. If given as single operator, it will be split into
|
247
|
+
commuting terms. If a sequence of :class:`.SparsePauliOp`, then it is assumed that
|
248
|
+
each element consists of commuting terms, but the elements do not commute among each
|
249
|
+
other.
|
250
|
+
reps: The number of times to repeat the evolved operators.
|
251
|
+
insert_barriers: Whether to insert barriers in between each evolution.
|
252
|
+
name: The name of the circuit.
|
253
|
+
parameter_prefix: Set the names of the circuit parameters. If a string, the same prefix
|
254
|
+
will be used for each parameters. Can also be a list to specify a prefix per
|
255
|
+
operator.
|
256
|
+
|
257
|
+
References:
|
258
|
+
|
259
|
+
[1] D. Wecker et al. Progress towards practical quantum variational algorithms (2015)
|
260
|
+
`Phys Rev A 92, 042303 <https://journals.aps.org/pra/abstract/10.1103/PhysRevA.92.042303>`__
|
261
|
+
[2] R. Wiersema et al. Exploring entanglement and optimization within the Hamiltonian
|
262
|
+
Variational Ansatz (2020) `arXiv:2008.02941 <https://arxiv.org/abs/2008.02941>`__
|
263
|
+
|
264
|
+
"""
|
265
|
+
# If a single operator is given, check if it is a sum of operators (a SparsePauliOp),
|
266
|
+
# and split it into commuting terms. Otherwise, treat it as single operator.
|
267
|
+
if isinstance(hamiltonian, SparsePauliOp):
|
268
|
+
hamiltonian = hamiltonian.group_commuting()
|
269
|
+
|
270
|
+
return evolved_operator_ansatz(
|
271
|
+
hamiltonian,
|
272
|
+
reps=reps,
|
273
|
+
evolution=None,
|
274
|
+
insert_barriers=insert_barriers,
|
275
|
+
name=name,
|
276
|
+
parameter_prefix=parameter_prefix,
|
277
|
+
flatten=True,
|
278
|
+
)
|
279
|
+
|
280
|
+
|
281
|
+
class EvolvedOperatorAnsatz(NLocal):
|
282
|
+
"""The evolved operator ansatz."""
|
283
|
+
|
284
|
+
def __init__(
|
285
|
+
self,
|
286
|
+
operators=None,
|
287
|
+
reps: int = 1,
|
288
|
+
evolution=None,
|
289
|
+
insert_barriers: bool = False,
|
290
|
+
name: str = "EvolvedOps",
|
291
|
+
parameter_prefix: str | Sequence[str] = "t",
|
292
|
+
initial_state: QuantumCircuit | None = None,
|
293
|
+
flatten: bool | None = None,
|
294
|
+
):
|
295
|
+
"""
|
296
|
+
Args:
|
297
|
+
operators (BaseOperator | QuantumCircuit | list | None): The operators
|
298
|
+
to evolve. If a circuit is passed, we assume it implements an already evolved
|
299
|
+
operator and thus the circuit is not evolved again. Can be a single operator
|
300
|
+
(circuit) or a list of operators (and circuits).
|
301
|
+
reps: The number of times to repeat the evolved operators.
|
302
|
+
evolution (EvolutionBase | EvolutionSynthesis | None):
|
303
|
+
A specification of which evolution synthesis to use for the
|
304
|
+
:class:`.PauliEvolutionGate`.
|
305
|
+
Defaults to first order Trotterization.
|
306
|
+
insert_barriers: Whether to insert barriers in between each evolution.
|
307
|
+
name: The name of the circuit.
|
308
|
+
parameter_prefix: Set the names of the circuit parameters. If a string, the same prefix
|
309
|
+
will be used for each parameters. Can also be a list to specify a prefix per
|
310
|
+
operator.
|
311
|
+
initial_state: A :class:`.QuantumCircuit` object to prepend to the circuit.
|
312
|
+
flatten: Set this to ``True`` to output a flat circuit instead of nesting it inside multiple
|
313
|
+
layers of gate objects. By default currently the contents of
|
314
|
+
the output circuit will be wrapped in nested objects for
|
315
|
+
cleaner visualization. However, if you're using this circuit
|
316
|
+
for anything besides visualization its **strongly** recommended
|
317
|
+
to set this flag to ``True`` to avoid a large performance
|
318
|
+
overhead for parameter binding.
|
319
|
+
"""
|
320
|
+
super().__init__(
|
321
|
+
initial_state=initial_state,
|
322
|
+
parameter_prefix=parameter_prefix,
|
323
|
+
reps=reps,
|
324
|
+
insert_barriers=insert_barriers,
|
325
|
+
name=name,
|
326
|
+
flatten=flatten,
|
327
|
+
)
|
328
|
+
self._operators = None
|
329
|
+
|
330
|
+
if operators is not None:
|
331
|
+
self.operators = operators
|
332
|
+
|
333
|
+
self._evolution = evolution
|
334
|
+
|
335
|
+
# a list of which operators are parameterized, used for internal settings
|
336
|
+
self._ops_are_parameterized = None
|
337
|
+
|
338
|
+
def _check_configuration(self, raise_on_failure: bool = True) -> bool:
|
339
|
+
"""Check if the current configuration is valid."""
|
340
|
+
if not super()._check_configuration(raise_on_failure):
|
341
|
+
return False
|
342
|
+
|
343
|
+
if self.operators is None:
|
344
|
+
if raise_on_failure:
|
345
|
+
raise ValueError("The operators are not set.")
|
346
|
+
return False
|
347
|
+
|
348
|
+
return True
|
349
|
+
|
350
|
+
@property
|
351
|
+
def num_qubits(self) -> int:
|
352
|
+
"""Returns the number of qubits in this circuit.
|
353
|
+
|
354
|
+
Returns:
|
355
|
+
The number of qubits.
|
356
|
+
"""
|
357
|
+
if self.operators is None:
|
358
|
+
return 0
|
359
|
+
|
360
|
+
if isinstance(self.operators, list):
|
361
|
+
if len(self.operators) == 0:
|
362
|
+
return 0
|
363
|
+
return self.operators[0].num_qubits
|
364
|
+
|
365
|
+
return self.operators.num_qubits
|
366
|
+
|
367
|
+
@property
|
368
|
+
def evolution(self):
|
369
|
+
"""The evolution converter used to compute the evolution.
|
370
|
+
|
371
|
+
Returns:
|
372
|
+
EvolutionSynthesis: The evolution converter used to compute the evolution.
|
373
|
+
"""
|
374
|
+
|
375
|
+
return self._evolution
|
376
|
+
|
377
|
+
@evolution.setter
|
378
|
+
def evolution(self, evol) -> None:
|
379
|
+
"""Sets the evolution converter used to compute the evolution.
|
380
|
+
|
381
|
+
Args:
|
382
|
+
evol (EvolutionSynthesis): An evolution synthesis object
|
383
|
+
"""
|
384
|
+
self._invalidate()
|
385
|
+
self._evolution = evol
|
386
|
+
|
387
|
+
@property
|
388
|
+
def operators(self):
|
389
|
+
"""The operators that are evolved in this circuit.
|
390
|
+
|
391
|
+
Returns:
|
392
|
+
list: The operators to be evolved (and circuits) contained in this ansatz.
|
393
|
+
"""
|
394
|
+
return self._operators
|
395
|
+
|
396
|
+
@operators.setter
|
397
|
+
def operators(self, operators=None) -> None:
|
398
|
+
"""Set the operators to be evolved.
|
399
|
+
|
400
|
+
operators (Optional[Union[QuantumCircuit, list]]): The operators to evolve.
|
401
|
+
If a circuit is passed, we assume it implements an already evolved operator and thus
|
402
|
+
the circuit is not evolved again. Can be a single operator (circuit) or a list of
|
403
|
+
operators (and circuits).
|
404
|
+
"""
|
405
|
+
operators = _validate_operators(operators)
|
406
|
+
self._invalidate()
|
407
|
+
self._operators = operators
|
408
|
+
if self.num_qubits == 0:
|
409
|
+
self.qregs = []
|
410
|
+
else:
|
411
|
+
self.qregs = [QuantumRegister(self.num_qubits, name="q")]
|
412
|
+
|
413
|
+
# TODO: the `preferred_init_points`-implementation can (and should!) be improved!
|
414
|
+
@property
|
415
|
+
def preferred_init_points(self):
|
416
|
+
"""Getter of preferred initial points based on the given initial state."""
|
417
|
+
if self._initial_state is None:
|
418
|
+
return None
|
419
|
+
else:
|
420
|
+
# If an initial state was set by the user, then we want to make sure that the VQE does
|
421
|
+
# not start from a random point. Thus, we return an all-zero initial point for the
|
422
|
+
# optimizer which is used (unless it gets overwritten by a higher-priority setting at
|
423
|
+
# runtime of the VQE).
|
424
|
+
# However, in order to determine the correct length, we must build the QuantumCircuit
|
425
|
+
# first, because otherwise the operators may not be set yet.
|
426
|
+
self._build()
|
427
|
+
return np.zeros(self.reps * len(self.operators), dtype=float)
|
428
|
+
|
429
|
+
def _evolve_operator(self, operator, time):
|
430
|
+
|
431
|
+
# pylint: disable=cyclic-import
|
432
|
+
from qiskit.circuit.library.hamiltonian_gate import HamiltonianGate
|
433
|
+
|
434
|
+
# if the operator is specified as matrix use exact matrix exponentiation
|
435
|
+
if isinstance(operator, Operator):
|
436
|
+
gate = HamiltonianGate(operator, time)
|
437
|
+
# otherwise, use the PauliEvolutionGate
|
438
|
+
else:
|
439
|
+
from qiskit.synthesis.evolution import LieTrotter
|
440
|
+
|
441
|
+
evolution = LieTrotter() if self._evolution is None else self._evolution
|
442
|
+
gate = PauliEvolutionGate(operator, time, synthesis=evolution)
|
443
|
+
|
444
|
+
evolved = QuantumCircuit(operator.num_qubits)
|
445
|
+
if not self.flatten:
|
446
|
+
evolved.append(gate, evolved.qubits)
|
447
|
+
else:
|
448
|
+
evolved.compose(gate.definition, evolved.qubits, inplace=True)
|
449
|
+
return evolved
|
450
|
+
|
451
|
+
def _build(self):
|
452
|
+
if self._is_built:
|
453
|
+
return
|
454
|
+
|
455
|
+
# need to check configuration here to ensure the operators are not None
|
456
|
+
self._check_configuration()
|
457
|
+
|
458
|
+
coeff = Parameter("c")
|
459
|
+
circuits = []
|
460
|
+
|
461
|
+
for op in self.operators:
|
462
|
+
# if the operator is already the evolved circuit just append it
|
463
|
+
if isinstance(op, QuantumCircuit):
|
464
|
+
circuits.append(op)
|
465
|
+
else:
|
466
|
+
# check if the operator is just the identity, if yes, skip it
|
467
|
+
if _is_pauli_identity(op):
|
468
|
+
continue
|
469
|
+
|
470
|
+
evolved = self._evolve_operator(op, coeff)
|
471
|
+
circuits.append(evolved)
|
472
|
+
|
473
|
+
self.rotation_blocks = []
|
474
|
+
self.entanglement_blocks = circuits
|
475
|
+
|
476
|
+
super()._build()
|
477
|
+
|
478
|
+
|
479
|
+
def _validate_operators(operators):
|
480
|
+
if not isinstance(operators, list):
|
481
|
+
operators = [operators]
|
482
|
+
|
483
|
+
if len(operators) > 1:
|
484
|
+
num_qubits = operators[0].num_qubits
|
485
|
+
if any(operators[i].num_qubits != num_qubits for i in range(1, len(operators))):
|
486
|
+
raise ValueError("All operators must act on the same number of qubits.")
|
487
|
+
|
488
|
+
return operators
|
489
|
+
|
490
|
+
|
491
|
+
def _validate_prefix(parameter_prefix, operators):
|
492
|
+
if isinstance(parameter_prefix, str):
|
493
|
+
return len(operators) * [parameter_prefix]
|
494
|
+
if len(parameter_prefix) != len(operators):
|
495
|
+
raise ValueError("The number of parameter prefixes must match the operators.")
|
496
|
+
|
497
|
+
return parameter_prefix
|
498
|
+
|
499
|
+
|
500
|
+
def _is_pauli_identity(operator):
|
501
|
+
if isinstance(operator, SparsePauliOp):
|
502
|
+
if len(operator.paulis) == 1:
|
503
|
+
operator = operator.paulis[0] # check if the single Pauli is identity below
|
504
|
+
else:
|
505
|
+
return False
|
506
|
+
if isinstance(operator, Pauli):
|
507
|
+
return not np.any(np.logical_or(operator.x, operator.z))
|
508
|
+
return False
|
509
|
+
|
510
|
+
|
511
|
+
def _remove_identities(operators, prefixes):
|
512
|
+
identity_ops = {index for index, op in enumerate(operators) if _is_pauli_identity(op)}
|
513
|
+
|
514
|
+
if len(identity_ops) == 0:
|
515
|
+
return operators, prefixes
|
516
|
+
|
517
|
+
cleaned_ops = [op for i, op in enumerate(operators) if i not in identity_ops]
|
518
|
+
cleaned_prefix = [prefix for i, prefix in enumerate(prefixes) if i not in identity_ops]
|
519
|
+
|
520
|
+
return cleaned_ops, cleaned_prefix
|