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,216 @@
|
|
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
|
+
Circuit simulation for the CNOTDihedral class
|
14
|
+
"""
|
15
|
+
|
16
|
+
from __future__ import annotations
|
17
|
+
import numpy as np
|
18
|
+
|
19
|
+
from qiskit.exceptions import QiskitError
|
20
|
+
from qiskit.circuit import QuantumCircuit
|
21
|
+
from qiskit.circuit.barrier import Barrier
|
22
|
+
from qiskit.circuit.delay import Delay
|
23
|
+
|
24
|
+
|
25
|
+
def _append_circuit(elem, circuit, qargs=None):
|
26
|
+
"""Update a CNOTDihedral element inplace by applying a CNOTDihedral circuit.
|
27
|
+
|
28
|
+
Args:
|
29
|
+
elem (CNOTDihedral): the CNOTDihedral element to update.
|
30
|
+
circuit (QuantumCircuit or Instruction): the gate or composite gate to apply.
|
31
|
+
qargs (list or None): The qubits to apply gates to.
|
32
|
+
Returns:
|
33
|
+
CNOTDihedral: the updated CNOTDihedral.
|
34
|
+
Raises:
|
35
|
+
QiskitError: if input gates cannot be decomposed into CNOTDihedral gates.
|
36
|
+
"""
|
37
|
+
|
38
|
+
if qargs is None:
|
39
|
+
qargs = list(range(elem.num_qubits))
|
40
|
+
|
41
|
+
if isinstance(circuit, (Barrier, Delay)):
|
42
|
+
return elem
|
43
|
+
|
44
|
+
if isinstance(circuit, QuantumCircuit):
|
45
|
+
gate = circuit.to_instruction()
|
46
|
+
else:
|
47
|
+
gate = circuit
|
48
|
+
|
49
|
+
# Handle cx, cz, ccz and id since they are basic gates, and cannot be decomposed,
|
50
|
+
if gate.name == "cx":
|
51
|
+
if len(qargs) != 2:
|
52
|
+
raise QiskitError("Invalid qubits for 2-qubit gate cx.")
|
53
|
+
elem._append_cx(qargs[0], qargs[1])
|
54
|
+
return elem
|
55
|
+
|
56
|
+
elif gate.name == "cz":
|
57
|
+
if len(qargs) != 2:
|
58
|
+
raise QiskitError("Invalid qubits for 2-qubit gate cz.")
|
59
|
+
elem._append_phase(7, qargs[1])
|
60
|
+
elem._append_phase(7, qargs[0])
|
61
|
+
elem._append_cx(qargs[1], qargs[0])
|
62
|
+
elem._append_phase(2, qargs[0])
|
63
|
+
elem._append_cx(qargs[1], qargs[0])
|
64
|
+
elem._append_phase(7, qargs[1])
|
65
|
+
elem._append_phase(7, qargs[0])
|
66
|
+
return elem
|
67
|
+
|
68
|
+
if gate.name == "ccz":
|
69
|
+
if len(qargs) != 3:
|
70
|
+
raise QiskitError("Invalid qubits for 2-qubit gate cx.")
|
71
|
+
elem._append_cx(qargs[1], qargs[2])
|
72
|
+
elem._append_phase(7, qargs[2])
|
73
|
+
elem._append_cx(qargs[0], qargs[2])
|
74
|
+
elem._append_phase(1, qargs[2])
|
75
|
+
elem._append_cx(qargs[1], qargs[2])
|
76
|
+
elem._append_phase(1, qargs[1])
|
77
|
+
elem._append_phase(7, qargs[2])
|
78
|
+
elem._append_cx(qargs[0], qargs[2])
|
79
|
+
elem._append_cx(qargs[0], qargs[1])
|
80
|
+
elem._append_phase(1, qargs[2])
|
81
|
+
elem._append_phase(1, qargs[0])
|
82
|
+
elem._append_phase(7, qargs[1])
|
83
|
+
elem._append_cx(qargs[0], qargs[1])
|
84
|
+
return elem
|
85
|
+
|
86
|
+
if gate.name == "id":
|
87
|
+
if len(qargs) != 1:
|
88
|
+
raise QiskitError("Invalid qubits for 1-qubit gate id.")
|
89
|
+
return elem
|
90
|
+
|
91
|
+
if gate.definition is None:
|
92
|
+
raise QiskitError(f"Cannot apply Instruction: {gate.name}")
|
93
|
+
if not isinstance(gate.definition, QuantumCircuit):
|
94
|
+
raise QiskitError(
|
95
|
+
f"{gate.name} instruction definition is {type(gate.definition)}; expected QuantumCircuit"
|
96
|
+
)
|
97
|
+
|
98
|
+
flat_instr = gate.definition
|
99
|
+
bit_indices = {
|
100
|
+
bit: index
|
101
|
+
for bits in [flat_instr.qubits, flat_instr.clbits]
|
102
|
+
for index, bit in enumerate(bits)
|
103
|
+
}
|
104
|
+
|
105
|
+
for instruction in gate.definition:
|
106
|
+
if isinstance(instruction.operation, (Barrier, Delay)):
|
107
|
+
continue
|
108
|
+
# Get the integer position of the flat register
|
109
|
+
new_qubits = [qargs[bit_indices[tup]] for tup in instruction.qubits]
|
110
|
+
|
111
|
+
if instruction.operation.name == "x" or gate.name == "x":
|
112
|
+
if len(new_qubits) != 1:
|
113
|
+
raise QiskitError("Invalid qubits for 1-qubit gate x.")
|
114
|
+
elem._append_x(new_qubits[0])
|
115
|
+
|
116
|
+
elif instruction.operation.name == "z" or gate.name == "z":
|
117
|
+
if len(new_qubits) != 1:
|
118
|
+
raise QiskitError("Invalid qubits for 1-qubit gate z.")
|
119
|
+
elem._append_phase(4, new_qubits[0])
|
120
|
+
|
121
|
+
elif instruction.operation.name == "y" or gate.name == "y":
|
122
|
+
if len(new_qubits) != 1:
|
123
|
+
raise QiskitError("Invalid qubits for 1-qubit gate y.")
|
124
|
+
elem._append_x(new_qubits[0])
|
125
|
+
elem._append_phase(4, new_qubits[0])
|
126
|
+
|
127
|
+
elif instruction.operation.name == "p" or gate.name == "p":
|
128
|
+
if len(new_qubits) != 1 or len(instruction.operation.params) != 1:
|
129
|
+
raise QiskitError("Invalid qubits or params for 1-qubit gate p.")
|
130
|
+
elem._append_phase(int(4 * instruction.operation.params[0] / np.pi), new_qubits[0])
|
131
|
+
|
132
|
+
elif instruction.operation.name == "t" or gate.name == "t":
|
133
|
+
if len(new_qubits) != 1:
|
134
|
+
raise QiskitError("Invalid qubits for 1-qubit gate t.")
|
135
|
+
elem._append_phase(1, new_qubits[0])
|
136
|
+
|
137
|
+
elif instruction.operation.name == "tdg" or gate.name == "tdg":
|
138
|
+
if len(new_qubits) != 1:
|
139
|
+
raise QiskitError("Invalid qubits for 1-qubit gate tdg.")
|
140
|
+
elem._append_phase(7, new_qubits[0])
|
141
|
+
|
142
|
+
elif instruction.operation.name == "s" or gate.name == "s":
|
143
|
+
if len(new_qubits) != 1:
|
144
|
+
raise QiskitError("Invalid qubits for 1-qubit gate s.")
|
145
|
+
elem._append_phase(2, new_qubits[0])
|
146
|
+
|
147
|
+
elif instruction.operation.name == "sdg" or gate.name == "sdg":
|
148
|
+
if len(new_qubits) != 1:
|
149
|
+
raise QiskitError("Invalid qubits for 1-qubit gate sdg.")
|
150
|
+
elem._append_phase(6, new_qubits[0])
|
151
|
+
|
152
|
+
elif instruction.operation.name == "cx":
|
153
|
+
if len(new_qubits) != 2:
|
154
|
+
raise QiskitError("Invalid qubits for 2-qubit gate cx.")
|
155
|
+
elem._append_cx(new_qubits[0], new_qubits[1])
|
156
|
+
|
157
|
+
elif instruction.operation.name == "cz":
|
158
|
+
if len(new_qubits) != 2:
|
159
|
+
raise QiskitError("Invalid qubits for 2-qubit gate cz.")
|
160
|
+
elem._append_phase(7, new_qubits[1])
|
161
|
+
elem._append_phase(7, new_qubits[0])
|
162
|
+
elem._append_cx(new_qubits[1], new_qubits[0])
|
163
|
+
elem._append_phase(2, new_qubits[0])
|
164
|
+
elem._append_cx(new_qubits[1], new_qubits[0])
|
165
|
+
elem._append_phase(7, new_qubits[1])
|
166
|
+
elem._append_phase(7, new_qubits[0])
|
167
|
+
|
168
|
+
elif instruction.operation.name == "cs" or gate.name == "cs":
|
169
|
+
if len(new_qubits) != 2:
|
170
|
+
raise QiskitError("Invalid qubits for 2-qubit gate cs.")
|
171
|
+
elem._append_phase(1, new_qubits[1])
|
172
|
+
elem._append_phase(1, new_qubits[0])
|
173
|
+
elem._append_cx(new_qubits[1], new_qubits[0])
|
174
|
+
elem._append_phase(7, new_qubits[0])
|
175
|
+
elem._append_cx(new_qubits[1], new_qubits[0])
|
176
|
+
|
177
|
+
elif instruction.operation.name == "csdg" or gate.name == "csdg":
|
178
|
+
if len(new_qubits) != 2:
|
179
|
+
raise QiskitError("Invalid qubits for 2-qubit gate csdg.")
|
180
|
+
elem._append_phase(7, new_qubits[1])
|
181
|
+
elem._append_phase(7, new_qubits[0])
|
182
|
+
elem._append_cx(new_qubits[1], new_qubits[0])
|
183
|
+
elem._append_phase(1, new_qubits[0])
|
184
|
+
elem._append_cx(new_qubits[1], new_qubits[0])
|
185
|
+
|
186
|
+
elif instruction.operation.name == "swap" or gate.name == "swap":
|
187
|
+
if len(new_qubits) != 2:
|
188
|
+
raise QiskitError("Invalid qubits for 2-qubit gate swap.")
|
189
|
+
elem._append_cx(new_qubits[0], new_qubits[1])
|
190
|
+
elem._append_cx(new_qubits[1], new_qubits[0])
|
191
|
+
elem._append_cx(new_qubits[0], new_qubits[1])
|
192
|
+
|
193
|
+
elif instruction.operation.name == "ccz":
|
194
|
+
if len(new_qubits) != 3:
|
195
|
+
raise QiskitError("Invalid qubits for 3-qubit gate ccz.")
|
196
|
+
elem._append_cx(new_qubits[1], new_qubits[2])
|
197
|
+
elem._append_phase(7, new_qubits[2])
|
198
|
+
elem._append_cx(new_qubits[0], new_qubits[2])
|
199
|
+
elem._append_phase(1, new_qubits[2])
|
200
|
+
elem._append_cx(new_qubits[1], new_qubits[2])
|
201
|
+
elem._append_phase(1, new_qubits[1])
|
202
|
+
elem._append_phase(7, new_qubits[2])
|
203
|
+
elem._append_cx(new_qubits[0], new_qubits[2])
|
204
|
+
elem._append_cx(new_qubits[0], new_qubits[1])
|
205
|
+
elem._append_phase(1, new_qubits[2])
|
206
|
+
elem._append_phase(1, new_qubits[0])
|
207
|
+
elem._append_phase(7, new_qubits[1])
|
208
|
+
elem._append_cx(new_qubits[0], new_qubits[1])
|
209
|
+
|
210
|
+
elif instruction.operation.name == "id":
|
211
|
+
pass
|
212
|
+
|
213
|
+
else:
|
214
|
+
raise QiskitError(f"Not a CNOT-Dihedral gate: {instruction.operation.name}")
|
215
|
+
|
216
|
+
return elem
|
@@ -0,0 +1,313 @@
|
|
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
|
+
SpecialPolynomial class.
|
14
|
+
"""
|
15
|
+
|
16
|
+
from __future__ import annotations
|
17
|
+
import itertools
|
18
|
+
from itertools import combinations
|
19
|
+
import copy
|
20
|
+
from functools import reduce
|
21
|
+
from operator import mul
|
22
|
+
import numpy as np
|
23
|
+
|
24
|
+
from qiskit.exceptions import QiskitError
|
25
|
+
|
26
|
+
|
27
|
+
class SpecialPolynomial:
|
28
|
+
"""Multivariate polynomial with special form.
|
29
|
+
|
30
|
+
Maximum degree 3, n Z_2 variables, coefficients in Z_8.
|
31
|
+
"""
|
32
|
+
|
33
|
+
def __init__(self, n_vars):
|
34
|
+
"""Construct the zero polynomial on n_vars variables."""
|
35
|
+
# 1 constant term
|
36
|
+
# n linear terms x_1, ..., x_n
|
37
|
+
# {n choose 2} quadratic terms x_1x_2, x_1x_3, ..., x_{n-1}x_n
|
38
|
+
# {n choose 3} cubic terms x_1x_2x_3, ..., x_{n-2}x_{n-1}x_n
|
39
|
+
# and coefficients in Z_8
|
40
|
+
if n_vars < 1:
|
41
|
+
raise QiskitError("n_vars for SpecialPolynomial is too small.")
|
42
|
+
self.n_vars = n_vars
|
43
|
+
self.nc2 = int(n_vars * (n_vars - 1) / 2)
|
44
|
+
self.nc3 = int(n_vars * (n_vars - 1) * (n_vars - 2) / 6)
|
45
|
+
self.weight_0 = 0
|
46
|
+
self.weight_1 = np.zeros(n_vars, dtype=np.int8)
|
47
|
+
self.weight_2 = np.zeros(self.nc2, dtype=np.int8)
|
48
|
+
self.weight_3 = np.zeros(self.nc3, dtype=np.int8)
|
49
|
+
|
50
|
+
def mul_monomial(self, indices):
|
51
|
+
"""Multiply by a monomial given by indices.
|
52
|
+
|
53
|
+
Returns the product.
|
54
|
+
"""
|
55
|
+
length = len(indices)
|
56
|
+
if length >= 4:
|
57
|
+
raise QiskitError("There is no term with on more than 3 indices.")
|
58
|
+
indices_arr = np.array(indices)
|
59
|
+
if (indices_arr < 0).any() and (indices_arr > self.n_vars).any():
|
60
|
+
raise QiskitError("Indices are out of bounds.")
|
61
|
+
if length > 1 and (np.diff(indices_arr) <= 0).any():
|
62
|
+
raise QiskitError("Indices are non-increasing!")
|
63
|
+
result = SpecialPolynomial(self.n_vars)
|
64
|
+
if length == 0:
|
65
|
+
result = copy.deepcopy(self)
|
66
|
+
else:
|
67
|
+
terms0 = [[]]
|
68
|
+
terms1 = list(combinations(range(self.n_vars), r=1))
|
69
|
+
terms2 = list(combinations(range(self.n_vars), r=2))
|
70
|
+
terms3 = list(combinations(range(self.n_vars), r=3))
|
71
|
+
for term in terms0 + terms1 + terms2 + terms3:
|
72
|
+
value = self.get_term(term)
|
73
|
+
new_term = list(set(term).union(set(indices)))
|
74
|
+
result.set_term(new_term, (result.get_term(new_term) + value) % 8)
|
75
|
+
return result
|
76
|
+
|
77
|
+
def __mul__(self, other):
|
78
|
+
"""Multiply two polynomials."""
|
79
|
+
if not isinstance(other, SpecialPolynomial):
|
80
|
+
other = int(other)
|
81
|
+
result = SpecialPolynomial(self.n_vars)
|
82
|
+
if isinstance(other, int):
|
83
|
+
result.weight_0 = (self.weight_0 * other) % 8
|
84
|
+
result.weight_1 = (self.weight_1 * other) % 8
|
85
|
+
result.weight_2 = (self.weight_2 * other) % 8
|
86
|
+
result.weight_3 = (self.weight_3 * other) % 8
|
87
|
+
else:
|
88
|
+
if self.n_vars != other.n_vars:
|
89
|
+
raise QiskitError("Multiplication on different n_vars.")
|
90
|
+
terms0 = [[]]
|
91
|
+
terms1 = list(combinations(range(self.n_vars), r=1))
|
92
|
+
terms2 = list(combinations(range(self.n_vars), r=2))
|
93
|
+
terms3 = list(combinations(range(self.n_vars), r=3))
|
94
|
+
for term in terms0 + terms1 + terms2 + terms3:
|
95
|
+
value = other.get_term(term)
|
96
|
+
if value != 0:
|
97
|
+
temp = copy.deepcopy(self)
|
98
|
+
temp = temp.mul_monomial(term)
|
99
|
+
temp = temp * value
|
100
|
+
result = result + temp
|
101
|
+
return result
|
102
|
+
|
103
|
+
def __rmul__(self, other):
|
104
|
+
"""Right multiplication.
|
105
|
+
|
106
|
+
This operation is commutative.
|
107
|
+
"""
|
108
|
+
return self.__mul__(other)
|
109
|
+
|
110
|
+
def __add__(self, other):
|
111
|
+
"""Add two polynomials."""
|
112
|
+
if not isinstance(other, SpecialPolynomial):
|
113
|
+
raise QiskitError("Element to add is not a SpecialPolynomial.")
|
114
|
+
if self.n_vars != other.n_vars:
|
115
|
+
raise QiskitError("Addition on different n_vars.")
|
116
|
+
result = SpecialPolynomial(self.n_vars)
|
117
|
+
result.weight_0 = (self.weight_0 + other.weight_0) % 8
|
118
|
+
result.weight_1 = (self.weight_1 + other.weight_1) % 8
|
119
|
+
result.weight_2 = (self.weight_2 + other.weight_2) % 8
|
120
|
+
result.weight_3 = (self.weight_3 + other.weight_3) % 8
|
121
|
+
return result
|
122
|
+
|
123
|
+
def evaluate(self, xval):
|
124
|
+
"""Evaluate the multinomial at xval.
|
125
|
+
|
126
|
+
if xval is a length n z2 vector, return element of Z8.
|
127
|
+
if xval is a length n vector of multinomials, return
|
128
|
+
a multinomial. The multinomials must all be on n vars.
|
129
|
+
"""
|
130
|
+
if len(xval) != self.n_vars:
|
131
|
+
raise QiskitError("Evaluate on wrong number of variables.")
|
132
|
+
check_int = [isinstance(x, int) for x in xval]
|
133
|
+
check_poly = [isinstance(x, SpecialPolynomial) for x in xval]
|
134
|
+
if False in check_int and False in check_poly:
|
135
|
+
raise QiskitError("Evaluate on a wrong type.")
|
136
|
+
is_int = False not in check_int
|
137
|
+
if not is_int:
|
138
|
+
if False in [i.n_vars == self.n_vars for i in xval]:
|
139
|
+
raise QiskitError("Evaluate on incompatible polynomials.")
|
140
|
+
else:
|
141
|
+
xval = xval % 2
|
142
|
+
# Examine each term of this polynomial
|
143
|
+
terms0 = [[]]
|
144
|
+
terms1 = list(combinations(range(self.n_vars), r=1))
|
145
|
+
terms2 = list(combinations(range(self.n_vars), r=2))
|
146
|
+
terms3 = list(combinations(range(self.n_vars), r=3))
|
147
|
+
# Set the initial result and start for each term
|
148
|
+
if is_int:
|
149
|
+
result = 0
|
150
|
+
start = 1
|
151
|
+
else:
|
152
|
+
result = SpecialPolynomial(self.n_vars)
|
153
|
+
start = SpecialPolynomial(self.n_vars)
|
154
|
+
start.weight_0 = 1
|
155
|
+
# Compute the new terms and accumulate
|
156
|
+
for term in terms0 + terms1 + terms2 + terms3:
|
157
|
+
value = self.get_term(term)
|
158
|
+
if value != 0:
|
159
|
+
newterm = reduce(mul, [xval[j] for j in term], start)
|
160
|
+
result = result + value * newterm
|
161
|
+
if isinstance(result, int):
|
162
|
+
result = result % 8
|
163
|
+
return result
|
164
|
+
|
165
|
+
def set_pj(self, indices):
|
166
|
+
"""Set to special form polynomial on subset of variables.
|
167
|
+
|
168
|
+
p_J(x) := sum_{a subseteq J,|a| neq 0} (-2)^{|a|-1}x^a
|
169
|
+
"""
|
170
|
+
indices_arr = np.array(indices)
|
171
|
+
if (indices_arr < 0).any() or (indices_arr >= self.n_vars).any():
|
172
|
+
raise QiskitError("Indices are out of bounds.")
|
173
|
+
indices = sorted(indices)
|
174
|
+
subsets_2 = itertools.combinations(indices, 2)
|
175
|
+
subsets_3 = itertools.combinations(indices, 3)
|
176
|
+
self.weight_0 = 0
|
177
|
+
self.weight_1 = np.zeros(self.n_vars)
|
178
|
+
self.weight_2 = np.zeros(self.nc2)
|
179
|
+
self.weight_3 = np.zeros(self.nc3)
|
180
|
+
for j in indices:
|
181
|
+
self.set_term([j], 1)
|
182
|
+
for j in subsets_2:
|
183
|
+
self.set_term(list(j), 6)
|
184
|
+
for j in subsets_3:
|
185
|
+
self.set_term(list(j), 4)
|
186
|
+
|
187
|
+
def get_term(self, indices):
|
188
|
+
"""Get the value of a term given the list of variables.
|
189
|
+
|
190
|
+
Example: indices = [] returns the constant
|
191
|
+
indices = [0] returns the coefficient of x_0
|
192
|
+
indices = [0,3] returns the coefficient of x_0x_3
|
193
|
+
indices = [0,1,3] returns the coefficient of x_0x_1x_3
|
194
|
+
|
195
|
+
If len(indices) > 3 the method fails.
|
196
|
+
If the indices are out of bounds the method fails.
|
197
|
+
If the indices are not increasing the method fails.
|
198
|
+
"""
|
199
|
+
length = len(indices)
|
200
|
+
if length >= 4:
|
201
|
+
return 0
|
202
|
+
indices_arr = np.array(indices)
|
203
|
+
if (indices_arr < 0).any() or (indices_arr >= self.n_vars).any():
|
204
|
+
raise QiskitError("Indices are out of bounds.")
|
205
|
+
if length > 1 and (np.diff(indices_arr) <= 0).any():
|
206
|
+
raise QiskitError("Indices are non-increasing.")
|
207
|
+
|
208
|
+
if length == 0:
|
209
|
+
return self.weight_0
|
210
|
+
if length == 1:
|
211
|
+
return self.weight_1[indices[0]]
|
212
|
+
if length == 2:
|
213
|
+
# sum(self.n_vars-j, {j, 1, indices[0]})
|
214
|
+
offset_1 = int(indices[0] * self.n_vars - ((indices[0] + 1) * indices[0]) / 2)
|
215
|
+
offset_2 = int(indices[1] - indices[0] - 1)
|
216
|
+
return self.weight_2[offset_1 + offset_2]
|
217
|
+
|
218
|
+
# handle length = 3
|
219
|
+
tmp_1 = self.n_vars - indices[0]
|
220
|
+
offset_1 = int((tmp_1 - 3) * (tmp_1 - 2) * (tmp_1 - 1) / 6)
|
221
|
+
tmp_2 = self.n_vars - indices[1]
|
222
|
+
offset_2 = int((tmp_2 - 2) * (tmp_2 - 1) / 2)
|
223
|
+
offset_3 = self.n_vars - indices[2]
|
224
|
+
offset = int(
|
225
|
+
self.n_vars * (self.n_vars - 1) * (self.n_vars - 2) / 6 - offset_1 - offset_2 - offset_3
|
226
|
+
)
|
227
|
+
|
228
|
+
return self.weight_3[offset]
|
229
|
+
|
230
|
+
def set_term(self, indices, value):
|
231
|
+
"""Set the value of a term given the list of variables.
|
232
|
+
|
233
|
+
Example: indices = [] returns the constant
|
234
|
+
indices = [0] returns the coefficient of x_0
|
235
|
+
indices = [0,3] returns the coefficient of x_0x_3
|
236
|
+
indices = [0,1,3] returns the coefficient of x_0x_1x_3
|
237
|
+
|
238
|
+
If len(indices) > 3 the method fails.
|
239
|
+
If the indices are out of bounds the method fails.
|
240
|
+
If the indices are not increasing the method fails.
|
241
|
+
The value is reduced modulo 8.
|
242
|
+
"""
|
243
|
+
length = len(indices)
|
244
|
+
if length >= 4:
|
245
|
+
return
|
246
|
+
indices_arr = np.array(indices)
|
247
|
+
if (indices_arr < 0).any() or (indices_arr >= self.n_vars).any():
|
248
|
+
raise QiskitError("Indices are out of bounds.")
|
249
|
+
if length > 1 and (np.diff(indices_arr) <= 0).any():
|
250
|
+
raise QiskitError("Indices are non-increasing.")
|
251
|
+
|
252
|
+
value = value % 8
|
253
|
+
if length == 0:
|
254
|
+
self.weight_0 = value
|
255
|
+
elif length == 1:
|
256
|
+
self.weight_1[indices[0]] = value
|
257
|
+
elif length == 2:
|
258
|
+
# sum(self.n_vars-j, {j, 1, indices[0]})
|
259
|
+
offset_1 = int(indices[0] * self.n_vars - ((indices[0] + 1) * indices[0]) / 2)
|
260
|
+
offset_2 = int(indices[1] - indices[0] - 1)
|
261
|
+
self.weight_2[offset_1 + offset_2] = value
|
262
|
+
else: # length = 3
|
263
|
+
tmp_1 = self.n_vars - indices[0]
|
264
|
+
offset_1 = int((tmp_1 - 3) * (tmp_1 - 2) * (tmp_1 - 1) / 6)
|
265
|
+
tmp_2 = self.n_vars - indices[1]
|
266
|
+
offset_2 = int((tmp_2 - 2) * (tmp_2 - 1) / 2)
|
267
|
+
offset_3 = self.n_vars - indices[2]
|
268
|
+
offset = int(
|
269
|
+
self.n_vars * (self.n_vars - 1) * (self.n_vars - 2) / 6
|
270
|
+
- offset_1
|
271
|
+
- offset_2
|
272
|
+
- offset_3
|
273
|
+
)
|
274
|
+
self.weight_3[offset] = value
|
275
|
+
|
276
|
+
@property
|
277
|
+
def key(self):
|
278
|
+
"""Return a string representation."""
|
279
|
+
tup = (self.weight_0, tuple(self.weight_1), tuple(self.weight_2), tuple(self.weight_3))
|
280
|
+
return tup
|
281
|
+
|
282
|
+
def __eq__(self, x):
|
283
|
+
"""Test equality."""
|
284
|
+
return isinstance(x, SpecialPolynomial) and self.key == x.key
|
285
|
+
|
286
|
+
def __str__(self):
|
287
|
+
"""Return formatted string representation."""
|
288
|
+
out = str(self.weight_0)
|
289
|
+
for i in range(self.n_vars):
|
290
|
+
value = self.get_term([i])
|
291
|
+
if value != 0:
|
292
|
+
out += " + "
|
293
|
+
if value != 1:
|
294
|
+
out += str(value) + "*"
|
295
|
+
out += "x_" + str(i)
|
296
|
+
for i in range(self.n_vars - 1):
|
297
|
+
for j in range(i + 1, self.n_vars):
|
298
|
+
value = self.get_term([i, j])
|
299
|
+
if value != 0:
|
300
|
+
out += " + "
|
301
|
+
if value != 1:
|
302
|
+
out += str(value) + "*"
|
303
|
+
out += "x_" + str(i) + "*x_" + str(j)
|
304
|
+
for i in range(self.n_vars - 2):
|
305
|
+
for j in range(i + 1, self.n_vars - 1):
|
306
|
+
for k in range(j + 1, self.n_vars):
|
307
|
+
value = self.get_term([i, j, k])
|
308
|
+
if value != 0:
|
309
|
+
out += " + "
|
310
|
+
if value != 1:
|
311
|
+
out += str(value) + "*"
|
312
|
+
out += "x_" + str(i) + "*x_" + str(j) + "*x_" + str(k)
|
313
|
+
return out
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2019, 2024.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
"""
|
13
|
+
Random CNOTDihedral operator functions
|
14
|
+
"""
|
15
|
+
|
16
|
+
from __future__ import annotations
|
17
|
+
import numpy as np
|
18
|
+
from numpy.random import default_rng
|
19
|
+
from .dihedral import CNOTDihedral
|
20
|
+
|
21
|
+
|
22
|
+
def random_cnotdihedral(num_qubits, seed=None):
|
23
|
+
"""Return a random CNOTDihedral element.
|
24
|
+
|
25
|
+
Args:
|
26
|
+
num_qubits (int): the number of qubits for the CNOTDihedral object.
|
27
|
+
seed (int or RandomState): Optional. Set a fixed seed or
|
28
|
+
generator for RNG.
|
29
|
+
Returns:
|
30
|
+
CNOTDihedral: a random CNOTDihedral element.
|
31
|
+
"""
|
32
|
+
|
33
|
+
if seed is None:
|
34
|
+
rng = np.random.default_rng()
|
35
|
+
elif isinstance(seed, np.random.Generator):
|
36
|
+
rng = seed
|
37
|
+
else:
|
38
|
+
rng = default_rng(seed)
|
39
|
+
|
40
|
+
elem = CNOTDihedral(num_qubits=num_qubits)
|
41
|
+
|
42
|
+
# Random phase polynomial weights
|
43
|
+
weight_1 = rng.integers(8, size=num_qubits)
|
44
|
+
elem.poly.weight_1 = weight_1
|
45
|
+
weight_2 = 2 * rng.integers(4, size=int(num_qubits * (num_qubits - 1) / 2))
|
46
|
+
elem.poly.weight_2 = weight_2
|
47
|
+
weight_3 = 4 * rng.integers(2, size=int(num_qubits * (num_qubits - 1) * (num_qubits - 2) / 6))
|
48
|
+
elem.poly.weight_3 = weight_3
|
49
|
+
|
50
|
+
# Random affine function
|
51
|
+
# Random invertible binary matrix
|
52
|
+
from qiskit.synthesis.linear import ( # pylint: disable=cyclic-import
|
53
|
+
random_invertible_binary_matrix,
|
54
|
+
)
|
55
|
+
|
56
|
+
seed = rng.integers(100000, size=1, dtype=np.uint64)[0]
|
57
|
+
linear = random_invertible_binary_matrix(num_qubits, seed=seed).astype(int, copy=False)
|
58
|
+
elem.linear = linear
|
59
|
+
|
60
|
+
# Random shift
|
61
|
+
shift = rng.integers(2, size=num_qubits)
|
62
|
+
elem.shift = shift
|
63
|
+
|
64
|
+
return elem
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 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
|
+
Abstract LinearOperator class.
|
15
|
+
"""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
from abc import ABC
|
19
|
+
|
20
|
+
from .base_operator import BaseOperator
|
21
|
+
from .mixins import LinearMixin, AdjointMixin, TolerancesMixin
|
22
|
+
|
23
|
+
|
24
|
+
class LinearOp(BaseOperator, AdjointMixin, LinearMixin, TolerancesMixin, ABC):
|
25
|
+
"""Abstract linear operator base class."""
|