qiskit 2.1.0rc1__cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -0
- qiskit/__init__.py +159 -0
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +73 -0
- qiskit/circuit/__init__.py +1335 -0
- qiskit/circuit/_add_control.py +338 -0
- qiskit/circuit/_classical_resource_map.py +154 -0
- qiskit/circuit/_standard_gates_commutations.py +3849 -0
- qiskit/circuit/_utils.py +167 -0
- qiskit/circuit/annotated_operation.py +279 -0
- qiskit/circuit/annotation.py +404 -0
- qiskit/circuit/barrier.py +46 -0
- qiskit/circuit/classical/__init__.py +41 -0
- qiskit/circuit/classical/expr/__init__.py +266 -0
- qiskit/circuit/classical/expr/constructors.py +764 -0
- qiskit/circuit/classical/expr/expr.py +156 -0
- qiskit/circuit/classical/expr/visitors.py +381 -0
- qiskit/circuit/classical/types/__init__.py +113 -0
- qiskit/circuit/classical/types/ordering.py +229 -0
- qiskit/circuit/classical/types/types.py +30 -0
- qiskit/circuit/commutation_checker.py +133 -0
- qiskit/circuit/commutation_library.py +20 -0
- qiskit/circuit/controlflow/__init__.py +59 -0
- qiskit/circuit/controlflow/_builder_utils.py +211 -0
- qiskit/circuit/controlflow/box.py +188 -0
- qiskit/circuit/controlflow/break_loop.py +56 -0
- qiskit/circuit/controlflow/builder.py +791 -0
- qiskit/circuit/controlflow/continue_loop.py +56 -0
- qiskit/circuit/controlflow/control_flow.py +94 -0
- qiskit/circuit/controlflow/for_loop.py +218 -0
- qiskit/circuit/controlflow/if_else.py +498 -0
- qiskit/circuit/controlflow/switch_case.py +411 -0
- qiskit/circuit/controlflow/while_loop.py +166 -0
- qiskit/circuit/controlledgate.py +274 -0
- qiskit/circuit/delay.py +159 -0
- qiskit/circuit/duration.py +80 -0
- qiskit/circuit/equivalence.py +94 -0
- qiskit/circuit/equivalence_library.py +18 -0
- qiskit/circuit/exceptions.py +19 -0
- qiskit/circuit/gate.py +261 -0
- qiskit/circuit/instruction.py +564 -0
- qiskit/circuit/instructionset.py +132 -0
- qiskit/circuit/library/__init__.py +984 -0
- qiskit/circuit/library/arithmetic/__init__.py +40 -0
- qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +235 -0
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +131 -0
- qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
- qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -0
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +201 -0
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +506 -0
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +395 -0
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +501 -0
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
- qiskit/circuit/library/arithmetic/quadratic_form.py +370 -0
- qiskit/circuit/library/arithmetic/weighted_adder.py +428 -0
- qiskit/circuit/library/basis_change/__init__.py +15 -0
- qiskit/circuit/library/basis_change/qft.py +316 -0
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +322 -0
- qiskit/circuit/library/boolean_logic/__init__.py +18 -0
- qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
- qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
- qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
- qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -0
- qiskit/circuit/library/data_preparation/__init__.py +57 -0
- qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
- qiskit/circuit/library/data_preparation/initializer.py +107 -0
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
- qiskit/circuit/library/fourier_checking.py +160 -0
- qiskit/circuit/library/generalized_gates/__init__.py +30 -0
- qiskit/circuit/library/generalized_gates/diagonal.py +163 -0
- qiskit/circuit/library/generalized_gates/gms.py +179 -0
- qiskit/circuit/library/generalized_gates/gr.py +219 -0
- qiskit/circuit/library/generalized_gates/isometry.py +370 -0
- qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
- qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
- qiskit/circuit/library/generalized_gates/pauli.py +84 -0
- qiskit/circuit/library/generalized_gates/permutation.py +202 -0
- qiskit/circuit/library/generalized_gates/rv.py +96 -0
- qiskit/circuit/library/generalized_gates/uc.py +303 -0
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
- qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
- qiskit/circuit/library/generalized_gates/ucry.py +32 -0
- qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
- qiskit/circuit/library/generalized_gates/unitary.py +236 -0
- qiskit/circuit/library/graph_state.py +172 -0
- qiskit/circuit/library/grover_operator.py +583 -0
- qiskit/circuit/library/hamiltonian_gate.py +142 -0
- qiskit/circuit/library/hidden_linear_function.py +163 -0
- qiskit/circuit/library/iqp.py +180 -0
- qiskit/circuit/library/n_local/__init__.py +45 -0
- qiskit/circuit/library/n_local/efficient_su2.py +282 -0
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +301 -0
- qiskit/circuit/library/n_local/n_local.py +1478 -0
- qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
- qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
- qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
- qiskit/circuit/library/n_local/two_local.py +289 -0
- qiskit/circuit/library/overlap.py +183 -0
- qiskit/circuit/library/pauli_evolution.py +202 -0
- qiskit/circuit/library/phase_estimation.py +177 -0
- qiskit/circuit/library/phase_oracle.py +239 -0
- qiskit/circuit/library/quantum_volume.py +179 -0
- qiskit/circuit/library/standard_gates/__init__.py +141 -0
- qiskit/circuit/library/standard_gates/dcx.py +76 -0
- qiskit/circuit/library/standard_gates/ecr.py +126 -0
- qiskit/circuit/library/standard_gates/equivalence_library.py +1936 -0
- qiskit/circuit/library/standard_gates/global_phase.py +83 -0
- qiskit/circuit/library/standard_gates/h.py +230 -0
- qiskit/circuit/library/standard_gates/i.py +76 -0
- qiskit/circuit/library/standard_gates/iswap.py +115 -0
- qiskit/circuit/library/standard_gates/p.py +415 -0
- qiskit/circuit/library/standard_gates/r.py +108 -0
- qiskit/circuit/library/standard_gates/rx.py +269 -0
- qiskit/circuit/library/standard_gates/rxx.py +165 -0
- qiskit/circuit/library/standard_gates/ry.py +268 -0
- qiskit/circuit/library/standard_gates/ryy.py +165 -0
- qiskit/circuit/library/standard_gates/rz.py +290 -0
- qiskit/circuit/library/standard_gates/rzx.py +211 -0
- qiskit/circuit/library/standard_gates/rzz.py +181 -0
- qiskit/circuit/library/standard_gates/s.py +424 -0
- qiskit/circuit/library/standard_gates/swap.py +268 -0
- qiskit/circuit/library/standard_gates/sx.py +303 -0
- qiskit/circuit/library/standard_gates/t.py +169 -0
- qiskit/circuit/library/standard_gates/u.py +379 -0
- qiskit/circuit/library/standard_gates/u1.py +466 -0
- qiskit/circuit/library/standard_gates/u2.py +145 -0
- qiskit/circuit/library/standard_gates/u3.py +412 -0
- qiskit/circuit/library/standard_gates/x.py +1335 -0
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +164 -0
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +197 -0
- qiskit/circuit/library/standard_gates/y.py +253 -0
- qiskit/circuit/library/standard_gates/z.py +331 -0
- qiskit/circuit/library/templates/__init__.py +92 -0
- qiskit/circuit/library/templates/clifford/__init__.py +33 -0
- qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
- qiskit/circuit/library/templates/nct/__init__.py +67 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
- qiskit/circuit/library/templates/rzx/__init__.py +25 -0
- qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
- qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
- qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
- qiskit/circuit/measure.py +53 -0
- qiskit/circuit/operation.py +68 -0
- qiskit/circuit/parameter.py +188 -0
- qiskit/circuit/parameterexpression.py +737 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +140 -0
- qiskit/circuit/quantumcircuit.py +7610 -0
- qiskit/circuit/quantumcircuitdata.py +137 -0
- qiskit/circuit/random/__init__.py +50 -0
- qiskit/circuit/random/utils.py +755 -0
- qiskit/circuit/reset.py +37 -0
- qiskit/circuit/singleton.py +600 -0
- qiskit/circuit/store.py +89 -0
- qiskit/circuit/tools/__init__.py +16 -0
- qiskit/circuit/tools/pi_check.py +185 -0
- qiskit/circuit/twirling.py +145 -0
- qiskit/compiler/__init__.py +27 -0
- qiskit/compiler/transpiler.py +375 -0
- qiskit/converters/__init__.py +74 -0
- qiskit/converters/circuit_to_dag.py +80 -0
- qiskit/converters/circuit_to_dagdependency.py +49 -0
- qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
- qiskit/converters/circuit_to_gate.py +107 -0
- qiskit/converters/circuit_to_instruction.py +142 -0
- qiskit/converters/dag_to_circuit.py +79 -0
- qiskit/converters/dag_to_dagdependency.py +54 -0
- qiskit/converters/dag_to_dagdependency_v2.py +43 -0
- qiskit/converters/dagdependency_to_circuit.py +40 -0
- qiskit/converters/dagdependency_to_dag.py +48 -0
- qiskit/dagcircuit/__init__.py +44 -0
- qiskit/dagcircuit/collect_blocks.py +403 -0
- qiskit/dagcircuit/dagcircuit.py +24 -0
- qiskit/dagcircuit/dagdependency.py +612 -0
- qiskit/dagcircuit/dagdependency_v2.py +566 -0
- qiskit/dagcircuit/dagdepnode.py +160 -0
- qiskit/dagcircuit/dagnode.py +193 -0
- qiskit/dagcircuit/exceptions.py +42 -0
- qiskit/exceptions.py +153 -0
- qiskit/passmanager/__init__.py +258 -0
- qiskit/passmanager/base_tasks.py +230 -0
- qiskit/passmanager/compilation_status.py +74 -0
- qiskit/passmanager/exceptions.py +19 -0
- qiskit/passmanager/flow_controllers.py +116 -0
- qiskit/passmanager/passmanager.py +353 -0
- qiskit/primitives/__init__.py +490 -0
- qiskit/primitives/backend_estimator_v2.py +530 -0
- qiskit/primitives/backend_sampler_v2.py +339 -0
- qiskit/primitives/base/__init__.py +20 -0
- qiskit/primitives/base/base_estimator.py +247 -0
- qiskit/primitives/base/base_primitive_job.py +78 -0
- qiskit/primitives/base/base_primitive_v1.py +45 -0
- qiskit/primitives/base/base_result_v1.py +65 -0
- qiskit/primitives/base/base_sampler.py +196 -0
- qiskit/primitives/base/estimator_result_v1.py +46 -0
- qiskit/primitives/base/sampler_result_v1.py +45 -0
- qiskit/primitives/base/validation_v1.py +250 -0
- qiskit/primitives/containers/__init__.py +26 -0
- qiskit/primitives/containers/bindings_array.py +391 -0
- qiskit/primitives/containers/bit_array.py +764 -0
- qiskit/primitives/containers/data_bin.py +172 -0
- qiskit/primitives/containers/estimator_pub.py +222 -0
- qiskit/primitives/containers/object_array.py +94 -0
- qiskit/primitives/containers/observables_array.py +380 -0
- qiskit/primitives/containers/primitive_result.py +53 -0
- qiskit/primitives/containers/pub_result.py +51 -0
- qiskit/primitives/containers/sampler_pub.py +193 -0
- qiskit/primitives/containers/sampler_pub_result.py +74 -0
- qiskit/primitives/containers/shape.py +129 -0
- qiskit/primitives/primitive_job.py +100 -0
- qiskit/primitives/statevector_estimator.py +175 -0
- qiskit/primitives/statevector_sampler.py +290 -0
- qiskit/primitives/utils.py +72 -0
- qiskit/providers/__init__.py +677 -0
- qiskit/providers/backend.py +364 -0
- qiskit/providers/basic_provider/__init__.py +47 -0
- qiskit/providers/basic_provider/basic_provider.py +121 -0
- qiskit/providers/basic_provider/basic_provider_job.py +65 -0
- qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
- qiskit/providers/basic_provider/basic_simulator.py +693 -0
- qiskit/providers/basic_provider/exceptions.py +30 -0
- qiskit/providers/exceptions.py +33 -0
- qiskit/providers/fake_provider/__init__.py +69 -0
- qiskit/providers/fake_provider/generic_backend_v2.py +376 -0
- qiskit/providers/fake_provider/utils/__init__.py +15 -0
- qiskit/providers/job.py +147 -0
- qiskit/providers/jobstatus.py +30 -0
- qiskit/providers/options.py +273 -0
- qiskit/providers/providerutils.py +110 -0
- qiskit/qasm/libs/dummy/stdgates.inc +75 -0
- qiskit/qasm/libs/qelib1.inc +266 -0
- qiskit/qasm/libs/stdgates.inc +82 -0
- qiskit/qasm2/__init__.py +669 -0
- qiskit/qasm2/exceptions.py +27 -0
- qiskit/qasm2/export.py +364 -0
- qiskit/qasm2/parse.py +438 -0
- qiskit/qasm3/__init__.py +466 -0
- qiskit/qasm3/ast.py +796 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1363 -0
- qiskit/qasm3/printer.py +620 -0
- qiskit/qpy/__init__.py +2141 -0
- qiskit/qpy/binary_io/__init__.py +35 -0
- qiskit/qpy/binary_io/circuits.py +1687 -0
- qiskit/qpy/binary_io/parse_sympy_repr.py +126 -0
- qiskit/qpy/binary_io/schedules.py +288 -0
- qiskit/qpy/binary_io/value.py +1183 -0
- qiskit/qpy/common.py +361 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +458 -0
- qiskit/qpy/interface.py +384 -0
- qiskit/qpy/type_keys.py +415 -0
- qiskit/quantum_info/__init__.py +172 -0
- qiskit/quantum_info/analysis/__init__.py +17 -0
- qiskit/quantum_info/analysis/average.py +47 -0
- qiskit/quantum_info/analysis/distance.py +104 -0
- qiskit/quantum_info/analysis/make_observable.py +44 -0
- qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
- qiskit/quantum_info/operators/__init__.py +29 -0
- qiskit/quantum_info/operators/base_operator.py +145 -0
- qiskit/quantum_info/operators/channel/__init__.py +29 -0
- qiskit/quantum_info/operators/channel/chi.py +191 -0
- qiskit/quantum_info/operators/channel/choi.py +218 -0
- qiskit/quantum_info/operators/channel/kraus.py +337 -0
- qiskit/quantum_info/operators/channel/ptm.py +204 -0
- qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
- qiskit/quantum_info/operators/channel/stinespring.py +296 -0
- qiskit/quantum_info/operators/channel/superop.py +373 -0
- qiskit/quantum_info/operators/channel/transformations.py +490 -0
- qiskit/quantum_info/operators/custom_iterator.py +48 -0
- qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
- qiskit/quantum_info/operators/dihedral/dihedral.py +511 -0
- qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
- qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
- qiskit/quantum_info/operators/dihedral/random.py +64 -0
- qiskit/quantum_info/operators/linear_op.py +25 -0
- qiskit/quantum_info/operators/measures.py +418 -0
- qiskit/quantum_info/operators/mixins/__init__.py +52 -0
- qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
- qiskit/quantum_info/operators/mixins/group.py +171 -0
- qiskit/quantum_info/operators/mixins/linear.py +84 -0
- qiskit/quantum_info/operators/mixins/multiply.py +62 -0
- qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
- qiskit/quantum_info/operators/op_shape.py +525 -0
- qiskit/quantum_info/operators/operator.py +869 -0
- qiskit/quantum_info/operators/operator_utils.py +76 -0
- qiskit/quantum_info/operators/predicates.py +183 -0
- qiskit/quantum_info/operators/random.py +154 -0
- qiskit/quantum_info/operators/scalar_op.py +254 -0
- qiskit/quantum_info/operators/symplectic/__init__.py +24 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
- qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +584 -0
- qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
- qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -0
- qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
- qiskit/quantum_info/operators/symplectic/random.py +117 -0
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1239 -0
- qiskit/quantum_info/operators/utils/__init__.py +20 -0
- qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
- qiskit/quantum_info/operators/utils/commutator.py +36 -0
- qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
- qiskit/quantum_info/quaternion.py +156 -0
- qiskit/quantum_info/random.py +26 -0
- qiskit/quantum_info/states/__init__.py +28 -0
- qiskit/quantum_info/states/densitymatrix.py +857 -0
- qiskit/quantum_info/states/measures.py +288 -0
- qiskit/quantum_info/states/quantum_state.py +503 -0
- qiskit/quantum_info/states/random.py +157 -0
- qiskit/quantum_info/states/stabilizerstate.py +805 -0
- qiskit/quantum_info/states/statevector.py +977 -0
- qiskit/quantum_info/states/utils.py +247 -0
- qiskit/result/__init__.py +61 -0
- qiskit/result/counts.py +189 -0
- qiskit/result/distributions/__init__.py +17 -0
- qiskit/result/distributions/probability.py +100 -0
- qiskit/result/distributions/quasi.py +154 -0
- qiskit/result/exceptions.py +40 -0
- qiskit/result/models.py +241 -0
- qiskit/result/postprocess.py +239 -0
- qiskit/result/result.py +385 -0
- qiskit/result/sampled_expval.py +76 -0
- qiskit/result/utils.py +294 -0
- qiskit/synthesis/__init__.py +250 -0
- qiskit/synthesis/arithmetic/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +107 -0
- qiskit/synthesis/arithmetic/adders/rv_ripple_carry_adder.py +156 -0
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
- qiskit/synthesis/arithmetic/comparators/__init__.py +16 -0
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/synthesis/boolean/__init__.py +13 -0
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/clifford/__init__.py +19 -0
- qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
- qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
- qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
- qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
- qiskit/synthesis/cnotdihedral/__init__.py +17 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
- qiskit/synthesis/discrete_basis/__init__.py +16 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +53 -0
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +280 -0
- qiskit/synthesis/evolution/__init__.py +21 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +123 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +316 -0
- qiskit/synthesis/evolution/qdrift.py +133 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +227 -0
- qiskit/synthesis/linear/__init__.py +26 -0
- qiskit/synthesis/linear/cnot_synth.py +69 -0
- qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
- qiskit/synthesis/linear/linear_depth_lnn.py +61 -0
- qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
- qiskit/synthesis/linear_phase/__init__.py +17 -0
- qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +61 -0
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
- qiskit/synthesis/multi_controlled/__init__.py +29 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +583 -0
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +205 -0
- qiskit/synthesis/one_qubit/__init__.py +15 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
- qiskit/synthesis/permutation/__init__.py +18 -0
- qiskit/synthesis/permutation/permutation_full.py +78 -0
- qiskit/synthesis/permutation/permutation_lnn.py +54 -0
- qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
- qiskit/synthesis/permutation/permutation_utils.py +16 -0
- qiskit/synthesis/qft/__init__.py +16 -0
- qiskit/synthesis/qft/qft_decompose_full.py +97 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +61 -0
- qiskit/synthesis/stabilizer/__init__.py +16 -0
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
- qiskit/synthesis/two_qubit/__init__.py +20 -0
- qiskit/synthesis/two_qubit/local_invariance.py +63 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +583 -0
- qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
- qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
- qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
- qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
- qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
- qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
- qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
- qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
- qiskit/synthesis/unitary/__init__.py +13 -0
- qiskit/synthesis/unitary/aqc/__init__.py +177 -0
- qiskit/synthesis/unitary/aqc/approximate.py +116 -0
- qiskit/synthesis/unitary/aqc/aqc.py +175 -0
- qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
- qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
- qiskit/synthesis/unitary/qsd.py +359 -0
- qiskit/transpiler/__init__.py +1352 -0
- qiskit/transpiler/basepasses.py +190 -0
- qiskit/transpiler/coupling.py +500 -0
- qiskit/transpiler/exceptions.py +59 -0
- qiskit/transpiler/instruction_durations.py +263 -0
- qiskit/transpiler/layout.py +740 -0
- qiskit/transpiler/passes/__init__.py +278 -0
- qiskit/transpiler/passes/analysis/__init__.py +23 -0
- qiskit/transpiler/passes/analysis/count_ops.py +30 -0
- qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
- qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
- qiskit/transpiler/passes/analysis/depth.py +33 -0
- qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
- qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
- qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
- qiskit/transpiler/passes/analysis/size.py +36 -0
- qiskit/transpiler/passes/analysis/width.py +27 -0
- qiskit/transpiler/passes/basis/__init__.py +19 -0
- qiskit/transpiler/passes/basis/basis_translator.py +138 -0
- qiskit/transpiler/passes/basis/decompose.py +137 -0
- qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +84 -0
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +110 -0
- qiskit/transpiler/passes/layout/__init__.py +26 -0
- qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
- qiskit/transpiler/passes/layout/apply_layout.py +128 -0
- qiskit/transpiler/passes/layout/csp_layout.py +132 -0
- qiskit/transpiler/passes/layout/dense_layout.py +197 -0
- qiskit/transpiler/passes/layout/disjoint_utils.py +54 -0
- qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +116 -0
- qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
- qiskit/transpiler/passes/layout/sabre_layout.py +525 -0
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
- qiskit/transpiler/passes/layout/set_layout.py +69 -0
- qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
- qiskit/transpiler/passes/layout/vf2_layout.py +292 -0
- qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
- qiskit/transpiler/passes/layout/vf2_utils.py +245 -0
- qiskit/transpiler/passes/optimization/__init__.py +42 -0
- qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
- qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
- qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +117 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +109 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +85 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +242 -0
- qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
- qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
- qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +176 -0
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
- qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +267 -0
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +251 -0
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
- qiskit/transpiler/passes/optimization/optimize_annotated.py +449 -0
- qiskit/transpiler/passes/optimization/optimize_clifford_t.py +68 -0
- qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
- qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
- qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
- qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +70 -0
- qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -0
- qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
- qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
- qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +633 -0
- qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
- qiskit/transpiler/passes/routing/__init__.py +21 -0
- qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
- qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
- qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
- qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
- qiskit/transpiler/passes/routing/basic_swap.py +166 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +397 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
- qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
- qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
- qiskit/transpiler/passes/routing/sabre_swap.py +465 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +433 -0
- qiskit/transpiler/passes/routing/utils.py +35 -0
- qiskit/transpiler/passes/scheduling/__init__.py +21 -0
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
- qiskit/transpiler/passes/scheduling/padding/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
- qiskit/transpiler/passes/scheduling/padding/context_aware_dynamical_decoupling.py +876 -0
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
- qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
- qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
- qiskit/transpiler/passes/synthesis/__init__.py +21 -0
- qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
- qiskit/transpiler/passes/synthesis/clifford_unitary_synth_plugin.py +123 -0
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
- qiskit/transpiler/passes/synthesis/hls_plugins.py +2338 -0
- qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
- qiskit/transpiler/passes/synthesis/plugin.py +738 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +318 -0
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
- qiskit/transpiler/passes/utils/__init__.py +32 -0
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
- qiskit/transpiler/passes/utils/check_gate_direction.py +60 -0
- qiskit/transpiler/passes/utils/check_map.py +78 -0
- qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
- qiskit/transpiler/passes/utils/control_flow.py +61 -0
- qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
- qiskit/transpiler/passes/utils/error.py +69 -0
- qiskit/transpiler/passes/utils/filter_op_nodes.py +66 -0
- qiskit/transpiler/passes/utils/fixed_point.py +48 -0
- qiskit/transpiler/passes/utils/gate_direction.py +93 -0
- qiskit/transpiler/passes/utils/gates_basis.py +51 -0
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
- qiskit/transpiler/passes/utils/minimum_point.py +118 -0
- qiskit/transpiler/passes/utils/remove_barriers.py +50 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
- qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
- qiskit/transpiler/passmanager.py +503 -0
- qiskit/transpiler/passmanager_config.py +154 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1114 -0
- qiskit/transpiler/preset_passmanagers/common.py +773 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +443 -0
- qiskit/transpiler/preset_passmanagers/level0.py +104 -0
- qiskit/transpiler/preset_passmanagers/level1.py +108 -0
- qiskit/transpiler/preset_passmanagers/level2.py +109 -0
- qiskit/transpiler/preset_passmanagers/level3.py +110 -0
- qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
- qiskit/transpiler/target.py +905 -0
- qiskit/transpiler/timing_constraints.py +59 -0
- qiskit/user_config.py +266 -0
- qiskit/utils/__init__.py +90 -0
- qiskit/utils/classtools.py +146 -0
- qiskit/utils/deprecation.py +382 -0
- qiskit/utils/lazy_tester.py +363 -0
- qiskit/utils/optionals.py +355 -0
- qiskit/utils/parallel.py +318 -0
- qiskit/utils/units.py +146 -0
- qiskit/version.py +84 -0
- qiskit/visualization/__init__.py +290 -0
- qiskit/visualization/array.py +207 -0
- qiskit/visualization/bloch.py +778 -0
- qiskit/visualization/circuit/__init__.py +15 -0
- qiskit/visualization/circuit/_utils.py +677 -0
- qiskit/visualization/circuit/circuit_visualization.py +735 -0
- qiskit/visualization/circuit/latex.py +668 -0
- qiskit/visualization/circuit/matplotlib.py +2041 -0
- qiskit/visualization/circuit/qcstyle.py +130 -0
- qiskit/visualization/circuit/styles/__init__.py +13 -0
- qiskit/visualization/circuit/styles/bw.json +202 -0
- qiskit/visualization/circuit/styles/clifford.json +202 -0
- qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
- qiskit/visualization/circuit/styles/iqp.json +214 -0
- qiskit/visualization/circuit/styles/textbook.json +202 -0
- qiskit/visualization/circuit/text.py +1849 -0
- qiskit/visualization/circuit_visualization.py +19 -0
- qiskit/visualization/counts_visualization.py +487 -0
- qiskit/visualization/dag/__init__.py +13 -0
- qiskit/visualization/dag/dagstyle.py +103 -0
- qiskit/visualization/dag/styles/__init__.py +13 -0
- qiskit/visualization/dag/styles/color.json +10 -0
- qiskit/visualization/dag/styles/plain.json +5 -0
- qiskit/visualization/dag_visualization.py +389 -0
- qiskit/visualization/exceptions.py +21 -0
- qiskit/visualization/gate_map.py +1424 -0
- qiskit/visualization/library.py +40 -0
- qiskit/visualization/pass_manager_visualization.py +312 -0
- qiskit/visualization/state_visualization.py +1546 -0
- qiskit/visualization/style.py +223 -0
- qiskit/visualization/timeline/__init__.py +21 -0
- qiskit/visualization/timeline/core.py +495 -0
- qiskit/visualization/timeline/drawings.py +260 -0
- qiskit/visualization/timeline/generators.py +506 -0
- qiskit/visualization/timeline/interface.py +444 -0
- qiskit/visualization/timeline/layouts.py +115 -0
- qiskit/visualization/timeline/plotters/__init__.py +16 -0
- qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
- qiskit/visualization/timeline/plotters/matplotlib.py +195 -0
- qiskit/visualization/timeline/stylesheet.py +301 -0
- qiskit/visualization/timeline/types.py +148 -0
- qiskit/visualization/transition_visualization.py +369 -0
- qiskit/visualization/utils.py +49 -0
- qiskit-2.1.0rc1.dist-info/METADATA +221 -0
- qiskit-2.1.0rc1.dist-info/RECORD +699 -0
- qiskit-2.1.0rc1.dist-info/WHEEL +6 -0
- qiskit-2.1.0rc1.dist-info/entry_points.txt +88 -0
- qiskit-2.1.0rc1.dist-info/licenses/LICENSE.txt +203 -0
- qiskit-2.1.0rc1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,755 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2024.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Utility functions for generating random circuits."""
|
14
|
+
import numpy as np
|
15
|
+
from rustworkx import PyDiGraph
|
16
|
+
|
17
|
+
from qiskit.circuit import (
|
18
|
+
ClassicalRegister,
|
19
|
+
QuantumCircuit,
|
20
|
+
CircuitInstruction,
|
21
|
+
)
|
22
|
+
from qiskit.circuit import Reset
|
23
|
+
from qiskit.circuit.library import standard_gates
|
24
|
+
from qiskit.circuit.exceptions import CircuitError
|
25
|
+
from qiskit.quantum_info.operators.symplectic.clifford_circuits import _BASIS_1Q, _BASIS_2Q
|
26
|
+
|
27
|
+
# (Gate class, number of qubits, number of parameters)
|
28
|
+
gates_1q_data = [
|
29
|
+
(standard_gates.IGate, 1, 0),
|
30
|
+
(standard_gates.SXGate, 1, 0),
|
31
|
+
(standard_gates.XGate, 1, 0),
|
32
|
+
(standard_gates.RZGate, 1, 1),
|
33
|
+
(standard_gates.RGate, 1, 2),
|
34
|
+
(standard_gates.HGate, 1, 0),
|
35
|
+
(standard_gates.PhaseGate, 1, 1),
|
36
|
+
(standard_gates.RXGate, 1, 1),
|
37
|
+
(standard_gates.RYGate, 1, 1),
|
38
|
+
(standard_gates.SGate, 1, 0),
|
39
|
+
(standard_gates.SdgGate, 1, 0),
|
40
|
+
(standard_gates.SXdgGate, 1, 0),
|
41
|
+
(standard_gates.TGate, 1, 0),
|
42
|
+
(standard_gates.TdgGate, 1, 0),
|
43
|
+
(standard_gates.UGate, 1, 3),
|
44
|
+
(standard_gates.U1Gate, 1, 1),
|
45
|
+
(standard_gates.U2Gate, 1, 2),
|
46
|
+
(standard_gates.U3Gate, 1, 3),
|
47
|
+
(standard_gates.YGate, 1, 0),
|
48
|
+
(standard_gates.ZGate, 1, 0),
|
49
|
+
]
|
50
|
+
|
51
|
+
gates_2q_data = [
|
52
|
+
(standard_gates.CXGate, 2, 0),
|
53
|
+
(standard_gates.DCXGate, 2, 0),
|
54
|
+
(standard_gates.CHGate, 2, 0),
|
55
|
+
(standard_gates.CPhaseGate, 2, 1),
|
56
|
+
(standard_gates.CRXGate, 2, 1),
|
57
|
+
(standard_gates.CRYGate, 2, 1),
|
58
|
+
(standard_gates.CRZGate, 2, 1),
|
59
|
+
(standard_gates.CSXGate, 2, 0),
|
60
|
+
(standard_gates.CUGate, 2, 4),
|
61
|
+
(standard_gates.CU1Gate, 2, 1),
|
62
|
+
(standard_gates.CU3Gate, 2, 3),
|
63
|
+
(standard_gates.CYGate, 2, 0),
|
64
|
+
(standard_gates.CZGate, 2, 0),
|
65
|
+
(standard_gates.RXXGate, 2, 1),
|
66
|
+
(standard_gates.RYYGate, 2, 1),
|
67
|
+
(standard_gates.RZZGate, 2, 1),
|
68
|
+
(standard_gates.RZXGate, 2, 1),
|
69
|
+
(standard_gates.XXMinusYYGate, 2, 2),
|
70
|
+
(standard_gates.XXPlusYYGate, 2, 2),
|
71
|
+
(standard_gates.ECRGate, 2, 0),
|
72
|
+
(standard_gates.CSGate, 2, 0),
|
73
|
+
(standard_gates.CSdgGate, 2, 0),
|
74
|
+
(standard_gates.SwapGate, 2, 0),
|
75
|
+
(standard_gates.iSwapGate, 2, 0),
|
76
|
+
]
|
77
|
+
|
78
|
+
|
79
|
+
def random_circuit_from_graph(
|
80
|
+
interaction_graph,
|
81
|
+
min_2q_gate_per_edge=1,
|
82
|
+
max_operands=2,
|
83
|
+
measure=False,
|
84
|
+
conditional=False,
|
85
|
+
reset=False,
|
86
|
+
seed=None,
|
87
|
+
insert_1q_oper=True,
|
88
|
+
prob_conditional=0.1,
|
89
|
+
prob_reset=0.1,
|
90
|
+
):
|
91
|
+
"""Generate random circuit of arbitrary size and form which strictly respects the interaction
|
92
|
+
graph passed as argument. Interaction Graph is a graph G=(V, E) where V are the qubits in the
|
93
|
+
circuit, and, E is the set of two-qubit gate interactions between two particular qubits in the
|
94
|
+
circuit.
|
95
|
+
|
96
|
+
This function will generate a random circuit by randomly selecting 1Q and 2Q gates from the set
|
97
|
+
of standard gates in :mod:`qiskit.circuit.library.standard_gates`. The user can attach a numerical
|
98
|
+
value as a metadata to the edge of the graph indicating the edge weight for that particular edge,
|
99
|
+
These edge weights would be normalized to the probabilities of the edges getting selected.
|
100
|
+
If all the edge weights are passed as `None`, then the probability of each qubit-pair of getting
|
101
|
+
selected is set to 1/N, where `N` is the number of edges in the `interaction_graph` passed in,
|
102
|
+
i.e each edge is drawn uniformly. If any weight of an edge is set as zero, that particular
|
103
|
+
edge will not be included in the output circuit.
|
104
|
+
|
105
|
+
Passing a list of tuples of control qubit, target qubit and associated probability is also
|
106
|
+
acceptable as a way to specify an interaction graph.
|
107
|
+
|
108
|
+
If numerical values are present as probabilities but some/any are None, or negative, when
|
109
|
+
`max_operands=2` this will raise a ValueError.
|
110
|
+
|
111
|
+
If `max_operands` is set to 1, then there are no 2Q operations, so no need to take care
|
112
|
+
of the edges, in such case the function will return a circuit from the `random_circuit` function,
|
113
|
+
which would be passed with the `max_operands` as 1.
|
114
|
+
|
115
|
+
If `max_operands` is set to 2, then in every while-iteration 2Q gates are chosen randomly, and
|
116
|
+
qubit-pairs which exist in the input interaction graph are also chosen randomly based on the
|
117
|
+
probability attached to the qubit-pair. Then in a for-iteration 2Q gates are applied to the
|
118
|
+
randomly chosen qubit-pairs with the aim to reach the count of 2Q on any qubit-pair to
|
119
|
+
`min_2q_gate_per_edge` criteria as soon as possible within a particular iteration. Now, if
|
120
|
+
some qubits are still idle after applying 2Q gates for that particular iteration, then randomly
|
121
|
+
chosen 1Q gates are applied to those idle qubits if `insert_1q_oper` is set to True.
|
122
|
+
|
123
|
+
Example:
|
124
|
+
|
125
|
+
.. plot::
|
126
|
+
:alt: Pass in interaction graph and minimum 2Q gate per edge as a bare minimum.
|
127
|
+
:include-source:
|
128
|
+
|
129
|
+
from qiskit.circuit.random.utils import random_circuit_from_graph
|
130
|
+
import rustworkx as rx
|
131
|
+
pydi_graph = rx.PyDiGraph()
|
132
|
+
pydi_graph.add_nodes_from(range(7))
|
133
|
+
cp_map = [(0, 1, 0.18), (1, 2, 0.15), (2, 3, 0.15), (3, 4, 0.22), (4, 5, 0.13), (5, 6, 0.17)]
|
134
|
+
pydi_graph.add_edges_from(cp_map)
|
135
|
+
# cp_map can be passed in directly as interaction_graph
|
136
|
+
qc = random_circuit_from_graph(pydi_graph, min_2q_gate_per_edge=2, seed=12345)
|
137
|
+
qc.draw(output='mpl')
|
138
|
+
|
139
|
+
Args:
|
140
|
+
interaction_graph (PyGraph | PyDiGraph | List[Tuple[int, int, float]]): Interaction Graph
|
141
|
+
min_2q_gate_per_edge (int): Minimum number of times every qubit-pair must be used
|
142
|
+
in the random circuit. (optional, default:1)
|
143
|
+
max_operands (int): maximum qubit operands of each gate(should be 1 or 2)
|
144
|
+
(optional, default:2)
|
145
|
+
measure (bool): if True, measure all qubits at the end. (optional, default: False)
|
146
|
+
conditional (bool): if True, insert middle measurements and conditionals.
|
147
|
+
(optional, default: False)
|
148
|
+
reset (bool): if True, insert middle resets. (optional, default: False)
|
149
|
+
seed (int): sets random seed. (If `None`, a random seed is chosen) (optional)
|
150
|
+
insert_1q_oper (bool): Insert 1Q operations to the circuit. (optional, default: True)
|
151
|
+
prob_conditional (float): Probability less than 1.0, this is used to control the occurrence
|
152
|
+
of conditionals in the circuit. (optional, default: 0.1)
|
153
|
+
prob_reset (float): Probability less than 1.0, this is used to control the occurrence of
|
154
|
+
reset in the circuit. (optional, default: 0.1)
|
155
|
+
|
156
|
+
Returns:
|
157
|
+
QuantumCircuit: constructed circuit
|
158
|
+
|
159
|
+
Raises:
|
160
|
+
CircuitError: When `max_operands` is not 1 or 2.
|
161
|
+
CircuitError: When `max_operands` is set to 1, but no 1Q operations are allowed by setting
|
162
|
+
`insert_1q_oper` to false.
|
163
|
+
CircuitError: When the interaction graph has no edges, so only 1Q gates are possible in
|
164
|
+
the circuit, but `insert_1q_oper` is set to False.
|
165
|
+
CircuitError: When an invalid interaction graph object is passed.
|
166
|
+
ValueError: Given `max_operands=2`, when any edge have probability `None` but not all, or any
|
167
|
+
of the probabilities are negative.
|
168
|
+
"""
|
169
|
+
|
170
|
+
# max_operands should be 1 or 2
|
171
|
+
if max_operands not in {1, 2}:
|
172
|
+
raise CircuitError("`max_operands` should be either 1 or 2")
|
173
|
+
|
174
|
+
if max_operands == 1 and not insert_1q_oper:
|
175
|
+
raise CircuitError(
|
176
|
+
"`max_operands` of 1 means only 1Q gates are allowed, but `insert_1q_oper` is False"
|
177
|
+
)
|
178
|
+
|
179
|
+
# Declaring variables so lint doesn't complaint.
|
180
|
+
num_qubits = 0
|
181
|
+
num_edges = None
|
182
|
+
edge_list = None
|
183
|
+
edges_probs = None
|
184
|
+
|
185
|
+
if isinstance(interaction_graph, list):
|
186
|
+
num_edges = len(interaction_graph)
|
187
|
+
edge_list = []
|
188
|
+
edges_probs = []
|
189
|
+
for ctrl, trgt, prob in interaction_graph:
|
190
|
+
edge_list.append((ctrl, trgt))
|
191
|
+
edges_probs.append(prob)
|
192
|
+
|
193
|
+
if ctrl > num_qubits:
|
194
|
+
num_qubits = ctrl
|
195
|
+
|
196
|
+
if trgt > num_qubits:
|
197
|
+
num_qubits = trgt
|
198
|
+
|
199
|
+
num_qubits += 1 # ctrl, trgt are qubit indices.
|
200
|
+
edge_list = np.array(edge_list)
|
201
|
+
edges_probs = np.array(edges_probs)
|
202
|
+
elif isinstance(interaction_graph, PyDiGraph):
|
203
|
+
num_qubits = interaction_graph.num_nodes()
|
204
|
+
num_edges = interaction_graph.num_edges()
|
205
|
+
edge_list = np.array(interaction_graph.edge_list())
|
206
|
+
edges_probs = np.array(interaction_graph.edges())
|
207
|
+
else:
|
208
|
+
raise CircuitError("Invalid interaction graph object has been passed")
|
209
|
+
|
210
|
+
if num_qubits == 0:
|
211
|
+
return QuantumCircuit()
|
212
|
+
|
213
|
+
max_operands = max_operands if num_qubits > max_operands else num_qubits
|
214
|
+
|
215
|
+
if num_edges == 0 and not insert_1q_oper:
|
216
|
+
raise CircuitError(
|
217
|
+
"There are no edges in the `interaction_graph` so, there could be only 1Q gates, "
|
218
|
+
"however `insert_1q_oper` is set to `False`"
|
219
|
+
)
|
220
|
+
|
221
|
+
if num_edges == 0 or max_operands == 1:
|
222
|
+
# If there is no edge then there could be no 2Q operation
|
223
|
+
# or, if only 1Q operations are allowed, then there is no
|
224
|
+
# point in considering edges.
|
225
|
+
return random_circuit(
|
226
|
+
num_qubits=num_qubits,
|
227
|
+
depth=min_2q_gate_per_edge,
|
228
|
+
max_operands=1,
|
229
|
+
measure=measure,
|
230
|
+
conditional=conditional,
|
231
|
+
reset=reset,
|
232
|
+
seed=seed,
|
233
|
+
)
|
234
|
+
|
235
|
+
# If any edge weight is zero, just remove that edge from the edge_list
|
236
|
+
if 0 in edges_probs:
|
237
|
+
_mask = edges_probs != 0
|
238
|
+
edges_probs = edges_probs[_mask]
|
239
|
+
edge_list = edge_list[_mask]
|
240
|
+
|
241
|
+
# Update 'num_edges'
|
242
|
+
num_edges = len(edge_list)
|
243
|
+
|
244
|
+
# Now, zeros are filtered out in above if-block.
|
245
|
+
# Now, If none of the edges_probs are `None`
|
246
|
+
if all(edges_probs):
|
247
|
+
|
248
|
+
# edge weights in interaction_graph must be positive
|
249
|
+
for prob in edges_probs:
|
250
|
+
if prob < 0:
|
251
|
+
raise ValueError("Probabilities cannot be negative")
|
252
|
+
|
253
|
+
# Normalize edge weights if not already normalized.
|
254
|
+
probs_sum = edges_probs.sum()
|
255
|
+
if not np.isclose(probs_sum, 1.000, rtol=0.001):
|
256
|
+
edges_probs = edges_probs / probs_sum
|
257
|
+
# If any of the values of the probability is None, then it would raise an error.
|
258
|
+
elif any(edges_probs):
|
259
|
+
raise ValueError(
|
260
|
+
"Some of the probabilities of a qubit-pair getting selected is `None`"
|
261
|
+
" It should either be all `None` or all positive numerical weights. "
|
262
|
+
)
|
263
|
+
|
264
|
+
# If all edge weights are none, assume the weight of each edge to be 1/N.
|
265
|
+
elif None in edges_probs:
|
266
|
+
edges_probs = np.ones(num_edges) / num_edges
|
267
|
+
|
268
|
+
gates_2q = np.array(
|
269
|
+
gates_2q_data,
|
270
|
+
dtype=[("class", object), ("num_qubits", np.int64), ("num_params", np.int64)],
|
271
|
+
)
|
272
|
+
|
273
|
+
if insert_1q_oper:
|
274
|
+
gates_1q = np.array(gates_1q_data, dtype=gates_2q.dtype)
|
275
|
+
|
276
|
+
qc = QuantumCircuit(num_qubits)
|
277
|
+
|
278
|
+
if measure or conditional:
|
279
|
+
cr = ClassicalRegister(num_qubits, "c")
|
280
|
+
qc.add_register(cr)
|
281
|
+
|
282
|
+
if seed is None:
|
283
|
+
seed = np.random.randint(0, np.iinfo(np.int32).max)
|
284
|
+
rng = np.random.default_rng(seed)
|
285
|
+
|
286
|
+
qubits = np.array(qc.qubits, dtype=object, copy=True)
|
287
|
+
|
288
|
+
edges_used = {tuple(edge): 0 for edge in edge_list}
|
289
|
+
|
290
|
+
# Declaring variables, so that lint doesn't complaint.
|
291
|
+
reset_2q = None
|
292
|
+
cond_val_2q = None
|
293
|
+
cond_val_1q = None
|
294
|
+
|
295
|
+
# If conditional is not required, there is no need to calculate random numbers.
|
296
|
+
# But, since the variables are required in the for-loop so let's get an array of false.
|
297
|
+
if not conditional:
|
298
|
+
cond_1q = np.zeros(num_qubits, dtype=bool)
|
299
|
+
cond_2q = np.zeros(num_edges, dtype=bool)
|
300
|
+
|
301
|
+
# Similarly, if resets are not required, then since, the variable is required
|
302
|
+
# in the for-loop, let's get an array of false.
|
303
|
+
if not reset:
|
304
|
+
reset_2q = np.zeros(num_edges, dtype=bool)
|
305
|
+
|
306
|
+
# This loop will keep on applying gates to qubits until every qubit-pair
|
307
|
+
# has 2Q operations applied at-least `min_2q_gate_per_edge` times.
|
308
|
+
while edges_used:
|
309
|
+
|
310
|
+
# For any given while-iteration, this is a set of qubits not having any 2Q gates.
|
311
|
+
# Qubits in this set will have 1Q gates, if `insert_1q_oper` is True.
|
312
|
+
qubit_idx_idle = set(range(num_qubits))
|
313
|
+
|
314
|
+
# normalized edge weights represent the probability with which each qubit-pair
|
315
|
+
# is inserted into the circuit.
|
316
|
+
edge_choices = rng.choice(
|
317
|
+
edge_list,
|
318
|
+
size=num_edges,
|
319
|
+
replace=True,
|
320
|
+
p=edges_probs,
|
321
|
+
)
|
322
|
+
gate_choices = rng.choice(gates_2q, size=num_edges, replace=True)
|
323
|
+
|
324
|
+
cumsum_params = np.cumsum(gate_choices["num_params"], dtype=np.int64)
|
325
|
+
parameters = rng.uniform(0, 2 * np.pi, size=cumsum_params[-1])
|
326
|
+
|
327
|
+
# If reset is required, then, generating a random boolean matrix of
|
328
|
+
# num_edges x 2, corresponding to probable reset on both control and
|
329
|
+
# target qubits of the edge from the edge_list.
|
330
|
+
if reset:
|
331
|
+
reset_2q = rng.random(size=(num_edges, 2)) < prob_reset
|
332
|
+
|
333
|
+
if conditional:
|
334
|
+
cond_2q = rng.random(size=len(gate_choices)) < prob_conditional
|
335
|
+
cond_val_2q = rng.integers(0, 1 << min(num_qubits, 63), size=np.count_nonzero(cond_2q))
|
336
|
+
clbit_2q_idx = 0
|
337
|
+
|
338
|
+
for gate, num_gate_params, edge, is_cond_2q, is_rst in zip(
|
339
|
+
gate_choices["class"],
|
340
|
+
gate_choices["num_params"],
|
341
|
+
edge_choices,
|
342
|
+
cond_2q,
|
343
|
+
reset_2q,
|
344
|
+
):
|
345
|
+
|
346
|
+
control_qubit, target_qubit = tuple(edge)
|
347
|
+
|
348
|
+
# For every edge there are two probabilistically generated boolean values corresponding
|
349
|
+
# to control, target qubits of the edge
|
350
|
+
# an idle qubit for a particular iteration on which reset is applied is considered idle.
|
351
|
+
|
352
|
+
if reset:
|
353
|
+
is_rst_control, is_rst_target = is_rst
|
354
|
+
rst_oper = Reset()
|
355
|
+
if is_rst_control:
|
356
|
+
qc._append(
|
357
|
+
CircuitInstruction(
|
358
|
+
operation=rst_oper,
|
359
|
+
qubits=[qubits[control_qubit]],
|
360
|
+
)
|
361
|
+
)
|
362
|
+
|
363
|
+
if is_rst_target:
|
364
|
+
qc._append(
|
365
|
+
CircuitInstruction(
|
366
|
+
operation=rst_oper,
|
367
|
+
qubits=[qubits[target_qubit]],
|
368
|
+
)
|
369
|
+
)
|
370
|
+
|
371
|
+
params = parameters[:num_gate_params]
|
372
|
+
parameters = parameters[num_gate_params:]
|
373
|
+
current_instr = gate(*params)
|
374
|
+
|
375
|
+
if is_cond_2q:
|
376
|
+
qc.measure(qc.qubits, cr)
|
377
|
+
# The condition values are required to be bigints, not Numpy's fixed-width type.
|
378
|
+
with qc.if_test((cr, int(cond_val_2q[clbit_2q_idx]))):
|
379
|
+
clbit_2q_idx += 1
|
380
|
+
qc.append(
|
381
|
+
CircuitInstruction(
|
382
|
+
operation=current_instr,
|
383
|
+
qubits=[qubits[control_qubit], qubits[target_qubit]],
|
384
|
+
)
|
385
|
+
)
|
386
|
+
else:
|
387
|
+
qc._append(
|
388
|
+
CircuitInstruction(
|
389
|
+
operation=current_instr,
|
390
|
+
qubits=[qubits[control_qubit], qubits[target_qubit]],
|
391
|
+
)
|
392
|
+
)
|
393
|
+
|
394
|
+
# Removing the qubits that have been applied with 2Q gates from the
|
395
|
+
# set of idle qubits for that while-iteration.
|
396
|
+
qubit_idx_idle = qubit_idx_idle - set(edge)
|
397
|
+
|
398
|
+
# Update the number of occurrences of the edge in the circuit.
|
399
|
+
_temp_edge = (control_qubit, target_qubit)
|
400
|
+
if _temp_edge in edges_used:
|
401
|
+
edges_used[_temp_edge] += 1
|
402
|
+
if edges_used[_temp_edge] >= min_2q_gate_per_edge:
|
403
|
+
del edges_used[_temp_edge]
|
404
|
+
|
405
|
+
if insert_1q_oper:
|
406
|
+
num_unused_qubits = len(qubit_idx_idle)
|
407
|
+
if not num_unused_qubits == 0:
|
408
|
+
|
409
|
+
# Calculating for conditionals to make even the 1Q operations
|
410
|
+
# probabilistically conditional.
|
411
|
+
if conditional:
|
412
|
+
cond_1q = rng.random(size=num_unused_qubits) < prob_conditional
|
413
|
+
cond_val_1q = rng.integers(
|
414
|
+
0, 1 << min(num_qubits, 63), size=np.count_nonzero(cond_1q)
|
415
|
+
)
|
416
|
+
clbit_1q_idx = 0
|
417
|
+
|
418
|
+
# Some extra 1Q Gate in to fill qubits which are still idle for this
|
419
|
+
# particular while iteration.
|
420
|
+
extra_1q_gates = rng.choice(gates_1q, size=num_unused_qubits, replace=True)
|
421
|
+
|
422
|
+
cumsum_params = np.cumsum(extra_1q_gates["num_params"], dtype=np.int64)
|
423
|
+
parameters_1q = rng.uniform(0, 2 * np.pi, size=cumsum_params[-1])
|
424
|
+
|
425
|
+
for gate_1q, num_gate_params, qubit_idx, is_cond_1q in zip(
|
426
|
+
extra_1q_gates["class"],
|
427
|
+
extra_1q_gates["num_params"],
|
428
|
+
qubit_idx_idle,
|
429
|
+
cond_1q,
|
430
|
+
):
|
431
|
+
params_1q = parameters_1q[:num_gate_params]
|
432
|
+
parameters_1q = parameters_1q[num_gate_params:]
|
433
|
+
current_instr = gate_1q(*params_1q)
|
434
|
+
|
435
|
+
if is_cond_1q:
|
436
|
+
qc.measure(qc.qubits, cr)
|
437
|
+
# The condition values are required to be bigints, not Numpy's fixed-width type.
|
438
|
+
with qc.if_test((cr, int(cond_val_1q[clbit_1q_idx]))):
|
439
|
+
clbit_1q_idx += 1
|
440
|
+
qc.append(
|
441
|
+
CircuitInstruction(
|
442
|
+
operation=current_instr,
|
443
|
+
qubits=[qubits[qubit_idx]],
|
444
|
+
)
|
445
|
+
)
|
446
|
+
else:
|
447
|
+
qc._append(
|
448
|
+
CircuitInstruction(
|
449
|
+
operation=current_instr,
|
450
|
+
qubits=[qubits[qubit_idx]],
|
451
|
+
)
|
452
|
+
)
|
453
|
+
|
454
|
+
if measure:
|
455
|
+
qc.measure(qc.qubits, cr)
|
456
|
+
|
457
|
+
return qc
|
458
|
+
|
459
|
+
|
460
|
+
def random_circuit(
|
461
|
+
num_qubits,
|
462
|
+
depth,
|
463
|
+
max_operands=4,
|
464
|
+
measure=False,
|
465
|
+
conditional=False,
|
466
|
+
reset=False,
|
467
|
+
seed=None,
|
468
|
+
num_operand_distribution: dict = None,
|
469
|
+
):
|
470
|
+
"""Generate random circuit of arbitrary size and form.
|
471
|
+
|
472
|
+
This function will generate a random circuit by randomly selecting gates
|
473
|
+
from the set of standard gates in :mod:`qiskit.circuit.library.standard_gates`. For example:
|
474
|
+
|
475
|
+
.. plot::
|
476
|
+
:alt: Circuit diagram output by the previous code.
|
477
|
+
:include-source:
|
478
|
+
|
479
|
+
from qiskit.circuit.random import random_circuit
|
480
|
+
|
481
|
+
circ = random_circuit(2, 2, measure=True)
|
482
|
+
circ.draw(output='mpl')
|
483
|
+
|
484
|
+
Args:
|
485
|
+
num_qubits (int): number of quantum wires
|
486
|
+
depth (int): layers of operations (i.e. critical path length)
|
487
|
+
max_operands (int): maximum qubit operands of each gate (between 1 and 4)
|
488
|
+
measure (bool): if True, measure all qubits at the end
|
489
|
+
conditional (bool): if True, insert middle measurements and conditionals
|
490
|
+
reset (bool): if True, insert middle resets
|
491
|
+
seed (int): sets random seed (optional)
|
492
|
+
num_operand_distribution (dict): a distribution of gates that specifies the ratio
|
493
|
+
of 1-qubit, 2-qubit, 3-qubit, ..., n-qubit gates in the random circuit. Expect a
|
494
|
+
deviation from the specified ratios that depends on the size of the requested
|
495
|
+
random circuit. (optional)
|
496
|
+
|
497
|
+
Returns:
|
498
|
+
QuantumCircuit: constructed circuit
|
499
|
+
|
500
|
+
Raises:
|
501
|
+
CircuitError: when invalid options given
|
502
|
+
"""
|
503
|
+
if seed is None:
|
504
|
+
seed = np.random.randint(0, np.iinfo(np.int32).max)
|
505
|
+
rng = np.random.default_rng(seed)
|
506
|
+
|
507
|
+
if num_operand_distribution:
|
508
|
+
if min(num_operand_distribution.keys()) < 1 or max(num_operand_distribution.keys()) > 4:
|
509
|
+
raise CircuitError("'num_operand_distribution' must have keys between 1 and 4")
|
510
|
+
for key, prob in num_operand_distribution.items():
|
511
|
+
if key > num_qubits and prob != 0.0:
|
512
|
+
raise CircuitError(
|
513
|
+
f"'num_operand_distribution' cannot have {key}-qubit gates"
|
514
|
+
f" for circuit with {num_qubits} qubits"
|
515
|
+
)
|
516
|
+
num_operand_distribution = dict(sorted(num_operand_distribution.items()))
|
517
|
+
|
518
|
+
if not num_operand_distribution and max_operands:
|
519
|
+
if max_operands < 1 or max_operands > 4:
|
520
|
+
raise CircuitError("max_operands must be between 1 and 4")
|
521
|
+
max_operands = max_operands if num_qubits > max_operands else num_qubits
|
522
|
+
rand_dist = rng.dirichlet(
|
523
|
+
np.ones(max_operands)
|
524
|
+
) # This will create a random distribution that sums to 1
|
525
|
+
num_operand_distribution = {i + 1: rand_dist[i] for i in range(max_operands)}
|
526
|
+
num_operand_distribution = dict(sorted(num_operand_distribution.items()))
|
527
|
+
|
528
|
+
# Here we will use np.isclose() because very rarely there might be floating
|
529
|
+
# point precision errors
|
530
|
+
if not np.isclose(sum(num_operand_distribution.values()), 1):
|
531
|
+
raise CircuitError("The sum of all the values in 'num_operand_distribution' is not 1.")
|
532
|
+
|
533
|
+
if num_qubits == 0:
|
534
|
+
return QuantumCircuit()
|
535
|
+
|
536
|
+
gates_3q = [
|
537
|
+
(standard_gates.CCXGate, 3, 0),
|
538
|
+
(standard_gates.CSwapGate, 3, 0),
|
539
|
+
(standard_gates.CCZGate, 3, 0),
|
540
|
+
(standard_gates.RCCXGate, 3, 0),
|
541
|
+
]
|
542
|
+
|
543
|
+
gates_4q = [
|
544
|
+
(standard_gates.C3SXGate, 4, 0),
|
545
|
+
(standard_gates.RC3XGate, 4, 0),
|
546
|
+
]
|
547
|
+
|
548
|
+
gates_1q = np.array(
|
549
|
+
gates_1q_data + [(Reset, 1, 0)] if reset else gates_1q_data,
|
550
|
+
dtype=[("class", object), ("num_qubits", np.int64), ("num_params", np.int64)],
|
551
|
+
)
|
552
|
+
|
553
|
+
gates_2q = np.array(gates_2q_data, dtype=gates_1q.dtype)
|
554
|
+
gates_3q = np.array(gates_3q, dtype=gates_1q.dtype)
|
555
|
+
gates_4q = np.array(gates_4q, dtype=gates_1q.dtype)
|
556
|
+
|
557
|
+
all_gate_lists = [gates_1q, gates_2q, gates_3q, gates_4q]
|
558
|
+
|
559
|
+
# Here we will create a list 'gates_to_consider' that will have a
|
560
|
+
# subset of different n-qubit gates and will also create a list for
|
561
|
+
# ratio (or probability) for each gates
|
562
|
+
gates_to_consider = []
|
563
|
+
distribution = []
|
564
|
+
for n_qubits, ratio in num_operand_distribution.items():
|
565
|
+
gate_list = all_gate_lists[n_qubits - 1]
|
566
|
+
gates_to_consider.extend(gate_list)
|
567
|
+
distribution.extend([ratio / len(gate_list)] * len(gate_list))
|
568
|
+
|
569
|
+
gates = np.array(gates_to_consider, dtype=gates_1q.dtype)
|
570
|
+
|
571
|
+
qc = QuantumCircuit(num_qubits)
|
572
|
+
|
573
|
+
if measure or conditional:
|
574
|
+
cr = ClassicalRegister(num_qubits, "c")
|
575
|
+
qc.add_register(cr)
|
576
|
+
|
577
|
+
qubits = np.array(qc.qubits, dtype=object, copy=True)
|
578
|
+
|
579
|
+
# Counter to keep track of number of different gate types
|
580
|
+
counter = np.zeros(len(all_gate_lists) + 1, dtype=np.int64)
|
581
|
+
total_gates = 0
|
582
|
+
|
583
|
+
# Apply arbitrary random operations in layers across all qubits.
|
584
|
+
for layer_number in range(depth):
|
585
|
+
# We generate all the randomness for the layer in one go, to avoid many separate calls to
|
586
|
+
# the randomization routines, which can be fairly slow.
|
587
|
+
|
588
|
+
# This reliably draws too much randomness, but it's less expensive than looping over more
|
589
|
+
# calls to the rng. After, trim it down by finding the point when we've used all the qubits.
|
590
|
+
|
591
|
+
# Due to the stochastic nature of generating a random circuit, the resulting ratios
|
592
|
+
# may not precisely match the specified values from `num_operand_distribution`. Expect
|
593
|
+
# greater deviations from the target ratios in quantum circuits with fewer qubits and
|
594
|
+
# shallower depths, and smaller deviations in larger and deeper quantum circuits.
|
595
|
+
# For more information on how the distribution changes with number of qubits and depth
|
596
|
+
# refer to the pull request #12483 on Qiskit GitHub.
|
597
|
+
|
598
|
+
gate_specs = rng.choice(gates, size=len(qubits), p=distribution)
|
599
|
+
cumulative_qubits = np.cumsum(gate_specs["num_qubits"], dtype=np.int64)
|
600
|
+
|
601
|
+
# Efficiently find the point in the list where the total gates would use as many as
|
602
|
+
# possible of, but not more than, the number of qubits in the layer. If there's slack, fill
|
603
|
+
# it with 1q gates.
|
604
|
+
max_index = np.searchsorted(cumulative_qubits, num_qubits, side="right")
|
605
|
+
gate_specs = gate_specs[:max_index]
|
606
|
+
|
607
|
+
slack = num_qubits - cumulative_qubits[max_index - 1]
|
608
|
+
|
609
|
+
# Updating the counter for 1-qubit, 2-qubit, 3-qubit and 4-qubit gates
|
610
|
+
gate_qubits = gate_specs["num_qubits"]
|
611
|
+
counter += np.bincount(gate_qubits, minlength=len(all_gate_lists) + 1)
|
612
|
+
|
613
|
+
total_gates += len(gate_specs)
|
614
|
+
|
615
|
+
# Slack handling loop, this loop will add gates to fill
|
616
|
+
# the slack while respecting the 'num_operand_distribution'
|
617
|
+
while slack > 0:
|
618
|
+
gate_added_flag = False
|
619
|
+
|
620
|
+
for key, dist in sorted(num_operand_distribution.items(), reverse=True):
|
621
|
+
if slack >= key and counter[key] / total_gates < dist:
|
622
|
+
gate_to_add = np.array(
|
623
|
+
all_gate_lists[key - 1][rng.integers(0, len(all_gate_lists[key - 1]))]
|
624
|
+
)
|
625
|
+
gate_specs = np.hstack((gate_specs, gate_to_add))
|
626
|
+
counter[key] += 1
|
627
|
+
total_gates += 1
|
628
|
+
slack -= key
|
629
|
+
gate_added_flag = True
|
630
|
+
if not gate_added_flag:
|
631
|
+
break
|
632
|
+
|
633
|
+
# For efficiency in the Python loop, this uses Numpy vectorization to pre-calculate the
|
634
|
+
# indices into the lists of qubits and parameters for every gate, and then suitably
|
635
|
+
# randomizes those lists.
|
636
|
+
q_indices = np.empty(len(gate_specs) + 1, dtype=np.int64)
|
637
|
+
p_indices = np.empty(len(gate_specs) + 1, dtype=np.int64)
|
638
|
+
q_indices[0] = p_indices[0] = 0
|
639
|
+
np.cumsum(gate_specs["num_qubits"], out=q_indices[1:])
|
640
|
+
np.cumsum(gate_specs["num_params"], out=p_indices[1:])
|
641
|
+
parameters = rng.uniform(0, 2 * np.pi, size=p_indices[-1])
|
642
|
+
rng.shuffle(qubits)
|
643
|
+
|
644
|
+
# We've now generated everything we're going to need. Now just to add everything. The
|
645
|
+
# conditional check is outside the two loops to make the more common case of no conditionals
|
646
|
+
# faster, since in Python we don't have a compiler to do this for us.
|
647
|
+
if conditional and layer_number != 0:
|
648
|
+
is_conditional = rng.random(size=len(gate_specs)) < 0.1
|
649
|
+
condition_values = rng.integers(
|
650
|
+
0, 1 << min(num_qubits, 63), size=np.count_nonzero(is_conditional)
|
651
|
+
)
|
652
|
+
c_ptr = 0
|
653
|
+
for gate, q_start, q_end, p_start, p_end, is_cond in zip(
|
654
|
+
gate_specs["class"],
|
655
|
+
q_indices[:-1],
|
656
|
+
q_indices[1:],
|
657
|
+
p_indices[:-1],
|
658
|
+
p_indices[1:],
|
659
|
+
is_conditional,
|
660
|
+
):
|
661
|
+
operation = gate(*parameters[p_start:p_end])
|
662
|
+
|
663
|
+
if is_cond:
|
664
|
+
qc.measure(qc.qubits, cr)
|
665
|
+
# The condition values are required to be bigints, not Numpy's fixed-width type.
|
666
|
+
with qc.if_test((cr, int(condition_values[c_ptr]))):
|
667
|
+
c_ptr += 1
|
668
|
+
qc.append(
|
669
|
+
CircuitInstruction(operation=operation, qubits=qubits[q_start:q_end])
|
670
|
+
)
|
671
|
+
else:
|
672
|
+
qc._append(
|
673
|
+
CircuitInstruction(operation=operation, qubits=qubits[q_start:q_end])
|
674
|
+
)
|
675
|
+
else:
|
676
|
+
for gate, q_start, q_end, p_start, p_end in zip(
|
677
|
+
gate_specs["class"], q_indices[:-1], q_indices[1:], p_indices[:-1], p_indices[1:]
|
678
|
+
):
|
679
|
+
operation = gate(*parameters[p_start:p_end])
|
680
|
+
qc._append(CircuitInstruction(operation=operation, qubits=qubits[q_start:q_end]))
|
681
|
+
if measure:
|
682
|
+
qc.measure(qc.qubits, cr)
|
683
|
+
|
684
|
+
return qc
|
685
|
+
|
686
|
+
|
687
|
+
def random_clifford_circuit(num_qubits, num_gates, gates="all", seed=None):
|
688
|
+
"""Generate a pseudo-random Clifford circuit.
|
689
|
+
|
690
|
+
This function will generate a Clifford circuit by randomly selecting the chosen amount of Clifford
|
691
|
+
gates from the set of standard gates in :mod:`qiskit.circuit.library.standard_gates`. For example:
|
692
|
+
|
693
|
+
.. plot::
|
694
|
+
:alt: Circuit diagram output by the previous code.
|
695
|
+
:include-source:
|
696
|
+
|
697
|
+
from qiskit.circuit.random import random_clifford_circuit
|
698
|
+
|
699
|
+
circ = random_clifford_circuit(num_qubits=2, num_gates=6)
|
700
|
+
circ.draw(output='mpl')
|
701
|
+
|
702
|
+
Args:
|
703
|
+
num_qubits (int): number of quantum wires.
|
704
|
+
num_gates (int): number of gates in the circuit.
|
705
|
+
gates (list[str]): optional list of Clifford gate names to randomly sample from.
|
706
|
+
If ``"all"`` (default), use all Clifford gates in the standard library.
|
707
|
+
seed (int | np.random.Generator): sets random seed/generator (optional).
|
708
|
+
|
709
|
+
Returns:
|
710
|
+
QuantumCircuit: constructed circuit
|
711
|
+
"""
|
712
|
+
|
713
|
+
gates_1q = list(set(_BASIS_1Q.keys()) - {"v", "w", "id", "iden", "sinv"})
|
714
|
+
gates_2q = list(_BASIS_2Q.keys())
|
715
|
+
|
716
|
+
if gates == "all":
|
717
|
+
if num_qubits == 1:
|
718
|
+
gates = gates_1q
|
719
|
+
else:
|
720
|
+
gates = gates_1q + gates_2q
|
721
|
+
|
722
|
+
instructions = {
|
723
|
+
"i": (standard_gates.IGate(), 1),
|
724
|
+
"x": (standard_gates.XGate(), 1),
|
725
|
+
"y": (standard_gates.YGate(), 1),
|
726
|
+
"z": (standard_gates.ZGate(), 1),
|
727
|
+
"h": (standard_gates.HGate(), 1),
|
728
|
+
"s": (standard_gates.SGate(), 1),
|
729
|
+
"sdg": (standard_gates.SdgGate(), 1),
|
730
|
+
"sx": (standard_gates.SXGate(), 1),
|
731
|
+
"sxdg": (standard_gates.SXdgGate(), 1),
|
732
|
+
"cx": (standard_gates.CXGate(), 2),
|
733
|
+
"cy": (standard_gates.CYGate(), 2),
|
734
|
+
"cz": (standard_gates.CZGate(), 2),
|
735
|
+
"swap": (standard_gates.SwapGate(), 2),
|
736
|
+
"iswap": (standard_gates.iSwapGate(), 2),
|
737
|
+
"ecr": (standard_gates.ECRGate(), 2),
|
738
|
+
"dcx": (standard_gates.DCXGate(), 2),
|
739
|
+
}
|
740
|
+
|
741
|
+
if isinstance(seed, np.random.Generator):
|
742
|
+
rng = seed
|
743
|
+
else:
|
744
|
+
rng = np.random.default_rng(seed)
|
745
|
+
|
746
|
+
samples = rng.choice(gates, num_gates)
|
747
|
+
|
748
|
+
circ = QuantumCircuit(num_qubits)
|
749
|
+
|
750
|
+
for name in samples:
|
751
|
+
gate, nqargs = instructions[name]
|
752
|
+
qargs = rng.choice(range(num_qubits), nqargs, replace=False).tolist()
|
753
|
+
circ.append(gate, qargs, copy=False)
|
754
|
+
|
755
|
+
return circ
|