qiskit 2.0.3__cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -0
- qiskit/__init__.py +141 -0
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +73 -0
- qiskit/circuit/__init__.py +1343 -0
- qiskit/circuit/_add_control.py +312 -0
- qiskit/circuit/_classical_resource_map.py +150 -0
- qiskit/circuit/_standard_gates_commutations.py +3849 -0
- qiskit/circuit/_utils.py +167 -0
- qiskit/circuit/annotated_operation.py +279 -0
- qiskit/circuit/barrier.py +46 -0
- qiskit/circuit/classical/__init__.py +41 -0
- qiskit/circuit/classical/expr/__init__.py +266 -0
- qiskit/circuit/classical/expr/constructors.py +764 -0
- qiskit/circuit/classical/expr/expr.py +498 -0
- qiskit/circuit/classical/expr/visitors.py +375 -0
- qiskit/circuit/classical/types/__init__.py +113 -0
- qiskit/circuit/classical/types/ordering.py +229 -0
- qiskit/circuit/classical/types/types.py +153 -0
- qiskit/circuit/commutation_checker.py +133 -0
- qiskit/circuit/commutation_library.py +20 -0
- qiskit/circuit/controlflow/__init__.py +59 -0
- qiskit/circuit/controlflow/_builder_utils.py +211 -0
- qiskit/circuit/controlflow/box.py +163 -0
- qiskit/circuit/controlflow/break_loop.py +56 -0
- qiskit/circuit/controlflow/builder.py +791 -0
- qiskit/circuit/controlflow/continue_loop.py +56 -0
- qiskit/circuit/controlflow/control_flow.py +94 -0
- qiskit/circuit/controlflow/for_loop.py +218 -0
- qiskit/circuit/controlflow/if_else.py +498 -0
- qiskit/circuit/controlflow/switch_case.py +411 -0
- qiskit/circuit/controlflow/while_loop.py +166 -0
- qiskit/circuit/controlledgate.py +274 -0
- qiskit/circuit/delay.py +157 -0
- qiskit/circuit/duration.py +80 -0
- qiskit/circuit/equivalence.py +94 -0
- qiskit/circuit/equivalence_library.py +18 -0
- qiskit/circuit/exceptions.py +19 -0
- qiskit/circuit/gate.py +261 -0
- qiskit/circuit/instruction.py +564 -0
- qiskit/circuit/instructionset.py +132 -0
- qiskit/circuit/library/__init__.py +984 -0
- qiskit/circuit/library/arithmetic/__init__.py +40 -0
- qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +235 -0
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +131 -0
- qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
- qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -0
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +201 -0
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +502 -0
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +387 -0
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +493 -0
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
- qiskit/circuit/library/arithmetic/quadratic_form.py +364 -0
- qiskit/circuit/library/arithmetic/weighted_adder.py +409 -0
- qiskit/circuit/library/basis_change/__init__.py +15 -0
- qiskit/circuit/library/basis_change/qft.py +316 -0
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +316 -0
- qiskit/circuit/library/boolean_logic/__init__.py +18 -0
- qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
- qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
- qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
- qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -0
- qiskit/circuit/library/data_preparation/__init__.py +57 -0
- qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
- qiskit/circuit/library/data_preparation/initializer.py +107 -0
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
- qiskit/circuit/library/fourier_checking.py +160 -0
- qiskit/circuit/library/generalized_gates/__init__.py +30 -0
- qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
- qiskit/circuit/library/generalized_gates/gms.py +175 -0
- qiskit/circuit/library/generalized_gates/gr.py +219 -0
- qiskit/circuit/library/generalized_gates/isometry.py +370 -0
- qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
- qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
- qiskit/circuit/library/generalized_gates/pauli.py +84 -0
- qiskit/circuit/library/generalized_gates/permutation.py +198 -0
- qiskit/circuit/library/generalized_gates/rv.py +96 -0
- qiskit/circuit/library/generalized_gates/uc.py +303 -0
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
- qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
- qiskit/circuit/library/generalized_gates/ucry.py +32 -0
- qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
- qiskit/circuit/library/generalized_gates/unitary.py +217 -0
- qiskit/circuit/library/graph_state.py +172 -0
- qiskit/circuit/library/grover_operator.py +583 -0
- qiskit/circuit/library/hamiltonian_gate.py +142 -0
- qiskit/circuit/library/hidden_linear_function.py +163 -0
- qiskit/circuit/library/iqp.py +180 -0
- qiskit/circuit/library/n_local/__init__.py +45 -0
- qiskit/circuit/library/n_local/efficient_su2.py +282 -0
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +303 -0
- qiskit/circuit/library/n_local/n_local.py +1477 -0
- qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
- qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
- qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
- qiskit/circuit/library/n_local/two_local.py +289 -0
- qiskit/circuit/library/overlap.py +183 -0
- qiskit/circuit/library/pauli_evolution.py +201 -0
- qiskit/circuit/library/phase_estimation.py +177 -0
- qiskit/circuit/library/phase_oracle.py +239 -0
- qiskit/circuit/library/quantum_volume.py +180 -0
- qiskit/circuit/library/standard_gates/__init__.py +141 -0
- qiskit/circuit/library/standard_gates/dcx.py +77 -0
- qiskit/circuit/library/standard_gates/ecr.py +129 -0
- qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
- qiskit/circuit/library/standard_gates/global_phase.py +84 -0
- qiskit/circuit/library/standard_gates/h.py +253 -0
- qiskit/circuit/library/standard_gates/i.py +76 -0
- qiskit/circuit/library/standard_gates/iswap.py +133 -0
- qiskit/circuit/library/standard_gates/p.py +422 -0
- qiskit/circuit/library/standard_gates/r.py +114 -0
- qiskit/circuit/library/standard_gates/rx.py +293 -0
- qiskit/circuit/library/standard_gates/rxx.py +180 -0
- qiskit/circuit/library/standard_gates/ry.py +286 -0
- qiskit/circuit/library/standard_gates/ryy.py +180 -0
- qiskit/circuit/library/standard_gates/rz.py +307 -0
- qiskit/circuit/library/standard_gates/rzx.py +226 -0
- qiskit/circuit/library/standard_gates/rzz.py +193 -0
- qiskit/circuit/library/standard_gates/s.py +419 -0
- qiskit/circuit/library/standard_gates/swap.py +281 -0
- qiskit/circuit/library/standard_gates/sx.py +310 -0
- qiskit/circuit/library/standard_gates/t.py +178 -0
- qiskit/circuit/library/standard_gates/u.py +395 -0
- qiskit/circuit/library/standard_gates/u1.py +490 -0
- qiskit/circuit/library/standard_gates/u2.py +145 -0
- qiskit/circuit/library/standard_gates/u3.py +428 -0
- qiskit/circuit/library/standard_gates/x.py +1481 -0
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +202 -0
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +236 -0
- qiskit/circuit/library/standard_gates/y.py +257 -0
- qiskit/circuit/library/standard_gates/z.py +338 -0
- qiskit/circuit/library/templates/__init__.py +92 -0
- qiskit/circuit/library/templates/clifford/__init__.py +33 -0
- qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
- qiskit/circuit/library/templates/nct/__init__.py +67 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
- qiskit/circuit/library/templates/rzx/__init__.py +25 -0
- qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
- qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
- qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
- qiskit/circuit/measure.py +53 -0
- qiskit/circuit/operation.py +68 -0
- qiskit/circuit/parameter.py +179 -0
- qiskit/circuit/parameterexpression.py +703 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +140 -0
- qiskit/circuit/quantumcircuit.py +7540 -0
- qiskit/circuit/quantumcircuitdata.py +136 -0
- qiskit/circuit/random/__init__.py +15 -0
- qiskit/circuit/random/utils.py +366 -0
- qiskit/circuit/reset.py +37 -0
- qiskit/circuit/singleton.py +600 -0
- qiskit/circuit/store.py +89 -0
- qiskit/circuit/tools/__init__.py +16 -0
- qiskit/circuit/tools/pi_check.py +193 -0
- qiskit/circuit/twirling.py +145 -0
- qiskit/compiler/__init__.py +27 -0
- qiskit/compiler/transpiler.py +375 -0
- qiskit/converters/__init__.py +74 -0
- qiskit/converters/circuit_to_dag.py +80 -0
- qiskit/converters/circuit_to_dagdependency.py +49 -0
- qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
- qiskit/converters/circuit_to_gate.py +107 -0
- qiskit/converters/circuit_to_instruction.py +142 -0
- qiskit/converters/dag_to_circuit.py +79 -0
- qiskit/converters/dag_to_dagdependency.py +54 -0
- qiskit/converters/dag_to_dagdependency_v2.py +43 -0
- qiskit/converters/dagdependency_to_circuit.py +40 -0
- qiskit/converters/dagdependency_to_dag.py +48 -0
- qiskit/dagcircuit/__init__.py +55 -0
- qiskit/dagcircuit/collect_blocks.py +407 -0
- qiskit/dagcircuit/dagcircuit.py +24 -0
- qiskit/dagcircuit/dagdependency.py +612 -0
- qiskit/dagcircuit/dagdependency_v2.py +566 -0
- qiskit/dagcircuit/dagdepnode.py +160 -0
- qiskit/dagcircuit/dagnode.py +188 -0
- qiskit/dagcircuit/exceptions.py +42 -0
- qiskit/exceptions.py +153 -0
- qiskit/passmanager/__init__.py +258 -0
- qiskit/passmanager/base_tasks.py +230 -0
- qiskit/passmanager/compilation_status.py +74 -0
- qiskit/passmanager/exceptions.py +19 -0
- qiskit/passmanager/flow_controllers.py +116 -0
- qiskit/passmanager/passmanager.py +353 -0
- qiskit/primitives/__init__.py +490 -0
- qiskit/primitives/backend_estimator_v2.py +530 -0
- qiskit/primitives/backend_sampler_v2.py +339 -0
- qiskit/primitives/base/__init__.py +20 -0
- qiskit/primitives/base/base_estimator.py +247 -0
- qiskit/primitives/base/base_primitive_job.py +78 -0
- qiskit/primitives/base/base_primitive_v1.py +45 -0
- qiskit/primitives/base/base_result_v1.py +65 -0
- qiskit/primitives/base/base_sampler.py +196 -0
- qiskit/primitives/base/estimator_result_v1.py +46 -0
- qiskit/primitives/base/sampler_result_v1.py +45 -0
- qiskit/primitives/base/validation_v1.py +250 -0
- qiskit/primitives/containers/__init__.py +26 -0
- qiskit/primitives/containers/bindings_array.py +391 -0
- qiskit/primitives/containers/bit_array.py +764 -0
- qiskit/primitives/containers/data_bin.py +175 -0
- qiskit/primitives/containers/estimator_pub.py +222 -0
- qiskit/primitives/containers/object_array.py +94 -0
- qiskit/primitives/containers/observables_array.py +296 -0
- qiskit/primitives/containers/primitive_result.py +53 -0
- qiskit/primitives/containers/pub_result.py +51 -0
- qiskit/primitives/containers/sampler_pub.py +193 -0
- qiskit/primitives/containers/sampler_pub_result.py +74 -0
- qiskit/primitives/containers/shape.py +129 -0
- qiskit/primitives/primitive_job.py +81 -0
- qiskit/primitives/statevector_estimator.py +175 -0
- qiskit/primitives/statevector_sampler.py +290 -0
- qiskit/primitives/utils.py +72 -0
- qiskit/providers/__init__.py +677 -0
- qiskit/providers/backend.py +364 -0
- qiskit/providers/basic_provider/__init__.py +47 -0
- qiskit/providers/basic_provider/basic_provider.py +121 -0
- qiskit/providers/basic_provider/basic_provider_job.py +65 -0
- qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
- qiskit/providers/basic_provider/basic_simulator.py +693 -0
- qiskit/providers/basic_provider/exceptions.py +30 -0
- qiskit/providers/exceptions.py +33 -0
- qiskit/providers/fake_provider/__init__.py +69 -0
- qiskit/providers/fake_provider/generic_backend_v2.py +374 -0
- qiskit/providers/fake_provider/utils/__init__.py +15 -0
- qiskit/providers/job.py +147 -0
- qiskit/providers/jobstatus.py +30 -0
- qiskit/providers/options.py +273 -0
- qiskit/providers/providerutils.py +110 -0
- qiskit/qasm/libs/dummy/stdgates.inc +75 -0
- qiskit/qasm/libs/qelib1.inc +266 -0
- qiskit/qasm/libs/stdgates.inc +82 -0
- qiskit/qasm2/__init__.py +669 -0
- qiskit/qasm2/exceptions.py +27 -0
- qiskit/qasm2/export.py +364 -0
- qiskit/qasm2/parse.py +438 -0
- qiskit/qasm3/__init__.py +372 -0
- qiskit/qasm3/ast.py +782 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1340 -0
- qiskit/qasm3/printer.py +608 -0
- qiskit/qpy/__init__.py +1965 -0
- qiskit/qpy/binary_io/__init__.py +35 -0
- qiskit/qpy/binary_io/circuits.py +1455 -0
- qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
- qiskit/qpy/binary_io/schedules.py +308 -0
- qiskit/qpy/binary_io/value.py +1165 -0
- qiskit/qpy/common.py +353 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +442 -0
- qiskit/qpy/interface.py +344 -0
- qiskit/qpy/type_keys.py +409 -0
- qiskit/quantum_info/__init__.py +162 -0
- qiskit/quantum_info/analysis/__init__.py +17 -0
- qiskit/quantum_info/analysis/average.py +47 -0
- qiskit/quantum_info/analysis/distance.py +104 -0
- qiskit/quantum_info/analysis/make_observable.py +44 -0
- qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
- qiskit/quantum_info/operators/__init__.py +28 -0
- qiskit/quantum_info/operators/base_operator.py +145 -0
- qiskit/quantum_info/operators/channel/__init__.py +29 -0
- qiskit/quantum_info/operators/channel/chi.py +191 -0
- qiskit/quantum_info/operators/channel/choi.py +218 -0
- qiskit/quantum_info/operators/channel/kraus.py +337 -0
- qiskit/quantum_info/operators/channel/ptm.py +204 -0
- qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
- qiskit/quantum_info/operators/channel/stinespring.py +296 -0
- qiskit/quantum_info/operators/channel/superop.py +373 -0
- qiskit/quantum_info/operators/channel/transformations.py +490 -0
- qiskit/quantum_info/operators/custom_iterator.py +48 -0
- qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
- qiskit/quantum_info/operators/dihedral/dihedral.py +511 -0
- qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
- qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
- qiskit/quantum_info/operators/dihedral/random.py +64 -0
- qiskit/quantum_info/operators/linear_op.py +25 -0
- qiskit/quantum_info/operators/measures.py +418 -0
- qiskit/quantum_info/operators/mixins/__init__.py +52 -0
- qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
- qiskit/quantum_info/operators/mixins/group.py +171 -0
- qiskit/quantum_info/operators/mixins/linear.py +84 -0
- qiskit/quantum_info/operators/mixins/multiply.py +62 -0
- qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
- qiskit/quantum_info/operators/op_shape.py +525 -0
- qiskit/quantum_info/operators/operator.py +869 -0
- qiskit/quantum_info/operators/operator_utils.py +76 -0
- qiskit/quantum_info/operators/predicates.py +183 -0
- qiskit/quantum_info/operators/random.py +154 -0
- qiskit/quantum_info/operators/scalar_op.py +254 -0
- qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
- qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
- qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
- qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -0
- qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
- qiskit/quantum_info/operators/symplectic/random.py +117 -0
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1239 -0
- qiskit/quantum_info/operators/utils/__init__.py +20 -0
- qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
- qiskit/quantum_info/operators/utils/commutator.py +36 -0
- qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
- qiskit/quantum_info/quaternion.py +156 -0
- qiskit/quantum_info/random.py +26 -0
- qiskit/quantum_info/states/__init__.py +28 -0
- qiskit/quantum_info/states/densitymatrix.py +857 -0
- qiskit/quantum_info/states/measures.py +288 -0
- qiskit/quantum_info/states/quantum_state.py +503 -0
- qiskit/quantum_info/states/random.py +157 -0
- qiskit/quantum_info/states/stabilizerstate.py +805 -0
- qiskit/quantum_info/states/statevector.py +977 -0
- qiskit/quantum_info/states/utils.py +247 -0
- qiskit/result/__init__.py +61 -0
- qiskit/result/counts.py +189 -0
- qiskit/result/distributions/__init__.py +17 -0
- qiskit/result/distributions/probability.py +100 -0
- qiskit/result/distributions/quasi.py +154 -0
- qiskit/result/exceptions.py +40 -0
- qiskit/result/models.py +241 -0
- qiskit/result/postprocess.py +239 -0
- qiskit/result/result.py +385 -0
- qiskit/result/sampled_expval.py +74 -0
- qiskit/result/utils.py +294 -0
- qiskit/synthesis/__init__.py +240 -0
- qiskit/synthesis/arithmetic/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
- qiskit/synthesis/arithmetic/comparators/__init__.py +16 -0
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/synthesis/boolean/__init__.py +13 -0
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/clifford/__init__.py +19 -0
- qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
- qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
- qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
- qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
- qiskit/synthesis/cnotdihedral/__init__.py +17 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
- qiskit/synthesis/discrete_basis/__init__.py +16 -0
- qiskit/synthesis/discrete_basis/commutator_decompose.py +265 -0
- qiskit/synthesis/discrete_basis/gate_sequence.py +421 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +165 -0
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +240 -0
- qiskit/synthesis/evolution/__init__.py +21 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +120 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +313 -0
- qiskit/synthesis/evolution/qdrift.py +130 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +224 -0
- qiskit/synthesis/linear/__init__.py +26 -0
- qiskit/synthesis/linear/cnot_synth.py +69 -0
- qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
- qiskit/synthesis/linear/linear_depth_lnn.py +61 -0
- qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
- qiskit/synthesis/linear_phase/__init__.py +17 -0
- qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +61 -0
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
- qiskit/synthesis/multi_controlled/__init__.py +25 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +359 -0
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
- qiskit/synthesis/one_qubit/__init__.py +15 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
- qiskit/synthesis/permutation/__init__.py +18 -0
- qiskit/synthesis/permutation/permutation_full.py +78 -0
- qiskit/synthesis/permutation/permutation_lnn.py +54 -0
- qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
- qiskit/synthesis/permutation/permutation_utils.py +16 -0
- qiskit/synthesis/qft/__init__.py +16 -0
- qiskit/synthesis/qft/qft_decompose_full.py +97 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +79 -0
- qiskit/synthesis/stabilizer/__init__.py +16 -0
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
- qiskit/synthesis/two_qubit/__init__.py +20 -0
- qiskit/synthesis/two_qubit/local_invariance.py +63 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +583 -0
- qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
- qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
- qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
- qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
- qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
- qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
- qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
- qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
- qiskit/synthesis/unitary/__init__.py +13 -0
- qiskit/synthesis/unitary/aqc/__init__.py +177 -0
- qiskit/synthesis/unitary/aqc/approximate.py +116 -0
- qiskit/synthesis/unitary/aqc/aqc.py +175 -0
- qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
- qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
- qiskit/synthesis/unitary/qsd.py +288 -0
- qiskit/transpiler/__init__.py +1345 -0
- qiskit/transpiler/basepasses.py +190 -0
- qiskit/transpiler/coupling.py +500 -0
- qiskit/transpiler/exceptions.py +59 -0
- qiskit/transpiler/instruction_durations.py +281 -0
- qiskit/transpiler/layout.py +740 -0
- qiskit/transpiler/passes/__init__.py +276 -0
- qiskit/transpiler/passes/analysis/__init__.py +23 -0
- qiskit/transpiler/passes/analysis/count_ops.py +30 -0
- qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
- qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
- qiskit/transpiler/passes/analysis/depth.py +33 -0
- qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
- qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
- qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
- qiskit/transpiler/passes/analysis/size.py +36 -0
- qiskit/transpiler/passes/analysis/width.py +27 -0
- qiskit/transpiler/passes/basis/__init__.py +19 -0
- qiskit/transpiler/passes/basis/basis_translator.py +138 -0
- qiskit/transpiler/passes/basis/decompose.py +137 -0
- qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +84 -0
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +110 -0
- qiskit/transpiler/passes/layout/__init__.py +26 -0
- qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
- qiskit/transpiler/passes/layout/apply_layout.py +128 -0
- qiskit/transpiler/passes/layout/csp_layout.py +132 -0
- qiskit/transpiler/passes/layout/dense_layout.py +177 -0
- qiskit/transpiler/passes/layout/disjoint_utils.py +219 -0
- qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +116 -0
- qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
- qiskit/transpiler/passes/layout/sabre_layout.py +506 -0
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
- qiskit/transpiler/passes/layout/set_layout.py +69 -0
- qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
- qiskit/transpiler/passes/layout/vf2_layout.py +256 -0
- qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
- qiskit/transpiler/passes/layout/vf2_utils.py +235 -0
- qiskit/transpiler/passes/optimization/__init__.py +42 -0
- qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
- qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
- qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +117 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +109 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +85 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +242 -0
- qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
- qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
- qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +176 -0
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
- qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +267 -0
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +250 -0
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
- qiskit/transpiler/passes/optimization/optimize_annotated.py +449 -0
- qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
- qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
- qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
- qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +70 -0
- qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -0
- qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
- qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
- qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +639 -0
- qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
- qiskit/transpiler/passes/routing/__init__.py +21 -0
- qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
- qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
- qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
- qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
- qiskit/transpiler/passes/routing/basic_swap.py +166 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +397 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
- qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
- qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
- qiskit/transpiler/passes/routing/sabre_swap.py +463 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +408 -0
- qiskit/transpiler/passes/routing/utils.py +35 -0
- qiskit/transpiler/passes/scheduling/__init__.py +21 -0
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
- qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
- qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
- qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
- qiskit/transpiler/passes/synthesis/__init__.py +20 -0
- qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
- qiskit/transpiler/passes/synthesis/hls_plugins.py +1963 -0
- qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
- qiskit/transpiler/passes/synthesis/plugin.py +738 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +313 -0
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
- qiskit/transpiler/passes/utils/__init__.py +32 -0
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
- qiskit/transpiler/passes/utils/check_gate_direction.py +60 -0
- qiskit/transpiler/passes/utils/check_map.py +78 -0
- qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
- qiskit/transpiler/passes/utils/control_flow.py +61 -0
- qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
- qiskit/transpiler/passes/utils/error.py +69 -0
- qiskit/transpiler/passes/utils/filter_op_nodes.py +66 -0
- qiskit/transpiler/passes/utils/fixed_point.py +48 -0
- qiskit/transpiler/passes/utils/gate_direction.py +93 -0
- qiskit/transpiler/passes/utils/gates_basis.py +51 -0
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
- qiskit/transpiler/passes/utils/minimum_point.py +118 -0
- qiskit/transpiler/passes/utils/remove_barriers.py +50 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
- qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
- qiskit/transpiler/passmanager.py +503 -0
- qiskit/transpiler/passmanager_config.py +151 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +993 -0
- qiskit/transpiler/preset_passmanagers/common.py +672 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +437 -0
- qiskit/transpiler/preset_passmanagers/level0.py +104 -0
- qiskit/transpiler/preset_passmanagers/level1.py +108 -0
- qiskit/transpiler/preset_passmanagers/level2.py +109 -0
- qiskit/transpiler/preset_passmanagers/level3.py +110 -0
- qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
- qiskit/transpiler/target.py +905 -0
- qiskit/transpiler/timing_constraints.py +59 -0
- qiskit/user_config.py +266 -0
- qiskit/utils/__init__.py +90 -0
- qiskit/utils/classtools.py +146 -0
- qiskit/utils/deprecation.py +382 -0
- qiskit/utils/lazy_tester.py +363 -0
- qiskit/utils/optionals.py +354 -0
- qiskit/utils/parallel.py +318 -0
- qiskit/utils/units.py +146 -0
- qiskit/version.py +84 -0
- qiskit/visualization/__init__.py +290 -0
- qiskit/visualization/array.py +207 -0
- qiskit/visualization/bloch.py +778 -0
- qiskit/visualization/circuit/__init__.py +15 -0
- qiskit/visualization/circuit/_utils.py +675 -0
- qiskit/visualization/circuit/circuit_visualization.py +735 -0
- qiskit/visualization/circuit/latex.py +661 -0
- qiskit/visualization/circuit/matplotlib.py +2019 -0
- qiskit/visualization/circuit/qcstyle.py +278 -0
- qiskit/visualization/circuit/styles/__init__.py +13 -0
- qiskit/visualization/circuit/styles/bw.json +202 -0
- qiskit/visualization/circuit/styles/clifford.json +202 -0
- qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
- qiskit/visualization/circuit/styles/iqp.json +214 -0
- qiskit/visualization/circuit/styles/textbook.json +202 -0
- qiskit/visualization/circuit/text.py +1849 -0
- qiskit/visualization/circuit_visualization.py +19 -0
- qiskit/visualization/counts_visualization.py +487 -0
- qiskit/visualization/dag_visualization.py +318 -0
- qiskit/visualization/exceptions.py +21 -0
- qiskit/visualization/gate_map.py +1424 -0
- qiskit/visualization/library.py +40 -0
- qiskit/visualization/pass_manager_visualization.py +312 -0
- qiskit/visualization/state_visualization.py +1546 -0
- qiskit/visualization/timeline/__init__.py +21 -0
- qiskit/visualization/timeline/core.py +495 -0
- qiskit/visualization/timeline/drawings.py +260 -0
- qiskit/visualization/timeline/generators.py +506 -0
- qiskit/visualization/timeline/interface.py +444 -0
- qiskit/visualization/timeline/layouts.py +115 -0
- qiskit/visualization/timeline/plotters/__init__.py +16 -0
- qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
- qiskit/visualization/timeline/plotters/matplotlib.py +195 -0
- qiskit/visualization/timeline/stylesheet.py +301 -0
- qiskit/visualization/timeline/types.py +148 -0
- qiskit/visualization/transition_visualization.py +369 -0
- qiskit/visualization/utils.py +49 -0
- qiskit-2.0.3.dist-info/METADATA +220 -0
- qiskit-2.0.3.dist-info/RECORD +690 -0
- qiskit-2.0.3.dist-info/WHEEL +6 -0
- qiskit-2.0.3.dist-info/entry_points.txt +82 -0
- qiskit-2.0.3.dist-info/licenses/LICENSE.txt +203 -0
- qiskit-2.0.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,124 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2025.
|
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
|
+
"""Circuit synthesizers and related classes for boolean expressions"""
|
13
|
+
|
14
|
+
import itertools
|
15
|
+
from qiskit.circuit import QuantumCircuit
|
16
|
+
from qiskit.circuit.library import ZGate, XGate
|
17
|
+
|
18
|
+
|
19
|
+
class EsopGenerator:
|
20
|
+
"""Generates an ESOP (Exlusive-sum-of-products) representation
|
21
|
+
for a boolean function given by its truth table"""
|
22
|
+
|
23
|
+
def __init__(self, truth_table):
|
24
|
+
self.truth_table = truth_table
|
25
|
+
self.cofactor_table = {}
|
26
|
+
self.esop = self.generate_esop(assignment=())
|
27
|
+
|
28
|
+
def clause_diff(self, clause1, clause2):
|
29
|
+
"""The indices of variables where the clauses differ"""
|
30
|
+
return [i for i in range(len(clause1)) if clause1[i] != clause2[i]]
|
31
|
+
|
32
|
+
def combine_and_optimize(self, clauses_1, clauses_2):
|
33
|
+
"""Combining clauses of distance 1 until no more combinations can be performed"""
|
34
|
+
something_changed = True
|
35
|
+
combined_clauses = clauses_1 + clauses_2
|
36
|
+
while something_changed:
|
37
|
+
something_changed = False
|
38
|
+
for clause_1, clause_2 in itertools.combinations(combined_clauses, 2):
|
39
|
+
diff = self.clause_diff(clause_1, clause_2)
|
40
|
+
if len(diff) == 1:
|
41
|
+
new_clause = clause_1[: diff[0]] + "-" + clause_1[diff[0] + 1 :]
|
42
|
+
if new_clause not in combined_clauses:
|
43
|
+
combined_clauses.remove(clause_1)
|
44
|
+
combined_clauses.remove(clause_2)
|
45
|
+
combined_clauses.append(new_clause)
|
46
|
+
something_changed = True
|
47
|
+
break
|
48
|
+
return combined_clauses
|
49
|
+
|
50
|
+
def generate_esop(self, assignment):
|
51
|
+
"""Recursively generates an ESOP for a partially determined boolean expression
|
52
|
+
'assignment' is a partial assignment to the expression's variables
|
53
|
+
"""
|
54
|
+
# this base case is non-optimized;
|
55
|
+
# we may be able to terminate even before having a full assignment
|
56
|
+
if len(assignment) == self.truth_table.num_bits:
|
57
|
+
if self.truth_table[assignment]:
|
58
|
+
return ["-" * self.truth_table.num_bits] # True; a don't care clause
|
59
|
+
else:
|
60
|
+
return [] # False
|
61
|
+
i = len(assignment) # current variable
|
62
|
+
negative_esop = self.generate_esop(assignment + (False,))
|
63
|
+
positive_esop = self.generate_esop(assignment + (True,))
|
64
|
+
# Shannon's expansion
|
65
|
+
negative_esop_bool_expanded = [
|
66
|
+
clause[:i] + "0" + clause[i + 1 :] for clause in negative_esop
|
67
|
+
]
|
68
|
+
positive_esop_bool_expanded = [
|
69
|
+
clause[:i] + "1" + clause[i + 1 :] for clause in positive_esop
|
70
|
+
]
|
71
|
+
self.cofactor_table[assignment] = self.combine_and_optimize(
|
72
|
+
negative_esop_bool_expanded, positive_esop_bool_expanded
|
73
|
+
)
|
74
|
+
return self.cofactor_table[assignment]
|
75
|
+
|
76
|
+
|
77
|
+
def synth_phase_oracle_from_esop(esop, num_qubits):
|
78
|
+
"""
|
79
|
+
Generates a phase oracle for the boolean function f given in ESOP (Exlusive sum of products) form
|
80
|
+
esop is of the form ('01-1', '11-0', ...) etc
|
81
|
+
where 1 is the variable, 0 is negated variable and - is don't care
|
82
|
+
"""
|
83
|
+
qc = QuantumCircuit(num_qubits)
|
84
|
+
clause_data = [
|
85
|
+
(zip(*[qubit_data for qubit_data in enumerate(clause) if qubit_data[1] != "-"]))
|
86
|
+
for clause in esop
|
87
|
+
]
|
88
|
+
for qubit_indices, control_data in clause_data:
|
89
|
+
control_state = "".join(control_data)
|
90
|
+
if len(control_state) == 1: # single qubit; either Z or XZX
|
91
|
+
if control_state == "0":
|
92
|
+
qc.x(qubit_indices[0])
|
93
|
+
qc.z(qubit_indices[0])
|
94
|
+
if control_state == "0":
|
95
|
+
qc.x(qubit_indices[0])
|
96
|
+
else: # use custom controlled-Z gate
|
97
|
+
# we use the last qubit as the target, flipping it if the control is 0 for that qubit
|
98
|
+
gate = ZGate().control(len(qubit_indices) - 1, ctrl_state=control_state[:-1][::-1])
|
99
|
+
if control_state[-1] == "0":
|
100
|
+
qc.x(qubit_indices[-1])
|
101
|
+
qc.append(gate, qubit_indices)
|
102
|
+
if control_state[-1] == "0":
|
103
|
+
qc.x(qubit_indices[-1])
|
104
|
+
return qc
|
105
|
+
|
106
|
+
|
107
|
+
def synth_bit_oracle_from_esop(esop, num_qubits):
|
108
|
+
"""
|
109
|
+
Generates a bit-flip oracle for the boolean function f given in ESOP (Exlusive sum of products) form
|
110
|
+
esop is of the form ('01-1', '11-0', ...) etc
|
111
|
+
where 1 is the variable, 0 is negated variable and - is don't care
|
112
|
+
"""
|
113
|
+
output_index = num_qubits - 1
|
114
|
+
qc = QuantumCircuit(num_qubits)
|
115
|
+
clause_data = [
|
116
|
+
(zip(*[qubit_data for qubit_data in enumerate(clause) if qubit_data[1] != "-"]))
|
117
|
+
for clause in esop
|
118
|
+
]
|
119
|
+
for qubit_indices, control_data in clause_data:
|
120
|
+
control_state = "".join(control_data)
|
121
|
+
# use custom controlled-X gate
|
122
|
+
gate = XGate().control(len(qubit_indices), ctrl_state=control_state[::-1])
|
123
|
+
qc.append(gate, qubit_indices + (output_index,))
|
124
|
+
return qc
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2025.
|
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
|
+
"""Node visitor as defined in https://docs.python.org/3/library/ast.html#ast.NodeVisitor
|
14
|
+
This module is used internally by ``qiskit.synthesis.boolean.BooleanExpression``.
|
15
|
+
"""
|
16
|
+
|
17
|
+
import ast
|
18
|
+
import _ast
|
19
|
+
|
20
|
+
|
21
|
+
class BooleanExpressionEvalVisitor(ast.NodeVisitor):
|
22
|
+
"""Node visitor to compute the value of the expression, given the boolean values of the args
|
23
|
+
as defined in https://docs.python.org/3/library/ast.html#ast.NodeVisitor"""
|
24
|
+
|
25
|
+
# pylint: disable=invalid-name
|
26
|
+
bitops = {
|
27
|
+
_ast.BitAnd: lambda values: values[0] and values[1],
|
28
|
+
_ast.And: lambda values: values[0] and values[1],
|
29
|
+
_ast.BitOr: lambda values: values[0] or values[1],
|
30
|
+
_ast.Or: lambda values: values[0] or values[1],
|
31
|
+
_ast.BitXor: lambda values: values[0] ^ values[1],
|
32
|
+
_ast.Not: lambda values: not values[0],
|
33
|
+
_ast.Invert: lambda values: not values[0],
|
34
|
+
}
|
35
|
+
|
36
|
+
def __init__(self):
|
37
|
+
self.arg_values = {}
|
38
|
+
super().__init__()
|
39
|
+
|
40
|
+
def bit_binop(self, op, values):
|
41
|
+
"""Performs the operation, if it is recognized"""
|
42
|
+
op_type = type(op)
|
43
|
+
if op_type not in self.bitops:
|
44
|
+
raise ValueError(f"Unknown op: {op_type}")
|
45
|
+
return self.bitops[op_type](values)
|
46
|
+
|
47
|
+
def visit_BinOp(self, node):
|
48
|
+
"""Handles ``&``, ``^``, and ``|``."""
|
49
|
+
return self.bit_binop(node.op, [self.visit(node.left), self.visit(node.right)])
|
50
|
+
|
51
|
+
def visit_UnaryOp(self, node):
|
52
|
+
"""Handles ``~``."""
|
53
|
+
return self.bit_binop(node.op, [self.visit(node.operand)])
|
54
|
+
|
55
|
+
def visit_Name(self, node):
|
56
|
+
"""Reduce variable names."""
|
57
|
+
if node.id not in self.arg_values:
|
58
|
+
raise ValueError(f"Undefined value for {node.id}")
|
59
|
+
return self.arg_values[node.id]
|
60
|
+
|
61
|
+
def visit_Module(self, node):
|
62
|
+
"""Returns the value of the single expression comprising the boolean expression"""
|
63
|
+
if len(node.body) != 1 or not isinstance(node.body[0], ast.Expr):
|
64
|
+
raise ValueError("Incorrectly formatted boolean expression")
|
65
|
+
return self.visit(node.body[0])
|
66
|
+
|
67
|
+
def visit_Expr(self, node):
|
68
|
+
"""Returns the value of the expression"""
|
69
|
+
return self.visit(node.value)
|
70
|
+
|
71
|
+
def generic_visit(self, node):
|
72
|
+
"""Catch all for the unhandled nodes."""
|
73
|
+
raise ValueError(f"Unknown node: {type(node)}")
|
74
|
+
|
75
|
+
|
76
|
+
class BooleanExpressionArgsCollectorVisitor(ast.NodeVisitor):
|
77
|
+
"""Node visitor to collect the name of the args of the expression
|
78
|
+
as defined in https://docs.python.org/3/library/ast.html#ast.NodeVisitor"""
|
79
|
+
|
80
|
+
# pylint: disable=invalid-name
|
81
|
+
def __init__(self):
|
82
|
+
self.args = set()
|
83
|
+
self.args_pos = {}
|
84
|
+
super().__init__()
|
85
|
+
|
86
|
+
def visit_Name(self, node):
|
87
|
+
"""Collect arg name."""
|
88
|
+
self.args.add(node.id)
|
89
|
+
if node.id not in self.args_pos or (
|
90
|
+
self.args_pos[node.id] > (node.lineno, node.col_offset)
|
91
|
+
):
|
92
|
+
self.args_pos[node.id] = (node.lineno, node.col_offset)
|
93
|
+
|
94
|
+
def get_sorted_args(self):
|
95
|
+
"""Returns a list of the args, sorted by their appearance locations"""
|
96
|
+
return sorted(self.args, key=lambda arg: self.args_pos[arg])
|
@@ -0,0 +1,19 @@
|
|
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 clifford circuit synthesis."""
|
14
|
+
|
15
|
+
from .clifford_decompose_full import synth_clifford_full
|
16
|
+
from .clifford_decompose_ag import synth_clifford_ag
|
17
|
+
from .clifford_decompose_bm import synth_clifford_bm
|
18
|
+
from .clifford_decompose_greedy import synth_clifford_greedy
|
19
|
+
from .clifford_decompose_layers import synth_clifford_layers, synth_clifford_depth_lnn
|
@@ -0,0 +1,178 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2021, 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.
|
14
|
+
"""
|
15
|
+
|
16
|
+
|
17
|
+
# ---------------------------------------------------------------------
|
18
|
+
# Synthesis based on Aaronson & Gottesman decomposition
|
19
|
+
# ---------------------------------------------------------------------
|
20
|
+
|
21
|
+
import numpy as np
|
22
|
+
|
23
|
+
from qiskit.circuit import QuantumCircuit
|
24
|
+
from qiskit.quantum_info import Clifford
|
25
|
+
from qiskit.quantum_info.operators.symplectic.clifford_circuits import (
|
26
|
+
_append_cx,
|
27
|
+
_append_h,
|
28
|
+
_append_s,
|
29
|
+
_append_swap,
|
30
|
+
_append_x,
|
31
|
+
_append_z,
|
32
|
+
)
|
33
|
+
from .clifford_decompose_bm import synth_clifford_bm
|
34
|
+
|
35
|
+
|
36
|
+
def synth_clifford_ag(clifford: Clifford) -> QuantumCircuit:
|
37
|
+
"""Decompose a :class:`.Clifford` operator into a :class:`.QuantumCircuit`
|
38
|
+
based on Aaronson-Gottesman method [1].
|
39
|
+
|
40
|
+
Args:
|
41
|
+
clifford: A Clifford operator.
|
42
|
+
|
43
|
+
Returns:
|
44
|
+
A circuit implementation of the Clifford.
|
45
|
+
|
46
|
+
References:
|
47
|
+
1. S. Aaronson, D. Gottesman, *Improved Simulation of Stabilizer Circuits*,
|
48
|
+
Phys. Rev. A 70, 052328 (2004).
|
49
|
+
`arXiv:quant-ph/0406196 <https://arxiv.org/abs/quant-ph/0406196>`_
|
50
|
+
"""
|
51
|
+
# Use 1-qubit decomposition method
|
52
|
+
if clifford.num_qubits == 1:
|
53
|
+
return synth_clifford_bm(clifford)
|
54
|
+
|
55
|
+
# Compose a circuit which we will convert to an instruction
|
56
|
+
circuit = QuantumCircuit(clifford.num_qubits, name=str(clifford))
|
57
|
+
|
58
|
+
# Make a copy of Clifford as we are going to do row reduction to
|
59
|
+
# reduce it to an identity
|
60
|
+
clifford_cpy = clifford.copy()
|
61
|
+
|
62
|
+
for i in range(clifford.num_qubits):
|
63
|
+
# put a 1 one into position by permuting and using Hadamards(i,i)
|
64
|
+
_set_qubit_x_true(clifford_cpy, circuit, i)
|
65
|
+
# make all entries in row i except ith equal to 0
|
66
|
+
# by using phase gate and CNOTS
|
67
|
+
_set_row_x_zero(clifford_cpy, circuit, i)
|
68
|
+
# treat Zs
|
69
|
+
_set_row_z_zero(clifford_cpy, circuit, i)
|
70
|
+
|
71
|
+
for i in range(clifford.num_qubits):
|
72
|
+
if clifford_cpy.destab_phase[i]:
|
73
|
+
_append_z(clifford_cpy, i)
|
74
|
+
circuit.z(i)
|
75
|
+
if clifford_cpy.stab_phase[i]:
|
76
|
+
_append_x(clifford_cpy, i)
|
77
|
+
circuit.x(i)
|
78
|
+
# Next we invert the circuit to undo the row reduction and return the
|
79
|
+
# result as a gate instruction
|
80
|
+
return circuit.inverse()
|
81
|
+
|
82
|
+
|
83
|
+
# ---------------------------------------------------------------------
|
84
|
+
# Helper functions for Aaronson & Gottesman decomposition
|
85
|
+
# ---------------------------------------------------------------------
|
86
|
+
|
87
|
+
|
88
|
+
def _set_qubit_x_true(clifford, circuit, qubit):
|
89
|
+
"""Set destabilizer.X[qubit, qubit] to be True.
|
90
|
+
|
91
|
+
This is done by permuting columns l > qubit or if necessary applying
|
92
|
+
a Hadamard
|
93
|
+
"""
|
94
|
+
x = clifford.destab_x[qubit]
|
95
|
+
z = clifford.destab_z[qubit]
|
96
|
+
|
97
|
+
if x[qubit]:
|
98
|
+
return
|
99
|
+
|
100
|
+
# Try to find non-zero element
|
101
|
+
for i in range(qubit + 1, clifford.num_qubits):
|
102
|
+
if x[i]:
|
103
|
+
_append_swap(clifford, i, qubit)
|
104
|
+
circuit.swap(i, qubit)
|
105
|
+
return
|
106
|
+
|
107
|
+
# no non-zero element found: need to apply Hadamard somewhere
|
108
|
+
for i in range(qubit, clifford.num_qubits):
|
109
|
+
if z[i]:
|
110
|
+
_append_h(clifford, i)
|
111
|
+
circuit.h(i)
|
112
|
+
if i != qubit:
|
113
|
+
_append_swap(clifford, i, qubit)
|
114
|
+
circuit.swap(i, qubit)
|
115
|
+
return
|
116
|
+
|
117
|
+
|
118
|
+
def _set_row_x_zero(clifford, circuit, qubit):
|
119
|
+
r"""Set destabilizer.X[qubit, i] to False for all i > qubit.
|
120
|
+
|
121
|
+
This is done by applying CNOTs assuming :math:`k \leq N` and A[k][k]=1
|
122
|
+
"""
|
123
|
+
x = clifford.destab_x[qubit]
|
124
|
+
z = clifford.destab_z[qubit]
|
125
|
+
|
126
|
+
# Check X first
|
127
|
+
for i in range(qubit + 1, clifford.num_qubits):
|
128
|
+
if x[i]:
|
129
|
+
_append_cx(clifford, qubit, i)
|
130
|
+
circuit.cx(qubit, i)
|
131
|
+
|
132
|
+
# Check whether Zs need to be set to zero:
|
133
|
+
if np.any(z[qubit:]):
|
134
|
+
if not z[qubit]:
|
135
|
+
# to treat Zs: make sure row.Z[k] to True
|
136
|
+
_append_s(clifford, qubit)
|
137
|
+
circuit.s(qubit)
|
138
|
+
|
139
|
+
# reverse CNOTS
|
140
|
+
for i in range(qubit + 1, clifford.num_qubits):
|
141
|
+
if z[i]:
|
142
|
+
_append_cx(clifford, i, qubit)
|
143
|
+
circuit.cx(i, qubit)
|
144
|
+
# set row.Z[qubit] to False
|
145
|
+
_append_s(clifford, qubit)
|
146
|
+
circuit.s(qubit)
|
147
|
+
|
148
|
+
|
149
|
+
def _set_row_z_zero(clifford, circuit, qubit):
|
150
|
+
"""Set stabilizer.Z[qubit, i] to False for all i > qubit.
|
151
|
+
|
152
|
+
Implemented by applying (reverse) CNOTS assumes qubit < num_qubits
|
153
|
+
and _set_row_x_zero has been called first
|
154
|
+
"""
|
155
|
+
|
156
|
+
x = clifford.stab_x[qubit]
|
157
|
+
z = clifford.stab_z[qubit]
|
158
|
+
|
159
|
+
# check whether Zs need to be set to zero:
|
160
|
+
if np.any(z[qubit + 1 :]):
|
161
|
+
for i in range(qubit + 1, clifford.num_qubits):
|
162
|
+
if z[i]:
|
163
|
+
_append_cx(clifford, i, qubit)
|
164
|
+
circuit.cx(i, qubit)
|
165
|
+
|
166
|
+
# check whether Xs need to be set to zero:
|
167
|
+
if np.any(x[qubit:]):
|
168
|
+
_append_h(clifford, qubit)
|
169
|
+
circuit.h(qubit)
|
170
|
+
for i in range(qubit + 1, clifford.num_qubits):
|
171
|
+
if x[i]:
|
172
|
+
_append_cx(clifford, qubit, i)
|
173
|
+
circuit.cx(qubit, i)
|
174
|
+
if z[qubit]:
|
175
|
+
_append_s(clifford, qubit)
|
176
|
+
circuit.s(qubit)
|
177
|
+
_append_h(clifford, qubit)
|
178
|
+
circuit.h(qubit)
|
@@ -0,0 +1,46 @@
|
|
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 2-qubit and 3-qubit Cliffords based on Bravyi & Maslov
|
14
|
+
decomposition.
|
15
|
+
"""
|
16
|
+
|
17
|
+
from qiskit.circuit import QuantumCircuit
|
18
|
+
from qiskit.quantum_info import Clifford
|
19
|
+
|
20
|
+
from qiskit._accelerate.synthesis.clifford import (
|
21
|
+
synth_clifford_bm as synth_clifford_bm_inner,
|
22
|
+
)
|
23
|
+
|
24
|
+
|
25
|
+
def synth_clifford_bm(clifford: Clifford) -> QuantumCircuit:
|
26
|
+
"""Optimal CX-cost decomposition of a :class:`.Clifford` operator on 2 qubits
|
27
|
+
or 3 qubits into a :class:`.QuantumCircuit` based on the Bravyi-Maslov method [1].
|
28
|
+
|
29
|
+
Args:
|
30
|
+
clifford: A Clifford operator.
|
31
|
+
|
32
|
+
Returns:
|
33
|
+
A circuit implementation of the Clifford.
|
34
|
+
|
35
|
+
Raises:
|
36
|
+
QiskitError: if Clifford is on more than 3 qubits.
|
37
|
+
|
38
|
+
References:
|
39
|
+
1. S. Bravyi, D. Maslov, *Hadamard-free circuits expose the
|
40
|
+
structure of the Clifford group*,
|
41
|
+
`arXiv:2003.09412 [quant-ph] <https://arxiv.org/abs/2003.09412>`_
|
42
|
+
"""
|
43
|
+
circuit = QuantumCircuit._from_circuit_data(
|
44
|
+
synth_clifford_bm_inner(clifford.tableau.astype(bool)), add_regs=True, name=str(clifford)
|
45
|
+
)
|
46
|
+
return circuit
|
@@ -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
|