qiskit 2.1.0rc1__cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -0
- qiskit/__init__.py +159 -0
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +73 -0
- qiskit/circuit/__init__.py +1335 -0
- qiskit/circuit/_add_control.py +338 -0
- qiskit/circuit/_classical_resource_map.py +154 -0
- qiskit/circuit/_standard_gates_commutations.py +3849 -0
- qiskit/circuit/_utils.py +167 -0
- qiskit/circuit/annotated_operation.py +279 -0
- qiskit/circuit/annotation.py +404 -0
- qiskit/circuit/barrier.py +46 -0
- qiskit/circuit/classical/__init__.py +41 -0
- qiskit/circuit/classical/expr/__init__.py +266 -0
- qiskit/circuit/classical/expr/constructors.py +764 -0
- qiskit/circuit/classical/expr/expr.py +156 -0
- qiskit/circuit/classical/expr/visitors.py +381 -0
- qiskit/circuit/classical/types/__init__.py +113 -0
- qiskit/circuit/classical/types/ordering.py +229 -0
- qiskit/circuit/classical/types/types.py +30 -0
- qiskit/circuit/commutation_checker.py +133 -0
- qiskit/circuit/commutation_library.py +20 -0
- qiskit/circuit/controlflow/__init__.py +59 -0
- qiskit/circuit/controlflow/_builder_utils.py +211 -0
- qiskit/circuit/controlflow/box.py +188 -0
- qiskit/circuit/controlflow/break_loop.py +56 -0
- qiskit/circuit/controlflow/builder.py +791 -0
- qiskit/circuit/controlflow/continue_loop.py +56 -0
- qiskit/circuit/controlflow/control_flow.py +94 -0
- qiskit/circuit/controlflow/for_loop.py +218 -0
- qiskit/circuit/controlflow/if_else.py +498 -0
- qiskit/circuit/controlflow/switch_case.py +411 -0
- qiskit/circuit/controlflow/while_loop.py +166 -0
- qiskit/circuit/controlledgate.py +274 -0
- qiskit/circuit/delay.py +159 -0
- qiskit/circuit/duration.py +80 -0
- qiskit/circuit/equivalence.py +94 -0
- qiskit/circuit/equivalence_library.py +18 -0
- qiskit/circuit/exceptions.py +19 -0
- qiskit/circuit/gate.py +261 -0
- qiskit/circuit/instruction.py +564 -0
- qiskit/circuit/instructionset.py +132 -0
- qiskit/circuit/library/__init__.py +984 -0
- qiskit/circuit/library/arithmetic/__init__.py +40 -0
- qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +235 -0
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +131 -0
- qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
- qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -0
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +201 -0
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +506 -0
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +395 -0
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +501 -0
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
- qiskit/circuit/library/arithmetic/quadratic_form.py +370 -0
- qiskit/circuit/library/arithmetic/weighted_adder.py +428 -0
- qiskit/circuit/library/basis_change/__init__.py +15 -0
- qiskit/circuit/library/basis_change/qft.py +316 -0
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +322 -0
- qiskit/circuit/library/boolean_logic/__init__.py +18 -0
- qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
- qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
- qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
- qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -0
- qiskit/circuit/library/data_preparation/__init__.py +57 -0
- qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
- qiskit/circuit/library/data_preparation/initializer.py +107 -0
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
- qiskit/circuit/library/fourier_checking.py +160 -0
- qiskit/circuit/library/generalized_gates/__init__.py +30 -0
- qiskit/circuit/library/generalized_gates/diagonal.py +163 -0
- qiskit/circuit/library/generalized_gates/gms.py +179 -0
- qiskit/circuit/library/generalized_gates/gr.py +219 -0
- qiskit/circuit/library/generalized_gates/isometry.py +370 -0
- qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
- qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
- qiskit/circuit/library/generalized_gates/pauli.py +84 -0
- qiskit/circuit/library/generalized_gates/permutation.py +202 -0
- qiskit/circuit/library/generalized_gates/rv.py +96 -0
- qiskit/circuit/library/generalized_gates/uc.py +303 -0
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
- qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
- qiskit/circuit/library/generalized_gates/ucry.py +32 -0
- qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
- qiskit/circuit/library/generalized_gates/unitary.py +236 -0
- qiskit/circuit/library/graph_state.py +172 -0
- qiskit/circuit/library/grover_operator.py +583 -0
- qiskit/circuit/library/hamiltonian_gate.py +142 -0
- qiskit/circuit/library/hidden_linear_function.py +163 -0
- qiskit/circuit/library/iqp.py +180 -0
- qiskit/circuit/library/n_local/__init__.py +45 -0
- qiskit/circuit/library/n_local/efficient_su2.py +282 -0
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +301 -0
- qiskit/circuit/library/n_local/n_local.py +1478 -0
- qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
- qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
- qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
- qiskit/circuit/library/n_local/two_local.py +289 -0
- qiskit/circuit/library/overlap.py +183 -0
- qiskit/circuit/library/pauli_evolution.py +202 -0
- qiskit/circuit/library/phase_estimation.py +177 -0
- qiskit/circuit/library/phase_oracle.py +239 -0
- qiskit/circuit/library/quantum_volume.py +179 -0
- qiskit/circuit/library/standard_gates/__init__.py +141 -0
- qiskit/circuit/library/standard_gates/dcx.py +76 -0
- qiskit/circuit/library/standard_gates/ecr.py +126 -0
- qiskit/circuit/library/standard_gates/equivalence_library.py +1936 -0
- qiskit/circuit/library/standard_gates/global_phase.py +83 -0
- qiskit/circuit/library/standard_gates/h.py +230 -0
- qiskit/circuit/library/standard_gates/i.py +76 -0
- qiskit/circuit/library/standard_gates/iswap.py +115 -0
- qiskit/circuit/library/standard_gates/p.py +415 -0
- qiskit/circuit/library/standard_gates/r.py +108 -0
- qiskit/circuit/library/standard_gates/rx.py +269 -0
- qiskit/circuit/library/standard_gates/rxx.py +165 -0
- qiskit/circuit/library/standard_gates/ry.py +268 -0
- qiskit/circuit/library/standard_gates/ryy.py +165 -0
- qiskit/circuit/library/standard_gates/rz.py +290 -0
- qiskit/circuit/library/standard_gates/rzx.py +211 -0
- qiskit/circuit/library/standard_gates/rzz.py +181 -0
- qiskit/circuit/library/standard_gates/s.py +424 -0
- qiskit/circuit/library/standard_gates/swap.py +268 -0
- qiskit/circuit/library/standard_gates/sx.py +303 -0
- qiskit/circuit/library/standard_gates/t.py +169 -0
- qiskit/circuit/library/standard_gates/u.py +379 -0
- qiskit/circuit/library/standard_gates/u1.py +466 -0
- qiskit/circuit/library/standard_gates/u2.py +145 -0
- qiskit/circuit/library/standard_gates/u3.py +412 -0
- qiskit/circuit/library/standard_gates/x.py +1335 -0
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +164 -0
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +197 -0
- qiskit/circuit/library/standard_gates/y.py +253 -0
- qiskit/circuit/library/standard_gates/z.py +331 -0
- qiskit/circuit/library/templates/__init__.py +92 -0
- qiskit/circuit/library/templates/clifford/__init__.py +33 -0
- qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
- qiskit/circuit/library/templates/nct/__init__.py +67 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
- qiskit/circuit/library/templates/rzx/__init__.py +25 -0
- qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
- qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
- qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
- qiskit/circuit/measure.py +53 -0
- qiskit/circuit/operation.py +68 -0
- qiskit/circuit/parameter.py +188 -0
- qiskit/circuit/parameterexpression.py +737 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +140 -0
- qiskit/circuit/quantumcircuit.py +7610 -0
- qiskit/circuit/quantumcircuitdata.py +137 -0
- qiskit/circuit/random/__init__.py +50 -0
- qiskit/circuit/random/utils.py +755 -0
- qiskit/circuit/reset.py +37 -0
- qiskit/circuit/singleton.py +600 -0
- qiskit/circuit/store.py +89 -0
- qiskit/circuit/tools/__init__.py +16 -0
- qiskit/circuit/tools/pi_check.py +185 -0
- qiskit/circuit/twirling.py +145 -0
- qiskit/compiler/__init__.py +27 -0
- qiskit/compiler/transpiler.py +375 -0
- qiskit/converters/__init__.py +74 -0
- qiskit/converters/circuit_to_dag.py +80 -0
- qiskit/converters/circuit_to_dagdependency.py +49 -0
- qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
- qiskit/converters/circuit_to_gate.py +107 -0
- qiskit/converters/circuit_to_instruction.py +142 -0
- qiskit/converters/dag_to_circuit.py +79 -0
- qiskit/converters/dag_to_dagdependency.py +54 -0
- qiskit/converters/dag_to_dagdependency_v2.py +43 -0
- qiskit/converters/dagdependency_to_circuit.py +40 -0
- qiskit/converters/dagdependency_to_dag.py +48 -0
- qiskit/dagcircuit/__init__.py +44 -0
- qiskit/dagcircuit/collect_blocks.py +403 -0
- qiskit/dagcircuit/dagcircuit.py +24 -0
- qiskit/dagcircuit/dagdependency.py +612 -0
- qiskit/dagcircuit/dagdependency_v2.py +566 -0
- qiskit/dagcircuit/dagdepnode.py +160 -0
- qiskit/dagcircuit/dagnode.py +193 -0
- qiskit/dagcircuit/exceptions.py +42 -0
- qiskit/exceptions.py +153 -0
- qiskit/passmanager/__init__.py +258 -0
- qiskit/passmanager/base_tasks.py +230 -0
- qiskit/passmanager/compilation_status.py +74 -0
- qiskit/passmanager/exceptions.py +19 -0
- qiskit/passmanager/flow_controllers.py +116 -0
- qiskit/passmanager/passmanager.py +353 -0
- qiskit/primitives/__init__.py +490 -0
- qiskit/primitives/backend_estimator_v2.py +530 -0
- qiskit/primitives/backend_sampler_v2.py +339 -0
- qiskit/primitives/base/__init__.py +20 -0
- qiskit/primitives/base/base_estimator.py +247 -0
- qiskit/primitives/base/base_primitive_job.py +78 -0
- qiskit/primitives/base/base_primitive_v1.py +45 -0
- qiskit/primitives/base/base_result_v1.py +65 -0
- qiskit/primitives/base/base_sampler.py +196 -0
- qiskit/primitives/base/estimator_result_v1.py +46 -0
- qiskit/primitives/base/sampler_result_v1.py +45 -0
- qiskit/primitives/base/validation_v1.py +250 -0
- qiskit/primitives/containers/__init__.py +26 -0
- qiskit/primitives/containers/bindings_array.py +391 -0
- qiskit/primitives/containers/bit_array.py +764 -0
- qiskit/primitives/containers/data_bin.py +172 -0
- qiskit/primitives/containers/estimator_pub.py +222 -0
- qiskit/primitives/containers/object_array.py +94 -0
- qiskit/primitives/containers/observables_array.py +380 -0
- qiskit/primitives/containers/primitive_result.py +53 -0
- qiskit/primitives/containers/pub_result.py +51 -0
- qiskit/primitives/containers/sampler_pub.py +193 -0
- qiskit/primitives/containers/sampler_pub_result.py +74 -0
- qiskit/primitives/containers/shape.py +129 -0
- qiskit/primitives/primitive_job.py +100 -0
- qiskit/primitives/statevector_estimator.py +175 -0
- qiskit/primitives/statevector_sampler.py +290 -0
- qiskit/primitives/utils.py +72 -0
- qiskit/providers/__init__.py +677 -0
- qiskit/providers/backend.py +364 -0
- qiskit/providers/basic_provider/__init__.py +47 -0
- qiskit/providers/basic_provider/basic_provider.py +121 -0
- qiskit/providers/basic_provider/basic_provider_job.py +65 -0
- qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
- qiskit/providers/basic_provider/basic_simulator.py +693 -0
- qiskit/providers/basic_provider/exceptions.py +30 -0
- qiskit/providers/exceptions.py +33 -0
- qiskit/providers/fake_provider/__init__.py +69 -0
- qiskit/providers/fake_provider/generic_backend_v2.py +376 -0
- qiskit/providers/fake_provider/utils/__init__.py +15 -0
- qiskit/providers/job.py +147 -0
- qiskit/providers/jobstatus.py +30 -0
- qiskit/providers/options.py +273 -0
- qiskit/providers/providerutils.py +110 -0
- qiskit/qasm/libs/dummy/stdgates.inc +75 -0
- qiskit/qasm/libs/qelib1.inc +266 -0
- qiskit/qasm/libs/stdgates.inc +82 -0
- qiskit/qasm2/__init__.py +669 -0
- qiskit/qasm2/exceptions.py +27 -0
- qiskit/qasm2/export.py +364 -0
- qiskit/qasm2/parse.py +438 -0
- qiskit/qasm3/__init__.py +466 -0
- qiskit/qasm3/ast.py +796 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1363 -0
- qiskit/qasm3/printer.py +620 -0
- qiskit/qpy/__init__.py +2141 -0
- qiskit/qpy/binary_io/__init__.py +35 -0
- qiskit/qpy/binary_io/circuits.py +1687 -0
- qiskit/qpy/binary_io/parse_sympy_repr.py +126 -0
- qiskit/qpy/binary_io/schedules.py +288 -0
- qiskit/qpy/binary_io/value.py +1183 -0
- qiskit/qpy/common.py +361 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +458 -0
- qiskit/qpy/interface.py +384 -0
- qiskit/qpy/type_keys.py +415 -0
- qiskit/quantum_info/__init__.py +172 -0
- qiskit/quantum_info/analysis/__init__.py +17 -0
- qiskit/quantum_info/analysis/average.py +47 -0
- qiskit/quantum_info/analysis/distance.py +104 -0
- qiskit/quantum_info/analysis/make_observable.py +44 -0
- qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
- qiskit/quantum_info/operators/__init__.py +29 -0
- qiskit/quantum_info/operators/base_operator.py +145 -0
- qiskit/quantum_info/operators/channel/__init__.py +29 -0
- qiskit/quantum_info/operators/channel/chi.py +191 -0
- qiskit/quantum_info/operators/channel/choi.py +218 -0
- qiskit/quantum_info/operators/channel/kraus.py +337 -0
- qiskit/quantum_info/operators/channel/ptm.py +204 -0
- qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
- qiskit/quantum_info/operators/channel/stinespring.py +296 -0
- qiskit/quantum_info/operators/channel/superop.py +373 -0
- qiskit/quantum_info/operators/channel/transformations.py +490 -0
- qiskit/quantum_info/operators/custom_iterator.py +48 -0
- qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
- qiskit/quantum_info/operators/dihedral/dihedral.py +511 -0
- qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
- qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
- qiskit/quantum_info/operators/dihedral/random.py +64 -0
- qiskit/quantum_info/operators/linear_op.py +25 -0
- qiskit/quantum_info/operators/measures.py +418 -0
- qiskit/quantum_info/operators/mixins/__init__.py +52 -0
- qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
- qiskit/quantum_info/operators/mixins/group.py +171 -0
- qiskit/quantum_info/operators/mixins/linear.py +84 -0
- qiskit/quantum_info/operators/mixins/multiply.py +62 -0
- qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
- qiskit/quantum_info/operators/op_shape.py +525 -0
- qiskit/quantum_info/operators/operator.py +869 -0
- qiskit/quantum_info/operators/operator_utils.py +76 -0
- qiskit/quantum_info/operators/predicates.py +183 -0
- qiskit/quantum_info/operators/random.py +154 -0
- qiskit/quantum_info/operators/scalar_op.py +254 -0
- qiskit/quantum_info/operators/symplectic/__init__.py +24 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
- qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +584 -0
- qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
- qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -0
- qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
- qiskit/quantum_info/operators/symplectic/random.py +117 -0
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1239 -0
- qiskit/quantum_info/operators/utils/__init__.py +20 -0
- qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
- qiskit/quantum_info/operators/utils/commutator.py +36 -0
- qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
- qiskit/quantum_info/quaternion.py +156 -0
- qiskit/quantum_info/random.py +26 -0
- qiskit/quantum_info/states/__init__.py +28 -0
- qiskit/quantum_info/states/densitymatrix.py +857 -0
- qiskit/quantum_info/states/measures.py +288 -0
- qiskit/quantum_info/states/quantum_state.py +503 -0
- qiskit/quantum_info/states/random.py +157 -0
- qiskit/quantum_info/states/stabilizerstate.py +805 -0
- qiskit/quantum_info/states/statevector.py +977 -0
- qiskit/quantum_info/states/utils.py +247 -0
- qiskit/result/__init__.py +61 -0
- qiskit/result/counts.py +189 -0
- qiskit/result/distributions/__init__.py +17 -0
- qiskit/result/distributions/probability.py +100 -0
- qiskit/result/distributions/quasi.py +154 -0
- qiskit/result/exceptions.py +40 -0
- qiskit/result/models.py +241 -0
- qiskit/result/postprocess.py +239 -0
- qiskit/result/result.py +385 -0
- qiskit/result/sampled_expval.py +76 -0
- qiskit/result/utils.py +294 -0
- qiskit/synthesis/__init__.py +250 -0
- qiskit/synthesis/arithmetic/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +18 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +107 -0
- qiskit/synthesis/arithmetic/adders/rv_ripple_carry_adder.py +156 -0
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
- qiskit/synthesis/arithmetic/comparators/__init__.py +16 -0
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/synthesis/boolean/__init__.py +13 -0
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/clifford/__init__.py +19 -0
- qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
- qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
- qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
- qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
- qiskit/synthesis/cnotdihedral/__init__.py +17 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
- qiskit/synthesis/discrete_basis/__init__.py +16 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +53 -0
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +280 -0
- qiskit/synthesis/evolution/__init__.py +21 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +123 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +316 -0
- qiskit/synthesis/evolution/qdrift.py +133 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +227 -0
- qiskit/synthesis/linear/__init__.py +26 -0
- qiskit/synthesis/linear/cnot_synth.py +69 -0
- qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
- qiskit/synthesis/linear/linear_depth_lnn.py +61 -0
- qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
- qiskit/synthesis/linear_phase/__init__.py +17 -0
- qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +61 -0
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
- qiskit/synthesis/multi_controlled/__init__.py +29 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +583 -0
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +205 -0
- qiskit/synthesis/one_qubit/__init__.py +15 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
- qiskit/synthesis/permutation/__init__.py +18 -0
- qiskit/synthesis/permutation/permutation_full.py +78 -0
- qiskit/synthesis/permutation/permutation_lnn.py +54 -0
- qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
- qiskit/synthesis/permutation/permutation_utils.py +16 -0
- qiskit/synthesis/qft/__init__.py +16 -0
- qiskit/synthesis/qft/qft_decompose_full.py +97 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +61 -0
- qiskit/synthesis/stabilizer/__init__.py +16 -0
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
- qiskit/synthesis/two_qubit/__init__.py +20 -0
- qiskit/synthesis/two_qubit/local_invariance.py +63 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +583 -0
- qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
- qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
- qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
- qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
- qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
- qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
- qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
- qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
- qiskit/synthesis/unitary/__init__.py +13 -0
- qiskit/synthesis/unitary/aqc/__init__.py +177 -0
- qiskit/synthesis/unitary/aqc/approximate.py +116 -0
- qiskit/synthesis/unitary/aqc/aqc.py +175 -0
- qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
- qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
- qiskit/synthesis/unitary/qsd.py +359 -0
- qiskit/transpiler/__init__.py +1352 -0
- qiskit/transpiler/basepasses.py +190 -0
- qiskit/transpiler/coupling.py +500 -0
- qiskit/transpiler/exceptions.py +59 -0
- qiskit/transpiler/instruction_durations.py +263 -0
- qiskit/transpiler/layout.py +740 -0
- qiskit/transpiler/passes/__init__.py +278 -0
- qiskit/transpiler/passes/analysis/__init__.py +23 -0
- qiskit/transpiler/passes/analysis/count_ops.py +30 -0
- qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
- qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
- qiskit/transpiler/passes/analysis/depth.py +33 -0
- qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
- qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
- qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
- qiskit/transpiler/passes/analysis/size.py +36 -0
- qiskit/transpiler/passes/analysis/width.py +27 -0
- qiskit/transpiler/passes/basis/__init__.py +19 -0
- qiskit/transpiler/passes/basis/basis_translator.py +138 -0
- qiskit/transpiler/passes/basis/decompose.py +137 -0
- qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +84 -0
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +110 -0
- qiskit/transpiler/passes/layout/__init__.py +26 -0
- qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
- qiskit/transpiler/passes/layout/apply_layout.py +128 -0
- qiskit/transpiler/passes/layout/csp_layout.py +132 -0
- qiskit/transpiler/passes/layout/dense_layout.py +197 -0
- qiskit/transpiler/passes/layout/disjoint_utils.py +54 -0
- qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +116 -0
- qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
- qiskit/transpiler/passes/layout/sabre_layout.py +525 -0
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
- qiskit/transpiler/passes/layout/set_layout.py +69 -0
- qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
- qiskit/transpiler/passes/layout/vf2_layout.py +292 -0
- qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
- qiskit/transpiler/passes/layout/vf2_utils.py +245 -0
- qiskit/transpiler/passes/optimization/__init__.py +42 -0
- qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
- qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
- qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +117 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +109 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +85 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +242 -0
- qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
- qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
- qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +176 -0
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
- qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +267 -0
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +251 -0
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
- qiskit/transpiler/passes/optimization/optimize_annotated.py +449 -0
- qiskit/transpiler/passes/optimization/optimize_clifford_t.py +68 -0
- qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
- qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
- qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
- qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +70 -0
- qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -0
- qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
- qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
- qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +633 -0
- qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
- qiskit/transpiler/passes/routing/__init__.py +21 -0
- qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
- qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
- qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
- qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
- qiskit/transpiler/passes/routing/basic_swap.py +166 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +397 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
- qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
- qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
- qiskit/transpiler/passes/routing/sabre_swap.py +465 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +433 -0
- qiskit/transpiler/passes/routing/utils.py +35 -0
- qiskit/transpiler/passes/scheduling/__init__.py +21 -0
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
- qiskit/transpiler/passes/scheduling/padding/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
- qiskit/transpiler/passes/scheduling/padding/context_aware_dynamical_decoupling.py +876 -0
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
- qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
- qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
- qiskit/transpiler/passes/synthesis/__init__.py +21 -0
- qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
- qiskit/transpiler/passes/synthesis/clifford_unitary_synth_plugin.py +123 -0
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
- qiskit/transpiler/passes/synthesis/hls_plugins.py +2338 -0
- qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
- qiskit/transpiler/passes/synthesis/plugin.py +738 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +318 -0
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
- qiskit/transpiler/passes/utils/__init__.py +32 -0
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
- qiskit/transpiler/passes/utils/check_gate_direction.py +60 -0
- qiskit/transpiler/passes/utils/check_map.py +78 -0
- qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
- qiskit/transpiler/passes/utils/control_flow.py +61 -0
- qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
- qiskit/transpiler/passes/utils/error.py +69 -0
- qiskit/transpiler/passes/utils/filter_op_nodes.py +66 -0
- qiskit/transpiler/passes/utils/fixed_point.py +48 -0
- qiskit/transpiler/passes/utils/gate_direction.py +93 -0
- qiskit/transpiler/passes/utils/gates_basis.py +51 -0
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
- qiskit/transpiler/passes/utils/minimum_point.py +118 -0
- qiskit/transpiler/passes/utils/remove_barriers.py +50 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
- qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
- qiskit/transpiler/passmanager.py +503 -0
- qiskit/transpiler/passmanager_config.py +154 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1114 -0
- qiskit/transpiler/preset_passmanagers/common.py +773 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +443 -0
- qiskit/transpiler/preset_passmanagers/level0.py +104 -0
- qiskit/transpiler/preset_passmanagers/level1.py +108 -0
- qiskit/transpiler/preset_passmanagers/level2.py +109 -0
- qiskit/transpiler/preset_passmanagers/level3.py +110 -0
- qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
- qiskit/transpiler/target.py +905 -0
- qiskit/transpiler/timing_constraints.py +59 -0
- qiskit/user_config.py +266 -0
- qiskit/utils/__init__.py +90 -0
- qiskit/utils/classtools.py +146 -0
- qiskit/utils/deprecation.py +382 -0
- qiskit/utils/lazy_tester.py +363 -0
- qiskit/utils/optionals.py +355 -0
- qiskit/utils/parallel.py +318 -0
- qiskit/utils/units.py +146 -0
- qiskit/version.py +84 -0
- qiskit/visualization/__init__.py +290 -0
- qiskit/visualization/array.py +207 -0
- qiskit/visualization/bloch.py +778 -0
- qiskit/visualization/circuit/__init__.py +15 -0
- qiskit/visualization/circuit/_utils.py +677 -0
- qiskit/visualization/circuit/circuit_visualization.py +735 -0
- qiskit/visualization/circuit/latex.py +668 -0
- qiskit/visualization/circuit/matplotlib.py +2041 -0
- qiskit/visualization/circuit/qcstyle.py +130 -0
- qiskit/visualization/circuit/styles/__init__.py +13 -0
- qiskit/visualization/circuit/styles/bw.json +202 -0
- qiskit/visualization/circuit/styles/clifford.json +202 -0
- qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
- qiskit/visualization/circuit/styles/iqp.json +214 -0
- qiskit/visualization/circuit/styles/textbook.json +202 -0
- qiskit/visualization/circuit/text.py +1849 -0
- qiskit/visualization/circuit_visualization.py +19 -0
- qiskit/visualization/counts_visualization.py +487 -0
- qiskit/visualization/dag/__init__.py +13 -0
- qiskit/visualization/dag/dagstyle.py +103 -0
- qiskit/visualization/dag/styles/__init__.py +13 -0
- qiskit/visualization/dag/styles/color.json +10 -0
- qiskit/visualization/dag/styles/plain.json +5 -0
- qiskit/visualization/dag_visualization.py +389 -0
- qiskit/visualization/exceptions.py +21 -0
- qiskit/visualization/gate_map.py +1424 -0
- qiskit/visualization/library.py +40 -0
- qiskit/visualization/pass_manager_visualization.py +312 -0
- qiskit/visualization/state_visualization.py +1546 -0
- qiskit/visualization/style.py +223 -0
- qiskit/visualization/timeline/__init__.py +21 -0
- qiskit/visualization/timeline/core.py +495 -0
- qiskit/visualization/timeline/drawings.py +260 -0
- qiskit/visualization/timeline/generators.py +506 -0
- qiskit/visualization/timeline/interface.py +444 -0
- qiskit/visualization/timeline/layouts.py +115 -0
- qiskit/visualization/timeline/plotters/__init__.py +16 -0
- qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
- qiskit/visualization/timeline/plotters/matplotlib.py +195 -0
- qiskit/visualization/timeline/stylesheet.py +301 -0
- qiskit/visualization/timeline/types.py +148 -0
- qiskit/visualization/transition_visualization.py +369 -0
- qiskit/visualization/utils.py +49 -0
- qiskit-2.1.0rc1.dist-info/METADATA +221 -0
- qiskit-2.1.0rc1.dist-info/RECORD +699 -0
- qiskit-2.1.0rc1.dist-info/WHEEL +6 -0
- qiskit-2.1.0rc1.dist-info/entry_points.txt +88 -0
- qiskit-2.1.0rc1.dist-info/licenses/LICENSE.txt +203 -0
- qiskit-2.1.0rc1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,511 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2019, 2021.
|
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
|
+
CNOTDihedral operator class.
|
15
|
+
"""
|
16
|
+
from __future__ import annotations
|
17
|
+
import itertools
|
18
|
+
import numpy as np
|
19
|
+
|
20
|
+
from qiskit.exceptions import QiskitError
|
21
|
+
from qiskit.quantum_info.operators.base_operator import BaseOperator
|
22
|
+
from qiskit.quantum_info.operators.operator import Operator
|
23
|
+
from qiskit.quantum_info.operators.symplectic.pauli import Pauli
|
24
|
+
from qiskit.quantum_info.operators.scalar_op import ScalarOp
|
25
|
+
from qiskit.quantum_info.operators.mixins import generate_apidocs, AdjointMixin
|
26
|
+
from qiskit.circuit import QuantumCircuit, Instruction
|
27
|
+
from .dihedral_circuits import _append_circuit
|
28
|
+
from .polynomial import SpecialPolynomial
|
29
|
+
|
30
|
+
|
31
|
+
class CNOTDihedral(BaseOperator, AdjointMixin):
|
32
|
+
"""An N-qubit operator from the CNOT-Dihedral group.
|
33
|
+
|
34
|
+
The CNOT-Dihedral group is generated by the quantum gates,
|
35
|
+
:class:`~qiskit.circuit.library.CXGate`, :class:`~qiskit.circuit.library.TGate`,
|
36
|
+
and :class:`~qiskit.circuit.library.XGate`.
|
37
|
+
|
38
|
+
**Representation**
|
39
|
+
|
40
|
+
An :math:`N`-qubit CNOT-Dihedral operator is stored as an affine function and a
|
41
|
+
phase polynomial, based on the convention in references [1, 2].
|
42
|
+
|
43
|
+
The affine function consists of an :math:`N \\times N` invertible binary matrix,
|
44
|
+
and an :math:`N` binary vector.
|
45
|
+
|
46
|
+
The phase polynomial is a polynomial of degree at most 3,
|
47
|
+
in :math:`N` variables, whose coefficients are in the ring Z_8 with 8 elements.
|
48
|
+
|
49
|
+
.. plot::
|
50
|
+
:include-source:
|
51
|
+
:nofigs:
|
52
|
+
|
53
|
+
from qiskit import QuantumCircuit
|
54
|
+
from qiskit.quantum_info import CNOTDihedral
|
55
|
+
|
56
|
+
circ = QuantumCircuit(3)
|
57
|
+
circ.cx(0, 1)
|
58
|
+
circ.x(2)
|
59
|
+
circ.t(1)
|
60
|
+
circ.t(1)
|
61
|
+
circ.t(1)
|
62
|
+
elem = CNOTDihedral(circ)
|
63
|
+
|
64
|
+
# Print the CNOTDihedral element
|
65
|
+
print(elem)
|
66
|
+
|
67
|
+
.. code-block:: text
|
68
|
+
|
69
|
+
phase polynomial =
|
70
|
+
0 + 3*x_0 + 3*x_1 + 2*x_0*x_1
|
71
|
+
affine function =
|
72
|
+
(x_0,x_0 + x_1,x_2 + 1)
|
73
|
+
|
74
|
+
|
75
|
+
**Circuit Conversion**
|
76
|
+
|
77
|
+
CNOTDihedral operators can be initialized from circuits containing *only* the
|
78
|
+
following gates: :class:`~qiskit.circuit.library.IGate`,
|
79
|
+
:class:`~qiskit.circuit.library.XGate`, :class:`~qiskit.circuit.library.YGate`,
|
80
|
+
:class:`~qiskit.circuit.library.ZGate`,
|
81
|
+
:class:`~qiskit.circuit.library.TGate`, :class:`~qiskit.circuit.library.TdgGate`
|
82
|
+
:class:`~qiskit.circuit.library.SGate`, :class:`~qiskit.circuit.library.SdgGate`,
|
83
|
+
:class:`~qiskit.circuit.library.CXGate`, :class:`~qiskit.circuit.library.CZGate`,
|
84
|
+
:class:`~qiskit.circuit.library.CSGate`, :class:`~qiskit.circuit.library.CSdgGate`,
|
85
|
+
:class:`~qiskit.circuit.library.SwapGate`, :class:`~qiskit.circuit.library.CCZGate`.
|
86
|
+
They can be converted back into a :class:`~qiskit.circuit.QuantumCircuit`,
|
87
|
+
or :class:`~qiskit.circuit.Gate` object using the :meth:`~CNOTDihedral.to_circuit`
|
88
|
+
or :meth:`~CNOTDihderal.to_instruction` methods respectively. Note that this
|
89
|
+
decomposition is not necessarily optimal in terms of number of gates
|
90
|
+
if the number of qubits is more than two.
|
91
|
+
|
92
|
+
CNOTDihedral operators can also be converted to
|
93
|
+
:class:`~qiskit.quantum_info.Operator` objects using the
|
94
|
+
:meth:`to_operator` method. This is done via decomposing to a circuit,
|
95
|
+
and then simulating the circuit as a unitary operator.
|
96
|
+
|
97
|
+
References:
|
98
|
+
1. Shelly Garion and Andrew W. Cross, *Synthesis of CNOT-Dihedral circuits
|
99
|
+
with optimal number of two qubit gates*, `Quantum 4(369), 2020
|
100
|
+
<https://quantum-journal.org/papers/q-2020-12-07-369/>`_
|
101
|
+
2. Andrew W. Cross, Easwar Magesan, Lev S. Bishop, John A. Smolin and Jay M. Gambetta,
|
102
|
+
*Scalable randomized benchmarking of non-Clifford gates*,
|
103
|
+
npj Quantum Inf 2, 16012 (2016).
|
104
|
+
"""
|
105
|
+
|
106
|
+
def __init__(
|
107
|
+
self,
|
108
|
+
data: CNOTDihedral | QuantumCircuit | Instruction | None = None,
|
109
|
+
num_qubits: int | None = None,
|
110
|
+
validate: bool = True,
|
111
|
+
):
|
112
|
+
"""Initialize a CNOTDihedral operator object.
|
113
|
+
|
114
|
+
Args:
|
115
|
+
data (CNOTDihedral or QuantumCircuit or ~qiskit.circuit.Instruction):
|
116
|
+
Optional, operator to initialize.
|
117
|
+
num_qubits (int): Optional, initialize an empty CNOTDihedral operator.
|
118
|
+
validate (bool): if True, validates the CNOTDihedral element.
|
119
|
+
|
120
|
+
Raises:
|
121
|
+
QiskitError: if the type is invalid.
|
122
|
+
QiskitError: if validate=True and the CNOTDihedral element is invalid.
|
123
|
+
"""
|
124
|
+
|
125
|
+
if num_qubits:
|
126
|
+
# initialize n-qubit identity
|
127
|
+
self._num_qubits = num_qubits
|
128
|
+
# phase polynomial
|
129
|
+
self.poly = SpecialPolynomial(self._num_qubits)
|
130
|
+
# n x n invertible matrix over Z_2
|
131
|
+
self.linear = np.eye(self._num_qubits, dtype=np.int8)
|
132
|
+
# binary shift, n coefficients in Z_2
|
133
|
+
self.shift = np.zeros(self._num_qubits, dtype=np.int8)
|
134
|
+
|
135
|
+
# Initialize from another CNOTDihedral by sharing the underlying
|
136
|
+
# poly, linear and shift
|
137
|
+
elif isinstance(data, CNOTDihedral):
|
138
|
+
self.linear = data.linear
|
139
|
+
self.shift = data.shift
|
140
|
+
self.poly = data.poly
|
141
|
+
|
142
|
+
# Initialize from ScalarOp as N-qubit identity discarding any global phase
|
143
|
+
elif isinstance(data, ScalarOp):
|
144
|
+
if not data.is_unitary() or set(data._input_dims) != {2} or data.num_qubits is None:
|
145
|
+
raise QiskitError("Can only initialize from N-qubit identity ScalarOp.")
|
146
|
+
self._num_qubits = data.num_qubits
|
147
|
+
# phase polynomial
|
148
|
+
self.poly = SpecialPolynomial(self._num_qubits)
|
149
|
+
# n x n invertible matrix over Z_2
|
150
|
+
self.linear = np.eye(self._num_qubits, dtype=np.int8)
|
151
|
+
# binary shift, n coefficients in Z_2
|
152
|
+
self.shift = np.zeros(self._num_qubits, dtype=np.int8)
|
153
|
+
|
154
|
+
# Initialize from a QuantumCircuit or Instruction object
|
155
|
+
elif isinstance(data, (QuantumCircuit, Instruction)):
|
156
|
+
self._num_qubits = data.num_qubits
|
157
|
+
elem = self._from_circuit(data)
|
158
|
+
self.poly = elem.poly
|
159
|
+
self.linear = elem.linear
|
160
|
+
self.shift = elem.shift
|
161
|
+
|
162
|
+
elif isinstance(data, Pauli):
|
163
|
+
self._num_qubits = data.num_qubits
|
164
|
+
elem = self._from_circuit(data.to_instruction())
|
165
|
+
self.poly = elem.poly
|
166
|
+
self.linear = elem.linear
|
167
|
+
self.shift = elem.shift
|
168
|
+
|
169
|
+
else:
|
170
|
+
raise QiskitError("Invalid input type for CNOTDihedral class.")
|
171
|
+
|
172
|
+
# Initialize BaseOperator
|
173
|
+
super().__init__(num_qubits=self._num_qubits)
|
174
|
+
|
175
|
+
# Validate the CNOTDihedral element
|
176
|
+
if validate and not self._is_valid():
|
177
|
+
raise QiskitError("Invalid CNOTDihedral element.")
|
178
|
+
|
179
|
+
@property
|
180
|
+
def name(self):
|
181
|
+
"""Unique string identifier for operation type."""
|
182
|
+
return "cnotdihedral"
|
183
|
+
|
184
|
+
@property
|
185
|
+
def num_clbits(self):
|
186
|
+
"""Number of classical bits."""
|
187
|
+
return 0
|
188
|
+
|
189
|
+
def _z2matmul(self, left, right):
|
190
|
+
"""Compute product of two n x n z2 matrices."""
|
191
|
+
prod = np.mod(np.dot(left, right), 2)
|
192
|
+
return prod
|
193
|
+
|
194
|
+
def _z2matvecmul(self, mat, vec):
|
195
|
+
"""Compute mat*vec of n x n z2 matrix and vector."""
|
196
|
+
prod = np.mod(np.dot(mat, vec), 2)
|
197
|
+
return prod
|
198
|
+
|
199
|
+
def _dot(self, other):
|
200
|
+
"""Left multiplication self * other."""
|
201
|
+
if self.num_qubits != other.num_qubits:
|
202
|
+
raise QiskitError("Multiplication on different number of qubits.")
|
203
|
+
result = CNOTDihedral(num_qubits=self.num_qubits)
|
204
|
+
result.shift = [
|
205
|
+
(x[0] + x[1]) % 2 for x in zip(self._z2matvecmul(self.linear, other.shift), self.shift)
|
206
|
+
]
|
207
|
+
result.linear = self._z2matmul(self.linear, other.linear)
|
208
|
+
# Compute x' = B1*x + c1 using the p_j identity
|
209
|
+
new_vars = []
|
210
|
+
for i in range(self.num_qubits):
|
211
|
+
support = np.arange(self.num_qubits)[np.nonzero(other.linear[i])]
|
212
|
+
poly = SpecialPolynomial(self.num_qubits)
|
213
|
+
poly.set_pj(support)
|
214
|
+
if other.shift[i] == 1:
|
215
|
+
poly = -1 * poly
|
216
|
+
poly.weight_0 = (poly.weight_0 + 1) % 8
|
217
|
+
new_vars.append(poly)
|
218
|
+
# p' = p1 + p2(x')
|
219
|
+
result.poly = other.poly + self.poly.evaluate(new_vars)
|
220
|
+
return result
|
221
|
+
|
222
|
+
def _compose(self, other):
|
223
|
+
"""Right multiplication other * self."""
|
224
|
+
if self.num_qubits != other.num_qubits:
|
225
|
+
raise QiskitError("Multiplication on different number of qubits.")
|
226
|
+
result = CNOTDihedral(num_qubits=self.num_qubits)
|
227
|
+
result.shift = [
|
228
|
+
(x[0] + x[1]) % 2 for x in zip(self._z2matvecmul(other.linear, self.shift), other.shift)
|
229
|
+
]
|
230
|
+
result.linear = self._z2matmul(other.linear, self.linear)
|
231
|
+
# Compute x' = B1*x + c1 using the p_j identity
|
232
|
+
new_vars = []
|
233
|
+
for i in range(self.num_qubits):
|
234
|
+
support = np.arange(other.num_qubits)[np.nonzero(self.linear[i])]
|
235
|
+
poly = SpecialPolynomial(self.num_qubits)
|
236
|
+
poly.set_pj(support)
|
237
|
+
if self.shift[i] == 1:
|
238
|
+
poly = -1 * poly
|
239
|
+
poly.weight_0 = (poly.weight_0 + 1) % 8
|
240
|
+
new_vars.append(poly)
|
241
|
+
# p' = p1 + p2(x')
|
242
|
+
result.poly = self.poly + other.poly.evaluate(new_vars)
|
243
|
+
return result
|
244
|
+
|
245
|
+
def __eq__(self, other):
|
246
|
+
"""Test equality."""
|
247
|
+
return (
|
248
|
+
isinstance(other, CNOTDihedral)
|
249
|
+
and self.poly == other.poly
|
250
|
+
and (self.linear == other.linear).all()
|
251
|
+
and (self.shift == other.shift).all()
|
252
|
+
)
|
253
|
+
|
254
|
+
def _append_cx(self, i, j):
|
255
|
+
"""Apply a CX gate to this element.
|
256
|
+
Left multiply the element by CX(i, j).
|
257
|
+
"""
|
258
|
+
|
259
|
+
if not 0 <= i < self.num_qubits or not 0 <= j < self.num_qubits:
|
260
|
+
raise QiskitError("CX qubits are out of bounds.")
|
261
|
+
self.linear[j] = (self.linear[i] + self.linear[j]) % 2
|
262
|
+
self.shift[j] = (self.shift[i] + self.shift[j]) % 2
|
263
|
+
|
264
|
+
def _append_phase(self, k, i):
|
265
|
+
"""Apply an k-th power of T to this element.
|
266
|
+
Left multiply the element by T_i^k.
|
267
|
+
"""
|
268
|
+
if not 0 <= i < self.num_qubits:
|
269
|
+
raise QiskitError("phase qubit out of bounds.")
|
270
|
+
# If the kth bit is flipped, conjugate this gate
|
271
|
+
if self.shift[i] == 1:
|
272
|
+
k = (7 * k) % 8
|
273
|
+
# Take all subsets \alpha of the support of row i
|
274
|
+
# of weight up to 3 and add k*(-2)**(|\alpha| - 1) mod 8
|
275
|
+
# to the corresponding term.
|
276
|
+
support = np.arange(self.num_qubits)[np.nonzero(self.linear[i])]
|
277
|
+
subsets_2 = itertools.combinations(support, 2)
|
278
|
+
subsets_3 = itertools.combinations(support, 3)
|
279
|
+
for j in support:
|
280
|
+
value = self.poly.get_term([j])
|
281
|
+
self.poly.set_term([j], (value + k) % 8)
|
282
|
+
for j in subsets_2:
|
283
|
+
value = self.poly.get_term(list(j))
|
284
|
+
self.poly.set_term(list(j), (value + -2 * k) % 8)
|
285
|
+
for j in subsets_3:
|
286
|
+
value = self.poly.get_term(list(j))
|
287
|
+
self.poly.set_term(list(j), (value + 4 * k) % 8)
|
288
|
+
|
289
|
+
def _append_x(self, i):
|
290
|
+
"""Apply X to this element.
|
291
|
+
Left multiply the element by X(i).
|
292
|
+
"""
|
293
|
+
if not 0 <= i < self.num_qubits:
|
294
|
+
raise QiskitError("X qubit out of bounds.")
|
295
|
+
self.shift[i] = (self.shift[i] + 1) % 2
|
296
|
+
|
297
|
+
def __str__(self):
|
298
|
+
"""Return formatted string representation."""
|
299
|
+
out = "phase polynomial = \n"
|
300
|
+
out += str(self.poly)
|
301
|
+
out += "\naffine function = \n"
|
302
|
+
out += " ("
|
303
|
+
for row in range(self.num_qubits):
|
304
|
+
wrote = False
|
305
|
+
for col in range(self.num_qubits):
|
306
|
+
if self.linear[row][col] != 0:
|
307
|
+
if wrote:
|
308
|
+
out += " + x_" + str(col)
|
309
|
+
else:
|
310
|
+
out += "x_" + str(col)
|
311
|
+
wrote = True
|
312
|
+
if self.shift[row] != 0:
|
313
|
+
out += " + 1"
|
314
|
+
if row != self.num_qubits - 1:
|
315
|
+
out += ","
|
316
|
+
out += ")\n"
|
317
|
+
return out
|
318
|
+
|
319
|
+
def to_circuit(self):
|
320
|
+
"""Return a QuantumCircuit implementing the CNOT-Dihedral element.
|
321
|
+
|
322
|
+
Return:
|
323
|
+
QuantumCircuit: a circuit implementation of the CNOTDihedral object.
|
324
|
+
|
325
|
+
References:
|
326
|
+
1. Shelly Garion and Andrew W. Cross, *Synthesis of CNOT-Dihedral circuits
|
327
|
+
with optimal number of two qubit gates*, `Quantum 4(369), 2020
|
328
|
+
<https://quantum-journal.org/papers/q-2020-12-07-369/>`_
|
329
|
+
2. Andrew W. Cross, Easwar Magesan, Lev S. Bishop, John A. Smolin and Jay M. Gambetta,
|
330
|
+
*Scalable randomized benchmarking of non-Clifford gates*,
|
331
|
+
npj Quantum Inf 2, 16012 (2016).
|
332
|
+
"""
|
333
|
+
# pylint: disable=cyclic-import
|
334
|
+
from qiskit.synthesis.cnotdihedral import synth_cnotdihedral_full
|
335
|
+
|
336
|
+
return synth_cnotdihedral_full(self)
|
337
|
+
|
338
|
+
def to_instruction(self):
|
339
|
+
"""Return a Gate instruction implementing the CNOTDihedral object."""
|
340
|
+
return self.to_circuit().to_gate()
|
341
|
+
|
342
|
+
def _from_circuit(self, circuit):
|
343
|
+
"""Initialize from a QuantumCircuit or Instruction.
|
344
|
+
|
345
|
+
Args:
|
346
|
+
circuit (QuantumCircuit or ~qiskit.circuit.Instruction):
|
347
|
+
instruction to initialize.
|
348
|
+
Returns:
|
349
|
+
CNOTDihedral: the CNOTDihedral object for the circuit.
|
350
|
+
Raises:
|
351
|
+
QiskitError: if the input instruction is not CNOTDihedral or contains
|
352
|
+
classical register instruction.
|
353
|
+
"""
|
354
|
+
if not isinstance(circuit, (QuantumCircuit, Instruction)):
|
355
|
+
raise QiskitError("Input must be a QuantumCircuit or Instruction")
|
356
|
+
|
357
|
+
# Initialize an identity CNOTDihedral object
|
358
|
+
elem = CNOTDihedral(num_qubits=self._num_qubits)
|
359
|
+
_append_circuit(elem, circuit)
|
360
|
+
return elem
|
361
|
+
|
362
|
+
def __array__(self, dtype=None, copy=None):
|
363
|
+
if copy is False:
|
364
|
+
raise ValueError("unable to avoid copy while creating an array as requested")
|
365
|
+
arr = self.to_matrix()
|
366
|
+
return arr if dtype is None else arr.astype(dtype, copy=False)
|
367
|
+
|
368
|
+
def to_matrix(self):
|
369
|
+
"""Convert operator to Numpy matrix."""
|
370
|
+
return self.to_operator().data
|
371
|
+
|
372
|
+
def to_operator(self) -> Operator:
|
373
|
+
"""Convert to an Operator object."""
|
374
|
+
return Operator(self.to_instruction())
|
375
|
+
|
376
|
+
def compose(
|
377
|
+
self, other: CNOTDihedral, qargs: list | None = None, front: bool = False
|
378
|
+
) -> CNOTDihedral:
|
379
|
+
if qargs is not None:
|
380
|
+
raise NotImplementedError("compose method does not support qargs.")
|
381
|
+
if self.num_qubits != other.num_qubits:
|
382
|
+
raise QiskitError("Incompatible dimension for composition")
|
383
|
+
if front:
|
384
|
+
other = self._dot(other)
|
385
|
+
else:
|
386
|
+
other = self._compose(other)
|
387
|
+
other.poly.weight_0 = 0 # set global phase
|
388
|
+
return other
|
389
|
+
|
390
|
+
def _tensor(self, other, reverse=False):
|
391
|
+
"""Returns the tensor product operator."""
|
392
|
+
|
393
|
+
if not isinstance(other, CNOTDihedral):
|
394
|
+
raise QiskitError("Tensored element is not a CNOTDihderal object.")
|
395
|
+
|
396
|
+
if reverse:
|
397
|
+
elem0 = self
|
398
|
+
elem1 = other
|
399
|
+
else:
|
400
|
+
elem0 = other
|
401
|
+
elem1 = self
|
402
|
+
|
403
|
+
result = CNOTDihedral(num_qubits=elem0.num_qubits + elem1.num_qubits)
|
404
|
+
linear = np.block(
|
405
|
+
[
|
406
|
+
[elem0.linear, np.zeros((elem0.num_qubits, elem1.num_qubits), dtype=np.int8)],
|
407
|
+
[np.zeros((elem1.num_qubits, elem0.num_qubits), dtype=np.int8), elem1.linear],
|
408
|
+
]
|
409
|
+
)
|
410
|
+
result.linear = linear
|
411
|
+
shift = np.block([elem0.shift, elem1.shift])
|
412
|
+
result.shift = shift
|
413
|
+
|
414
|
+
for i in range(elem0.num_qubits):
|
415
|
+
value = elem0.poly.get_term([i])
|
416
|
+
result.poly.set_term([i], value)
|
417
|
+
for j in range(i):
|
418
|
+
value = elem0.poly.get_term([j, i])
|
419
|
+
result.poly.set_term([j, i], value)
|
420
|
+
for k in range(j):
|
421
|
+
value = elem0.poly.get_term([k, j, i])
|
422
|
+
result.poly.set_term([k, j, i], value)
|
423
|
+
|
424
|
+
for i in range(elem1.num_qubits):
|
425
|
+
value = elem1.poly.get_term([i])
|
426
|
+
result.poly.set_term([i + elem0.num_qubits], value)
|
427
|
+
for j in range(i):
|
428
|
+
value = elem1.poly.get_term([j, i])
|
429
|
+
result.poly.set_term([j + elem0.num_qubits, i + elem0.num_qubits], value)
|
430
|
+
for k in range(j):
|
431
|
+
value = elem1.poly.get_term([k, j, i])
|
432
|
+
result.poly.set_term(
|
433
|
+
[k + elem0.num_qubits, j + elem0.num_qubits, i + elem0.num_qubits], value
|
434
|
+
)
|
435
|
+
|
436
|
+
return result
|
437
|
+
|
438
|
+
def tensor(self, other: CNOTDihedral) -> CNOTDihedral:
|
439
|
+
return self._tensor(other, reverse=True)
|
440
|
+
|
441
|
+
def expand(self, other: CNOTDihedral) -> CNOTDihedral:
|
442
|
+
return self._tensor(other, reverse=False)
|
443
|
+
|
444
|
+
def adjoint(self):
|
445
|
+
circ = self.to_instruction()
|
446
|
+
result = self._from_circuit(circ.inverse())
|
447
|
+
return result
|
448
|
+
|
449
|
+
def conjugate(self):
|
450
|
+
circ = self.to_instruction()
|
451
|
+
new_circ = QuantumCircuit(self.num_qubits)
|
452
|
+
bit_indices = {bit: index for index, bit in enumerate(circ.definition.qubits)}
|
453
|
+
for instruction in circ.definition:
|
454
|
+
new_qubits = [bit_indices[tup] for tup in instruction.qubits]
|
455
|
+
if instruction.operation.name == "p":
|
456
|
+
params = 2 * np.pi - instruction.operation.params[0]
|
457
|
+
new_circ.p(params, new_qubits)
|
458
|
+
elif instruction.operation.name == "t":
|
459
|
+
instruction.operation.name = "tdg"
|
460
|
+
new_circ.append(instruction.operation, new_qubits)
|
461
|
+
elif instruction.operation.name == "tdg":
|
462
|
+
instruction.operation.name = "t"
|
463
|
+
new_circ.append(instruction.operation, new_qubits)
|
464
|
+
elif instruction.operation.name == "s":
|
465
|
+
instruction.operation.name = "sdg"
|
466
|
+
new_circ.append(instruction.operation, new_qubits)
|
467
|
+
elif instruction.operation.name == "sdg":
|
468
|
+
instruction.operation.name = "s"
|
469
|
+
new_circ.append(instruction.operation, new_qubits)
|
470
|
+
else:
|
471
|
+
new_circ.append(instruction.operation, new_qubits)
|
472
|
+
result = self._from_circuit(new_circ)
|
473
|
+
return result
|
474
|
+
|
475
|
+
def transpose(self):
|
476
|
+
circ = self.to_instruction()
|
477
|
+
result = self._from_circuit(circ.reverse_ops())
|
478
|
+
return result
|
479
|
+
|
480
|
+
def _is_valid(self):
|
481
|
+
"""Return True if input is a CNOTDihedral element."""
|
482
|
+
|
483
|
+
if (
|
484
|
+
self.poly.weight_0 != 0
|
485
|
+
or len(self.poly.weight_1) != self.num_qubits
|
486
|
+
or len(self.poly.weight_2) != int(self.num_qubits * (self.num_qubits - 1) / 2)
|
487
|
+
or len(self.poly.weight_3)
|
488
|
+
!= int(self.num_qubits * (self.num_qubits - 1) * (self.num_qubits - 2) / 6)
|
489
|
+
):
|
490
|
+
return False
|
491
|
+
if (
|
492
|
+
(self.linear).shape != (self.num_qubits, self.num_qubits)
|
493
|
+
or len(self.shift) != self.num_qubits
|
494
|
+
or not np.allclose((np.linalg.det(self.linear) % 2), 1)
|
495
|
+
):
|
496
|
+
return False
|
497
|
+
if (
|
498
|
+
not (set(self.poly.weight_1.flatten())).issubset({0, 1, 2, 3, 4, 5, 6, 7})
|
499
|
+
or not (set(self.poly.weight_2.flatten())).issubset({0, 2, 4, 6})
|
500
|
+
or not (set(self.poly.weight_3.flatten())).issubset({0, 4})
|
501
|
+
):
|
502
|
+
return False
|
503
|
+
if not (set(self.shift.flatten())).issubset({0, 1}) or not (
|
504
|
+
set(self.linear.flatten())
|
505
|
+
).issubset({0, 1}):
|
506
|
+
return False
|
507
|
+
return True
|
508
|
+
|
509
|
+
|
510
|
+
# Update docstrings for API docs
|
511
|
+
generate_apidocs(CNOTDihedral)
|