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,375 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 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
|
+
# pylint: disable=invalid-sequence-index
|
14
|
+
|
15
|
+
"""Circuit transpile function"""
|
16
|
+
import logging
|
17
|
+
from time import time
|
18
|
+
from typing import List, Union, Dict, Callable, Any, Optional, TypeVar
|
19
|
+
|
20
|
+
from qiskit import user_config
|
21
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
22
|
+
from qiskit.dagcircuit import DAGCircuit
|
23
|
+
from qiskit.providers.backend import Backend
|
24
|
+
from qiskit.transpiler import Layout, CouplingMap, PropertySet
|
25
|
+
from qiskit.transpiler.basepasses import BasePass
|
26
|
+
from qiskit.transpiler.exceptions import TranspilerError, CircuitTooWideForTarget
|
27
|
+
from qiskit.transpiler.passes.synthesis.high_level_synthesis import HLSConfig
|
28
|
+
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
|
29
|
+
from qiskit.transpiler.target import Target
|
30
|
+
|
31
|
+
logger = logging.getLogger(__name__)
|
32
|
+
|
33
|
+
_CircuitT = TypeVar("_CircuitT", bound=Union[QuantumCircuit, List[QuantumCircuit]])
|
34
|
+
|
35
|
+
|
36
|
+
def transpile( # pylint: disable=too-many-return-statements
|
37
|
+
circuits: _CircuitT,
|
38
|
+
backend: Optional[Backend] = None,
|
39
|
+
basis_gates: Optional[List[str]] = None,
|
40
|
+
coupling_map: Optional[Union[CouplingMap, List[List[int]]]] = None,
|
41
|
+
initial_layout: Optional[Union[Layout, Dict, List]] = None,
|
42
|
+
layout_method: Optional[str] = None,
|
43
|
+
routing_method: Optional[str] = None,
|
44
|
+
translation_method: Optional[str] = None,
|
45
|
+
scheduling_method: Optional[str] = None,
|
46
|
+
dt: Optional[float] = None,
|
47
|
+
approximation_degree: Optional[float] = 1.0,
|
48
|
+
seed_transpiler: Optional[int] = None,
|
49
|
+
optimization_level: Optional[int] = None,
|
50
|
+
callback: Optional[Callable[[BasePass, DAGCircuit, float, PropertySet, int], Any]] = None,
|
51
|
+
output_name: Optional[Union[str, List[str]]] = None,
|
52
|
+
unitary_synthesis_method: str = "default",
|
53
|
+
unitary_synthesis_plugin_config: Optional[dict] = None,
|
54
|
+
target: Optional[Target] = None,
|
55
|
+
hls_config: Optional[HLSConfig] = None,
|
56
|
+
init_method: Optional[str] = None,
|
57
|
+
optimization_method: Optional[str] = None,
|
58
|
+
ignore_backend_supplied_default_methods: bool = False,
|
59
|
+
num_processes: Optional[int] = None,
|
60
|
+
qubits_initially_zero: bool = True,
|
61
|
+
) -> _CircuitT:
|
62
|
+
"""Transpile one or more circuits, according to some desired transpilation targets.
|
63
|
+
|
64
|
+
Transpilation is potentially done in parallel using multiprocessing when ``circuits``
|
65
|
+
is a list with > 1 :class:`~.QuantumCircuit` object, depending on the local environment
|
66
|
+
and configuration.
|
67
|
+
|
68
|
+
The prioritization of transpilation target constraints works as follows: if a ``target``
|
69
|
+
input is provided, it will take priority over any ``backend`` input or loose constraints
|
70
|
+
(``basis_gates``, ``coupling_map``, or ``dt``). If a ``backend`` is provided
|
71
|
+
together with any loose constraint
|
72
|
+
from the list above, the loose constraint will take priority over the corresponding backend
|
73
|
+
constraint. This behavior is summarized in the table below. The first column
|
74
|
+
in the table summarizes the potential user-provided constraints, and each cell shows whether
|
75
|
+
the priority is assigned to that specific constraint input or another input
|
76
|
+
(`target`/`backend(V2)`).
|
77
|
+
|
78
|
+
============================ ========= ========================
|
79
|
+
User Provided target backend(V2)
|
80
|
+
============================ ========= ========================
|
81
|
+
**basis_gates** target basis_gates
|
82
|
+
**coupling_map** target coupling_map
|
83
|
+
**dt** target dt
|
84
|
+
============================ ========= ========================
|
85
|
+
|
86
|
+
Args:
|
87
|
+
circuits: Circuit(s) to transpile
|
88
|
+
backend: If set, the transpiler will compile the input circuit to this target
|
89
|
+
device. If any other option is explicitly set (e.g., ``coupling_map``), it
|
90
|
+
will override the backend's.
|
91
|
+
basis_gates: List of basis gate names to unroll to
|
92
|
+
(e.g: ``['u1', 'u2', 'u3', 'cx']``). If ``None``, do not unroll.
|
93
|
+
coupling_map: Directed coupling map (perhaps custom) to target in mapping. If
|
94
|
+
the coupling map is symmetric, both directions need to be specified.
|
95
|
+
|
96
|
+
Multiple formats are supported:
|
97
|
+
|
98
|
+
#. ``CouplingMap`` instance
|
99
|
+
#. List, must be given as an adjacency matrix, where each entry
|
100
|
+
specifies all directed two-qubit interactions supported by backend,
|
101
|
+
e.g: ``[[0, 1], [0, 3], [1, 2], [1, 5], [2, 5], [4, 1], [5, 3]]``
|
102
|
+
initial_layout: Initial position of virtual qubits on physical qubits.
|
103
|
+
If this layout makes the circuit compatible with the coupling_map
|
104
|
+
constraints, it will be used. The final layout is not guaranteed to be the same,
|
105
|
+
as the transpiler may permute qubits through swaps or other means.
|
106
|
+
Multiple formats are supported:
|
107
|
+
|
108
|
+
#. ``Layout`` instance
|
109
|
+
#. Dict
|
110
|
+
* virtual to physical::
|
111
|
+
|
112
|
+
{qr[0]: 0,
|
113
|
+
qr[1]: 3,
|
114
|
+
qr[2]: 5}
|
115
|
+
|
116
|
+
* physical to virtual::
|
117
|
+
|
118
|
+
{0: qr[0],
|
119
|
+
3: qr[1],
|
120
|
+
5: qr[2]}
|
121
|
+
|
122
|
+
#. List
|
123
|
+
|
124
|
+
* virtual to physical::
|
125
|
+
|
126
|
+
[0, 3, 5] # virtual qubits are ordered (in addition to named)
|
127
|
+
|
128
|
+
* physical to virtual::
|
129
|
+
|
130
|
+
[qr[0], None, None, qr[1], None, qr[2]]
|
131
|
+
|
132
|
+
layout_method: Name of layout selection pass ('trivial', 'dense', 'sabre').
|
133
|
+
This can also be the external plugin name to use for the ``layout`` stage.
|
134
|
+
You can see a list of installed plugins by using :func:`~.list_stage_plugins` with
|
135
|
+
``"layout"`` for the ``stage_name`` argument.
|
136
|
+
routing_method: Name of routing pass
|
137
|
+
('basic', 'lookahead', 'stochastic', 'sabre', 'none'). Note
|
138
|
+
This can also be the external plugin name to use for the ``routing`` stage.
|
139
|
+
You can see a list of installed plugins by using :func:`~.list_stage_plugins` with
|
140
|
+
``"routing"`` for the ``stage_name`` argument.
|
141
|
+
translation_method: Name of translation pass (``"default"``, ``"translator"`` or
|
142
|
+
``"synthesis"``). This can also be the external plugin name to use for the
|
143
|
+
``translation`` stage. You can see a list of installed plugins by using
|
144
|
+
:func:`~.list_stage_plugins` with ``"translation"`` for the ``stage_name`` argument.
|
145
|
+
scheduling_method: Name of scheduling pass.
|
146
|
+
* ``'as_soon_as_possible'``: Schedule instructions greedily, as early as possible
|
147
|
+
on a qubit resource. (alias: ``'asap'``)
|
148
|
+
* ``'as_late_as_possible'``: Schedule instructions late, i.e. keeping qubits
|
149
|
+
in the ground state when possible. (alias: ``'alap'``)
|
150
|
+
If ``None``, no scheduling will be done. This can also be the external plugin name
|
151
|
+
to use for the ``scheduling`` stage. You can see a list of installed plugins by
|
152
|
+
using :func:`~.list_stage_plugins` with ``"scheduling"`` for the ``stage_name``
|
153
|
+
argument.
|
154
|
+
dt: Backend sample time (resolution) in seconds.
|
155
|
+
If ``None`` (default), ``backend.dt`` is used.
|
156
|
+
approximation_degree (float): heuristic dial used for circuit approximation
|
157
|
+
(1.0=no approximation, 0.0=maximal approximation)
|
158
|
+
seed_transpiler: Sets random seed for the stochastic parts of the transpiler
|
159
|
+
optimization_level: How much optimization to perform on the circuits.
|
160
|
+
Higher levels generate more optimized circuits,
|
161
|
+
at the expense of longer transpilation time.
|
162
|
+
|
163
|
+
* 0: no optimization
|
164
|
+
* 1: light optimization
|
165
|
+
* 2: heavy optimization
|
166
|
+
* 3: even heavier optimization
|
167
|
+
|
168
|
+
If ``None``, level 2 will be chosen as default.
|
169
|
+
callback: A callback function that will be called after each
|
170
|
+
pass execution. The function will be called with 5 keyword
|
171
|
+
arguments,
|
172
|
+
| ``pass_``: the pass being run.
|
173
|
+
| ``dag``: the dag output of the pass.
|
174
|
+
| ``time``: the time to execute the pass.
|
175
|
+
| ``property_set``: the property set.
|
176
|
+
| ``count``: the index for the pass execution.
|
177
|
+
The exact arguments passed expose the internals of the pass manager,
|
178
|
+
and are subject to change as the pass manager internals change. If
|
179
|
+
you intend to reuse a callback function over multiple releases, be
|
180
|
+
sure to check that the arguments being passed are the same.
|
181
|
+
To use the callback feature, define a function that will
|
182
|
+
take in kwargs dict and access the variables. For example::
|
183
|
+
|
184
|
+
def callback_func(**kwargs):
|
185
|
+
pass_ = kwargs['pass_']
|
186
|
+
dag = kwargs['dag']
|
187
|
+
time = kwargs['time']
|
188
|
+
property_set = kwargs['property_set']
|
189
|
+
count = kwargs['count']
|
190
|
+
...
|
191
|
+
transpile(circ, callback=callback_func)
|
192
|
+
|
193
|
+
output_name: A list with strings to identify the output circuits. The length of
|
194
|
+
the list should be exactly the length of the ``circuits`` parameter.
|
195
|
+
unitary_synthesis_method (str): The name of the unitary synthesis
|
196
|
+
method to use. By default ``'default'`` is used. You can see a list of installed
|
197
|
+
plugins with :func:`.unitary_synthesis_plugin_names`.
|
198
|
+
unitary_synthesis_plugin_config: An optional configuration dictionary
|
199
|
+
that will be passed directly to the unitary synthesis plugin. By
|
200
|
+
default this setting will have no effect as the default unitary
|
201
|
+
synthesis method does not take custom configuration. This should
|
202
|
+
only be necessary when a unitary synthesis plugin is specified with
|
203
|
+
the ``unitary_synthesis_method`` argument. As this is custom for each
|
204
|
+
unitary synthesis plugin refer to the plugin documentation for how
|
205
|
+
to use this option.
|
206
|
+
target: A backend transpiler target. Normally this is specified as part of
|
207
|
+
the ``backend`` argument, but if you have manually constructed a
|
208
|
+
:class:`~qiskit.transpiler.Target` object you can specify it manually here.
|
209
|
+
This will override the target from ``backend``.
|
210
|
+
hls_config: An optional configuration class
|
211
|
+
:class:`~qiskit.transpiler.passes.synthesis.HLSConfig` that will be passed directly
|
212
|
+
to :class:`~qiskit.transpiler.passes.synthesis.HighLevelSynthesis` transformation pass.
|
213
|
+
This configuration class allows to specify for various high-level objects the lists of
|
214
|
+
synthesis algorithms and their parameters.
|
215
|
+
init_method: The plugin name to use for the ``init`` stage. By default an external
|
216
|
+
plugin is not used. You can see a list of installed plugins by
|
217
|
+
using :func:`~.list_stage_plugins` with ``"init"`` for the stage
|
218
|
+
name argument.
|
219
|
+
optimization_method: The plugin name to use for the
|
220
|
+
``optimization`` stage. By default an external
|
221
|
+
plugin is not used. You can see a list of installed plugins by
|
222
|
+
using :func:`~.list_stage_plugins` with ``"optimization"`` for the
|
223
|
+
``stage_name`` argument.
|
224
|
+
ignore_backend_supplied_default_methods: If set to ``True`` any default methods specified by
|
225
|
+
a backend will be ignored. Some backends specify alternative default methods
|
226
|
+
to support custom compilation target-specific passes/plugins which support
|
227
|
+
backend-specific compilation techniques. If you'd prefer that these defaults were
|
228
|
+
not used this option is used to disable those backend-specific defaults.
|
229
|
+
num_processes: The maximum number of parallel processes to launch for this call to
|
230
|
+
transpile if parallel execution is enabled. This argument overrides
|
231
|
+
``num_processes`` in the user configuration file, and the ``QISKIT_NUM_PROCS``
|
232
|
+
environment variable. If set to ``None`` the system default or local user configuration
|
233
|
+
will be used.
|
234
|
+
qubits_initially_zero: Indicates whether the input circuit is zero-initialized.
|
235
|
+
|
236
|
+
Returns:
|
237
|
+
The transpiled circuit(s).
|
238
|
+
|
239
|
+
Raises:
|
240
|
+
TranspilerError: in case of bad inputs to transpiler (like conflicting parameters)
|
241
|
+
or errors in passes
|
242
|
+
"""
|
243
|
+
arg_circuits_list = isinstance(circuits, list)
|
244
|
+
circuits = circuits if arg_circuits_list else [circuits]
|
245
|
+
|
246
|
+
if not circuits:
|
247
|
+
return []
|
248
|
+
|
249
|
+
start_time = time()
|
250
|
+
|
251
|
+
if optimization_level is None:
|
252
|
+
# Take optimization level from the configuration or 1 as default.
|
253
|
+
config = user_config.get_config()
|
254
|
+
optimization_level = config.get("transpile_optimization_level", 2)
|
255
|
+
|
256
|
+
if not ignore_backend_supplied_default_methods:
|
257
|
+
if scheduling_method is None and hasattr(backend, "get_scheduling_stage_plugin"):
|
258
|
+
scheduling_method = backend.get_scheduling_stage_plugin()
|
259
|
+
if translation_method is None and hasattr(backend, "get_translation_stage_plugin"):
|
260
|
+
translation_method = backend.get_translation_stage_plugin()
|
261
|
+
|
262
|
+
output_name = _parse_output_name(output_name, circuits)
|
263
|
+
coupling_map = _parse_coupling_map(coupling_map)
|
264
|
+
_check_circuits_coupling_map(circuits, coupling_map, backend)
|
265
|
+
|
266
|
+
# Edge cases require using the old model (loose constraints) instead of building a target,
|
267
|
+
# but we don't populate the passmanager config with loose constraints unless it's one of
|
268
|
+
# the known edge cases to control the execution path.
|
269
|
+
pm = generate_preset_pass_manager(
|
270
|
+
optimization_level,
|
271
|
+
target=target,
|
272
|
+
backend=backend,
|
273
|
+
basis_gates=basis_gates,
|
274
|
+
coupling_map=coupling_map,
|
275
|
+
initial_layout=initial_layout,
|
276
|
+
layout_method=layout_method,
|
277
|
+
routing_method=routing_method,
|
278
|
+
translation_method=translation_method,
|
279
|
+
scheduling_method=scheduling_method,
|
280
|
+
approximation_degree=approximation_degree,
|
281
|
+
seed_transpiler=seed_transpiler,
|
282
|
+
unitary_synthesis_method=unitary_synthesis_method,
|
283
|
+
unitary_synthesis_plugin_config=unitary_synthesis_plugin_config,
|
284
|
+
hls_config=hls_config,
|
285
|
+
init_method=init_method,
|
286
|
+
optimization_method=optimization_method,
|
287
|
+
dt=dt,
|
288
|
+
qubits_initially_zero=qubits_initially_zero,
|
289
|
+
)
|
290
|
+
|
291
|
+
out_circuits = pm.run(circuits, callback=callback, num_processes=num_processes)
|
292
|
+
|
293
|
+
for name, circ in zip(output_name, out_circuits):
|
294
|
+
circ.name = name
|
295
|
+
end_time = time()
|
296
|
+
_log_transpile_time(start_time, end_time)
|
297
|
+
if arg_circuits_list:
|
298
|
+
return out_circuits
|
299
|
+
else:
|
300
|
+
return out_circuits[0]
|
301
|
+
|
302
|
+
|
303
|
+
def _check_circuits_coupling_map(circuits, cmap, backend):
|
304
|
+
# Check circuit width against number of qubits in coupling_map(s)
|
305
|
+
max_qubits = None
|
306
|
+
if cmap is not None:
|
307
|
+
max_qubits = cmap.size()
|
308
|
+
elif backend is not None:
|
309
|
+
max_qubits = backend.num_qubits
|
310
|
+
|
311
|
+
for circuit in circuits:
|
312
|
+
# If coupling_map is not None or num_qubits == 1
|
313
|
+
num_qubits = len(circuit.qubits)
|
314
|
+
if max_qubits is not None and (num_qubits > max_qubits):
|
315
|
+
raise CircuitTooWideForTarget(
|
316
|
+
f"Number of qubits ({num_qubits}) in {circuit.name} "
|
317
|
+
f"is greater than maximum ({max_qubits}) in the coupling_map"
|
318
|
+
)
|
319
|
+
|
320
|
+
|
321
|
+
def _log_transpile_time(start_time, end_time):
|
322
|
+
log_msg = f"Total Transpile Time - {((end_time - start_time) * 1000):.5f} (ms)"
|
323
|
+
logger.info(log_msg)
|
324
|
+
|
325
|
+
|
326
|
+
def _parse_coupling_map(coupling_map):
|
327
|
+
# coupling_map could be None, or a list of lists, e.g. [[0, 1], [2, 1]]
|
328
|
+
if isinstance(coupling_map, list) and all(
|
329
|
+
isinstance(i, list) and len(i) == 2 for i in coupling_map
|
330
|
+
):
|
331
|
+
return CouplingMap(coupling_map)
|
332
|
+
elif isinstance(coupling_map, list):
|
333
|
+
raise TranspilerError(
|
334
|
+
"Only a single input coupling map can be used with transpile() if you need to "
|
335
|
+
"target different coupling maps for different circuits you must call transpile() "
|
336
|
+
"multiple times"
|
337
|
+
)
|
338
|
+
else:
|
339
|
+
return coupling_map
|
340
|
+
|
341
|
+
|
342
|
+
def _parse_output_name(output_name, circuits):
|
343
|
+
# naming and returning circuits
|
344
|
+
# output_name could be either a string or a list
|
345
|
+
if output_name is not None:
|
346
|
+
if isinstance(output_name, str):
|
347
|
+
# single circuit
|
348
|
+
if len(circuits) == 1:
|
349
|
+
return [output_name]
|
350
|
+
# multiple circuits
|
351
|
+
else:
|
352
|
+
raise TranspilerError(
|
353
|
+
"Expected a list object of length equal "
|
354
|
+
+ "to that of the number of circuits "
|
355
|
+
+ "being transpiled"
|
356
|
+
)
|
357
|
+
elif isinstance(output_name, list):
|
358
|
+
if len(circuits) == len(output_name) and all(
|
359
|
+
isinstance(name, str) for name in output_name
|
360
|
+
):
|
361
|
+
return output_name
|
362
|
+
else:
|
363
|
+
raise TranspilerError(
|
364
|
+
"The length of output_name list "
|
365
|
+
"must be equal to the number of "
|
366
|
+
"transpiled circuits and the output_name "
|
367
|
+
"list should be strings."
|
368
|
+
)
|
369
|
+
else:
|
370
|
+
raise TranspilerError(
|
371
|
+
"The parameter output_name should be a string or a"
|
372
|
+
f"list of strings: {type(output_name)} was used."
|
373
|
+
)
|
374
|
+
else:
|
375
|
+
return [circuit.name for circuit in circuits]
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2018.
|
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
|
+
=============================================
|
15
|
+
Circuit Converters (:mod:`qiskit.converters`)
|
16
|
+
=============================================
|
17
|
+
|
18
|
+
.. currentmodule:: qiskit.converters
|
19
|
+
|
20
|
+
QuantumCircuit -> circuit components
|
21
|
+
====================================
|
22
|
+
|
23
|
+
.. autofunction:: circuit_to_instruction
|
24
|
+
.. autofunction:: circuit_to_gate
|
25
|
+
|
26
|
+
QuantumCircuit <-> DagCircuit
|
27
|
+
=============================
|
28
|
+
|
29
|
+
.. autofunction:: circuit_to_dag
|
30
|
+
.. autofunction:: dag_to_circuit
|
31
|
+
|
32
|
+
QuantumCircuit <-> DagDependency
|
33
|
+
================================
|
34
|
+
|
35
|
+
.. autofunction:: dagdependency_to_circuit
|
36
|
+
.. autofunction:: circuit_to_dagdependency
|
37
|
+
|
38
|
+
DagCircuit <-> DagDependency
|
39
|
+
============================
|
40
|
+
|
41
|
+
.. autofunction:: dag_to_dagdependency
|
42
|
+
.. autofunction:: dagdependency_to_dag
|
43
|
+
"""
|
44
|
+
|
45
|
+
from .circuit_to_dag import circuit_to_dag
|
46
|
+
from .dag_to_circuit import dag_to_circuit
|
47
|
+
from .circuit_to_instruction import circuit_to_instruction
|
48
|
+
from .circuit_to_gate import circuit_to_gate
|
49
|
+
from .circuit_to_dagdependency import circuit_to_dagdependency
|
50
|
+
from .dagdependency_to_circuit import dagdependency_to_circuit
|
51
|
+
from .dag_to_dagdependency import dag_to_dagdependency
|
52
|
+
from .dagdependency_to_dag import dagdependency_to_dag
|
53
|
+
|
54
|
+
|
55
|
+
def isinstanceint(obj):
|
56
|
+
"""Like isinstance(obj,int), but with casting. Except for strings."""
|
57
|
+
if isinstance(obj, str):
|
58
|
+
return False
|
59
|
+
try:
|
60
|
+
int(obj)
|
61
|
+
return True
|
62
|
+
except TypeError:
|
63
|
+
return False
|
64
|
+
|
65
|
+
|
66
|
+
def isinstancelist(obj):
|
67
|
+
"""Like isinstance(obj, list), but with casting. Except for strings and dicts."""
|
68
|
+
if isinstance(obj, (str, dict)):
|
69
|
+
return False
|
70
|
+
try:
|
71
|
+
list(obj)
|
72
|
+
return True
|
73
|
+
except TypeError:
|
74
|
+
return False
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2018.
|
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
|
+
"""Helper function for converting a circuit to a dag"""
|
14
|
+
|
15
|
+
from qiskit.circuit.library.blueprintcircuit import BlueprintCircuit
|
16
|
+
from qiskit._accelerate.converters import circuit_to_dag as core_circuit_to_dag
|
17
|
+
|
18
|
+
|
19
|
+
def circuit_to_dag(circuit, copy_operations=True, *, qubit_order=None, clbit_order=None):
|
20
|
+
"""Build a :class:`.DAGCircuit` object from a :class:`.QuantumCircuit`.
|
21
|
+
|
22
|
+
Args:
|
23
|
+
circuit (QuantumCircuit): the input circuit.
|
24
|
+
copy_operations (bool): Deep copy the operation objects
|
25
|
+
in the :class:`~.QuantumCircuit` for the output :class:`~.DAGCircuit`.
|
26
|
+
This should only be set to ``False`` if the input :class:`~.QuantumCircuit`
|
27
|
+
will not be used anymore as the operations in the output
|
28
|
+
:class:`~.DAGCircuit` will be shared instances and modifications to
|
29
|
+
operations in the :class:`~.DAGCircuit` will be reflected in the
|
30
|
+
:class:`~.QuantumCircuit` (and vice versa).
|
31
|
+
qubit_order (Iterable[~qiskit.circuit.Qubit] or None): the order that the qubits should be
|
32
|
+
indexed in the output DAG. Defaults to the same order as in the circuit.
|
33
|
+
clbit_order (Iterable[Clbit] or None): the order that the clbits should be indexed in the
|
34
|
+
output DAG. Defaults to the same order as in the circuit.
|
35
|
+
|
36
|
+
Return:
|
37
|
+
DAGCircuit: the DAG representing the input circuit.
|
38
|
+
|
39
|
+
Raises:
|
40
|
+
ValueError: if the ``qubit_order`` or ``clbit_order`` parameters do not match the bits in
|
41
|
+
the circuit.
|
42
|
+
|
43
|
+
Example:
|
44
|
+
.. plot::
|
45
|
+
:include-source:
|
46
|
+
:nofigs:
|
47
|
+
|
48
|
+
from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit
|
49
|
+
from qiskit.dagcircuit import DAGCircuit
|
50
|
+
from qiskit.converters import circuit_to_dag
|
51
|
+
|
52
|
+
q = QuantumRegister(3, 'q')
|
53
|
+
c = ClassicalRegister(3, 'c')
|
54
|
+
circ = QuantumCircuit(q, c)
|
55
|
+
circ.h(q[0])
|
56
|
+
circ.cx(q[0], q[1])
|
57
|
+
circ.measure(q[0], c[0])
|
58
|
+
circ.rz(0.5, q[1])
|
59
|
+
dag = circuit_to_dag(circ)
|
60
|
+
"""
|
61
|
+
# If we have an instance of BluePrintCircuit, make sure it is built by calling ._build()
|
62
|
+
if isinstance(circuit, BlueprintCircuit):
|
63
|
+
if not circuit._is_built:
|
64
|
+
circuit._build()
|
65
|
+
|
66
|
+
if qubit_order is not None and (
|
67
|
+
len(qubit_order) != circuit.num_qubits or set(qubit_order) != set(circuit.qubits)
|
68
|
+
):
|
69
|
+
raise ValueError("'qubit_order' does not contain exactly the same qubits as the circuit")
|
70
|
+
|
71
|
+
if clbit_order is not None and (
|
72
|
+
len(clbit_order) != circuit.num_clbits or set(clbit_order) != set(circuit.clbits)
|
73
|
+
):
|
74
|
+
raise ValueError("'clbit_order' does not contain exactly the same clbits as the circuit")
|
75
|
+
|
76
|
+
dagcircuit = core_circuit_to_dag(circuit, copy_operations, qubit_order, clbit_order)
|
77
|
+
|
78
|
+
dagcircuit._duration = circuit._duration
|
79
|
+
dagcircuit._unit = circuit._unit
|
80
|
+
return dagcircuit
|
@@ -0,0 +1,49 @@
|
|
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
|
+
"""Helper function for converting a circuit to a dag dependency"""
|
14
|
+
|
15
|
+
from qiskit.dagcircuit.dagdependency import DAGDependency
|
16
|
+
|
17
|
+
|
18
|
+
def circuit_to_dagdependency(circuit, create_preds_and_succs=True):
|
19
|
+
"""Build a ``DAGDependency`` object from a :class:`~.QuantumCircuit`.
|
20
|
+
|
21
|
+
Args:
|
22
|
+
circuit (QuantumCircuit): the input circuit.
|
23
|
+
create_preds_and_succs (bool): whether to construct lists of
|
24
|
+
predecessors and successors for every node.
|
25
|
+
|
26
|
+
Return:
|
27
|
+
DAGDependency: the DAG representing the input circuit as a dag dependency.
|
28
|
+
"""
|
29
|
+
dagdependency = DAGDependency()
|
30
|
+
dagdependency.name = circuit.name
|
31
|
+
dagdependency.metadata = circuit.metadata
|
32
|
+
|
33
|
+
dagdependency.add_qubits(circuit.qubits)
|
34
|
+
dagdependency.add_clbits(circuit.clbits)
|
35
|
+
|
36
|
+
for register in circuit.qregs:
|
37
|
+
dagdependency.add_qreg(register)
|
38
|
+
|
39
|
+
for register in circuit.cregs:
|
40
|
+
dagdependency.add_creg(register)
|
41
|
+
|
42
|
+
for instruction in circuit.data:
|
43
|
+
dagdependency.add_op_node(instruction.operation, instruction.qubits, instruction.clbits)
|
44
|
+
|
45
|
+
if create_preds_and_succs:
|
46
|
+
dagdependency._add_predecessors()
|
47
|
+
dagdependency._add_successors()
|
48
|
+
|
49
|
+
return dagdependency
|
@@ -0,0 +1,46 @@
|
|
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
|
+
"""Helper function for converting a circuit to a dag dependency"""
|
14
|
+
|
15
|
+
from qiskit.dagcircuit.dagdependency_v2 import _DAGDependencyV2
|
16
|
+
|
17
|
+
|
18
|
+
def _circuit_to_dagdependency_v2(circuit):
|
19
|
+
"""Build a ``_DAGDependencyV2`` object from a :class:`~.QuantumCircuit`.
|
20
|
+
|
21
|
+
Args:
|
22
|
+
circuit (QuantumCircuit): the input circuit.
|
23
|
+
|
24
|
+
Return:
|
25
|
+
_DAGDependencyV2: the DAG representing the input circuit as a dag dependency.
|
26
|
+
"""
|
27
|
+
dagdependency = _DAGDependencyV2()
|
28
|
+
dagdependency.name = circuit.name
|
29
|
+
dagdependency.metadata = circuit.metadata
|
30
|
+
dagdependency.global_phase = circuit.global_phase
|
31
|
+
|
32
|
+
dagdependency.add_qubits(circuit.qubits)
|
33
|
+
dagdependency.add_clbits(circuit.clbits)
|
34
|
+
|
35
|
+
for register in circuit.qregs:
|
36
|
+
dagdependency.add_qreg(register)
|
37
|
+
|
38
|
+
for register in circuit.cregs:
|
39
|
+
dagdependency.add_creg(register)
|
40
|
+
|
41
|
+
for instruction in circuit.data:
|
42
|
+
dagdependency.apply_operation_back(
|
43
|
+
instruction.operation, instruction.qubits, instruction.clbits
|
44
|
+
)
|
45
|
+
|
46
|
+
return dagdependency
|