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,384 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2021.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""A product formula base for decomposing non-commuting operator exponentials."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
import inspect
|
18
|
+
from collections.abc import Callable
|
19
|
+
from typing import Any
|
20
|
+
from functools import partial
|
21
|
+
import numpy as np
|
22
|
+
from qiskit.circuit.parameterexpression import ParameterExpression
|
23
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
24
|
+
from qiskit.quantum_info import SparsePauliOp, Pauli
|
25
|
+
from qiskit.utils.deprecation import deprecate_arg
|
26
|
+
|
27
|
+
from .evolution_synthesis import EvolutionSynthesis
|
28
|
+
|
29
|
+
|
30
|
+
class ProductFormula(EvolutionSynthesis):
|
31
|
+
"""Product formula base class for the decomposition of non-commuting operator exponentials.
|
32
|
+
|
33
|
+
:obj:`.LieTrotter` and :obj:`.SuzukiTrotter` inherit from this class.
|
34
|
+
"""
|
35
|
+
|
36
|
+
@deprecate_arg(
|
37
|
+
name="atomic_evolution",
|
38
|
+
since="1.2",
|
39
|
+
predicate=lambda callable: callable is not None
|
40
|
+
and len(inspect.signature(callable).parameters) == 2,
|
41
|
+
deprecation_description=(
|
42
|
+
"The 'Callable[[Pauli | SparsePauliOp, float], QuantumCircuit]' signature of the "
|
43
|
+
"'atomic_evolution' argument"
|
44
|
+
),
|
45
|
+
additional_msg=(
|
46
|
+
"Instead you should update your 'atomic_evolution' function to be of the following "
|
47
|
+
"type: 'Callable[[QuantumCircuit, Pauli | SparsePauliOp, float], None]'."
|
48
|
+
),
|
49
|
+
pending=True,
|
50
|
+
)
|
51
|
+
def __init__(
|
52
|
+
self,
|
53
|
+
order: int,
|
54
|
+
reps: int = 1,
|
55
|
+
insert_barriers: bool = False,
|
56
|
+
cx_structure: str = "chain",
|
57
|
+
atomic_evolution: (
|
58
|
+
Callable[[Pauli | SparsePauliOp, float], QuantumCircuit]
|
59
|
+
| Callable[[QuantumCircuit, Pauli | SparsePauliOp, float], None]
|
60
|
+
| None
|
61
|
+
) = None,
|
62
|
+
wrap: bool = False,
|
63
|
+
) -> None:
|
64
|
+
"""
|
65
|
+
Args:
|
66
|
+
order: The order of the product formula.
|
67
|
+
reps: The number of time steps.
|
68
|
+
insert_barriers: Whether to insert barriers between the atomic evolutions.
|
69
|
+
cx_structure: How to arrange the CX gates for the Pauli evolutions, can be
|
70
|
+
``"chain"``, where next neighbor connections are used, or ``"fountain"``,
|
71
|
+
where all qubits are connected to one. This only takes effect when
|
72
|
+
``atomic_evolution is None``.
|
73
|
+
atomic_evolution: A function to apply the evolution of a single :class:`.Pauli`, or
|
74
|
+
:class:`.SparsePauliOp` of only commuting terms, to a circuit. The function takes in
|
75
|
+
three arguments: the circuit to append the evolution to, the Pauli operator to
|
76
|
+
evolve, and the evolution time. By default, a single Pauli evolution is decomposed
|
77
|
+
into a chain of ``CX`` gates and a single ``RZ`` gate.
|
78
|
+
Alternatively, the function can also take Pauli operator and evolution time as
|
79
|
+
inputs and returns the circuit that will be appended to the overall circuit being
|
80
|
+
built.
|
81
|
+
wrap: Whether to wrap the atomic evolutions into custom gate objects. This only takes
|
82
|
+
effect when ``atomic_evolution is None``.
|
83
|
+
"""
|
84
|
+
super().__init__()
|
85
|
+
self.order = order
|
86
|
+
self.reps = reps
|
87
|
+
self.insert_barriers = insert_barriers
|
88
|
+
|
89
|
+
# user-provided atomic evolution, stored for serialization
|
90
|
+
self._atomic_evolution = atomic_evolution
|
91
|
+
self._cx_structure = cx_structure
|
92
|
+
self._wrap = wrap
|
93
|
+
|
94
|
+
# if atomic evolution is not provided, set a default
|
95
|
+
if atomic_evolution is None:
|
96
|
+
self.atomic_evolution = partial(
|
97
|
+
_default_atomic_evolution, cx_structure=cx_structure, wrap=wrap
|
98
|
+
)
|
99
|
+
|
100
|
+
elif len(inspect.signature(atomic_evolution).parameters) == 2:
|
101
|
+
|
102
|
+
def wrap_atomic_evolution(output, operator, time):
|
103
|
+
definition = atomic_evolution(operator, time)
|
104
|
+
output.compose(definition, wrap=wrap, inplace=True)
|
105
|
+
|
106
|
+
self.atomic_evolution = wrap_atomic_evolution
|
107
|
+
|
108
|
+
else:
|
109
|
+
self.atomic_evolution = atomic_evolution
|
110
|
+
|
111
|
+
@property
|
112
|
+
def settings(self) -> dict[str, Any]:
|
113
|
+
"""Return the settings in a dictionary, which can be used to reconstruct the object.
|
114
|
+
|
115
|
+
Returns:
|
116
|
+
A dictionary containing the settings of this product formula.
|
117
|
+
|
118
|
+
Raises:
|
119
|
+
NotImplementedError: If a custom atomic evolution is set, which cannot be serialized.
|
120
|
+
"""
|
121
|
+
if self._atomic_evolution is not None:
|
122
|
+
raise NotImplementedError(
|
123
|
+
"Cannot serialize a product formula with a custom atomic evolution."
|
124
|
+
)
|
125
|
+
|
126
|
+
return {
|
127
|
+
"order": self.order,
|
128
|
+
"reps": self.reps,
|
129
|
+
"insert_barriers": self.insert_barriers,
|
130
|
+
"cx_structure": self._cx_structure,
|
131
|
+
"wrap": self._wrap,
|
132
|
+
}
|
133
|
+
|
134
|
+
|
135
|
+
def evolve_pauli(
|
136
|
+
output: QuantumCircuit,
|
137
|
+
pauli: Pauli,
|
138
|
+
time: float | ParameterExpression = 1.0,
|
139
|
+
cx_structure: str = "chain",
|
140
|
+
wrap: bool = False,
|
141
|
+
label: str | None = None,
|
142
|
+
) -> None:
|
143
|
+
r"""Construct a circuit implementing the time evolution of a single Pauli string.
|
144
|
+
|
145
|
+
For a Pauli string :math:`P = \{I, X, Y, Z\}^{\otimes n}` on :math:`n` qubits and an
|
146
|
+
evolution time :math:`t`, the returned circuit implements the unitary operation
|
147
|
+
|
148
|
+
.. math::
|
149
|
+
|
150
|
+
U(t) = e^{-itP}.
|
151
|
+
|
152
|
+
Since only a single Pauli string is evolved the circuit decomposition is exact.
|
153
|
+
|
154
|
+
Args:
|
155
|
+
output: The circuit object to which to append the evolved Pauli.
|
156
|
+
pauli: The Pauli to evolve.
|
157
|
+
time: The evolution time.
|
158
|
+
cx_structure: Determine the structure of CX gates, can be either ``"chain"`` for
|
159
|
+
next-neighbor connections or ``"fountain"`` to connect directly to the top qubit.
|
160
|
+
wrap: Whether to wrap the single Pauli evolutions into custom gate objects.
|
161
|
+
label: A label for the gate.
|
162
|
+
"""
|
163
|
+
num_non_identity = len([label for label in pauli.to_label() if label != "I"])
|
164
|
+
|
165
|
+
# first check, if the Pauli is only the identity, in which case the evolution only
|
166
|
+
# adds a global phase
|
167
|
+
if num_non_identity == 0:
|
168
|
+
output.global_phase -= time
|
169
|
+
# if we evolve on a single qubit, if yes use the corresponding qubit rotation
|
170
|
+
elif num_non_identity == 1:
|
171
|
+
_single_qubit_evolution(output, pauli, time, wrap)
|
172
|
+
# same for two qubits, use Qiskit's native rotations
|
173
|
+
elif num_non_identity == 2:
|
174
|
+
_two_qubit_evolution(output, pauli, time, cx_structure, wrap)
|
175
|
+
# otherwise do basis transformation and CX chains
|
176
|
+
else:
|
177
|
+
_multi_qubit_evolution(output, pauli, time, cx_structure, wrap)
|
178
|
+
|
179
|
+
|
180
|
+
def _single_qubit_evolution(output, pauli, time, wrap):
|
181
|
+
dest = QuantumCircuit(1) if wrap else output
|
182
|
+
# Note that all phases are removed from the pauli label and are only in the coefficients.
|
183
|
+
# That's because the operators we evolved have all been translated to a SparsePauliOp.
|
184
|
+
qubits = []
|
185
|
+
label = ""
|
186
|
+
for i, pauli_i in enumerate(reversed(pauli.to_label())):
|
187
|
+
idx = 0 if wrap else i
|
188
|
+
if pauli_i == "X":
|
189
|
+
dest.rx(2 * time, idx)
|
190
|
+
qubits.append(i)
|
191
|
+
label += "X"
|
192
|
+
elif pauli_i == "Y":
|
193
|
+
dest.ry(2 * time, idx)
|
194
|
+
qubits.append(i)
|
195
|
+
label += "Y"
|
196
|
+
elif pauli_i == "Z":
|
197
|
+
dest.rz(2 * time, idx)
|
198
|
+
qubits.append(i)
|
199
|
+
label += "Z"
|
200
|
+
|
201
|
+
if wrap:
|
202
|
+
gate = dest.to_gate(label=f"exp(it {label})")
|
203
|
+
qubits = [output.qubits[q] for q in qubits]
|
204
|
+
output.append(gate, qargs=qubits, copy=False)
|
205
|
+
|
206
|
+
|
207
|
+
def _two_qubit_evolution(output, pauli, time, cx_structure, wrap):
|
208
|
+
# Get the Paulis and the qubits they act on.
|
209
|
+
# Note that all phases are removed from the pauli label and are only in the coefficients.
|
210
|
+
# That's because the operators we evolved have all been translated to a SparsePauliOp.
|
211
|
+
labels_as_array = np.array(list(reversed(pauli.to_label())))
|
212
|
+
qubits = np.where(labels_as_array != "I")[0]
|
213
|
+
indices = [0, 1] if wrap else qubits
|
214
|
+
labels = np.array([labels_as_array[idx] for idx in qubits])
|
215
|
+
|
216
|
+
dest = QuantumCircuit(2) if wrap else output
|
217
|
+
|
218
|
+
# go through all cases we have implemented in Qiskit
|
219
|
+
if all(labels == "X"): # RXX
|
220
|
+
dest.rxx(2 * time, indices[0], indices[1])
|
221
|
+
elif all(labels == "Y"): # RYY
|
222
|
+
dest.ryy(2 * time, indices[0], indices[1])
|
223
|
+
elif all(labels == "Z"): # RZZ
|
224
|
+
dest.rzz(2 * time, indices[0], indices[1])
|
225
|
+
elif labels[0] == "Z" and labels[1] == "X": # RZX
|
226
|
+
dest.rzx(2 * time, indices[0], indices[1])
|
227
|
+
elif labels[0] == "X" and labels[1] == "Z": # RXZ
|
228
|
+
dest.rzx(2 * time, indices[1], indices[0])
|
229
|
+
else: # all the others are not native in Qiskit, so use default the decomposition
|
230
|
+
_multi_qubit_evolution(output, pauli, time, cx_structure, wrap)
|
231
|
+
return
|
232
|
+
|
233
|
+
if wrap:
|
234
|
+
gate = dest.to_gate(label=f"exp(it {''.join(labels)})")
|
235
|
+
qubits = [output.qubits[q] for q in qubits]
|
236
|
+
output.append(gate, qargs=qubits, copy=False)
|
237
|
+
|
238
|
+
|
239
|
+
def _multi_qubit_evolution(output, pauli, time, cx_structure, wrap):
|
240
|
+
# get diagonalizing clifford
|
241
|
+
cliff = diagonalizing_clifford(pauli)
|
242
|
+
|
243
|
+
# get CX chain to reduce the evolution to the top qubit
|
244
|
+
if cx_structure == "chain":
|
245
|
+
chain = cnot_chain(pauli)
|
246
|
+
else:
|
247
|
+
chain = cnot_fountain(pauli)
|
248
|
+
|
249
|
+
# determine qubit to do the rotation on
|
250
|
+
target = None
|
251
|
+
# Note that all phases are removed from the pauli label and are only in the coefficients.
|
252
|
+
# That's because the operators we evolved have all been translated to a SparsePauliOp.
|
253
|
+
for i, pauli_i in enumerate(reversed(pauli.to_label())):
|
254
|
+
if pauli_i != "I":
|
255
|
+
target = i
|
256
|
+
break
|
257
|
+
|
258
|
+
# build the evolution as: diagonalization, reduction, 1q evolution, followed by inverses
|
259
|
+
dest = QuantumCircuit(pauli.num_qubits) if wrap else output
|
260
|
+
dest.compose(cliff, inplace=True)
|
261
|
+
dest.compose(chain, inplace=True)
|
262
|
+
dest.rz(2 * time, target)
|
263
|
+
dest.compose(chain.inverse(), inplace=True)
|
264
|
+
dest.compose(cliff.inverse(), inplace=True)
|
265
|
+
|
266
|
+
if wrap:
|
267
|
+
gate = dest.to_gate(label=f"exp(it {pauli.to_label()})")
|
268
|
+
output.append(gate, qargs=output.qubits, copy=False)
|
269
|
+
|
270
|
+
|
271
|
+
def diagonalizing_clifford(pauli: Pauli) -> QuantumCircuit:
|
272
|
+
"""Get the clifford circuit to diagonalize the Pauli operator.
|
273
|
+
|
274
|
+
Args:
|
275
|
+
pauli: The Pauli to diagonalize.
|
276
|
+
|
277
|
+
Returns:
|
278
|
+
A circuit to diagonalize.
|
279
|
+
"""
|
280
|
+
cliff = QuantumCircuit(pauli.num_qubits)
|
281
|
+
for i, pauli_i in enumerate(reversed(pauli.to_label())):
|
282
|
+
if pauli_i == "Y":
|
283
|
+
cliff.sdg(i)
|
284
|
+
if pauli_i in ["X", "Y"]:
|
285
|
+
cliff.h(i)
|
286
|
+
|
287
|
+
return cliff
|
288
|
+
|
289
|
+
|
290
|
+
def cnot_chain(pauli: Pauli) -> QuantumCircuit:
|
291
|
+
"""CX chain.
|
292
|
+
|
293
|
+
For example, for the Pauli with the label 'XYZIX'.
|
294
|
+
|
295
|
+
.. parsed-literal::
|
296
|
+
|
297
|
+
┌───┐
|
298
|
+
q_0: ──────────┤ X ├
|
299
|
+
└─┬─┘
|
300
|
+
q_1: ────────────┼──
|
301
|
+
┌───┐ │
|
302
|
+
q_2: ─────┤ X ├──■──
|
303
|
+
┌───┐└─┬─┘
|
304
|
+
q_3: ┤ X ├──■───────
|
305
|
+
└─┬─┘
|
306
|
+
q_4: ──■────────────
|
307
|
+
|
308
|
+
Args:
|
309
|
+
pauli: The Pauli for which to construct the CX chain.
|
310
|
+
|
311
|
+
Returns:
|
312
|
+
A circuit implementing the CX chain.
|
313
|
+
"""
|
314
|
+
|
315
|
+
chain = QuantumCircuit(pauli.num_qubits)
|
316
|
+
control, target = None, None
|
317
|
+
|
318
|
+
# iterate over the Pauli's and add CNOTs
|
319
|
+
for i, pauli_i in enumerate(pauli.to_label()):
|
320
|
+
i = pauli.num_qubits - i - 1
|
321
|
+
if pauli_i != "I":
|
322
|
+
if control is None:
|
323
|
+
control = i
|
324
|
+
else:
|
325
|
+
target = i
|
326
|
+
|
327
|
+
if control is not None and target is not None:
|
328
|
+
chain.cx(control, target)
|
329
|
+
control = i
|
330
|
+
target = None
|
331
|
+
|
332
|
+
return chain
|
333
|
+
|
334
|
+
|
335
|
+
def cnot_fountain(pauli: Pauli) -> QuantumCircuit:
|
336
|
+
"""CX chain in the fountain shape.
|
337
|
+
|
338
|
+
For example, for the Pauli with the label 'XYZIX'.
|
339
|
+
|
340
|
+
.. parsed-literal::
|
341
|
+
|
342
|
+
┌───┐┌───┐┌───┐
|
343
|
+
q_0: ┤ X ├┤ X ├┤ X ├
|
344
|
+
└─┬─┘└─┬─┘└─┬─┘
|
345
|
+
q_1: ──┼────┼────┼──
|
346
|
+
│ │ │
|
347
|
+
q_2: ──■────┼────┼──
|
348
|
+
│ │
|
349
|
+
q_3: ───────■────┼──
|
350
|
+
│
|
351
|
+
q_4: ────────────■──
|
352
|
+
|
353
|
+
Args:
|
354
|
+
pauli: The Pauli for which to construct the CX chain.
|
355
|
+
|
356
|
+
Returns:
|
357
|
+
A circuit implementing the CX chain.
|
358
|
+
"""
|
359
|
+
|
360
|
+
chain = QuantumCircuit(pauli.num_qubits)
|
361
|
+
control, target = None, None
|
362
|
+
for i, pauli_i in enumerate(reversed(pauli.to_label())):
|
363
|
+
if pauli_i != "I":
|
364
|
+
if target is None:
|
365
|
+
target = i
|
366
|
+
else:
|
367
|
+
control = i
|
368
|
+
|
369
|
+
if control is not None and target is not None:
|
370
|
+
chain.cx(control, target)
|
371
|
+
control = None
|
372
|
+
|
373
|
+
return chain
|
374
|
+
|
375
|
+
|
376
|
+
def _default_atomic_evolution(output, operator, time, cx_structure, wrap):
|
377
|
+
if isinstance(operator, Pauli):
|
378
|
+
# single Pauli operator: just exponentiate it
|
379
|
+
evolve_pauli(output, operator, time, cx_structure, wrap)
|
380
|
+
else:
|
381
|
+
# sum of Pauli operators: exponentiate each term (this assumes they commute)
|
382
|
+
pauli_list = [(Pauli(op), np.real(coeff)) for op, coeff in operator.to_list()]
|
383
|
+
for pauli, coeff in pauli_list:
|
384
|
+
evolve_pauli(output, pauli, coeff * time, cx_structure, wrap)
|
@@ -0,0 +1,131 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2021.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""QDrift Class"""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
import inspect
|
18
|
+
import math
|
19
|
+
from collections.abc import Callable
|
20
|
+
import numpy as np
|
21
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
22
|
+
from qiskit.quantum_info.operators import SparsePauliOp, Pauli
|
23
|
+
from qiskit.utils.deprecation import deprecate_arg
|
24
|
+
|
25
|
+
from .product_formula import ProductFormula
|
26
|
+
from .lie_trotter import LieTrotter
|
27
|
+
|
28
|
+
|
29
|
+
class QDrift(ProductFormula):
|
30
|
+
r"""The QDrift Trotterization method, which selects each each term in the
|
31
|
+
Trotterization randomly, with a probability proportional to its weight. Based on the work
|
32
|
+
of Earl Campbell in Ref. [1].
|
33
|
+
|
34
|
+
References:
|
35
|
+
[1]: E. Campbell, "A random compiler for fast Hamiltonian simulation" (2018).
|
36
|
+
`arXiv:quant-ph/1811.08017 <https://arxiv.org/abs/1811.08017>`_
|
37
|
+
"""
|
38
|
+
|
39
|
+
@deprecate_arg(
|
40
|
+
name="atomic_evolution",
|
41
|
+
since="1.2",
|
42
|
+
predicate=lambda callable: callable is not None
|
43
|
+
and len(inspect.signature(callable).parameters) == 2,
|
44
|
+
deprecation_description=(
|
45
|
+
"The 'Callable[[Pauli | SparsePauliOp, float], QuantumCircuit]' signature of the "
|
46
|
+
"'atomic_evolution' argument"
|
47
|
+
),
|
48
|
+
additional_msg=(
|
49
|
+
"Instead you should update your 'atomic_evolution' function to be of the following "
|
50
|
+
"type: 'Callable[[QuantumCircuit, Pauli | SparsePauliOp, float], None]'."
|
51
|
+
),
|
52
|
+
pending=True,
|
53
|
+
)
|
54
|
+
def __init__(
|
55
|
+
self,
|
56
|
+
reps: int = 1,
|
57
|
+
insert_barriers: bool = False,
|
58
|
+
cx_structure: str = "chain",
|
59
|
+
atomic_evolution: (
|
60
|
+
Callable[[Pauli | SparsePauliOp, float], QuantumCircuit]
|
61
|
+
| Callable[[QuantumCircuit, Pauli | SparsePauliOp, float], None]
|
62
|
+
| None
|
63
|
+
) = None,
|
64
|
+
seed: int | None = None,
|
65
|
+
wrap: bool = False,
|
66
|
+
) -> None:
|
67
|
+
r"""
|
68
|
+
Args:
|
69
|
+
reps: The number of times to repeat the Trotterization circuit.
|
70
|
+
insert_barriers: Whether to insert barriers between the atomic evolutions.
|
71
|
+
cx_structure: How to arrange the CX gates for the Pauli evolutions, can be
|
72
|
+
``"chain"``, where next neighbor connections are used, or ``"fountain"``, where all
|
73
|
+
qubits are connected to one. This only takes effect when
|
74
|
+
``atomic_evolution is None``.
|
75
|
+
atomic_evolution: A function to apply the evolution of a single :class:`.Pauli`, or
|
76
|
+
:class:`.SparsePauliOp` of only commuting terms, to a circuit. The function takes in
|
77
|
+
three arguments: the circuit to append the evolution to, the Pauli operator to
|
78
|
+
evolve, and the evolution time. By default, a single Pauli evolution is decomposed
|
79
|
+
into a chain of ``CX`` gates and a single ``RZ`` gate.
|
80
|
+
Alternatively, the function can also take Pauli operator and evolution time as
|
81
|
+
inputs and returns the circuit that will be appended to the overall circuit being
|
82
|
+
built.
|
83
|
+
seed: An optional seed for reproducibility of the random sampling process.
|
84
|
+
wrap: Whether to wrap the atomic evolutions into custom gate objects. This only takes
|
85
|
+
effect when ``atomic_evolution is None``.
|
86
|
+
"""
|
87
|
+
super().__init__(1, reps, insert_barriers, cx_structure, atomic_evolution, wrap)
|
88
|
+
self.sampled_ops = None
|
89
|
+
self.rng = np.random.default_rng(seed)
|
90
|
+
|
91
|
+
def synthesize(self, evolution):
|
92
|
+
# get operators and time to evolve
|
93
|
+
operators = evolution.operator
|
94
|
+
time = evolution.time
|
95
|
+
|
96
|
+
if not isinstance(operators, list):
|
97
|
+
pauli_list = [(Pauli(op), coeff) for op, coeff in operators.to_list()]
|
98
|
+
coeffs = [np.real(coeff) for op, coeff in operators.to_list()]
|
99
|
+
else:
|
100
|
+
pauli_list = [(op, 1) for op in operators]
|
101
|
+
coeffs = [1 for op in operators]
|
102
|
+
|
103
|
+
# We artificially make the weights positive
|
104
|
+
weights = np.abs(coeffs)
|
105
|
+
lambd = np.sum(weights)
|
106
|
+
|
107
|
+
num_gates = math.ceil(2 * (lambd**2) * (time**2) * self.reps)
|
108
|
+
# The protocol calls for the removal of the individual coefficients,
|
109
|
+
# and multiplication by a constant evolution time.
|
110
|
+
evolution_time = lambd * time / num_gates
|
111
|
+
|
112
|
+
self.sampled_ops = self.rng.choice(
|
113
|
+
np.array(pauli_list, dtype=object),
|
114
|
+
size=(num_gates,),
|
115
|
+
p=weights / lambd,
|
116
|
+
)
|
117
|
+
|
118
|
+
# pylint: disable=cyclic-import
|
119
|
+
from qiskit.circuit.library.pauli_evolution import PauliEvolutionGate
|
120
|
+
|
121
|
+
# Build the evolution circuit using the LieTrotter synthesis with the sampled operators
|
122
|
+
lie_trotter = LieTrotter(
|
123
|
+
insert_barriers=self.insert_barriers, atomic_evolution=self.atomic_evolution
|
124
|
+
)
|
125
|
+
evolution_circuit = PauliEvolutionGate(
|
126
|
+
sum(SparsePauliOp(np.sign(coeff) * op) for op, coeff in self.sampled_ops),
|
127
|
+
time=evolution_time,
|
128
|
+
synthesis=lie_trotter,
|
129
|
+
).definition
|
130
|
+
|
131
|
+
return evolution_circuit
|
@@ -0,0 +1,155 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2021.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""The Suzuki-Trotter product formula."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
import inspect
|
18
|
+
from collections.abc import Callable
|
19
|
+
|
20
|
+
import numpy as np
|
21
|
+
|
22
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
23
|
+
from qiskit.quantum_info.operators import SparsePauliOp, Pauli
|
24
|
+
from qiskit.utils.deprecation import deprecate_arg
|
25
|
+
|
26
|
+
|
27
|
+
from .product_formula import ProductFormula
|
28
|
+
|
29
|
+
|
30
|
+
class SuzukiTrotter(ProductFormula):
|
31
|
+
r"""The (higher order) Suzuki-Trotter product formula.
|
32
|
+
|
33
|
+
The Suzuki-Trotter formulas improve the error of the Lie-Trotter approximation.
|
34
|
+
For example, the second order decomposition is
|
35
|
+
|
36
|
+
.. math::
|
37
|
+
|
38
|
+
e^{A + B} \approx e^{B/2} e^{A} e^{B/2}.
|
39
|
+
|
40
|
+
Higher order decompositions are based on recursions, see Ref. [1] for more details.
|
41
|
+
|
42
|
+
In this implementation, the operators are provided as sum terms of a Pauli operator.
|
43
|
+
For example, in the second order Suzuki-Trotter decomposition we approximate
|
44
|
+
|
45
|
+
.. math::
|
46
|
+
|
47
|
+
e^{-it(XX + ZZ)} = e^{-it/2 ZZ}e^{-it XX}e^{-it/2 ZZ} + \mathcal{O}(t^3).
|
48
|
+
|
49
|
+
References:
|
50
|
+
[1]: D. Berry, G. Ahokas, R. Cleve and B. Sanders,
|
51
|
+
"Efficient quantum algorithms for simulating sparse Hamiltonians" (2006).
|
52
|
+
`arXiv:quant-ph/0508139 <https://arxiv.org/abs/quant-ph/0508139>`_
|
53
|
+
[2]: N. Hatano and M. Suzuki,
|
54
|
+
"Finding Exponential Product Formulas of Higher Orders" (2005).
|
55
|
+
`arXiv:math-ph/0506007 <https://arxiv.org/pdf/math-ph/0506007.pdf>`_
|
56
|
+
"""
|
57
|
+
|
58
|
+
@deprecate_arg(
|
59
|
+
name="atomic_evolution",
|
60
|
+
since="1.2",
|
61
|
+
predicate=lambda callable: callable is not None
|
62
|
+
and len(inspect.signature(callable).parameters) == 2,
|
63
|
+
deprecation_description=(
|
64
|
+
"The 'Callable[[Pauli | SparsePauliOp, float], QuantumCircuit]' signature of the "
|
65
|
+
"'atomic_evolution' argument"
|
66
|
+
),
|
67
|
+
additional_msg=(
|
68
|
+
"Instead you should update your 'atomic_evolution' function to be of the following "
|
69
|
+
"type: 'Callable[[QuantumCircuit, Pauli | SparsePauliOp, float], None]'."
|
70
|
+
),
|
71
|
+
pending=True,
|
72
|
+
)
|
73
|
+
def __init__(
|
74
|
+
self,
|
75
|
+
order: int = 2,
|
76
|
+
reps: int = 1,
|
77
|
+
insert_barriers: bool = False,
|
78
|
+
cx_structure: str = "chain",
|
79
|
+
atomic_evolution: (
|
80
|
+
Callable[[Pauli | SparsePauliOp, float], QuantumCircuit]
|
81
|
+
| Callable[[QuantumCircuit, Pauli | SparsePauliOp, float], None]
|
82
|
+
| None
|
83
|
+
) = None,
|
84
|
+
wrap: bool = False,
|
85
|
+
) -> None:
|
86
|
+
"""
|
87
|
+
Args:
|
88
|
+
order: The order of the product formula.
|
89
|
+
reps: The number of time steps.
|
90
|
+
insert_barriers: Whether to insert barriers between the atomic evolutions.
|
91
|
+
cx_structure: How to arrange the CX gates for the Pauli evolutions, can be ``"chain"``,
|
92
|
+
where next neighbor connections are used, or ``"fountain"``, where all qubits are
|
93
|
+
connected to one. This only takes effect when ``atomic_evolution is None``.
|
94
|
+
atomic_evolution: A function to apply the evolution of a single :class:`.Pauli`, or
|
95
|
+
:class:`.SparsePauliOp` of only commuting terms, to a circuit. The function takes in
|
96
|
+
three arguments: the circuit to append the evolution to, the Pauli operator to
|
97
|
+
evolve, and the evolution time. By default, a single Pauli evolution is decomposed
|
98
|
+
into a chain of ``CX`` gates and a single ``RZ`` gate.
|
99
|
+
Alternatively, the function can also take Pauli operator and evolution time as
|
100
|
+
inputs and returns the circuit that will be appended to the overall circuit being
|
101
|
+
built.
|
102
|
+
wrap: Whether to wrap the atomic evolutions into custom gate objects. This only takes
|
103
|
+
effect when ``atomic_evolution is None``.
|
104
|
+
Raises:
|
105
|
+
ValueError: If order is not even
|
106
|
+
"""
|
107
|
+
|
108
|
+
if order % 2 == 1:
|
109
|
+
raise ValueError(
|
110
|
+
"Suzuki product formulae are symmetric and therefore only defined "
|
111
|
+
"for even orders."
|
112
|
+
)
|
113
|
+
super().__init__(order, reps, insert_barriers, cx_structure, atomic_evolution, wrap)
|
114
|
+
|
115
|
+
def synthesize(self, evolution):
|
116
|
+
# get operators and time to evolve
|
117
|
+
operators = evolution.operator
|
118
|
+
time = evolution.time
|
119
|
+
|
120
|
+
if not isinstance(operators, list):
|
121
|
+
pauli_list = [(Pauli(op), np.real(coeff)) for op, coeff in operators.to_list()]
|
122
|
+
else:
|
123
|
+
pauli_list = [(op, 1) for op in operators]
|
124
|
+
|
125
|
+
ops_to_evolve = self._recurse(self.order, time / self.reps, pauli_list)
|
126
|
+
|
127
|
+
# construct the evolution circuit
|
128
|
+
single_rep = QuantumCircuit(operators[0].num_qubits)
|
129
|
+
|
130
|
+
for i, (op, coeff) in enumerate(ops_to_evolve):
|
131
|
+
self.atomic_evolution(single_rep, op, coeff)
|
132
|
+
if self.insert_barriers and i != len(ops_to_evolve) - 1:
|
133
|
+
single_rep.barrier()
|
134
|
+
|
135
|
+
return single_rep.repeat(self.reps, insert_barriers=self.insert_barriers).decompose()
|
136
|
+
|
137
|
+
@staticmethod
|
138
|
+
def _recurse(order, time, pauli_list):
|
139
|
+
if order == 1:
|
140
|
+
return pauli_list
|
141
|
+
|
142
|
+
elif order == 2:
|
143
|
+
halves = [(op, coeff * time / 2) for op, coeff in pauli_list[:-1]]
|
144
|
+
full = [(pauli_list[-1][0], time * pauli_list[-1][1])]
|
145
|
+
return halves + full + list(reversed(halves))
|
146
|
+
|
147
|
+
else:
|
148
|
+
reduction = 1 / (4 - 4 ** (1 / (order - 1)))
|
149
|
+
outer = 2 * SuzukiTrotter._recurse(
|
150
|
+
order - 2, time=reduction * time, pauli_list=pauli_list
|
151
|
+
)
|
152
|
+
inner = SuzukiTrotter._recurse(
|
153
|
+
order - 2, time=(1 - 4 * reduction) * time, pauli_list=pauli_list
|
154
|
+
)
|
155
|
+
return outer + inner + outer
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017 - 2023.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Module containing cnot circuits"""
|
14
|
+
|
15
|
+
from .cnot_synth import synth_cnot_count_full_pmh
|
16
|
+
from .linear_depth_lnn import synth_cnot_depth_line_kms
|
17
|
+
from .linear_matrix_utils import (
|
18
|
+
random_invertible_binary_matrix,
|
19
|
+
calc_inverse_matrix,
|
20
|
+
check_invertible_binary_matrix,
|
21
|
+
binary_matmul,
|
22
|
+
)
|
23
|
+
|
24
|
+
# This is re-import is kept for compatibility with Terra 0.23. Eligible for deprecation in 0.25+.
|
25
|
+
# pylint: disable=cyclic-import,wrong-import-order
|
26
|
+
from qiskit.synthesis.linear_phase import synth_cnot_phase_aam as graysynth
|