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,164 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2020.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
# The structure of the code is based on Emanuel Malvetti's semester thesis at ETH in 2018,
|
14
|
+
# which was supervised by Raban Iten and Prof. Renato Renner.
|
15
|
+
|
16
|
+
"""Uniformly controlled Pauli rotations."""
|
17
|
+
|
18
|
+
from __future__ import annotations
|
19
|
+
|
20
|
+
import math
|
21
|
+
|
22
|
+
import numpy as np
|
23
|
+
|
24
|
+
from qiskit.circuit.gate import Gate
|
25
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
26
|
+
from qiskit.circuit import QuantumRegister
|
27
|
+
from qiskit.exceptions import QiskitError
|
28
|
+
|
29
|
+
_EPS = 1e-10 # global variable used to chop very small numbers to zero
|
30
|
+
|
31
|
+
|
32
|
+
class UCPauliRotGate(Gate):
|
33
|
+
r"""Uniformly controlled Pauli rotations.
|
34
|
+
|
35
|
+
Implements the :class:`.UCGate` for the special case that all unitaries are Pauli rotations,
|
36
|
+
:math:`U_i = R_P(a_i)` where :math:`P \in \{X, Y, Z\}` and :math:`a_i \in \mathbb{R}` is
|
37
|
+
the rotation angle.
|
38
|
+
"""
|
39
|
+
|
40
|
+
def __init__(self, angle_list: list[float], rot_axis: str) -> None:
|
41
|
+
r"""
|
42
|
+
Args:
|
43
|
+
angle_list: List of rotation angles :math:`[a_0, ..., a_{2^{k-1}}]`.
|
44
|
+
rot_axis: Rotation axis. Must be either of ``"X"``, ``"Y"`` or ``"Z"``.
|
45
|
+
"""
|
46
|
+
self.rot_axes = rot_axis
|
47
|
+
# Check if angle_list has type "list"
|
48
|
+
if not isinstance(angle_list, list):
|
49
|
+
raise QiskitError("The angles are not provided in a list.")
|
50
|
+
# Check if the angles in angle_list are real numbers
|
51
|
+
for angle in angle_list:
|
52
|
+
try:
|
53
|
+
float(angle)
|
54
|
+
except TypeError as ex:
|
55
|
+
raise QiskitError(
|
56
|
+
"An angle cannot be converted to type float (real angles are expected)."
|
57
|
+
) from ex
|
58
|
+
num_contr = math.log2(len(angle_list))
|
59
|
+
if num_contr < 0 or not num_contr.is_integer():
|
60
|
+
raise QiskitError(
|
61
|
+
"The number of controlled rotation gates is not a non-negative power of 2."
|
62
|
+
)
|
63
|
+
if rot_axis not in ("X", "Y", "Z"):
|
64
|
+
raise QiskitError("Rotation axis is not supported.")
|
65
|
+
# Create new gate.
|
66
|
+
num_qubits = int(num_contr) + 1
|
67
|
+
super().__init__("ucr" + rot_axis.lower(), num_qubits, angle_list)
|
68
|
+
|
69
|
+
def _define(self):
|
70
|
+
ucr_circuit = self._dec_ucrot()
|
71
|
+
gate = ucr_circuit.to_instruction()
|
72
|
+
q = QuantumRegister(self.num_qubits, "q")
|
73
|
+
ucr_circuit = QuantumCircuit(q)
|
74
|
+
ucr_circuit.append(gate, q[:])
|
75
|
+
self.definition = ucr_circuit
|
76
|
+
|
77
|
+
def _dec_ucrot(self):
|
78
|
+
"""
|
79
|
+
Finds a decomposition of a UC rotation gate into elementary gates
|
80
|
+
(C-NOTs and single-qubit rotations).
|
81
|
+
"""
|
82
|
+
q = QuantumRegister(self.num_qubits, "q")
|
83
|
+
circuit = QuantumCircuit(q)
|
84
|
+
q_target = q[0]
|
85
|
+
q_controls = q[1:]
|
86
|
+
if not q_controls: # equivalent to: if len(q_controls) == 0
|
87
|
+
if self.rot_axes == "X":
|
88
|
+
if np.abs(self.params[0]) > _EPS:
|
89
|
+
circuit.rx(self.params[0], q_target)
|
90
|
+
if self.rot_axes == "Y":
|
91
|
+
if np.abs(self.params[0]) > _EPS:
|
92
|
+
circuit.ry(self.params[0], q_target)
|
93
|
+
if self.rot_axes == "Z":
|
94
|
+
if np.abs(self.params[0]) > _EPS:
|
95
|
+
circuit.rz(self.params[0], q_target)
|
96
|
+
else:
|
97
|
+
# First, we find the rotation angles of the single-qubit rotations acting
|
98
|
+
# on the target qubit
|
99
|
+
angles = self.params.copy()
|
100
|
+
UCPauliRotGate._dec_uc_rotations(angles, 0, len(angles), False)
|
101
|
+
# Now, it is easy to place the C-NOT gates to get back the full decomposition.
|
102
|
+
for i, angle in enumerate(angles):
|
103
|
+
if self.rot_axes == "X":
|
104
|
+
if np.abs(angle) > _EPS:
|
105
|
+
circuit.rx(angle, q_target)
|
106
|
+
if self.rot_axes == "Y":
|
107
|
+
if np.abs(angle) > _EPS:
|
108
|
+
circuit.ry(angle, q_target)
|
109
|
+
if self.rot_axes == "Z":
|
110
|
+
if np.abs(angle) > _EPS:
|
111
|
+
circuit.rz(angle, q_target)
|
112
|
+
# Determine the index of the qubit we want to control the C-NOT gate.
|
113
|
+
# Note that it corresponds
|
114
|
+
# to the number of trailing zeros in the binary representation of i+1
|
115
|
+
if not i == len(angles) - 1:
|
116
|
+
binary_rep = np.binary_repr(i + 1)
|
117
|
+
q_contr_index = len(binary_rep) - len(binary_rep.rstrip("0"))
|
118
|
+
else:
|
119
|
+
# Handle special case:
|
120
|
+
q_contr_index = len(q_controls) - 1
|
121
|
+
# For X rotations, we have to additionally place some Ry gates around the
|
122
|
+
# C-NOT gates. They change the basis of the NOT operation, such that the
|
123
|
+
# decomposition of for uniformly controlled X rotations works correctly by symmetry
|
124
|
+
# with the decomposition of uniformly controlled Z or Y rotations
|
125
|
+
if self.rot_axes == "X":
|
126
|
+
circuit.ry(np.pi / 2, q_target)
|
127
|
+
circuit.cx(q_controls[q_contr_index], q_target)
|
128
|
+
if self.rot_axes == "X":
|
129
|
+
circuit.ry(-np.pi / 2, q_target)
|
130
|
+
return circuit
|
131
|
+
|
132
|
+
@staticmethod
|
133
|
+
def _dec_uc_rotations(angles, start_index, end_index, reversed_dec):
|
134
|
+
"""
|
135
|
+
Calculates rotation angles for a uniformly controlled R_t gate with a C-NOT gate at
|
136
|
+
the end of the circuit. The rotation angles of the gate R_t are stored in
|
137
|
+
angles[start_index:end_index]. If reversed_dec == True, it decomposes the gate such that
|
138
|
+
there is a C-NOT gate at the start of the circuit (in fact, the circuit topology for
|
139
|
+
the reversed decomposition is the reversed one of the original decomposition)
|
140
|
+
"""
|
141
|
+
interval_len_half = (end_index - start_index) // 2
|
142
|
+
for i in range(start_index, start_index + interval_len_half):
|
143
|
+
if not reversed_dec:
|
144
|
+
angles[i], angles[i + interval_len_half] = UCPauliRotGate._update_angles(
|
145
|
+
angles[i], angles[i + interval_len_half]
|
146
|
+
)
|
147
|
+
else:
|
148
|
+
angles[i + interval_len_half], angles[i] = UCPauliRotGate._update_angles(
|
149
|
+
angles[i], angles[i + interval_len_half]
|
150
|
+
)
|
151
|
+
if interval_len_half <= 1:
|
152
|
+
return
|
153
|
+
else:
|
154
|
+
UCPauliRotGate._dec_uc_rotations(
|
155
|
+
angles, start_index, start_index + interval_len_half, False
|
156
|
+
)
|
157
|
+
UCPauliRotGate._dec_uc_rotations(
|
158
|
+
angles, start_index + interval_len_half, end_index, True
|
159
|
+
)
|
160
|
+
|
161
|
+
@staticmethod
|
162
|
+
def _update_angles(angle1, angle2):
|
163
|
+
"""Calculate the new rotation angles according to Shende's decomposition."""
|
164
|
+
return (angle1 + angle2) / 2.0, (angle1 - angle2) / 2.0
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2020.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Uniformly controlled Pauli-X rotations."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from .uc_pauli_rot import UCPauliRotGate
|
18
|
+
|
19
|
+
|
20
|
+
class UCRXGate(UCPauliRotGate):
|
21
|
+
r"""Uniformly controlled Pauli-X rotations.
|
22
|
+
|
23
|
+
Implements the :class:`.UCGate` for the special case that all unitaries are Pauli-X rotations,
|
24
|
+
:math:`U_i = R_X(a_i)` where :math:`a_i \in \mathbb{R}` is the rotation angle.
|
25
|
+
"""
|
26
|
+
|
27
|
+
def __init__(self, angle_list: list[float]) -> None:
|
28
|
+
r"""
|
29
|
+
Args:
|
30
|
+
angle_list: List of rotation angles :math:`[a_0, ..., a_{2^{k-1}}]`.
|
31
|
+
"""
|
32
|
+
super().__init__(angle_list, "X")
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2020.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Uniformly controlled Pauli-Y rotations."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from .uc_pauli_rot import UCPauliRotGate
|
18
|
+
|
19
|
+
|
20
|
+
class UCRYGate(UCPauliRotGate):
|
21
|
+
r"""Uniformly controlled Pauli-Y rotations.
|
22
|
+
|
23
|
+
Implements the :class:`.UCGate` for the special case that all unitaries are Pauli-Y rotations,
|
24
|
+
:math:`U_i = R_Y(a_i)` where :math:`a_i \in \mathbb{R}` is the rotation angle.
|
25
|
+
"""
|
26
|
+
|
27
|
+
def __init__(self, angle_list: list[float]) -> None:
|
28
|
+
r"""
|
29
|
+
Args:
|
30
|
+
angle_list: List of rotation angles :math:`[a_0, ..., a_{2^{k-1}}]`.
|
31
|
+
"""
|
32
|
+
super().__init__(angle_list, "Y")
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2020.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Uniformly controlled Pauli-Z rotations."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from .uc_pauli_rot import UCPauliRotGate
|
18
|
+
|
19
|
+
|
20
|
+
class UCRZGate(UCPauliRotGate):
|
21
|
+
r"""Uniformly controlled Pauli-Z rotations.
|
22
|
+
|
23
|
+
Implements the :class:`.UCGate` for the special case that all unitaries are Pauli-Z rotations,
|
24
|
+
:math:`U_i = R_Z(a_i)` where :math:`a_i \in \mathbb{R}` is the rotation angle.
|
25
|
+
"""
|
26
|
+
|
27
|
+
def __init__(self, angle_list: list[float]):
|
28
|
+
r"""
|
29
|
+
Args:
|
30
|
+
angle_list: List of rotation angles :math:`[a_0, ..., a_{2^{k-1}}]`.
|
31
|
+
"""
|
32
|
+
super().__init__(angle_list, "Z")
|
@@ -0,0 +1,236 @@
|
|
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
|
+
"""Arbitrary unitary circuit instruction."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
import math
|
17
|
+
|
18
|
+
import typing
|
19
|
+
import numpy
|
20
|
+
|
21
|
+
from qiskit import _numpy_compat
|
22
|
+
from qiskit.circuit.gate import Gate
|
23
|
+
from qiskit.circuit.controlledgate import ControlledGate
|
24
|
+
from qiskit.circuit.annotated_operation import AnnotatedOperation, ControlModifier
|
25
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
26
|
+
from qiskit.circuit import QuantumRegister
|
27
|
+
from qiskit.circuit.exceptions import CircuitError
|
28
|
+
from qiskit.circuit._utils import _compute_control_matrix
|
29
|
+
from qiskit.circuit.library.standard_gates.u import UGate
|
30
|
+
from qiskit.quantum_info.operators.predicates import matrix_equal
|
31
|
+
from qiskit.quantum_info.operators.predicates import is_unitary_matrix
|
32
|
+
|
33
|
+
from .isometry import Isometry
|
34
|
+
|
35
|
+
if typing.TYPE_CHECKING:
|
36
|
+
from qiskit.quantum_info.operators.base_operator import BaseOperator
|
37
|
+
|
38
|
+
|
39
|
+
class UnitaryGate(Gate):
|
40
|
+
"""Class quantum gates specified by a unitary matrix.
|
41
|
+
|
42
|
+
Example:
|
43
|
+
|
44
|
+
We can create a unitary gate from a unitary matrix then add it to a
|
45
|
+
quantum circuit. The matrix can also be directly applied to the quantum
|
46
|
+
circuit, see :meth:`.QuantumCircuit.unitary`.
|
47
|
+
|
48
|
+
.. plot::
|
49
|
+
:include-source:
|
50
|
+
:nofigs:
|
51
|
+
|
52
|
+
from qiskit import QuantumCircuit
|
53
|
+
from qiskit.circuit.library import UnitaryGate
|
54
|
+
|
55
|
+
matrix = [[0, 0, 0, 1],
|
56
|
+
[0, 0, 1, 0],
|
57
|
+
[1, 0, 0, 0],
|
58
|
+
[0, 1, 0, 0]]
|
59
|
+
gate = UnitaryGate(matrix)
|
60
|
+
|
61
|
+
circuit = QuantumCircuit(2)
|
62
|
+
circuit.append(gate, [0, 1])
|
63
|
+
"""
|
64
|
+
|
65
|
+
def __init__(
|
66
|
+
self,
|
67
|
+
data: numpy.ndarray | Gate | BaseOperator,
|
68
|
+
label: str | None = None,
|
69
|
+
check_input: bool = True,
|
70
|
+
*,
|
71
|
+
num_qubits: int | None = None,
|
72
|
+
) -> None:
|
73
|
+
"""Create a gate from a numeric unitary matrix.
|
74
|
+
|
75
|
+
Args:
|
76
|
+
data: Unitary operator.
|
77
|
+
label: Unitary name for backend [Default: ``None``].
|
78
|
+
check_input: If set to ``False`` this asserts the input
|
79
|
+
is known to be unitary and the checking to validate this will
|
80
|
+
be skipped. This should only ever be used if you know the
|
81
|
+
input is unitary, setting this to ``False`` and passing in
|
82
|
+
a non-unitary matrix will result unexpected behavior and errors.
|
83
|
+
num_qubits: If given, the number of qubits in the matrix. If not given, it is inferred.
|
84
|
+
|
85
|
+
Raises:
|
86
|
+
ValueError: If input data is not an N-qubit unitary operator.
|
87
|
+
"""
|
88
|
+
if hasattr(data, "to_matrix"):
|
89
|
+
# If input is Gate subclass or some other class object that has
|
90
|
+
# a to_matrix method this will call that method.
|
91
|
+
data = data.to_matrix()
|
92
|
+
elif hasattr(data, "to_operator"):
|
93
|
+
# If input is a BaseOperator subclass this attempts to convert
|
94
|
+
# the object to an Operator so that we can extract the underlying
|
95
|
+
# numpy matrix from `Operator.data`.
|
96
|
+
data = data.to_operator().data
|
97
|
+
# Convert to numpy array in case not already an array
|
98
|
+
data = numpy.asarray(data, dtype=complex)
|
99
|
+
input_dim, output_dim = data.shape
|
100
|
+
num_qubits = num_qubits if num_qubits is not None else int(math.log2(input_dim))
|
101
|
+
if check_input:
|
102
|
+
# Check input is unitary
|
103
|
+
if not is_unitary_matrix(data):
|
104
|
+
raise ValueError("Input matrix is not unitary.")
|
105
|
+
# Check input is N-qubit matrix
|
106
|
+
if input_dim != output_dim or 2**num_qubits != input_dim:
|
107
|
+
raise ValueError("Input matrix is not an N-qubit operator.")
|
108
|
+
# Store instruction params
|
109
|
+
super().__init__("unitary", num_qubits, [data], label=label)
|
110
|
+
|
111
|
+
def __eq__(self, other):
|
112
|
+
if not isinstance(other, UnitaryGate):
|
113
|
+
return False
|
114
|
+
if self.label != other.label:
|
115
|
+
return False
|
116
|
+
return matrix_equal(self.params[0], other.params[0])
|
117
|
+
|
118
|
+
def __array__(self, dtype=None, copy=_numpy_compat.COPY_ONLY_IF_NEEDED):
|
119
|
+
"""Return matrix for the unitary."""
|
120
|
+
dtype = self.params[0].dtype if dtype is None else dtype
|
121
|
+
return numpy.array(self.params[0], dtype=dtype, copy=copy)
|
122
|
+
|
123
|
+
def inverse(self, annotated: bool = False):
|
124
|
+
"""Return the adjoint of the unitary."""
|
125
|
+
return self.adjoint()
|
126
|
+
|
127
|
+
def conjugate(self):
|
128
|
+
"""Return the conjugate of the unitary."""
|
129
|
+
return UnitaryGate(numpy.conj(self.to_matrix()))
|
130
|
+
|
131
|
+
def adjoint(self):
|
132
|
+
"""Return the adjoint of the unitary."""
|
133
|
+
return self.transpose().conjugate()
|
134
|
+
|
135
|
+
def transpose(self):
|
136
|
+
"""Return the transpose of the unitary."""
|
137
|
+
return UnitaryGate(numpy.transpose(self.to_matrix()))
|
138
|
+
|
139
|
+
def _define(self):
|
140
|
+
"""Calculate a subcircuit that implements this unitary."""
|
141
|
+
if self.num_qubits == 1:
|
142
|
+
from qiskit.synthesis.one_qubit.one_qubit_decompose import OneQubitEulerDecomposer
|
143
|
+
|
144
|
+
q = QuantumRegister(1, "q")
|
145
|
+
qc = QuantumCircuit(q, name=self.name)
|
146
|
+
theta, phi, lam, global_phase = OneQubitEulerDecomposer("U").angles_and_phase(
|
147
|
+
self.to_matrix()
|
148
|
+
)
|
149
|
+
qc._append(UGate(theta, phi, lam), [q[0]], [])
|
150
|
+
qc.global_phase = global_phase
|
151
|
+
self.definition = qc
|
152
|
+
elif self.num_qubits == 2:
|
153
|
+
from qiskit.synthesis.two_qubit.two_qubit_decompose import ( # pylint: disable=cyclic-import
|
154
|
+
two_qubit_cnot_decompose,
|
155
|
+
)
|
156
|
+
|
157
|
+
self.definition = two_qubit_cnot_decompose(self.to_matrix())
|
158
|
+
else:
|
159
|
+
from qiskit.synthesis.unitary.qsd import ( # pylint: disable=cyclic-import
|
160
|
+
qs_decomposition,
|
161
|
+
)
|
162
|
+
|
163
|
+
self.definition = qs_decomposition(self.to_matrix())
|
164
|
+
# Since iterative cosine-sine decomposition may provide imprecise matrices,
|
165
|
+
# we use the Isometry decomposition in this case
|
166
|
+
# pylint: disable=cyclic-import
|
167
|
+
from qiskit.quantum_info.operators import Operator
|
168
|
+
|
169
|
+
if not (
|
170
|
+
matrix_equal(Operator(self.definition).to_matrix(), self.to_matrix(), atol=1e-7)
|
171
|
+
):
|
172
|
+
self.definition = Isometry(self.matrix, 0, 0).definition
|
173
|
+
|
174
|
+
def control(
|
175
|
+
self,
|
176
|
+
num_ctrl_qubits: int = 1,
|
177
|
+
label: str | None = None,
|
178
|
+
ctrl_state: int | str | None = None,
|
179
|
+
annotated: bool | None = None,
|
180
|
+
) -> ControlledGate | AnnotatedOperation:
|
181
|
+
"""Return controlled version of gate.
|
182
|
+
|
183
|
+
Args:
|
184
|
+
num_ctrl_qubits: Number of controls to add to gate (default is 1).
|
185
|
+
label: Optional gate label.
|
186
|
+
ctrl_state: The control state in decimal or as a bit string (e.g. ``"1011"``).
|
187
|
+
If ``None``, use ``2**num_ctrl_qubits - 1``.
|
188
|
+
annotated: indicates whether the controlled gate should be implemented
|
189
|
+
as an annotated gate. If ``None``, this is handled as ``False``.
|
190
|
+
|
191
|
+
Returns:
|
192
|
+
Controlled version of gate.
|
193
|
+
"""
|
194
|
+
if not annotated:
|
195
|
+
mat = self.to_matrix()
|
196
|
+
cmat = _compute_control_matrix(mat, num_ctrl_qubits, ctrl_state=None)
|
197
|
+
from qiskit.synthesis.unitary.qsd import qs_decomposition
|
198
|
+
|
199
|
+
cmat_def = qs_decomposition(cmat, opt_a1=True, opt_a2=False)
|
200
|
+
# Since iterative cosine-sine decomposition may provide imprecise matrices,
|
201
|
+
# we use the Isometry decomposition in this case
|
202
|
+
# pylint: disable=cyclic-import
|
203
|
+
from qiskit.quantum_info.operators import Operator
|
204
|
+
|
205
|
+
if not matrix_equal(Operator(cmat_def).to_matrix(), cmat, atol=1e-7):
|
206
|
+
self.definition = Isometry(cmat, 0, 0).definition
|
207
|
+
|
208
|
+
gate = ControlledGate(
|
209
|
+
"c-unitary",
|
210
|
+
num_qubits=self.num_qubits + num_ctrl_qubits,
|
211
|
+
params=[mat],
|
212
|
+
label=label,
|
213
|
+
num_ctrl_qubits=num_ctrl_qubits,
|
214
|
+
definition=cmat_def,
|
215
|
+
ctrl_state=ctrl_state,
|
216
|
+
base_gate=self.copy(),
|
217
|
+
)
|
218
|
+
else:
|
219
|
+
gate = AnnotatedOperation(
|
220
|
+
self, ControlModifier(num_ctrl_qubits=num_ctrl_qubits, ctrl_state=ctrl_state)
|
221
|
+
)
|
222
|
+
return gate
|
223
|
+
|
224
|
+
def _qasm_decomposition(self):
|
225
|
+
"""Return an unparameterized version of ourselves, so the OQ2 exporter doesn't choke on the
|
226
|
+
non-standard things in our `params` field."""
|
227
|
+
out = self.definition.to_gate()
|
228
|
+
out.name = self.name
|
229
|
+
return out
|
230
|
+
|
231
|
+
def validate_parameter(self, parameter):
|
232
|
+
"""Unitary gate parameter has to be an ndarray."""
|
233
|
+
if isinstance(parameter, numpy.ndarray):
|
234
|
+
return parameter
|
235
|
+
else:
|
236
|
+
raise CircuitError(f"invalid param type {type(parameter)} in gate {self.name}")
|
@@ -0,0 +1,172 @@
|
|
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
|
+
"""Graph State circuit and gate."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
import numpy as np
|
18
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit, Gate
|
19
|
+
from qiskit.circuit.exceptions import CircuitError
|
20
|
+
from qiskit.utils.deprecation import deprecate_func
|
21
|
+
|
22
|
+
|
23
|
+
class GraphState(QuantumCircuit):
|
24
|
+
r"""Circuit to prepare a graph state.
|
25
|
+
|
26
|
+
Given a graph G = (V, E), with the set of vertices V and the set of edges E,
|
27
|
+
the corresponding graph state is defined as
|
28
|
+
|
29
|
+
.. math::
|
30
|
+
|
31
|
+
|G\rangle = \prod_{(a,b) \in E} CZ_{(a,b)} {|+\rangle}^{\otimes V}
|
32
|
+
|
33
|
+
Such a state can be prepared by first preparing all qubits in the :math:`+`
|
34
|
+
state, then applying a :math:`CZ` gate for each corresponding graph edge.
|
35
|
+
|
36
|
+
Graph state preparation circuits are Clifford circuits, and thus
|
37
|
+
easy to simulate classically. However, by adding a layer of measurements
|
38
|
+
in a product basis at the end, there is evidence that the circuit becomes
|
39
|
+
hard to simulate [2].
|
40
|
+
|
41
|
+
**Reference Circuit:**
|
42
|
+
|
43
|
+
.. plot::
|
44
|
+
:alt: Diagram illustrating the previously described circuit.
|
45
|
+
|
46
|
+
from qiskit.circuit.library import GraphState
|
47
|
+
from qiskit.visualization.library import _generate_circuit_library_visualization
|
48
|
+
import rustworkx as rx
|
49
|
+
G = rx.generators.cycle_graph(5)
|
50
|
+
circuit = GraphState(rx.adjacency_matrix(G))
|
51
|
+
circuit.name = "Graph state"
|
52
|
+
_generate_circuit_library_visualization(circuit)
|
53
|
+
|
54
|
+
**References:**
|
55
|
+
|
56
|
+
[1] M. Hein, J. Eisert, H.J. Briegel, Multi-party Entanglement in Graph States,
|
57
|
+
`arXiv:0307130 <https://arxiv.org/pdf/quant-ph/0307130.pdf>`_
|
58
|
+
[2] D. Koh, Further Extensions of Clifford Circuits & their Classical Simulation Complexities.
|
59
|
+
`arXiv:1512.07892 <https://arxiv.org/pdf/1512.07892.pdf>`_
|
60
|
+
"""
|
61
|
+
|
62
|
+
@deprecate_func(
|
63
|
+
since="2.1",
|
64
|
+
additional_msg="Use qiskit.circuit.library.GraphStateGate instead.",
|
65
|
+
removal_timeline="in Qiskit 3.0",
|
66
|
+
)
|
67
|
+
def __init__(self, adjacency_matrix: list | np.ndarray) -> None:
|
68
|
+
"""Create graph state preparation circuit.
|
69
|
+
|
70
|
+
Args:
|
71
|
+
adjacency_matrix: input graph as n-by-n list of 0-1 lists
|
72
|
+
|
73
|
+
Raises:
|
74
|
+
CircuitError: If adjacency_matrix is not symmetric.
|
75
|
+
|
76
|
+
The circuit prepares a graph state with the given adjacency
|
77
|
+
matrix.
|
78
|
+
"""
|
79
|
+
|
80
|
+
adjacency_matrix = np.asarray(adjacency_matrix)
|
81
|
+
if not np.allclose(adjacency_matrix, adjacency_matrix.transpose()):
|
82
|
+
raise CircuitError("The adjacency matrix must be symmetric.")
|
83
|
+
|
84
|
+
graph_state_gate = GraphStateGate(adjacency_matrix)
|
85
|
+
super().__init__(graph_state_gate.num_qubits, name=f"graph: {adjacency_matrix}")
|
86
|
+
self.compose(graph_state_gate, qubits=self.qubits, inplace=True)
|
87
|
+
|
88
|
+
|
89
|
+
class GraphStateGate(Gate):
|
90
|
+
r"""A gate representing a graph state.
|
91
|
+
|
92
|
+
Given a graph G = (V, E), with the set of vertices V and the set of edges E,
|
93
|
+
the corresponding graph state is defined as
|
94
|
+
|
95
|
+
.. math::
|
96
|
+
|
97
|
+
|G\rangle = \prod_{(a,b) \in E} CZ_{(a,b)} {|+\rangle}^{\otimes V}
|
98
|
+
|
99
|
+
Such a state can be prepared by first preparing all qubits in the :math:`+`
|
100
|
+
state, then applying a :math:`CZ` gate for each corresponding graph edge.
|
101
|
+
|
102
|
+
Graph state preparation circuits are Clifford circuits, and thus
|
103
|
+
easy to simulate classically. However, by adding a layer of measurements
|
104
|
+
in a product basis at the end, there is evidence that the circuit becomes
|
105
|
+
hard to simulate [2].
|
106
|
+
|
107
|
+
**Reference Circuit:**
|
108
|
+
|
109
|
+
.. plot::
|
110
|
+
:alt: Circuit diagram output by the previous code.
|
111
|
+
:include-source:
|
112
|
+
|
113
|
+
from qiskit.circuit import QuantumCircuit
|
114
|
+
from qiskit.circuit.library import GraphStateGate
|
115
|
+
import rustworkx as rx
|
116
|
+
|
117
|
+
G = rx.generators.cycle_graph(5)
|
118
|
+
circuit = QuantumCircuit(5)
|
119
|
+
circuit.append(GraphStateGate(rx.adjacency_matrix(G)), [0, 1, 2, 3, 4])
|
120
|
+
circuit.decompose().draw('mpl')
|
121
|
+
|
122
|
+
**References:**
|
123
|
+
|
124
|
+
[1] M. Hein, J. Eisert, H.J. Briegel, Multi-party Entanglement in Graph States,
|
125
|
+
`arXiv:0307130 <https://arxiv.org/pdf/quant-ph/0307130.pdf>`_
|
126
|
+
[2] D. Koh, Further Extensions of Clifford Circuits & their Classical Simulation Complexities.
|
127
|
+
`arXiv:1512.07892 <https://arxiv.org/pdf/1512.07892.pdf>`_
|
128
|
+
"""
|
129
|
+
|
130
|
+
def __init__(self, adjacency_matrix: list | np.ndarray) -> None:
|
131
|
+
"""
|
132
|
+
Args:
|
133
|
+
adjacency_matrix: input graph as n-by-n list of 0-1 lists
|
134
|
+
|
135
|
+
Raises:
|
136
|
+
CircuitError: If adjacency_matrix is not symmetric.
|
137
|
+
|
138
|
+
The gate represents a graph state with the given adjacency matrix.
|
139
|
+
"""
|
140
|
+
|
141
|
+
adjacency_matrix = np.asarray(adjacency_matrix)
|
142
|
+
if not np.allclose(adjacency_matrix, adjacency_matrix.transpose()):
|
143
|
+
raise CircuitError("The adjacency matrix must be symmetric.")
|
144
|
+
num_qubits = len(adjacency_matrix)
|
145
|
+
|
146
|
+
super().__init__(name="graph_state", num_qubits=num_qubits, params=[adjacency_matrix])
|
147
|
+
|
148
|
+
def _define(self):
|
149
|
+
adjacency_matrix = self.adjacency_matrix
|
150
|
+
circuit = QuantumCircuit(self.num_qubits, name=self.name)
|
151
|
+
circuit.h(range(self.num_qubits))
|
152
|
+
for i in range(self.num_qubits):
|
153
|
+
for j in range(i + 1, self.num_qubits):
|
154
|
+
if adjacency_matrix[i][j] == 1:
|
155
|
+
circuit.cz(i, j)
|
156
|
+
self.definition = circuit
|
157
|
+
|
158
|
+
def validate_parameter(self, parameter):
|
159
|
+
"""Parameter validation"""
|
160
|
+
return parameter
|
161
|
+
|
162
|
+
@property
|
163
|
+
def adjacency_matrix(self):
|
164
|
+
"""Returns the adjacency matrix."""
|
165
|
+
return self.params[0]
|
166
|
+
|
167
|
+
def __eq__(self, other):
|
168
|
+
return (
|
169
|
+
isinstance(other, GraphStateGate)
|
170
|
+
and self.num_qubits == other.num_qubits
|
171
|
+
and np.all(self.adjacency_matrix == other.adjacency_matrix)
|
172
|
+
)
|