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,100 @@
|
|
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
|
+
"""ASAP Scheduling."""
|
14
|
+
from qiskit.circuit import Measure
|
15
|
+
from qiskit.transpiler.exceptions import TranspilerError
|
16
|
+
|
17
|
+
from qiskit.transpiler.passes.scheduling.scheduling.base_scheduler import BaseScheduler
|
18
|
+
|
19
|
+
|
20
|
+
class ASAPScheduleAnalysis(BaseScheduler):
|
21
|
+
"""ASAP Scheduling pass, which schedules the start time of instructions as early as possible.
|
22
|
+
|
23
|
+
See the :ref:`transpiler-scheduling-description` section in the :mod:`qiskit.transpiler`
|
24
|
+
module documentation for a more detailed description.
|
25
|
+
"""
|
26
|
+
|
27
|
+
def run(self, dag):
|
28
|
+
"""Run the ASAPSchedule pass on `dag`.
|
29
|
+
|
30
|
+
Args:
|
31
|
+
dag (DAGCircuit): DAG to schedule.
|
32
|
+
|
33
|
+
Returns:
|
34
|
+
DAGCircuit: A scheduled DAG.
|
35
|
+
|
36
|
+
Raises:
|
37
|
+
TranspilerError: if the circuit is not mapped on physical qubits.
|
38
|
+
TranspilerError: if conditional bit is added to non-supported instruction.
|
39
|
+
"""
|
40
|
+
if len(dag.qregs) != 1 or dag.qregs.get("q", None) is None:
|
41
|
+
raise TranspilerError("ASAP schedule runs on physical circuits only")
|
42
|
+
if self.property_set["time_unit"] == "stretch":
|
43
|
+
raise TranspilerError("Scheduling cannot run on circuits with stretch durations.")
|
44
|
+
|
45
|
+
clbit_write_latency = self.property_set.get("clbit_write_latency", 0)
|
46
|
+
|
47
|
+
node_start_time = {}
|
48
|
+
idle_after = {q: 0 for q in dag.qubits + dag.clbits}
|
49
|
+
for node in dag.topological_op_nodes():
|
50
|
+
op_duration = self._get_node_duration(node, dag)
|
51
|
+
|
52
|
+
# compute t0, t1: instruction interval, note that
|
53
|
+
# t0: start time of instruction
|
54
|
+
# t1: end time of instruction
|
55
|
+
if isinstance(node.op, self.CONDITIONAL_SUPPORTED):
|
56
|
+
t0q = max(idle_after[q] for q in node.qargs)
|
57
|
+
t0 = t0q
|
58
|
+
t1 = t0 + op_duration
|
59
|
+
else:
|
60
|
+
if isinstance(node.op, Measure):
|
61
|
+
# measure instruction handling is bit tricky due to clbit_write_latency
|
62
|
+
t0q = max(idle_after[q] for q in node.qargs)
|
63
|
+
t0c = max(idle_after[c] for c in node.cargs)
|
64
|
+
# Assume following case (t0c > t0q)
|
65
|
+
#
|
66
|
+
# |t0q
|
67
|
+
# Q ▒▒▒▒░░░░░░░░░░░░
|
68
|
+
# C ▒▒▒▒▒▒▒▒░░░░░░░░
|
69
|
+
# |t0c
|
70
|
+
#
|
71
|
+
# In this case, there is no actual clbit access until clbit_write_latency.
|
72
|
+
# The node t0 can be push backward by this amount.
|
73
|
+
#
|
74
|
+
# |t0q' = t0c - clbit_write_latency
|
75
|
+
# Q ▒▒▒▒░░▒▒▒▒▒▒▒▒▒▒
|
76
|
+
# C ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
|
77
|
+
# |t0c' = t0c
|
78
|
+
#
|
79
|
+
# rather than naively doing
|
80
|
+
#
|
81
|
+
# |t0q' = t0c
|
82
|
+
# Q ▒▒▒▒░░░░▒▒▒▒▒▒▒▒
|
83
|
+
# C ▒▒▒▒▒▒▒▒░░░▒▒▒▒▒
|
84
|
+
# |t0c' = t0c + clbit_write_latency
|
85
|
+
#
|
86
|
+
t0 = max(t0q, t0c - clbit_write_latency)
|
87
|
+
t1 = t0 + op_duration
|
88
|
+
for clbit in node.cargs:
|
89
|
+
idle_after[clbit] = t1
|
90
|
+
else:
|
91
|
+
# It happens to be directives such as barrier
|
92
|
+
t0 = max(idle_after[bit] for bit in node.qargs + node.cargs)
|
93
|
+
t1 = t0 + op_duration
|
94
|
+
|
95
|
+
for bit in node.qargs:
|
96
|
+
idle_after[bit] = t1
|
97
|
+
|
98
|
+
node_start_time[node] = t0
|
99
|
+
|
100
|
+
self.property_set["node_start_time"] = node_start_time
|
@@ -0,0 +1,88 @@
|
|
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
|
+
"""Base circuit scheduling pass."""
|
14
|
+
|
15
|
+
import warnings
|
16
|
+
|
17
|
+
from qiskit.circuit import Delay, Gate
|
18
|
+
from qiskit.circuit.parameterexpression import ParameterExpression
|
19
|
+
from qiskit.dagcircuit import DAGOpNode, DAGCircuit
|
20
|
+
from qiskit.transpiler.basepasses import AnalysisPass
|
21
|
+
from qiskit.transpiler.exceptions import TranspilerError
|
22
|
+
from qiskit.transpiler.instruction_durations import InstructionDurations
|
23
|
+
from qiskit.transpiler.passes.scheduling.time_unit_conversion import TimeUnitConversion
|
24
|
+
from qiskit.transpiler.target import Target
|
25
|
+
|
26
|
+
|
27
|
+
class BaseScheduler(AnalysisPass):
|
28
|
+
"""Base scheduler pass."""
|
29
|
+
|
30
|
+
CONDITIONAL_SUPPORTED = (Gate, Delay)
|
31
|
+
|
32
|
+
def __init__(self, durations: InstructionDurations = None, target: Target = None):
|
33
|
+
"""Scheduler initializer.
|
34
|
+
|
35
|
+
Args:
|
36
|
+
durations: Durations of instructions to be used in scheduling
|
37
|
+
target: The :class:`~.Target` representing the target backend, if both
|
38
|
+
``durations`` and this are specified then this argument will take
|
39
|
+
precedence and ``durations`` will be ignored.
|
40
|
+
|
41
|
+
"""
|
42
|
+
super().__init__()
|
43
|
+
self.durations = durations
|
44
|
+
if target is not None:
|
45
|
+
self.durations = target.durations()
|
46
|
+
|
47
|
+
# Ensure op node durations are attached and in consistent unit
|
48
|
+
self.requires.append(TimeUnitConversion(inst_durations=durations, target=target))
|
49
|
+
|
50
|
+
# Initialize timeslot
|
51
|
+
if "node_start_time" in self.property_set:
|
52
|
+
warnings.warn(
|
53
|
+
"This circuit has been already scheduled. "
|
54
|
+
"The output of previous scheduling pass will be overridden.",
|
55
|
+
UserWarning,
|
56
|
+
)
|
57
|
+
self.property_set["node_start_time"] = {}
|
58
|
+
|
59
|
+
def _get_node_duration(
|
60
|
+
self,
|
61
|
+
node: DAGOpNode,
|
62
|
+
dag: DAGCircuit,
|
63
|
+
) -> int:
|
64
|
+
"""A helper method to get duration from node"""
|
65
|
+
indices = [dag.find_bit(qarg).index for qarg in node.qargs]
|
66
|
+
|
67
|
+
if node.name == "delay":
|
68
|
+
# `TimeUnitConversion` already handled the unit conversions.
|
69
|
+
duration = node.op.duration
|
70
|
+
else:
|
71
|
+
unit = "s" if self.durations.dt is None else "dt"
|
72
|
+
try:
|
73
|
+
duration = self.durations.get(node.name, indices, unit=unit)
|
74
|
+
except TranspilerError:
|
75
|
+
duration = None
|
76
|
+
|
77
|
+
if isinstance(duration, ParameterExpression):
|
78
|
+
raise TranspilerError(
|
79
|
+
f"Parameterized duration ({duration}) "
|
80
|
+
f"of {node.op.name} on qubits {indices} is not bounded."
|
81
|
+
)
|
82
|
+
if duration is None:
|
83
|
+
raise TranspilerError(f"Duration of {node.op.name} on qubits {indices} is not found.")
|
84
|
+
|
85
|
+
return duration
|
86
|
+
|
87
|
+
def run(self, dag: DAGCircuit):
|
88
|
+
raise NotImplementedError
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2022.
|
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
|
+
"""Set classical IO latency information to circuit."""
|
13
|
+
|
14
|
+
from qiskit.transpiler.basepasses import AnalysisPass
|
15
|
+
from qiskit.dagcircuit import DAGCircuit
|
16
|
+
|
17
|
+
|
18
|
+
class SetIOLatency(AnalysisPass):
|
19
|
+
"""Set IOLatency information to the input circuit.
|
20
|
+
|
21
|
+
The ``clbit_write_latency`` and ``conditional_latency`` are added to
|
22
|
+
the property set of pass manager. This information can be shared among the passes
|
23
|
+
that perform scheduling on instructions acting on classical registers.
|
24
|
+
|
25
|
+
Once these latencies are added to the property set, this information
|
26
|
+
is also copied to the output circuit object as protected attributes,
|
27
|
+
so that it can be utilized outside the transpilation,
|
28
|
+
for example, the timeline visualization can use latency to accurately show
|
29
|
+
time occupation by instructions on the classical registers.
|
30
|
+
"""
|
31
|
+
|
32
|
+
def __init__(
|
33
|
+
self,
|
34
|
+
clbit_write_latency: int = 0,
|
35
|
+
conditional_latency: int = 0,
|
36
|
+
):
|
37
|
+
"""Create pass with latency information.
|
38
|
+
|
39
|
+
Args:
|
40
|
+
clbit_write_latency: A control flow constraints. Because standard superconducting
|
41
|
+
quantum processor implement dispersive QND readout, the actual data transfer
|
42
|
+
to the clbit happens after the round-trip stimulus signal is buffered
|
43
|
+
and discriminated into quantum state.
|
44
|
+
The interval ``[t0, t0 + clbit_write_latency]`` is regarded as idle time
|
45
|
+
for clbits associated with the measure instruction.
|
46
|
+
This defaults to 0 dt which is identical to Qiskit Pulse scheduler.
|
47
|
+
conditional_latency: A control flow constraints. This value represents
|
48
|
+
a latency of reading a classical register for the conditional operation.
|
49
|
+
The gate operation occurs after this latency. This appears as a delay
|
50
|
+
in front of the DAGOpNode of the gate.
|
51
|
+
This defaults to 0 dt.
|
52
|
+
"""
|
53
|
+
super().__init__()
|
54
|
+
self._conditional_latency = conditional_latency
|
55
|
+
self._clbit_write_latency = clbit_write_latency
|
56
|
+
|
57
|
+
def run(self, dag: DAGCircuit):
|
58
|
+
"""Add IO latency information.
|
59
|
+
|
60
|
+
Args:
|
61
|
+
dag: Input DAG circuit.
|
62
|
+
"""
|
63
|
+
self.property_set["conditional_latency"] = self._conditional_latency
|
64
|
+
self.property_set["clbit_write_latency"] = self._clbit_write_latency
|
@@ -0,0 +1,237 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2021, 2024.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Unify time unit in circuit for scheduling and following passes."""
|
14
|
+
from typing import Set
|
15
|
+
|
16
|
+
from qiskit.circuit import Delay, Duration
|
17
|
+
from qiskit.circuit.classical import expr
|
18
|
+
from qiskit.circuit.duration import duration_in_dt
|
19
|
+
from qiskit.dagcircuit import DAGCircuit
|
20
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
21
|
+
from qiskit.transpiler.exceptions import TranspilerError
|
22
|
+
from qiskit.transpiler.instruction_durations import InstructionDurations
|
23
|
+
from qiskit.transpiler.target import Target
|
24
|
+
from qiskit.utils import apply_prefix
|
25
|
+
|
26
|
+
|
27
|
+
class TimeUnitConversion(TransformationPass):
|
28
|
+
"""Choose a time unit to be used in the following time-aware passes,
|
29
|
+
and make all circuit time units consistent with that.
|
30
|
+
|
31
|
+
This pass will add a :attr:`.Instruction.duration` metadata to each op whose duration is known
|
32
|
+
which will be used by subsequent scheduling passes for scheduling.
|
33
|
+
|
34
|
+
If ``dt`` (in seconds) is known to transpiler, the unit ``'dt'`` is chosen. Otherwise,
|
35
|
+
the unit to be selected depends on what units are used in delays and instruction durations:
|
36
|
+
|
37
|
+
* ``'s'``: if they are all in SI units.
|
38
|
+
* ``'dt'``: if they are all in the unit ``'dt'``.
|
39
|
+
* raise error: if they are a mix of SI units and ``'dt'``.
|
40
|
+
"""
|
41
|
+
|
42
|
+
def __init__(self, inst_durations: InstructionDurations = None, target: Target = None):
|
43
|
+
"""TimeUnitAnalysis initializer.
|
44
|
+
|
45
|
+
Args:
|
46
|
+
inst_durations (InstructionDurations): A dictionary of durations of instructions.
|
47
|
+
target: The :class:`~.Target` representing the target backend, if both
|
48
|
+
``inst_durations`` and ``target`` are specified then this argument will take
|
49
|
+
precedence and ``inst_durations`` will be ignored.
|
50
|
+
|
51
|
+
|
52
|
+
"""
|
53
|
+
super().__init__()
|
54
|
+
self.inst_durations = inst_durations or InstructionDurations()
|
55
|
+
if target is not None:
|
56
|
+
# The priority order for instruction durations is: target > standalone.
|
57
|
+
self.inst_durations = target.durations()
|
58
|
+
self._durations_provided = inst_durations is not None or target is not None
|
59
|
+
|
60
|
+
def run(self, dag: DAGCircuit):
|
61
|
+
"""Run the TimeUnitAnalysis pass on `dag`.
|
62
|
+
|
63
|
+
Args:
|
64
|
+
dag (DAGCircuit): DAG to be checked.
|
65
|
+
|
66
|
+
Returns:
|
67
|
+
DAGCircuit: DAG with consistent timing and op nodes annotated with duration.
|
68
|
+
|
69
|
+
Raises:
|
70
|
+
TranspilerError: if the units are not unifiable
|
71
|
+
"""
|
72
|
+
|
73
|
+
inst_durations = InstructionDurations()
|
74
|
+
if self._durations_provided:
|
75
|
+
inst_durations.update(self.inst_durations, getattr(self.inst_durations, "dt", None))
|
76
|
+
|
77
|
+
# The float-value converted units for delay expressions, either all in 'dt'
|
78
|
+
# or all in seconds.
|
79
|
+
expression_durations = {}
|
80
|
+
|
81
|
+
# Choose unit
|
82
|
+
has_dt = False
|
83
|
+
has_si = False
|
84
|
+
|
85
|
+
# We _always_ need to traverse duration expressions to convert them to
|
86
|
+
# a float. But we also use the opportunity to note if they intermix cycles
|
87
|
+
# and wall-time, in case we don't have a `dt` to use to unify all instruction
|
88
|
+
# durations.
|
89
|
+
for node in dag.op_nodes(op=Delay):
|
90
|
+
if isinstance(node.op.duration, expr.Expr):
|
91
|
+
if any(
|
92
|
+
isinstance(x, expr.Stretch) for x in expr.iter_identifiers(node.op.duration)
|
93
|
+
):
|
94
|
+
# If any of the delays use a stretch expression, we can't run scheduling
|
95
|
+
# passes anyway, so we bail out. In theory, we _could_ still traverse
|
96
|
+
# through the stretch expression and replace any Duration value nodes it may
|
97
|
+
# contain with ones of the same units, but it'd be complex and probably unuseful.
|
98
|
+
self.property_set["time_unit"] = "stretch"
|
99
|
+
return dag
|
100
|
+
|
101
|
+
visitor = _EvalDurationImpl(inst_durations.dt)
|
102
|
+
duration = node.op.duration.accept(visitor)
|
103
|
+
if visitor.in_cycles():
|
104
|
+
has_dt = True
|
105
|
+
# We need to round in case the expression evaluated to a non-integral 'dt'.
|
106
|
+
duration = duration_in_dt(duration, 1.0)
|
107
|
+
else:
|
108
|
+
has_si = True
|
109
|
+
if duration < 0:
|
110
|
+
raise TranspilerError(
|
111
|
+
f"Expression '{node.op.duration}' resolves to a negative duration!"
|
112
|
+
)
|
113
|
+
expression_durations[node._node_id] = duration
|
114
|
+
else:
|
115
|
+
if node.op.unit == "dt":
|
116
|
+
has_dt = True
|
117
|
+
else:
|
118
|
+
has_si = True
|
119
|
+
if inst_durations.dt is None and has_dt and has_si:
|
120
|
+
raise TranspilerError(
|
121
|
+
"Fail to unify time units in delays. SI units "
|
122
|
+
"and dt unit must not be mixed when dt is not supplied."
|
123
|
+
)
|
124
|
+
|
125
|
+
if inst_durations.dt is None:
|
126
|
+
# Check what units are used in other instructions: dt or SI or mixed
|
127
|
+
units_other = inst_durations.units_used()
|
128
|
+
unified_unit = self._unified(units_other)
|
129
|
+
has_si = has_si or unified_unit in {"SI", "mixed"}
|
130
|
+
has_dt = has_dt or unified_unit in {"dt", "mixed"}
|
131
|
+
if has_si and has_dt:
|
132
|
+
raise TranspilerError(
|
133
|
+
"Fail to unify time units. SI units "
|
134
|
+
"and dt unit must not be mixed when dt is not supplied."
|
135
|
+
)
|
136
|
+
if has_si:
|
137
|
+
time_unit = "s"
|
138
|
+
else:
|
139
|
+
# Either dt units were used or no units were used and we
|
140
|
+
# default to dt
|
141
|
+
time_unit = "dt"
|
142
|
+
else:
|
143
|
+
time_unit = "dt"
|
144
|
+
|
145
|
+
# Make instructions with local durations consistent.
|
146
|
+
for node in dag.op_nodes(Delay):
|
147
|
+
op = node.op.to_mutable()
|
148
|
+
if node._node_id in expression_durations:
|
149
|
+
op.duration = expression_durations[node._node_id]
|
150
|
+
else:
|
151
|
+
op.duration = inst_durations._convert_unit(op.duration, op.unit, time_unit)
|
152
|
+
op.unit = time_unit
|
153
|
+
dag.substitute_node(node, op)
|
154
|
+
|
155
|
+
self.property_set["time_unit"] = time_unit
|
156
|
+
return dag
|
157
|
+
|
158
|
+
@staticmethod
|
159
|
+
def _unified(unit_set: Set[str]) -> str:
|
160
|
+
if not unit_set:
|
161
|
+
return "none"
|
162
|
+
|
163
|
+
if len(unit_set) == 1 and "dt" in unit_set:
|
164
|
+
return "dt"
|
165
|
+
|
166
|
+
all_si = True
|
167
|
+
for unit in unit_set:
|
168
|
+
if not unit.endswith("s"):
|
169
|
+
all_si = False
|
170
|
+
break
|
171
|
+
|
172
|
+
if all_si:
|
173
|
+
return "SI"
|
174
|
+
|
175
|
+
return "mixed"
|
176
|
+
|
177
|
+
|
178
|
+
class _EvalDurationImpl(expr.ExprVisitor[float]):
|
179
|
+
"""Evaluates the expression to a single float result.
|
180
|
+
|
181
|
+
If ``dt`` is provided or all durations are already in ``dt``, the result is in ``dt``.
|
182
|
+
Otherwise, the result will be in seconds, and all durations MUST be in wall-time (SI).
|
183
|
+
"""
|
184
|
+
|
185
|
+
__slots__ = ("dt", "has_dt", "has_si")
|
186
|
+
|
187
|
+
def __init__(self, dt=None):
|
188
|
+
self.dt = dt
|
189
|
+
self.has_dt = False
|
190
|
+
self.has_si = False
|
191
|
+
|
192
|
+
def in_cycles(self):
|
193
|
+
"""Returns ``True`` if units are 'dt' after visit."""
|
194
|
+
return self.has_dt or self.dt is not None
|
195
|
+
|
196
|
+
def visit_value(self, node, /) -> float:
|
197
|
+
if isinstance(node.value, float):
|
198
|
+
return node.value
|
199
|
+
if isinstance(node.value, Duration.dt):
|
200
|
+
if self.has_si and self.dt is None:
|
201
|
+
raise TranspilerError(
|
202
|
+
"Fail to unify time units in delays. SI units "
|
203
|
+
"and dt unit must not be mixed when dt is not supplied."
|
204
|
+
)
|
205
|
+
self.has_dt = True
|
206
|
+
return node.value[0]
|
207
|
+
if isinstance(node.value, Duration):
|
208
|
+
if self.has_dt and self.dt is None:
|
209
|
+
raise TranspilerError(
|
210
|
+
"Fail to unify time units in delays. SI units "
|
211
|
+
"and dt unit must not be mixed when dt is not supplied."
|
212
|
+
)
|
213
|
+
self.has_si = True
|
214
|
+
# Setting 'divisor' to 1 when there's no 'dt' is just to simplify
|
215
|
+
# the logic (we don't need to divide).
|
216
|
+
divisor = self.dt if self.dt is not None else 1
|
217
|
+
if isinstance(node.value, Duration.s):
|
218
|
+
return node.value[0] / divisor
|
219
|
+
from_unit = node.value.unit()
|
220
|
+
return apply_prefix(node.value[0], from_unit) / divisor
|
221
|
+
raise TranspilerError(f"invalid duration expression: {node}")
|
222
|
+
|
223
|
+
def visit_binary(self, node, /) -> float:
|
224
|
+
left = node.left.accept(self)
|
225
|
+
right = node.right.accept(self)
|
226
|
+
if node.op == expr.Binary.Op.ADD:
|
227
|
+
return left + right
|
228
|
+
if node.op == expr.Binary.Op.SUB:
|
229
|
+
return left - right
|
230
|
+
if node.op == expr.Binary.Op.MUL:
|
231
|
+
return left * right
|
232
|
+
if node.op == expr.Binary.Op.DIV:
|
233
|
+
return left / right
|
234
|
+
raise TranspilerError(f"invalid duration expression: {node}")
|
235
|
+
|
236
|
+
def visit_cast(self, node, /) -> float:
|
237
|
+
return node.operand.accept(self)
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2020.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Module containing transpiler synthesis passes."""
|
14
|
+
|
15
|
+
from .unitary_synthesis import UnitarySynthesis
|
16
|
+
from .plugin import high_level_synthesis_plugin_names, unitary_synthesis_plugin_names
|
17
|
+
from .linear_functions_synthesis import LinearFunctionsToPermutations
|
18
|
+
from .high_level_synthesis import HighLevelSynthesis, HLSConfig
|
19
|
+
from .solovay_kitaev_synthesis import SolovayKitaev, SolovayKitaevSynthesis
|
20
|
+
from .clifford_unitary_synth_plugin import CliffordUnitarySynthesis
|
21
|
+
from .aqc_plugin import AQCSynthesisPlugin
|
@@ -0,0 +1,153 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2021, 2023.
|
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
|
+
AQC Synthesis Plugin (in :mod:`qiskit.transpiler.passes.synthesis.aqc_plugin`)
|
15
|
+
==============================================================================
|
16
|
+
|
17
|
+
.. autosummary::
|
18
|
+
:toctree: ../stubs/
|
19
|
+
|
20
|
+
AQCSynthesisPlugin
|
21
|
+
"""
|
22
|
+
from functools import partial
|
23
|
+
import math
|
24
|
+
|
25
|
+
from qiskit.converters import circuit_to_dag
|
26
|
+
from qiskit.transpiler.passes.synthesis.plugin import UnitarySynthesisPlugin
|
27
|
+
|
28
|
+
|
29
|
+
class AQCSynthesisPlugin(UnitarySynthesisPlugin):
|
30
|
+
"""
|
31
|
+
An AQC-based Qiskit unitary synthesis plugin.
|
32
|
+
|
33
|
+
This plugin is invoked by :func:`~.compiler.transpile` when the ``unitary_synthesis_method``
|
34
|
+
parameter is set to ``"aqc"``.
|
35
|
+
|
36
|
+
This plugin supports customization and additional parameters can be passed to the plugin
|
37
|
+
by passing a dictionary as the ``unitary_synthesis_plugin_config`` parameter of
|
38
|
+
the :func:`~qiskit.compiler.transpile` function.
|
39
|
+
|
40
|
+
Supported parameters in the dictionary:
|
41
|
+
|
42
|
+
network_layout (str)
|
43
|
+
Type of network geometry, one of {``"sequ"``, ``"spin"``, ``"cart"``, ``"cyclic_spin"``,
|
44
|
+
``"cyclic_line"``}. Default value is ``"spin"``.
|
45
|
+
|
46
|
+
connectivity_type (str)
|
47
|
+
type of inter-qubit connectivity, {``"full"``, ``"line"``, ``"star"``}. Default value
|
48
|
+
is ``"full"``.
|
49
|
+
|
50
|
+
depth (int)
|
51
|
+
depth of the CNOT-network, i.e. the number of layers, where each layer consists of a
|
52
|
+
single CNOT-block.
|
53
|
+
|
54
|
+
optimizer (:class:`~.Minimizer`)
|
55
|
+
An implementation of the ``Minimizer`` protocol to be used in the optimization process.
|
56
|
+
|
57
|
+
seed (int)
|
58
|
+
A random seed.
|
59
|
+
|
60
|
+
initial_point (:class:`~numpy.ndarray`)
|
61
|
+
Initial values of angles/parameters to start the optimization process from.
|
62
|
+
"""
|
63
|
+
|
64
|
+
@property
|
65
|
+
def max_qubits(self):
|
66
|
+
"""Maximum number of supported qubits is ``14``."""
|
67
|
+
return 14
|
68
|
+
|
69
|
+
@property
|
70
|
+
def min_qubits(self):
|
71
|
+
"""Minimum number of supported qubits is ``3``."""
|
72
|
+
return 3
|
73
|
+
|
74
|
+
@property
|
75
|
+
def supports_natural_direction(self):
|
76
|
+
"""The plugin does not support natural direction,
|
77
|
+
it assumes bidirectional two qubit gates."""
|
78
|
+
return False
|
79
|
+
|
80
|
+
@property
|
81
|
+
def supports_pulse_optimize(self):
|
82
|
+
"""The plugin does not support optimization of pulses."""
|
83
|
+
return False
|
84
|
+
|
85
|
+
@property
|
86
|
+
def supports_gate_lengths(self):
|
87
|
+
"""The plugin does not support gate lengths."""
|
88
|
+
return False
|
89
|
+
|
90
|
+
@property
|
91
|
+
def supports_gate_errors(self):
|
92
|
+
"""The plugin does not support gate errors."""
|
93
|
+
return False
|
94
|
+
|
95
|
+
@property
|
96
|
+
def supported_bases(self):
|
97
|
+
"""The plugin does not support bases for synthesis."""
|
98
|
+
return None
|
99
|
+
|
100
|
+
@property
|
101
|
+
def supports_basis_gates(self):
|
102
|
+
"""The plugin does not support basis gates and by default it synthesizes a circuit using
|
103
|
+
``["rx", "ry", "rz", "cx"]`` gate basis."""
|
104
|
+
return False
|
105
|
+
|
106
|
+
@property
|
107
|
+
def supports_coupling_map(self):
|
108
|
+
"""The plugin does not support coupling maps."""
|
109
|
+
return False
|
110
|
+
|
111
|
+
def run(self, unitary, **options):
|
112
|
+
|
113
|
+
# Runtime imports to avoid the overhead of these imports for
|
114
|
+
# plugin discovery and only use them if the plugin is run/used
|
115
|
+
from scipy.optimize import minimize
|
116
|
+
from qiskit.synthesis.unitary.aqc import AQC
|
117
|
+
from qiskit.synthesis.unitary.aqc.cnot_structures import make_cnot_network
|
118
|
+
from qiskit.synthesis.unitary.aqc.cnot_unit_circuit import CNOTUnitCircuit
|
119
|
+
from qiskit.synthesis.unitary.aqc.fast_gradient.fast_gradient import FastCNOTUnitObjective
|
120
|
+
|
121
|
+
num_qubits = round(math.log2(unitary.shape[0]))
|
122
|
+
|
123
|
+
config = options.get("config") or {}
|
124
|
+
|
125
|
+
network_layout = config.get("network_layout", "spin")
|
126
|
+
connectivity_type = config.get("connectivity_type", "full")
|
127
|
+
depth = config.get("depth", 0)
|
128
|
+
|
129
|
+
cnots = make_cnot_network(
|
130
|
+
num_qubits=num_qubits,
|
131
|
+
network_layout=network_layout,
|
132
|
+
connectivity_type=connectivity_type,
|
133
|
+
depth=depth,
|
134
|
+
)
|
135
|
+
|
136
|
+
default_optimizer = partial(minimize, args=(), method="L-BFGS-B", options={"maxiter": 1000})
|
137
|
+
optimizer = config.get("optimizer", default_optimizer)
|
138
|
+
seed = config.get("seed")
|
139
|
+
aqc = AQC(optimizer, seed)
|
140
|
+
|
141
|
+
approximate_circuit = CNOTUnitCircuit(num_qubits=num_qubits, cnots=cnots)
|
142
|
+
approximating_objective = FastCNOTUnitObjective(num_qubits=num_qubits, cnots=cnots)
|
143
|
+
|
144
|
+
initial_point = config.get("initial_point")
|
145
|
+
aqc.compile_unitary(
|
146
|
+
target_matrix=unitary,
|
147
|
+
approximate_circuit=approximate_circuit,
|
148
|
+
approximating_objective=approximating_objective,
|
149
|
+
initial_point=initial_point,
|
150
|
+
)
|
151
|
+
|
152
|
+
dag_circuit = circuit_to_dag(approximate_circuit)
|
153
|
+
return dag_circuit
|