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,69 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2019.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""
|
14
|
+
Implementation of the GraySynth algorithm for synthesizing CNOT-Phase
|
15
|
+
circuits with efficient CNOT cost, and the Patel-Hayes-Markov algorithm
|
16
|
+
for optimal synthesis of linear (CNOT-only) reversible circuits.
|
17
|
+
"""
|
18
|
+
|
19
|
+
from __future__ import annotations
|
20
|
+
|
21
|
+
import numpy as np
|
22
|
+
from qiskit.circuit import QuantumCircuit
|
23
|
+
|
24
|
+
from qiskit._accelerate.synthesis.linear import synth_cnot_count_full_pmh as fast_pmh
|
25
|
+
|
26
|
+
|
27
|
+
def synth_cnot_count_full_pmh(
|
28
|
+
state: list[list[bool]] | np.ndarray[bool], section_size: int | None = None
|
29
|
+
) -> QuantumCircuit:
|
30
|
+
r"""
|
31
|
+
Synthesize linear reversible circuits for all-to-all architecture
|
32
|
+
using Patel, Markov and Hayes method.
|
33
|
+
|
34
|
+
This function is an implementation of the Patel, Markov and Hayes algorithm from [1]
|
35
|
+
for optimal synthesis of linear reversible circuits for all-to-all architecture,
|
36
|
+
as specified by an :math:`n \times n` matrix.
|
37
|
+
|
38
|
+
Args:
|
39
|
+
state: :math:`n \times n` boolean invertible matrix, describing
|
40
|
+
the state of the input circuit.
|
41
|
+
section_size: The size of each section in the Patel–Markov–Hayes algorithm [1].
|
42
|
+
If ``None`` it is chosen to be :math:`\max(2, \alpha\log_2(n))` with
|
43
|
+
:math:`\alpha = 0.56`, which approximately minimizes the upper bound on the number
|
44
|
+
of row operations given in [1] Eq. (3).
|
45
|
+
|
46
|
+
Returns:
|
47
|
+
A CX-only circuit implementing the linear transformation.
|
48
|
+
|
49
|
+
Raises:
|
50
|
+
ValueError: When ``section_size`` is larger than the number of columns.
|
51
|
+
|
52
|
+
References:
|
53
|
+
1. Patel, Ketan N., Igor L. Markov, and John P. Hayes,
|
54
|
+
*Optimal synthesis of linear reversible circuits*,
|
55
|
+
Quantum Information & Computation 8.3 (2008): 282-294.
|
56
|
+
`arXiv:quant-ph/0302002 [quant-ph] <https://arxiv.org/abs/quant-ph/0302002>`_
|
57
|
+
"""
|
58
|
+
normalized = np.asarray(state).astype(bool)
|
59
|
+
if section_size is not None and normalized.shape[1] < section_size:
|
60
|
+
raise ValueError(
|
61
|
+
f"The section_size ({section_size}) cannot be larger than the number of columns "
|
62
|
+
f"({normalized.shape[1]})."
|
63
|
+
)
|
64
|
+
|
65
|
+
# call Rust implementation with normalized input
|
66
|
+
circuit_data = fast_pmh(normalized, section_size)
|
67
|
+
|
68
|
+
# construct circuit from the data
|
69
|
+
return QuantumCircuit._from_circuit_data(circuit_data, add_regs=True)
|
@@ -0,0 +1,128 @@
|
|
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
|
+
"""Utility functions for handling linear reversible circuits."""
|
14
|
+
|
15
|
+
import copy
|
16
|
+
from typing import Callable
|
17
|
+
import numpy as np
|
18
|
+
from qiskit.circuit import QuantumCircuit
|
19
|
+
from qiskit.exceptions import QiskitError
|
20
|
+
from qiskit.circuit.exceptions import CircuitError
|
21
|
+
from . import calc_inverse_matrix, check_invertible_binary_matrix
|
22
|
+
|
23
|
+
|
24
|
+
def transpose_cx_circ(qc: QuantumCircuit):
|
25
|
+
"""Takes a circuit having only CX gates, and calculates its transpose.
|
26
|
+
This is done by recursively replacing CX(i, j) with CX(j, i) in all instructions.
|
27
|
+
|
28
|
+
Args:
|
29
|
+
qc: a :class:`.QuantumCircuit` containing only CX gates.
|
30
|
+
|
31
|
+
Returns:
|
32
|
+
QuantumCircuit: the transposed circuit.
|
33
|
+
|
34
|
+
Raises:
|
35
|
+
CircuitError: if qc has a non-CX gate.
|
36
|
+
"""
|
37
|
+
transposed_circ = QuantumCircuit(qc.qubits, qc.clbits, name=qc.name + "_transpose")
|
38
|
+
for instruction in reversed(qc.data):
|
39
|
+
if instruction.operation.name != "cx":
|
40
|
+
raise CircuitError("The circuit contains non-CX gates.")
|
41
|
+
transposed_circ._append(instruction.replace(qubits=reversed(instruction.qubits)))
|
42
|
+
return transposed_circ
|
43
|
+
|
44
|
+
|
45
|
+
def optimize_cx_4_options(function: Callable, mat: np.ndarray, optimize_count: bool = True):
|
46
|
+
"""Get the best implementation of a circuit implementing a binary invertible matrix M,
|
47
|
+
by considering all four options: M,M^(-1),M^T,M^(-1)^T.
|
48
|
+
Optimizing either the CX count or the depth.
|
49
|
+
|
50
|
+
Args:
|
51
|
+
function: the synthesis function.
|
52
|
+
mat: a binary invertible matrix.
|
53
|
+
optimize_count: True if the number of CX gates in optimize, False if the depth is optimized.
|
54
|
+
|
55
|
+
Returns:
|
56
|
+
QuantumCircuit: an optimized :class:`.QuantumCircuit`, has the best depth or CX count of
|
57
|
+
the four options.
|
58
|
+
|
59
|
+
Raises:
|
60
|
+
QiskitError: if mat is not an invertible matrix.
|
61
|
+
"""
|
62
|
+
if not check_invertible_binary_matrix(mat):
|
63
|
+
raise QiskitError("The matrix is not invertible.")
|
64
|
+
|
65
|
+
qc = function(mat)
|
66
|
+
best_qc = qc
|
67
|
+
best_depth = qc.depth()
|
68
|
+
best_count = qc.count_ops()["cx"]
|
69
|
+
|
70
|
+
for i in range(1, 4):
|
71
|
+
mat_cpy = copy.deepcopy(mat)
|
72
|
+
# i=1 inverse, i=2 transpose, i=3 transpose and inverse
|
73
|
+
if i == 1:
|
74
|
+
mat_cpy = calc_inverse_matrix(mat_cpy)
|
75
|
+
qc = function(mat_cpy)
|
76
|
+
qc = qc.inverse()
|
77
|
+
elif i == 2:
|
78
|
+
mat_cpy = np.transpose(mat_cpy)
|
79
|
+
qc = function(mat_cpy)
|
80
|
+
qc = transpose_cx_circ(qc)
|
81
|
+
elif i == 3:
|
82
|
+
mat_cpy = calc_inverse_matrix(np.transpose(mat_cpy))
|
83
|
+
qc = function(mat_cpy)
|
84
|
+
qc = transpose_cx_circ(qc)
|
85
|
+
qc = qc.inverse()
|
86
|
+
|
87
|
+
new_depth = qc.depth()
|
88
|
+
new_count = qc.count_ops()["cx"]
|
89
|
+
# Prioritize count, and if it has the same count, then also consider depth
|
90
|
+
better_count = (optimize_count and best_count > new_count) or (
|
91
|
+
not optimize_count and best_depth == new_depth and best_count > new_count
|
92
|
+
)
|
93
|
+
# Prioritize depth, and if it has the same depth, then also consider count
|
94
|
+
better_depth = (not optimize_count and best_depth > new_depth) or (
|
95
|
+
optimize_count and best_count == new_count and best_depth > new_depth
|
96
|
+
)
|
97
|
+
|
98
|
+
if better_count or better_depth:
|
99
|
+
best_count = new_count
|
100
|
+
best_depth = new_depth
|
101
|
+
best_qc = qc
|
102
|
+
|
103
|
+
return best_qc
|
104
|
+
|
105
|
+
|
106
|
+
def check_lnn_connectivity(qc: QuantumCircuit) -> bool:
|
107
|
+
"""Check that the synthesized circuit qc fits linear nearest neighbor connectivity.
|
108
|
+
|
109
|
+
Args:
|
110
|
+
qc: a :class:`.QuantumCircuit` containing only CX and single qubit gates.
|
111
|
+
|
112
|
+
Returns:
|
113
|
+
bool: True if the circuit has linear nearest neighbor connectivity.
|
114
|
+
|
115
|
+
Raises:
|
116
|
+
CircuitError: if qc has a non-CX two-qubit gate.
|
117
|
+
"""
|
118
|
+
for instruction in qc.data:
|
119
|
+
if instruction.operation.num_qubits > 1:
|
120
|
+
if instruction.operation.name == "cx":
|
121
|
+
q0 = qc.find_bit(instruction.qubits[0]).index
|
122
|
+
q1 = qc.find_bit(instruction.qubits[1]).index
|
123
|
+
dist = abs(q0 - q1)
|
124
|
+
if dist != 1:
|
125
|
+
return False
|
126
|
+
else:
|
127
|
+
raise CircuitError("The circuit has two-qubits gates different than CX.")
|
128
|
+
return True
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2022, 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
|
+
"""
|
14
|
+
Optimize the synthesis of an n-qubit circuit contains only CX gates for
|
15
|
+
linear nearest neighbor (LNN) connectivity.
|
16
|
+
The depth of the circuit is bounded by 5*n, while the gate count is approximately 2.5*n^2
|
17
|
+
|
18
|
+
References:
|
19
|
+
[1]: Kutin, S., Moulton, D. P., Smithline, L. (2007).
|
20
|
+
Computation at a Distance.
|
21
|
+
`arXiv:quant-ph/0701194 <https://arxiv.org/abs/quant-ph/0701194>`_.
|
22
|
+
"""
|
23
|
+
|
24
|
+
from __future__ import annotations
|
25
|
+
import numpy as np
|
26
|
+
from qiskit.exceptions import QiskitError
|
27
|
+
from qiskit.circuit import QuantumCircuit
|
28
|
+
from qiskit.synthesis.linear.linear_matrix_utils import check_invertible_binary_matrix
|
29
|
+
from qiskit._accelerate.synthesis.linear import py_synth_cnot_depth_line_kms as fast_kms
|
30
|
+
|
31
|
+
|
32
|
+
def synth_cnot_depth_line_kms(mat: np.ndarray[bool]) -> QuantumCircuit:
|
33
|
+
"""
|
34
|
+
Synthesize linear reversible circuit for linear nearest-neighbor architectures using
|
35
|
+
Kutin, Moulton, Smithline method.
|
36
|
+
|
37
|
+
Synthesis algorithm for linear reversible circuits from [1], section 7.
|
38
|
+
This algorithm synthesizes any linear reversible circuit of :math:`n` qubits over
|
39
|
+
a linear nearest-neighbor architecture using CX gates with depth at most :math:`5n`.
|
40
|
+
|
41
|
+
Args:
|
42
|
+
mat: A boolean invertible matrix.
|
43
|
+
|
44
|
+
Returns:
|
45
|
+
The synthesized quantum circuit.
|
46
|
+
|
47
|
+
Raises:
|
48
|
+
QiskitError: if ``mat`` is not invertible.
|
49
|
+
|
50
|
+
References:
|
51
|
+
1. Kutin, S., Moulton, D. P., Smithline, L.,
|
52
|
+
*Computation at a distance*, Chicago J. Theor. Comput. Sci., vol. 2007, (2007),
|
53
|
+
`arXiv:quant-ph/0701194 <https://arxiv.org/abs/quant-ph/0701194>`_
|
54
|
+
"""
|
55
|
+
if not check_invertible_binary_matrix(mat):
|
56
|
+
raise QiskitError("The input matrix is not invertible.")
|
57
|
+
|
58
|
+
circuit_data = fast_kms(mat)
|
59
|
+
|
60
|
+
# construct circuit from the data
|
61
|
+
return QuantumCircuit._from_circuit_data(circuit_data, add_regs=True)
|
@@ -0,0 +1,27 @@
|
|
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
|
+
"""Utility functions for handling binary matrices."""
|
14
|
+
|
15
|
+
# pylint: disable=unused-import
|
16
|
+
from qiskit._accelerate.synthesis.linear import (
|
17
|
+
gauss_elimination,
|
18
|
+
gauss_elimination_with_perm,
|
19
|
+
compute_rank_after_gauss_elim,
|
20
|
+
compute_rank,
|
21
|
+
calc_inverse_matrix,
|
22
|
+
binary_matmul,
|
23
|
+
random_invertible_binary_matrix,
|
24
|
+
check_invertible_binary_matrix,
|
25
|
+
row_op,
|
26
|
+
col_op,
|
27
|
+
)
|
@@ -0,0 +1,17 @@
|
|
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 cnot-phase circuits"""
|
14
|
+
|
15
|
+
from .cz_depth_lnn import synth_cz_depth_line_mr
|
16
|
+
from .cx_cz_depth_lnn import synth_cx_cz_depth_line_my
|
17
|
+
from .cnot_phase_synth import synth_cnot_phase_aam
|
@@ -0,0 +1,206 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2019.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""
|
14
|
+
Implementation of the GraySynth algorithm for synthesizing CNOT-Phase
|
15
|
+
circuits with efficient CNOT cost, and the Patel-Hayes-Markov algorithm
|
16
|
+
for optimal synthesis of linear (CNOT-only) reversible circuits.
|
17
|
+
"""
|
18
|
+
from __future__ import annotations
|
19
|
+
|
20
|
+
import copy
|
21
|
+
import numpy as np
|
22
|
+
from qiskit.circuit import QuantumCircuit
|
23
|
+
from qiskit.exceptions import QiskitError
|
24
|
+
from qiskit.synthesis.linear import synth_cnot_count_full_pmh
|
25
|
+
|
26
|
+
|
27
|
+
def synth_cnot_phase_aam(
|
28
|
+
cnots: list[list[int]], angles: list[str], section_size: int = 2
|
29
|
+
) -> QuantumCircuit:
|
30
|
+
r"""This function is an implementation of the `GraySynth` algorithm of
|
31
|
+
Amy, Azimadeh and Mosca.
|
32
|
+
|
33
|
+
GraySynth is a heuristic algorithm from [1] for synthesizing small parity networks.
|
34
|
+
It is inspired by Gray codes. Given a set of binary strings :math:`S`
|
35
|
+
(called ``cnots`` bellow), the algorithm synthesizes a parity network for :math:`S` by
|
36
|
+
repeatedly choosing an index :math:`i` to expand and then effectively recursing on
|
37
|
+
the co-factors :math:`S_0` and :math:`S_1`, consisting of the strings :math:`y \in S`,
|
38
|
+
with :math:`y_i = 0` or :math:`1` respectively. As a subset :math:`S` is recursively expanded,
|
39
|
+
``cx`` gates are applied so that a designated target bit contains the
|
40
|
+
(partial) parity :math:`\chi_y(x)` where :math:`y_i = 1` if and only if :math:`y'_i = 1` for all
|
41
|
+
:math:`y' \in S`. If :math:`S` contains a single element :math:`\{y'\}`, then :math:`y = y'`,
|
42
|
+
and the target bit contains the value :math:`\chi_{y'}(x)` as desired.
|
43
|
+
|
44
|
+
Notably, rather than uncomputing this sequence of ``cx`` (CNOT) gates when a subset :math:`S`
|
45
|
+
is finished being synthesized, the algorithm maintains the invariant
|
46
|
+
that the remaining parities to be computed are expressed over the current state
|
47
|
+
of bits. This allows the algorithm to avoid the 'backtracking' inherent in
|
48
|
+
uncomputing-based methods.
|
49
|
+
|
50
|
+
The algorithm is described in detail in section 4 of [1].
|
51
|
+
|
52
|
+
Args:
|
53
|
+
cnots: A matrix whose columns are the parities to be synthesized
|
54
|
+
e.g.::
|
55
|
+
|
56
|
+
[[0, 1, 1, 1, 1, 1],
|
57
|
+
[1, 0, 0, 1, 1, 1],
|
58
|
+
[1, 0, 0, 1, 0, 0],
|
59
|
+
[0, 0, 1, 0, 1, 0]]
|
60
|
+
|
61
|
+
corresponds to::
|
62
|
+
|
63
|
+
x1^x2 + x0 + x0^x3 + x0^x1^x2 + x0^x1^x3 + x0^x1
|
64
|
+
|
65
|
+
angles: A list containing all the phase-shift gates which are
|
66
|
+
to be applied, in the same order as in ``cnots``. A number is
|
67
|
+
interpreted as the angle of :math:`p(angle)`, otherwise the elements
|
68
|
+
have to be ``'t'``, ``'tdg'``, ``'s'``, ``'sdg'`` or ``'z'``.
|
69
|
+
|
70
|
+
section_size: The size of every section in the Patel–Markov–Hayes algorithm.
|
71
|
+
``section_size`` must be a factor of the number of qubits.
|
72
|
+
|
73
|
+
Returns:
|
74
|
+
The decomposed quantum circuit.
|
75
|
+
|
76
|
+
Raises:
|
77
|
+
QiskitError: when dimensions of ``cnots`` and ``angles`` don't align.
|
78
|
+
|
79
|
+
References:
|
80
|
+
1. Matthew Amy, Parsiad Azimzadeh, and Michele Mosca.
|
81
|
+
*On the controlled-NOT complexity of controlled-NOT–phase circuits.*,
|
82
|
+
Quantum Science and Technology 4.1 (2018): 015002.
|
83
|
+
`arXiv:1712.01859 <https://arxiv.org/abs/1712.01859>`_
|
84
|
+
"""
|
85
|
+
num_qubits = len(cnots)
|
86
|
+
|
87
|
+
# Create a quantum circuit on num_qubits
|
88
|
+
qcir = QuantumCircuit(num_qubits)
|
89
|
+
|
90
|
+
if len(cnots[0]) != len(angles):
|
91
|
+
raise QiskitError('Size of "cnots" and "angles" do not match.')
|
92
|
+
|
93
|
+
range_list = list(range(num_qubits))
|
94
|
+
epsilon = num_qubits
|
95
|
+
sta = []
|
96
|
+
cnots_copy = np.transpose(np.array(copy.deepcopy(cnots)))
|
97
|
+
# This matrix keeps track of the state in the algorithm
|
98
|
+
state = np.eye(num_qubits).astype("int")
|
99
|
+
|
100
|
+
# Check if some phase-shift gates can be applied, before adding any C-NOT gates
|
101
|
+
for qubit in range(num_qubits):
|
102
|
+
index = 0
|
103
|
+
for icnots in cnots_copy:
|
104
|
+
if np.array_equal(icnots, state[qubit]):
|
105
|
+
if angles[index] == "t":
|
106
|
+
qcir.t(qubit)
|
107
|
+
elif angles[index] == "tdg":
|
108
|
+
qcir.tdg(qubit)
|
109
|
+
elif angles[index] == "s":
|
110
|
+
qcir.s(qubit)
|
111
|
+
elif angles[index] == "sdg":
|
112
|
+
qcir.sdg(qubit)
|
113
|
+
elif angles[index] == "z":
|
114
|
+
qcir.z(qubit)
|
115
|
+
else:
|
116
|
+
qcir.p(angles[index] % np.pi, qubit)
|
117
|
+
del angles[index]
|
118
|
+
cnots_copy = np.delete(cnots_copy, index, axis=0)
|
119
|
+
if index == len(cnots_copy):
|
120
|
+
break
|
121
|
+
index -= 1
|
122
|
+
index += 1
|
123
|
+
|
124
|
+
# Implementation of the pseudo-code (Algorithm 1) in the aforementioned paper
|
125
|
+
sta.append([cnots, range_list, epsilon])
|
126
|
+
while sta:
|
127
|
+
[cnots, ilist, qubit] = sta.pop()
|
128
|
+
if cnots == []:
|
129
|
+
continue
|
130
|
+
if 0 <= qubit < num_qubits:
|
131
|
+
condition = True
|
132
|
+
while condition:
|
133
|
+
condition = False
|
134
|
+
for j in range(num_qubits):
|
135
|
+
if (j != qubit) and (sum(cnots[j]) == len(cnots[j])):
|
136
|
+
condition = True
|
137
|
+
qcir.cx(j, qubit)
|
138
|
+
state[qubit] ^= state[j]
|
139
|
+
index = 0
|
140
|
+
for icnots in cnots_copy:
|
141
|
+
if np.array_equal(icnots, state[qubit]):
|
142
|
+
if angles[index] == "t":
|
143
|
+
qcir.t(qubit)
|
144
|
+
elif angles[index] == "tdg":
|
145
|
+
qcir.tdg(qubit)
|
146
|
+
elif angles[index] == "s":
|
147
|
+
qcir.s(qubit)
|
148
|
+
elif angles[index] == "sdg":
|
149
|
+
qcir.sdg(qubit)
|
150
|
+
elif angles[index] == "z":
|
151
|
+
qcir.z(qubit)
|
152
|
+
else:
|
153
|
+
qcir.p(angles[index] % np.pi, qubit)
|
154
|
+
del angles[index]
|
155
|
+
cnots_copy = np.delete(cnots_copy, index, axis=0)
|
156
|
+
if index == len(cnots_copy):
|
157
|
+
break
|
158
|
+
index -= 1
|
159
|
+
index += 1
|
160
|
+
for x in _remove_duplicates(sta + [[cnots, ilist, qubit]]):
|
161
|
+
[cnotsp, _, _] = x
|
162
|
+
if cnotsp == []:
|
163
|
+
continue
|
164
|
+
for ttt in range(len(cnotsp[j])):
|
165
|
+
cnotsp[j][ttt] ^= cnotsp[qubit][ttt]
|
166
|
+
if ilist == []:
|
167
|
+
continue
|
168
|
+
# See line 18 in pseudo-code of Algorithm 1 in the aforementioned paper
|
169
|
+
# this choice of j maximizes the size of the largest subset (S_0 or S_1)
|
170
|
+
# and the larger a subset, the closer it gets to the ideal in the
|
171
|
+
# Gray code of one CNOT per string.
|
172
|
+
j = ilist[np.argmax([[max(row.count(0), row.count(1)) for row in cnots][k] for k in ilist])]
|
173
|
+
cnots0 = []
|
174
|
+
cnots1 = []
|
175
|
+
for y in list(map(list, zip(*cnots))):
|
176
|
+
if y[j] == 0:
|
177
|
+
cnots0.append(y)
|
178
|
+
elif y[j] == 1:
|
179
|
+
cnots1.append(y)
|
180
|
+
cnots0 = list(map(list, zip(*cnots0)))
|
181
|
+
cnots1 = list(map(list, zip(*cnots1)))
|
182
|
+
if qubit == epsilon:
|
183
|
+
sta.append([cnots1, list(set(ilist).difference([j])), j])
|
184
|
+
else:
|
185
|
+
sta.append([cnots1, list(set(ilist).difference([j])), qubit])
|
186
|
+
sta.append([cnots0, list(set(ilist).difference([j])), qubit])
|
187
|
+
qcir &= synth_cnot_count_full_pmh(state, section_size).inverse()
|
188
|
+
return qcir
|
189
|
+
|
190
|
+
|
191
|
+
def _remove_duplicates(lists):
|
192
|
+
"""
|
193
|
+
Remove duplicates in list
|
194
|
+
|
195
|
+
Args:
|
196
|
+
lists (list): a list which may contain duplicate elements.
|
197
|
+
|
198
|
+
Returns:
|
199
|
+
list: a list which contains only unique elements.
|
200
|
+
"""
|
201
|
+
|
202
|
+
unique_list = []
|
203
|
+
for element in lists:
|
204
|
+
if element not in unique_list:
|
205
|
+
unique_list.append(element)
|
206
|
+
return unique_list
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2023-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
|
+
"""
|
14
|
+
Given -CZ-CX- transformation (a layer consisting only CNOT gates
|
15
|
+
followed by a layer consisting only CZ gates)
|
16
|
+
Return a depth-5n circuit implementation of the -CZ-CX- transformation over LNN.
|
17
|
+
|
18
|
+
Args:
|
19
|
+
mat_z: n*n symmetric binary matrix representing a -CZ- circuit
|
20
|
+
mat_x: n*n invertable binary matrix representing a -CX- transformation
|
21
|
+
|
22
|
+
Output:
|
23
|
+
QuantumCircuit: :class:`.QuantumCircuit` object containing a depth-5n circuit to implement -CZ-CX-
|
24
|
+
|
25
|
+
References:
|
26
|
+
[1] S. A. Kutin, D. P. Moulton, and L. M. Smithline, "Computation at a distance," 2007.
|
27
|
+
[2] D. Maslov and W. Yang, "CNOT circuits need little help to implement arbitrary
|
28
|
+
Hadamard-free Clifford transformations they generate," 2022.
|
29
|
+
"""
|
30
|
+
|
31
|
+
import numpy as np
|
32
|
+
from qiskit.circuit import QuantumCircuit
|
33
|
+
from qiskit._accelerate.synthesis.linear_phase import py_synth_cx_cz_depth_line_my
|
34
|
+
|
35
|
+
|
36
|
+
def synth_cx_cz_depth_line_my(mat_x: np.ndarray, mat_z: np.ndarray) -> QuantumCircuit:
|
37
|
+
"""
|
38
|
+
Joint synthesis of a -CZ-CX- circuit for linear nearest neighbor (LNN) connectivity,
|
39
|
+
with 2-qubit depth at most 5n, based on Maslov and Yang.
|
40
|
+
This method computes the CZ circuit inside the CX circuit via phase gate insertions.
|
41
|
+
|
42
|
+
Args:
|
43
|
+
mat_z : a boolean symmetric matrix representing a CZ circuit.
|
44
|
+
``mat_z[i][j]=1`` represents a ``cz(i,j)`` gate
|
45
|
+
|
46
|
+
mat_x : a boolean invertible matrix representing a CX circuit.
|
47
|
+
|
48
|
+
Returns:
|
49
|
+
A circuit implementation of a CX circuit following a CZ circuit,
|
50
|
+
denoted as a -CZ-CX- circuit,in two-qubit depth at most ``5n``, for LNN connectivity.
|
51
|
+
|
52
|
+
References:
|
53
|
+
1. Kutin, S., Moulton, D. P., Smithline, L.,
|
54
|
+
*Computation at a distance*, Chicago J. Theor. Comput. Sci., vol. 2007, (2007),
|
55
|
+
`arXiv:quant-ph/0701194 <https://arxiv.org/abs/quant-ph/0701194>`_
|
56
|
+
2. Dmitri Maslov, Willers Yang, *CNOT circuits need little help to implement arbitrary
|
57
|
+
Hadamard-free Clifford transformations they generate*,
|
58
|
+
`arXiv:2210.16195 <https://arxiv.org/abs/2210.16195>`_.
|
59
|
+
"""
|
60
|
+
circuit_data = py_synth_cx_cz_depth_line_my(mat_x.astype(bool), mat_z.astype(bool))
|
61
|
+
return QuantumCircuit._from_circuit_data(circuit_data, add_regs=True)
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2023
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""
|
14
|
+
Synthesis of an n-qubit circuit containing only CZ gates for
|
15
|
+
linear nearest neighbor (LNN) connectivity, using CX and phase (S, Sdg or Z) gates.
|
16
|
+
The two-qubit depth of the circuit is bounded by 2*n+2.
|
17
|
+
This algorithm reverts the order of qubits.
|
18
|
+
|
19
|
+
References:
|
20
|
+
[1]: Dmitri Maslov, Martin Roetteler,
|
21
|
+
Shorter stabilizer circuits via Bruhat decomposition and quantum circuit transformations,
|
22
|
+
`arXiv:1705.09176 <https://arxiv.org/abs/1705.09176>`_.
|
23
|
+
"""
|
24
|
+
|
25
|
+
import numpy as np
|
26
|
+
from qiskit.circuit import QuantumCircuit
|
27
|
+
|
28
|
+
from qiskit._accelerate.synthesis.linear_phase import (
|
29
|
+
synth_cz_depth_line_mr as synth_cz_depth_line_mr_inner,
|
30
|
+
)
|
31
|
+
|
32
|
+
|
33
|
+
def synth_cz_depth_line_mr(mat: np.ndarray) -> QuantumCircuit:
|
34
|
+
r"""Synthesis of a CZ circuit for linear nearest neighbor (LNN) connectivity,
|
35
|
+
based on Maslov and Roetteler.
|
36
|
+
|
37
|
+
Note that this method *reverts* the order of qubits in the circuit,
|
38
|
+
and returns a circuit containing :class:`.CXGate`\s and phase gates
|
39
|
+
(:class:`.SGate`, :class:`.SdgGate` or :class:`.ZGate`).
|
40
|
+
|
41
|
+
Args:
|
42
|
+
mat: an upper-diagonal matrix representing the CZ circuit.
|
43
|
+
``mat[i][j]=1 for i<j`` represents a ``cz(i,j)`` gate
|
44
|
+
|
45
|
+
Returns:
|
46
|
+
A circuit implementation of the CZ circuit of depth :math:`2n+2` for LNN
|
47
|
+
connectivity.
|
48
|
+
|
49
|
+
References:
|
50
|
+
1. Dmitri Maslov, Martin Roetteler,
|
51
|
+
*Shorter stabilizer circuits via Bruhat decomposition and quantum circuit transformations*,
|
52
|
+
`arXiv:1705.09176 <https://arxiv.org/abs/1705.09176>`_.
|
53
|
+
"""
|
54
|
+
|
55
|
+
# Call Rust implementaton
|
56
|
+
return QuantumCircuit._from_circuit_data(
|
57
|
+
synth_cz_depth_line_mr_inner(mat.astype(bool)), add_regs=True
|
58
|
+
)
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2024.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Module containing multi-controlled circuits synthesis"""
|
14
|
+
|
15
|
+
from .mcmt_vchain import synth_mcmt_vchain
|
16
|
+
from .mcx_synthesis import (
|
17
|
+
synth_mcx_n_dirty_i15,
|
18
|
+
synth_mcx_n_clean_m15,
|
19
|
+
synth_mcx_1_clean_b95,
|
20
|
+
synth_mcx_gray_code,
|
21
|
+
synth_mcx_noaux_v24,
|
22
|
+
synth_c3x,
|
23
|
+
synth_c4x,
|
24
|
+
)
|
25
|
+
from .multi_control_rotation_gates import _apply_cu, _apply_mcu_graycode, _mcsu2_real_diagonal
|