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,64 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 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
|
+
Circuit synthesis for the Clifford class for all-to-all architecture.
|
14
|
+
"""
|
15
|
+
|
16
|
+
from __future__ import annotations
|
17
|
+
from qiskit.circuit import QuantumCircuit
|
18
|
+
from qiskit.quantum_info import Clifford
|
19
|
+
from qiskit.synthesis.clifford.clifford_decompose_ag import synth_clifford_ag
|
20
|
+
from qiskit.synthesis.clifford.clifford_decompose_bm import synth_clifford_bm
|
21
|
+
from qiskit.synthesis.clifford.clifford_decompose_greedy import synth_clifford_greedy
|
22
|
+
|
23
|
+
|
24
|
+
def synth_clifford_full(clifford: Clifford, method: str | None = None) -> QuantumCircuit:
|
25
|
+
r"""Decompose a :class:`.Clifford` operator into a :class:`.QuantumCircuit`.
|
26
|
+
|
27
|
+
For :math:`N \leq 3` qubits this is based on optimal CX-cost decomposition
|
28
|
+
from reference [1]. For :math:`N > 3` qubits this is done using the general
|
29
|
+
non-optimal greedy compilation routine from reference [3],
|
30
|
+
which typically yields better CX cost compared to the AG method in [2].
|
31
|
+
|
32
|
+
Args:
|
33
|
+
clifford: A Clifford operator.
|
34
|
+
method: Optional, a synthesis method (``'AG'`` or ``'greedy'``).
|
35
|
+
If set this overrides optimal decomposition for :math:`N \leq 3` qubits.
|
36
|
+
|
37
|
+
Returns:
|
38
|
+
A circuit implementation of the Clifford.
|
39
|
+
|
40
|
+
References:
|
41
|
+
1. S. Bravyi, D. Maslov, *Hadamard-free circuits expose the
|
42
|
+
structure of the Clifford group*,
|
43
|
+
`arXiv:2003.09412 [quant-ph] <https://arxiv.org/abs/2003.09412>`_
|
44
|
+
|
45
|
+
2. S. Aaronson, D. Gottesman, *Improved Simulation of Stabilizer Circuits*,
|
46
|
+
Phys. Rev. A 70, 052328 (2004).
|
47
|
+
`arXiv:quant-ph/0406196 <https://arxiv.org/abs/quant-ph/0406196>`_
|
48
|
+
|
49
|
+
3. Sergey Bravyi, Shaohan Hu, Dmitri Maslov, Ruslan Shaydulin,
|
50
|
+
*Clifford Circuit Optimization with Templates and Symbolic Pauli Gates*,
|
51
|
+
`arXiv:2105.02291 [quant-ph] <https://arxiv.org/abs/2105.02291>`_
|
52
|
+
"""
|
53
|
+
num_qubits = clifford.num_qubits
|
54
|
+
|
55
|
+
if method == "AG":
|
56
|
+
return synth_clifford_ag(clifford)
|
57
|
+
|
58
|
+
if method == "greedy":
|
59
|
+
return synth_clifford_greedy(clifford)
|
60
|
+
|
61
|
+
if num_qubits <= 3:
|
62
|
+
return synth_clifford_bm(clifford)
|
63
|
+
|
64
|
+
return synth_clifford_greedy(clifford)
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2021, 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 the Clifford class.
|
14
|
+
"""
|
15
|
+
|
16
|
+
# ---------------------------------------------------------------------
|
17
|
+
# Synthesis based on Bravyi et. al. greedy clifford compiler
|
18
|
+
# ---------------------------------------------------------------------
|
19
|
+
|
20
|
+
from qiskit.circuit import QuantumCircuit
|
21
|
+
from qiskit.quantum_info import Clifford
|
22
|
+
|
23
|
+
from qiskit._accelerate.synthesis.clifford import (
|
24
|
+
synth_clifford_greedy as synth_clifford_greedy_inner,
|
25
|
+
)
|
26
|
+
|
27
|
+
|
28
|
+
def synth_clifford_greedy(clifford: Clifford) -> QuantumCircuit:
|
29
|
+
"""Decompose a :class:`.Clifford` operator into a :class:`.QuantumCircuit` based
|
30
|
+
on the greedy Clifford compiler that is described in Appendix A of
|
31
|
+
Bravyi, Hu, Maslov and Shaydulin [1].
|
32
|
+
|
33
|
+
This method typically yields better CX cost compared to the Aaronson-Gottesman method.
|
34
|
+
|
35
|
+
Note that this function only implements the greedy Clifford compiler from Appendix A
|
36
|
+
of [1], and not the templates and symbolic Pauli gates optimizations
|
37
|
+
that are mentioned in the same paper.
|
38
|
+
|
39
|
+
Args:
|
40
|
+
clifford: A Clifford operator.
|
41
|
+
|
42
|
+
Returns:
|
43
|
+
A circuit implementation of the Clifford.
|
44
|
+
|
45
|
+
Raises:
|
46
|
+
QiskitError: if symplectic Gaussian elimination fails.
|
47
|
+
|
48
|
+
References:
|
49
|
+
1. Sergey Bravyi, Shaohan Hu, Dmitri Maslov, Ruslan Shaydulin,
|
50
|
+
*Clifford Circuit Optimization with Templates and Symbolic Pauli Gates*,
|
51
|
+
`arXiv:2105.02291 [quant-ph] <https://arxiv.org/abs/2105.02291>`_
|
52
|
+
"""
|
53
|
+
circuit = QuantumCircuit._from_circuit_data(
|
54
|
+
synth_clifford_greedy_inner(clifford.tableau.astype(bool)),
|
55
|
+
add_regs=True,
|
56
|
+
name=str(clifford),
|
57
|
+
)
|
58
|
+
return circuit
|
@@ -0,0 +1,447 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2023, 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 the Clifford class into layers.
|
14
|
+
"""
|
15
|
+
# pylint: disable=invalid-name
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
from collections.abc import Callable
|
19
|
+
import numpy as np
|
20
|
+
|
21
|
+
from qiskit.circuit import QuantumCircuit
|
22
|
+
from qiskit.exceptions import QiskitError
|
23
|
+
from qiskit.quantum_info import Clifford # pylint: disable=cyclic-import
|
24
|
+
from qiskit.quantum_info.operators.symplectic.clifford_circuits import (
|
25
|
+
_append_h,
|
26
|
+
_append_s,
|
27
|
+
_append_cz,
|
28
|
+
)
|
29
|
+
from qiskit.synthesis.linear import (
|
30
|
+
synth_cnot_count_full_pmh,
|
31
|
+
synth_cnot_depth_line_kms,
|
32
|
+
)
|
33
|
+
from qiskit.synthesis.linear_phase import synth_cz_depth_line_mr, synth_cx_cz_depth_line_my
|
34
|
+
from qiskit.synthesis.linear.linear_matrix_utils import (
|
35
|
+
calc_inverse_matrix,
|
36
|
+
compute_rank,
|
37
|
+
gauss_elimination,
|
38
|
+
gauss_elimination_with_perm,
|
39
|
+
binary_matmul,
|
40
|
+
)
|
41
|
+
|
42
|
+
|
43
|
+
def _default_cx_synth_func(mat):
|
44
|
+
"""
|
45
|
+
Construct the layer of CX gates from a boolean invertible matrix mat.
|
46
|
+
"""
|
47
|
+
CX_circ = synth_cnot_count_full_pmh(mat)
|
48
|
+
CX_circ.name = "CX"
|
49
|
+
|
50
|
+
return CX_circ
|
51
|
+
|
52
|
+
|
53
|
+
def _default_cz_synth_func(symmetric_mat):
|
54
|
+
"""
|
55
|
+
Construct the layer of CZ gates from a symmetric matrix.
|
56
|
+
"""
|
57
|
+
nq = symmetric_mat.shape[0]
|
58
|
+
qc = QuantumCircuit(nq, name="CZ")
|
59
|
+
|
60
|
+
for j in range(nq):
|
61
|
+
for i in range(0, j):
|
62
|
+
if symmetric_mat[i][j]:
|
63
|
+
qc.cz(i, j)
|
64
|
+
return qc
|
65
|
+
|
66
|
+
|
67
|
+
def synth_clifford_layers(
|
68
|
+
cliff: Clifford,
|
69
|
+
cx_synth_func: Callable[[np.ndarray], QuantumCircuit] = _default_cx_synth_func,
|
70
|
+
cz_synth_func: Callable[[np.ndarray], QuantumCircuit] = _default_cz_synth_func,
|
71
|
+
cx_cz_synth_func: Callable[[np.ndarray], QuantumCircuit] | None = None,
|
72
|
+
cz_func_reverse_qubits: bool = False,
|
73
|
+
validate: bool = False,
|
74
|
+
) -> QuantumCircuit:
|
75
|
+
"""Synthesis of a :class:`.Clifford` into layers, it provides a similar
|
76
|
+
decomposition to the synthesis described in Lemma 8 of Bravyi and Maslov [1].
|
77
|
+
|
78
|
+
For example, a 5-qubit Clifford circuit is decomposed into the following layers:
|
79
|
+
|
80
|
+
.. code-block:: text
|
81
|
+
|
82
|
+
┌─────┐┌─────┐┌────────┐┌─────┐┌─────┐┌─────┐┌─────┐┌────────┐
|
83
|
+
q_0: ┤0 ├┤0 ├┤0 ├┤0 ├┤0 ├┤0 ├┤0 ├┤0 ├
|
84
|
+
│ ││ ││ ││ ││ ││ ││ ││ │
|
85
|
+
q_1: ┤1 ├┤1 ├┤1 ├┤1 ├┤1 ├┤1 ├┤1 ├┤1 ├
|
86
|
+
│ ││ ││ ││ ││ ││ ││ ││ │
|
87
|
+
q_2: ┤2 S2 ├┤2 CZ ├┤2 CX_dg ├┤2 H2 ├┤2 S1 ├┤2 CZ ├┤2 H1 ├┤2 Pauli ├
|
88
|
+
│ ││ ││ ││ ││ ││ ││ ││ │
|
89
|
+
q_3: ┤3 ├┤3 ├┤3 ├┤3 ├┤3 ├┤3 ├┤3 ├┤3 ├
|
90
|
+
│ ││ ││ ││ ││ ││ ││ ││ │
|
91
|
+
q_4: ┤4 ├┤4 ├┤4 ├┤4 ├┤4 ├┤4 ├┤4 ├┤4 ├
|
92
|
+
└─────┘└─────┘└────────┘└─────┘└─────┘└─────┘└─────┘└────────┘
|
93
|
+
|
94
|
+
This decomposition is for the default ``cz_synth_func`` and ``cx_synth_func`` functions,
|
95
|
+
with other functions one may see slightly different decomposition.
|
96
|
+
|
97
|
+
Args:
|
98
|
+
cliff: A Clifford operator.
|
99
|
+
cx_synth_func: A function to decompose the CX sub-circuit.
|
100
|
+
It gets as input a boolean invertible matrix, and outputs a :class:`.QuantumCircuit`.
|
101
|
+
cz_synth_func: A function to decompose the CZ sub-circuit.
|
102
|
+
It gets as input a boolean symmetric matrix, and outputs a :class:`.QuantumCircuit`.
|
103
|
+
cx_cz_synth_func (Callable): optional, a function to decompose both sub-circuits CZ and CX.
|
104
|
+
validate (Boolean): if True, validates the synthesis process.
|
105
|
+
cz_func_reverse_qubits (Boolean): True only if ``cz_synth_func`` is
|
106
|
+
:func:`.synth_cz_depth_line_mr`, since this function returns a circuit that reverts
|
107
|
+
the order of qubits.
|
108
|
+
|
109
|
+
Returns:
|
110
|
+
A circuit implementation of the Clifford.
|
111
|
+
|
112
|
+
References:
|
113
|
+
1. S. Bravyi, D. Maslov, *Hadamard-free circuits expose the
|
114
|
+
structure of the Clifford group*,
|
115
|
+
`arXiv:2003.09412 [quant-ph] <https://arxiv.org/abs/2003.09412>`_
|
116
|
+
"""
|
117
|
+
|
118
|
+
num_qubits = cliff.num_qubits
|
119
|
+
if cz_func_reverse_qubits:
|
120
|
+
cliff0 = _reverse_clifford(cliff)
|
121
|
+
else:
|
122
|
+
cliff0 = cliff
|
123
|
+
|
124
|
+
qubit_list = list(range(num_qubits))
|
125
|
+
layeredCircuit = QuantumCircuit(num_qubits)
|
126
|
+
|
127
|
+
H1_circ, cliff1 = _create_graph_state(cliff0, validate=validate)
|
128
|
+
|
129
|
+
H2_circ, CZ1_circ, S1_circ, cliff2 = _decompose_graph_state(
|
130
|
+
cliff1, validate=validate, cz_synth_func=cz_synth_func
|
131
|
+
)
|
132
|
+
|
133
|
+
S2_circ, CZ2_circ, CX_circ = _decompose_hadamard_free(
|
134
|
+
cliff2.adjoint(),
|
135
|
+
validate=validate,
|
136
|
+
cz_synth_func=cz_synth_func,
|
137
|
+
cx_synth_func=cx_synth_func,
|
138
|
+
cx_cz_synth_func=cx_cz_synth_func,
|
139
|
+
cz_func_reverse_qubits=cz_func_reverse_qubits,
|
140
|
+
)
|
141
|
+
|
142
|
+
layeredCircuit.append(S2_circ, qubit_list, copy=False)
|
143
|
+
|
144
|
+
if cx_cz_synth_func is None:
|
145
|
+
layeredCircuit.append(CZ2_circ, qubit_list, copy=False)
|
146
|
+
|
147
|
+
CXinv = CX_circ.copy().inverse()
|
148
|
+
layeredCircuit.append(CXinv, qubit_list, copy=False)
|
149
|
+
|
150
|
+
else:
|
151
|
+
# note that CZ2_circ is None and built into the CX_circ when
|
152
|
+
# cx_cz_synth_func is not None
|
153
|
+
layeredCircuit.append(CX_circ, qubit_list, copy=False)
|
154
|
+
|
155
|
+
layeredCircuit.append(H2_circ, qubit_list, copy=False)
|
156
|
+
layeredCircuit.append(S1_circ, qubit_list, copy=False)
|
157
|
+
layeredCircuit.append(CZ1_circ, qubit_list, copy=False)
|
158
|
+
|
159
|
+
if cz_func_reverse_qubits:
|
160
|
+
H1_circ = H1_circ.reverse_bits()
|
161
|
+
layeredCircuit.append(H1_circ, qubit_list, copy=False)
|
162
|
+
|
163
|
+
# Add Pauli layer to fix the Clifford phase signs
|
164
|
+
|
165
|
+
clifford_target = Clifford(layeredCircuit)
|
166
|
+
pauli_circ = _calc_pauli_diff(cliff, clifford_target)
|
167
|
+
layeredCircuit.append(pauli_circ, qubit_list, copy=False)
|
168
|
+
|
169
|
+
return layeredCircuit
|
170
|
+
|
171
|
+
|
172
|
+
def _reverse_clifford(cliff):
|
173
|
+
"""Reverse qubit order of a Clifford cliff"""
|
174
|
+
cliff_cpy = cliff.copy()
|
175
|
+
cliff_cpy.stab_z = np.flip(cliff.stab_z, axis=1)
|
176
|
+
cliff_cpy.destab_z = np.flip(cliff.destab_z, axis=1)
|
177
|
+
cliff_cpy.stab_x = np.flip(cliff.stab_x, axis=1)
|
178
|
+
cliff_cpy.destab_x = np.flip(cliff.destab_x, axis=1)
|
179
|
+
return cliff_cpy
|
180
|
+
|
181
|
+
|
182
|
+
def _create_graph_state(cliff, validate=False):
|
183
|
+
"""Given a Clifford cliff (denoted by U) that induces a stabilizer state U |0>,
|
184
|
+
apply a layer H1 of Hadamard gates to a subset of the qubits to make H1 U |0> into a graph state,
|
185
|
+
namely to make cliff.stab_x matrix have full rank.
|
186
|
+
Returns the QuantumCircuit H1_circ that includes the Hadamard gates and the updated Clifford
|
187
|
+
that induces the graph state.
|
188
|
+
The algorithm is based on Lemma 6 in [2].
|
189
|
+
|
190
|
+
Args:
|
191
|
+
cliff (Clifford): a Clifford operator.
|
192
|
+
validate (Boolean): if True, validates the synthesis process.
|
193
|
+
|
194
|
+
Returns:
|
195
|
+
H1_circ: a circuit containing a layer of Hadamard gates.
|
196
|
+
cliffh: cliffh.stab_x has full rank.
|
197
|
+
|
198
|
+
Raises:
|
199
|
+
QiskitError: if there are errors in the Gauss elimination process.
|
200
|
+
|
201
|
+
References:
|
202
|
+
2. S. Aaronson, D. Gottesman, *Improved Simulation of Stabilizer Circuits*,
|
203
|
+
Phys. Rev. A 70, 052328 (2004).
|
204
|
+
`arXiv:quant-ph/0406196 <https://arxiv.org/abs/quant-ph/0406196>`_
|
205
|
+
"""
|
206
|
+
|
207
|
+
num_qubits = cliff.num_qubits
|
208
|
+
rank = compute_rank(np.asarray(cliff.stab_x, dtype=bool))
|
209
|
+
H1_circ = QuantumCircuit(num_qubits, name="H1")
|
210
|
+
cliffh = cliff.copy()
|
211
|
+
|
212
|
+
if rank < num_qubits:
|
213
|
+
stab = cliff.stab[:, :-1]
|
214
|
+
stab = stab.astype(bool, copy=True)
|
215
|
+
gauss_elimination(stab, num_qubits)
|
216
|
+
|
217
|
+
Cmat = stab[rank:num_qubits, num_qubits:]
|
218
|
+
Cmat = np.transpose(Cmat)
|
219
|
+
perm = gauss_elimination_with_perm(Cmat)
|
220
|
+
perm = perm[0 : num_qubits - rank]
|
221
|
+
|
222
|
+
# validate that the output matrix has the same rank
|
223
|
+
if validate:
|
224
|
+
if compute_rank(Cmat) != num_qubits - rank:
|
225
|
+
raise QiskitError("The matrix Cmat after Gauss elimination has wrong rank.")
|
226
|
+
if compute_rank(stab[:, 0:num_qubits]) != rank:
|
227
|
+
raise QiskitError("The matrix after Gauss elimination has wrong rank.")
|
228
|
+
# validate that we have a num_qubits - rank zero rows
|
229
|
+
for i in range(rank, num_qubits):
|
230
|
+
if stab[i, 0:num_qubits].any():
|
231
|
+
raise QiskitError(
|
232
|
+
"After Gauss elimination, the final num_qubits - rank rows"
|
233
|
+
"contain non-zero elements"
|
234
|
+
)
|
235
|
+
|
236
|
+
for qubit in perm:
|
237
|
+
H1_circ.h(qubit)
|
238
|
+
_append_h(cliffh, qubit)
|
239
|
+
|
240
|
+
# validate that a layer of Hadamard gates and then appending cliff, provides a graph state.
|
241
|
+
if validate:
|
242
|
+
stabh = (cliffh.stab_x).astype(bool, copy=False)
|
243
|
+
if compute_rank(stabh) != num_qubits:
|
244
|
+
raise QiskitError("The state is not a graph state.")
|
245
|
+
|
246
|
+
return H1_circ, cliffh
|
247
|
+
|
248
|
+
|
249
|
+
def _decompose_graph_state(cliff, validate, cz_synth_func):
|
250
|
+
"""Assumes that a stabilizer state of the Clifford cliff (denoted by U) corresponds to a graph state.
|
251
|
+
Decompose it into the layers S1 - CZ1 - H2, such that:
|
252
|
+
S1 CZ1 H2 |0> = U |0>,
|
253
|
+
where S1_circ is a circuit that can contain only S gates,
|
254
|
+
CZ1_circ is a circuit that can contain only CZ gates, and
|
255
|
+
H2_circ is a circuit that can contain H gates on all qubits.
|
256
|
+
|
257
|
+
Args:
|
258
|
+
cliff (Clifford): a Clifford operator corresponding to a graph state, cliff.stab_x has full rank.
|
259
|
+
validate (Boolean): if True, validates the synthesis process.
|
260
|
+
cz_synth_func (Callable): a function to decompose the CZ sub-circuit.
|
261
|
+
|
262
|
+
Returns:
|
263
|
+
S1_circ: a circuit that can contain only S gates.
|
264
|
+
CZ1_circ: a circuit that can contain only CZ gates.
|
265
|
+
H2_circ: a circuit containing a layer of Hadamard gates.
|
266
|
+
cliff_cpy: a Hadamard-free Clifford.
|
267
|
+
|
268
|
+
Raises:
|
269
|
+
QiskitError: if cliff does not induce a graph state.
|
270
|
+
"""
|
271
|
+
|
272
|
+
num_qubits = cliff.num_qubits
|
273
|
+
rank = compute_rank(np.asarray(cliff.stab_x, dtype=bool))
|
274
|
+
cliff_cpy = cliff.copy()
|
275
|
+
if rank < num_qubits:
|
276
|
+
raise QiskitError("The stabilizer state is not a graph state.")
|
277
|
+
|
278
|
+
S1_circ = QuantumCircuit(num_qubits, name="S1")
|
279
|
+
H2_circ = QuantumCircuit(num_qubits, name="H2")
|
280
|
+
|
281
|
+
stabx = cliff.stab_x
|
282
|
+
stabz = cliff.stab_z
|
283
|
+
stabx_inv = calc_inverse_matrix(stabx, validate)
|
284
|
+
stabz_update = binary_matmul(stabx_inv, stabz)
|
285
|
+
|
286
|
+
# Assert that stabz_update is a symmetric matrix.
|
287
|
+
if validate:
|
288
|
+
if (stabz_update != stabz_update.T).any():
|
289
|
+
raise QiskitError(
|
290
|
+
"The multiplication of stabx_inv and stab_z is not a symmetric matrix."
|
291
|
+
)
|
292
|
+
|
293
|
+
CZ1_circ = cz_synth_func(stabz_update)
|
294
|
+
|
295
|
+
for j in range(num_qubits):
|
296
|
+
for i in range(0, j):
|
297
|
+
if stabz_update[i][j]:
|
298
|
+
_append_cz(cliff_cpy, i, j)
|
299
|
+
|
300
|
+
for i in range(0, num_qubits):
|
301
|
+
if stabz_update[i][i]:
|
302
|
+
S1_circ.s(i)
|
303
|
+
_append_s(cliff_cpy, i)
|
304
|
+
|
305
|
+
for qubit in range(num_qubits):
|
306
|
+
H2_circ.h(qubit)
|
307
|
+
_append_h(cliff_cpy, qubit)
|
308
|
+
|
309
|
+
return H2_circ, CZ1_circ, S1_circ, cliff_cpy
|
310
|
+
|
311
|
+
|
312
|
+
def _decompose_hadamard_free(
|
313
|
+
cliff, validate, cz_synth_func, cx_synth_func, cx_cz_synth_func, cz_func_reverse_qubits
|
314
|
+
):
|
315
|
+
"""Assumes that the Clifford cliff is Hadamard free.
|
316
|
+
Decompose it into the layers S2 - CZ2 - CX, where
|
317
|
+
S2_circ is a circuit that can contain only S gates,
|
318
|
+
CZ2_circ is a circuit that can contain only CZ gates, and
|
319
|
+
CX_circ is a circuit that can contain CX gates.
|
320
|
+
|
321
|
+
Args:
|
322
|
+
cliff (Clifford): a Hadamard-free clifford operator.
|
323
|
+
validate (Boolean): if True, validates the synthesis process.
|
324
|
+
cz_synth_func (Callable): a function to decompose the CZ sub-circuit.
|
325
|
+
cx_synth_func (Callable): a function to decompose the CX sub-circuit.
|
326
|
+
cx_cz_synth_func (Callable): optional, a function to decompose both sub-circuits CZ and CX.
|
327
|
+
cz_func_reverse_qubits (Boolean): True only if cz_synth_func is synth_cz_depth_line_mr.
|
328
|
+
|
329
|
+
Returns:
|
330
|
+
S2_circ: a circuit that can contain only S gates.
|
331
|
+
CZ2_circ: a circuit that can contain only CZ gates.
|
332
|
+
CX_circ: a circuit that can contain only CX gates.
|
333
|
+
|
334
|
+
Raises:
|
335
|
+
QiskitError: if cliff is not Hadamard free.
|
336
|
+
"""
|
337
|
+
|
338
|
+
num_qubits = cliff.num_qubits
|
339
|
+
destabx = cliff.destab_x
|
340
|
+
destabz = cliff.destab_z
|
341
|
+
stabx = cliff.stab_x
|
342
|
+
|
343
|
+
if not (stabx == np.zeros((num_qubits, num_qubits))).all():
|
344
|
+
raise QiskitError("The given Clifford is not Hadamard-free.")
|
345
|
+
|
346
|
+
destabz_update = binary_matmul(calc_inverse_matrix(destabx), destabz)
|
347
|
+
# Assert that destabz_update is a symmetric matrix.
|
348
|
+
if validate:
|
349
|
+
if (destabz_update != destabz_update.T).any():
|
350
|
+
raise QiskitError(
|
351
|
+
"The multiplication of the inverse of destabx and"
|
352
|
+
"destabz is not a symmetric matrix."
|
353
|
+
)
|
354
|
+
|
355
|
+
S2_circ = QuantumCircuit(num_qubits, name="S2")
|
356
|
+
for i in range(0, num_qubits):
|
357
|
+
if destabz_update[i][i]:
|
358
|
+
S2_circ.s(i)
|
359
|
+
|
360
|
+
if cx_cz_synth_func is not None:
|
361
|
+
# The cx_cz_synth_func takes as input Mx/Mz representing a CX/CZ circuit
|
362
|
+
# and returns the circuit -CZ-CX- implementing them both
|
363
|
+
for i in range(num_qubits):
|
364
|
+
destabz_update[i][i] = 0
|
365
|
+
|
366
|
+
mat_z = destabz_update
|
367
|
+
mat_x = calc_inverse_matrix(destabx.transpose())
|
368
|
+
|
369
|
+
CXCZ_circ = cx_cz_synth_func(mat_x, mat_z)
|
370
|
+
|
371
|
+
return S2_circ, QuantumCircuit(num_qubits), CXCZ_circ
|
372
|
+
|
373
|
+
CZ2_circ = cz_synth_func(destabz_update)
|
374
|
+
|
375
|
+
mat = destabx.transpose()
|
376
|
+
if cz_func_reverse_qubits:
|
377
|
+
mat = np.flip(mat, axis=0)
|
378
|
+
CX_circ = cx_synth_func(mat)
|
379
|
+
|
380
|
+
return S2_circ, CZ2_circ, CX_circ
|
381
|
+
|
382
|
+
|
383
|
+
def _calc_pauli_diff(cliff, cliff_target):
|
384
|
+
"""Given two Cliffords that differ by a Pauli, we find this Pauli."""
|
385
|
+
|
386
|
+
num_qubits = cliff.num_qubits
|
387
|
+
if cliff.num_qubits != cliff_target.num_qubits:
|
388
|
+
raise QiskitError("num_qubits is not the same for the original clifford and the target.")
|
389
|
+
|
390
|
+
# Compute the phase difference between the two Cliffords
|
391
|
+
phase = [cliff.phase[k] ^ cliff_target.phase[k] for k in range(2 * num_qubits)]
|
392
|
+
phase = np.array(phase, dtype=int)
|
393
|
+
|
394
|
+
# compute inverse of our symplectic matrix
|
395
|
+
A = cliff.symplectic_matrix
|
396
|
+
Ainv = calc_inverse_matrix(A)
|
397
|
+
|
398
|
+
# By carefully writing how X, Y, Z gates affect each qubit, all we need to compute
|
399
|
+
# is A^{-1} * (phase)
|
400
|
+
C = np.matmul(Ainv, phase) % 2
|
401
|
+
|
402
|
+
# Create the Pauli
|
403
|
+
pauli_circ = QuantumCircuit(num_qubits, name="Pauli")
|
404
|
+
for k in range(num_qubits):
|
405
|
+
destab = C[k]
|
406
|
+
stab = C[k + num_qubits]
|
407
|
+
if stab and destab:
|
408
|
+
pauli_circ.y(k)
|
409
|
+
elif stab:
|
410
|
+
pauli_circ.x(k)
|
411
|
+
elif destab:
|
412
|
+
pauli_circ.z(k)
|
413
|
+
|
414
|
+
return pauli_circ
|
415
|
+
|
416
|
+
|
417
|
+
def synth_clifford_depth_lnn(cliff):
|
418
|
+
"""Synthesis of a :class:`.Clifford` into layers for linear-nearest neighbor connectivity.
|
419
|
+
|
420
|
+
The depth of the synthesized n-qubit circuit is bounded by :math:`7n+2`, which is not optimal.
|
421
|
+
It should be replaced by a better algorithm that provides depth bounded by :math:`7n-4` [3].
|
422
|
+
|
423
|
+
Args:
|
424
|
+
cliff (Clifford): a Clifford operator.
|
425
|
+
|
426
|
+
Returns:
|
427
|
+
QuantumCircuit: a circuit implementation of the Clifford.
|
428
|
+
|
429
|
+
References:
|
430
|
+
1. S. Bravyi, D. Maslov, *Hadamard-free circuits expose the
|
431
|
+
structure of the Clifford group*,
|
432
|
+
`arXiv:2003.09412 [quant-ph] <https://arxiv.org/abs/2003.09412>`_
|
433
|
+
2. Dmitri Maslov, Martin Roetteler,
|
434
|
+
*Shorter stabilizer circuits via Bruhat decomposition and quantum circuit transformations*,
|
435
|
+
`arXiv:1705.09176 <https://arxiv.org/abs/1705.09176>`_.
|
436
|
+
3. Dmitri Maslov, Willers Yang, *CNOT circuits need little help to implement arbitrary
|
437
|
+
Hadamard-free Clifford transformations they generate*,
|
438
|
+
`arXiv:2210.16195 <https://arxiv.org/abs/2210.16195>`_.
|
439
|
+
"""
|
440
|
+
circ = synth_clifford_layers(
|
441
|
+
cliff,
|
442
|
+
cx_synth_func=synth_cnot_depth_line_kms,
|
443
|
+
cz_synth_func=synth_cz_depth_line_mr,
|
444
|
+
cx_cz_synth_func=synth_cx_cz_depth_line_my,
|
445
|
+
cz_func_reverse_qubits=True,
|
446
|
+
)
|
447
|
+
return circ
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2018.
|
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 cnot-dihedral circuit synthesis."""
|
14
|
+
|
15
|
+
from .cnotdihedral_decompose_full import synth_cnotdihedral_full
|
16
|
+
from .cnotdihedral_decompose_two_qubits import synth_cnotdihedral_two_qubits
|
17
|
+
from .cnotdihedral_decompose_general import synth_cnotdihedral_general
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2019, 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 the CNOTDihedral class for all-to-all connectivity.
|
14
|
+
"""
|
15
|
+
|
16
|
+
from qiskit.circuit import QuantumCircuit
|
17
|
+
from qiskit.quantum_info import CNOTDihedral
|
18
|
+
|
19
|
+
from qiskit.synthesis.cnotdihedral.cnotdihedral_decompose_two_qubits import (
|
20
|
+
synth_cnotdihedral_two_qubits,
|
21
|
+
)
|
22
|
+
from qiskit.synthesis.cnotdihedral.cnotdihedral_decompose_general import synth_cnotdihedral_general
|
23
|
+
|
24
|
+
|
25
|
+
def synth_cnotdihedral_full(elem: CNOTDihedral) -> QuantumCircuit:
|
26
|
+
r"""Decompose a :class:`.CNOTDihedral` element into a :class:`.QuantumCircuit`.
|
27
|
+
|
28
|
+
For :math:`N \leq 2` qubits this is based on optimal CX-cost decomposition from reference [1].
|
29
|
+
For :math:`N > 2` qubits this is done using the general non-optimal compilation
|
30
|
+
routine from reference [2].
|
31
|
+
|
32
|
+
Args:
|
33
|
+
elem: A :class:`.CNOTDihedral` element.
|
34
|
+
|
35
|
+
Returns:
|
36
|
+
A circuit implementation of the :class:`.CNOTDihedral` element.
|
37
|
+
|
38
|
+
References:
|
39
|
+
1. Shelly Garion and Andrew W. Cross, *Synthesis of CNOT-Dihedral circuits
|
40
|
+
with optimal number of two qubit gates*, `Quantum 4(369), 2020
|
41
|
+
<https://quantum-journal.org/papers/q-2020-12-07-369/>`_
|
42
|
+
2. Andrew W. Cross, Easwar Magesan, Lev S. Bishop, John A. Smolin and Jay M. Gambetta,
|
43
|
+
*Scalable randomized benchmarking of non-Clifford gates*,
|
44
|
+
npj Quantum Inf 2, 16012 (2016).
|
45
|
+
"""
|
46
|
+
|
47
|
+
num_qubits = elem.num_qubits
|
48
|
+
|
49
|
+
if num_qubits < 3:
|
50
|
+
return synth_cnotdihedral_two_qubits(elem)
|
51
|
+
|
52
|
+
return synth_cnotdihedral_general(elem)
|