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,93 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 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
|
+
Synthesis of a reverse permutation for LNN connectivity.
|
14
|
+
"""
|
15
|
+
|
16
|
+
from qiskit.circuit import QuantumCircuit
|
17
|
+
from qiskit._accelerate.synthesis.permutation import (
|
18
|
+
synth_permutation_reverse_lnn_kms as synth_permutation_reverse_lnn_kms_inner,
|
19
|
+
)
|
20
|
+
|
21
|
+
|
22
|
+
def _append_cx_stage1(qc, n):
|
23
|
+
"""A single layer of CX gates."""
|
24
|
+
for i in range(n // 2):
|
25
|
+
qc.cx(2 * i, 2 * i + 1)
|
26
|
+
for i in range((n + 1) // 2 - 1):
|
27
|
+
qc.cx(2 * i + 2, 2 * i + 1)
|
28
|
+
return qc
|
29
|
+
|
30
|
+
|
31
|
+
def _append_cx_stage2(qc, n):
|
32
|
+
"""A single layer of CX gates."""
|
33
|
+
for i in range(n // 2):
|
34
|
+
qc.cx(2 * i + 1, 2 * i)
|
35
|
+
for i in range((n + 1) // 2 - 1):
|
36
|
+
qc.cx(2 * i + 1, 2 * i + 2)
|
37
|
+
return qc
|
38
|
+
|
39
|
+
|
40
|
+
def _append_reverse_permutation_lnn_kms(qc: QuantumCircuit, num_qubits: int) -> None:
|
41
|
+
"""
|
42
|
+
Append reverse permutation to a QuantumCircuit for linear nearest-neighbor architectures
|
43
|
+
using Kutin, Moulton, Smithline method.
|
44
|
+
|
45
|
+
Synthesis algorithm for reverse permutation from [1], section 5.
|
46
|
+
This algorithm synthesizes the reverse permutation on :math:`n` qubits over
|
47
|
+
a linear nearest-neighbor architecture using CX gates with depth :math:`2 * n + 2`.
|
48
|
+
|
49
|
+
Args:
|
50
|
+
qc: The original quantum circuit.
|
51
|
+
num_qubits: The number of qubits.
|
52
|
+
|
53
|
+
Returns:
|
54
|
+
The quantum circuit with appended reverse permutation.
|
55
|
+
|
56
|
+
References:
|
57
|
+
1. Kutin, S., Moulton, D. P., Smithline, L.,
|
58
|
+
*Computation at a distance*, Chicago J. Theor. Comput. Sci., vol. 2007, (2007),
|
59
|
+
`arXiv:quant-ph/0701194 <https://arxiv.org/abs/quant-ph/0701194>`_
|
60
|
+
"""
|
61
|
+
|
62
|
+
for _ in range((num_qubits + 1) // 2):
|
63
|
+
_append_cx_stage1(qc, num_qubits)
|
64
|
+
_append_cx_stage2(qc, num_qubits)
|
65
|
+
if (num_qubits % 2) == 0:
|
66
|
+
_append_cx_stage1(qc, num_qubits)
|
67
|
+
|
68
|
+
|
69
|
+
def synth_permutation_reverse_lnn_kms(num_qubits: int) -> QuantumCircuit:
|
70
|
+
"""
|
71
|
+
Synthesize reverse permutation for linear nearest-neighbor architectures using
|
72
|
+
Kutin, Moulton, Smithline method.
|
73
|
+
|
74
|
+
Synthesis algorithm for reverse permutation from [1], section 5.
|
75
|
+
This algorithm synthesizes the reverse permutation on :math:`n` qubits over
|
76
|
+
a linear nearest-neighbor architecture using CX gates with depth :math:`2 * n + 2`.
|
77
|
+
|
78
|
+
Args:
|
79
|
+
num_qubits: The number of qubits.
|
80
|
+
|
81
|
+
Returns:
|
82
|
+
The synthesized quantum circuit.
|
83
|
+
|
84
|
+
References:
|
85
|
+
1. Kutin, S., Moulton, D. P., Smithline, L.,
|
86
|
+
*Computation at a distance*, Chicago J. Theor. Comput. Sci., vol. 2007, (2007),
|
87
|
+
`arXiv:quant-ph/0701194 <https://arxiv.org/abs/quant-ph/0701194>`_
|
88
|
+
"""
|
89
|
+
|
90
|
+
# Call Rust implementation
|
91
|
+
return QuantumCircuit._from_circuit_data(
|
92
|
+
synth_permutation_reverse_lnn_kms_inner(num_qubits), add_regs=True
|
93
|
+
)
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2022.
|
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 handling permutations."""
|
14
|
+
|
15
|
+
# pylint: disable=unused-import
|
16
|
+
from qiskit._accelerate.synthesis.permutation import _inverse_pattern, _validate_permutation
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2023.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Module containing stabilizer QFT circuit synthesis."""
|
14
|
+
|
15
|
+
from .qft_decompose_lnn import synth_qft_line
|
16
|
+
from .qft_decompose_full import synth_qft_full
|
@@ -0,0 +1,97 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 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
|
+
Circuit synthesis for a QFT circuit.
|
14
|
+
"""
|
15
|
+
|
16
|
+
from __future__ import annotations
|
17
|
+
import warnings
|
18
|
+
import numpy as np
|
19
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
20
|
+
|
21
|
+
|
22
|
+
def synth_qft_full(
|
23
|
+
num_qubits: int,
|
24
|
+
do_swaps: bool = True,
|
25
|
+
approximation_degree: int = 0,
|
26
|
+
insert_barriers: bool = False,
|
27
|
+
inverse: bool = False,
|
28
|
+
name: str | None = None,
|
29
|
+
) -> QuantumCircuit:
|
30
|
+
"""Construct a circuit for the Quantum Fourier Transform using all-to-all connectivity.
|
31
|
+
|
32
|
+
.. note::
|
33
|
+
|
34
|
+
With the default value of ``do_swaps = True``, this synthesis algorithm creates a
|
35
|
+
circuit that faithfully implements the QFT operation. This circuit contains a sequence
|
36
|
+
of swap gates at the end, corresponding to reversing the order of its output qubits.
|
37
|
+
In some applications this reversal permutation can be avoided. Setting ``do_swaps = False``
|
38
|
+
creates a circuit without this reversal permutation, at the expense that this circuit
|
39
|
+
implements the "QFT-with-reversal" instead of QFT. Alternatively, the
|
40
|
+
:class:`~.ElidePermutations` transpiler pass is able to remove these swap gates.
|
41
|
+
|
42
|
+
Args:
|
43
|
+
num_qubits: The number of qubits on which the Quantum Fourier Transform acts.
|
44
|
+
do_swaps: Whether to synthesize the "QFT" or the "QFT-with-reversal" operation.
|
45
|
+
approximation_degree: The degree of approximation (0 for no approximation).
|
46
|
+
It is possible to implement the QFT approximately by ignoring
|
47
|
+
controlled-phase rotations with the angle beneath a threshold. This is discussed
|
48
|
+
in more detail in https://arxiv.org/abs/quant-ph/9601018 or
|
49
|
+
https://arxiv.org/abs/quant-ph/0403071.
|
50
|
+
insert_barriers: If ``True``, barriers are inserted for improved visualization.
|
51
|
+
inverse: If ``True``, the inverse Quantum Fourier Transform is constructed.
|
52
|
+
name: The name of the circuit.
|
53
|
+
|
54
|
+
Returns:
|
55
|
+
A circuit implementing the QFT operation.
|
56
|
+
|
57
|
+
"""
|
58
|
+
_warn_if_precision_loss(num_qubits - approximation_degree - 1)
|
59
|
+
circuit = QuantumCircuit(num_qubits, name=name)
|
60
|
+
|
61
|
+
for j in reversed(range(num_qubits)):
|
62
|
+
circuit.h(j)
|
63
|
+
num_entanglements = max(0, j - max(0, approximation_degree - (num_qubits - j - 1)))
|
64
|
+
for k in reversed(range(j - num_entanglements, j)):
|
65
|
+
# Use negative exponents so that the angle safely underflows to zero, rather than
|
66
|
+
# using a temporary variable that overflows to infinity in the worst case.
|
67
|
+
lam = np.pi * (2.0 ** (k - j))
|
68
|
+
circuit.cp(lam, j, k)
|
69
|
+
|
70
|
+
if insert_barriers:
|
71
|
+
circuit.barrier()
|
72
|
+
|
73
|
+
if do_swaps:
|
74
|
+
for i in range(num_qubits // 2):
|
75
|
+
circuit.swap(i, num_qubits - i - 1)
|
76
|
+
|
77
|
+
if inverse:
|
78
|
+
circuit = circuit.inverse()
|
79
|
+
|
80
|
+
return circuit
|
81
|
+
|
82
|
+
|
83
|
+
def _warn_if_precision_loss(max_num_entanglements):
|
84
|
+
"""Issue a warning if constructing the circuit will lose precision.
|
85
|
+
|
86
|
+
If we need an angle smaller than ``pi * 2**-1022``, we start to lose precision by going into
|
87
|
+
the subnormal numbers. We won't lose _all_ precision until an exponent of about 1075, but
|
88
|
+
beyond 1022 we're using fractional bits to represent leading zeros.
|
89
|
+
"""
|
90
|
+
if max_num_entanglements > -np.finfo(float).minexp: # > 1022 for doubles.
|
91
|
+
warnings.warn(
|
92
|
+
"precision loss in QFT."
|
93
|
+
f" The rotation needed to represent {max_num_entanglements} entanglements"
|
94
|
+
" is smaller than the smallest normal floating-point number.",
|
95
|
+
category=RuntimeWarning,
|
96
|
+
stacklevel=4,
|
97
|
+
)
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2023.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
"""
|
13
|
+
Circuit synthesis for a QFT circuit.
|
14
|
+
"""
|
15
|
+
|
16
|
+
from qiskit.circuit import QuantumCircuit
|
17
|
+
from qiskit._accelerate.synthesis.qft import synth_qft_line as _synth_qft_line
|
18
|
+
|
19
|
+
from .qft_decompose_full import _warn_if_precision_loss
|
20
|
+
|
21
|
+
|
22
|
+
def synth_qft_line(
|
23
|
+
num_qubits: int, do_swaps: bool = True, approximation_degree: int = 0
|
24
|
+
) -> QuantumCircuit:
|
25
|
+
"""Construct a circuit for the Quantum Fourier Transform using linear
|
26
|
+
neighbor connectivity.
|
27
|
+
|
28
|
+
The construction is based on Fig 2.b in Fowler et al. [1].
|
29
|
+
|
30
|
+
.. note::
|
31
|
+
|
32
|
+
With the default value of ``do_swaps = True``, this synthesis algorithm creates a
|
33
|
+
circuit that faithfully implements the QFT operation. When ``do_swaps = False``,
|
34
|
+
this synthesis algorithm creates a circuit that corresponds to "QFT-with-reversal":
|
35
|
+
applying the QFT and reversing the order of its output qubits.
|
36
|
+
|
37
|
+
Args:
|
38
|
+
num_qubits: The number of qubits on which the Quantum Fourier Transform acts.
|
39
|
+
approximation_degree: The degree of approximation (0 for no approximation).
|
40
|
+
It is possible to implement the QFT approximately by ignoring
|
41
|
+
controlled-phase rotations with the angle beneath a threshold. This is discussed
|
42
|
+
in more detail in https://arxiv.org/abs/quant-ph/9601018 or
|
43
|
+
https://arxiv.org/abs/quant-ph/0403071.
|
44
|
+
do_swaps: Whether to synthesize the "QFT" or the "QFT-with-reversal" operation.
|
45
|
+
|
46
|
+
Returns:
|
47
|
+
A circuit implementing the QFT operation.
|
48
|
+
|
49
|
+
References:
|
50
|
+
1. A. G. Fowler, S. J. Devitt, and L. C. L. Hollenberg,
|
51
|
+
*Implementation of Shor's algorithm on a linear nearest neighbour qubit array*,
|
52
|
+
Quantum Info. Comput. 4, 4 (July 2004), 237–251.
|
53
|
+
`arXiv:quant-ph/0402196 [quant-ph] <https://arxiv.org/abs/quant-ph/0402196>`_
|
54
|
+
"""
|
55
|
+
_warn_if_precision_loss(num_qubits - approximation_degree - 1)
|
56
|
+
|
57
|
+
return QuantumCircuit._from_circuit_data(
|
58
|
+
# From rust
|
59
|
+
_synth_qft_line(num_qubits, do_swaps, approximation_degree),
|
60
|
+
add_regs=True,
|
61
|
+
)
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2023.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Module containing stabilizer state preparation circuit synthesis."""
|
14
|
+
|
15
|
+
from .stabilizer_decompose import synth_stabilizer_layers, synth_stabilizer_depth_lnn
|
16
|
+
from .stabilizer_circuit import synth_circuit_from_stabilizers
|
@@ -0,0 +1,149 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 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
|
+
Stabilizer to circuit function
|
14
|
+
"""
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from collections.abc import Collection
|
18
|
+
|
19
|
+
import numpy as np
|
20
|
+
|
21
|
+
from qiskit.quantum_info import PauliList
|
22
|
+
from qiskit.exceptions import QiskitError
|
23
|
+
from qiskit.circuit import QuantumCircuit
|
24
|
+
from qiskit.quantum_info.operators.symplectic.clifford import Clifford
|
25
|
+
|
26
|
+
|
27
|
+
def synth_circuit_from_stabilizers(
|
28
|
+
stabilizers: Collection[str],
|
29
|
+
allow_redundant: bool = False,
|
30
|
+
allow_underconstrained: bool = False,
|
31
|
+
invert: bool = False,
|
32
|
+
) -> QuantumCircuit:
|
33
|
+
# pylint: disable=line-too-long
|
34
|
+
"""Synthesis of a circuit that generates a state stabilized by the stabilizers
|
35
|
+
using Gaussian elimination with Clifford gates.
|
36
|
+
If the stabilizers are underconstrained, and ``allow_underconstrained`` is ``True``,
|
37
|
+
the circuit will output one of the states stabilized by the stabilizers.
|
38
|
+
Based on stim implementation.
|
39
|
+
|
40
|
+
Args:
|
41
|
+
stabilizers: List of stabilizer strings
|
42
|
+
allow_redundant: Allow redundant stabilizers (i.e., some stabilizers
|
43
|
+
can be products of the others)
|
44
|
+
allow_underconstrained: Allow underconstrained set of stabilizers (i.e.,
|
45
|
+
the stabilizers do not specify a unique state)
|
46
|
+
invert: Return inverse circuit
|
47
|
+
|
48
|
+
Returns:
|
49
|
+
A circuit that generates a state stabilized by ``stabilizers``.
|
50
|
+
|
51
|
+
Raises:
|
52
|
+
QiskitError: if the stabilizers are invalid, do not commute, or contradict each other,
|
53
|
+
if the list is underconstrained and ``allow_underconstrained`` is ``False``,
|
54
|
+
or if the list is redundant and ``allow_redundant`` is ``False``.
|
55
|
+
|
56
|
+
References:
|
57
|
+
1. https://github.com/quantumlib/Stim/blob/c0dd0b1c8125b2096cd54b6f72884a459e47fe3e/src/stim/stabilizers/conversions.inl#L469
|
58
|
+
2. https://quantumcomputing.stackexchange.com/questions/12721/how-to-calculate-destabilizer-group-of-toric-and-other-codes
|
59
|
+
|
60
|
+
"""
|
61
|
+
stabilizer_list = PauliList(stabilizers)
|
62
|
+
if np.any(stabilizer_list.phase % 2):
|
63
|
+
raise QiskitError("Some stabilizers have an invalid phase")
|
64
|
+
if len(stabilizer_list.commutes_with_all(stabilizer_list)) < len(stabilizer_list):
|
65
|
+
raise QiskitError("Some stabilizers do not commute.")
|
66
|
+
|
67
|
+
num_qubits = stabilizer_list.num_qubits
|
68
|
+
circuit = QuantumCircuit(num_qubits)
|
69
|
+
|
70
|
+
used = 0
|
71
|
+
for i, stabilizer in enumerate(stabilizer_list):
|
72
|
+
curr_stab = stabilizer.evolve(Clifford(circuit), frame="s")
|
73
|
+
|
74
|
+
# Find pivot.
|
75
|
+
pivot = used
|
76
|
+
while pivot < num_qubits:
|
77
|
+
if curr_stab[pivot].x or curr_stab[pivot].z:
|
78
|
+
break
|
79
|
+
pivot += 1
|
80
|
+
|
81
|
+
if pivot == num_qubits:
|
82
|
+
if curr_stab.x.any():
|
83
|
+
raise QiskitError(
|
84
|
+
f"Stabilizer {i} ({stabilizer}) anti-commutes with some of "
|
85
|
+
"the previous stabilizers."
|
86
|
+
)
|
87
|
+
if curr_stab.phase == 2:
|
88
|
+
raise QiskitError(
|
89
|
+
f"Stabilizer {i} ({stabilizer}) contradicts "
|
90
|
+
"some of the previous stabilizers."
|
91
|
+
)
|
92
|
+
if curr_stab.z.any() and not allow_redundant:
|
93
|
+
raise QiskitError(
|
94
|
+
f"Stabilizer {i} ({stabilizer}) is a product of the others "
|
95
|
+
"and allow_redundant is False. Add allow_redundant=True "
|
96
|
+
"to the function call if you want to allow redundant stabilizers."
|
97
|
+
)
|
98
|
+
continue
|
99
|
+
|
100
|
+
# Change pivot basis to the Z axis.
|
101
|
+
if curr_stab[pivot].x:
|
102
|
+
if curr_stab[pivot].z:
|
103
|
+
circuit.h(pivot)
|
104
|
+
circuit.s(pivot)
|
105
|
+
circuit.h(pivot)
|
106
|
+
circuit.s(pivot)
|
107
|
+
circuit.s(pivot)
|
108
|
+
else:
|
109
|
+
circuit.h(pivot)
|
110
|
+
|
111
|
+
# Cancel other terms in Pauli string.
|
112
|
+
for j in range(num_qubits):
|
113
|
+
if j == pivot or not (curr_stab[j].x or curr_stab[j].z):
|
114
|
+
continue
|
115
|
+
p = curr_stab[j].x + curr_stab[j].z * 2
|
116
|
+
if p == 1: # X
|
117
|
+
circuit.h(pivot)
|
118
|
+
circuit.cx(pivot, j)
|
119
|
+
circuit.h(pivot)
|
120
|
+
elif p == 2: # Z
|
121
|
+
circuit.cx(j, pivot)
|
122
|
+
elif p == 3: # Y
|
123
|
+
circuit.h(pivot)
|
124
|
+
circuit.s(j)
|
125
|
+
circuit.s(j)
|
126
|
+
circuit.s(j)
|
127
|
+
circuit.cx(pivot, j)
|
128
|
+
circuit.h(pivot)
|
129
|
+
circuit.s(j)
|
130
|
+
|
131
|
+
# Move pivot to diagonal.
|
132
|
+
if pivot != used:
|
133
|
+
circuit.swap(pivot, used)
|
134
|
+
|
135
|
+
# fix sign
|
136
|
+
curr_stab = stabilizer.evolve(Clifford(circuit), frame="s")
|
137
|
+
if curr_stab.phase == 2:
|
138
|
+
circuit.x(used)
|
139
|
+
used += 1
|
140
|
+
|
141
|
+
if used < num_qubits and not allow_underconstrained:
|
142
|
+
raise QiskitError(
|
143
|
+
"Stabilizers are underconstrained and allow_underconstrained is False."
|
144
|
+
" Add allow_underconstrained=True to the function call "
|
145
|
+
"if you want to allow underconstrained stabilizers."
|
146
|
+
)
|
147
|
+
if invert:
|
148
|
+
return circuit
|
149
|
+
return circuit.inverse()
|
@@ -0,0 +1,194 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2023.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
"""
|
13
|
+
Circuit synthesis for a stabilizer state preparation circuit.
|
14
|
+
"""
|
15
|
+
# pylint: disable=invalid-name
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
|
19
|
+
from collections.abc import Callable
|
20
|
+
import numpy as np
|
21
|
+
from qiskit.circuit import QuantumCircuit
|
22
|
+
from qiskit.exceptions import QiskitError
|
23
|
+
from qiskit.quantum_info.states import StabilizerState
|
24
|
+
from qiskit.synthesis.linear.linear_matrix_utils import (
|
25
|
+
calc_inverse_matrix,
|
26
|
+
)
|
27
|
+
from qiskit.synthesis.linear_phase import synth_cz_depth_line_mr
|
28
|
+
from qiskit.synthesis.clifford.clifford_decompose_layers import (
|
29
|
+
_default_cz_synth_func,
|
30
|
+
_reverse_clifford,
|
31
|
+
_create_graph_state,
|
32
|
+
_decompose_graph_state,
|
33
|
+
)
|
34
|
+
|
35
|
+
|
36
|
+
def synth_stabilizer_layers(
|
37
|
+
stab: StabilizerState,
|
38
|
+
cz_synth_func: Callable[[np.ndarray], QuantumCircuit] = _default_cz_synth_func,
|
39
|
+
cz_func_reverse_qubits: bool = False,
|
40
|
+
validate: bool = False,
|
41
|
+
) -> QuantumCircuit:
|
42
|
+
"""Synthesis of a stabilizer state into layers.
|
43
|
+
|
44
|
+
It provides a similar decomposition to the synthesis described in Lemma 8 of reference [1],
|
45
|
+
without the initial Hadamard-free sub-circuit which do not affect the stabilizer state.
|
46
|
+
|
47
|
+
For example, a 5-qubit stabilizer state is decomposed into the following layers:
|
48
|
+
|
49
|
+
.. code-block:: text
|
50
|
+
|
51
|
+
┌─────┐┌─────┐┌─────┐┌─────┐┌────────┐
|
52
|
+
q_0: ┤0 ├┤0 ├┤0 ├┤0 ├┤0 ├
|
53
|
+
│ ││ ││ ││ ││ │
|
54
|
+
q_1: ┤1 ├┤1 ├┤1 ├┤1 ├┤1 ├
|
55
|
+
│ ││ ││ ││ ││ │
|
56
|
+
q_2: ┤2 H2 ├┤2 S1 ├┤2 CZ ├┤2 H1 ├┤2 Pauli ├
|
57
|
+
│ ││ ││ ││ ││ │
|
58
|
+
q_3: ┤3 ├┤3 ├┤3 ├┤3 ├┤3 ├
|
59
|
+
│ ││ ││ ││ ││ │
|
60
|
+
q_4: ┤4 ├┤4 ├┤4 ├┤4 ├┤4 ├
|
61
|
+
└─────┘└─────┘└─────┘└─────┘└────────┘
|
62
|
+
|
63
|
+
Args:
|
64
|
+
stab: A stabilizer state.
|
65
|
+
cz_synth_func: A function to decompose the CZ sub-circuit.
|
66
|
+
It gets as input a boolean symmetric matrix, and outputs a :class:`.QuantumCircuit`.
|
67
|
+
cz_func_reverse_qubits: ``True`` only if ``cz_synth_func`` is
|
68
|
+
:func:`.synth_cz_depth_line_mr`,
|
69
|
+
since this function returns a circuit that reverts the order of qubits.
|
70
|
+
validate: If ``True``, validates the synthesis process.
|
71
|
+
|
72
|
+
Returns:
|
73
|
+
A circuit implementation of the stabilizer state.
|
74
|
+
|
75
|
+
Raises:
|
76
|
+
QiskitError: if the input is not a :class:`.StabilizerState`.
|
77
|
+
|
78
|
+
References:
|
79
|
+
1. S. Bravyi, D. Maslov, *Hadamard-free circuits expose the
|
80
|
+
structure of the Clifford group*,
|
81
|
+
`arXiv:2003.09412 [quant-ph] <https://arxiv.org/abs/2003.09412>`_
|
82
|
+
"""
|
83
|
+
|
84
|
+
if not isinstance(stab, StabilizerState):
|
85
|
+
raise QiskitError("The input is not a StabilizerState.")
|
86
|
+
|
87
|
+
cliff = stab.clifford
|
88
|
+
num_qubits = cliff.num_qubits
|
89
|
+
|
90
|
+
if cz_func_reverse_qubits:
|
91
|
+
cliff0 = _reverse_clifford(cliff)
|
92
|
+
else:
|
93
|
+
cliff0 = cliff
|
94
|
+
|
95
|
+
H1_circ, cliff1 = _create_graph_state(cliff0, validate=validate)
|
96
|
+
|
97
|
+
H2_circ, CZ1_circ, S1_circ, _ = _decompose_graph_state(
|
98
|
+
cliff1, validate=validate, cz_synth_func=cz_synth_func
|
99
|
+
)
|
100
|
+
|
101
|
+
qubit_list = list(range(num_qubits))
|
102
|
+
layeredCircuit = QuantumCircuit(num_qubits)
|
103
|
+
|
104
|
+
layeredCircuit.append(H2_circ, qubit_list)
|
105
|
+
layeredCircuit.append(S1_circ, qubit_list)
|
106
|
+
layeredCircuit.append(CZ1_circ, qubit_list)
|
107
|
+
|
108
|
+
if cz_func_reverse_qubits:
|
109
|
+
H1_circ = H1_circ.reverse_bits()
|
110
|
+
layeredCircuit.append(H1_circ, qubit_list)
|
111
|
+
|
112
|
+
# Add Pauli layer to fix the Clifford phase signs
|
113
|
+
# pylint: disable=cyclic-import
|
114
|
+
from qiskit.quantum_info.operators.symplectic import Clifford
|
115
|
+
|
116
|
+
clifford_target = Clifford(layeredCircuit)
|
117
|
+
pauli_circ = _calc_pauli_diff_stabilizer(cliff, clifford_target)
|
118
|
+
layeredCircuit.append(pauli_circ, qubit_list)
|
119
|
+
|
120
|
+
return layeredCircuit
|
121
|
+
|
122
|
+
|
123
|
+
def _calc_pauli_diff_stabilizer(cliff, cliff_target):
|
124
|
+
"""Given two Cliffords whose stabilizers differ by a Pauli, we find this Pauli."""
|
125
|
+
|
126
|
+
# pylint: disable=cyclic-import
|
127
|
+
from qiskit.quantum_info.operators.symplectic import Pauli
|
128
|
+
|
129
|
+
num_qubits = cliff.num_qubits
|
130
|
+
if cliff.num_qubits != cliff_target.num_qubits:
|
131
|
+
raise QiskitError("num_qubits is not the same for the original clifford and the target.")
|
132
|
+
|
133
|
+
# stabilizer generators of the original clifford
|
134
|
+
stab_gen = StabilizerState(cliff).clifford.to_dict()["stabilizer"]
|
135
|
+
|
136
|
+
# stabilizer state of the target clifford
|
137
|
+
ts = StabilizerState(cliff_target)
|
138
|
+
|
139
|
+
phase_destab = [False] * num_qubits
|
140
|
+
phase_stab = [ts.expectation_value(Pauli(stab_gen[i])) == -1 for i in range(num_qubits)]
|
141
|
+
|
142
|
+
phase = []
|
143
|
+
phase.extend(phase_destab)
|
144
|
+
phase.extend(phase_stab)
|
145
|
+
phase = np.array(phase, dtype=int)
|
146
|
+
|
147
|
+
A = cliff.symplectic_matrix.astype(bool, copy=False)
|
148
|
+
Ainv = calc_inverse_matrix(A)
|
149
|
+
|
150
|
+
# By carefully writing how X, Y, Z gates affect each qubit, all we need to compute
|
151
|
+
# is A^{-1} * (phase)
|
152
|
+
C = np.matmul(Ainv, phase) % 2
|
153
|
+
|
154
|
+
# Create the Pauli
|
155
|
+
pauli_circ = QuantumCircuit(num_qubits, name="Pauli")
|
156
|
+
for k in range(num_qubits):
|
157
|
+
destab = C[k]
|
158
|
+
stab = C[k + num_qubits]
|
159
|
+
if stab and destab:
|
160
|
+
pauli_circ.y(k)
|
161
|
+
elif stab:
|
162
|
+
pauli_circ.x(k)
|
163
|
+
elif destab:
|
164
|
+
pauli_circ.z(k)
|
165
|
+
|
166
|
+
return pauli_circ
|
167
|
+
|
168
|
+
|
169
|
+
def synth_stabilizer_depth_lnn(stab: StabilizerState) -> QuantumCircuit:
|
170
|
+
"""Synthesis of an n-qubit stabilizer state for linear-nearest neighbor connectivity,
|
171
|
+
in 2-qubit depth :math:`2n+2` and two distinct CX layers, using :class:`.CXGate`\\ s and phase gates
|
172
|
+
(:class:`.SGate`, :class:`.SdgGate` or :class:`.ZGate`).
|
173
|
+
|
174
|
+
Args:
|
175
|
+
stab: A stabilizer state.
|
176
|
+
|
177
|
+
Returns:
|
178
|
+
A circuit implementation of the stabilizer state.
|
179
|
+
|
180
|
+
References:
|
181
|
+
1. S. Bravyi, D. Maslov, *Hadamard-free circuits expose the
|
182
|
+
structure of the Clifford group*,
|
183
|
+
`arXiv:2003.09412 [quant-ph] <https://arxiv.org/abs/2003.09412>`_
|
184
|
+
2. Dmitri Maslov, Martin Roetteler,
|
185
|
+
*Shorter stabilizer circuits via Bruhat decomposition and quantum circuit transformations*,
|
186
|
+
`arXiv:1705.09176 <https://arxiv.org/abs/1705.09176>`_.
|
187
|
+
"""
|
188
|
+
|
189
|
+
circ = synth_stabilizer_layers(
|
190
|
+
stab,
|
191
|
+
cz_synth_func=synth_cz_depth_line_mr,
|
192
|
+
cz_func_reverse_qubits=True,
|
193
|
+
)
|
194
|
+
return circ
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2023.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Module containing two-qubit unitary synthesis methods."""
|
14
|
+
|
15
|
+
from .two_qubit_decompose import (
|
16
|
+
TwoQubitBasisDecomposer,
|
17
|
+
two_qubit_cnot_decompose,
|
18
|
+
TwoQubitWeylDecomposition,
|
19
|
+
TwoQubitControlledUDecomposer,
|
20
|
+
)
|