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,215 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2024.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Arbitrary unitary circuit instruction."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
import math
|
17
|
+
|
18
|
+
import typing
|
19
|
+
import numpy
|
20
|
+
|
21
|
+
from qiskit import _numpy_compat
|
22
|
+
from qiskit.circuit.gate import Gate
|
23
|
+
from qiskit.circuit.controlledgate import ControlledGate
|
24
|
+
from qiskit.circuit.annotated_operation import AnnotatedOperation, ControlModifier
|
25
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
26
|
+
from qiskit.circuit.quantumregister import QuantumRegister
|
27
|
+
from qiskit.circuit.exceptions import CircuitError
|
28
|
+
from qiskit.circuit._utils import _compute_control_matrix
|
29
|
+
from qiskit.circuit.library.standard_gates.u import UGate
|
30
|
+
from qiskit.quantum_info.operators.predicates import matrix_equal
|
31
|
+
from qiskit.quantum_info.operators.predicates import is_unitary_matrix
|
32
|
+
|
33
|
+
from .isometry import Isometry
|
34
|
+
|
35
|
+
if typing.TYPE_CHECKING:
|
36
|
+
from qiskit.quantum_info.operators.base_operator import BaseOperator
|
37
|
+
|
38
|
+
|
39
|
+
class UnitaryGate(Gate):
|
40
|
+
"""Class quantum gates specified by a unitary matrix.
|
41
|
+
|
42
|
+
Example:
|
43
|
+
|
44
|
+
We can create a unitary gate from a unitary matrix then add it to a
|
45
|
+
quantum circuit. The matrix can also be directly applied to the quantum
|
46
|
+
circuit, see :meth:`.QuantumCircuit.unitary`.
|
47
|
+
|
48
|
+
.. code-block:: python
|
49
|
+
|
50
|
+
from qiskit import QuantumCircuit
|
51
|
+
from qiskit.circuit.library import UnitaryGate
|
52
|
+
|
53
|
+
matrix = [[0, 0, 0, 1],
|
54
|
+
[0, 0, 1, 0],
|
55
|
+
[1, 0, 0, 0],
|
56
|
+
[0, 1, 0, 0]]
|
57
|
+
gate = UnitaryGate(matrix)
|
58
|
+
|
59
|
+
circuit = QuantumCircuit(2)
|
60
|
+
circuit.append(gate, [0, 1])
|
61
|
+
"""
|
62
|
+
|
63
|
+
def __init__(
|
64
|
+
self,
|
65
|
+
data: numpy.ndarray | Gate | BaseOperator,
|
66
|
+
label: str | None = None,
|
67
|
+
check_input: bool = True,
|
68
|
+
*,
|
69
|
+
num_qubits: int | None = None,
|
70
|
+
) -> None:
|
71
|
+
"""Create a gate from a numeric unitary matrix.
|
72
|
+
|
73
|
+
Args:
|
74
|
+
data: Unitary operator.
|
75
|
+
label: Unitary name for backend [Default: ``None``].
|
76
|
+
check_input: If set to ``False`` this asserts the input
|
77
|
+
is known to be unitary and the checking to validate this will
|
78
|
+
be skipped. This should only ever be used if you know the
|
79
|
+
input is unitary, setting this to ``False`` and passing in
|
80
|
+
a non-unitary matrix will result unexpected behavior and errors.
|
81
|
+
num_qubits: If given, the number of qubits in the matrix. If not given, it is inferred.
|
82
|
+
|
83
|
+
Raises:
|
84
|
+
ValueError: If input data is not an N-qubit unitary operator.
|
85
|
+
"""
|
86
|
+
if hasattr(data, "to_matrix"):
|
87
|
+
# If input is Gate subclass or some other class object that has
|
88
|
+
# a to_matrix method this will call that method.
|
89
|
+
data = data.to_matrix()
|
90
|
+
elif hasattr(data, "to_operator"):
|
91
|
+
# If input is a BaseOperator subclass this attempts to convert
|
92
|
+
# the object to an Operator so that we can extract the underlying
|
93
|
+
# numpy matrix from `Operator.data`.
|
94
|
+
data = data.to_operator().data
|
95
|
+
# Convert to numpy array in case not already an array
|
96
|
+
data = numpy.asarray(data, dtype=complex)
|
97
|
+
input_dim, output_dim = data.shape
|
98
|
+
num_qubits = num_qubits if num_qubits is not None else int(math.log2(input_dim))
|
99
|
+
if check_input:
|
100
|
+
# Check input is unitary
|
101
|
+
if not is_unitary_matrix(data):
|
102
|
+
raise ValueError("Input matrix is not unitary.")
|
103
|
+
# Check input is N-qubit matrix
|
104
|
+
if input_dim != output_dim or 2**num_qubits != input_dim:
|
105
|
+
raise ValueError("Input matrix is not an N-qubit operator.")
|
106
|
+
# Store instruction params
|
107
|
+
super().__init__("unitary", num_qubits, [data], label=label)
|
108
|
+
|
109
|
+
def __eq__(self, other):
|
110
|
+
if not isinstance(other, UnitaryGate):
|
111
|
+
return False
|
112
|
+
if self.label != other.label:
|
113
|
+
return False
|
114
|
+
return matrix_equal(self.params[0], other.params[0])
|
115
|
+
|
116
|
+
def __array__(self, dtype=None, copy=_numpy_compat.COPY_ONLY_IF_NEEDED):
|
117
|
+
"""Return matrix for the unitary."""
|
118
|
+
dtype = self.params[0].dtype if dtype is None else dtype
|
119
|
+
return numpy.array(self.params[0], dtype=dtype, copy=copy)
|
120
|
+
|
121
|
+
def inverse(self, annotated: bool = False):
|
122
|
+
"""Return the adjoint of the unitary."""
|
123
|
+
return self.adjoint()
|
124
|
+
|
125
|
+
def conjugate(self):
|
126
|
+
"""Return the conjugate of the unitary."""
|
127
|
+
return UnitaryGate(numpy.conj(self.to_matrix()))
|
128
|
+
|
129
|
+
def adjoint(self):
|
130
|
+
"""Return the adjoint of the unitary."""
|
131
|
+
return self.transpose().conjugate()
|
132
|
+
|
133
|
+
def transpose(self):
|
134
|
+
"""Return the transpose of the unitary."""
|
135
|
+
return UnitaryGate(numpy.transpose(self.to_matrix()))
|
136
|
+
|
137
|
+
def _define(self):
|
138
|
+
"""Calculate a subcircuit that implements this unitary."""
|
139
|
+
if self.num_qubits == 1:
|
140
|
+
from qiskit.synthesis.one_qubit.one_qubit_decompose import OneQubitEulerDecomposer
|
141
|
+
|
142
|
+
q = QuantumRegister(1, "q")
|
143
|
+
qc = QuantumCircuit(q, name=self.name)
|
144
|
+
theta, phi, lam, global_phase = OneQubitEulerDecomposer("U").angles_and_phase(
|
145
|
+
self.to_matrix()
|
146
|
+
)
|
147
|
+
qc._append(UGate(theta, phi, lam), [q[0]], [])
|
148
|
+
qc.global_phase = global_phase
|
149
|
+
self.definition = qc
|
150
|
+
elif self.num_qubits == 2:
|
151
|
+
from qiskit.synthesis.two_qubit.two_qubit_decompose import ( # pylint: disable=cyclic-import
|
152
|
+
two_qubit_cnot_decompose,
|
153
|
+
)
|
154
|
+
|
155
|
+
self.definition = two_qubit_cnot_decompose(self.to_matrix())
|
156
|
+
else:
|
157
|
+
from qiskit.synthesis.unitary.qsd import ( # pylint: disable=cyclic-import
|
158
|
+
qs_decomposition,
|
159
|
+
)
|
160
|
+
|
161
|
+
self.definition = qs_decomposition(self.to_matrix())
|
162
|
+
|
163
|
+
def control(
|
164
|
+
self,
|
165
|
+
num_ctrl_qubits: int = 1,
|
166
|
+
label: str | None = None,
|
167
|
+
ctrl_state: int | str | None = None,
|
168
|
+
annotated: bool | None = None,
|
169
|
+
) -> ControlledGate | AnnotatedOperation:
|
170
|
+
"""Return controlled version of gate.
|
171
|
+
|
172
|
+
Args:
|
173
|
+
num_ctrl_qubits: Number of controls to add to gate (default is 1).
|
174
|
+
label: Optional gate label.
|
175
|
+
ctrl_state: The control state in decimal or as a bit string (e.g. ``"1011"``).
|
176
|
+
If ``None``, use ``2**num_ctrl_qubits - 1``.
|
177
|
+
annotated: indicates whether the controlled gate should be implemented
|
178
|
+
as an annotated gate. If ``None``, this is handled as ``False``.
|
179
|
+
|
180
|
+
Returns:
|
181
|
+
Controlled version of gate.
|
182
|
+
"""
|
183
|
+
if not annotated:
|
184
|
+
mat = self.to_matrix()
|
185
|
+
cmat = _compute_control_matrix(mat, num_ctrl_qubits, ctrl_state=None)
|
186
|
+
iso = Isometry(cmat, 0, 0)
|
187
|
+
gate = ControlledGate(
|
188
|
+
"c-unitary",
|
189
|
+
num_qubits=self.num_qubits + num_ctrl_qubits,
|
190
|
+
params=[mat],
|
191
|
+
label=label,
|
192
|
+
num_ctrl_qubits=num_ctrl_qubits,
|
193
|
+
definition=iso.definition,
|
194
|
+
ctrl_state=ctrl_state,
|
195
|
+
base_gate=self.copy(),
|
196
|
+
)
|
197
|
+
else:
|
198
|
+
gate = AnnotatedOperation(
|
199
|
+
self, ControlModifier(num_ctrl_qubits=num_ctrl_qubits, ctrl_state=ctrl_state)
|
200
|
+
)
|
201
|
+
return gate
|
202
|
+
|
203
|
+
def _qasm2_decomposition(self):
|
204
|
+
"""Return an unparameterized version of ourselves, so the OQ2 exporter doesn't choke on the
|
205
|
+
non-standard things in our `params` field."""
|
206
|
+
out = self.definition.to_gate()
|
207
|
+
out.name = self.name
|
208
|
+
return out
|
209
|
+
|
210
|
+
def validate_parameter(self, parameter):
|
211
|
+
"""Unitary gate parameter has to be an ndarray."""
|
212
|
+
if isinstance(parameter, numpy.ndarray):
|
213
|
+
return parameter
|
214
|
+
else:
|
215
|
+
raise CircuitError(f"invalid param type {type(parameter)} in gate {self.name}")
|
@@ -0,0 +1,86 @@
|
|
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
|
+
"""Graph State circuit."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
import numpy as np
|
18
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
19
|
+
from qiskit.circuit.exceptions import CircuitError
|
20
|
+
|
21
|
+
|
22
|
+
class GraphState(QuantumCircuit):
|
23
|
+
r"""Circuit to prepare a graph state.
|
24
|
+
|
25
|
+
Given a graph G = (V, E), with the set of vertices V and the set of edges E,
|
26
|
+
the corresponding graph state is defined as
|
27
|
+
|
28
|
+
.. math::
|
29
|
+
|
30
|
+
|G\rangle = \prod_{(a,b) \in E} CZ_{(a,b)} {|+\rangle}^{\otimes V}
|
31
|
+
|
32
|
+
Such a state can be prepared by first preparing all qubits in the :math:`+`
|
33
|
+
state, then applying a :math:`CZ` gate for each corresponding graph edge.
|
34
|
+
|
35
|
+
Graph state preparation circuits are Clifford circuits, and thus
|
36
|
+
easy to simulate classically. However, by adding a layer of measurements
|
37
|
+
in a product basis at the end, there is evidence that the circuit becomes
|
38
|
+
hard to simulate [2].
|
39
|
+
|
40
|
+
**Reference Circuit:**
|
41
|
+
|
42
|
+
.. plot::
|
43
|
+
|
44
|
+
from qiskit.circuit.library import GraphState
|
45
|
+
from qiskit.visualization.library import _generate_circuit_library_visualization
|
46
|
+
import rustworkx as rx
|
47
|
+
G = rx.generators.cycle_graph(5)
|
48
|
+
circuit = GraphState(rx.adjacency_matrix(G))
|
49
|
+
_generate_circuit_library_visualization(circuit)
|
50
|
+
|
51
|
+
**References:**
|
52
|
+
|
53
|
+
[1] M. Hein, J. Eisert, H.J. Briegel, Multi-party Entanglement in Graph States,
|
54
|
+
`arXiv:0307130 <https://arxiv.org/pdf/quant-ph/0307130.pdf>`_
|
55
|
+
[2] D. Koh, Further Extensions of Clifford Circuits & their Classical Simulation Complexities.
|
56
|
+
`arXiv:1512.07892 <https://arxiv.org/pdf/1512.07892.pdf>`_
|
57
|
+
"""
|
58
|
+
|
59
|
+
def __init__(self, adjacency_matrix: list | np.ndarray) -> None:
|
60
|
+
"""Create graph state preparation circuit.
|
61
|
+
|
62
|
+
Args:
|
63
|
+
adjacency_matrix: input graph as n-by-n list of 0-1 lists
|
64
|
+
|
65
|
+
Raises:
|
66
|
+
CircuitError: If adjacency_matrix is not symmetric.
|
67
|
+
|
68
|
+
The circuit prepares a graph state with the given adjacency
|
69
|
+
matrix.
|
70
|
+
"""
|
71
|
+
|
72
|
+
adjacency_matrix = np.asarray(adjacency_matrix)
|
73
|
+
if not np.allclose(adjacency_matrix, adjacency_matrix.transpose()):
|
74
|
+
raise CircuitError("The adjacency matrix must be symmetric.")
|
75
|
+
|
76
|
+
num_qubits = len(adjacency_matrix)
|
77
|
+
circuit = QuantumCircuit(num_qubits, name=f"graph: {adjacency_matrix}")
|
78
|
+
|
79
|
+
circuit.h(range(num_qubits))
|
80
|
+
for i in range(num_qubits):
|
81
|
+
for j in range(i + 1, num_qubits):
|
82
|
+
if adjacency_matrix[i][j] == 1:
|
83
|
+
circuit.cz(i, j)
|
84
|
+
|
85
|
+
super().__init__(*circuit.qregs, name=circuit.name)
|
86
|
+
self.compose(circuit.to_gate(), qubits=self.qubits, inplace=True)
|
@@ -0,0 +1,311 @@
|
|
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 Grover operator."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
from typing import List, Optional, Union
|
17
|
+
import numpy
|
18
|
+
|
19
|
+
from qiskit.circuit import QuantumCircuit, QuantumRegister, AncillaRegister
|
20
|
+
from qiskit.exceptions import QiskitError
|
21
|
+
from qiskit.quantum_info import Statevector, Operator, DensityMatrix
|
22
|
+
from .standard_gates import MCXGate
|
23
|
+
|
24
|
+
|
25
|
+
class GroverOperator(QuantumCircuit):
|
26
|
+
r"""The Grover operator.
|
27
|
+
|
28
|
+
Grover's search algorithm [1, 2] consists of repeated applications of the so-called
|
29
|
+
Grover operator used to amplify the amplitudes of the desired output states.
|
30
|
+
This operator, :math:`\mathcal{Q}`, consists of the phase oracle, :math:`\mathcal{S}_f`,
|
31
|
+
zero phase-shift or zero reflection, :math:`\mathcal{S}_0`, and an
|
32
|
+
input state preparation :math:`\mathcal{A}`:
|
33
|
+
|
34
|
+
.. math::
|
35
|
+
\mathcal{Q} = \mathcal{A} \mathcal{S}_0 \mathcal{A}^\dagger \mathcal{S}_f
|
36
|
+
|
37
|
+
In the standard Grover search we have :math:`\mathcal{A} = H^{\otimes n}`:
|
38
|
+
|
39
|
+
.. math::
|
40
|
+
\mathcal{Q} = H^{\otimes n} \mathcal{S}_0 H^{\otimes n} \mathcal{S}_f
|
41
|
+
= D \mathcal{S_f}
|
42
|
+
|
43
|
+
The operation :math:`D = H^{\otimes n} \mathcal{S}_0 H^{\otimes n}` is also referred to as
|
44
|
+
diffusion operator. In this formulation we can see that Grover's operator consists of two
|
45
|
+
steps: first, the phase oracle multiplies the good states by -1 (with :math:`\mathcal{S}_f`)
|
46
|
+
and then the whole state is reflected around the mean (with :math:`D`).
|
47
|
+
|
48
|
+
This class allows setting a different state preparation, as in quantum amplitude
|
49
|
+
amplification (a generalization of Grover's algorithm), :math:`\mathcal{A}` might not be
|
50
|
+
a layer of Hardamard gates [3].
|
51
|
+
|
52
|
+
The action of the phase oracle :math:`\mathcal{S}_f` is defined as
|
53
|
+
|
54
|
+
.. math::
|
55
|
+
\mathcal{S}_f: |x\rangle \mapsto (-1)^{f(x)}|x\rangle
|
56
|
+
|
57
|
+
where :math:`f(x) = 1` if :math:`x` is a good state and 0 otherwise. To highlight the fact
|
58
|
+
that this oracle flips the phase of the good states and does not flip the state of a result
|
59
|
+
qubit, we call :math:`\mathcal{S}_f` a phase oracle.
|
60
|
+
|
61
|
+
Note that you can easily construct a phase oracle from a bitflip oracle by sandwiching the
|
62
|
+
controlled X gate on the result qubit by a X and H gate. For instance
|
63
|
+
|
64
|
+
.. parsed-literal::
|
65
|
+
|
66
|
+
Bitflip oracle Phaseflip oracle
|
67
|
+
q_0: ──■── q_0: ────────────■────────────
|
68
|
+
┌─┴─┐ ┌───┐┌───┐┌─┴─┐┌───┐┌───┐
|
69
|
+
out: ┤ X ├ out: ┤ X ├┤ H ├┤ X ├┤ H ├┤ X ├
|
70
|
+
└───┘ └───┘└───┘└───┘└───┘└───┘
|
71
|
+
|
72
|
+
There is some flexibility in defining the oracle and :math:`\mathcal{A}` operator. Before the
|
73
|
+
Grover operator is applied in Grover's algorithm, the qubits are first prepared with one
|
74
|
+
application of the :math:`\mathcal{A}` operator (or Hadamard gates in the standard formulation).
|
75
|
+
Thus, we always have operation of the form
|
76
|
+
:math:`\mathcal{A} \mathcal{S}_f \mathcal{A}^\dagger`. Therefore it is possible to move
|
77
|
+
bitflip logic into :math:`\mathcal{A}` and leaving the oracle only to do phaseflips via Z gates
|
78
|
+
based on the bitflips. One possible use-case for this are oracles that do not uncompute the
|
79
|
+
state qubits.
|
80
|
+
|
81
|
+
The zero reflection :math:`\mathcal{S}_0` is usually defined as
|
82
|
+
|
83
|
+
.. math::
|
84
|
+
\mathcal{S}_0 = 2 |0\rangle^{\otimes n} \langle 0|^{\otimes n} - \mathbb{I}_n
|
85
|
+
|
86
|
+
where :math:`\mathbb{I}_n` is the identity on :math:`n` qubits.
|
87
|
+
By default, this class implements the negative version
|
88
|
+
:math:`2 |0\rangle^{\otimes n} \langle 0|^{\otimes n} - \mathbb{I}_n`, since this can simply
|
89
|
+
be implemented with a multi-controlled Z sandwiched by X gates on the target qubit and the
|
90
|
+
introduced global phase does not matter for Grover's algorithm.
|
91
|
+
|
92
|
+
Examples:
|
93
|
+
>>> from qiskit.circuit import QuantumCircuit
|
94
|
+
>>> from qiskit.circuit.library import GroverOperator
|
95
|
+
>>> oracle = QuantumCircuit(2)
|
96
|
+
>>> oracle.z(0) # good state = first qubit is |1>
|
97
|
+
>>> grover_op = GroverOperator(oracle, insert_barriers=True)
|
98
|
+
>>> grover_op.decompose().draw()
|
99
|
+
┌───┐ ░ ┌───┐ ░ ┌───┐ ┌───┐ ░ ┌───┐
|
100
|
+
state_0: ┤ Z ├─░─┤ H ├─░─┤ X ├───────■──┤ X ├──────░─┤ H ├
|
101
|
+
└───┘ ░ ├───┤ ░ ├───┤┌───┐┌─┴─┐├───┤┌───┐ ░ ├───┤
|
102
|
+
state_1: ──────░─┤ H ├─░─┤ X ├┤ H ├┤ X ├┤ H ├┤ X ├─░─┤ H ├
|
103
|
+
░ └───┘ ░ └───┘└───┘└───┘└───┘└───┘ ░ └───┘
|
104
|
+
|
105
|
+
>>> oracle = QuantumCircuit(1)
|
106
|
+
>>> oracle.z(0) # the qubit state |1> is the good state
|
107
|
+
>>> state_preparation = QuantumCircuit(1)
|
108
|
+
>>> state_preparation.ry(0.2, 0) # non-uniform state preparation
|
109
|
+
>>> grover_op = GroverOperator(oracle, state_preparation)
|
110
|
+
>>> grover_op.decompose().draw()
|
111
|
+
┌───┐┌──────────┐┌───┐┌───┐┌───┐┌─────────┐
|
112
|
+
state_0: ┤ Z ├┤ RY(-0.2) ├┤ X ├┤ Z ├┤ X ├┤ RY(0.2) ├
|
113
|
+
└───┘└──────────┘└───┘└───┘└───┘└─────────┘
|
114
|
+
|
115
|
+
>>> oracle = QuantumCircuit(4)
|
116
|
+
>>> oracle.z(3)
|
117
|
+
>>> reflection_qubits = [0, 3]
|
118
|
+
>>> state_preparation = QuantumCircuit(4)
|
119
|
+
>>> state_preparation.cry(0.1, 0, 3)
|
120
|
+
>>> state_preparation.ry(0.5, 3)
|
121
|
+
>>> grover_op = GroverOperator(oracle, state_preparation,
|
122
|
+
... reflection_qubits=reflection_qubits)
|
123
|
+
>>> grover_op.decompose().draw()
|
124
|
+
┌───┐ ┌───┐
|
125
|
+
state_0: ──────────────────────■──────┤ X ├───────■──┤ X ├──────────■────────────────
|
126
|
+
│ └───┘ │ └───┘ │
|
127
|
+
state_1: ──────────────────────┼──────────────────┼─────────────────┼────────────────
|
128
|
+
│ │ │
|
129
|
+
state_2: ──────────────────────┼──────────────────┼─────────────────┼────────────────
|
130
|
+
┌───┐┌──────────┐┌────┴─────┐┌───┐┌───┐┌─┴─┐┌───┐┌───┐┌────┴────┐┌─────────┐
|
131
|
+
state_3: ┤ Z ├┤ RY(-0.5) ├┤ RY(-0.1) ├┤ X ├┤ H ├┤ X ├┤ H ├┤ X ├┤ RY(0.1) ├┤ RY(0.5) ├
|
132
|
+
└───┘└──────────┘└──────────┘└───┘└───┘└───┘└───┘└───┘└─────────┘└─────────┘
|
133
|
+
|
134
|
+
>>> mark_state = Statevector.from_label('011')
|
135
|
+
>>> diffuse_operator = 2 * DensityMatrix.from_label('000') - Operator.from_label('III')
|
136
|
+
>>> grover_op = GroverOperator(oracle=mark_state, zero_reflection=diffuse_operator)
|
137
|
+
>>> grover_op.decompose().draw(fold=70)
|
138
|
+
┌─────────────────┐ ┌───┐ »
|
139
|
+
state_0: ┤0 ├──────┤ H ├──────────────────────────»
|
140
|
+
│ │┌─────┴───┴─────┐ ┌───┐ »
|
141
|
+
state_1: ┤1 UCRZ(0,pi,0,0) ├┤0 ├─────┤ H ├──────────»
|
142
|
+
│ ││ UCRZ(pi/2,0) │┌────┴───┴────┐┌───┐»
|
143
|
+
state_2: ┤2 ├┤1 ├┤ UCRZ(-pi/4) ├┤ H ├»
|
144
|
+
└─────────────────┘└───────────────┘└─────────────┘└───┘»
|
145
|
+
« ┌─────────────────┐ ┌───┐
|
146
|
+
«state_0: ┤0 ├──────┤ H ├─────────────────────────
|
147
|
+
« │ │┌─────┴───┴─────┐ ┌───┐
|
148
|
+
«state_1: ┤1 UCRZ(pi,0,0,0) ├┤0 ├────┤ H ├──────────
|
149
|
+
« │ ││ UCRZ(pi/2,0) │┌───┴───┴────┐┌───┐
|
150
|
+
«state_2: ┤2 ├┤1 ├┤ UCRZ(pi/4) ├┤ H ├
|
151
|
+
« └─────────────────┘└───────────────┘└────────────┘└───┘
|
152
|
+
|
153
|
+
References:
|
154
|
+
[1]: L. K. Grover (1996), A fast quantum mechanical algorithm for database search,
|
155
|
+
`arXiv:quant-ph/9605043 <https://arxiv.org/abs/quant-ph/9605043>`_.
|
156
|
+
[2]: I. Chuang & M. Nielsen, Quantum Computation and Quantum Information,
|
157
|
+
Cambridge: Cambridge University Press, 2000. Chapter 6.1.2.
|
158
|
+
[3]: Brassard, G., Hoyer, P., Mosca, M., & Tapp, A. (2000).
|
159
|
+
Quantum Amplitude Amplification and Estimation.
|
160
|
+
`arXiv:quant-ph/0005055 <http://arxiv.org/abs/quant-ph/0005055>`_.
|
161
|
+
"""
|
162
|
+
|
163
|
+
def __init__(
|
164
|
+
self,
|
165
|
+
oracle: Union[QuantumCircuit, Statevector],
|
166
|
+
state_preparation: Optional[QuantumCircuit] = None,
|
167
|
+
zero_reflection: Optional[Union[QuantumCircuit, DensityMatrix, Operator]] = None,
|
168
|
+
reflection_qubits: Optional[List[int]] = None,
|
169
|
+
insert_barriers: bool = False,
|
170
|
+
mcx_mode: str = "noancilla",
|
171
|
+
name: str = "Q",
|
172
|
+
) -> None:
|
173
|
+
r"""
|
174
|
+
Args:
|
175
|
+
oracle: The phase oracle implementing a reflection about the bad state. Note that this
|
176
|
+
is not a bitflip oracle, see the docstring for more information.
|
177
|
+
state_preparation: The operator preparing the good and bad state.
|
178
|
+
For Grover's algorithm, this is a n-qubit Hadamard gate and for amplitude
|
179
|
+
amplification or estimation the operator :math:`\mathcal{A}`.
|
180
|
+
zero_reflection: The reflection about the zero state, :math:`\mathcal{S}_0`.
|
181
|
+
reflection_qubits: Qubits on which the zero reflection acts on.
|
182
|
+
insert_barriers: Whether barriers should be inserted between the reflections and A.
|
183
|
+
mcx_mode: The mode to use for building the default zero reflection.
|
184
|
+
name: The name of the circuit.
|
185
|
+
"""
|
186
|
+
super().__init__(name=name)
|
187
|
+
|
188
|
+
# store inputs
|
189
|
+
if isinstance(oracle, Statevector):
|
190
|
+
from qiskit.circuit.library import Diagonal # pylint: disable=cyclic-import
|
191
|
+
|
192
|
+
oracle = Diagonal((-1) ** oracle.data)
|
193
|
+
self._oracle = oracle
|
194
|
+
|
195
|
+
if isinstance(zero_reflection, (Operator, DensityMatrix)):
|
196
|
+
from qiskit.circuit.library import Diagonal # pylint: disable=cyclic-import
|
197
|
+
|
198
|
+
zero_reflection = Diagonal(zero_reflection.data.diagonal())
|
199
|
+
self._zero_reflection = zero_reflection
|
200
|
+
|
201
|
+
self._reflection_qubits = reflection_qubits
|
202
|
+
self._state_preparation = state_preparation
|
203
|
+
self._insert_barriers = insert_barriers
|
204
|
+
self._mcx_mode = mcx_mode
|
205
|
+
|
206
|
+
# build circuit
|
207
|
+
self._build()
|
208
|
+
|
209
|
+
@property
|
210
|
+
def reflection_qubits(self):
|
211
|
+
"""Reflection qubits, on which S0 is applied (if S0 is not user-specified)."""
|
212
|
+
if self._reflection_qubits is not None:
|
213
|
+
return self._reflection_qubits
|
214
|
+
|
215
|
+
num_state_qubits = self.oracle.num_qubits - self.oracle.num_ancillas
|
216
|
+
return list(range(num_state_qubits))
|
217
|
+
|
218
|
+
@property
|
219
|
+
def zero_reflection(self) -> QuantumCircuit:
|
220
|
+
"""The subcircuit implementing the reflection about 0."""
|
221
|
+
if self._zero_reflection is not None:
|
222
|
+
return self._zero_reflection
|
223
|
+
|
224
|
+
num_state_qubits = self.oracle.num_qubits - self.oracle.num_ancillas
|
225
|
+
return _zero_reflection(num_state_qubits, self.reflection_qubits, self._mcx_mode)
|
226
|
+
|
227
|
+
@property
|
228
|
+
def state_preparation(self) -> QuantumCircuit:
|
229
|
+
"""The subcircuit implementing the A operator or Hadamards."""
|
230
|
+
if self._state_preparation is not None:
|
231
|
+
return self._state_preparation
|
232
|
+
|
233
|
+
num_state_qubits = self.oracle.num_qubits - self.oracle.num_ancillas
|
234
|
+
hadamards = QuantumCircuit(num_state_qubits, name="H")
|
235
|
+
# apply Hadamards only on reflection qubits, rest will cancel out
|
236
|
+
hadamards.h(self.reflection_qubits)
|
237
|
+
return hadamards
|
238
|
+
|
239
|
+
@property
|
240
|
+
def oracle(self):
|
241
|
+
"""The oracle implementing a reflection about the bad state."""
|
242
|
+
return self._oracle
|
243
|
+
|
244
|
+
def _build(self):
|
245
|
+
num_state_qubits = self.oracle.num_qubits - self.oracle.num_ancillas
|
246
|
+
circuit = QuantumCircuit(QuantumRegister(num_state_qubits, name="state"), name="Q")
|
247
|
+
num_ancillas = numpy.max(
|
248
|
+
[
|
249
|
+
self.oracle.num_ancillas,
|
250
|
+
self.zero_reflection.num_ancillas,
|
251
|
+
self.state_preparation.num_ancillas,
|
252
|
+
]
|
253
|
+
)
|
254
|
+
if num_ancillas > 0:
|
255
|
+
circuit.add_register(AncillaRegister(num_ancillas, name="ancilla"))
|
256
|
+
|
257
|
+
circuit.compose(self.oracle, list(range(self.oracle.num_qubits)), inplace=True)
|
258
|
+
if self._insert_barriers:
|
259
|
+
circuit.barrier()
|
260
|
+
circuit.compose(
|
261
|
+
self.state_preparation.inverse(),
|
262
|
+
list(range(self.state_preparation.num_qubits)),
|
263
|
+
inplace=True,
|
264
|
+
)
|
265
|
+
if self._insert_barriers:
|
266
|
+
circuit.barrier()
|
267
|
+
circuit.compose(
|
268
|
+
self.zero_reflection, list(range(self.zero_reflection.num_qubits)), inplace=True
|
269
|
+
)
|
270
|
+
if self._insert_barriers:
|
271
|
+
circuit.barrier()
|
272
|
+
circuit.compose(
|
273
|
+
self.state_preparation, list(range(self.state_preparation.num_qubits)), inplace=True
|
274
|
+
)
|
275
|
+
|
276
|
+
# minus sign
|
277
|
+
circuit.global_phase = numpy.pi
|
278
|
+
|
279
|
+
self.add_register(*circuit.qregs)
|
280
|
+
try:
|
281
|
+
circuit_wrapped = circuit.to_gate()
|
282
|
+
except QiskitError:
|
283
|
+
circuit_wrapped = circuit.to_instruction()
|
284
|
+
|
285
|
+
self.compose(circuit_wrapped, qubits=self.qubits, inplace=True)
|
286
|
+
|
287
|
+
|
288
|
+
# TODO use the oracle compiler or the bit string oracle
|
289
|
+
def _zero_reflection(
|
290
|
+
num_state_qubits: int, qubits: List[int], mcx_mode: Optional[str] = None
|
291
|
+
) -> QuantumCircuit:
|
292
|
+
qr_state = QuantumRegister(num_state_qubits, "state")
|
293
|
+
reflection = QuantumCircuit(qr_state, name="S_0")
|
294
|
+
|
295
|
+
num_ancillas = MCXGate.get_num_ancilla_qubits(len(qubits) - 1, mcx_mode)
|
296
|
+
if num_ancillas > 0:
|
297
|
+
qr_ancilla = AncillaRegister(num_ancillas, "ancilla")
|
298
|
+
reflection.add_register(qr_ancilla)
|
299
|
+
else:
|
300
|
+
qr_ancilla = AncillaRegister(0)
|
301
|
+
|
302
|
+
reflection.x(qubits)
|
303
|
+
if len(qubits) == 1:
|
304
|
+
reflection.z(0) # MCX does not allow 0 control qubits, therefore this is separate
|
305
|
+
else:
|
306
|
+
reflection.h(qubits[-1])
|
307
|
+
reflection.mcx(qubits[:-1], qubits[-1], qr_ancilla[:], mode=mcx_mode)
|
308
|
+
reflection.h(qubits[-1])
|
309
|
+
reflection.x(qubits)
|
310
|
+
|
311
|
+
return reflection
|