qiskit 2.0.3__cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -0
- qiskit/__init__.py +141 -0
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +73 -0
- qiskit/circuit/__init__.py +1343 -0
- qiskit/circuit/_add_control.py +312 -0
- qiskit/circuit/_classical_resource_map.py +150 -0
- qiskit/circuit/_standard_gates_commutations.py +3849 -0
- qiskit/circuit/_utils.py +167 -0
- qiskit/circuit/annotated_operation.py +279 -0
- qiskit/circuit/barrier.py +46 -0
- qiskit/circuit/classical/__init__.py +41 -0
- qiskit/circuit/classical/expr/__init__.py +266 -0
- qiskit/circuit/classical/expr/constructors.py +764 -0
- qiskit/circuit/classical/expr/expr.py +498 -0
- qiskit/circuit/classical/expr/visitors.py +375 -0
- qiskit/circuit/classical/types/__init__.py +113 -0
- qiskit/circuit/classical/types/ordering.py +229 -0
- qiskit/circuit/classical/types/types.py +153 -0
- qiskit/circuit/commutation_checker.py +133 -0
- qiskit/circuit/commutation_library.py +20 -0
- qiskit/circuit/controlflow/__init__.py +59 -0
- qiskit/circuit/controlflow/_builder_utils.py +211 -0
- qiskit/circuit/controlflow/box.py +163 -0
- qiskit/circuit/controlflow/break_loop.py +56 -0
- qiskit/circuit/controlflow/builder.py +791 -0
- qiskit/circuit/controlflow/continue_loop.py +56 -0
- qiskit/circuit/controlflow/control_flow.py +94 -0
- qiskit/circuit/controlflow/for_loop.py +218 -0
- qiskit/circuit/controlflow/if_else.py +498 -0
- qiskit/circuit/controlflow/switch_case.py +411 -0
- qiskit/circuit/controlflow/while_loop.py +166 -0
- qiskit/circuit/controlledgate.py +274 -0
- qiskit/circuit/delay.py +157 -0
- qiskit/circuit/duration.py +80 -0
- qiskit/circuit/equivalence.py +94 -0
- qiskit/circuit/equivalence_library.py +18 -0
- qiskit/circuit/exceptions.py +19 -0
- qiskit/circuit/gate.py +261 -0
- qiskit/circuit/instruction.py +564 -0
- qiskit/circuit/instructionset.py +132 -0
- qiskit/circuit/library/__init__.py +984 -0
- qiskit/circuit/library/arithmetic/__init__.py +40 -0
- qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +235 -0
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +131 -0
- qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
- qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -0
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +201 -0
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +502 -0
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +387 -0
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +493 -0
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
- qiskit/circuit/library/arithmetic/quadratic_form.py +364 -0
- qiskit/circuit/library/arithmetic/weighted_adder.py +409 -0
- qiskit/circuit/library/basis_change/__init__.py +15 -0
- qiskit/circuit/library/basis_change/qft.py +316 -0
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +316 -0
- qiskit/circuit/library/boolean_logic/__init__.py +18 -0
- qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
- qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
- qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
- qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -0
- qiskit/circuit/library/data_preparation/__init__.py +57 -0
- qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
- qiskit/circuit/library/data_preparation/initializer.py +107 -0
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
- qiskit/circuit/library/fourier_checking.py +160 -0
- qiskit/circuit/library/generalized_gates/__init__.py +30 -0
- qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
- qiskit/circuit/library/generalized_gates/gms.py +175 -0
- qiskit/circuit/library/generalized_gates/gr.py +219 -0
- qiskit/circuit/library/generalized_gates/isometry.py +370 -0
- qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
- qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
- qiskit/circuit/library/generalized_gates/pauli.py +84 -0
- qiskit/circuit/library/generalized_gates/permutation.py +198 -0
- qiskit/circuit/library/generalized_gates/rv.py +96 -0
- qiskit/circuit/library/generalized_gates/uc.py +303 -0
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
- qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
- qiskit/circuit/library/generalized_gates/ucry.py +32 -0
- qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
- qiskit/circuit/library/generalized_gates/unitary.py +217 -0
- qiskit/circuit/library/graph_state.py +172 -0
- qiskit/circuit/library/grover_operator.py +583 -0
- qiskit/circuit/library/hamiltonian_gate.py +142 -0
- qiskit/circuit/library/hidden_linear_function.py +163 -0
- qiskit/circuit/library/iqp.py +180 -0
- qiskit/circuit/library/n_local/__init__.py +45 -0
- qiskit/circuit/library/n_local/efficient_su2.py +282 -0
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +303 -0
- qiskit/circuit/library/n_local/n_local.py +1477 -0
- qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
- qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
- qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
- qiskit/circuit/library/n_local/two_local.py +289 -0
- qiskit/circuit/library/overlap.py +183 -0
- qiskit/circuit/library/pauli_evolution.py +201 -0
- qiskit/circuit/library/phase_estimation.py +177 -0
- qiskit/circuit/library/phase_oracle.py +239 -0
- qiskit/circuit/library/quantum_volume.py +180 -0
- qiskit/circuit/library/standard_gates/__init__.py +141 -0
- qiskit/circuit/library/standard_gates/dcx.py +77 -0
- qiskit/circuit/library/standard_gates/ecr.py +129 -0
- qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
- qiskit/circuit/library/standard_gates/global_phase.py +84 -0
- qiskit/circuit/library/standard_gates/h.py +253 -0
- qiskit/circuit/library/standard_gates/i.py +76 -0
- qiskit/circuit/library/standard_gates/iswap.py +133 -0
- qiskit/circuit/library/standard_gates/p.py +422 -0
- qiskit/circuit/library/standard_gates/r.py +114 -0
- qiskit/circuit/library/standard_gates/rx.py +293 -0
- qiskit/circuit/library/standard_gates/rxx.py +180 -0
- qiskit/circuit/library/standard_gates/ry.py +286 -0
- qiskit/circuit/library/standard_gates/ryy.py +180 -0
- qiskit/circuit/library/standard_gates/rz.py +307 -0
- qiskit/circuit/library/standard_gates/rzx.py +226 -0
- qiskit/circuit/library/standard_gates/rzz.py +193 -0
- qiskit/circuit/library/standard_gates/s.py +419 -0
- qiskit/circuit/library/standard_gates/swap.py +281 -0
- qiskit/circuit/library/standard_gates/sx.py +310 -0
- qiskit/circuit/library/standard_gates/t.py +178 -0
- qiskit/circuit/library/standard_gates/u.py +395 -0
- qiskit/circuit/library/standard_gates/u1.py +490 -0
- qiskit/circuit/library/standard_gates/u2.py +145 -0
- qiskit/circuit/library/standard_gates/u3.py +428 -0
- qiskit/circuit/library/standard_gates/x.py +1481 -0
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +202 -0
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +236 -0
- qiskit/circuit/library/standard_gates/y.py +257 -0
- qiskit/circuit/library/standard_gates/z.py +338 -0
- qiskit/circuit/library/templates/__init__.py +92 -0
- qiskit/circuit/library/templates/clifford/__init__.py +33 -0
- qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
- qiskit/circuit/library/templates/nct/__init__.py +67 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
- qiskit/circuit/library/templates/rzx/__init__.py +25 -0
- qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
- qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
- qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
- qiskit/circuit/measure.py +53 -0
- qiskit/circuit/operation.py +68 -0
- qiskit/circuit/parameter.py +179 -0
- qiskit/circuit/parameterexpression.py +703 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +140 -0
- qiskit/circuit/quantumcircuit.py +7540 -0
- qiskit/circuit/quantumcircuitdata.py +136 -0
- qiskit/circuit/random/__init__.py +15 -0
- qiskit/circuit/random/utils.py +366 -0
- qiskit/circuit/reset.py +37 -0
- qiskit/circuit/singleton.py +600 -0
- qiskit/circuit/store.py +89 -0
- qiskit/circuit/tools/__init__.py +16 -0
- qiskit/circuit/tools/pi_check.py +193 -0
- qiskit/circuit/twirling.py +145 -0
- qiskit/compiler/__init__.py +27 -0
- qiskit/compiler/transpiler.py +375 -0
- qiskit/converters/__init__.py +74 -0
- qiskit/converters/circuit_to_dag.py +80 -0
- qiskit/converters/circuit_to_dagdependency.py +49 -0
- qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
- qiskit/converters/circuit_to_gate.py +107 -0
- qiskit/converters/circuit_to_instruction.py +142 -0
- qiskit/converters/dag_to_circuit.py +79 -0
- qiskit/converters/dag_to_dagdependency.py +54 -0
- qiskit/converters/dag_to_dagdependency_v2.py +43 -0
- qiskit/converters/dagdependency_to_circuit.py +40 -0
- qiskit/converters/dagdependency_to_dag.py +48 -0
- qiskit/dagcircuit/__init__.py +55 -0
- qiskit/dagcircuit/collect_blocks.py +407 -0
- qiskit/dagcircuit/dagcircuit.py +24 -0
- qiskit/dagcircuit/dagdependency.py +612 -0
- qiskit/dagcircuit/dagdependency_v2.py +566 -0
- qiskit/dagcircuit/dagdepnode.py +160 -0
- qiskit/dagcircuit/dagnode.py +188 -0
- qiskit/dagcircuit/exceptions.py +42 -0
- qiskit/exceptions.py +153 -0
- qiskit/passmanager/__init__.py +258 -0
- qiskit/passmanager/base_tasks.py +230 -0
- qiskit/passmanager/compilation_status.py +74 -0
- qiskit/passmanager/exceptions.py +19 -0
- qiskit/passmanager/flow_controllers.py +116 -0
- qiskit/passmanager/passmanager.py +353 -0
- qiskit/primitives/__init__.py +490 -0
- qiskit/primitives/backend_estimator_v2.py +530 -0
- qiskit/primitives/backend_sampler_v2.py +339 -0
- qiskit/primitives/base/__init__.py +20 -0
- qiskit/primitives/base/base_estimator.py +247 -0
- qiskit/primitives/base/base_primitive_job.py +78 -0
- qiskit/primitives/base/base_primitive_v1.py +45 -0
- qiskit/primitives/base/base_result_v1.py +65 -0
- qiskit/primitives/base/base_sampler.py +196 -0
- qiskit/primitives/base/estimator_result_v1.py +46 -0
- qiskit/primitives/base/sampler_result_v1.py +45 -0
- qiskit/primitives/base/validation_v1.py +250 -0
- qiskit/primitives/containers/__init__.py +26 -0
- qiskit/primitives/containers/bindings_array.py +391 -0
- qiskit/primitives/containers/bit_array.py +764 -0
- qiskit/primitives/containers/data_bin.py +175 -0
- qiskit/primitives/containers/estimator_pub.py +222 -0
- qiskit/primitives/containers/object_array.py +94 -0
- qiskit/primitives/containers/observables_array.py +296 -0
- qiskit/primitives/containers/primitive_result.py +53 -0
- qiskit/primitives/containers/pub_result.py +51 -0
- qiskit/primitives/containers/sampler_pub.py +193 -0
- qiskit/primitives/containers/sampler_pub_result.py +74 -0
- qiskit/primitives/containers/shape.py +129 -0
- qiskit/primitives/primitive_job.py +81 -0
- qiskit/primitives/statevector_estimator.py +175 -0
- qiskit/primitives/statevector_sampler.py +290 -0
- qiskit/primitives/utils.py +72 -0
- qiskit/providers/__init__.py +677 -0
- qiskit/providers/backend.py +364 -0
- qiskit/providers/basic_provider/__init__.py +47 -0
- qiskit/providers/basic_provider/basic_provider.py +121 -0
- qiskit/providers/basic_provider/basic_provider_job.py +65 -0
- qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
- qiskit/providers/basic_provider/basic_simulator.py +693 -0
- qiskit/providers/basic_provider/exceptions.py +30 -0
- qiskit/providers/exceptions.py +33 -0
- qiskit/providers/fake_provider/__init__.py +69 -0
- qiskit/providers/fake_provider/generic_backend_v2.py +374 -0
- qiskit/providers/fake_provider/utils/__init__.py +15 -0
- qiskit/providers/job.py +147 -0
- qiskit/providers/jobstatus.py +30 -0
- qiskit/providers/options.py +273 -0
- qiskit/providers/providerutils.py +110 -0
- qiskit/qasm/libs/dummy/stdgates.inc +75 -0
- qiskit/qasm/libs/qelib1.inc +266 -0
- qiskit/qasm/libs/stdgates.inc +82 -0
- qiskit/qasm2/__init__.py +669 -0
- qiskit/qasm2/exceptions.py +27 -0
- qiskit/qasm2/export.py +364 -0
- qiskit/qasm2/parse.py +438 -0
- qiskit/qasm3/__init__.py +372 -0
- qiskit/qasm3/ast.py +782 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1340 -0
- qiskit/qasm3/printer.py +608 -0
- qiskit/qpy/__init__.py +1965 -0
- qiskit/qpy/binary_io/__init__.py +35 -0
- qiskit/qpy/binary_io/circuits.py +1455 -0
- qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
- qiskit/qpy/binary_io/schedules.py +308 -0
- qiskit/qpy/binary_io/value.py +1165 -0
- qiskit/qpy/common.py +353 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +442 -0
- qiskit/qpy/interface.py +344 -0
- qiskit/qpy/type_keys.py +409 -0
- qiskit/quantum_info/__init__.py +162 -0
- qiskit/quantum_info/analysis/__init__.py +17 -0
- qiskit/quantum_info/analysis/average.py +47 -0
- qiskit/quantum_info/analysis/distance.py +104 -0
- qiskit/quantum_info/analysis/make_observable.py +44 -0
- qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
- qiskit/quantum_info/operators/__init__.py +28 -0
- qiskit/quantum_info/operators/base_operator.py +145 -0
- qiskit/quantum_info/operators/channel/__init__.py +29 -0
- qiskit/quantum_info/operators/channel/chi.py +191 -0
- qiskit/quantum_info/operators/channel/choi.py +218 -0
- qiskit/quantum_info/operators/channel/kraus.py +337 -0
- qiskit/quantum_info/operators/channel/ptm.py +204 -0
- qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
- qiskit/quantum_info/operators/channel/stinespring.py +296 -0
- qiskit/quantum_info/operators/channel/superop.py +373 -0
- qiskit/quantum_info/operators/channel/transformations.py +490 -0
- qiskit/quantum_info/operators/custom_iterator.py +48 -0
- qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
- qiskit/quantum_info/operators/dihedral/dihedral.py +511 -0
- qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
- qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
- qiskit/quantum_info/operators/dihedral/random.py +64 -0
- qiskit/quantum_info/operators/linear_op.py +25 -0
- qiskit/quantum_info/operators/measures.py +418 -0
- qiskit/quantum_info/operators/mixins/__init__.py +52 -0
- qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
- qiskit/quantum_info/operators/mixins/group.py +171 -0
- qiskit/quantum_info/operators/mixins/linear.py +84 -0
- qiskit/quantum_info/operators/mixins/multiply.py +62 -0
- qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
- qiskit/quantum_info/operators/op_shape.py +525 -0
- qiskit/quantum_info/operators/operator.py +869 -0
- qiskit/quantum_info/operators/operator_utils.py +76 -0
- qiskit/quantum_info/operators/predicates.py +183 -0
- qiskit/quantum_info/operators/random.py +154 -0
- qiskit/quantum_info/operators/scalar_op.py +254 -0
- qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
- qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
- qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
- qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -0
- qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
- qiskit/quantum_info/operators/symplectic/random.py +117 -0
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1239 -0
- qiskit/quantum_info/operators/utils/__init__.py +20 -0
- qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
- qiskit/quantum_info/operators/utils/commutator.py +36 -0
- qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
- qiskit/quantum_info/quaternion.py +156 -0
- qiskit/quantum_info/random.py +26 -0
- qiskit/quantum_info/states/__init__.py +28 -0
- qiskit/quantum_info/states/densitymatrix.py +857 -0
- qiskit/quantum_info/states/measures.py +288 -0
- qiskit/quantum_info/states/quantum_state.py +503 -0
- qiskit/quantum_info/states/random.py +157 -0
- qiskit/quantum_info/states/stabilizerstate.py +805 -0
- qiskit/quantum_info/states/statevector.py +977 -0
- qiskit/quantum_info/states/utils.py +247 -0
- qiskit/result/__init__.py +61 -0
- qiskit/result/counts.py +189 -0
- qiskit/result/distributions/__init__.py +17 -0
- qiskit/result/distributions/probability.py +100 -0
- qiskit/result/distributions/quasi.py +154 -0
- qiskit/result/exceptions.py +40 -0
- qiskit/result/models.py +241 -0
- qiskit/result/postprocess.py +239 -0
- qiskit/result/result.py +385 -0
- qiskit/result/sampled_expval.py +74 -0
- qiskit/result/utils.py +294 -0
- qiskit/synthesis/__init__.py +240 -0
- qiskit/synthesis/arithmetic/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
- qiskit/synthesis/arithmetic/comparators/__init__.py +16 -0
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/synthesis/boolean/__init__.py +13 -0
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/clifford/__init__.py +19 -0
- qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
- qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
- qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
- qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
- qiskit/synthesis/cnotdihedral/__init__.py +17 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
- qiskit/synthesis/discrete_basis/__init__.py +16 -0
- qiskit/synthesis/discrete_basis/commutator_decompose.py +265 -0
- qiskit/synthesis/discrete_basis/gate_sequence.py +421 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +165 -0
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +240 -0
- qiskit/synthesis/evolution/__init__.py +21 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +120 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +313 -0
- qiskit/synthesis/evolution/qdrift.py +130 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +224 -0
- qiskit/synthesis/linear/__init__.py +26 -0
- qiskit/synthesis/linear/cnot_synth.py +69 -0
- qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
- qiskit/synthesis/linear/linear_depth_lnn.py +61 -0
- qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
- qiskit/synthesis/linear_phase/__init__.py +17 -0
- qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +61 -0
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
- qiskit/synthesis/multi_controlled/__init__.py +25 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +359 -0
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
- qiskit/synthesis/one_qubit/__init__.py +15 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
- qiskit/synthesis/permutation/__init__.py +18 -0
- qiskit/synthesis/permutation/permutation_full.py +78 -0
- qiskit/synthesis/permutation/permutation_lnn.py +54 -0
- qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
- qiskit/synthesis/permutation/permutation_utils.py +16 -0
- qiskit/synthesis/qft/__init__.py +16 -0
- qiskit/synthesis/qft/qft_decompose_full.py +97 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +79 -0
- qiskit/synthesis/stabilizer/__init__.py +16 -0
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
- qiskit/synthesis/two_qubit/__init__.py +20 -0
- qiskit/synthesis/two_qubit/local_invariance.py +63 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +583 -0
- qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
- qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
- qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
- qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
- qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
- qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
- qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
- qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
- qiskit/synthesis/unitary/__init__.py +13 -0
- qiskit/synthesis/unitary/aqc/__init__.py +177 -0
- qiskit/synthesis/unitary/aqc/approximate.py +116 -0
- qiskit/synthesis/unitary/aqc/aqc.py +175 -0
- qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
- qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
- qiskit/synthesis/unitary/qsd.py +288 -0
- qiskit/transpiler/__init__.py +1345 -0
- qiskit/transpiler/basepasses.py +190 -0
- qiskit/transpiler/coupling.py +500 -0
- qiskit/transpiler/exceptions.py +59 -0
- qiskit/transpiler/instruction_durations.py +281 -0
- qiskit/transpiler/layout.py +740 -0
- qiskit/transpiler/passes/__init__.py +276 -0
- qiskit/transpiler/passes/analysis/__init__.py +23 -0
- qiskit/transpiler/passes/analysis/count_ops.py +30 -0
- qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
- qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
- qiskit/transpiler/passes/analysis/depth.py +33 -0
- qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
- qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
- qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
- qiskit/transpiler/passes/analysis/size.py +36 -0
- qiskit/transpiler/passes/analysis/width.py +27 -0
- qiskit/transpiler/passes/basis/__init__.py +19 -0
- qiskit/transpiler/passes/basis/basis_translator.py +138 -0
- qiskit/transpiler/passes/basis/decompose.py +137 -0
- qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +84 -0
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +110 -0
- qiskit/transpiler/passes/layout/__init__.py +26 -0
- qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
- qiskit/transpiler/passes/layout/apply_layout.py +128 -0
- qiskit/transpiler/passes/layout/csp_layout.py +132 -0
- qiskit/transpiler/passes/layout/dense_layout.py +177 -0
- qiskit/transpiler/passes/layout/disjoint_utils.py +219 -0
- qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +116 -0
- qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
- qiskit/transpiler/passes/layout/sabre_layout.py +506 -0
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
- qiskit/transpiler/passes/layout/set_layout.py +69 -0
- qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
- qiskit/transpiler/passes/layout/vf2_layout.py +256 -0
- qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
- qiskit/transpiler/passes/layout/vf2_utils.py +235 -0
- qiskit/transpiler/passes/optimization/__init__.py +42 -0
- qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
- qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
- qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +117 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +109 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +85 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +242 -0
- qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
- qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
- qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +176 -0
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
- qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +267 -0
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +250 -0
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
- qiskit/transpiler/passes/optimization/optimize_annotated.py +449 -0
- qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
- qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
- qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
- qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +70 -0
- qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -0
- qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
- qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
- qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +639 -0
- qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
- qiskit/transpiler/passes/routing/__init__.py +21 -0
- qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
- qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
- qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
- qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
- qiskit/transpiler/passes/routing/basic_swap.py +166 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +397 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
- qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
- qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
- qiskit/transpiler/passes/routing/sabre_swap.py +463 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +408 -0
- qiskit/transpiler/passes/routing/utils.py +35 -0
- qiskit/transpiler/passes/scheduling/__init__.py +21 -0
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
- qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
- qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
- qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
- qiskit/transpiler/passes/synthesis/__init__.py +20 -0
- qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
- qiskit/transpiler/passes/synthesis/hls_plugins.py +1963 -0
- qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
- qiskit/transpiler/passes/synthesis/plugin.py +738 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +313 -0
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
- qiskit/transpiler/passes/utils/__init__.py +32 -0
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
- qiskit/transpiler/passes/utils/check_gate_direction.py +60 -0
- qiskit/transpiler/passes/utils/check_map.py +78 -0
- qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
- qiskit/transpiler/passes/utils/control_flow.py +61 -0
- qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
- qiskit/transpiler/passes/utils/error.py +69 -0
- qiskit/transpiler/passes/utils/filter_op_nodes.py +66 -0
- qiskit/transpiler/passes/utils/fixed_point.py +48 -0
- qiskit/transpiler/passes/utils/gate_direction.py +93 -0
- qiskit/transpiler/passes/utils/gates_basis.py +51 -0
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
- qiskit/transpiler/passes/utils/minimum_point.py +118 -0
- qiskit/transpiler/passes/utils/remove_barriers.py +50 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
- qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
- qiskit/transpiler/passmanager.py +503 -0
- qiskit/transpiler/passmanager_config.py +151 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +993 -0
- qiskit/transpiler/preset_passmanagers/common.py +672 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +437 -0
- qiskit/transpiler/preset_passmanagers/level0.py +104 -0
- qiskit/transpiler/preset_passmanagers/level1.py +108 -0
- qiskit/transpiler/preset_passmanagers/level2.py +109 -0
- qiskit/transpiler/preset_passmanagers/level3.py +110 -0
- qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
- qiskit/transpiler/target.py +905 -0
- qiskit/transpiler/timing_constraints.py +59 -0
- qiskit/user_config.py +266 -0
- qiskit/utils/__init__.py +90 -0
- qiskit/utils/classtools.py +146 -0
- qiskit/utils/deprecation.py +382 -0
- qiskit/utils/lazy_tester.py +363 -0
- qiskit/utils/optionals.py +354 -0
- qiskit/utils/parallel.py +318 -0
- qiskit/utils/units.py +146 -0
- qiskit/version.py +84 -0
- qiskit/visualization/__init__.py +290 -0
- qiskit/visualization/array.py +207 -0
- qiskit/visualization/bloch.py +778 -0
- qiskit/visualization/circuit/__init__.py +15 -0
- qiskit/visualization/circuit/_utils.py +675 -0
- qiskit/visualization/circuit/circuit_visualization.py +735 -0
- qiskit/visualization/circuit/latex.py +661 -0
- qiskit/visualization/circuit/matplotlib.py +2019 -0
- qiskit/visualization/circuit/qcstyle.py +278 -0
- qiskit/visualization/circuit/styles/__init__.py +13 -0
- qiskit/visualization/circuit/styles/bw.json +202 -0
- qiskit/visualization/circuit/styles/clifford.json +202 -0
- qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
- qiskit/visualization/circuit/styles/iqp.json +214 -0
- qiskit/visualization/circuit/styles/textbook.json +202 -0
- qiskit/visualization/circuit/text.py +1849 -0
- qiskit/visualization/circuit_visualization.py +19 -0
- qiskit/visualization/counts_visualization.py +487 -0
- qiskit/visualization/dag_visualization.py +318 -0
- qiskit/visualization/exceptions.py +21 -0
- qiskit/visualization/gate_map.py +1424 -0
- qiskit/visualization/library.py +40 -0
- qiskit/visualization/pass_manager_visualization.py +312 -0
- qiskit/visualization/state_visualization.py +1546 -0
- qiskit/visualization/timeline/__init__.py +21 -0
- qiskit/visualization/timeline/core.py +495 -0
- qiskit/visualization/timeline/drawings.py +260 -0
- qiskit/visualization/timeline/generators.py +506 -0
- qiskit/visualization/timeline/interface.py +444 -0
- qiskit/visualization/timeline/layouts.py +115 -0
- qiskit/visualization/timeline/plotters/__init__.py +16 -0
- qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
- qiskit/visualization/timeline/plotters/matplotlib.py +195 -0
- qiskit/visualization/timeline/stylesheet.py +301 -0
- qiskit/visualization/timeline/types.py +148 -0
- qiskit/visualization/transition_visualization.py +369 -0
- qiskit/visualization/utils.py +49 -0
- qiskit-2.0.3.dist-info/METADATA +220 -0
- qiskit-2.0.3.dist-info/RECORD +690 -0
- qiskit-2.0.3.dist-info/WHEEL +6 -0
- qiskit-2.0.3.dist-info/entry_points.txt +82 -0
- qiskit-2.0.3.dist-info/licenses/LICENSE.txt +203 -0
- qiskit-2.0.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,21 @@
|
|
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
|
+
Scheduled circuit visualization module.
|
15
|
+
"""
|
16
|
+
|
17
|
+
# interface
|
18
|
+
from qiskit.visualization.timeline.interface import draw
|
19
|
+
|
20
|
+
# stylesheets
|
21
|
+
from qiskit.visualization.timeline.stylesheet import IQXStandard, IQXSimple, IQXDebugging
|
@@ -0,0 +1,495 @@
|
|
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
|
+
Core module of the timeline drawer.
|
15
|
+
|
16
|
+
This module provides the `DrawerCanvas` which is a collection of drawings.
|
17
|
+
The canvas instance is not just a container of drawing objects, as it also performs
|
18
|
+
data processing like binding abstract coordinates.
|
19
|
+
|
20
|
+
|
21
|
+
Initialization
|
22
|
+
~~~~~~~~~~~~~~
|
23
|
+
The `DataCanvas` is not exposed to users as they are implicitly initialized in the
|
24
|
+
interface function. It is noteworthy that the data canvas is agnostic to plotters.
|
25
|
+
This means once the canvas instance is initialized we can reuse this data
|
26
|
+
among multiple plotters. The canvas is initialized with a stylesheet.
|
27
|
+
|
28
|
+
```python
|
29
|
+
canvas = DrawerCanvas(stylesheet=stylesheet)
|
30
|
+
canvas.load_program(sched)
|
31
|
+
canvas.update()
|
32
|
+
```
|
33
|
+
|
34
|
+
Once all properties are set, `.update` method is called to apply changes to drawings.
|
35
|
+
|
36
|
+
Update
|
37
|
+
~~~~~~
|
38
|
+
To update the image, a user can set new values to canvas and then call the `.update` method.
|
39
|
+
|
40
|
+
```python
|
41
|
+
canvas.set_time_range(2000, 3000)
|
42
|
+
canvas.update()
|
43
|
+
```
|
44
|
+
|
45
|
+
All stored drawings are updated accordingly. The plotter API can access to
|
46
|
+
drawings with `.collections` property of the canvas instance. This returns
|
47
|
+
an iterator of drawings with the unique data key.
|
48
|
+
If a plotter provides object handler for plotted shapes, the plotter API can manage
|
49
|
+
the lookup table of the handler and the drawings by using this data key.
|
50
|
+
"""
|
51
|
+
from __future__ import annotations
|
52
|
+
import warnings
|
53
|
+
from collections.abc import Iterator
|
54
|
+
from copy import deepcopy
|
55
|
+
from functools import partial
|
56
|
+
from enum import Enum
|
57
|
+
|
58
|
+
import numpy as np
|
59
|
+
|
60
|
+
from qiskit import circuit
|
61
|
+
from qiskit.transpiler.target import Target
|
62
|
+
from qiskit.visualization.exceptions import VisualizationError
|
63
|
+
from qiskit.visualization.timeline import drawings, types
|
64
|
+
from qiskit.visualization.timeline.stylesheet import QiskitTimelineStyle
|
65
|
+
|
66
|
+
|
67
|
+
class DrawerCanvas:
|
68
|
+
"""Data container for drawings."""
|
69
|
+
|
70
|
+
def __init__(self, stylesheet: QiskitTimelineStyle):
|
71
|
+
"""Create new data container."""
|
72
|
+
# stylesheet
|
73
|
+
self.formatter = stylesheet.formatter
|
74
|
+
self.generator = stylesheet.generator
|
75
|
+
self.layout = stylesheet.layout
|
76
|
+
|
77
|
+
# drawings
|
78
|
+
self._collections: dict[str, drawings.ElementaryData] = {}
|
79
|
+
self._output_dataset: dict[str, drawings.ElementaryData] = {}
|
80
|
+
|
81
|
+
# vertical offset of bits
|
82
|
+
self.bits: list[types.Bits] = []
|
83
|
+
self.assigned_coordinates: dict[types.Bits, float] = {}
|
84
|
+
|
85
|
+
# visible controls
|
86
|
+
self.disable_bits: set[types.Bits] = set()
|
87
|
+
self.disable_types: set[str] = set()
|
88
|
+
|
89
|
+
# time
|
90
|
+
self._time_range = (0, 0)
|
91
|
+
|
92
|
+
# graph height
|
93
|
+
self.vmax = 0
|
94
|
+
self.vmin = 0
|
95
|
+
|
96
|
+
@property
|
97
|
+
def time_range(self) -> tuple[int, int]:
|
98
|
+
"""Return current time range to draw.
|
99
|
+
|
100
|
+
Calculate net duration and add side margin to edge location.
|
101
|
+
|
102
|
+
Returns:
|
103
|
+
Time window considering side margin.
|
104
|
+
"""
|
105
|
+
t0, t1 = self._time_range
|
106
|
+
|
107
|
+
duration = t1 - t0
|
108
|
+
new_t0 = t0 - duration * self.formatter["margin.left_percent"]
|
109
|
+
new_t1 = t1 + duration * self.formatter["margin.right_percent"]
|
110
|
+
|
111
|
+
return new_t0, new_t1
|
112
|
+
|
113
|
+
@time_range.setter
|
114
|
+
def time_range(self, new_range: tuple[int, int]):
|
115
|
+
"""Update time range to draw."""
|
116
|
+
self._time_range = new_range
|
117
|
+
|
118
|
+
@property
|
119
|
+
def collections(self) -> Iterator[tuple[str, drawings.ElementaryData]]:
|
120
|
+
"""Return currently active entries from drawing data collection.
|
121
|
+
|
122
|
+
The object is returned with unique name as a key of an object handler.
|
123
|
+
When the horizontal coordinate contains `AbstractCoordinate`,
|
124
|
+
the value is substituted by current time range preference.
|
125
|
+
"""
|
126
|
+
yield from self._output_dataset.items()
|
127
|
+
|
128
|
+
def add_data(self, data: drawings.ElementaryData):
|
129
|
+
"""Add drawing to collections.
|
130
|
+
|
131
|
+
If the given object already exists in the collections,
|
132
|
+
this interface replaces the old object instead of adding new entry.
|
133
|
+
|
134
|
+
Args:
|
135
|
+
data: New drawing to add.
|
136
|
+
"""
|
137
|
+
if not self.formatter["control.show_clbits"]:
|
138
|
+
data.bits = [b for b in data.bits if not isinstance(b, circuit.Clbit)]
|
139
|
+
self._collections[data.data_key] = data
|
140
|
+
|
141
|
+
# pylint: disable=cyclic-import
|
142
|
+
def load_program(self, program: circuit.QuantumCircuit, target: Target | None = None):
|
143
|
+
"""Load quantum circuit and create drawing..
|
144
|
+
|
145
|
+
.. deprecated:: 1.3
|
146
|
+
Visualization of unscheduled circuits with the timeline drawer has been
|
147
|
+
deprecated in Qiskit 1.3.
|
148
|
+
This circuit should be transpiled with a scheduler, despite having instructions
|
149
|
+
with explicit durations.
|
150
|
+
|
151
|
+
.. deprecated:: 1.3
|
152
|
+
Targets with duration-less operations are going to error in Qiskit 2.0.
|
153
|
+
|
154
|
+
Args:
|
155
|
+
program: Scheduled circuit object to draw.
|
156
|
+
target: The target the circuit is scheduled for. This contains backend information
|
157
|
+
including the instruction durations used in scheduling.
|
158
|
+
|
159
|
+
Raises:
|
160
|
+
VisualizationError: When circuit is not scheduled.
|
161
|
+
"""
|
162
|
+
not_gate_like = (circuit.Barrier,)
|
163
|
+
|
164
|
+
if getattr(program, "_op_start_times") is None:
|
165
|
+
# Run scheduling for backward compatibility
|
166
|
+
from qiskit import transpile
|
167
|
+
from qiskit.transpiler import TranspilerError
|
168
|
+
|
169
|
+
warnings.warn(
|
170
|
+
"Visualizing un-scheduled circuit with timeline drawer has been deprecated. "
|
171
|
+
"This circuit should be transpiled with scheduler though it consists of "
|
172
|
+
"instructions with explicit durations.",
|
173
|
+
DeprecationWarning,
|
174
|
+
stacklevel=3,
|
175
|
+
)
|
176
|
+
|
177
|
+
try:
|
178
|
+
program = transpile(
|
179
|
+
program,
|
180
|
+
scheduling_method="alap",
|
181
|
+
target=target,
|
182
|
+
optimization_level=0,
|
183
|
+
)
|
184
|
+
except TranspilerError as ex:
|
185
|
+
raise VisualizationError(
|
186
|
+
f"Input circuit {program.name} is not scheduled and it contains "
|
187
|
+
"operations with unknown delays. This cannot be visualized."
|
188
|
+
) from ex
|
189
|
+
|
190
|
+
for t0, instruction in zip(program.op_start_times, program.data):
|
191
|
+
bits = list(instruction.qubits) + list(instruction.clbits)
|
192
|
+
for bit_pos, bit in enumerate(bits):
|
193
|
+
if not isinstance(instruction.operation, not_gate_like):
|
194
|
+
# Generate draw object for gates
|
195
|
+
if target is not None:
|
196
|
+
duration = None
|
197
|
+
op_props = target.get(instruction.operation.name)
|
198
|
+
if op_props is not None:
|
199
|
+
inst_props = op_props.get(
|
200
|
+
tuple(program.find_bit(x).index for x in instruction.qubits)
|
201
|
+
)
|
202
|
+
if inst_props is not None:
|
203
|
+
duration = getattr(inst_props, "duration")
|
204
|
+
if duration is not None:
|
205
|
+
duration = target.seconds_to_dt(duration)
|
206
|
+
|
207
|
+
if instruction.name == "delay":
|
208
|
+
duration = instruction.operation.duration
|
209
|
+
if duration is None:
|
210
|
+
# Warn here because an incomplete target isn't obvious most of the time
|
211
|
+
raise VisualizationError(
|
212
|
+
"Target doesn't contain a duration for "
|
213
|
+
f"{instruction.operation.name} on {bit_pos}."
|
214
|
+
)
|
215
|
+
elif instruction.name == "delay":
|
216
|
+
duration = instruction.operation.duration
|
217
|
+
else:
|
218
|
+
raise VisualizationError(
|
219
|
+
"Target not specified this is required to provide instruction timing"
|
220
|
+
)
|
221
|
+
gate_source = types.ScheduledGate(
|
222
|
+
t0=t0,
|
223
|
+
operand=instruction.operation,
|
224
|
+
duration=duration,
|
225
|
+
bits=bits,
|
226
|
+
bit_position=bit_pos,
|
227
|
+
)
|
228
|
+
for gen in self.generator["gates"]:
|
229
|
+
if getattr(gen, "accepts_program", False):
|
230
|
+
gen = partial(gen, program=program)
|
231
|
+
for datum in gen(gate_source, formatter=self.formatter):
|
232
|
+
self.add_data(datum)
|
233
|
+
if len(bits) > 1 and bit_pos == 0:
|
234
|
+
# Generate draw object for gate-gate link
|
235
|
+
line_pos = t0 + 0.5 * duration
|
236
|
+
link_source = types.GateLink(
|
237
|
+
t0=line_pos, opname=instruction.operation.name, bits=bits
|
238
|
+
)
|
239
|
+
for gen in self.generator["gate_links"]:
|
240
|
+
if getattr(gen, "accepts_program", False):
|
241
|
+
gen = partial(gen, program=program)
|
242
|
+
for datum in gen(link_source, formatter=self.formatter):
|
243
|
+
self.add_data(datum)
|
244
|
+
if isinstance(instruction.operation, circuit.Barrier):
|
245
|
+
# Generate draw object for barrier
|
246
|
+
barrier_source = types.Barrier(t0=t0, bits=bits, bit_position=bit_pos)
|
247
|
+
for gen in self.generator["barriers"]:
|
248
|
+
if getattr(gen, "accepts_program", False):
|
249
|
+
gen = partial(gen, program=program)
|
250
|
+
for datum in gen(barrier_source, formatter=self.formatter):
|
251
|
+
self.add_data(datum)
|
252
|
+
|
253
|
+
self.bits = list(program.qubits) + list(program.clbits)
|
254
|
+
for bit in self.bits:
|
255
|
+
for gen in self.generator["bits"]:
|
256
|
+
# Generate draw objects for bit
|
257
|
+
if getattr(gen, "accepts_program", False):
|
258
|
+
gen = partial(gen, program=program)
|
259
|
+
for datum in gen(bit, formatter=self.formatter):
|
260
|
+
self.add_data(datum)
|
261
|
+
|
262
|
+
# update time range
|
263
|
+
t_end = max(program._duration, self.formatter["margin.minimum_duration"])
|
264
|
+
self.set_time_range(t_start=0, t_end=t_end)
|
265
|
+
|
266
|
+
def set_time_range(self, t_start: int, t_end: int):
|
267
|
+
"""Set time range to draw.
|
268
|
+
|
269
|
+
Args:
|
270
|
+
t_start: Left boundary of drawing in units of cycle time.
|
271
|
+
t_end: Right boundary of drawing in units of cycle time.
|
272
|
+
"""
|
273
|
+
self.time_range = (t_start, t_end)
|
274
|
+
|
275
|
+
def set_disable_bits(self, bit: types.Bits, remove: bool = True):
|
276
|
+
"""Interface method to control visibility of bits.
|
277
|
+
|
278
|
+
Specified object in the blocked list will not be shown.
|
279
|
+
|
280
|
+
Args:
|
281
|
+
bit: A qubit or classical bit object to disable.
|
282
|
+
remove: Set `True` to disable, set `False` to enable.
|
283
|
+
"""
|
284
|
+
if remove:
|
285
|
+
self.disable_bits.add(bit)
|
286
|
+
else:
|
287
|
+
self.disable_bits.discard(bit)
|
288
|
+
|
289
|
+
def set_disable_type(self, data_type: types.DataTypes, remove: bool = True):
|
290
|
+
"""Interface method to control visibility of data types.
|
291
|
+
|
292
|
+
Specified object in the blocked list will not be shown.
|
293
|
+
|
294
|
+
Args:
|
295
|
+
data_type: A drawing data type to disable.
|
296
|
+
remove: Set `True` to disable, set `False` to enable.
|
297
|
+
"""
|
298
|
+
if isinstance(data_type, Enum):
|
299
|
+
data_type_str = str(data_type.value)
|
300
|
+
else:
|
301
|
+
data_type_str = data_type
|
302
|
+
|
303
|
+
if remove:
|
304
|
+
self.disable_types.add(data_type_str)
|
305
|
+
else:
|
306
|
+
self.disable_types.discard(data_type_str)
|
307
|
+
|
308
|
+
def update(self):
|
309
|
+
"""Update all collections.
|
310
|
+
|
311
|
+
This method should be called before the canvas is passed to the plotter.
|
312
|
+
"""
|
313
|
+
self._output_dataset.clear()
|
314
|
+
self.assigned_coordinates.clear()
|
315
|
+
|
316
|
+
# update coordinate
|
317
|
+
y0 = -self.formatter["margin.top"]
|
318
|
+
for bit in self.layout["bit_arrange"](self.bits):
|
319
|
+
# remove classical bit
|
320
|
+
if isinstance(bit, circuit.Clbit) and not self.formatter["control.show_clbits"]:
|
321
|
+
continue
|
322
|
+
# remove idle bit
|
323
|
+
if not self._check_bit_visible(bit):
|
324
|
+
continue
|
325
|
+
offset = y0 - 0.5
|
326
|
+
self.assigned_coordinates[bit] = offset
|
327
|
+
y0 = offset - 0.5
|
328
|
+
self.vmax = 0
|
329
|
+
self.vmin = y0 - self.formatter["margin.bottom"]
|
330
|
+
|
331
|
+
# add data
|
332
|
+
temp_gate_links = {}
|
333
|
+
temp_data = {}
|
334
|
+
for data_key, data in self._collections.items():
|
335
|
+
# deep copy to keep original data hash
|
336
|
+
new_data = deepcopy(data)
|
337
|
+
new_data.xvals = self._bind_coordinate(data.xvals)
|
338
|
+
new_data.yvals = self._bind_coordinate(data.yvals)
|
339
|
+
if data.data_type == str(types.LineType.GATE_LINK.value):
|
340
|
+
temp_gate_links[data_key] = new_data
|
341
|
+
else:
|
342
|
+
temp_data[data_key] = new_data
|
343
|
+
|
344
|
+
# update horizontal offset of gate links
|
345
|
+
temp_data.update(self._check_link_overlap(temp_gate_links))
|
346
|
+
|
347
|
+
# push valid data
|
348
|
+
for data_key, data in temp_data.items():
|
349
|
+
if self._check_data_visible(data):
|
350
|
+
self._output_dataset[data_key] = data
|
351
|
+
|
352
|
+
def _check_data_visible(self, data: drawings.ElementaryData) -> bool:
|
353
|
+
"""A helper function to check if the data is visible.
|
354
|
+
|
355
|
+
Args:
|
356
|
+
data: Drawing object to test.
|
357
|
+
|
358
|
+
Returns:
|
359
|
+
Return `True` if the data is visible.
|
360
|
+
"""
|
361
|
+
_barriers = [str(types.LineType.BARRIER.value)]
|
362
|
+
|
363
|
+
_delays = [str(types.BoxType.DELAY.value), str(types.LabelType.DELAY.value)]
|
364
|
+
|
365
|
+
def _time_range_check(_data):
|
366
|
+
"""If data is located outside the current time range."""
|
367
|
+
t0, t1 = self.time_range
|
368
|
+
if np.max(_data.xvals) < t0 or np.min(_data.xvals) > t1:
|
369
|
+
return False
|
370
|
+
return True
|
371
|
+
|
372
|
+
def _associated_bit_check(_data):
|
373
|
+
"""If any associated bit is not shown."""
|
374
|
+
if all(bit not in self.assigned_coordinates for bit in _data.bits):
|
375
|
+
return False
|
376
|
+
return True
|
377
|
+
|
378
|
+
def _data_check(_data):
|
379
|
+
"""If data is valid."""
|
380
|
+
if _data.data_type == str(types.LineType.GATE_LINK.value):
|
381
|
+
active_bits = [bit for bit in _data.bits if bit not in self.disable_bits]
|
382
|
+
if len(active_bits) < 2:
|
383
|
+
return False
|
384
|
+
elif _data.data_type in _barriers and not self.formatter["control.show_barriers"]:
|
385
|
+
return False
|
386
|
+
elif _data.data_type in _delays and not self.formatter["control.show_delays"]:
|
387
|
+
return False
|
388
|
+
return True
|
389
|
+
|
390
|
+
checks = [_time_range_check, _associated_bit_check, _data_check]
|
391
|
+
if all(check(data) for check in checks):
|
392
|
+
return True
|
393
|
+
|
394
|
+
return False
|
395
|
+
|
396
|
+
def _check_bit_visible(self, bit: types.Bits) -> bool:
|
397
|
+
"""A helper function to check if the bit is visible.
|
398
|
+
|
399
|
+
Args:
|
400
|
+
bit: Bit object to test.
|
401
|
+
|
402
|
+
Returns:
|
403
|
+
Return `True` if the bit is visible.
|
404
|
+
"""
|
405
|
+
_gates = [str(types.BoxType.SCHED_GATE.value), str(types.SymbolType.FRAME.value)]
|
406
|
+
|
407
|
+
if bit in self.disable_bits:
|
408
|
+
return False
|
409
|
+
|
410
|
+
if self.formatter["control.show_idle"]:
|
411
|
+
return True
|
412
|
+
|
413
|
+
for data in self._collections.values():
|
414
|
+
if bit in data.bits and data.data_type in _gates:
|
415
|
+
return True
|
416
|
+
return False
|
417
|
+
|
418
|
+
def _bind_coordinate(self, vals: Iterator[types.Coordinate]) -> np.ndarray:
|
419
|
+
"""A helper function to bind actual coordinates to an `AbstractCoordinate`.
|
420
|
+
|
421
|
+
Args:
|
422
|
+
vals: Sequence of coordinate objects associated with a drawing.
|
423
|
+
|
424
|
+
Returns:
|
425
|
+
Numpy data array with substituted values.
|
426
|
+
"""
|
427
|
+
|
428
|
+
def substitute(val: types.Coordinate):
|
429
|
+
if val == types.AbstractCoordinate.LEFT:
|
430
|
+
return self.time_range[0]
|
431
|
+
if val == types.AbstractCoordinate.RIGHT:
|
432
|
+
return self.time_range[1]
|
433
|
+
if val == types.AbstractCoordinate.TOP:
|
434
|
+
return self.vmax
|
435
|
+
if val == types.AbstractCoordinate.BOTTOM:
|
436
|
+
return self.vmin
|
437
|
+
raise VisualizationError(f"Coordinate {val} is not supported.")
|
438
|
+
|
439
|
+
try:
|
440
|
+
return np.asarray(vals, dtype=float)
|
441
|
+
except TypeError:
|
442
|
+
return np.asarray(list(map(substitute, vals)), dtype=float)
|
443
|
+
|
444
|
+
def _check_link_overlap(
|
445
|
+
self, links: dict[str, drawings.GateLinkData]
|
446
|
+
) -> dict[str, drawings.GateLinkData]:
|
447
|
+
"""Helper method to check overlap of bit links.
|
448
|
+
|
449
|
+
This method dynamically shifts horizontal position of links if they are overlapped.
|
450
|
+
"""
|
451
|
+
duration = self.time_range[1] - self.time_range[0]
|
452
|
+
allowed_overlap = self.formatter["margin.link_interval_percent"] * duration
|
453
|
+
|
454
|
+
# return y coordinates
|
455
|
+
def y_coords(link: drawings.GateLinkData):
|
456
|
+
return np.array([self.assigned_coordinates.get(bit, np.nan) for bit in link.bits])
|
457
|
+
|
458
|
+
# group overlapped links
|
459
|
+
overlapped_group: list[list[str]] = []
|
460
|
+
data_keys = list(links.keys())
|
461
|
+
while len(data_keys) > 0:
|
462
|
+
ref_key = data_keys.pop()
|
463
|
+
overlaps = set()
|
464
|
+
overlaps.add(ref_key)
|
465
|
+
for key in data_keys[::-1]:
|
466
|
+
# check horizontal overlap
|
467
|
+
if np.abs(links[ref_key].xvals[0] - links[key].xvals[0]) < allowed_overlap:
|
468
|
+
# check vertical overlap
|
469
|
+
y0s = y_coords(links[ref_key])
|
470
|
+
y1s = y_coords(links[key])
|
471
|
+
v1 = np.nanmin(y0s) - np.nanmin(y1s)
|
472
|
+
v2 = np.nanmax(y0s) - np.nanmax(y1s)
|
473
|
+
v3 = np.nanmin(y0s) - np.nanmax(y1s)
|
474
|
+
v4 = np.nanmax(y0s) - np.nanmin(y1s)
|
475
|
+
if not (v1 * v2 > 0 and v3 * v4 > 0):
|
476
|
+
overlaps.add(data_keys.pop(data_keys.index(key)))
|
477
|
+
overlapped_group.append(list(overlaps))
|
478
|
+
|
479
|
+
# renew horizontal offset
|
480
|
+
new_links = {}
|
481
|
+
for overlaps in overlapped_group:
|
482
|
+
if len(overlaps) > 1:
|
483
|
+
xpos_mean = np.mean([links[key].xvals[0] for key in overlaps])
|
484
|
+
# sort link key by y position
|
485
|
+
sorted_keys = sorted(overlaps, key=lambda x: np.nanmax(y_coords(links[x])))
|
486
|
+
x0 = xpos_mean - 0.5 * allowed_overlap * (len(overlaps) - 1)
|
487
|
+
for ind, key in enumerate(sorted_keys):
|
488
|
+
data = links[key]
|
489
|
+
data.xvals = [x0 + ind * allowed_overlap]
|
490
|
+
new_links[key] = data
|
491
|
+
else:
|
492
|
+
key = overlaps[0]
|
493
|
+
new_links[key] = links[key]
|
494
|
+
|
495
|
+
return {key: new_links[key] for key in links.keys()}
|