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,274 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2019.
|
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
|
+
"""Controlled unitary gate."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
import copy
|
17
|
+
from typing import Optional, Union
|
18
|
+
|
19
|
+
from qiskit.circuit.exceptions import CircuitError
|
20
|
+
|
21
|
+
# pylint: disable=cyclic-import
|
22
|
+
from . import QuantumRegister
|
23
|
+
from .quantumcircuit import QuantumCircuit
|
24
|
+
from .gate import Gate
|
25
|
+
from ._utils import _ctrl_state_to_int
|
26
|
+
|
27
|
+
|
28
|
+
class ControlledGate(Gate):
|
29
|
+
"""Controlled unitary gate."""
|
30
|
+
|
31
|
+
def __init__(
|
32
|
+
self,
|
33
|
+
name: str,
|
34
|
+
num_qubits: int,
|
35
|
+
params: list,
|
36
|
+
label: Optional[str] = None,
|
37
|
+
num_ctrl_qubits: Optional[int] = 1,
|
38
|
+
definition: Optional["QuantumCircuit"] = None,
|
39
|
+
ctrl_state: Optional[Union[int, str]] = None,
|
40
|
+
base_gate: Optional[Gate] = None,
|
41
|
+
*,
|
42
|
+
_base_label=None,
|
43
|
+
):
|
44
|
+
"""Create a new ControlledGate. In the new gate the first ``num_ctrl_qubits``
|
45
|
+
of the gate are the controls.
|
46
|
+
|
47
|
+
Args:
|
48
|
+
name: The name of the gate.
|
49
|
+
num_qubits: The number of qubits the gate acts on.
|
50
|
+
params: A list of parameters for the gate.
|
51
|
+
label: An optional label for the gate.
|
52
|
+
num_ctrl_qubits: Number of control qubits.
|
53
|
+
definition: A list of gate rules for implementing this gate. The
|
54
|
+
elements of the list are tuples of (:meth:`~qiskit.circuit.Gate`, [qubit_list],
|
55
|
+
[clbit_list]).
|
56
|
+
ctrl_state: The control state in decimal or as
|
57
|
+
a bitstring (e.g. '111'). If specified as a bitstring the length
|
58
|
+
must equal num_ctrl_qubits, MSB on left. If None, use
|
59
|
+
2**num_ctrl_qubits-1.
|
60
|
+
base_gate: Gate object to be controlled.
|
61
|
+
|
62
|
+
Raises:
|
63
|
+
CircuitError: If ``num_ctrl_qubits`` >= ``num_qubits``.
|
64
|
+
CircuitError: ctrl_state < 0 or ctrl_state > 2**num_ctrl_qubits.
|
65
|
+
|
66
|
+
Examples:
|
67
|
+
|
68
|
+
Create a controlled standard gate and apply it to a circuit.
|
69
|
+
|
70
|
+
.. plot::
|
71
|
+
:alt: Circuit diagram output by the previous code.
|
72
|
+
:include-source:
|
73
|
+
|
74
|
+
from qiskit import QuantumCircuit, QuantumRegister
|
75
|
+
from qiskit.circuit.library.standard_gates import HGate
|
76
|
+
|
77
|
+
qr = QuantumRegister(3)
|
78
|
+
qc = QuantumCircuit(qr)
|
79
|
+
c3h_gate = HGate().control(2)
|
80
|
+
qc.append(c3h_gate, qr)
|
81
|
+
qc.draw('mpl')
|
82
|
+
|
83
|
+
Create a controlled custom gate and apply it to a circuit.
|
84
|
+
|
85
|
+
.. plot::
|
86
|
+
:alt: Circuit diagram output by the previous code.
|
87
|
+
:include-source:
|
88
|
+
|
89
|
+
from qiskit import QuantumCircuit, QuantumRegister
|
90
|
+
from qiskit.circuit.library.standard_gates import HGate
|
91
|
+
|
92
|
+
qc1 = QuantumCircuit(2)
|
93
|
+
qc1.x(0)
|
94
|
+
qc1.h(1)
|
95
|
+
custom = qc1.to_gate().control(2)
|
96
|
+
|
97
|
+
qc2 = QuantumCircuit(4)
|
98
|
+
qc2.append(custom, [0, 3, 1, 2])
|
99
|
+
qc2.draw('mpl')
|
100
|
+
"""
|
101
|
+
self.base_gate = None if base_gate is None else base_gate.copy()
|
102
|
+
super().__init__(name, num_qubits, params, label=label)
|
103
|
+
self._num_ctrl_qubits = 1
|
104
|
+
self.num_ctrl_qubits = num_ctrl_qubits
|
105
|
+
self.definition = copy.deepcopy(definition)
|
106
|
+
self._ctrl_state = None
|
107
|
+
self._open_ctrl = None
|
108
|
+
self.ctrl_state = ctrl_state
|
109
|
+
self._name = name
|
110
|
+
|
111
|
+
@property
|
112
|
+
def definition(self) -> QuantumCircuit:
|
113
|
+
"""Return definition in terms of other basic gates. If the gate has
|
114
|
+
open controls, as determined from :attr:`ctrl_state`, the returned
|
115
|
+
definition is conjugated with X without changing the internal
|
116
|
+
``_definition``.
|
117
|
+
"""
|
118
|
+
if self._open_ctrl:
|
119
|
+
closed_gate = self.to_mutable()
|
120
|
+
closed_gate.ctrl_state = None
|
121
|
+
bit_ctrl_state = bin(self.ctrl_state)[2:].zfill(self.num_ctrl_qubits)
|
122
|
+
qreg = QuantumRegister(self.num_qubits, "q")
|
123
|
+
qc_open_ctrl = QuantumCircuit(qreg)
|
124
|
+
for qind, val in enumerate(bit_ctrl_state[::-1]):
|
125
|
+
if val == "0":
|
126
|
+
qc_open_ctrl.x(qind)
|
127
|
+
qc_open_ctrl.append(closed_gate, qargs=qreg[:])
|
128
|
+
for qind, val in enumerate(bit_ctrl_state[::-1]):
|
129
|
+
if val == "0":
|
130
|
+
qc_open_ctrl.x(qind)
|
131
|
+
return qc_open_ctrl
|
132
|
+
else:
|
133
|
+
return super().definition
|
134
|
+
|
135
|
+
@definition.setter
|
136
|
+
def definition(self, excited_def: "QuantumCircuit"):
|
137
|
+
"""Set controlled gate definition with closed controls.
|
138
|
+
|
139
|
+
Args:
|
140
|
+
excited_def: The circuit with all closed controls.
|
141
|
+
"""
|
142
|
+
self._definition = excited_def
|
143
|
+
|
144
|
+
@property
|
145
|
+
def name(self) -> str:
|
146
|
+
"""Get name of gate. If the gate has open controls the gate name
|
147
|
+
will become:
|
148
|
+
|
149
|
+
<original_name_o<ctrl_state>
|
150
|
+
|
151
|
+
where <original_name> is the gate name for the default case of
|
152
|
+
closed control qubits and <ctrl_state> is the integer value of
|
153
|
+
the control state for the gate.
|
154
|
+
"""
|
155
|
+
if self._open_ctrl:
|
156
|
+
return f"{self._name}_o{self.ctrl_state}"
|
157
|
+
else:
|
158
|
+
return self._name
|
159
|
+
|
160
|
+
@name.setter
|
161
|
+
def name(self, name_str):
|
162
|
+
"""Set the name of the gate. Note the reported name may differ
|
163
|
+
from the set name if the gate has open controls.
|
164
|
+
"""
|
165
|
+
self._name = name_str
|
166
|
+
|
167
|
+
@property
|
168
|
+
def num_ctrl_qubits(self):
|
169
|
+
"""Get number of control qubits.
|
170
|
+
|
171
|
+
Returns:
|
172
|
+
int: The number of control qubits for the gate.
|
173
|
+
"""
|
174
|
+
return self._num_ctrl_qubits
|
175
|
+
|
176
|
+
@num_ctrl_qubits.setter
|
177
|
+
def num_ctrl_qubits(self, num_ctrl_qubits):
|
178
|
+
"""Set the number of control qubits.
|
179
|
+
|
180
|
+
Args:
|
181
|
+
num_ctrl_qubits (int): The number of control qubits.
|
182
|
+
|
183
|
+
Raises:
|
184
|
+
CircuitError: ``num_ctrl_qubits`` is not an integer in ``[1, num_qubits]``.
|
185
|
+
"""
|
186
|
+
if num_ctrl_qubits != int(num_ctrl_qubits):
|
187
|
+
raise CircuitError("The number of control qubits must be an integer.")
|
188
|
+
num_ctrl_qubits = int(num_ctrl_qubits)
|
189
|
+
# This is a range rather than an equality limit because some controlled gates represent a
|
190
|
+
# controlled version of the base gate whose definition also uses auxiliary qubits.
|
191
|
+
upper_limit = self.num_qubits - getattr(self.base_gate, "num_qubits", 0)
|
192
|
+
if num_ctrl_qubits < 1 or num_ctrl_qubits > upper_limit:
|
193
|
+
limit = "num_qubits" if self.base_gate is None else "num_qubits - base_gate.num_qubits"
|
194
|
+
raise CircuitError(f"The number of control qubits must be in `[1, {limit}]`.")
|
195
|
+
self._num_ctrl_qubits = num_ctrl_qubits
|
196
|
+
|
197
|
+
@property
|
198
|
+
def ctrl_state(self) -> int:
|
199
|
+
"""Return the control state of the gate as a decimal integer."""
|
200
|
+
return self._ctrl_state
|
201
|
+
|
202
|
+
@ctrl_state.setter
|
203
|
+
def ctrl_state(self, ctrl_state: Union[int, str, None]):
|
204
|
+
"""Set the control state of this gate.
|
205
|
+
|
206
|
+
Args:
|
207
|
+
ctrl_state: The control state of the gate.
|
208
|
+
|
209
|
+
Raises:
|
210
|
+
CircuitError: ctrl_state is invalid.
|
211
|
+
"""
|
212
|
+
self._ctrl_state = _ctrl_state_to_int(ctrl_state, self.num_ctrl_qubits)
|
213
|
+
self._open_ctrl = self.ctrl_state < 2**self.num_ctrl_qubits - 1
|
214
|
+
|
215
|
+
@property
|
216
|
+
def params(self):
|
217
|
+
"""Get parameters from base_gate.
|
218
|
+
|
219
|
+
Returns:
|
220
|
+
list: List of gate parameters.
|
221
|
+
|
222
|
+
Raises:
|
223
|
+
CircuitError: Controlled gate does not define a base gate
|
224
|
+
"""
|
225
|
+
if self.base_gate:
|
226
|
+
return self.base_gate.params
|
227
|
+
else:
|
228
|
+
raise CircuitError("Controlled gate does not define base gate for extracting params")
|
229
|
+
|
230
|
+
@params.setter
|
231
|
+
def params(self, parameters):
|
232
|
+
"""Set base gate parameters.
|
233
|
+
|
234
|
+
Args:
|
235
|
+
parameters (list): The list of parameters to set.
|
236
|
+
|
237
|
+
Raises:
|
238
|
+
CircuitError: If controlled gate does not define a base gate.
|
239
|
+
"""
|
240
|
+
if self.base_gate:
|
241
|
+
if self.base_gate.mutable:
|
242
|
+
self.base_gate.params = parameters
|
243
|
+
elif parameters:
|
244
|
+
raise CircuitError("cannot set parameters on immutable base gate")
|
245
|
+
else:
|
246
|
+
raise CircuitError("Controlled gate does not define base gate for extracting params")
|
247
|
+
|
248
|
+
def __deepcopy__(self, memo=None):
|
249
|
+
cpy = copy.copy(self)
|
250
|
+
cpy.base_gate = self.base_gate.copy()
|
251
|
+
if self._definition:
|
252
|
+
cpy._definition = copy.deepcopy(self._definition, memo)
|
253
|
+
return cpy
|
254
|
+
|
255
|
+
def __eq__(self, other) -> bool:
|
256
|
+
return (
|
257
|
+
isinstance(other, ControlledGate)
|
258
|
+
and self.num_ctrl_qubits == other.num_ctrl_qubits
|
259
|
+
and self.ctrl_state == other.ctrl_state
|
260
|
+
and self.base_gate == other.base_gate
|
261
|
+
and self.num_qubits == other.num_qubits
|
262
|
+
and self.num_clbits == other.num_clbits
|
263
|
+
and self.definition == other.definition
|
264
|
+
)
|
265
|
+
|
266
|
+
def inverse(self, annotated: bool = False) -> "ControlledGate" | "AnnotatedOperation":
|
267
|
+
"""Invert this gate by calling inverse on the base gate."""
|
268
|
+
if not annotated:
|
269
|
+
inverse_gate = self.base_gate.inverse().control(
|
270
|
+
self.num_ctrl_qubits, ctrl_state=self.ctrl_state
|
271
|
+
)
|
272
|
+
else:
|
273
|
+
inverse_gate = super().inverse(annotated=annotated)
|
274
|
+
return inverse_gate
|
qiskit/circuit/delay.py
ADDED
@@ -0,0 +1,157 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2020.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""
|
14
|
+
Delay instruction (for circuit module).
|
15
|
+
"""
|
16
|
+
import numpy as np
|
17
|
+
|
18
|
+
from qiskit.circuit.classical import expr, types
|
19
|
+
from qiskit.circuit.exceptions import CircuitError
|
20
|
+
from qiskit.circuit.instruction import Instruction
|
21
|
+
from qiskit.circuit.gate import Gate
|
22
|
+
from qiskit.circuit import _utils
|
23
|
+
from qiskit.circuit.parameterexpression import ParameterExpression
|
24
|
+
from qiskit._accelerate.circuit import StandardInstructionType
|
25
|
+
|
26
|
+
|
27
|
+
@_utils.with_gate_array(np.eye(2, dtype=complex))
|
28
|
+
class Delay(Instruction):
|
29
|
+
"""Do nothing and just delay/wait/idle for a specified duration."""
|
30
|
+
|
31
|
+
_standard_instruction_type = StandardInstructionType.Delay
|
32
|
+
|
33
|
+
def __init__(self, duration, unit=None):
|
34
|
+
"""
|
35
|
+
Args:
|
36
|
+
duration: the length of time of the duration. If this is an
|
37
|
+
:class:`~.expr.Expr`, it must be a constant expression of type
|
38
|
+
:class:`~.types.Duration` and the ``unit`` parameter should be
|
39
|
+
omitted (or MUST be "expr" if it is specified).
|
40
|
+
unit: the unit of the duration, if ``duration`` is a numeric
|
41
|
+
value. Must be ``"dt"``, an SI-prefixed seconds unit, or "expr".
|
42
|
+
|
43
|
+
Raises:
|
44
|
+
CircuitError: A ``duration`` expression was specified with a resolved
|
45
|
+
type that is not timing-based, or the ``unit`` was improperly specified.
|
46
|
+
"""
|
47
|
+
if isinstance(duration, expr.Expr):
|
48
|
+
if unit is not None and unit != "expr":
|
49
|
+
raise CircuitError(
|
50
|
+
"Argument 'unit' must not be specified for a duration expression."
|
51
|
+
)
|
52
|
+
if duration.type.kind is not types.Duration:
|
53
|
+
raise CircuitError(
|
54
|
+
f"Expression of type '{duration.type}' is not valid for 'duration'."
|
55
|
+
)
|
56
|
+
if not duration.const:
|
57
|
+
raise CircuitError("Duration expressions must be constant.")
|
58
|
+
unit = "expr"
|
59
|
+
elif unit is None:
|
60
|
+
unit = "dt"
|
61
|
+
elif unit not in {"s", "ms", "us", "ns", "ps", "dt"}:
|
62
|
+
raise CircuitError(f"Unknown unit {unit} is specified.")
|
63
|
+
# Double underscore to differentiate from the private attribute in
|
64
|
+
# `Instruction`. This can be changed to `_unit` in 2.0 after we
|
65
|
+
# remove `unit` and `duration` from the standard instruction model
|
66
|
+
# as it only will exist in `Delay` after that point.
|
67
|
+
self.__unit = unit
|
68
|
+
super().__init__("delay", 1, 0, params=[duration])
|
69
|
+
|
70
|
+
broadcast_arguments = Gate.broadcast_arguments
|
71
|
+
|
72
|
+
def inverse(self, annotated: bool = False):
|
73
|
+
"""Special case. Return self."""
|
74
|
+
return self
|
75
|
+
|
76
|
+
@property
|
77
|
+
def unit(self):
|
78
|
+
"""The unit for the duration of the delay in :attr`.params`"""
|
79
|
+
return self.__unit
|
80
|
+
|
81
|
+
@unit.setter
|
82
|
+
def unit(self, value):
|
83
|
+
if value not in {"s", "ms", "us", "ns", "ps", "dt"}:
|
84
|
+
raise CircuitError(f"Unknown unit {value} is specified.")
|
85
|
+
self.__unit = value
|
86
|
+
|
87
|
+
@property
|
88
|
+
def duration(self):
|
89
|
+
"""Get the duration of this delay."""
|
90
|
+
return self.params[0]
|
91
|
+
|
92
|
+
@duration.setter
|
93
|
+
def duration(self, duration):
|
94
|
+
"""Set the duration of this delay."""
|
95
|
+
self.params = [duration]
|
96
|
+
|
97
|
+
def to_matrix(self) -> np.ndarray:
|
98
|
+
"""Return a Numpy.array for the unitary matrix. This has been
|
99
|
+
added to enable simulation without making delay a full Gate type.
|
100
|
+
|
101
|
+
Returns:
|
102
|
+
np.ndarray: matrix representation.
|
103
|
+
"""
|
104
|
+
return self.__array__(dtype=complex)
|
105
|
+
|
106
|
+
def __eq__(self, other):
|
107
|
+
return (
|
108
|
+
isinstance(other, Delay) and self.unit == other.unit and self._compare_parameters(other)
|
109
|
+
)
|
110
|
+
|
111
|
+
def __repr__(self):
|
112
|
+
"""Return the official string representing the delay."""
|
113
|
+
return f"{self.__class__.__name__}(duration={self.params[0]}[unit={self.unit}])"
|
114
|
+
|
115
|
+
# pylint: disable=too-many-return-statements
|
116
|
+
def validate_parameter(self, parameter):
|
117
|
+
"""Delay parameter (i.e. duration) must be Expr, int, float or ParameterExpression."""
|
118
|
+
if isinstance(parameter, int):
|
119
|
+
if parameter < 0:
|
120
|
+
raise CircuitError(
|
121
|
+
f"Duration for Delay instruction must be positive. Found {parameter}"
|
122
|
+
)
|
123
|
+
return parameter
|
124
|
+
elif isinstance(parameter, float):
|
125
|
+
if parameter < 0:
|
126
|
+
raise CircuitError(
|
127
|
+
f"Duration for Delay instruction must be positive. Found {parameter}"
|
128
|
+
)
|
129
|
+
if self.__unit == "dt":
|
130
|
+
parameter_int = int(parameter)
|
131
|
+
if parameter != parameter_int:
|
132
|
+
raise CircuitError("Integer duration is expected for 'dt' unit.")
|
133
|
+
return parameter_int
|
134
|
+
return parameter
|
135
|
+
elif isinstance(parameter, expr.Expr):
|
136
|
+
if parameter.type.kind is not types.Duration:
|
137
|
+
raise CircuitError(f"Expression duration of type '{parameter.type}' is not valid.")
|
138
|
+
if not parameter.const:
|
139
|
+
raise CircuitError("Duration expressions must be constant.")
|
140
|
+
return parameter
|
141
|
+
elif isinstance(parameter, ParameterExpression):
|
142
|
+
if len(parameter.parameters) > 0:
|
143
|
+
return parameter # expression has free parameters, we cannot validate it
|
144
|
+
if not parameter.is_real():
|
145
|
+
raise CircuitError(f"Bound parameter expression is complex in delay {self.name}")
|
146
|
+
fval = float(parameter)
|
147
|
+
if fval < 0:
|
148
|
+
raise CircuitError(f"Duration for Delay instruction must be positive. Found {fval}")
|
149
|
+
if self.unit == "dt":
|
150
|
+
ival = int(parameter)
|
151
|
+
rounding_error = abs(fval - ival)
|
152
|
+
if rounding_error > 1e-15:
|
153
|
+
raise CircuitError("Integer parameter is required for duration in 'dt' unit.")
|
154
|
+
return ival
|
155
|
+
return fval # per default assume parameters must be real when bound
|
156
|
+
else:
|
157
|
+
raise CircuitError(f"Invalid param type {type(parameter)} for delay {self.name}.")
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2020.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""
|
14
|
+
Utilities for handling duration of a circuit instruction.
|
15
|
+
"""
|
16
|
+
import warnings
|
17
|
+
|
18
|
+
from qiskit.circuit import QuantumCircuit
|
19
|
+
from qiskit.circuit.exceptions import CircuitError
|
20
|
+
from qiskit.utils.units import apply_prefix
|
21
|
+
|
22
|
+
|
23
|
+
def duration_in_dt(duration_in_sec: float, dt_in_sec: float) -> int:
|
24
|
+
"""
|
25
|
+
Return duration in dt.
|
26
|
+
|
27
|
+
Args:
|
28
|
+
duration_in_sec: duration [s] to be converted.
|
29
|
+
dt_in_sec: duration of dt in seconds used for conversion.
|
30
|
+
|
31
|
+
Returns:
|
32
|
+
Duration in dt.
|
33
|
+
"""
|
34
|
+
res = round(duration_in_sec / dt_in_sec)
|
35
|
+
rounding_error = abs(duration_in_sec - res * dt_in_sec)
|
36
|
+
if rounding_error > 1e-15:
|
37
|
+
warnings.warn(
|
38
|
+
f"Duration is rounded to {res:d} [dt] = {res * dt_in_sec:e} [s] "
|
39
|
+
f"from {duration_in_sec:e} [s]",
|
40
|
+
UserWarning,
|
41
|
+
)
|
42
|
+
return res
|
43
|
+
|
44
|
+
|
45
|
+
def convert_durations_to_dt(qc: QuantumCircuit, dt_in_sec: float, inplace=True):
|
46
|
+
"""Convert all the durations in SI (seconds) into those in dt.
|
47
|
+
|
48
|
+
Returns a new circuit if `inplace=False`.
|
49
|
+
|
50
|
+
Parameters:
|
51
|
+
qc (QuantumCircuit): Duration of dt in seconds used for conversion.
|
52
|
+
dt_in_sec (float): Duration of dt in seconds used for conversion.
|
53
|
+
inplace (bool): All durations are converted inplace or return new circuit.
|
54
|
+
|
55
|
+
Returns:
|
56
|
+
QuantumCircuit: Converted circuit if `inplace = False`, otherwise None.
|
57
|
+
|
58
|
+
Raises:
|
59
|
+
CircuitError: if fail to convert durations.
|
60
|
+
"""
|
61
|
+
if inplace:
|
62
|
+
circ = qc
|
63
|
+
else:
|
64
|
+
circ = qc.copy()
|
65
|
+
|
66
|
+
if circ.duration is not None and circ.unit != "dt":
|
67
|
+
if not circ.unit.endswith("s"):
|
68
|
+
raise CircuitError(f"Invalid time unit: '{circ.unit}'")
|
69
|
+
|
70
|
+
duration = circ.duration
|
71
|
+
if circ.unit != "s":
|
72
|
+
duration = apply_prefix(duration, circ.unit)
|
73
|
+
|
74
|
+
circ.duration = duration_in_dt(duration, dt_in_sec)
|
75
|
+
circ.unit = "dt"
|
76
|
+
|
77
|
+
if not inplace:
|
78
|
+
return circ
|
79
|
+
else:
|
80
|
+
return None
|
@@ -0,0 +1,94 @@
|
|
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
|
+
"""Gate equivalence library."""
|
14
|
+
|
15
|
+
from rustworkx.visualization import graphviz_draw
|
16
|
+
import rustworkx as rx
|
17
|
+
|
18
|
+
|
19
|
+
from qiskit.exceptions import InvalidFileError
|
20
|
+
from qiskit._accelerate.equivalence import ( # pylint: disable=unused-import
|
21
|
+
BaseEquivalenceLibrary,
|
22
|
+
Key,
|
23
|
+
Equivalence,
|
24
|
+
NodeData,
|
25
|
+
EdgeData,
|
26
|
+
)
|
27
|
+
|
28
|
+
|
29
|
+
class EquivalenceLibrary(BaseEquivalenceLibrary):
|
30
|
+
"""A library providing a one-way mapping of Gates to their equivalent
|
31
|
+
implementations as QuantumCircuits."""
|
32
|
+
|
33
|
+
def draw(self, filename=None):
|
34
|
+
"""Draws the equivalence relations available in the library.
|
35
|
+
|
36
|
+
Args:
|
37
|
+
filename (str): An optional path to write the output image to
|
38
|
+
if specified this method will return None.
|
39
|
+
|
40
|
+
Returns:
|
41
|
+
PIL.Image or IPython.display.SVG: Drawn equivalence library as an
|
42
|
+
IPython SVG if in a jupyter notebook, or as a PIL.Image otherwise.
|
43
|
+
|
44
|
+
Raises:
|
45
|
+
InvalidFileError: if filename is not valid.
|
46
|
+
"""
|
47
|
+
image_type = None
|
48
|
+
if filename:
|
49
|
+
if "." not in filename:
|
50
|
+
raise InvalidFileError("Parameter 'filename' must be in format 'name.extension'")
|
51
|
+
image_type = filename.split(".")[-1]
|
52
|
+
return graphviz_draw(
|
53
|
+
self._build_basis_graph(),
|
54
|
+
lambda node: {"label": node["label"]},
|
55
|
+
lambda edge: edge,
|
56
|
+
filename=filename,
|
57
|
+
image_type=image_type,
|
58
|
+
)
|
59
|
+
|
60
|
+
def _build_basis_graph(self):
|
61
|
+
graph = rx.PyDiGraph()
|
62
|
+
|
63
|
+
node_map = {}
|
64
|
+
for key in super().keys():
|
65
|
+
name, num_qubits = key.name, key.num_qubits
|
66
|
+
equivalences = self._get_equivalences(key)
|
67
|
+
|
68
|
+
basis = frozenset([f"{name}/{num_qubits}"])
|
69
|
+
for equivalence in equivalences:
|
70
|
+
params, decomp = equivalence.params, equivalence.circuit
|
71
|
+
decomp_basis = frozenset(
|
72
|
+
f"{name}/{num_qubits}"
|
73
|
+
for name, num_qubits in {
|
74
|
+
(instruction.operation.name, instruction.operation.num_qubits)
|
75
|
+
for instruction in decomp.data
|
76
|
+
}
|
77
|
+
)
|
78
|
+
if basis not in node_map:
|
79
|
+
basis_node = graph.add_node({"basis": basis, "label": str(set(basis))})
|
80
|
+
node_map[basis] = basis_node
|
81
|
+
if decomp_basis not in node_map:
|
82
|
+
decomp_basis_node = graph.add_node(
|
83
|
+
{"basis": decomp_basis, "label": str(set(decomp_basis))}
|
84
|
+
)
|
85
|
+
node_map[decomp_basis] = decomp_basis_node
|
86
|
+
|
87
|
+
label = f"{str(params)}\n{str(decomp) if num_qubits <= 5 else '...'}"
|
88
|
+
graph.add_edge(
|
89
|
+
node_map[basis],
|
90
|
+
node_map[decomp_basis],
|
91
|
+
{"label": label, "fontname": "Courier", "fontsize": str(8)},
|
92
|
+
)
|
93
|
+
|
94
|
+
return graph
|
@@ -0,0 +1,18 @@
|
|
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
|
+
"""Session gates."""
|
14
|
+
|
15
|
+
from .library.standard_gates.equivalence_library import StandardEquivalenceLibrary
|
16
|
+
from .equivalence import EquivalenceLibrary
|
17
|
+
|
18
|
+
SessionEquivalenceLibrary = EquivalenceLibrary(base=StandardEquivalenceLibrary)
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2019.
|
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
|
+
"""Exceptions for errors raised while handling Quantum Circuits."""
|
14
|
+
|
15
|
+
from qiskit.exceptions import QiskitError
|
16
|
+
|
17
|
+
|
18
|
+
class CircuitError(QiskitError):
|
19
|
+
"""Base class for errors raised while processing a circuit."""
|