qiskit 1.3.0b1__cp39-abi3-macosx_10_9_x86_64.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 +127 -0
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +73 -0
- qiskit/assembler/__init__.py +42 -0
- qiskit/assembler/assemble_circuits.py +451 -0
- qiskit/assembler/assemble_schedules.py +365 -0
- qiskit/assembler/disassemble.py +310 -0
- qiskit/assembler/run_config.py +77 -0
- qiskit/circuit/__init__.py +1270 -0
- qiskit/circuit/_classical_resource_map.py +148 -0
- qiskit/circuit/_standard_gates_commutations.py +3264 -0
- qiskit/circuit/_utils.py +167 -0
- qiskit/circuit/add_control.py +274 -0
- qiskit/circuit/annotated_operation.py +279 -0
- qiskit/circuit/barrier.py +48 -0
- qiskit/circuit/bit.py +94 -0
- qiskit/circuit/classical/__init__.py +41 -0
- qiskit/circuit/classical/expr/__init__.py +238 -0
- qiskit/circuit/classical/expr/constructors.py +556 -0
- qiskit/circuit/classical/expr/expr.py +397 -0
- qiskit/circuit/classical/expr/visitors.py +300 -0
- qiskit/circuit/classical/types/__init__.py +109 -0
- qiskit/circuit/classical/types/ordering.py +222 -0
- qiskit/circuit/classical/types/types.py +117 -0
- qiskit/circuit/classicalfunction/__init__.py +140 -0
- qiskit/circuit/classicalfunction/boolean_expression.py +129 -0
- qiskit/circuit/classicalfunction/classical_element.py +54 -0
- qiskit/circuit/classicalfunction/classical_function_visitor.py +155 -0
- qiskit/circuit/classicalfunction/classicalfunction.py +173 -0
- qiskit/circuit/classicalfunction/exceptions.py +35 -0
- qiskit/circuit/classicalfunction/types.py +18 -0
- qiskit/circuit/classicalfunction/utils.py +91 -0
- qiskit/circuit/classicalregister.py +57 -0
- qiskit/circuit/commutation_checker.py +106 -0
- qiskit/circuit/commutation_library.py +20 -0
- qiskit/circuit/controlflow/__init__.py +28 -0
- qiskit/circuit/controlflow/_builder_utils.py +207 -0
- qiskit/circuit/controlflow/break_loop.py +56 -0
- qiskit/circuit/controlflow/builder.py +691 -0
- qiskit/circuit/controlflow/continue_loop.py +58 -0
- qiskit/circuit/controlflow/control_flow.py +84 -0
- qiskit/circuit/controlflow/for_loop.py +217 -0
- qiskit/circuit/controlflow/if_else.py +503 -0
- qiskit/circuit/controlflow/switch_case.py +417 -0
- qiskit/circuit/controlflow/while_loop.py +163 -0
- qiskit/circuit/controlledgate.py +274 -0
- qiskit/circuit/delay.py +106 -0
- qiskit/circuit/duration.py +95 -0
- qiskit/circuit/equivalence.py +295 -0
- qiskit/circuit/equivalence_library.py +18 -0
- qiskit/circuit/exceptions.py +19 -0
- qiskit/circuit/gate.py +261 -0
- qiskit/circuit/instruction.py +676 -0
- qiskit/circuit/instructionset.py +177 -0
- qiskit/circuit/library/__init__.py +572 -0
- qiskit/circuit/library/arithmetic/__init__.py +27 -0
- qiskit/circuit/library/arithmetic/adders/__init__.py +17 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +58 -0
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +159 -0
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +116 -0
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +165 -0
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +88 -0
- qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
- qiskit/circuit/library/arithmetic/integer_comparator.py +243 -0
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +196 -0
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +189 -0
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +16 -0
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +138 -0
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +101 -0
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +101 -0
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +353 -0
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +277 -0
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +317 -0
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +335 -0
- qiskit/circuit/library/arithmetic/quadratic_form.py +198 -0
- qiskit/circuit/library/arithmetic/weighted_adder.py +337 -0
- qiskit/circuit/library/basis_change/__init__.py +15 -0
- qiskit/circuit/library/basis_change/qft.py +331 -0
- qiskit/circuit/library/blueprintcircuit.py +216 -0
- qiskit/circuit/library/boolean_logic/__init__.py +18 -0
- qiskit/circuit/library/boolean_logic/inner_product.py +78 -0
- qiskit/circuit/library/boolean_logic/quantum_and.py +97 -0
- qiskit/circuit/library/boolean_logic/quantum_or.py +98 -0
- qiskit/circuit/library/boolean_logic/quantum_xor.py +71 -0
- qiskit/circuit/library/data_preparation/__init__.py +54 -0
- qiskit/circuit/library/data_preparation/initializer.py +107 -0
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +343 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
- qiskit/circuit/library/data_preparation/z_feature_map.py +104 -0
- qiskit/circuit/library/data_preparation/zz_feature_map.py +118 -0
- qiskit/circuit/library/fourier_checking.py +97 -0
- qiskit/circuit/library/generalized_gates/__init__.py +30 -0
- qiskit/circuit/library/generalized_gates/diagonal.py +165 -0
- qiskit/circuit/library/generalized_gates/gms.py +121 -0
- qiskit/circuit/library/generalized_gates/gr.py +215 -0
- qiskit/circuit/library/generalized_gates/isometry.py +370 -0
- qiskit/circuit/library/generalized_gates/linear_function.py +312 -0
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
- qiskit/circuit/library/generalized_gates/mcmt.py +256 -0
- qiskit/circuit/library/generalized_gates/pauli.py +85 -0
- qiskit/circuit/library/generalized_gates/permutation.py +192 -0
- qiskit/circuit/library/generalized_gates/rv.py +97 -0
- qiskit/circuit/library/generalized_gates/uc.py +213 -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 +215 -0
- qiskit/circuit/library/graph_state.py +86 -0
- qiskit/circuit/library/grover_operator.py +311 -0
- qiskit/circuit/library/hamiltonian_gate.py +142 -0
- qiskit/circuit/library/hidden_linear_function.py +98 -0
- qiskit/circuit/library/iqp.py +96 -0
- qiskit/circuit/library/n_local/__init__.py +33 -0
- qiskit/circuit/library/n_local/efficient_su2.py +164 -0
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +256 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +173 -0
- qiskit/circuit/library/n_local/n_local.py +1071 -0
- qiskit/circuit/library/n_local/pauli_two_design.py +141 -0
- qiskit/circuit/library/n_local/qaoa_ansatz.py +287 -0
- qiskit/circuit/library/n_local/real_amplitudes.py +186 -0
- qiskit/circuit/library/n_local/two_local.py +282 -0
- qiskit/circuit/library/overlap.py +117 -0
- qiskit/circuit/library/pauli_evolution.py +184 -0
- qiskit/circuit/library/phase_estimation.py +99 -0
- qiskit/circuit/library/phase_oracle.py +153 -0
- qiskit/circuit/library/quantum_volume.py +115 -0
- qiskit/circuit/library/standard_gates/__init__.py +123 -0
- qiskit/circuit/library/standard_gates/dcx.py +77 -0
- qiskit/circuit/library/standard_gates/ecr.py +130 -0
- qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
- qiskit/circuit/library/standard_gates/global_phase.py +85 -0
- qiskit/circuit/library/standard_gates/h.py +257 -0
- qiskit/circuit/library/standard_gates/i.py +75 -0
- qiskit/circuit/library/standard_gates/iswap.py +134 -0
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +405 -0
- qiskit/circuit/library/standard_gates/p.py +433 -0
- qiskit/circuit/library/standard_gates/r.py +117 -0
- qiskit/circuit/library/standard_gates/rx.py +302 -0
- qiskit/circuit/library/standard_gates/rxx.py +183 -0
- qiskit/circuit/library/standard_gates/ry.py +297 -0
- qiskit/circuit/library/standard_gates/ryy.py +183 -0
- qiskit/circuit/library/standard_gates/rz.py +318 -0
- qiskit/circuit/library/standard_gates/rzx.py +229 -0
- qiskit/circuit/library/standard_gates/rzz.py +196 -0
- qiskit/circuit/library/standard_gates/s.py +428 -0
- qiskit/circuit/library/standard_gates/swap.py +288 -0
- qiskit/circuit/library/standard_gates/sx.py +314 -0
- qiskit/circuit/library/standard_gates/t.py +179 -0
- qiskit/circuit/library/standard_gates/u.py +395 -0
- qiskit/circuit/library/standard_gates/u1.py +451 -0
- qiskit/circuit/library/standard_gates/u2.py +146 -0
- qiskit/circuit/library/standard_gates/u3.py +408 -0
- qiskit/circuit/library/standard_gates/x.py +1527 -0
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +235 -0
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +239 -0
- qiskit/circuit/library/standard_gates/y.py +261 -0
- qiskit/circuit/library/standard_gates/z.py +348 -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 +33 -0
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +32 -0
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +33 -0
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +36 -0
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +36 -0
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +39 -0
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +39 -0
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +39 -0
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +39 -0
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +39 -0
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +41 -0
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +41 -0
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +40 -0
- qiskit/circuit/library/templates/nct/__init__.py +67 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +32 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +33 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +35 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +37 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +37 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +38 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +38 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +38 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +37 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +38 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +42 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +42 -0
- qiskit/circuit/library/templates/rzx/__init__.py +25 -0
- qiskit/circuit/library/templates/rzx/rzx_cy.py +46 -0
- qiskit/circuit/library/templates/rzx/rzx_xz.py +53 -0
- qiskit/circuit/library/templates/rzx/rzx_yz.py +43 -0
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +67 -0
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +58 -0
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +57 -0
- qiskit/circuit/measure.py +44 -0
- qiskit/circuit/operation.py +67 -0
- qiskit/circuit/parameter.py +174 -0
- qiskit/circuit/parameterexpression.py +559 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +120 -0
- qiskit/circuit/quantumcircuit.py +6793 -0
- qiskit/circuit/quantumcircuitdata.py +136 -0
- qiskit/circuit/quantumregister.py +75 -0
- qiskit/circuit/random/__init__.py +15 -0
- qiskit/circuit/random/utils.py +358 -0
- qiskit/circuit/register.py +233 -0
- qiskit/circuit/reset.py +34 -0
- qiskit/circuit/singleton.py +604 -0
- qiskit/circuit/store.py +95 -0
- qiskit/circuit/tools/__init__.py +16 -0
- qiskit/circuit/tools/pi_check.py +190 -0
- qiskit/compiler/__init__.py +33 -0
- qiskit/compiler/assembler.py +668 -0
- qiskit/compiler/scheduler.py +107 -0
- qiskit/compiler/sequencer.py +69 -0
- qiskit/compiler/transpiler.py +478 -0
- qiskit/converters/__init__.py +74 -0
- qiskit/converters/circuit_to_dag.py +78 -0
- qiskit/converters/circuit_to_dagdependency.py +51 -0
- qiskit/converters/circuit_to_dagdependency_v2.py +47 -0
- qiskit/converters/circuit_to_gate.py +107 -0
- qiskit/converters/circuit_to_instruction.py +155 -0
- qiskit/converters/dag_to_circuit.py +77 -0
- qiskit/converters/dag_to_dagdependency.py +55 -0
- qiskit/converters/dag_to_dagdependency_v2.py +44 -0
- qiskit/converters/dagdependency_to_circuit.py +42 -0
- qiskit/converters/dagdependency_to_dag.py +49 -0
- qiskit/dagcircuit/__init__.py +44 -0
- qiskit/dagcircuit/collect_blocks.py +391 -0
- qiskit/dagcircuit/dagcircuit.py +24 -0
- qiskit/dagcircuit/dagdependency.py +633 -0
- qiskit/dagcircuit/dagdependency_v2.py +641 -0
- qiskit/dagcircuit/dagdepnode.py +160 -0
- qiskit/dagcircuit/dagnode.py +176 -0
- qiskit/dagcircuit/exceptions.py +42 -0
- qiskit/exceptions.py +153 -0
- qiskit/passmanager/__init__.py +240 -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 +333 -0
- qiskit/primitives/__init__.py +481 -0
- qiskit/primitives/backend_estimator.py +483 -0
- qiskit/primitives/backend_estimator_v2.py +434 -0
- qiskit/primitives/backend_sampler.py +222 -0
- qiskit/primitives/backend_sampler_v2.py +296 -0
- qiskit/primitives/base/__init__.py +20 -0
- qiskit/primitives/base/base_estimator.py +252 -0
- qiskit/primitives/base/base_primitive.py +45 -0
- qiskit/primitives/base/base_primitive_job.py +78 -0
- qiskit/primitives/base/base_result.py +65 -0
- qiskit/primitives/base/base_sampler.py +204 -0
- qiskit/primitives/base/estimator_result.py +46 -0
- qiskit/primitives/base/sampler_result.py +45 -0
- qiskit/primitives/base/validation.py +231 -0
- qiskit/primitives/containers/__init__.py +26 -0
- qiskit/primitives/containers/bindings_array.py +389 -0
- qiskit/primitives/containers/bit_array.py +741 -0
- qiskit/primitives/containers/data_bin.py +165 -0
- qiskit/primitives/containers/estimator_pub.py +222 -0
- qiskit/primitives/containers/object_array.py +94 -0
- qiskit/primitives/containers/observables_array.py +279 -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/estimator.py +172 -0
- qiskit/primitives/primitive_job.py +81 -0
- qiskit/primitives/sampler.py +162 -0
- qiskit/primitives/statevector_estimator.py +174 -0
- qiskit/primitives/statevector_sampler.py +292 -0
- qiskit/primitives/utils.py +247 -0
- qiskit/providers/__init__.py +803 -0
- qiskit/providers/backend.py +656 -0
- qiskit/providers/backend_compat.py +452 -0
- qiskit/providers/basic_provider/__init__.py +45 -0
- qiskit/providers/basic_provider/basic_provider.py +101 -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 +811 -0
- qiskit/providers/basic_provider/exceptions.py +30 -0
- qiskit/providers/exceptions.py +45 -0
- qiskit/providers/fake_provider/__init__.py +105 -0
- qiskit/providers/fake_provider/backends_v1/__init__.py +22 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +37 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_20q/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +43 -0
- qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +50 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +41 -0
- qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +44 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +1 -0
- qiskit/providers/fake_provider/fake_1q.py +91 -0
- qiskit/providers/fake_provider/fake_backend.py +165 -0
- qiskit/providers/fake_provider/fake_openpulse_2q.py +391 -0
- qiskit/providers/fake_provider/fake_openpulse_3q.py +340 -0
- qiskit/providers/fake_provider/fake_pulse_backend.py +44 -0
- qiskit/providers/fake_provider/fake_qasm_backend.py +77 -0
- qiskit/providers/fake_provider/generic_backend_v2.py +1019 -0
- qiskit/providers/fake_provider/utils/__init__.py +15 -0
- qiskit/providers/fake_provider/utils/backend_converter.py +150 -0
- qiskit/providers/fake_provider/utils/json_decoder.py +109 -0
- qiskit/providers/job.py +147 -0
- qiskit/providers/jobstatus.py +30 -0
- qiskit/providers/models/__init__.py +89 -0
- qiskit/providers/models/backendconfiguration.py +1040 -0
- qiskit/providers/models/backendproperties.py +517 -0
- qiskit/providers/models/backendstatus.py +94 -0
- qiskit/providers/models/jobstatus.py +66 -0
- qiskit/providers/models/pulsedefaults.py +303 -0
- qiskit/providers/options.py +273 -0
- qiskit/providers/provider.py +95 -0
- qiskit/providers/providerutils.py +110 -0
- qiskit/pulse/__init__.py +158 -0
- qiskit/pulse/builder.py +2213 -0
- qiskit/pulse/calibration_entries.py +378 -0
- qiskit/pulse/channels.py +225 -0
- qiskit/pulse/configuration.py +245 -0
- qiskit/pulse/exceptions.py +43 -0
- qiskit/pulse/filters.py +309 -0
- qiskit/pulse/instruction_schedule_map.py +409 -0
- qiskit/pulse/instructions/__init__.py +67 -0
- qiskit/pulse/instructions/acquire.py +148 -0
- qiskit/pulse/instructions/delay.py +69 -0
- qiskit/pulse/instructions/directives.py +146 -0
- qiskit/pulse/instructions/frequency.py +132 -0
- qiskit/pulse/instructions/instruction.py +268 -0
- qiskit/pulse/instructions/phase.py +149 -0
- qiskit/pulse/instructions/play.py +97 -0
- qiskit/pulse/instructions/reference.py +98 -0
- qiskit/pulse/instructions/snapshot.py +80 -0
- qiskit/pulse/library/__init__.py +97 -0
- qiskit/pulse/library/continuous.py +430 -0
- qiskit/pulse/library/pulse.py +146 -0
- qiskit/pulse/library/samplers/__init__.py +15 -0
- qiskit/pulse/library/samplers/decorators.py +295 -0
- qiskit/pulse/library/samplers/strategies.py +71 -0
- qiskit/pulse/library/symbolic_pulses.py +1960 -0
- qiskit/pulse/library/waveform.py +134 -0
- qiskit/pulse/macros.py +262 -0
- qiskit/pulse/parameter_manager.py +445 -0
- qiskit/pulse/parser.py +314 -0
- qiskit/pulse/reference_manager.py +58 -0
- qiskit/pulse/schedule.py +1855 -0
- qiskit/pulse/transforms/__init__.py +106 -0
- qiskit/pulse/transforms/alignments.py +404 -0
- qiskit/pulse/transforms/base_transforms.py +71 -0
- qiskit/pulse/transforms/canonicalization.py +498 -0
- qiskit/pulse/transforms/dag.py +115 -0
- qiskit/pulse/utils.py +149 -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 +654 -0
- qiskit/qasm2/exceptions.py +27 -0
- qiskit/qasm2/export.py +370 -0
- qiskit/qasm2/parse.py +408 -0
- qiskit/qasm3/__init__.py +366 -0
- qiskit/qasm3/ast.py +630 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1273 -0
- qiskit/qasm3/printer.py +577 -0
- qiskit/qobj/__init__.py +75 -0
- qiskit/qobj/common.py +81 -0
- qiskit/qobj/converters/__init__.py +18 -0
- qiskit/qobj/converters/lo_config.py +177 -0
- qiskit/qobj/converters/pulse_instruction.py +895 -0
- qiskit/qobj/pulse_qobj.py +709 -0
- qiskit/qobj/qasm_qobj.py +708 -0
- qiskit/qobj/utils.py +46 -0
- qiskit/qpy/__init__.py +1641 -0
- qiskit/qpy/binary_io/__init__.py +36 -0
- qiskit/qpy/binary_io/circuits.py +1460 -0
- qiskit/qpy/binary_io/schedules.py +636 -0
- qiskit/qpy/binary_io/value.py +728 -0
- qiskit/qpy/common.py +306 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +394 -0
- qiskit/qpy/interface.py +341 -0
- qiskit/qpy/type_keys.py +572 -0
- qiskit/quantum_info/__init__.py +158 -0
- qiskit/quantum_info/analysis/__init__.py +17 -0
- qiskit/quantum_info/analysis/average.py +47 -0
- qiskit/quantum_info/analysis/distance.py +102 -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 +377 -0
- qiskit/quantum_info/operators/channel/transformations.py +468 -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 +509 -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 +819 -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 +727 -0
- qiskit/quantum_info/operators/symplectic/clifford.py +1030 -0
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
- qiskit/quantum_info/operators/symplectic/pauli.py +751 -0
- qiskit/quantum_info/operators/symplectic/pauli_list.py +1230 -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 +1175 -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 +845 -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 +773 -0
- qiskit/quantum_info/states/statevector.py +958 -0
- qiskit/quantum_info/states/utils.py +247 -0
- qiskit/result/__init__.py +73 -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/mitigation/__init__.py +13 -0
- qiskit/result/mitigation/base_readout_mitigator.py +79 -0
- qiskit/result/mitigation/correlated_readout_mitigator.py +269 -0
- qiskit/result/mitigation/local_readout_mitigator.py +320 -0
- qiskit/result/mitigation/utils.py +160 -0
- qiskit/result/models.py +234 -0
- qiskit/result/postprocess.py +239 -0
- qiskit/result/result.py +392 -0
- qiskit/result/sampled_expval.py +75 -0
- qiskit/result/utils.py +295 -0
- qiskit/scheduler/__init__.py +40 -0
- qiskit/scheduler/config.py +35 -0
- qiskit/scheduler/lowering.py +187 -0
- qiskit/scheduler/methods/__init__.py +15 -0
- qiskit/scheduler/methods/basic.py +137 -0
- qiskit/scheduler/schedule_circuit.py +67 -0
- qiskit/scheduler/sequence.py +102 -0
- qiskit/synthesis/__init__.py +195 -0
- qiskit/synthesis/clifford/__init__.py +19 -0
- qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
- qiskit/synthesis/clifford/clifford_decompose_bm.py +47 -0
- qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +57 -0
- qiskit/synthesis/clifford/clifford_decompose_layers.py +446 -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 +241 -0
- qiskit/synthesis/discrete_basis/gate_sequence.py +415 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +163 -0
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +217 -0
- qiskit/synthesis/evolution/__init__.py +20 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +143 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/product_formula.py +384 -0
- qiskit/synthesis/evolution/qdrift.py +131 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +155 -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 +276 -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 +262 -0
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
- qiskit/synthesis/multi_controlled/__init__.py +23 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +356 -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 +79 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +78 -0
- qiskit/synthesis/stabilizer/__init__.py +16 -0
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +193 -0
- qiskit/synthesis/two_qubit/__init__.py +19 -0
- qiskit/synthesis/two_qubit/local_invariance.py +63 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +759 -0
- qiskit/synthesis/two_qubit/weyl.py +97 -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 +1283 -0
- qiskit/transpiler/basepasses.py +221 -0
- qiskit/transpiler/coupling.py +500 -0
- qiskit/transpiler/exceptions.py +59 -0
- qiskit/transpiler/instruction_durations.py +281 -0
- qiskit/transpiler/layout.py +737 -0
- qiskit/transpiler/passes/__init__.py +310 -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 +693 -0
- qiskit/transpiler/passes/basis/decompose.py +98 -0
- qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +88 -0
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +109 -0
- qiskit/transpiler/passes/calibration/__init__.py +17 -0
- qiskit/transpiler/passes/calibration/base_builder.py +79 -0
- qiskit/transpiler/passes/calibration/builders.py +20 -0
- qiskit/transpiler/passes/calibration/exceptions.py +22 -0
- qiskit/transpiler/passes/calibration/pulse_gate.py +98 -0
- qiskit/transpiler/passes/calibration/rx_builder.py +160 -0
- qiskit/transpiler/passes/calibration/rzx_builder.py +395 -0
- qiskit/transpiler/passes/calibration/rzx_templates.py +51 -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 +123 -0
- qiskit/transpiler/passes/layout/csp_layout.py +132 -0
- qiskit/transpiler/passes/layout/dense_layout.py +202 -0
- qiskit/transpiler/passes/layout/disjoint_utils.py +217 -0
- qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +117 -0
- qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
- qiskit/transpiler/passes/layout/sabre_layout.py +482 -0
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +220 -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 +263 -0
- qiskit/transpiler/passes/layout/vf2_post_layout.py +419 -0
- qiskit/transpiler/passes/layout/vf2_utils.py +260 -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 +115 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +88 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +80 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +227 -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 +232 -0
- qiskit/transpiler/passes/optimization/cx_cancellation.py +65 -0
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +160 -0
- qiskit/transpiler/passes/optimization/elide_permutations.py +114 -0
- qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +93 -0
- qiskit/transpiler/passes/optimization/normalize_rx_angle.py +149 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +268 -0
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +260 -0
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
- qiskit/transpiler/passes/optimization/optimize_annotated.py +448 -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_reset_in_zero_state.py +37 -0
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +47 -0
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +40 -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 +638 -0
- qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
- qiskit/transpiler/passes/routing/__init__.py +22 -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 +395 -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 +443 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +392 -0
- qiskit/transpiler/passes/routing/stochastic_swap.py +532 -0
- qiskit/transpiler/passes/routing/utils.py +35 -0
- qiskit/transpiler/passes/scheduling/__init__.py +27 -0
- qiskit/transpiler/passes/scheduling/alap.py +153 -0
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +81 -0
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +255 -0
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +78 -0
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +105 -0
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +250 -0
- qiskit/transpiler/passes/scheduling/asap.py +175 -0
- qiskit/transpiler/passes/scheduling/base_scheduler.py +308 -0
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +307 -0
- qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +256 -0
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +441 -0
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +79 -0
- qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +127 -0
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +131 -0
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +90 -0
- qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +160 -0
- qiskit/transpiler/passes/synthesis/__init__.py +20 -0
- qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +691 -0
- qiskit/transpiler/passes/synthesis/hls_plugins.py +928 -0
- qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
- qiskit/transpiler/passes/synthesis/plugin.py +734 -0
- qiskit/transpiler/passes/synthesis/qubit_tracker.py +132 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +297 -0
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +1055 -0
- qiskit/transpiler/passes/utils/__init__.py +33 -0
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +95 -0
- qiskit/transpiler/passes/utils/check_gate_direction.py +52 -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 +65 -0
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +88 -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 +65 -0
- qiskit/transpiler/passes/utils/fixed_point.py +48 -0
- qiskit/transpiler/passes/utils/gate_direction.py +349 -0
- qiskit/transpiler/passes/utils/gates_basis.py +74 -0
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +162 -0
- qiskit/transpiler/passes/utils/minimum_point.py +118 -0
- qiskit/transpiler/passes/utils/remove_barriers.py +49 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +114 -0
- qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
- qiskit/transpiler/passmanager.py +490 -0
- qiskit/transpiler/passmanager_config.py +198 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +73 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1019 -0
- qiskit/transpiler/preset_passmanagers/common.py +647 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +543 -0
- qiskit/transpiler/preset_passmanagers/level0.py +113 -0
- qiskit/transpiler/preset_passmanagers/level1.py +120 -0
- qiskit/transpiler/preset_passmanagers/level2.py +119 -0
- qiskit/transpiler/preset_passmanagers/level3.py +119 -0
- qiskit/transpiler/preset_passmanagers/plugin.py +353 -0
- qiskit/transpiler/target.py +1261 -0
- qiskit/transpiler/timing_constraints.py +59 -0
- qiskit/user_config.py +262 -0
- qiskit/utils/__init__.py +89 -0
- qiskit/utils/classtools.py +146 -0
- qiskit/utils/deprecation.py +490 -0
- qiskit/utils/lazy_tester.py +363 -0
- qiskit/utils/multiprocessing.py +56 -0
- qiskit/utils/optionals.py +347 -0
- qiskit/utils/parallel.py +191 -0
- qiskit/utils/units.py +143 -0
- qiskit/version.py +84 -0
- qiskit/visualization/__init__.py +288 -0
- qiskit/visualization/array.py +204 -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 +726 -0
- qiskit/visualization/circuit/latex.py +661 -0
- qiskit/visualization/circuit/matplotlib.py +2029 -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 +1844 -0
- qiskit/visualization/circuit_visualization.py +19 -0
- qiskit/visualization/counts_visualization.py +481 -0
- qiskit/visualization/dag_visualization.py +316 -0
- qiskit/visualization/exceptions.py +21 -0
- qiskit/visualization/gate_map.py +1485 -0
- qiskit/visualization/library.py +37 -0
- qiskit/visualization/pass_manager_visualization.py +319 -0
- qiskit/visualization/pulse_v2/__init__.py +21 -0
- qiskit/visualization/pulse_v2/core.py +901 -0
- qiskit/visualization/pulse_v2/device_info.py +173 -0
- qiskit/visualization/pulse_v2/drawings.py +253 -0
- qiskit/visualization/pulse_v2/events.py +254 -0
- qiskit/visualization/pulse_v2/generators/__init__.py +40 -0
- qiskit/visualization/pulse_v2/generators/barrier.py +76 -0
- qiskit/visualization/pulse_v2/generators/chart.py +208 -0
- qiskit/visualization/pulse_v2/generators/frame.py +436 -0
- qiskit/visualization/pulse_v2/generators/snapshot.py +133 -0
- qiskit/visualization/pulse_v2/generators/waveform.py +645 -0
- qiskit/visualization/pulse_v2/interface.py +456 -0
- qiskit/visualization/pulse_v2/layouts.py +387 -0
- qiskit/visualization/pulse_v2/plotters/__init__.py +17 -0
- qiskit/visualization/pulse_v2/plotters/base_plotter.py +53 -0
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +201 -0
- qiskit/visualization/pulse_v2/stylesheet.py +312 -0
- qiskit/visualization/pulse_v2/types.py +242 -0
- qiskit/visualization/state_visualization.py +1518 -0
- qiskit/visualization/timeline/__init__.py +21 -0
- qiskit/visualization/timeline/core.py +457 -0
- qiskit/visualization/timeline/drawings.py +260 -0
- qiskit/visualization/timeline/generators.py +506 -0
- qiskit/visualization/timeline/interface.py +424 -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 +192 -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-1.3.0b1.dist-info/LICENSE.txt +203 -0
- qiskit-1.3.0b1.dist-info/METADATA +221 -0
- qiskit-1.3.0b1.dist-info/RECORD +825 -0
- qiskit-1.3.0b1.dist-info/WHEEL +5 -0
- qiskit-1.3.0b1.dist-info/entry_points.txt +57 -0
- qiskit-1.3.0b1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,337 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2020.
|
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
|
+
"""Compute the weighted sum of qubit states."""
|
14
|
+
|
15
|
+
from typing import List, Optional
|
16
|
+
import numpy as np
|
17
|
+
|
18
|
+
from qiskit.circuit import QuantumRegister, AncillaRegister, QuantumCircuit
|
19
|
+
|
20
|
+
from ..blueprintcircuit import BlueprintCircuit
|
21
|
+
|
22
|
+
|
23
|
+
class WeightedAdder(BlueprintCircuit):
|
24
|
+
r"""A circuit to compute the weighted sum of qubit registers.
|
25
|
+
|
26
|
+
Given :math:`n` qubit basis states :math:`q_0, \ldots, q_{n-1} \in \{0, 1\}` and non-negative
|
27
|
+
integer weights :math:`\lambda_0, \ldots, \lambda_{n-1}`, this circuit performs the operation
|
28
|
+
|
29
|
+
.. math::
|
30
|
+
|
31
|
+
|q_0 \ldots q_{n-1}\rangle |0\rangle_s
|
32
|
+
\mapsto |q_0 \ldots q_{n-1}\rangle |\sum_{j=0}^{n-1} \lambda_j q_j\rangle_s
|
33
|
+
|
34
|
+
where :math:`s` is the number of sum qubits required.
|
35
|
+
This can be computed as
|
36
|
+
|
37
|
+
.. math::
|
38
|
+
|
39
|
+
s = 1 + \left\lfloor \log_2\left( \sum_{j=0}^{n-1} \lambda_j \right) \right\rfloor
|
40
|
+
|
41
|
+
or :math:`s = 1` if the sum of the weights is 0 (then the expression in the logarithm is
|
42
|
+
invalid).
|
43
|
+
|
44
|
+
For qubits in a circuit diagram, the first weight applies to the upper-most qubit.
|
45
|
+
For an example where the state of 4 qubits is added into a sum register, the circuit can
|
46
|
+
be schematically drawn as
|
47
|
+
|
48
|
+
.. parsed-literal::
|
49
|
+
|
50
|
+
┌────────┐
|
51
|
+
state_0: ┤0 ├ | state_0 * weights[0]
|
52
|
+
│ │ |
|
53
|
+
state_1: ┤1 ├ | + state_1 * weights[1]
|
54
|
+
│ │ |
|
55
|
+
state_2: ┤2 ├ | + state_2 * weights[2]
|
56
|
+
│ │ |
|
57
|
+
state_3: ┤3 ├ | + state_3 * weights[3]
|
58
|
+
│ │
|
59
|
+
sum_0: ┤4 ├ |
|
60
|
+
│ Adder │ |
|
61
|
+
sum_1: ┤5 ├ | = sum_0 * 2^0 + sum_1 * 2^1 + sum_2 * 2^2
|
62
|
+
│ │ |
|
63
|
+
sum_2: ┤6 ├ |
|
64
|
+
│ │
|
65
|
+
carry_0: ┤7 ├
|
66
|
+
│ │
|
67
|
+
carry_1: ┤8 ├
|
68
|
+
│ │
|
69
|
+
control_0: ┤9 ├
|
70
|
+
└────────┘
|
71
|
+
"""
|
72
|
+
|
73
|
+
def __init__(
|
74
|
+
self,
|
75
|
+
num_state_qubits: Optional[int] = None,
|
76
|
+
weights: Optional[List[int]] = None,
|
77
|
+
name: str = "adder",
|
78
|
+
) -> None:
|
79
|
+
"""Computes the weighted sum controlled by state qubits.
|
80
|
+
|
81
|
+
Args:
|
82
|
+
num_state_qubits: The number of state qubits.
|
83
|
+
weights: List of weights, one for each state qubit. If none are provided they
|
84
|
+
default to 1 for every qubit.
|
85
|
+
name: The name of the circuit.
|
86
|
+
"""
|
87
|
+
super().__init__(name=name)
|
88
|
+
|
89
|
+
self._weights = None
|
90
|
+
self._num_state_qubits = None
|
91
|
+
|
92
|
+
self.weights = weights
|
93
|
+
self.num_state_qubits = num_state_qubits
|
94
|
+
|
95
|
+
@property
|
96
|
+
def num_sum_qubits(self) -> int:
|
97
|
+
"""The number of sum qubits in the circuit.
|
98
|
+
|
99
|
+
Returns:
|
100
|
+
The number of qubits needed to represent the weighted sum of the qubits.
|
101
|
+
"""
|
102
|
+
if sum(self.weights) > 0:
|
103
|
+
return int(np.floor(np.log2(sum(self.weights))) + 1)
|
104
|
+
return 1
|
105
|
+
|
106
|
+
@property
|
107
|
+
def weights(self) -> List[int]:
|
108
|
+
"""The weights for the qubit states.
|
109
|
+
|
110
|
+
Returns:
|
111
|
+
The weight for the qubit states.
|
112
|
+
"""
|
113
|
+
if self._weights:
|
114
|
+
return self._weights
|
115
|
+
if self.num_state_qubits:
|
116
|
+
return [1] * self.num_state_qubits
|
117
|
+
return None
|
118
|
+
|
119
|
+
@weights.setter
|
120
|
+
def weights(self, weights: List[int]) -> None:
|
121
|
+
"""Set the weights for summing the qubit states.
|
122
|
+
|
123
|
+
Args:
|
124
|
+
weights: The new weights.
|
125
|
+
|
126
|
+
Raises:
|
127
|
+
ValueError: If not all weights are close to an integer.
|
128
|
+
"""
|
129
|
+
if weights:
|
130
|
+
for i, weight in enumerate(weights):
|
131
|
+
if not np.isclose(weight, np.round(weight)):
|
132
|
+
raise ValueError("Non-integer weights are not supported!")
|
133
|
+
weights[i] = np.round(weight)
|
134
|
+
|
135
|
+
self._invalidate()
|
136
|
+
self._weights = weights
|
137
|
+
self._reset_registers()
|
138
|
+
|
139
|
+
@property
|
140
|
+
def num_state_qubits(self) -> int:
|
141
|
+
"""The number of qubits to be summed.
|
142
|
+
|
143
|
+
Returns:
|
144
|
+
The number of state qubits.
|
145
|
+
"""
|
146
|
+
return self._num_state_qubits
|
147
|
+
|
148
|
+
@num_state_qubits.setter
|
149
|
+
def num_state_qubits(self, num_state_qubits: int) -> None:
|
150
|
+
"""Set the number of state qubits.
|
151
|
+
|
152
|
+
Args:
|
153
|
+
num_state_qubits: The new number of state qubits.
|
154
|
+
"""
|
155
|
+
if self._num_state_qubits is None or num_state_qubits != self._num_state_qubits:
|
156
|
+
self._invalidate()
|
157
|
+
self._num_state_qubits = num_state_qubits
|
158
|
+
self._reset_registers()
|
159
|
+
|
160
|
+
def _reset_registers(self):
|
161
|
+
"""Reset the registers."""
|
162
|
+
self.qregs = []
|
163
|
+
|
164
|
+
if self.num_state_qubits:
|
165
|
+
qr_state = QuantumRegister(self.num_state_qubits, name="state")
|
166
|
+
qr_sum = QuantumRegister(self.num_sum_qubits, name="sum")
|
167
|
+
self.qregs = [qr_state, qr_sum]
|
168
|
+
|
169
|
+
if self.num_carry_qubits > 0:
|
170
|
+
qr_carry = AncillaRegister(self.num_carry_qubits, name="carry")
|
171
|
+
self.add_register(qr_carry)
|
172
|
+
|
173
|
+
if self.num_control_qubits > 0:
|
174
|
+
qr_control = AncillaRegister(self.num_control_qubits, name="control")
|
175
|
+
self.add_register(qr_control)
|
176
|
+
|
177
|
+
@property
|
178
|
+
def num_carry_qubits(self) -> int:
|
179
|
+
"""The number of carry qubits required to compute the sum.
|
180
|
+
|
181
|
+
Note that this is not necessarily equal to the number of ancilla qubits, these can
|
182
|
+
be queried using ``num_ancilla_qubits``.
|
183
|
+
|
184
|
+
Returns:
|
185
|
+
The number of carry qubits required to compute the sum.
|
186
|
+
"""
|
187
|
+
return self.num_sum_qubits - 1
|
188
|
+
|
189
|
+
@property
|
190
|
+
def num_control_qubits(self) -> int:
|
191
|
+
"""The number of additional control qubits required.
|
192
|
+
|
193
|
+
Note that the total number of ancilla qubits can be obtained by calling the
|
194
|
+
method ``num_ancilla_qubits``.
|
195
|
+
|
196
|
+
Returns:
|
197
|
+
The number of additional control qubits required (0 or 1).
|
198
|
+
"""
|
199
|
+
return int(self.num_sum_qubits > 2)
|
200
|
+
|
201
|
+
def _check_configuration(self, raise_on_failure=True):
|
202
|
+
"""Check if the current configuration is valid."""
|
203
|
+
valid = True
|
204
|
+
if self._num_state_qubits is None:
|
205
|
+
valid = False
|
206
|
+
if raise_on_failure:
|
207
|
+
raise AttributeError("The number of state qubits has not been set.")
|
208
|
+
|
209
|
+
if self._num_state_qubits != len(self.weights):
|
210
|
+
valid = False
|
211
|
+
if raise_on_failure:
|
212
|
+
raise ValueError("Mismatching number of state qubits and weights.")
|
213
|
+
|
214
|
+
return valid
|
215
|
+
|
216
|
+
def _build(self):
|
217
|
+
"""If not already built, build the circuit."""
|
218
|
+
if self._is_built:
|
219
|
+
return
|
220
|
+
|
221
|
+
super()._build()
|
222
|
+
|
223
|
+
num_result_qubits = self.num_state_qubits + self.num_sum_qubits
|
224
|
+
|
225
|
+
circuit = QuantumCircuit(*self.qregs)
|
226
|
+
qr_state = circuit.qubits[: self.num_state_qubits]
|
227
|
+
qr_sum = circuit.qubits[self.num_state_qubits : num_result_qubits]
|
228
|
+
qr_carry = circuit.qubits[num_result_qubits : num_result_qubits + self.num_carry_qubits]
|
229
|
+
qr_control = circuit.qubits[num_result_qubits + self.num_carry_qubits :]
|
230
|
+
|
231
|
+
# loop over state qubits and corresponding weights
|
232
|
+
for i, weight in enumerate(self.weights):
|
233
|
+
# only act if non-trivial weight
|
234
|
+
if np.isclose(weight, 0):
|
235
|
+
continue
|
236
|
+
|
237
|
+
# get state control qubit
|
238
|
+
q_state = qr_state[i]
|
239
|
+
|
240
|
+
# get bit representation of current weight
|
241
|
+
weight_binary = f"{int(weight):b}".rjust(self.num_sum_qubits, "0")[::-1]
|
242
|
+
|
243
|
+
# loop over bits of current weight and add them to sum and carry registers
|
244
|
+
for j, bit in enumerate(weight_binary):
|
245
|
+
if bit == "1":
|
246
|
+
if self.num_sum_qubits == 1:
|
247
|
+
circuit.cx(q_state, qr_sum[j])
|
248
|
+
elif j == 0:
|
249
|
+
# compute (q_sum[0] + 1) into (q_sum[0], q_carry[0])
|
250
|
+
# - controlled by q_state[i]
|
251
|
+
circuit.ccx(q_state, qr_sum[j], qr_carry[j])
|
252
|
+
circuit.cx(q_state, qr_sum[j])
|
253
|
+
elif j == self.num_sum_qubits - 1:
|
254
|
+
# compute (q_sum[j] + q_carry[j-1] + 1) into (q_sum[j])
|
255
|
+
# - controlled by q_state[i] / last qubit,
|
256
|
+
# no carry needed by construction
|
257
|
+
circuit.cx(q_state, qr_sum[j])
|
258
|
+
circuit.ccx(q_state, qr_carry[j - 1], qr_sum[j])
|
259
|
+
else:
|
260
|
+
# compute (q_sum[j] + q_carry[j-1] + 1) into (q_sum[j], q_carry[j])
|
261
|
+
# - controlled by q_state[i]
|
262
|
+
circuit.x(qr_sum[j])
|
263
|
+
circuit.x(qr_carry[j - 1])
|
264
|
+
circuit.mcx(
|
265
|
+
[q_state, qr_sum[j], qr_carry[j - 1]],
|
266
|
+
qr_carry[j],
|
267
|
+
qr_control,
|
268
|
+
mode="v-chain",
|
269
|
+
)
|
270
|
+
circuit.cx(q_state, qr_carry[j])
|
271
|
+
circuit.x(qr_sum[j])
|
272
|
+
circuit.x(qr_carry[j - 1])
|
273
|
+
circuit.cx(q_state, qr_sum[j])
|
274
|
+
circuit.ccx(q_state, qr_carry[j - 1], qr_sum[j])
|
275
|
+
else:
|
276
|
+
if self.num_sum_qubits == 1:
|
277
|
+
pass # nothing to do, since nothing to add
|
278
|
+
elif j == 0:
|
279
|
+
pass # nothing to do, since nothing to add
|
280
|
+
elif j == self.num_sum_qubits - 1:
|
281
|
+
# compute (q_sum[j] + q_carry[j-1]) into (q_sum[j])
|
282
|
+
# - controlled by q_state[i] / last qubit,
|
283
|
+
# no carry needed by construction
|
284
|
+
circuit.ccx(q_state, qr_carry[j - 1], qr_sum[j])
|
285
|
+
else:
|
286
|
+
# compute (q_sum[j] + q_carry[j-1]) into (q_sum[j], q_carry[j])
|
287
|
+
# - controlled by q_state[i]
|
288
|
+
circuit.mcx(
|
289
|
+
[q_state, qr_sum[j], qr_carry[j - 1]],
|
290
|
+
qr_carry[j],
|
291
|
+
qr_control,
|
292
|
+
mode="v-chain",
|
293
|
+
)
|
294
|
+
circuit.ccx(q_state, qr_carry[j - 1], qr_sum[j])
|
295
|
+
|
296
|
+
# uncompute carry qubits
|
297
|
+
for j in reversed(range(len(weight_binary))):
|
298
|
+
bit = weight_binary[j]
|
299
|
+
if bit == "1":
|
300
|
+
if self.num_sum_qubits == 1:
|
301
|
+
pass
|
302
|
+
elif j == 0:
|
303
|
+
circuit.x(qr_sum[j])
|
304
|
+
circuit.ccx(q_state, qr_sum[j], qr_carry[j])
|
305
|
+
circuit.x(qr_sum[j])
|
306
|
+
elif j == self.num_sum_qubits - 1:
|
307
|
+
pass
|
308
|
+
else:
|
309
|
+
circuit.x(qr_carry[j - 1])
|
310
|
+
circuit.mcx(
|
311
|
+
[q_state, qr_sum[j], qr_carry[j - 1]],
|
312
|
+
qr_carry[j],
|
313
|
+
qr_control,
|
314
|
+
mode="v-chain",
|
315
|
+
)
|
316
|
+
circuit.cx(q_state, qr_carry[j])
|
317
|
+
circuit.x(qr_carry[j - 1])
|
318
|
+
else:
|
319
|
+
if self.num_sum_qubits == 1:
|
320
|
+
pass
|
321
|
+
elif j == 0:
|
322
|
+
pass
|
323
|
+
elif j == self.num_sum_qubits - 1:
|
324
|
+
pass
|
325
|
+
else:
|
326
|
+
# compute (q_sum[j] + q_carry[j-1]) into (q_sum[j], q_carry[j])
|
327
|
+
# - controlled by q_state[i]
|
328
|
+
circuit.x(qr_sum[j])
|
329
|
+
circuit.mcx(
|
330
|
+
[q_state, qr_sum[j], qr_carry[j - 1]],
|
331
|
+
qr_carry[j],
|
332
|
+
qr_control,
|
333
|
+
mode="v-chain",
|
334
|
+
)
|
335
|
+
circuit.x(qr_sum[j])
|
336
|
+
|
337
|
+
self.append(circuit.to_gate(), self.qubits)
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2020.
|
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
|
+
"""The basis change circuits."""
|
14
|
+
|
15
|
+
from .qft import QFT, QFTGate
|
@@ -0,0 +1,331 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2020.
|
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
|
+
"""Define a Quantum Fourier Transform circuit (QFT) and a native gate (QFTGate)."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
import warnings
|
17
|
+
import numpy as np
|
18
|
+
|
19
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit, QuantumRegister, CircuitInstruction, Gate
|
20
|
+
from ..blueprintcircuit import BlueprintCircuit
|
21
|
+
|
22
|
+
|
23
|
+
class QFT(BlueprintCircuit):
|
24
|
+
r"""Quantum Fourier Transform Circuit.
|
25
|
+
|
26
|
+
The Quantum Fourier Transform (QFT) on :math:`n` qubits is the operation
|
27
|
+
|
28
|
+
.. math::
|
29
|
+
|
30
|
+
|j\rangle \mapsto \frac{1}{2^{n/2}} \sum_{k=0}^{2^n - 1} e^{2\pi ijk / 2^n} |k\rangle
|
31
|
+
|
32
|
+
The circuit that implements this transformation can be implemented using Hadamard gates
|
33
|
+
on each qubit, a series of controlled-U1 (or Z, depending on the phase) gates and a
|
34
|
+
layer of Swap gates. The layer of Swap gates can in principle be dropped if the QFT appears
|
35
|
+
at the end of the circuit, since then the re-ordering can be done classically. They
|
36
|
+
can be turned off using the ``do_swaps`` attribute.
|
37
|
+
|
38
|
+
For 4 qubits, the circuit that implements this transformation is:
|
39
|
+
|
40
|
+
.. plot::
|
41
|
+
|
42
|
+
from qiskit.circuit.library import QFT
|
43
|
+
from qiskit.visualization.library import _generate_circuit_library_visualization
|
44
|
+
circuit = QFT(4)
|
45
|
+
_generate_circuit_library_visualization(circuit)
|
46
|
+
|
47
|
+
The inverse QFT can be obtained by calling the ``inverse`` method on this class.
|
48
|
+
The respective circuit diagram is:
|
49
|
+
|
50
|
+
.. plot::
|
51
|
+
|
52
|
+
from qiskit.circuit.library import QFT
|
53
|
+
from qiskit.visualization.library import _generate_circuit_library_visualization
|
54
|
+
circuit = QFT(4).inverse()
|
55
|
+
_generate_circuit_library_visualization(circuit)
|
56
|
+
|
57
|
+
One method to reduce circuit depth is to implement the QFT approximately by ignoring
|
58
|
+
controlled-phase rotations where the angle is beneath a threshold. This is discussed
|
59
|
+
in more detail in https://arxiv.org/abs/quant-ph/9601018 or
|
60
|
+
https://arxiv.org/abs/quant-ph/0403071.
|
61
|
+
|
62
|
+
Here, this can be adjusted using the ``approximation_degree`` attribute: the smallest
|
63
|
+
``approximation_degree`` rotation angles are dropped from the QFT. For instance, a QFT
|
64
|
+
on 5 qubits with approximation degree 2 yields (the barriers are dropped in this example):
|
65
|
+
|
66
|
+
.. plot::
|
67
|
+
|
68
|
+
from qiskit.circuit.library import QFT
|
69
|
+
from qiskit.visualization.library import _generate_circuit_library_visualization
|
70
|
+
circuit = QFT(5, approximation_degree=2)
|
71
|
+
_generate_circuit_library_visualization(circuit)
|
72
|
+
|
73
|
+
"""
|
74
|
+
|
75
|
+
def __init__(
|
76
|
+
self,
|
77
|
+
num_qubits: int | None = None,
|
78
|
+
approximation_degree: int = 0,
|
79
|
+
do_swaps: bool = True,
|
80
|
+
inverse: bool = False,
|
81
|
+
insert_barriers: bool = False,
|
82
|
+
name: str | None = None,
|
83
|
+
) -> None:
|
84
|
+
"""Construct a new QFT circuit.
|
85
|
+
|
86
|
+
Args:
|
87
|
+
num_qubits: The number of qubits on which the QFT acts.
|
88
|
+
approximation_degree: The degree of approximation (0 for no approximation).
|
89
|
+
do_swaps: Whether to include the final swaps in the QFT.
|
90
|
+
inverse: If True, the inverse Fourier transform is constructed.
|
91
|
+
insert_barriers: If True, barriers are inserted as visualization improvement.
|
92
|
+
name: The name of the circuit.
|
93
|
+
"""
|
94
|
+
if name is None:
|
95
|
+
name = "IQFT" if inverse else "QFT"
|
96
|
+
|
97
|
+
super().__init__(name=name)
|
98
|
+
self._approximation_degree = approximation_degree
|
99
|
+
self._do_swaps = do_swaps
|
100
|
+
self._insert_barriers = insert_barriers
|
101
|
+
self._inverse = inverse
|
102
|
+
self.num_qubits = num_qubits
|
103
|
+
|
104
|
+
@property
|
105
|
+
def num_qubits(self) -> int:
|
106
|
+
"""The number of qubits in the QFT circuit.
|
107
|
+
|
108
|
+
Returns:
|
109
|
+
The number of qubits in the circuit.
|
110
|
+
"""
|
111
|
+
# This method needs to be overwritten to allow adding the setter for num_qubits while still
|
112
|
+
# complying to pylint.
|
113
|
+
return super().num_qubits
|
114
|
+
|
115
|
+
@num_qubits.setter
|
116
|
+
def num_qubits(self, num_qubits: int) -> None:
|
117
|
+
"""Set the number of qubits.
|
118
|
+
|
119
|
+
Note that this changes the registers of the circuit.
|
120
|
+
|
121
|
+
Args:
|
122
|
+
num_qubits: The new number of qubits.
|
123
|
+
"""
|
124
|
+
if num_qubits != self.num_qubits:
|
125
|
+
self._invalidate()
|
126
|
+
|
127
|
+
self.qregs = []
|
128
|
+
if num_qubits is not None and num_qubits > 0:
|
129
|
+
self.qregs = [QuantumRegister(num_qubits, name="q")]
|
130
|
+
|
131
|
+
@property
|
132
|
+
def approximation_degree(self) -> int:
|
133
|
+
"""The approximation degree of the QFT.
|
134
|
+
|
135
|
+
Returns:
|
136
|
+
The currently set approximation degree.
|
137
|
+
"""
|
138
|
+
return self._approximation_degree
|
139
|
+
|
140
|
+
@approximation_degree.setter
|
141
|
+
def approximation_degree(self, approximation_degree: int) -> None:
|
142
|
+
"""Set the approximation degree of the QFT.
|
143
|
+
|
144
|
+
Args:
|
145
|
+
approximation_degree: The new approximation degree.
|
146
|
+
|
147
|
+
Raises:
|
148
|
+
ValueError: If the approximation degree is smaller than 0.
|
149
|
+
"""
|
150
|
+
if approximation_degree < 0:
|
151
|
+
raise ValueError("Approximation degree cannot be smaller than 0.")
|
152
|
+
|
153
|
+
if approximation_degree != self._approximation_degree:
|
154
|
+
self._invalidate()
|
155
|
+
self._approximation_degree = approximation_degree
|
156
|
+
|
157
|
+
@property
|
158
|
+
def insert_barriers(self) -> bool:
|
159
|
+
"""Whether barriers are inserted for better visualization or not.
|
160
|
+
|
161
|
+
Returns:
|
162
|
+
True, if barriers are inserted, False if not.
|
163
|
+
"""
|
164
|
+
return self._insert_barriers
|
165
|
+
|
166
|
+
@insert_barriers.setter
|
167
|
+
def insert_barriers(self, insert_barriers: bool) -> None:
|
168
|
+
"""Specify whether barriers are inserted for better visualization or not.
|
169
|
+
|
170
|
+
Args:
|
171
|
+
insert_barriers: If True, barriers are inserted, if False not.
|
172
|
+
"""
|
173
|
+
if insert_barriers != self._insert_barriers:
|
174
|
+
self._invalidate()
|
175
|
+
self._insert_barriers = insert_barriers
|
176
|
+
|
177
|
+
@property
|
178
|
+
def do_swaps(self) -> bool:
|
179
|
+
"""Whether the final swaps of the QFT are applied or not.
|
180
|
+
|
181
|
+
Returns:
|
182
|
+
True, if the final swaps are applied, False if not.
|
183
|
+
"""
|
184
|
+
return self._do_swaps
|
185
|
+
|
186
|
+
@do_swaps.setter
|
187
|
+
def do_swaps(self, do_swaps: bool) -> None:
|
188
|
+
"""Specify whether to do the final swaps of the QFT circuit or not.
|
189
|
+
|
190
|
+
Args:
|
191
|
+
do_swaps: If True, the final swaps are applied, if False not.
|
192
|
+
"""
|
193
|
+
if do_swaps != self._do_swaps:
|
194
|
+
self._invalidate()
|
195
|
+
self._do_swaps = do_swaps
|
196
|
+
|
197
|
+
def is_inverse(self) -> bool:
|
198
|
+
"""Whether the inverse Fourier transform is implemented.
|
199
|
+
|
200
|
+
Returns:
|
201
|
+
True, if the inverse Fourier transform is implemented, False otherwise.
|
202
|
+
"""
|
203
|
+
return self._inverse
|
204
|
+
|
205
|
+
def inverse(self, annotated: bool = False) -> "QFT":
|
206
|
+
"""Invert this circuit.
|
207
|
+
|
208
|
+
Args:
|
209
|
+
annotated: indicates whether the inverse gate can be implemented
|
210
|
+
as an annotated gate. The value of this argument is ignored as the
|
211
|
+
inverse of a QFT is an IQFT which is just another instance of
|
212
|
+
:class:`.QFT`.
|
213
|
+
|
214
|
+
Returns:
|
215
|
+
The inverted circuit.
|
216
|
+
"""
|
217
|
+
|
218
|
+
if self.name in ("QFT", "IQFT"):
|
219
|
+
name = "QFT" if self._inverse else "IQFT"
|
220
|
+
else:
|
221
|
+
name = self.name + "_dg"
|
222
|
+
|
223
|
+
inverted = self.copy(name=name)
|
224
|
+
|
225
|
+
# data consists of the QFT gate only
|
226
|
+
iqft = self.data[0].operation.inverse()
|
227
|
+
iqft.name = name
|
228
|
+
|
229
|
+
inverted.data.clear()
|
230
|
+
inverted._append(CircuitInstruction(iqft, inverted.qubits, []))
|
231
|
+
|
232
|
+
inverted._inverse = not self._inverse
|
233
|
+
return inverted
|
234
|
+
|
235
|
+
def _warn_if_precision_loss(self):
|
236
|
+
"""Issue a warning if constructing the circuit will lose precision.
|
237
|
+
|
238
|
+
If we need an angle smaller than ``pi * 2**-1022``, we start to lose precision by going into
|
239
|
+
the subnormal numbers. We won't lose _all_ precision until an exponent of about 1075, but
|
240
|
+
beyond 1022 we're using fractional bits to represent leading zeros."""
|
241
|
+
max_num_entanglements = self.num_qubits - self.approximation_degree - 1
|
242
|
+
if max_num_entanglements > -np.finfo(float).minexp: # > 1022 for doubles.
|
243
|
+
warnings.warn(
|
244
|
+
"precision loss in QFT."
|
245
|
+
f" The rotation needed to represent {max_num_entanglements} entanglements"
|
246
|
+
" is smaller than the smallest normal floating-point number.",
|
247
|
+
category=RuntimeWarning,
|
248
|
+
stacklevel=3,
|
249
|
+
)
|
250
|
+
|
251
|
+
def _check_configuration(self, raise_on_failure: bool = True) -> bool:
|
252
|
+
"""Check if the current configuration is valid."""
|
253
|
+
valid = True
|
254
|
+
if self.num_qubits is None:
|
255
|
+
valid = False
|
256
|
+
if raise_on_failure:
|
257
|
+
raise AttributeError("The number of qubits has not been set.")
|
258
|
+
self._warn_if_precision_loss()
|
259
|
+
return valid
|
260
|
+
|
261
|
+
def _build(self) -> None:
|
262
|
+
"""If not already built, build the circuit."""
|
263
|
+
if self._is_built:
|
264
|
+
return
|
265
|
+
|
266
|
+
super()._build()
|
267
|
+
|
268
|
+
num_qubits = self.num_qubits
|
269
|
+
|
270
|
+
if num_qubits == 0:
|
271
|
+
return
|
272
|
+
|
273
|
+
circuit = QuantumCircuit(*self.qregs, name=self.name)
|
274
|
+
for j in reversed(range(num_qubits)):
|
275
|
+
circuit.h(j)
|
276
|
+
num_entanglements = max(0, j - max(0, self.approximation_degree - (num_qubits - j - 1)))
|
277
|
+
for k in reversed(range(j - num_entanglements, j)):
|
278
|
+
# Use negative exponents so that the angle safely underflows to zero, rather than
|
279
|
+
# using a temporary variable that overflows to infinity in the worst case.
|
280
|
+
lam = np.pi * (2.0 ** (k - j))
|
281
|
+
circuit.cp(lam, j, k)
|
282
|
+
|
283
|
+
if self.insert_barriers:
|
284
|
+
circuit.barrier()
|
285
|
+
|
286
|
+
if self._do_swaps:
|
287
|
+
for i in range(num_qubits // 2):
|
288
|
+
circuit.swap(i, num_qubits - i - 1)
|
289
|
+
|
290
|
+
if self._inverse:
|
291
|
+
circuit = circuit.inverse()
|
292
|
+
|
293
|
+
wrapped = circuit.to_instruction() if self.insert_barriers else circuit.to_gate()
|
294
|
+
self.compose(wrapped, qubits=self.qubits, inplace=True)
|
295
|
+
|
296
|
+
|
297
|
+
class QFTGate(Gate):
|
298
|
+
r"""Quantum Fourier Transform Gate.
|
299
|
+
|
300
|
+
The Quantum Fourier Transform (QFT) on :math:`n` qubits is the operation
|
301
|
+
|
302
|
+
.. math::
|
303
|
+
|
304
|
+
|j\rangle \mapsto \frac{1}{2^{n/2}} \sum_{k=0}^{2^n - 1} e^{2\pi ijk / 2^n} |k\rangle
|
305
|
+
|
306
|
+
"""
|
307
|
+
|
308
|
+
def __init__(
|
309
|
+
self,
|
310
|
+
num_qubits: int,
|
311
|
+
):
|
312
|
+
"""
|
313
|
+
Args:
|
314
|
+
num_qubits: The number of qubits on which the QFT acts.
|
315
|
+
"""
|
316
|
+
super().__init__(name="qft", num_qubits=num_qubits, params=[])
|
317
|
+
|
318
|
+
def __array__(self, dtype=complex, copy=None):
|
319
|
+
"""Return a numpy array for the QFTGate."""
|
320
|
+
if copy is False:
|
321
|
+
raise ValueError("unable to avoid copy while creating an array as requested")
|
322
|
+
n = self.num_qubits
|
323
|
+
nums = np.arange(2**n)
|
324
|
+
outer = np.outer(nums, nums)
|
325
|
+
return np.exp(2j * np.pi * outer * (0.5**n), dtype=dtype) * (0.5 ** (n / 2))
|
326
|
+
|
327
|
+
def _define(self):
|
328
|
+
"""Provide a specific decomposition of the QFTGate into a quantum circuit."""
|
329
|
+
from qiskit.synthesis.qft import synth_qft_full
|
330
|
+
|
331
|
+
self.definition = synth_qft_full(num_qubits=self.num_qubits)
|