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,452 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 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
|
+
"""
|
14
|
+
Template matching in the forward direction, it takes an initial
|
15
|
+
match, a configuration of qubit and both circuit and template as inputs. The
|
16
|
+
result is a list of match between the template and the circuit.
|
17
|
+
|
18
|
+
|
19
|
+
**Reference:**
|
20
|
+
|
21
|
+
[1] Iten, R., Moyard, R., Metger, T., Sutter, D. and Woerner, S., 2020.
|
22
|
+
Exact and practical pattern matching for quantum circuit optimization.
|
23
|
+
`arXiv:1909.05270 <https://arxiv.org/abs/1909.05270>`_
|
24
|
+
|
25
|
+
"""
|
26
|
+
|
27
|
+
from qiskit.circuit.controlledgate import ControlledGate
|
28
|
+
|
29
|
+
|
30
|
+
class ForwardMatch:
|
31
|
+
"""
|
32
|
+
Object to apply template matching in the forward direction.
|
33
|
+
"""
|
34
|
+
|
35
|
+
def __init__(
|
36
|
+
self, circuit_dag_dep, template_dag_dep, node_id_c, node_id_t, qubits, clbits=None
|
37
|
+
):
|
38
|
+
"""
|
39
|
+
Create a ForwardMatch class with necessary arguments.
|
40
|
+
Args:
|
41
|
+
circuit_dag_dep (DAGDependency): circuit in the dag dependency form.
|
42
|
+
template_dag_dep (DAGDependency): template in the dag dependency form.
|
43
|
+
node_id_c (int): index of the first gate matched in the circuit.
|
44
|
+
node_id_t (int): index of the first gate matched in the template.
|
45
|
+
qubits (list): list of considered qubits in the circuit.
|
46
|
+
clbits (list): list of considered clbits in the circuit.
|
47
|
+
"""
|
48
|
+
|
49
|
+
# The dag dependency representation of the circuit
|
50
|
+
self.circuit_dag_dep = circuit_dag_dep.copy()
|
51
|
+
|
52
|
+
# The dag dependency representation of the template
|
53
|
+
self.template_dag_dep = template_dag_dep.copy()
|
54
|
+
|
55
|
+
# List of qubit on which the node of the circuit is acting on
|
56
|
+
self.qubits = qubits
|
57
|
+
|
58
|
+
# List of qubit on which the node of the circuit is acting on
|
59
|
+
self.clbits = clbits if clbits is not None else []
|
60
|
+
|
61
|
+
# Id of the node in the circuit
|
62
|
+
self.node_id_c = node_id_c
|
63
|
+
|
64
|
+
# Id of the node in the template
|
65
|
+
self.node_id_t = node_id_t
|
66
|
+
|
67
|
+
# List of match
|
68
|
+
self.match = []
|
69
|
+
|
70
|
+
# List of candidates for the forward match
|
71
|
+
self.candidates = []
|
72
|
+
|
73
|
+
# List of nodes in circuit which are matched
|
74
|
+
self.matched_nodes_list = []
|
75
|
+
|
76
|
+
# Transformation of the qarg indices of the circuit to be adapted to the template indices
|
77
|
+
self.qarg_indices = []
|
78
|
+
|
79
|
+
# Transformation of the carg indices of the circuit to be adapted to the template indices
|
80
|
+
self.carg_indices = []
|
81
|
+
|
82
|
+
def _init_successors_to_visit(self):
|
83
|
+
"""
|
84
|
+
Initialize the attribute list 'SuccessorsToVisit'
|
85
|
+
"""
|
86
|
+
for i in range(0, self.circuit_dag_dep.size()):
|
87
|
+
if i == self.node_id_c:
|
88
|
+
self.circuit_dag_dep.get_node(i).successorstovisit = (
|
89
|
+
self.circuit_dag_dep.direct_successors(i)
|
90
|
+
)
|
91
|
+
|
92
|
+
def _init_matched_with_circuit(self):
|
93
|
+
"""
|
94
|
+
Initialize the attribute 'MatchedWith' in the template DAG dependency.
|
95
|
+
"""
|
96
|
+
for i in range(0, self.circuit_dag_dep.size()):
|
97
|
+
if i == self.node_id_c:
|
98
|
+
self.circuit_dag_dep.get_node(i).matchedwith = [self.node_id_t]
|
99
|
+
else:
|
100
|
+
self.circuit_dag_dep.get_node(i).matchedwith = []
|
101
|
+
|
102
|
+
def _init_matched_with_template(self):
|
103
|
+
"""
|
104
|
+
Initialize the attribute 'MatchedWith' in the circuit DAG dependency.
|
105
|
+
"""
|
106
|
+
for i in range(0, self.template_dag_dep.size()):
|
107
|
+
if i == self.node_id_t:
|
108
|
+
self.template_dag_dep.get_node(i).matchedwith = [self.node_id_c]
|
109
|
+
else:
|
110
|
+
self.template_dag_dep.get_node(i).matchedwith = []
|
111
|
+
|
112
|
+
def _init_is_blocked_circuit(self):
|
113
|
+
"""
|
114
|
+
Initialize the attribute 'IsBlocked' in the circuit DAG dependency.
|
115
|
+
"""
|
116
|
+
for i in range(0, self.circuit_dag_dep.size()):
|
117
|
+
self.circuit_dag_dep.get_node(i).isblocked = False
|
118
|
+
|
119
|
+
def _init_is_blocked_template(self):
|
120
|
+
"""
|
121
|
+
Initialize the attribute 'IsBlocked' in the template DAG dependency.
|
122
|
+
"""
|
123
|
+
for i in range(0, self.template_dag_dep.size()):
|
124
|
+
self.template_dag_dep.get_node(i).isblocked = False
|
125
|
+
|
126
|
+
def _init_list_match(self):
|
127
|
+
"""
|
128
|
+
Initialize the list of matched nodes between the circuit and the template
|
129
|
+
with the first match found.
|
130
|
+
"""
|
131
|
+
self.match.append([self.node_id_t, self.node_id_c])
|
132
|
+
|
133
|
+
def _find_forward_candidates(self, node_id_t):
|
134
|
+
"""
|
135
|
+
Find the candidate nodes to be matched in the template for a given node.
|
136
|
+
Args:
|
137
|
+
node_id_t (int): considered node id.
|
138
|
+
"""
|
139
|
+
matches = []
|
140
|
+
|
141
|
+
for match in self.match:
|
142
|
+
matches.append(match[0])
|
143
|
+
|
144
|
+
pred = matches.copy()
|
145
|
+
if len(pred) > 1:
|
146
|
+
pred.sort()
|
147
|
+
pred.remove(node_id_t)
|
148
|
+
|
149
|
+
if self.template_dag_dep.direct_successors(node_id_t):
|
150
|
+
maximal_index = self.template_dag_dep.direct_successors(node_id_t)[-1]
|
151
|
+
pred = [elem for elem in pred if elem <= maximal_index]
|
152
|
+
|
153
|
+
block = []
|
154
|
+
for node_id in pred:
|
155
|
+
for dir_succ in self.template_dag_dep.direct_successors(node_id):
|
156
|
+
if dir_succ not in matches:
|
157
|
+
succ = self.template_dag_dep.successors(dir_succ)
|
158
|
+
block = block + succ
|
159
|
+
self.candidates = list(
|
160
|
+
set(self.template_dag_dep.direct_successors(node_id_t)) - set(matches) - set(block)
|
161
|
+
)
|
162
|
+
|
163
|
+
def _init_matched_nodes(self):
|
164
|
+
"""
|
165
|
+
Initialize the list of current matched nodes.
|
166
|
+
"""
|
167
|
+
self.matched_nodes_list.append(
|
168
|
+
[self.node_id_c, self.circuit_dag_dep.get_node(self.node_id_c)]
|
169
|
+
)
|
170
|
+
|
171
|
+
def _get_node_forward(self, list_id):
|
172
|
+
"""
|
173
|
+
Return a node from the matched_node_list for a given list id.
|
174
|
+
Args:
|
175
|
+
list_id (int): considered list id of the desired node.
|
176
|
+
|
177
|
+
Returns:
|
178
|
+
DAGDepNode: DAGDepNode object corresponding to i-th node of the matched_node_list.
|
179
|
+
"""
|
180
|
+
node = self.matched_nodes_list[list_id][1]
|
181
|
+
return node
|
182
|
+
|
183
|
+
def _remove_node_forward(self, list_id):
|
184
|
+
"""
|
185
|
+
Remove a node of the current matched list for a given list id.
|
186
|
+
Args:
|
187
|
+
list_id (int): considered list id of the desired node.
|
188
|
+
"""
|
189
|
+
self.matched_nodes_list.pop(list_id)
|
190
|
+
|
191
|
+
def _update_successor(self, node, successor_id):
|
192
|
+
"""
|
193
|
+
Return a node with an updated attribute 'SuccessorToVisit'.
|
194
|
+
Args:
|
195
|
+
node (DAGDepNode): current node.
|
196
|
+
successor_id (int): successor id to remove.
|
197
|
+
|
198
|
+
Returns:
|
199
|
+
DAGOpNode or DAGOutNode: Node with updated attribute 'SuccessorToVisit'.
|
200
|
+
"""
|
201
|
+
node_update = node
|
202
|
+
node_update.successorstovisit.pop(successor_id)
|
203
|
+
return node_update
|
204
|
+
|
205
|
+
def _get_successors_to_visit(self, node, list_id):
|
206
|
+
"""
|
207
|
+
Return the successor for a given node and id.
|
208
|
+
Args:
|
209
|
+
node (DAGOpNode or DAGOutNode): current node.
|
210
|
+
list_id (int): id in the list for the successor to get.
|
211
|
+
|
212
|
+
Returns:
|
213
|
+
int: id of the successor to get.
|
214
|
+
"""
|
215
|
+
successor_id = node.successorstovisit[list_id]
|
216
|
+
return successor_id
|
217
|
+
|
218
|
+
def _update_qarg_indices(self, qarg):
|
219
|
+
"""
|
220
|
+
Change qubits indices of the current circuit node in order to
|
221
|
+
be comparable with the indices of the template qubits list.
|
222
|
+
Args:
|
223
|
+
qarg (list): list of qubits indices from the circuit for a given node.
|
224
|
+
"""
|
225
|
+
self.qarg_indices = []
|
226
|
+
for q in qarg:
|
227
|
+
if q in self.qubits:
|
228
|
+
self.qarg_indices.append(self.qubits.index(q))
|
229
|
+
if len(qarg) != len(self.qarg_indices):
|
230
|
+
self.qarg_indices = []
|
231
|
+
|
232
|
+
def _update_carg_indices(self, carg):
|
233
|
+
"""
|
234
|
+
Change clbits indices of the current circuit node in order to
|
235
|
+
be comparable with the indices of the template qubits list.
|
236
|
+
Args:
|
237
|
+
carg (list): list of clbits indices from the circuit for a given node.
|
238
|
+
"""
|
239
|
+
self.carg_indices = []
|
240
|
+
if carg:
|
241
|
+
for q in carg:
|
242
|
+
if q in self.clbits:
|
243
|
+
self.carg_indices.append(self.clbits.index(q))
|
244
|
+
if len(carg) != len(self.carg_indices):
|
245
|
+
self.carg_indices = []
|
246
|
+
|
247
|
+
def _is_same_op(self, node_circuit, node_template):
|
248
|
+
"""
|
249
|
+
Check if two instructions are the same.
|
250
|
+
Args:
|
251
|
+
node_circuit (DAGDepNode): node in the circuit.
|
252
|
+
node_template (DAGDepNode): node in the template.
|
253
|
+
Returns:
|
254
|
+
bool: True if the same, False otherwise.
|
255
|
+
"""
|
256
|
+
return node_circuit.op.soft_compare(node_template.op)
|
257
|
+
|
258
|
+
def _is_same_q_conf(self, node_circuit, node_template):
|
259
|
+
"""
|
260
|
+
Check if the qubits configurations are compatible.
|
261
|
+
Args:
|
262
|
+
node_circuit (DAGDepNode): node in the circuit.
|
263
|
+
node_template (DAGDepNode): node in the template.
|
264
|
+
Returns:
|
265
|
+
bool: True if possible, False otherwise.
|
266
|
+
"""
|
267
|
+
|
268
|
+
if isinstance(node_circuit.op, ControlledGate):
|
269
|
+
|
270
|
+
c_template = node_template.op.num_ctrl_qubits
|
271
|
+
|
272
|
+
if c_template == 1:
|
273
|
+
return self.qarg_indices == node_template.qindices
|
274
|
+
|
275
|
+
else:
|
276
|
+
control_qubits_template = node_template.qindices[:c_template]
|
277
|
+
control_qubits_circuit = self.qarg_indices[:c_template]
|
278
|
+
|
279
|
+
if set(control_qubits_circuit) == set(control_qubits_template):
|
280
|
+
|
281
|
+
target_qubits_template = node_template.qindices[c_template::]
|
282
|
+
target_qubits_circuit = self.qarg_indices[c_template::]
|
283
|
+
|
284
|
+
if node_template.op.base_gate.name in [
|
285
|
+
"rxx",
|
286
|
+
"ryy",
|
287
|
+
"rzz",
|
288
|
+
"swap",
|
289
|
+
"iswap",
|
290
|
+
"ms",
|
291
|
+
]:
|
292
|
+
return set(target_qubits_template) == set(target_qubits_circuit)
|
293
|
+
else:
|
294
|
+
return target_qubits_template == target_qubits_circuit
|
295
|
+
else:
|
296
|
+
return False
|
297
|
+
else:
|
298
|
+
if node_template.op.name in ["rxx", "ryy", "rzz", "swap", "iswap", "ms"]:
|
299
|
+
return set(self.qarg_indices) == set(node_template.qindices)
|
300
|
+
else:
|
301
|
+
return self.qarg_indices == node_template.qindices
|
302
|
+
|
303
|
+
def _is_same_c_conf(self, node_circuit, node_template):
|
304
|
+
"""
|
305
|
+
Check if the clbits configurations are compatible.
|
306
|
+
Args:
|
307
|
+
node_circuit (DAGDepNode): node in the circuit.
|
308
|
+
node_template (DAGDepNode): node in the template.
|
309
|
+
Returns:
|
310
|
+
bool: True if possible, False otherwise.
|
311
|
+
"""
|
312
|
+
if (
|
313
|
+
node_circuit.type == "op"
|
314
|
+
and getattr(node_circuit.op, "_condition", None)
|
315
|
+
and node_template.type == "op"
|
316
|
+
and getattr(node_template.op, "_condition", None)
|
317
|
+
):
|
318
|
+
if set(self.carg_indices) != set(node_template.cindices):
|
319
|
+
return False
|
320
|
+
if (
|
321
|
+
getattr(node_circuit.op, "_condition", None)[1]
|
322
|
+
!= getattr(node_template.op, "_condition", None)[1]
|
323
|
+
):
|
324
|
+
return False
|
325
|
+
return True
|
326
|
+
|
327
|
+
def run_forward_match(self):
|
328
|
+
"""
|
329
|
+
Apply the forward match algorithm and returns the list of matches given an initial match
|
330
|
+
and a circuit qubits configuration.
|
331
|
+
"""
|
332
|
+
|
333
|
+
# Initialize the new attributes of the DAGDepNodes of the DAGDependency object
|
334
|
+
self._init_successors_to_visit()
|
335
|
+
|
336
|
+
self._init_matched_with_circuit()
|
337
|
+
self._init_matched_with_template()
|
338
|
+
|
339
|
+
self._init_is_blocked_circuit()
|
340
|
+
self._init_is_blocked_template()
|
341
|
+
|
342
|
+
# Initialize the list of matches and the stack of matched nodes (circuit)
|
343
|
+
self._init_list_match()
|
344
|
+
self._init_matched_nodes()
|
345
|
+
|
346
|
+
# While the list of matched nodes is not empty
|
347
|
+
while self.matched_nodes_list:
|
348
|
+
|
349
|
+
# Return first element of the matched_nodes_list and removes it from the list
|
350
|
+
v_first = self._get_node_forward(0)
|
351
|
+
self._remove_node_forward(0)
|
352
|
+
|
353
|
+
# If there is no successors to visit go to the end
|
354
|
+
if not v_first.successorstovisit:
|
355
|
+
continue
|
356
|
+
|
357
|
+
# Get the label and the node of the first successor to visit
|
358
|
+
label = self._get_successors_to_visit(v_first, 0)
|
359
|
+
v = [label, self.circuit_dag_dep.get_node(label)]
|
360
|
+
|
361
|
+
# Update of the SuccessorsToVisit attribute
|
362
|
+
v_first = self._update_successor(v_first, 0)
|
363
|
+
|
364
|
+
# Update the matched_nodes_list with new attribute successor to visit and sort the list.
|
365
|
+
self.matched_nodes_list.append([v_first.node_id, v_first])
|
366
|
+
self.matched_nodes_list.sort(key=lambda x: x[1].successorstovisit)
|
367
|
+
|
368
|
+
# If the node is blocked and already matched go to the end
|
369
|
+
if v[1].isblocked | (v[1].matchedwith != []):
|
370
|
+
continue
|
371
|
+
|
372
|
+
# Search for potential candidates in the template
|
373
|
+
self._find_forward_candidates(v_first.matchedwith[0])
|
374
|
+
|
375
|
+
qarg1 = self.circuit_dag_dep.get_node(label).qindices
|
376
|
+
carg1 = self.circuit_dag_dep.get_node(label).cindices
|
377
|
+
|
378
|
+
# Update the indices for both qubits and clbits in order to be comparable with the
|
379
|
+
# indices in the template circuit.
|
380
|
+
self._update_qarg_indices(qarg1)
|
381
|
+
self._update_carg_indices(carg1)
|
382
|
+
|
383
|
+
match = False
|
384
|
+
|
385
|
+
# For loop over the candidates (template) to find a match.
|
386
|
+
for i in self.candidates:
|
387
|
+
|
388
|
+
# Break the for loop if a match is found.
|
389
|
+
if match:
|
390
|
+
break
|
391
|
+
|
392
|
+
# Compare the indices of qubits and the operation,
|
393
|
+
# if True; a match is found
|
394
|
+
node_circuit = self.circuit_dag_dep.get_node(label)
|
395
|
+
node_template = self.template_dag_dep.get_node(i)
|
396
|
+
|
397
|
+
# Necessary but not sufficient conditions for a match to happen.
|
398
|
+
if (
|
399
|
+
len(self.qarg_indices) != len(node_template.qindices)
|
400
|
+
or set(self.qarg_indices) != set(node_template.qindices)
|
401
|
+
or node_circuit.name != node_template.name
|
402
|
+
):
|
403
|
+
continue
|
404
|
+
|
405
|
+
# Check if the qubit, clbit configuration are compatible for a match,
|
406
|
+
# also check if the operation are the same.
|
407
|
+
if (
|
408
|
+
self._is_same_q_conf(node_circuit, node_template)
|
409
|
+
and self._is_same_c_conf(node_circuit, node_template)
|
410
|
+
and self._is_same_op(node_circuit, node_template)
|
411
|
+
):
|
412
|
+
|
413
|
+
v[1].matchedwith = [i]
|
414
|
+
|
415
|
+
self.template_dag_dep.get_node(i).matchedwith = [label]
|
416
|
+
|
417
|
+
# Append the new match to the list of matches.
|
418
|
+
self.match.append([i, label])
|
419
|
+
|
420
|
+
# Potential successors to visit (circuit) for a given match.
|
421
|
+
potential = self.circuit_dag_dep.direct_successors(label)
|
422
|
+
|
423
|
+
# If the potential successors to visit are blocked or match, it is removed.
|
424
|
+
for potential_id in potential:
|
425
|
+
if self.circuit_dag_dep.get_node(potential_id).isblocked | (
|
426
|
+
self.circuit_dag_dep.get_node(potential_id).matchedwith != []
|
427
|
+
):
|
428
|
+
potential.remove(potential_id)
|
429
|
+
|
430
|
+
sorted_potential = sorted(potential)
|
431
|
+
|
432
|
+
# Update the successor to visit attribute
|
433
|
+
v[1].successorstovisit = sorted_potential
|
434
|
+
|
435
|
+
# Add the updated node to the stack.
|
436
|
+
self.matched_nodes_list.append([v[0], v[1]])
|
437
|
+
self.matched_nodes_list.sort(key=lambda x: x[1].successorstovisit)
|
438
|
+
match = True
|
439
|
+
continue
|
440
|
+
|
441
|
+
# If no match is found, block the node and all the successors.
|
442
|
+
if not match:
|
443
|
+
v[1].isblocked = True
|
444
|
+
for succ in v[1].successors:
|
445
|
+
self.circuit_dag_dep.get_node(succ).isblocked = True
|
446
|
+
if self.circuit_dag_dep.get_node(succ).matchedwith:
|
447
|
+
self.match.remove(
|
448
|
+
[self.circuit_dag_dep.get_node(succ).matchedwith[0], succ]
|
449
|
+
)
|
450
|
+
match_id = self.circuit_dag_dep.get_node(succ).matchedwith[0]
|
451
|
+
self.template_dag_dep.get_node(match_id).matchedwith = []
|
452
|
+
self.circuit_dag_dep.get_node(succ).matchedwith = []
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 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
|
+
"""
|
14
|
+
It stores all maximal matches from the given matches obtained by the template
|
15
|
+
matching algorithm.
|
16
|
+
"""
|
17
|
+
|
18
|
+
|
19
|
+
class Match:
|
20
|
+
"""
|
21
|
+
Class Match is an object to store a list of match with its qubits and
|
22
|
+
clbits configuration.
|
23
|
+
"""
|
24
|
+
|
25
|
+
def __init__(self, match, qubit, clbit):
|
26
|
+
"""
|
27
|
+
Create a Match with necessary arguments.
|
28
|
+
Args:
|
29
|
+
match (list): list of a match.
|
30
|
+
qubit (list): list of qubits configuration.
|
31
|
+
clbit (list): list of clbits configuration.
|
32
|
+
"""
|
33
|
+
|
34
|
+
self.match = match
|
35
|
+
self.qubit = qubit
|
36
|
+
self.clbit = clbit
|
37
|
+
|
38
|
+
|
39
|
+
class MaximalMatches:
|
40
|
+
"""
|
41
|
+
Class MaximalMatches allows to sort and store the maximal matches from the list
|
42
|
+
of matches obtained with the template matching algorithm.
|
43
|
+
"""
|
44
|
+
|
45
|
+
def __init__(self, template_matches):
|
46
|
+
"""
|
47
|
+
Initialize MaximalMatches with the necessary arguments.
|
48
|
+
Args:
|
49
|
+
template_matches (list): list of matches obtained from running the algorithm.
|
50
|
+
"""
|
51
|
+
self.template_matches = template_matches
|
52
|
+
|
53
|
+
self.max_match_list = []
|
54
|
+
|
55
|
+
def run_maximal_matches(self):
|
56
|
+
"""
|
57
|
+
Method that extracts and stores maximal matches in decreasing length order.
|
58
|
+
"""
|
59
|
+
|
60
|
+
self.max_match_list = [
|
61
|
+
Match(
|
62
|
+
sorted(self.template_matches[0].match),
|
63
|
+
self.template_matches[0].qubit,
|
64
|
+
self.template_matches[0].clbit,
|
65
|
+
)
|
66
|
+
]
|
67
|
+
|
68
|
+
for matches in self.template_matches[1::]:
|
69
|
+
present = False
|
70
|
+
for max_match in self.max_match_list:
|
71
|
+
for elem in matches.match:
|
72
|
+
if elem in max_match.match and len(matches.match) <= len(max_match.match):
|
73
|
+
present = True
|
74
|
+
if not present:
|
75
|
+
self.max_match_list.append(
|
76
|
+
Match(sorted(matches.match), matches.qubit, matches.clbit)
|
77
|
+
)
|