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,136 @@
|
|
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
|
+
"""A wrapper class for the purposes of validating modifications to
|
14
|
+
QuantumCircuit.data while maintaining the interface of a python list."""
|
15
|
+
|
16
|
+
from collections.abc import MutableSequence
|
17
|
+
|
18
|
+
import qiskit._accelerate.circuit
|
19
|
+
|
20
|
+
from .exceptions import CircuitError
|
21
|
+
from .instruction import Instruction
|
22
|
+
from .operation import Operation
|
23
|
+
|
24
|
+
|
25
|
+
CircuitInstruction = qiskit._accelerate.circuit.CircuitInstruction
|
26
|
+
|
27
|
+
|
28
|
+
class QuantumCircuitData(MutableSequence):
|
29
|
+
"""A wrapper class for the purposes of validating modifications to
|
30
|
+
QuantumCircuit.data while maintaining the interface of a python list."""
|
31
|
+
|
32
|
+
def __init__(self, circuit):
|
33
|
+
self._circuit = circuit
|
34
|
+
|
35
|
+
def __getitem__(self, i):
|
36
|
+
return self._circuit._data[i]
|
37
|
+
|
38
|
+
def __setitem__(self, key, value):
|
39
|
+
# For now (Terra 0.21), the `QuantumCircuit.data` setter is meant to perform validation, so
|
40
|
+
# we do the same qubit checks that `QuantumCircuit.append` would do.
|
41
|
+
if isinstance(value, CircuitInstruction):
|
42
|
+
operation, qargs, cargs = value.operation, value.qubits, value.clbits
|
43
|
+
else:
|
44
|
+
# Handle the legacy 3-tuple format.
|
45
|
+
operation, qargs, cargs = value
|
46
|
+
value = self._resolve_legacy_value(operation, qargs, cargs)
|
47
|
+
self._circuit._data[key] = value
|
48
|
+
|
49
|
+
def _resolve_legacy_value(self, operation, qargs, cargs) -> CircuitInstruction:
|
50
|
+
"""Resolve the old-style 3-tuple into the new :class:`CircuitInstruction` type."""
|
51
|
+
if not isinstance(operation, Operation) and hasattr(operation, "to_instruction"):
|
52
|
+
operation = operation.to_instruction()
|
53
|
+
if not isinstance(operation, Operation):
|
54
|
+
raise CircuitError("object is not an Operation.")
|
55
|
+
|
56
|
+
expanded_qargs = [self._circuit._qbit_argument_conversion(qarg) for qarg in qargs or []]
|
57
|
+
expanded_cargs = [self._circuit._cbit_argument_conversion(carg) for carg in cargs or []]
|
58
|
+
|
59
|
+
if isinstance(operation, Instruction):
|
60
|
+
broadcast_args = list(operation.broadcast_arguments(expanded_qargs, expanded_cargs))
|
61
|
+
else:
|
62
|
+
broadcast_args = list(
|
63
|
+
Instruction.broadcast_arguments(operation, expanded_qargs, expanded_cargs)
|
64
|
+
)
|
65
|
+
|
66
|
+
if len(broadcast_args) > 1:
|
67
|
+
raise CircuitError(
|
68
|
+
"QuantumCircuit.data modification does not support argument broadcasting."
|
69
|
+
)
|
70
|
+
|
71
|
+
qargs, cargs = broadcast_args[0]
|
72
|
+
|
73
|
+
self._circuit._check_dups(qargs)
|
74
|
+
return CircuitInstruction(operation, tuple(qargs), tuple(cargs))
|
75
|
+
|
76
|
+
def insert(self, index, value):
|
77
|
+
self._circuit._data.insert(index, value.replace(qubits=(), clbits=()))
|
78
|
+
try:
|
79
|
+
self[index] = value
|
80
|
+
except CircuitError:
|
81
|
+
del self._circuit._data[index]
|
82
|
+
raise
|
83
|
+
|
84
|
+
def __iter__(self):
|
85
|
+
return iter(self._circuit._data)
|
86
|
+
|
87
|
+
def __delitem__(self, i):
|
88
|
+
del self._circuit._data[i]
|
89
|
+
|
90
|
+
def __len__(self):
|
91
|
+
return len(self._circuit._data)
|
92
|
+
|
93
|
+
def __cast(self, other):
|
94
|
+
return list(other._circuit._data) if isinstance(other, QuantumCircuitData) else other
|
95
|
+
|
96
|
+
def __repr__(self):
|
97
|
+
return repr(list(self._circuit._data))
|
98
|
+
|
99
|
+
def __lt__(self, other):
|
100
|
+
return list(self._circuit._data) < self.__cast(other)
|
101
|
+
|
102
|
+
def __le__(self, other):
|
103
|
+
return list(self._circuit._data) <= self.__cast(other)
|
104
|
+
|
105
|
+
def __eq__(self, other):
|
106
|
+
return self._circuit._data == self.__cast(other)
|
107
|
+
|
108
|
+
def __gt__(self, other):
|
109
|
+
return list(self._circuit._data) > self.__cast(other)
|
110
|
+
|
111
|
+
def __ge__(self, other):
|
112
|
+
return list(self._circuit._data) >= self.__cast(other)
|
113
|
+
|
114
|
+
def __add__(self, other):
|
115
|
+
return list(self._circuit._data) + self.__cast(other)
|
116
|
+
|
117
|
+
def __radd__(self, other):
|
118
|
+
return self.__cast(other) + list(self._circuit._data)
|
119
|
+
|
120
|
+
def __mul__(self, n):
|
121
|
+
return list(self._circuit._data) * n
|
122
|
+
|
123
|
+
def __rmul__(self, n):
|
124
|
+
return n * list(self._circuit._data)
|
125
|
+
|
126
|
+
def sort(self, *args, **kwargs):
|
127
|
+
"""In-place stable sort. Accepts arguments of list.sort."""
|
128
|
+
data = list(self._circuit._data)
|
129
|
+
data.sort(*args, **kwargs)
|
130
|
+
self._circuit._data.clear()
|
131
|
+
self._circuit._data.reserve(len(data))
|
132
|
+
self._circuit._data.extend(data)
|
133
|
+
|
134
|
+
def copy(self):
|
135
|
+
"""Returns a shallow copy of instruction list."""
|
136
|
+
return list(self._circuit._data)
|
@@ -0,0 +1,15 @@
|
|
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
|
+
"""Method for generating random circuits."""
|
14
|
+
|
15
|
+
from .utils import random_circuit, random_clifford_circuit
|
@@ -0,0 +1,366 @@
|
|
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
|
+
|
15
|
+
import numpy as np
|
16
|
+
|
17
|
+
from qiskit.circuit import ClassicalRegister, QuantumCircuit, CircuitInstruction
|
18
|
+
from qiskit.circuit import Reset
|
19
|
+
from qiskit.circuit.library import standard_gates
|
20
|
+
from qiskit.circuit.exceptions import CircuitError
|
21
|
+
from qiskit.quantum_info.operators.symplectic.clifford_circuits import _BASIS_1Q, _BASIS_2Q
|
22
|
+
|
23
|
+
|
24
|
+
def random_circuit(
|
25
|
+
num_qubits,
|
26
|
+
depth,
|
27
|
+
max_operands=4,
|
28
|
+
measure=False,
|
29
|
+
conditional=False,
|
30
|
+
reset=False,
|
31
|
+
seed=None,
|
32
|
+
num_operand_distribution: dict = None,
|
33
|
+
):
|
34
|
+
"""Generate random circuit of arbitrary size and form.
|
35
|
+
|
36
|
+
This function will generate a random circuit by randomly selecting gates
|
37
|
+
from the set of standard gates in :mod:`qiskit.circuit.library.standard_gates`. For example:
|
38
|
+
|
39
|
+
.. plot::
|
40
|
+
:alt: Circuit diagram output by the previous code.
|
41
|
+
:include-source:
|
42
|
+
|
43
|
+
from qiskit.circuit.random import random_circuit
|
44
|
+
|
45
|
+
circ = random_circuit(2, 2, measure=True)
|
46
|
+
circ.draw(output='mpl')
|
47
|
+
|
48
|
+
Args:
|
49
|
+
num_qubits (int): number of quantum wires
|
50
|
+
depth (int): layers of operations (i.e. critical path length)
|
51
|
+
max_operands (int): maximum qubit operands of each gate (between 1 and 4)
|
52
|
+
measure (bool): if True, measure all qubits at the end
|
53
|
+
conditional (bool): if True, insert middle measurements and conditionals
|
54
|
+
reset (bool): if True, insert middle resets
|
55
|
+
seed (int): sets random seed (optional)
|
56
|
+
num_operand_distribution (dict): a distribution of gates that specifies the ratio
|
57
|
+
of 1-qubit, 2-qubit, 3-qubit, ..., n-qubit gates in the random circuit. Expect a
|
58
|
+
deviation from the specified ratios that depends on the size of the requested
|
59
|
+
random circuit. (optional)
|
60
|
+
|
61
|
+
Returns:
|
62
|
+
QuantumCircuit: constructed circuit
|
63
|
+
|
64
|
+
Raises:
|
65
|
+
CircuitError: when invalid options given
|
66
|
+
"""
|
67
|
+
if seed is None:
|
68
|
+
seed = np.random.randint(0, np.iinfo(np.int32).max)
|
69
|
+
rng = np.random.default_rng(seed)
|
70
|
+
|
71
|
+
if num_operand_distribution:
|
72
|
+
if min(num_operand_distribution.keys()) < 1 or max(num_operand_distribution.keys()) > 4:
|
73
|
+
raise CircuitError("'num_operand_distribution' must have keys between 1 and 4")
|
74
|
+
for key, prob in num_operand_distribution.items():
|
75
|
+
if key > num_qubits and prob != 0.0:
|
76
|
+
raise CircuitError(
|
77
|
+
f"'num_operand_distribution' cannot have {key}-qubit gates"
|
78
|
+
f" for circuit with {num_qubits} qubits"
|
79
|
+
)
|
80
|
+
num_operand_distribution = dict(sorted(num_operand_distribution.items()))
|
81
|
+
|
82
|
+
if not num_operand_distribution and max_operands:
|
83
|
+
if max_operands < 1 or max_operands > 4:
|
84
|
+
raise CircuitError("max_operands must be between 1 and 4")
|
85
|
+
max_operands = max_operands if num_qubits > max_operands else num_qubits
|
86
|
+
rand_dist = rng.dirichlet(
|
87
|
+
np.ones(max_operands)
|
88
|
+
) # This will create a random distribution that sums to 1
|
89
|
+
num_operand_distribution = {i + 1: rand_dist[i] for i in range(max_operands)}
|
90
|
+
num_operand_distribution = dict(sorted(num_operand_distribution.items()))
|
91
|
+
|
92
|
+
# Here we will use np.isclose() because very rarely there might be floating
|
93
|
+
# point precision errors
|
94
|
+
if not np.isclose(sum(num_operand_distribution.values()), 1):
|
95
|
+
raise CircuitError("The sum of all the values in 'num_operand_distribution' is not 1.")
|
96
|
+
|
97
|
+
if num_qubits == 0:
|
98
|
+
return QuantumCircuit()
|
99
|
+
|
100
|
+
gates_1q = [
|
101
|
+
# (Gate class, number of qubits, number of parameters)
|
102
|
+
(standard_gates.IGate, 1, 0),
|
103
|
+
(standard_gates.SXGate, 1, 0),
|
104
|
+
(standard_gates.XGate, 1, 0),
|
105
|
+
(standard_gates.RZGate, 1, 1),
|
106
|
+
(standard_gates.RGate, 1, 2),
|
107
|
+
(standard_gates.HGate, 1, 0),
|
108
|
+
(standard_gates.PhaseGate, 1, 1),
|
109
|
+
(standard_gates.RXGate, 1, 1),
|
110
|
+
(standard_gates.RYGate, 1, 1),
|
111
|
+
(standard_gates.SGate, 1, 0),
|
112
|
+
(standard_gates.SdgGate, 1, 0),
|
113
|
+
(standard_gates.SXdgGate, 1, 0),
|
114
|
+
(standard_gates.TGate, 1, 0),
|
115
|
+
(standard_gates.TdgGate, 1, 0),
|
116
|
+
(standard_gates.UGate, 1, 3),
|
117
|
+
(standard_gates.U1Gate, 1, 1),
|
118
|
+
(standard_gates.U2Gate, 1, 2),
|
119
|
+
(standard_gates.U3Gate, 1, 3),
|
120
|
+
(standard_gates.YGate, 1, 0),
|
121
|
+
(standard_gates.ZGate, 1, 0),
|
122
|
+
]
|
123
|
+
if reset:
|
124
|
+
gates_1q.append((Reset, 1, 0))
|
125
|
+
gates_2q = [
|
126
|
+
(standard_gates.CXGate, 2, 0),
|
127
|
+
(standard_gates.DCXGate, 2, 0),
|
128
|
+
(standard_gates.CHGate, 2, 0),
|
129
|
+
(standard_gates.CPhaseGate, 2, 1),
|
130
|
+
(standard_gates.CRXGate, 2, 1),
|
131
|
+
(standard_gates.CRYGate, 2, 1),
|
132
|
+
(standard_gates.CRZGate, 2, 1),
|
133
|
+
(standard_gates.CSXGate, 2, 0),
|
134
|
+
(standard_gates.CUGate, 2, 4),
|
135
|
+
(standard_gates.CU1Gate, 2, 1),
|
136
|
+
(standard_gates.CU3Gate, 2, 3),
|
137
|
+
(standard_gates.CYGate, 2, 0),
|
138
|
+
(standard_gates.CZGate, 2, 0),
|
139
|
+
(standard_gates.RXXGate, 2, 1),
|
140
|
+
(standard_gates.RYYGate, 2, 1),
|
141
|
+
(standard_gates.RZZGate, 2, 1),
|
142
|
+
(standard_gates.RZXGate, 2, 1),
|
143
|
+
(standard_gates.XXMinusYYGate, 2, 2),
|
144
|
+
(standard_gates.XXPlusYYGate, 2, 2),
|
145
|
+
(standard_gates.ECRGate, 2, 0),
|
146
|
+
(standard_gates.CSGate, 2, 0),
|
147
|
+
(standard_gates.CSdgGate, 2, 0),
|
148
|
+
(standard_gates.SwapGate, 2, 0),
|
149
|
+
(standard_gates.iSwapGate, 2, 0),
|
150
|
+
]
|
151
|
+
gates_3q = [
|
152
|
+
(standard_gates.CCXGate, 3, 0),
|
153
|
+
(standard_gates.CSwapGate, 3, 0),
|
154
|
+
(standard_gates.CCZGate, 3, 0),
|
155
|
+
(standard_gates.RCCXGate, 3, 0),
|
156
|
+
]
|
157
|
+
gates_4q = [
|
158
|
+
(standard_gates.C3SXGate, 4, 0),
|
159
|
+
(standard_gates.RC3XGate, 4, 0),
|
160
|
+
]
|
161
|
+
|
162
|
+
gates_1q = np.array(
|
163
|
+
gates_1q, dtype=[("class", object), ("num_qubits", np.int64), ("num_params", np.int64)]
|
164
|
+
)
|
165
|
+
gates_2q = np.array(gates_2q, dtype=gates_1q.dtype)
|
166
|
+
gates_3q = np.array(gates_3q, dtype=gates_1q.dtype)
|
167
|
+
gates_4q = np.array(gates_4q, dtype=gates_1q.dtype)
|
168
|
+
|
169
|
+
all_gate_lists = [gates_1q, gates_2q, gates_3q, gates_4q]
|
170
|
+
|
171
|
+
# Here we will create a list 'gates_to_consider' that will have a
|
172
|
+
# subset of different n-qubit gates and will also create a list for
|
173
|
+
# ratio (or probability) for each gates
|
174
|
+
gates_to_consider = []
|
175
|
+
distribution = []
|
176
|
+
for n_qubits, ratio in num_operand_distribution.items():
|
177
|
+
gate_list = all_gate_lists[n_qubits - 1]
|
178
|
+
gates_to_consider.extend(gate_list)
|
179
|
+
distribution.extend([ratio / len(gate_list)] * len(gate_list))
|
180
|
+
|
181
|
+
gates = np.array(gates_to_consider, dtype=gates_1q.dtype)
|
182
|
+
|
183
|
+
qc = QuantumCircuit(num_qubits)
|
184
|
+
|
185
|
+
if measure or conditional:
|
186
|
+
cr = ClassicalRegister(num_qubits, "c")
|
187
|
+
qc.add_register(cr)
|
188
|
+
|
189
|
+
qubits = np.array(qc.qubits, dtype=object, copy=True)
|
190
|
+
|
191
|
+
# Counter to keep track of number of different gate types
|
192
|
+
counter = np.zeros(len(all_gate_lists) + 1, dtype=np.int64)
|
193
|
+
total_gates = 0
|
194
|
+
|
195
|
+
# Apply arbitrary random operations in layers across all qubits.
|
196
|
+
for layer_number in range(depth):
|
197
|
+
# We generate all the randomness for the layer in one go, to avoid many separate calls to
|
198
|
+
# the randomization routines, which can be fairly slow.
|
199
|
+
|
200
|
+
# This reliably draws too much randomness, but it's less expensive than looping over more
|
201
|
+
# calls to the rng. After, trim it down by finding the point when we've used all the qubits.
|
202
|
+
|
203
|
+
# Due to the stochastic nature of generating a random circuit, the resulting ratios
|
204
|
+
# may not precisely match the specified values from `num_operand_distribution`. Expect
|
205
|
+
# greater deviations from the target ratios in quantum circuits with fewer qubits and
|
206
|
+
# shallower depths, and smaller deviations in larger and deeper quantum circuits.
|
207
|
+
# For more information on how the distribution changes with number of qubits and depth
|
208
|
+
# refer to the pull request #12483 on Qiskit GitHub.
|
209
|
+
|
210
|
+
gate_specs = rng.choice(gates, size=len(qubits), p=distribution)
|
211
|
+
cumulative_qubits = np.cumsum(gate_specs["num_qubits"], dtype=np.int64)
|
212
|
+
|
213
|
+
# Efficiently find the point in the list where the total gates would use as many as
|
214
|
+
# possible of, but not more than, the number of qubits in the layer. If there's slack, fill
|
215
|
+
# it with 1q gates.
|
216
|
+
max_index = np.searchsorted(cumulative_qubits, num_qubits, side="right")
|
217
|
+
gate_specs = gate_specs[:max_index]
|
218
|
+
|
219
|
+
slack = num_qubits - cumulative_qubits[max_index - 1]
|
220
|
+
|
221
|
+
# Updating the counter for 1-qubit, 2-qubit, 3-qubit and 4-qubit gates
|
222
|
+
gate_qubits = gate_specs["num_qubits"]
|
223
|
+
counter += np.bincount(gate_qubits, minlength=len(all_gate_lists) + 1)
|
224
|
+
|
225
|
+
total_gates += len(gate_specs)
|
226
|
+
|
227
|
+
# Slack handling loop, this loop will add gates to fill
|
228
|
+
# the slack while respecting the 'num_operand_distribution'
|
229
|
+
while slack > 0:
|
230
|
+
gate_added_flag = False
|
231
|
+
|
232
|
+
for key, dist in sorted(num_operand_distribution.items(), reverse=True):
|
233
|
+
if slack >= key and counter[key] / total_gates < dist:
|
234
|
+
gate_to_add = np.array(
|
235
|
+
all_gate_lists[key - 1][rng.integers(0, len(all_gate_lists[key - 1]))]
|
236
|
+
)
|
237
|
+
gate_specs = np.hstack((gate_specs, gate_to_add))
|
238
|
+
counter[key] += 1
|
239
|
+
total_gates += 1
|
240
|
+
slack -= key
|
241
|
+
gate_added_flag = True
|
242
|
+
if not gate_added_flag:
|
243
|
+
break
|
244
|
+
|
245
|
+
# For efficiency in the Python loop, this uses Numpy vectorization to pre-calculate the
|
246
|
+
# indices into the lists of qubits and parameters for every gate, and then suitably
|
247
|
+
# randomizes those lists.
|
248
|
+
q_indices = np.empty(len(gate_specs) + 1, dtype=np.int64)
|
249
|
+
p_indices = np.empty(len(gate_specs) + 1, dtype=np.int64)
|
250
|
+
q_indices[0] = p_indices[0] = 0
|
251
|
+
np.cumsum(gate_specs["num_qubits"], out=q_indices[1:])
|
252
|
+
np.cumsum(gate_specs["num_params"], out=p_indices[1:])
|
253
|
+
parameters = rng.uniform(0, 2 * np.pi, size=p_indices[-1])
|
254
|
+
rng.shuffle(qubits)
|
255
|
+
|
256
|
+
# We've now generated everything we're going to need. Now just to add everything. The
|
257
|
+
# conditional check is outside the two loops to make the more common case of no conditionals
|
258
|
+
# faster, since in Python we don't have a compiler to do this for us.
|
259
|
+
if conditional and layer_number != 0:
|
260
|
+
is_conditional = rng.random(size=len(gate_specs)) < 0.1
|
261
|
+
condition_values = rng.integers(
|
262
|
+
0, 1 << min(num_qubits, 63), size=np.count_nonzero(is_conditional)
|
263
|
+
)
|
264
|
+
c_ptr = 0
|
265
|
+
for gate, q_start, q_end, p_start, p_end, is_cond in zip(
|
266
|
+
gate_specs["class"],
|
267
|
+
q_indices[:-1],
|
268
|
+
q_indices[1:],
|
269
|
+
p_indices[:-1],
|
270
|
+
p_indices[1:],
|
271
|
+
is_conditional,
|
272
|
+
):
|
273
|
+
operation = gate(*parameters[p_start:p_end])
|
274
|
+
if is_cond:
|
275
|
+
qc.measure(qc.qubits, cr)
|
276
|
+
# The condition values are required to be bigints, not Numpy's fixed-width type.
|
277
|
+
with qc.if_test((cr, int(condition_values[c_ptr]))):
|
278
|
+
c_ptr += 1
|
279
|
+
qc._append(
|
280
|
+
CircuitInstruction(operation=operation, qubits=qubits[q_start:q_end])
|
281
|
+
)
|
282
|
+
else:
|
283
|
+
qc._append(
|
284
|
+
CircuitInstruction(operation=operation, qubits=qubits[q_start:q_end])
|
285
|
+
)
|
286
|
+
else:
|
287
|
+
for gate, q_start, q_end, p_start, p_end in zip(
|
288
|
+
gate_specs["class"], q_indices[:-1], q_indices[1:], p_indices[:-1], p_indices[1:]
|
289
|
+
):
|
290
|
+
operation = gate(*parameters[p_start:p_end])
|
291
|
+
qc._append(CircuitInstruction(operation=operation, qubits=qubits[q_start:q_end]))
|
292
|
+
if measure:
|
293
|
+
qc.measure(qc.qubits, cr)
|
294
|
+
|
295
|
+
return qc
|
296
|
+
|
297
|
+
|
298
|
+
def random_clifford_circuit(num_qubits, num_gates, gates="all", seed=None):
|
299
|
+
"""Generate a pseudo-random Clifford circuit.
|
300
|
+
|
301
|
+
This function will generate a Clifford circuit by randomly selecting the chosen amount of Clifford
|
302
|
+
gates from the set of standard gates in :mod:`qiskit.circuit.library.standard_gates`. For example:
|
303
|
+
|
304
|
+
.. plot::
|
305
|
+
:alt: Circuit diagram output by the previous code.
|
306
|
+
:include-source:
|
307
|
+
|
308
|
+
from qiskit.circuit.random import random_clifford_circuit
|
309
|
+
|
310
|
+
circ = random_clifford_circuit(num_qubits=2, num_gates=6)
|
311
|
+
circ.draw(output='mpl')
|
312
|
+
|
313
|
+
Args:
|
314
|
+
num_qubits (int): number of quantum wires.
|
315
|
+
num_gates (int): number of gates in the circuit.
|
316
|
+
gates (list[str]): optional list of Clifford gate names to randomly sample from.
|
317
|
+
If ``"all"`` (default), use all Clifford gates in the standard library.
|
318
|
+
seed (int | np.random.Generator): sets random seed/generator (optional).
|
319
|
+
|
320
|
+
Returns:
|
321
|
+
QuantumCircuit: constructed circuit
|
322
|
+
"""
|
323
|
+
|
324
|
+
gates_1q = list(set(_BASIS_1Q.keys()) - {"v", "w", "id", "iden", "sinv"})
|
325
|
+
gates_2q = list(_BASIS_2Q.keys())
|
326
|
+
|
327
|
+
if gates == "all":
|
328
|
+
if num_qubits == 1:
|
329
|
+
gates = gates_1q
|
330
|
+
else:
|
331
|
+
gates = gates_1q + gates_2q
|
332
|
+
|
333
|
+
instructions = {
|
334
|
+
"i": (standard_gates.IGate(), 1),
|
335
|
+
"x": (standard_gates.XGate(), 1),
|
336
|
+
"y": (standard_gates.YGate(), 1),
|
337
|
+
"z": (standard_gates.ZGate(), 1),
|
338
|
+
"h": (standard_gates.HGate(), 1),
|
339
|
+
"s": (standard_gates.SGate(), 1),
|
340
|
+
"sdg": (standard_gates.SdgGate(), 1),
|
341
|
+
"sx": (standard_gates.SXGate(), 1),
|
342
|
+
"sxdg": (standard_gates.SXdgGate(), 1),
|
343
|
+
"cx": (standard_gates.CXGate(), 2),
|
344
|
+
"cy": (standard_gates.CYGate(), 2),
|
345
|
+
"cz": (standard_gates.CZGate(), 2),
|
346
|
+
"swap": (standard_gates.SwapGate(), 2),
|
347
|
+
"iswap": (standard_gates.iSwapGate(), 2),
|
348
|
+
"ecr": (standard_gates.ECRGate(), 2),
|
349
|
+
"dcx": (standard_gates.DCXGate(), 2),
|
350
|
+
}
|
351
|
+
|
352
|
+
if isinstance(seed, np.random.Generator):
|
353
|
+
rng = seed
|
354
|
+
else:
|
355
|
+
rng = np.random.default_rng(seed)
|
356
|
+
|
357
|
+
samples = rng.choice(gates, num_gates)
|
358
|
+
|
359
|
+
circ = QuantumCircuit(num_qubits)
|
360
|
+
|
361
|
+
for name in samples:
|
362
|
+
gate, nqargs = instructions[name]
|
363
|
+
qargs = rng.choice(range(num_qubits), nqargs, replace=False).tolist()
|
364
|
+
circ.append(gate, qargs, copy=False)
|
365
|
+
|
366
|
+
return circ
|
qiskit/circuit/reset.py
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""
|
14
|
+
Qubit reset to computational zero.
|
15
|
+
"""
|
16
|
+
|
17
|
+
from qiskit.circuit.singleton import SingletonInstruction, stdlib_singleton_key
|
18
|
+
from qiskit._accelerate.circuit import StandardInstructionType
|
19
|
+
|
20
|
+
|
21
|
+
class Reset(SingletonInstruction):
|
22
|
+
r"""Incoherently reset a qubit to the :math:`\lvert0\rangle` state."""
|
23
|
+
|
24
|
+
_standard_instruction_type = StandardInstructionType.Reset
|
25
|
+
|
26
|
+
def __init__(self, label=None):
|
27
|
+
"""
|
28
|
+
Args:
|
29
|
+
label: optional string label of this instruction.
|
30
|
+
"""
|
31
|
+
super().__init__("reset", 1, 0, [], label=label)
|
32
|
+
|
33
|
+
_singleton_lookup_key = stdlib_singleton_key()
|
34
|
+
|
35
|
+
def broadcast_arguments(self, qargs, cargs):
|
36
|
+
for qarg in qargs[0]:
|
37
|
+
yield [qarg], []
|