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
qiskit/circuit/_utils.py
ADDED
@@ -0,0 +1,167 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017.
|
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
|
+
This module contains utility functions for circuits.
|
14
|
+
"""
|
15
|
+
|
16
|
+
import math
|
17
|
+
import numpy
|
18
|
+
|
19
|
+
from qiskit import _numpy_compat
|
20
|
+
from qiskit.exceptions import QiskitError
|
21
|
+
from qiskit.circuit.exceptions import CircuitError
|
22
|
+
|
23
|
+
|
24
|
+
def _compute_control_matrix(base_mat, num_ctrl_qubits, ctrl_state=None):
|
25
|
+
r"""
|
26
|
+
Compute the controlled version of the input matrix with qiskit ordering.
|
27
|
+
This function computes the controlled unitary with :math:`n` control qubits
|
28
|
+
and :math:`m` target qubits,
|
29
|
+
|
30
|
+
.. math::
|
31
|
+
|
32
|
+
V_n^j(U_{2^m}) = (U_{2^m} \otimes |j\rangle\!\langle j|) +
|
33
|
+
(I_{2^m} \otimes (I_{2^n} - |j\rangle\!\langle j|)).
|
34
|
+
|
35
|
+
where :math:`|j\rangle \in \mathcal{H}^{2^n}` is the control state.
|
36
|
+
|
37
|
+
Args:
|
38
|
+
base_mat (ndarray): unitary to be controlled
|
39
|
+
num_ctrl_qubits (int): number of controls for new unitary
|
40
|
+
ctrl_state (int or str or None): The control state in decimal or as
|
41
|
+
a bitstring (e.g. '111'). If None, use 2**num_ctrl_qubits-1.
|
42
|
+
|
43
|
+
Returns:
|
44
|
+
ndarray: controlled version of base matrix.
|
45
|
+
|
46
|
+
Raises:
|
47
|
+
QiskitError: unrecognized mode or invalid ctrl_state
|
48
|
+
"""
|
49
|
+
num_target = int(math.log2(base_mat.shape[0]))
|
50
|
+
ctrl_dim = 2**num_ctrl_qubits
|
51
|
+
ctrl_grnd = numpy.repeat([[1], [0]], [1, ctrl_dim - 1])
|
52
|
+
if ctrl_state is None:
|
53
|
+
ctrl_state = ctrl_dim - 1
|
54
|
+
elif isinstance(ctrl_state, str):
|
55
|
+
ctrl_state = int(ctrl_state, 2)
|
56
|
+
if isinstance(ctrl_state, int):
|
57
|
+
if not 0 <= ctrl_state < ctrl_dim:
|
58
|
+
raise QiskitError("Invalid control state value specified.")
|
59
|
+
else:
|
60
|
+
raise QiskitError("Invalid control state type specified.")
|
61
|
+
ctrl_proj = numpy.diag(numpy.roll(ctrl_grnd, ctrl_state))
|
62
|
+
full_mat = numpy.kron(numpy.eye(2**num_target), numpy.eye(ctrl_dim) - ctrl_proj) + numpy.kron(
|
63
|
+
base_mat, ctrl_proj
|
64
|
+
)
|
65
|
+
return full_mat
|
66
|
+
|
67
|
+
|
68
|
+
def _ctrl_state_to_int(ctrl_state, num_ctrl_qubits):
|
69
|
+
"""Convert ctrl_state to int.
|
70
|
+
|
71
|
+
Args:
|
72
|
+
ctrl_state (None, str, int): ctrl_state. If None, set to 2**num_ctrl_qubits-1.
|
73
|
+
If str, convert to int. If int, pass.
|
74
|
+
num_ctrl_qubits (int): The number of control qubits.
|
75
|
+
|
76
|
+
Return:
|
77
|
+
int: ctrl_state
|
78
|
+
|
79
|
+
Raises:
|
80
|
+
CircuitError: invalid ctrl_state
|
81
|
+
"""
|
82
|
+
ctrl_state_std = None
|
83
|
+
if isinstance(ctrl_state, str):
|
84
|
+
try:
|
85
|
+
assert len(ctrl_state) == num_ctrl_qubits
|
86
|
+
ctrl_state = int(ctrl_state, 2)
|
87
|
+
except ValueError as ex:
|
88
|
+
raise CircuitError("invalid control bit string: " + ctrl_state) from ex
|
89
|
+
except AssertionError as ex:
|
90
|
+
raise CircuitError("invalid control bit string: length != num_ctrl_qubits") from ex
|
91
|
+
if isinstance(ctrl_state, int):
|
92
|
+
if 0 <= ctrl_state < 2**num_ctrl_qubits:
|
93
|
+
ctrl_state_std = ctrl_state
|
94
|
+
else:
|
95
|
+
raise CircuitError("invalid control state specification")
|
96
|
+
elif ctrl_state is None:
|
97
|
+
ctrl_state_std = 2**num_ctrl_qubits - 1
|
98
|
+
else:
|
99
|
+
raise CircuitError(f"invalid control state specification: {repr(ctrl_state)}")
|
100
|
+
return ctrl_state_std
|
101
|
+
|
102
|
+
|
103
|
+
def with_gate_array(base_array):
|
104
|
+
"""Class decorator that adds an ``__array__`` method to a :class:`.Gate` instance that returns a
|
105
|
+
singleton nonwritable view onto the complex matrix described by ``base_array``."""
|
106
|
+
nonwritable = numpy.array(base_array, dtype=numpy.complex128)
|
107
|
+
nonwritable.setflags(write=False)
|
108
|
+
|
109
|
+
def __array__(_self, dtype=None, copy=_numpy_compat.COPY_ONLY_IF_NEEDED):
|
110
|
+
dtype = nonwritable.dtype if dtype is None else dtype
|
111
|
+
return numpy.array(nonwritable, dtype=dtype, copy=copy)
|
112
|
+
|
113
|
+
def decorator(cls):
|
114
|
+
if hasattr(cls, "__array__"):
|
115
|
+
raise RuntimeError("Refusing to decorate a class that already has '__array__' defined.")
|
116
|
+
cls.__array__ = __array__
|
117
|
+
return cls
|
118
|
+
|
119
|
+
return decorator
|
120
|
+
|
121
|
+
|
122
|
+
def with_controlled_gate_array(base_array, num_ctrl_qubits, cached_states=None):
|
123
|
+
"""Class decorator that adds an ``__array__`` method to a :class:`.ControlledGate` instance that
|
124
|
+
returns singleton nonwritable views onto a relevant precomputed complex matrix for the given
|
125
|
+
control state.
|
126
|
+
|
127
|
+
If ``cached_states`` is not given, then all possible control states are precomputed. If it is
|
128
|
+
given, it should be an iterable of integers, and only these control states will be cached."""
|
129
|
+
base = numpy.asarray(base_array, dtype=numpy.complex128)
|
130
|
+
|
131
|
+
def matrix_for_control_state(state):
|
132
|
+
out = numpy.asarray(
|
133
|
+
_compute_control_matrix(base, num_ctrl_qubits, state),
|
134
|
+
dtype=numpy.complex128,
|
135
|
+
)
|
136
|
+
out.setflags(write=False)
|
137
|
+
return out
|
138
|
+
|
139
|
+
if cached_states is None:
|
140
|
+
nonwritables = [matrix_for_control_state(state) for state in range(2**num_ctrl_qubits)]
|
141
|
+
|
142
|
+
def __array__(self, dtype=None, copy=_numpy_compat.COPY_ONLY_IF_NEEDED):
|
143
|
+
arr = nonwritables[self.ctrl_state]
|
144
|
+
dtype = arr.dtype if dtype is None else dtype
|
145
|
+
return numpy.array(arr, dtype=dtype, copy=copy)
|
146
|
+
|
147
|
+
else:
|
148
|
+
nonwritables = {state: matrix_for_control_state(state) for state in cached_states}
|
149
|
+
|
150
|
+
def __array__(self, dtype=None, copy=_numpy_compat.COPY_ONLY_IF_NEEDED):
|
151
|
+
if (arr := nonwritables.get(self.ctrl_state)) is not None:
|
152
|
+
dtype = arr.dtype if dtype is None else dtype
|
153
|
+
return numpy.array(arr, dtype=dtype, copy=copy)
|
154
|
+
|
155
|
+
if copy is False and copy is not _numpy_compat.COPY_ONLY_IF_NEEDED:
|
156
|
+
raise ValueError("could not produce matrix without calculation")
|
157
|
+
return numpy.asarray(
|
158
|
+
_compute_control_matrix(base, num_ctrl_qubits, self.ctrl_state), dtype=dtype
|
159
|
+
)
|
160
|
+
|
161
|
+
def decorator(cls):
|
162
|
+
if hasattr(cls, "__array__"):
|
163
|
+
raise RuntimeError("Refusing to decorate a class that already has '__array__' defined.")
|
164
|
+
cls.__array__ = __array__
|
165
|
+
return cls
|
166
|
+
|
167
|
+
return decorator
|
@@ -0,0 +1,279 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 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
|
+
"""Annotated Operations."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
import dataclasses
|
18
|
+
from typing import Union, List
|
19
|
+
|
20
|
+
from qiskit.circuit.operation import Operation
|
21
|
+
from qiskit.circuit.parameterexpression import ParameterValueType
|
22
|
+
from qiskit.circuit._utils import _compute_control_matrix, _ctrl_state_to_int
|
23
|
+
from qiskit.circuit.exceptions import CircuitError
|
24
|
+
|
25
|
+
|
26
|
+
class Modifier:
|
27
|
+
"""The base class that all modifiers of :class:`~.AnnotatedOperation` should
|
28
|
+
inherit from."""
|
29
|
+
|
30
|
+
pass
|
31
|
+
|
32
|
+
|
33
|
+
@dataclasses.dataclass
|
34
|
+
class InverseModifier(Modifier):
|
35
|
+
"""Inverse modifier: specifies that the operation is inverted."""
|
36
|
+
|
37
|
+
pass
|
38
|
+
|
39
|
+
|
40
|
+
@dataclasses.dataclass
|
41
|
+
class ControlModifier(Modifier):
|
42
|
+
"""Control modifier: specifies that the operation is controlled by ``num_ctrl_qubits``
|
43
|
+
and has control state ``ctrl_state``."""
|
44
|
+
|
45
|
+
num_ctrl_qubits: int = 0
|
46
|
+
ctrl_state: Union[int, str, None] = None
|
47
|
+
|
48
|
+
def __init__(self, num_ctrl_qubits: int = 0, ctrl_state: Union[int, str, None] = None):
|
49
|
+
self.num_ctrl_qubits = num_ctrl_qubits
|
50
|
+
self.ctrl_state = _ctrl_state_to_int(ctrl_state, num_ctrl_qubits)
|
51
|
+
|
52
|
+
|
53
|
+
@dataclasses.dataclass
|
54
|
+
class PowerModifier(Modifier):
|
55
|
+
"""Power modifier: specifies that the operation is raised to the power ``power``."""
|
56
|
+
|
57
|
+
power: float
|
58
|
+
|
59
|
+
|
60
|
+
class AnnotatedOperation(Operation):
|
61
|
+
"""Annotated operation."""
|
62
|
+
|
63
|
+
def __init__(self, base_op: Operation, modifiers: Union[Modifier, List[Modifier]]):
|
64
|
+
"""
|
65
|
+
Create a new AnnotatedOperation.
|
66
|
+
|
67
|
+
An "annotated operation" allows to add a list of modifiers to the
|
68
|
+
"base" operation. For now, the only supported modifiers are of
|
69
|
+
types :class:`~.InverseModifier`, :class:`~.ControlModifier` and
|
70
|
+
:class:`~.PowerModifier`.
|
71
|
+
|
72
|
+
An annotated operation can be viewed as an extension of
|
73
|
+
:class:`~.ControlledGate` (which also allows adding control to the
|
74
|
+
base operation). However, an important difference is that the
|
75
|
+
circuit definition of an annotated operation is not constructed when
|
76
|
+
the operation is declared, and instead happens during transpilation,
|
77
|
+
specifically during the :class:`~.HighLevelSynthesis` transpiler pass.
|
78
|
+
|
79
|
+
An annotated operation can be also viewed as a "higher-level"
|
80
|
+
or "more abstract" object that can be added to a quantum circuit.
|
81
|
+
This enables writing transpiler optimization passes that make use of
|
82
|
+
this higher-level representation, for instance removing a gate
|
83
|
+
that is immediately followed by its inverse.
|
84
|
+
|
85
|
+
Args:
|
86
|
+
base_op: base operation being modified
|
87
|
+
modifiers: ordered list of modifiers. Supported modifiers include
|
88
|
+
``InverseModifier``, ``ControlModifier`` and ``PowerModifier``.
|
89
|
+
|
90
|
+
Examples::
|
91
|
+
|
92
|
+
op1 = AnnotatedOperation(SGate(), [InverseModifier(), ControlModifier(2)])
|
93
|
+
|
94
|
+
op2_inner = AnnotatedGate(SGate(), InverseModifier())
|
95
|
+
op2 = AnnotatedGate(op2_inner, ControlModifier(2))
|
96
|
+
|
97
|
+
Both op1 and op2 are semantically equivalent to an ``SGate()`` which is first
|
98
|
+
inverted and then controlled by 2 qubits.
|
99
|
+
"""
|
100
|
+
self.base_op = base_op
|
101
|
+
"""The base operation that the modifiers in this annotated operation applies to."""
|
102
|
+
self.modifiers = modifiers if isinstance(modifiers, List) else [modifiers]
|
103
|
+
"""Ordered sequence of the modifiers to apply to :attr:`base_op`. The modifiers are applied
|
104
|
+
in order from lowest index to highest index."""
|
105
|
+
|
106
|
+
@property
|
107
|
+
def name(self):
|
108
|
+
"""Unique string identifier for operation type."""
|
109
|
+
return "annotated"
|
110
|
+
|
111
|
+
@property
|
112
|
+
def num_qubits(self):
|
113
|
+
"""Number of qubits."""
|
114
|
+
num_ctrl_qubits = 0
|
115
|
+
for modifier in self.modifiers:
|
116
|
+
if isinstance(modifier, ControlModifier):
|
117
|
+
num_ctrl_qubits += modifier.num_ctrl_qubits
|
118
|
+
|
119
|
+
return num_ctrl_qubits + self.base_op.num_qubits
|
120
|
+
|
121
|
+
@property
|
122
|
+
def num_clbits(self):
|
123
|
+
"""Number of classical bits."""
|
124
|
+
return self.base_op.num_clbits
|
125
|
+
|
126
|
+
def __eq__(self, other) -> bool:
|
127
|
+
"""Checks if two AnnotatedOperations are equal."""
|
128
|
+
return (
|
129
|
+
isinstance(other, AnnotatedOperation)
|
130
|
+
and self.modifiers == other.modifiers
|
131
|
+
and self.base_op == other.base_op
|
132
|
+
)
|
133
|
+
|
134
|
+
def copy(self) -> "AnnotatedOperation":
|
135
|
+
"""Return a copy of the :class:`~.AnnotatedOperation`."""
|
136
|
+
return AnnotatedOperation(base_op=self.base_op.copy(), modifiers=self.modifiers.copy())
|
137
|
+
|
138
|
+
def to_matrix(self):
|
139
|
+
"""Return a matrix representation (allowing to construct Operator)."""
|
140
|
+
from qiskit.quantum_info.operators import Operator # pylint: disable=cyclic-import
|
141
|
+
|
142
|
+
operator = Operator(self.base_op)
|
143
|
+
|
144
|
+
for modifier in self.modifiers:
|
145
|
+
if isinstance(modifier, InverseModifier):
|
146
|
+
operator = operator.power(-1)
|
147
|
+
elif isinstance(modifier, ControlModifier):
|
148
|
+
operator = Operator(
|
149
|
+
_compute_control_matrix(
|
150
|
+
operator.data, modifier.num_ctrl_qubits, modifier.ctrl_state
|
151
|
+
)
|
152
|
+
)
|
153
|
+
elif isinstance(modifier, PowerModifier):
|
154
|
+
operator = operator.power(modifier.power)
|
155
|
+
else:
|
156
|
+
raise CircuitError(f"Unknown modifier {modifier}.")
|
157
|
+
return operator
|
158
|
+
|
159
|
+
def control(
|
160
|
+
self,
|
161
|
+
num_ctrl_qubits: int = 1,
|
162
|
+
label: str | None = None,
|
163
|
+
ctrl_state: int | str | None = None,
|
164
|
+
annotated: bool = True,
|
165
|
+
) -> AnnotatedOperation:
|
166
|
+
"""
|
167
|
+
Return the controlled version of itself.
|
168
|
+
|
169
|
+
Implemented as an annotated operation, see :class:`.AnnotatedOperation`.
|
170
|
+
|
171
|
+
Args:
|
172
|
+
num_ctrl_qubits: number of controls to add to gate (default: ``1``)
|
173
|
+
label: ignored (used for consistency with other control methods)
|
174
|
+
ctrl_state: The control state in decimal or as a bitstring
|
175
|
+
(e.g. ``'111'``). If ``None``, use ``2**num_ctrl_qubits-1``.
|
176
|
+
annotated: ignored (used for consistency with other control methods)
|
177
|
+
|
178
|
+
Returns:
|
179
|
+
Controlled version of the given operation.
|
180
|
+
"""
|
181
|
+
# pylint: disable=unused-argument
|
182
|
+
extended_modifiers = self.modifiers.copy()
|
183
|
+
extended_modifiers.append(
|
184
|
+
ControlModifier(num_ctrl_qubits=num_ctrl_qubits, ctrl_state=ctrl_state)
|
185
|
+
)
|
186
|
+
return AnnotatedOperation(self.base_op, extended_modifiers)
|
187
|
+
|
188
|
+
def inverse(self, annotated: bool = True):
|
189
|
+
"""
|
190
|
+
Return the inverse version of itself.
|
191
|
+
|
192
|
+
Implemented as an annotated operation, see :class:`.AnnotatedOperation`.
|
193
|
+
|
194
|
+
Args:
|
195
|
+
annotated: ignored (used for consistency with other inverse methods)
|
196
|
+
|
197
|
+
Returns:
|
198
|
+
Inverse version of the given operation.
|
199
|
+
"""
|
200
|
+
# pylint: disable=unused-argument
|
201
|
+
extended_modifiers = self.modifiers.copy()
|
202
|
+
extended_modifiers.append(InverseModifier())
|
203
|
+
return AnnotatedOperation(self.base_op, extended_modifiers)
|
204
|
+
|
205
|
+
def power(self, exponent: float, annotated: bool = False):
|
206
|
+
"""
|
207
|
+
Raise this gate to the power of ``exponent``.
|
208
|
+
|
209
|
+
Implemented as an annotated operation, see :class:`.AnnotatedOperation`.
|
210
|
+
|
211
|
+
Args:
|
212
|
+
exponent: the power to raise the gate to
|
213
|
+
annotated: ignored (used for consistency with other power methods)
|
214
|
+
|
215
|
+
Returns:
|
216
|
+
An operation implementing ``gate^exponent``
|
217
|
+
"""
|
218
|
+
# pylint: disable=unused-argument
|
219
|
+
extended_modifiers = self.modifiers.copy()
|
220
|
+
extended_modifiers.append(PowerModifier(exponent))
|
221
|
+
return AnnotatedOperation(self.base_op, extended_modifiers)
|
222
|
+
|
223
|
+
@property
|
224
|
+
def params(self) -> list[ParameterValueType]:
|
225
|
+
"""The params of the underlying base operation."""
|
226
|
+
return getattr(self.base_op, "params", [])
|
227
|
+
|
228
|
+
@params.setter
|
229
|
+
def params(self, value: list[ParameterValueType]):
|
230
|
+
if hasattr(self.base_op, "params"):
|
231
|
+
self.base_op.params = value
|
232
|
+
else:
|
233
|
+
raise AttributeError(
|
234
|
+
f"Cannot set attribute ``params`` on the base operation {self.base_op}."
|
235
|
+
)
|
236
|
+
|
237
|
+
def validate_parameter(self, parameter: ParameterValueType) -> ParameterValueType:
|
238
|
+
"""Validate a parameter for the underlying base operation."""
|
239
|
+
if hasattr(self.base_op, "validate_parameter"):
|
240
|
+
return self.base_op.validate_parameter(parameter)
|
241
|
+
|
242
|
+
raise AttributeError(f"Cannot validate parameters on the base operation {self.base_op}.")
|
243
|
+
|
244
|
+
|
245
|
+
def _canonicalize_modifiers(modifiers):
|
246
|
+
"""
|
247
|
+
Returns the canonical representative of the modifier list. This is possible
|
248
|
+
since all the modifiers commute; also note that InverseModifier is a special
|
249
|
+
case of PowerModifier. The current solution is to compute the total number
|
250
|
+
of control qubits / control state and the total power. The InverseModifier
|
251
|
+
will be present if total power is negative, whereas the power modifier will
|
252
|
+
be present only with positive powers different from 1.
|
253
|
+
"""
|
254
|
+
power = 1
|
255
|
+
num_ctrl_qubits = 0
|
256
|
+
ctrl_state = 0
|
257
|
+
|
258
|
+
for modifier in modifiers:
|
259
|
+
if isinstance(modifier, InverseModifier):
|
260
|
+
power *= -1
|
261
|
+
elif isinstance(modifier, ControlModifier):
|
262
|
+
num_ctrl_qubits += modifier.num_ctrl_qubits
|
263
|
+
ctrl_state = (ctrl_state << modifier.num_ctrl_qubits) | modifier.ctrl_state
|
264
|
+
elif isinstance(modifier, PowerModifier):
|
265
|
+
power *= modifier.power
|
266
|
+
else:
|
267
|
+
raise CircuitError(f"Unknown modifier {modifier}.")
|
268
|
+
|
269
|
+
canonical_modifiers = []
|
270
|
+
if power < 0:
|
271
|
+
canonical_modifiers.append(InverseModifier())
|
272
|
+
power *= -1
|
273
|
+
|
274
|
+
if power != 1:
|
275
|
+
canonical_modifiers.append(PowerModifier(power))
|
276
|
+
if num_ctrl_qubits > 0:
|
277
|
+
canonical_modifiers.append(ControlModifier(num_ctrl_qubits, ctrl_state))
|
278
|
+
|
279
|
+
return canonical_modifiers
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017.
|
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
|
+
"""Barrier instruction.
|
14
|
+
|
15
|
+
Can be applied to a :class:`~qiskit.circuit.QuantumCircuit`
|
16
|
+
with the :meth:`~qiskit.circuit.QuantumCircuit.barrier` method.
|
17
|
+
"""
|
18
|
+
|
19
|
+
from __future__ import annotations
|
20
|
+
|
21
|
+
from qiskit.circuit.instruction import Instruction
|
22
|
+
from qiskit._accelerate.circuit import StandardInstructionType
|
23
|
+
|
24
|
+
|
25
|
+
class Barrier(Instruction):
|
26
|
+
"""A directive for circuit compilation to separate pieces of a circuit so that any optimizations
|
27
|
+
or re-writes are constrained to only act between barriers.
|
28
|
+
|
29
|
+
This will also appear in visualizations as a visual marker.
|
30
|
+
"""
|
31
|
+
|
32
|
+
_directive = True
|
33
|
+
_standard_instruction_type = StandardInstructionType.Barrier
|
34
|
+
|
35
|
+
def __init__(self, num_qubits: int, label: str | None = None):
|
36
|
+
"""
|
37
|
+
Args:
|
38
|
+
num_qubits: the number of qubits for the barrier.
|
39
|
+
label: the optional label of this barrier.
|
40
|
+
"""
|
41
|
+
self._label = label
|
42
|
+
super().__init__("barrier", num_qubits, 0, [], label=label)
|
43
|
+
|
44
|
+
def inverse(self, annotated: bool = False):
|
45
|
+
"""Special case. Return self."""
|
46
|
+
return Barrier(self.num_qubits)
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 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
|
+
=======================================================
|
15
|
+
Classical expressions (:mod:`qiskit.circuit.classical`)
|
16
|
+
=======================================================
|
17
|
+
|
18
|
+
This module contains an exploratory representation of real-time operations on classical values
|
19
|
+
during circuit execution.
|
20
|
+
|
21
|
+
Currently, only simple expressions on bits and registers that result in a Boolean value are
|
22
|
+
supported, and these are only valid for use in the conditions of :meth:`.QuantumCircuit.if_test`
|
23
|
+
(:class:`.IfElseOp`) and :meth:`.QuantumCircuit.while_loop` (:class:`.WhileLoopOp`), and in the
|
24
|
+
target of :meth:`.QuantumCircuit.switch` (:class:`.SwitchCaseOp`).
|
25
|
+
|
26
|
+
.. note::
|
27
|
+
This is an exploratory module, and while we will commit to the standard Qiskit deprecation
|
28
|
+
policy within it, please be aware that the module will be deliberately limited in scope at the
|
29
|
+
start, and early versions may not evolve cleanly into the final version. It is possible that
|
30
|
+
various components of this module will be replaced (subject to deprecations) instead of improved
|
31
|
+
into a new form.
|
32
|
+
|
33
|
+
The type system and expression tree will be expanded over time, and it is possible that the
|
34
|
+
allowed types of some operations may need to change between versions of Qiskit as the classical
|
35
|
+
processing capabilities develop.
|
36
|
+
|
37
|
+
.. automodule:: qiskit.circuit.classical.expr
|
38
|
+
.. automodule:: qiskit.circuit.classical.types
|
39
|
+
"""
|
40
|
+
|
41
|
+
from . import types, expr
|