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,116 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 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
|
+
"""Base classes for an approximate circuit definition."""
|
13
|
+
from __future__ import annotations
|
14
|
+
from abc import ABC, abstractmethod
|
15
|
+
from typing import Optional, SupportsFloat
|
16
|
+
import numpy as np
|
17
|
+
|
18
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
19
|
+
|
20
|
+
|
21
|
+
class ApproximateCircuit(QuantumCircuit, ABC):
|
22
|
+
"""A base class that represents an approximate circuit."""
|
23
|
+
|
24
|
+
def __init__(self, num_qubits: int, name: Optional[str] = None) -> None:
|
25
|
+
"""
|
26
|
+
Args:
|
27
|
+
num_qubits: number of qubit this circuit will span.
|
28
|
+
name: a name of the circuit.
|
29
|
+
"""
|
30
|
+
super().__init__(num_qubits, name=name)
|
31
|
+
|
32
|
+
@property
|
33
|
+
@abstractmethod
|
34
|
+
def thetas(self) -> np.ndarray:
|
35
|
+
"""
|
36
|
+
The property is not implemented and raises a ``NotImplementedException`` exception.
|
37
|
+
|
38
|
+
Returns:
|
39
|
+
a vector of parameters of this circuit.
|
40
|
+
"""
|
41
|
+
raise NotImplementedError
|
42
|
+
|
43
|
+
@abstractmethod
|
44
|
+
def build(self, thetas: np.ndarray) -> None:
|
45
|
+
"""
|
46
|
+
Constructs this circuit out of the parameters(thetas). Parameter values must be set before
|
47
|
+
constructing the circuit.
|
48
|
+
|
49
|
+
Args:
|
50
|
+
thetas: a vector of parameters to be set in this circuit.
|
51
|
+
"""
|
52
|
+
raise NotImplementedError
|
53
|
+
|
54
|
+
|
55
|
+
class ApproximatingObjective(ABC):
|
56
|
+
"""
|
57
|
+
A base class for an optimization problem definition. An implementing class must provide at least
|
58
|
+
an implementation of the ``objective`` method. In such case only gradient free optimizers can
|
59
|
+
be used. Both method, ``objective`` and ``gradient``, preferable to have in an implementation.
|
60
|
+
"""
|
61
|
+
|
62
|
+
def __init__(self) -> None:
|
63
|
+
# must be set before optimization
|
64
|
+
self._target_matrix: np.ndarray | None = None
|
65
|
+
|
66
|
+
@abstractmethod
|
67
|
+
def objective(self, param_values: np.ndarray) -> SupportsFloat:
|
68
|
+
"""
|
69
|
+
Computes a value of the objective function given a vector of parameter values.
|
70
|
+
|
71
|
+
Args:
|
72
|
+
param_values: a vector of parameter values for the optimization problem.
|
73
|
+
|
74
|
+
Returns:
|
75
|
+
a float value of the objective function.
|
76
|
+
"""
|
77
|
+
raise NotImplementedError
|
78
|
+
|
79
|
+
@abstractmethod
|
80
|
+
def gradient(self, param_values: np.ndarray) -> np.ndarray:
|
81
|
+
"""
|
82
|
+
Computes a gradient with respect to parameters given a vector of parameter values.
|
83
|
+
|
84
|
+
Args:
|
85
|
+
param_values: a vector of parameter values for the optimization problem.
|
86
|
+
|
87
|
+
Returns:
|
88
|
+
an array of gradient values.
|
89
|
+
"""
|
90
|
+
raise NotImplementedError
|
91
|
+
|
92
|
+
@property
|
93
|
+
def target_matrix(self) -> np.ndarray:
|
94
|
+
"""
|
95
|
+
Returns:
|
96
|
+
a matrix being approximated
|
97
|
+
"""
|
98
|
+
return self._target_matrix
|
99
|
+
|
100
|
+
@target_matrix.setter
|
101
|
+
def target_matrix(self, target_matrix: np.ndarray) -> None:
|
102
|
+
"""
|
103
|
+
Args:
|
104
|
+
target_matrix: a matrix to approximate in the optimization procedure.
|
105
|
+
"""
|
106
|
+
self._target_matrix = target_matrix
|
107
|
+
|
108
|
+
@property
|
109
|
+
@abstractmethod
|
110
|
+
def num_thetas(self) -> int:
|
111
|
+
"""
|
112
|
+
|
113
|
+
Returns:
|
114
|
+
the number of parameters in this optimization problem.
|
115
|
+
"""
|
116
|
+
raise NotImplementedError
|
@@ -0,0 +1,175 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2022, 2023.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
"""A generic implementation of Approximate Quantum Compiler."""
|
13
|
+
from __future__ import annotations
|
14
|
+
|
15
|
+
import typing
|
16
|
+
from functools import partial
|
17
|
+
|
18
|
+
from collections.abc import Callable
|
19
|
+
from typing import Protocol
|
20
|
+
|
21
|
+
import numpy as np
|
22
|
+
|
23
|
+
from qiskit.quantum_info import Operator
|
24
|
+
|
25
|
+
from .approximate import ApproximateCircuit, ApproximatingObjective
|
26
|
+
|
27
|
+
if typing.TYPE_CHECKING:
|
28
|
+
import scipy.optimize
|
29
|
+
|
30
|
+
|
31
|
+
class Minimizer(Protocol):
|
32
|
+
"""Callable Protocol for minimizer.
|
33
|
+
|
34
|
+
This interface is based on `SciPy's optimize module
|
35
|
+
<https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html>`__.
|
36
|
+
|
37
|
+
This protocol defines a callable taking the following parameters:
|
38
|
+
|
39
|
+
fun
|
40
|
+
The objective function to minimize.
|
41
|
+
x0
|
42
|
+
The initial point for the optimization.
|
43
|
+
jac
|
44
|
+
The gradient of the objective function.
|
45
|
+
bounds
|
46
|
+
Parameters bounds for the optimization. Note that these might not be supported
|
47
|
+
by all optimizers.
|
48
|
+
|
49
|
+
and which returns a SciPy minimization result object.
|
50
|
+
"""
|
51
|
+
|
52
|
+
def __call__(
|
53
|
+
self,
|
54
|
+
fun: Callable[[np.ndarray], float],
|
55
|
+
x0: np.ndarray, # pylint: disable=invalid-name
|
56
|
+
jac: Callable[[np.ndarray], np.ndarray] | None = None,
|
57
|
+
bounds: list[tuple[float, float]] | None = None,
|
58
|
+
) -> scipy.optimize.OptimizeResult:
|
59
|
+
"""Minimize the objective function.
|
60
|
+
|
61
|
+
This interface is based on `SciPy's optimize module <https://docs.scipy.org/doc
|
62
|
+
/scipy/reference/generated/scipy.optimize.minimize.html>`__.
|
63
|
+
|
64
|
+
Args:
|
65
|
+
fun: The objective function to minimize.
|
66
|
+
x0: The initial point for the optimization.
|
67
|
+
jac: The gradient of the objective function.
|
68
|
+
bounds: Parameters bounds for the optimization. Note that these might not be supported
|
69
|
+
by all optimizers.
|
70
|
+
|
71
|
+
Returns:
|
72
|
+
The SciPy minimization result object.
|
73
|
+
"""
|
74
|
+
... # pylint: disable=unnecessary-ellipsis
|
75
|
+
|
76
|
+
|
77
|
+
class AQC:
|
78
|
+
"""
|
79
|
+
A generic implementation of the Approximate Quantum Compiler. This implementation is agnostic of
|
80
|
+
the underlying implementation of the approximate circuit, objective, and optimizer. Users may
|
81
|
+
pass corresponding implementations of the abstract classes:
|
82
|
+
|
83
|
+
* The *optimizer* is an implementation of the :class:`~.Minimizer` protocol, a callable used to run
|
84
|
+
the optimization process. The choice of optimizer may affect overall convergence, required time
|
85
|
+
for the optimization process and achieved objective value.
|
86
|
+
|
87
|
+
* The *approximate circuit* represents a template which parameters we want to optimize. Currently,
|
88
|
+
there's only one implementation based on 4-rotations CNOT unit blocks:
|
89
|
+
:class:`.CNOTUnitCircuit`. See the paper for more details.
|
90
|
+
|
91
|
+
* The *approximate objective* is tightly coupled with the approximate circuit implementation and
|
92
|
+
provides two methods for computing objective function and gradient with respect to approximate
|
93
|
+
circuit parameters. This objective is passed to the optimizer. Currently, there are two
|
94
|
+
implementations based on 4-rotations CNOT unit blocks: :class:`.DefaultCNOTUnitObjective` and
|
95
|
+
its accelerated version :class:`.FastCNOTUnitObjective`. Both implementations share the same
|
96
|
+
idea of maximization the Hilbert-Schmidt product between the target matrix and its
|
97
|
+
approximation. The former implementation approach should be considered as a baseline one. It
|
98
|
+
may suffer from performance issues, and is mostly suitable for a small number of qubits
|
99
|
+
(up to 5 or 6), whereas the latter, accelerated one, can be applied to larger problems.
|
100
|
+
|
101
|
+
* One should take into consideration the exponential growth of matrix size with the number of
|
102
|
+
qubits because the implementation not only creates a potentially large target matrix, but
|
103
|
+
also allocates a number of temporary memory buffers comparable in size to the target matrix.
|
104
|
+
"""
|
105
|
+
|
106
|
+
def __init__(
|
107
|
+
self,
|
108
|
+
optimizer: Minimizer | None = None,
|
109
|
+
seed: int | None = None,
|
110
|
+
):
|
111
|
+
"""
|
112
|
+
Args:
|
113
|
+
optimizer: an optimizer to be used in the optimization procedure of the search for
|
114
|
+
the best approximate circuit. By default, the scipy minimizer with the
|
115
|
+
``L-BFGS-B`` method is used with max iterations set to 1000.
|
116
|
+
seed: a seed value to be used by a random number generator.
|
117
|
+
"""
|
118
|
+
import scipy.optimize
|
119
|
+
|
120
|
+
super().__init__()
|
121
|
+
self._optimizer = optimizer or partial(
|
122
|
+
scipy.optimize.minimize, args=(), method="L-BFGS-B", options={"maxiter": 1000}
|
123
|
+
)
|
124
|
+
|
125
|
+
self._seed = seed
|
126
|
+
|
127
|
+
def compile_unitary(
|
128
|
+
self,
|
129
|
+
target_matrix: np.ndarray,
|
130
|
+
approximate_circuit: ApproximateCircuit,
|
131
|
+
approximating_objective: ApproximatingObjective,
|
132
|
+
initial_point: np.ndarray | None = None,
|
133
|
+
) -> None:
|
134
|
+
"""
|
135
|
+
Approximately compiles a circuit represented as a unitary matrix by solving an optimization
|
136
|
+
problem defined by ``approximating_objective`` and using ``approximate_circuit`` as a
|
137
|
+
template for the approximate circuit.
|
138
|
+
|
139
|
+
Args:
|
140
|
+
target_matrix: a unitary matrix to approximate.
|
141
|
+
approximate_circuit: a template circuit that will be filled with the parameter values
|
142
|
+
obtained in the optimization procedure.
|
143
|
+
approximating_objective: a definition of the optimization problem.
|
144
|
+
initial_point: initial values of angles/parameters to start optimization from.
|
145
|
+
"""
|
146
|
+
matrix_dim = target_matrix.shape[0]
|
147
|
+
# check if it is actually a special unitary matrix
|
148
|
+
target_det = np.linalg.det(target_matrix)
|
149
|
+
if not np.isclose(target_det, 1):
|
150
|
+
su_matrix = target_matrix / np.power(target_det, (1 / matrix_dim), dtype=complex)
|
151
|
+
global_phase_required = True
|
152
|
+
else:
|
153
|
+
su_matrix = target_matrix
|
154
|
+
global_phase_required = False
|
155
|
+
|
156
|
+
# set the matrix to approximate in the algorithm
|
157
|
+
approximating_objective.target_matrix = su_matrix
|
158
|
+
|
159
|
+
if initial_point is None:
|
160
|
+
np.random.seed(self._seed)
|
161
|
+
initial_point = np.random.uniform(0, 2 * np.pi, approximating_objective.num_thetas)
|
162
|
+
|
163
|
+
opt_result = self._optimizer(
|
164
|
+
fun=approximating_objective.objective,
|
165
|
+
x0=initial_point,
|
166
|
+
jac=approximating_objective.gradient,
|
167
|
+
)
|
168
|
+
|
169
|
+
approximate_circuit.build(opt_result.x)
|
170
|
+
|
171
|
+
approx_matrix = Operator(approximate_circuit).data
|
172
|
+
|
173
|
+
if global_phase_required:
|
174
|
+
alpha = np.angle(np.trace(np.dot(approx_matrix.conj().T, target_matrix)))
|
175
|
+
approximate_circuit.global_phase = alpha
|
@@ -0,0 +1,300 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 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
|
+
These are the CNOT structure methods: anything that you need for creating CNOT structures.
|
14
|
+
"""
|
15
|
+
import logging
|
16
|
+
import math
|
17
|
+
|
18
|
+
import numpy as np
|
19
|
+
|
20
|
+
_NETWORK_LAYOUTS = ["sequ", "spin", "cart", "cyclic_spin", "cyclic_line"]
|
21
|
+
_CONNECTIVITY_TYPES = ["full", "line", "star"]
|
22
|
+
|
23
|
+
|
24
|
+
logger = logging.getLogger(__name__)
|
25
|
+
|
26
|
+
|
27
|
+
def _lower_limit(num_qubits: int) -> int:
|
28
|
+
"""
|
29
|
+
Returns lower limit on the number of CNOT units that guarantees exact representation of
|
30
|
+
a unitary operator by quantum gates.
|
31
|
+
|
32
|
+
Args:
|
33
|
+
num_qubits: number of qubits.
|
34
|
+
|
35
|
+
Returns:
|
36
|
+
lower limit on the number of CNOT units.
|
37
|
+
"""
|
38
|
+
num_cnots = math.ceil((4**num_qubits - 3 * num_qubits - 1) / 4.0)
|
39
|
+
return num_cnots
|
40
|
+
|
41
|
+
|
42
|
+
def make_cnot_network(
|
43
|
+
num_qubits: int,
|
44
|
+
network_layout: str = "spin",
|
45
|
+
connectivity_type: str = "full",
|
46
|
+
depth: int = 0,
|
47
|
+
) -> np.ndarray:
|
48
|
+
"""
|
49
|
+
Generates a network consisting of building blocks each containing a CNOT gate and possibly some
|
50
|
+
single-qubit ones. This network models a quantum operator in question. Note, each building
|
51
|
+
block has 2 input and outputs corresponding to a pair of qubits. What we actually return here
|
52
|
+
is a chain of indices of qubit pairs shared by every building block in a row.
|
53
|
+
|
54
|
+
Args:
|
55
|
+
num_qubits: number of qubits.
|
56
|
+
network_layout: type of network geometry, ``{"sequ", "spin", "cart", "cyclic_spin",
|
57
|
+
"cyclic_line"}``.
|
58
|
+
connectivity_type: type of inter-qubit connectivity, ``{"full", "line", "star"}``.
|
59
|
+
depth: depth of the CNOT-network, i.e. the number of layers, where each layer consists of
|
60
|
+
a single CNOT-block; default value will be selected, if ``L <= 0``.
|
61
|
+
|
62
|
+
Returns:
|
63
|
+
A matrix of size ``(2, N)`` matrix that defines layers in cnot-network, where ``N``
|
64
|
+
is either equal ``L``, or defined by a concrete type of the network.
|
65
|
+
|
66
|
+
Raises:
|
67
|
+
ValueError: if unsupported type of CNOT-network layout or number of qubits or combination
|
68
|
+
of parameters are passed.
|
69
|
+
"""
|
70
|
+
if num_qubits < 2:
|
71
|
+
raise ValueError("Number of qubits must be greater or equal to 2")
|
72
|
+
|
73
|
+
if depth <= 0:
|
74
|
+
new_depth = _lower_limit(num_qubits)
|
75
|
+
logger.debug(
|
76
|
+
"Number of CNOT units chosen as the lower limit: %d, got a non-positive value: %d",
|
77
|
+
new_depth,
|
78
|
+
depth,
|
79
|
+
)
|
80
|
+
depth = new_depth
|
81
|
+
|
82
|
+
if network_layout == "sequ":
|
83
|
+
links = _get_connectivity(num_qubits=num_qubits, connectivity=connectivity_type)
|
84
|
+
return _sequential_network(num_qubits=num_qubits, links=links, depth=depth)
|
85
|
+
|
86
|
+
elif network_layout == "spin":
|
87
|
+
return _spin_network(num_qubits=num_qubits, depth=depth)
|
88
|
+
|
89
|
+
elif network_layout == "cart":
|
90
|
+
cnots = _cartan_network(num_qubits=num_qubits)
|
91
|
+
logger.debug(
|
92
|
+
"Optimal lower bound: %d; Cartan CNOTs: %d", _lower_limit(num_qubits), cnots.shape[1]
|
93
|
+
)
|
94
|
+
return cnots
|
95
|
+
|
96
|
+
elif network_layout == "cyclic_spin":
|
97
|
+
if connectivity_type != "full":
|
98
|
+
raise ValueError(f"'{network_layout}' layout expects 'full' connectivity")
|
99
|
+
|
100
|
+
return _cyclic_spin_network(num_qubits, depth)
|
101
|
+
|
102
|
+
elif network_layout == "cyclic_line":
|
103
|
+
if connectivity_type != "line":
|
104
|
+
raise ValueError(f"'{network_layout}' layout expects 'line' connectivity")
|
105
|
+
|
106
|
+
return _cyclic_line_network(num_qubits, depth)
|
107
|
+
else:
|
108
|
+
raise ValueError(
|
109
|
+
f"Unknown type of CNOT-network layout, expects one of {_NETWORK_LAYOUTS}, "
|
110
|
+
f"got {network_layout}"
|
111
|
+
)
|
112
|
+
|
113
|
+
|
114
|
+
def _get_connectivity(num_qubits: int, connectivity: str) -> dict:
|
115
|
+
"""
|
116
|
+
Generates connectivity structure between qubits.
|
117
|
+
|
118
|
+
Args:
|
119
|
+
num_qubits: number of qubits.
|
120
|
+
connectivity: type of connectivity structure, ``{"full", "line", "star"}``.
|
121
|
+
|
122
|
+
Returns:
|
123
|
+
dictionary of allowed links between qubits.
|
124
|
+
|
125
|
+
Raises:
|
126
|
+
ValueError: if unsupported type of CNOT-network layout is passed.
|
127
|
+
"""
|
128
|
+
if num_qubits == 1:
|
129
|
+
links = {0: [0]}
|
130
|
+
|
131
|
+
elif connectivity == "full":
|
132
|
+
# Full connectivity between qubits.
|
133
|
+
links = {i: list(range(num_qubits)) for i in range(num_qubits)}
|
134
|
+
|
135
|
+
elif connectivity == "line":
|
136
|
+
# Every qubit is connected to its immediate neighbors only.
|
137
|
+
links = {i: [i - 1, i, i + 1] for i in range(1, num_qubits - 1)}
|
138
|
+
|
139
|
+
# first qubit
|
140
|
+
links[0] = [0, 1]
|
141
|
+
|
142
|
+
# last qubit
|
143
|
+
links[num_qubits - 1] = [num_qubits - 2, num_qubits - 1]
|
144
|
+
|
145
|
+
elif connectivity == "star":
|
146
|
+
# Every qubit is connected to the first one only.
|
147
|
+
links = {i: [0, i] for i in range(1, num_qubits)}
|
148
|
+
|
149
|
+
# first qubit
|
150
|
+
links[0] = list(range(num_qubits))
|
151
|
+
|
152
|
+
else:
|
153
|
+
raise ValueError(
|
154
|
+
f"Unknown connectivity type, expects one of {_CONNECTIVITY_TYPES}, got {connectivity}"
|
155
|
+
)
|
156
|
+
return links
|
157
|
+
|
158
|
+
|
159
|
+
def _sequential_network(num_qubits: int, links: dict, depth: int) -> np.ndarray:
|
160
|
+
"""
|
161
|
+
Generates a sequential network.
|
162
|
+
|
163
|
+
Args:
|
164
|
+
num_qubits: number of qubits.
|
165
|
+
links: dictionary of connectivity links.
|
166
|
+
depth: depth of the network (number of layers of building blocks).
|
167
|
+
|
168
|
+
Returns:
|
169
|
+
A matrix of ``(2, N)`` that defines layers in qubit network.
|
170
|
+
"""
|
171
|
+
layer = 0
|
172
|
+
cnots = np.zeros((2, depth), dtype=int)
|
173
|
+
while True:
|
174
|
+
for i in range(0, num_qubits - 1):
|
175
|
+
for j in range(i + 1, num_qubits):
|
176
|
+
if j in links[i]:
|
177
|
+
cnots[0, layer] = i
|
178
|
+
cnots[1, layer] = j
|
179
|
+
layer += 1
|
180
|
+
if layer >= depth:
|
181
|
+
return cnots
|
182
|
+
|
183
|
+
|
184
|
+
def _spin_network(num_qubits: int, depth: int) -> np.ndarray:
|
185
|
+
"""
|
186
|
+
Generates a spin-like network.
|
187
|
+
|
188
|
+
Args:
|
189
|
+
num_qubits: number of qubits.
|
190
|
+
depth: depth of the network (number of layers of building blocks).
|
191
|
+
|
192
|
+
Returns:
|
193
|
+
A matrix of size ``2 x L`` that defines layers in qubit network.
|
194
|
+
"""
|
195
|
+
layer = 0
|
196
|
+
cnots = np.zeros((2, depth), dtype=int)
|
197
|
+
while True:
|
198
|
+
for i in range(0, num_qubits - 1, 2):
|
199
|
+
cnots[0, layer] = i
|
200
|
+
cnots[1, layer] = i + 1
|
201
|
+
layer += 1
|
202
|
+
if layer >= depth:
|
203
|
+
return cnots
|
204
|
+
|
205
|
+
for i in range(1, num_qubits - 1, 2):
|
206
|
+
cnots[0, layer] = i
|
207
|
+
cnots[1, layer] = i + 1
|
208
|
+
layer += 1
|
209
|
+
if layer >= depth:
|
210
|
+
return cnots
|
211
|
+
|
212
|
+
|
213
|
+
def _cartan_network(num_qubits: int) -> np.ndarray:
|
214
|
+
"""
|
215
|
+
Cartan decomposition in a recursive way, starting from n = 3.
|
216
|
+
|
217
|
+
Args:
|
218
|
+
num_qubits: number of qubits.
|
219
|
+
|
220
|
+
Returns:
|
221
|
+
2xN matrix that defines layers in qubit network, where N is the
|
222
|
+
depth of Cartan decomposition.
|
223
|
+
|
224
|
+
Raises:
|
225
|
+
ValueError: if number of qubits is less than 3.
|
226
|
+
"""
|
227
|
+
n = num_qubits
|
228
|
+
if n > 3:
|
229
|
+
cnots = np.asarray([[0, 0, 0], [1, 1, 1]])
|
230
|
+
mult = np.asarray([[n - 2, n - 3, n - 2, n - 3], [n - 1, n - 1, n - 1, n - 1]])
|
231
|
+
for _ in range(n - 2):
|
232
|
+
cnots = np.hstack((np.tile(np.hstack((cnots, mult)), 3), cnots))
|
233
|
+
mult[0, -1] -= 1
|
234
|
+
mult = np.tile(mult, 2)
|
235
|
+
elif n == 3:
|
236
|
+
cnots = np.asarray(
|
237
|
+
[
|
238
|
+
[0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0],
|
239
|
+
[1, 1, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 1, 1, 1],
|
240
|
+
]
|
241
|
+
)
|
242
|
+
else:
|
243
|
+
raise ValueError(f"The number of qubits must be >= 3, got {n}.")
|
244
|
+
|
245
|
+
return cnots
|
246
|
+
|
247
|
+
|
248
|
+
def _cyclic_spin_network(num_qubits: int, depth: int) -> np.ndarray:
|
249
|
+
"""
|
250
|
+
Same as in the spin-like network, but the first and the last qubits are also connected.
|
251
|
+
|
252
|
+
Args:
|
253
|
+
num_qubits: number of qubits.
|
254
|
+
depth: depth of the network (number of layers of building blocks).
|
255
|
+
|
256
|
+
Returns:
|
257
|
+
A matrix of size ``2 x L`` that defines layers in qubit network.
|
258
|
+
"""
|
259
|
+
|
260
|
+
cnots = np.zeros((2, depth), dtype=int)
|
261
|
+
z = 0
|
262
|
+
while True:
|
263
|
+
for i in range(0, num_qubits, 2):
|
264
|
+
if i + 1 <= num_qubits - 1:
|
265
|
+
cnots[0, z] = i
|
266
|
+
cnots[1, z] = i + 1
|
267
|
+
z += 1
|
268
|
+
if z >= depth:
|
269
|
+
return cnots
|
270
|
+
|
271
|
+
for i in range(1, num_qubits, 2):
|
272
|
+
if i + 1 <= num_qubits - 1:
|
273
|
+
cnots[0, z] = i
|
274
|
+
cnots[1, z] = i + 1
|
275
|
+
z += 1
|
276
|
+
elif i == num_qubits - 1:
|
277
|
+
cnots[0, z] = i
|
278
|
+
cnots[1, z] = 0
|
279
|
+
z += 1
|
280
|
+
if z >= depth:
|
281
|
+
return cnots
|
282
|
+
|
283
|
+
|
284
|
+
def _cyclic_line_network(num_qubits: int, depth: int) -> np.ndarray:
|
285
|
+
"""
|
286
|
+
Generates a line based CNOT structure.
|
287
|
+
|
288
|
+
Args:
|
289
|
+
num_qubits: number of qubits.
|
290
|
+
depth: depth of the network (number of layers of building blocks).
|
291
|
+
|
292
|
+
Returns:
|
293
|
+
A matrix of size ``2 x L`` that defines layers in qubit network.
|
294
|
+
"""
|
295
|
+
|
296
|
+
cnots = np.zeros((2, depth), dtype=int)
|
297
|
+
for i in range(depth):
|
298
|
+
cnots[0, i] = (i + 0) % num_qubits
|
299
|
+
cnots[1, i] = (i + 1) % num_qubits
|
300
|
+
return cnots
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 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
|
+
This is the Parametric Circuit class: anything that you need for a circuit
|
14
|
+
to be parametrized and used for approximate compiling optimization.
|
15
|
+
"""
|
16
|
+
from __future__ import annotations
|
17
|
+
from typing import Optional
|
18
|
+
|
19
|
+
import numpy as np
|
20
|
+
|
21
|
+
from .approximate import ApproximateCircuit
|
22
|
+
|
23
|
+
|
24
|
+
class CNOTUnitCircuit(ApproximateCircuit):
|
25
|
+
"""A class that represents an approximate circuit based on CNOT unit blocks."""
|
26
|
+
|
27
|
+
def __init__(
|
28
|
+
self,
|
29
|
+
num_qubits: int,
|
30
|
+
cnots: np.ndarray,
|
31
|
+
tol: Optional[float] = 0.0,
|
32
|
+
name: Optional[str] = None,
|
33
|
+
) -> None:
|
34
|
+
"""
|
35
|
+
Args:
|
36
|
+
num_qubits: the number of qubits in this circuit.
|
37
|
+
cnots: an array of dimensions ``(2, L)`` indicating where the CNOT units will be placed.
|
38
|
+
tol: angle parameter less or equal this (small) value is considered equal zero and
|
39
|
+
corresponding gate is not inserted into the output circuit (because it becomes
|
40
|
+
identity one in this case).
|
41
|
+
name: name of this circuit
|
42
|
+
|
43
|
+
Raises:
|
44
|
+
ValueError: if an unsupported parameter is passed.
|
45
|
+
"""
|
46
|
+
super().__init__(num_qubits=num_qubits, name=name)
|
47
|
+
|
48
|
+
if cnots.ndim != 2 or cnots.shape[0] != 2:
|
49
|
+
raise ValueError("CNOT structure must be defined as an array of the size (2, N)")
|
50
|
+
|
51
|
+
self._cnots = cnots
|
52
|
+
self._num_cnots = cnots.shape[1]
|
53
|
+
self._tol = tol
|
54
|
+
|
55
|
+
# Thetas to be optimized by the AQC algorithm
|
56
|
+
self._thetas: np.ndarray | None = None
|
57
|
+
|
58
|
+
@property
|
59
|
+
def thetas(self) -> np.ndarray:
|
60
|
+
"""
|
61
|
+
Returns a vector of rotation angles used by CNOT units in this circuit.
|
62
|
+
|
63
|
+
Returns:
|
64
|
+
Parameters of the rotation gates in this circuit.
|
65
|
+
"""
|
66
|
+
return self._thetas
|
67
|
+
|
68
|
+
def build(self, thetas: np.ndarray) -> None:
|
69
|
+
"""
|
70
|
+
Constructs a Qiskit quantum circuit out of the parameters (angles) of this circuit. If a
|
71
|
+
parameter value is less in absolute value than the specified tolerance then the
|
72
|
+
corresponding rotation gate will be skipped in the circuit.
|
73
|
+
"""
|
74
|
+
n = self.num_qubits
|
75
|
+
self._thetas = thetas
|
76
|
+
cnots = self._cnots
|
77
|
+
|
78
|
+
for k in range(n):
|
79
|
+
# add initial three rotation gates for each qubit
|
80
|
+
p = 4 * self._num_cnots + 3 * k
|
81
|
+
k = n - k - 1
|
82
|
+
if np.abs(thetas[2 + p]) > self._tol:
|
83
|
+
self.rz(thetas[2 + p], k)
|
84
|
+
if np.abs(thetas[1 + p]) > self._tol:
|
85
|
+
self.ry(thetas[1 + p], k)
|
86
|
+
if np.abs(thetas[0 + p]) > self._tol:
|
87
|
+
self.rz(thetas[0 + p], k)
|
88
|
+
|
89
|
+
for c in range(self._num_cnots):
|
90
|
+
p = 4 * c
|
91
|
+
# Extract where the CNOT goes
|
92
|
+
q1 = n - 1 - int(cnots[0, c])
|
93
|
+
q2 = n - 1 - int(cnots[1, c])
|
94
|
+
# Construct a CNOT unit
|
95
|
+
self.cx(q1, q2)
|
96
|
+
if np.abs(thetas[0 + p]) > self._tol:
|
97
|
+
self.ry(thetas[0 + p], q1)
|
98
|
+
if np.abs(thetas[1 + p]) > self._tol:
|
99
|
+
self.rz(thetas[1 + p], q1)
|
100
|
+
if np.abs(thetas[2 + p]) > self._tol:
|
101
|
+
self.ry(thetas[2 + p], q2)
|
102
|
+
if np.abs(thetas[3 + p]) > self._tol:
|
103
|
+
self.rx(thetas[3 + p], q2)
|