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,40 @@
|
|
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
|
+
"""
|
14
|
+
Depository for generic utility snippets.
|
15
|
+
"""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
import warnings
|
19
|
+
|
20
|
+
import numpy as np
|
21
|
+
|
22
|
+
|
23
|
+
EPSILON = 1e-6 # Fraction(1, 1_000_000)
|
24
|
+
|
25
|
+
|
26
|
+
# TODO: THIS IS A STOPGAP!!!
|
27
|
+
def safe_arccos(numerator, denominator):
|
28
|
+
"""
|
29
|
+
Computes arccos(n/d) with different (better?) numerical stability.
|
30
|
+
"""
|
31
|
+
threshold = 0.005
|
32
|
+
|
33
|
+
if abs(numerator) > abs(denominator) and abs(numerator - denominator) < threshold:
|
34
|
+
return 0.0
|
35
|
+
elif abs(numerator) > abs(denominator) and abs(numerator + denominator) < threshold:
|
36
|
+
return np.pi
|
37
|
+
else:
|
38
|
+
with warnings.catch_warnings():
|
39
|
+
warnings.filterwarnings("ignore", category=RuntimeWarning)
|
40
|
+
return np.arccos(numerator / denominator)
|
@@ -0,0 +1,133 @@
|
|
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
|
+
"""
|
14
|
+
Simple circuit constructors for Weyl reflections.
|
15
|
+
"""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
import numpy as np
|
19
|
+
|
20
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
21
|
+
from qiskit.circuit.library.standard_gates import RXGate, RYGate, RZGate
|
22
|
+
|
23
|
+
|
24
|
+
reflection_options = {
|
25
|
+
"no reflection": ([1, 1, 1], 1, []),
|
26
|
+
"reflect XX, YY": ([-1, -1, 1], 1, [RZGate]),
|
27
|
+
"reflect XX, ZZ": ([-1, 1, -1], 1, [RYGate]),
|
28
|
+
"reflect YY, ZZ": ([1, -1, -1], 1, [RXGate]),
|
29
|
+
}
|
30
|
+
"""
|
31
|
+
A table of available reflection transformations on canonical coordinates.
|
32
|
+
Entries take the form
|
33
|
+
|
34
|
+
readable_name: (reflection scalars, global phase, [gate constructors]),
|
35
|
+
|
36
|
+
where reflection scalars (a, b, c) model the map (x, y, z) |-> (ax, by, cz),
|
37
|
+
global phase is a complex unit, and gate constructors are applied in sequence
|
38
|
+
and by conjugation to the first qubit and are passed pi as a parameter.
|
39
|
+
"""
|
40
|
+
|
41
|
+
shift_options = {
|
42
|
+
"no shift": ([0, 0, 0], 1, []),
|
43
|
+
"Z shift": ([0, 0, 1], 1j, [RZGate]),
|
44
|
+
"Y shift": ([0, 1, 0], -1j, [RYGate]),
|
45
|
+
"Y,Z shift": ([0, 1, 1], 1, [RYGate, RZGate]),
|
46
|
+
"X shift": ([1, 0, 0], -1j, [RXGate]),
|
47
|
+
"X,Z shift": ([1, 0, 1], 1, [RXGate, RZGate]),
|
48
|
+
"X,Y shift": ([1, 1, 0], -1, [RXGate, RYGate]),
|
49
|
+
"X,Y,Z shift": ([1, 1, 1], -1j, [RXGate, RYGate, RZGate]),
|
50
|
+
}
|
51
|
+
"""
|
52
|
+
A table of available shift transformations on canonical coordinates. Entries
|
53
|
+
take the form
|
54
|
+
|
55
|
+
readable name: (shift scalars, global phase, [gate constructors]),
|
56
|
+
|
57
|
+
where shift scalars model the map
|
58
|
+
|
59
|
+
(x, y, z) |-> (x + a pi / 2, y + b pi / 2, z + c pi / 2) ,
|
60
|
+
|
61
|
+
global phase is a complex unit, and gate constructors are applied to the first
|
62
|
+
and second qubits and are passed pi as a parameter.
|
63
|
+
"""
|
64
|
+
|
65
|
+
|
66
|
+
def apply_reflection(reflection_name, coordinate):
|
67
|
+
"""
|
68
|
+
Given a reflection type and a canonical coordinate, applies the reflection
|
69
|
+
and describes a circuit which enacts the reflection + a global phase shift.
|
70
|
+
"""
|
71
|
+
reflection_scalars, reflection_phase_shift, source_reflection_gates = reflection_options[
|
72
|
+
reflection_name
|
73
|
+
]
|
74
|
+
reflected_coord = [x * y for x, y in zip(reflection_scalars, coordinate)]
|
75
|
+
source_reflection = QuantumCircuit(2)
|
76
|
+
for gate in source_reflection_gates:
|
77
|
+
source_reflection.append(gate(np.pi), [0])
|
78
|
+
|
79
|
+
return reflected_coord, source_reflection, reflection_phase_shift
|
80
|
+
|
81
|
+
|
82
|
+
def apply_shift(shift_name, coordinate):
|
83
|
+
"""
|
84
|
+
Given a shift type and a canonical coordinate, applies the shift and
|
85
|
+
describes a circuit which enacts the shift + a global phase shift.
|
86
|
+
"""
|
87
|
+
shift_scalars, shift_phase_shift, source_shift_gates = shift_options[shift_name]
|
88
|
+
shifted_coord = [np.pi / 2 * x + y for x, y in zip(shift_scalars, coordinate)]
|
89
|
+
|
90
|
+
source_shift = QuantumCircuit(2)
|
91
|
+
for gate in source_shift_gates:
|
92
|
+
source_shift.append(gate(np.pi), [0])
|
93
|
+
source_shift.append(gate(np.pi), [1])
|
94
|
+
|
95
|
+
return shifted_coord, source_shift, shift_phase_shift
|
96
|
+
|
97
|
+
|
98
|
+
def canonical_rotation_circuit(first_index, second_index):
|
99
|
+
"""
|
100
|
+
Given a pair of distinct indices 0 ≤ (first_index, second_index) ≤ 2,
|
101
|
+
produces a two-qubit circuit which rotates a canonical gate
|
102
|
+
|
103
|
+
a0 XX + a1 YY + a2 ZZ
|
104
|
+
|
105
|
+
into
|
106
|
+
|
107
|
+
a[first] XX + a[second] YY + a[other] ZZ .
|
108
|
+
"""
|
109
|
+
conj = QuantumCircuit(2)
|
110
|
+
|
111
|
+
if (0, 1) == (first_index, second_index):
|
112
|
+
pass # no need to do anything
|
113
|
+
elif (0, 2) == (first_index, second_index):
|
114
|
+
conj.rx(-np.pi / 2, [0])
|
115
|
+
conj.rx(np.pi / 2, [1])
|
116
|
+
elif (1, 0) == (first_index, second_index):
|
117
|
+
conj.rz(-np.pi / 2, [0])
|
118
|
+
conj.rz(-np.pi / 2, [1])
|
119
|
+
elif (1, 2) == (first_index, second_index):
|
120
|
+
conj.rz(np.pi / 2, [0])
|
121
|
+
conj.rz(np.pi / 2, [1])
|
122
|
+
conj.ry(np.pi / 2, [0])
|
123
|
+
conj.ry(-np.pi / 2, [1])
|
124
|
+
elif (2, 0) == (first_index, second_index):
|
125
|
+
conj.rz(np.pi / 2, [0])
|
126
|
+
conj.rz(np.pi / 2, [1])
|
127
|
+
conj.rx(np.pi / 2, [0])
|
128
|
+
conj.rx(-np.pi / 2, [1])
|
129
|
+
elif (2, 1) == (first_index, second_index):
|
130
|
+
conj.ry(np.pi / 2, [0])
|
131
|
+
conj.ry(-np.pi / 2, [1])
|
132
|
+
|
133
|
+
return conj
|
@@ -0,0 +1,13 @@
|
|
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 unitary synthesis methods."""
|
@@ -0,0 +1,177 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2022.
|
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
|
+
r"""
|
14
|
+
=====================================================================
|
15
|
+
Approximate Quantum Compiler (:mod:`qiskit.synthesis.unitary.aqc`)
|
16
|
+
=====================================================================
|
17
|
+
|
18
|
+
.. currentmodule:: qiskit.synthesis.unitary.aqc
|
19
|
+
|
20
|
+
Implementation of Approximate Quantum Compiler as described in the paper [1].
|
21
|
+
|
22
|
+
Interface
|
23
|
+
=========
|
24
|
+
|
25
|
+
The main public interface of this module is reached by passing ``unitary_synthesis_method='aqc'`` to
|
26
|
+
:func:`~.compiler.transpile`. This will swap the synthesis method to use
|
27
|
+
:class:`~.transpiler.passes.synthesis.AQCSynthesisPlugin`.
|
28
|
+
The individual classes are:
|
29
|
+
|
30
|
+
.. autosummary::
|
31
|
+
:toctree: ../stubs
|
32
|
+
:template: autosummary/class_no_inherited_members.rst
|
33
|
+
|
34
|
+
AQC
|
35
|
+
ApproximateCircuit
|
36
|
+
ApproximatingObjective
|
37
|
+
CNOTUnitCircuit
|
38
|
+
CNOTUnitObjective
|
39
|
+
DefaultCNOTUnitObjective
|
40
|
+
FastCNOTUnitObjective
|
41
|
+
|
42
|
+
|
43
|
+
Mathematical Detail
|
44
|
+
===================
|
45
|
+
|
46
|
+
We are interested in compiling a quantum circuit, which we formalize as finding the best
|
47
|
+
circuit representation in terms of an ordered gate sequence of a target unitary matrix
|
48
|
+
:math:`U\in U(d)`, with some additional hardware constraints. In particular, we look at
|
49
|
+
representations that could be constrained in terms of hardware connectivity, as well
|
50
|
+
as gate depth, and we choose a gate basis in terms of CNOT and rotation gates.
|
51
|
+
We recall that the combination of CNOT and rotation gates is universal in :math:`SU(d)` and
|
52
|
+
therefore it does not limit compilation.
|
53
|
+
|
54
|
+
To properly define what we mean by best circuit representation, we define the metric
|
55
|
+
as the Frobenius norm between the unitary matrix of the compiled circuit :math:`V` and
|
56
|
+
the target unitary matrix :math:`U`, i.e., :math:`\|V - U\|_{\mathrm{F}}`. This choice
|
57
|
+
is motivated by mathematical programming considerations, and it is related to other
|
58
|
+
formulations that appear in the literature. Let's take a look at the problem in more details.
|
59
|
+
|
60
|
+
Let :math:`n` be the number of qubits and :math:`d=2^n`. Given a CNOT structure :math:`ct`
|
61
|
+
and a vector of rotation angles :math:`\theta`, the parametric circuit forms a matrix
|
62
|
+
:math:`Vct(\theta)\in SU(d)`. If we are given a target circuit forming a matrix
|
63
|
+
:math:`U\in SU(d)`, then we would like to compute
|
64
|
+
|
65
|
+
.. math::
|
66
|
+
|
67
|
+
\mathrm{argmax}_{\theta}\frac{1}{d}|\langle Vct(\theta),U\rangle|
|
68
|
+
|
69
|
+
where the inner product is the Frobenius inner product. Note that
|
70
|
+
:math:`|\langle V,U\rangle|\leq d` for all unitaries :math:`U` and :math:`V`, so the objective
|
71
|
+
has range in :math:`[0,1]`.
|
72
|
+
|
73
|
+
Our strategy is to maximize
|
74
|
+
|
75
|
+
.. math::
|
76
|
+
|
77
|
+
\frac{1}{d}\Re \langle Vct(\theta),U\rangle
|
78
|
+
|
79
|
+
using its gradient. We will now discuss the specifics by going through an example.
|
80
|
+
|
81
|
+
While the range of :math:`Vct` is a subset of :math:`SU(d)` by construction, the target
|
82
|
+
circuit may form a general unitary matrix. However, for any :math:`U\in U(d)`,
|
83
|
+
|
84
|
+
.. math::
|
85
|
+
|
86
|
+
\frac{\exp(2\pi i k/d)}{\det(U)^{1/d}}U\in SU(d)\text{ for all }k\in\{0,\ldots,d-1\}.
|
87
|
+
|
88
|
+
Thus, we should normalize the target circuit by its global phase and then approximately
|
89
|
+
compile the normalized circuit. We can add the global phase back in afterwards.
|
90
|
+
|
91
|
+
In the algorithm let :math:`U'` denote the un-normalized target matrix and :math:`U`
|
92
|
+
the normalized target matrix. Now that we have :math:`U`, we give the gradient function
|
93
|
+
to the Nesterov's method optimizer and compute :math:`\theta`.
|
94
|
+
|
95
|
+
To add the global phase back in, we can form the control circuit as
|
96
|
+
|
97
|
+
.. math::
|
98
|
+
|
99
|
+
\frac{\langle Vct(\theta),U'\rangle}{|\langle Vct(\theta),U'\rangle|}Vct(\theta).
|
100
|
+
|
101
|
+
Note that while we optimized using Nesterov's method in the paper, this was for its convergence
|
102
|
+
guarantees, not its speed in practice. It is much faster to use L-BFGS which is used as a
|
103
|
+
default optimizer in this implementation.
|
104
|
+
|
105
|
+
A basic usage of the AQC algorithm should consist of the following steps::
|
106
|
+
|
107
|
+
# Define a target circuit as a unitary matrix
|
108
|
+
unitary = ...
|
109
|
+
|
110
|
+
# Define a number of qubits for the algorithm, at least 3 qubits
|
111
|
+
num_qubits = round(math.log2(unitary.shape[0]))
|
112
|
+
|
113
|
+
# Choose a layout of the CNOT structure for the approximate circuit, e.g. ``spin`` for
|
114
|
+
# a linear layout.
|
115
|
+
layout = options.get("layout") or "spin"
|
116
|
+
|
117
|
+
# Choose a connectivity type, e.g. ``full`` for full connectivity between qubits.
|
118
|
+
connectivity = options.get("connectivity") or "full"
|
119
|
+
|
120
|
+
# Define a targeted depth of the approximate circuit in the number of CNOT units.
|
121
|
+
depth = int(options.get("depth") or 0)
|
122
|
+
|
123
|
+
# Generate a network made of CNOT units
|
124
|
+
cnots = make_cnot_network(
|
125
|
+
num_qubits=num_qubits,
|
126
|
+
network_layout=layout,
|
127
|
+
connectivity_type=connectivity,
|
128
|
+
depth=depth
|
129
|
+
)
|
130
|
+
|
131
|
+
# Create an optimizer to be used by AQC
|
132
|
+
optimizer = partial(scipy.optimize.minimize, method="L-BFGS-B")
|
133
|
+
|
134
|
+
# Create an instance
|
135
|
+
aqc = AQC(optimizer)
|
136
|
+
|
137
|
+
# Create a template circuit that will approximate our target circuit
|
138
|
+
approximate_circuit = CNOTUnitCircuit(num_qubits=num_qubits, cnots=cnots)
|
139
|
+
|
140
|
+
# Create an objective that defines our optimization problem
|
141
|
+
approximating_objective = DefaultCNOTUnitObjective(num_qubits=num_qubits, cnots=cnots)
|
142
|
+
|
143
|
+
# Run optimization process to compile the unitary
|
144
|
+
aqc.compile_unitary(
|
145
|
+
target_matrix=unitary,
|
146
|
+
approximate_circuit=approximate_circuit,
|
147
|
+
approximating_objective=approximating_objective
|
148
|
+
)
|
149
|
+
|
150
|
+
Now ``approximate_circuit`` is a circuit that approximates the target unitary to a certain
|
151
|
+
degree and can be used instead of the original matrix.
|
152
|
+
|
153
|
+
This uses a helper function, :obj:`make_cnot_network`.
|
154
|
+
|
155
|
+
.. autofunction:: make_cnot_network
|
156
|
+
|
157
|
+
One can take advantage of accelerated version of objective function. It implements the same
|
158
|
+
mathematical algorithm as the default one ``DefaultCNOTUnitObjective`` but runs several times
|
159
|
+
faster. Instantiation of accelerated objective function class is similar to the default case:
|
160
|
+
|
161
|
+
# Create an objective that defines our optimization problem
|
162
|
+
approximating_objective = FastCNOTUnitObjective(num_qubits=num_qubits, cnots=cnots)
|
163
|
+
|
164
|
+
The rest of the code in the above example does not change.
|
165
|
+
|
166
|
+
References:
|
167
|
+
|
168
|
+
[1]: Liam Madden, Andrea Simonetto, Best Approximate Quantum Compiling Problems.
|
169
|
+
`arXiv:2106.05649 <https://arxiv.org/abs/2106.05649>`_
|
170
|
+
"""
|
171
|
+
|
172
|
+
from .approximate import ApproximateCircuit, ApproximatingObjective
|
173
|
+
from .aqc import AQC
|
174
|
+
from .cnot_structures import make_cnot_network
|
175
|
+
from .cnot_unit_circuit import CNOTUnitCircuit
|
176
|
+
from .cnot_unit_objective import CNOTUnitObjective, DefaultCNOTUnitObjective
|
177
|
+
from .fast_gradient.fast_gradient import FastCNOTUnitObjective
|
@@ -0,0 +1,116 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2021.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
"""Base classes for an approximate circuit definition."""
|
13
|
+
from __future__ import annotations
|
14
|
+
from abc import ABC, abstractmethod
|
15
|
+
from typing import Optional, SupportsFloat
|
16
|
+
import numpy as np
|
17
|
+
|
18
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
19
|
+
|
20
|
+
|
21
|
+
class ApproximateCircuit(QuantumCircuit, ABC):
|
22
|
+
"""A base class that represents an approximate circuit."""
|
23
|
+
|
24
|
+
def __init__(self, num_qubits: int, name: Optional[str] = None) -> None:
|
25
|
+
"""
|
26
|
+
Args:
|
27
|
+
num_qubits: number of qubit this circuit will span.
|
28
|
+
name: a name of the circuit.
|
29
|
+
"""
|
30
|
+
super().__init__(num_qubits, name=name)
|
31
|
+
|
32
|
+
@property
|
33
|
+
@abstractmethod
|
34
|
+
def thetas(self) -> np.ndarray:
|
35
|
+
"""
|
36
|
+
The property is not implemented and raises a ``NotImplementedException`` exception.
|
37
|
+
|
38
|
+
Returns:
|
39
|
+
a vector of parameters of this circuit.
|
40
|
+
"""
|
41
|
+
raise NotImplementedError
|
42
|
+
|
43
|
+
@abstractmethod
|
44
|
+
def build(self, thetas: np.ndarray) -> None:
|
45
|
+
"""
|
46
|
+
Constructs this circuit out of the parameters(thetas). Parameter values must be set before
|
47
|
+
constructing the circuit.
|
48
|
+
|
49
|
+
Args:
|
50
|
+
thetas: a vector of parameters to be set in this circuit.
|
51
|
+
"""
|
52
|
+
raise NotImplementedError
|
53
|
+
|
54
|
+
|
55
|
+
class ApproximatingObjective(ABC):
|
56
|
+
"""
|
57
|
+
A base class for an optimization problem definition. An implementing class must provide at least
|
58
|
+
an implementation of the ``objective`` method. In such case only gradient free optimizers can
|
59
|
+
be used. Both method, ``objective`` and ``gradient``, preferable to have in an implementation.
|
60
|
+
"""
|
61
|
+
|
62
|
+
def __init__(self) -> None:
|
63
|
+
# must be set before optimization
|
64
|
+
self._target_matrix: np.ndarray | None = None
|
65
|
+
|
66
|
+
@abstractmethod
|
67
|
+
def objective(self, param_values: np.ndarray) -> SupportsFloat:
|
68
|
+
"""
|
69
|
+
Computes a value of the objective function given a vector of parameter values.
|
70
|
+
|
71
|
+
Args:
|
72
|
+
param_values: a vector of parameter values for the optimization problem.
|
73
|
+
|
74
|
+
Returns:
|
75
|
+
a float value of the objective function.
|
76
|
+
"""
|
77
|
+
raise NotImplementedError
|
78
|
+
|
79
|
+
@abstractmethod
|
80
|
+
def gradient(self, param_values: np.ndarray) -> np.ndarray:
|
81
|
+
"""
|
82
|
+
Computes a gradient with respect to parameters given a vector of parameter values.
|
83
|
+
|
84
|
+
Args:
|
85
|
+
param_values: a vector of parameter values for the optimization problem.
|
86
|
+
|
87
|
+
Returns:
|
88
|
+
an array of gradient values.
|
89
|
+
"""
|
90
|
+
raise NotImplementedError
|
91
|
+
|
92
|
+
@property
|
93
|
+
def target_matrix(self) -> np.ndarray:
|
94
|
+
"""
|
95
|
+
Returns:
|
96
|
+
a matrix being approximated
|
97
|
+
"""
|
98
|
+
return self._target_matrix
|
99
|
+
|
100
|
+
@target_matrix.setter
|
101
|
+
def target_matrix(self, target_matrix: np.ndarray) -> None:
|
102
|
+
"""
|
103
|
+
Args:
|
104
|
+
target_matrix: a matrix to approximate in the optimization procedure.
|
105
|
+
"""
|
106
|
+
self._target_matrix = target_matrix
|
107
|
+
|
108
|
+
@property
|
109
|
+
@abstractmethod
|
110
|
+
def num_thetas(self) -> int:
|
111
|
+
"""
|
112
|
+
|
113
|
+
Returns:
|
114
|
+
the number of parameters in this optimization problem.
|
115
|
+
"""
|
116
|
+
raise NotImplementedError
|
@@ -0,0 +1,175 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2022, 2023.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
"""A generic implementation of Approximate Quantum Compiler."""
|
13
|
+
from __future__ import annotations
|
14
|
+
|
15
|
+
import typing
|
16
|
+
from functools import partial
|
17
|
+
|
18
|
+
from collections.abc import Callable
|
19
|
+
from typing import Protocol
|
20
|
+
|
21
|
+
import numpy as np
|
22
|
+
|
23
|
+
from qiskit.quantum_info import Operator
|
24
|
+
|
25
|
+
from .approximate import ApproximateCircuit, ApproximatingObjective
|
26
|
+
|
27
|
+
if typing.TYPE_CHECKING:
|
28
|
+
import scipy.optimize
|
29
|
+
|
30
|
+
|
31
|
+
class Minimizer(Protocol):
|
32
|
+
"""Callable Protocol for minimizer.
|
33
|
+
|
34
|
+
This interface is based on `SciPy's optimize module
|
35
|
+
<https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html>`__.
|
36
|
+
|
37
|
+
This protocol defines a callable taking the following parameters:
|
38
|
+
|
39
|
+
fun
|
40
|
+
The objective function to minimize.
|
41
|
+
x0
|
42
|
+
The initial point for the optimization.
|
43
|
+
jac
|
44
|
+
The gradient of the objective function.
|
45
|
+
bounds
|
46
|
+
Parameters bounds for the optimization. Note that these might not be supported
|
47
|
+
by all optimizers.
|
48
|
+
|
49
|
+
and which returns a SciPy minimization result object.
|
50
|
+
"""
|
51
|
+
|
52
|
+
def __call__(
|
53
|
+
self,
|
54
|
+
fun: Callable[[np.ndarray], float],
|
55
|
+
x0: np.ndarray, # pylint: disable=invalid-name
|
56
|
+
jac: Callable[[np.ndarray], np.ndarray] | None = None,
|
57
|
+
bounds: list[tuple[float, float]] | None = None,
|
58
|
+
) -> scipy.optimize.OptimizeResult:
|
59
|
+
"""Minimize the objective function.
|
60
|
+
|
61
|
+
This interface is based on `SciPy's optimize module <https://docs.scipy.org/doc
|
62
|
+
/scipy/reference/generated/scipy.optimize.minimize.html>`__.
|
63
|
+
|
64
|
+
Args:
|
65
|
+
fun: The objective function to minimize.
|
66
|
+
x0: The initial point for the optimization.
|
67
|
+
jac: The gradient of the objective function.
|
68
|
+
bounds: Parameters bounds for the optimization. Note that these might not be supported
|
69
|
+
by all optimizers.
|
70
|
+
|
71
|
+
Returns:
|
72
|
+
The SciPy minimization result object.
|
73
|
+
"""
|
74
|
+
... # pylint: disable=unnecessary-ellipsis
|
75
|
+
|
76
|
+
|
77
|
+
class AQC:
|
78
|
+
"""
|
79
|
+
A generic implementation of the Approximate Quantum Compiler. This implementation is agnostic of
|
80
|
+
the underlying implementation of the approximate circuit, objective, and optimizer. Users may
|
81
|
+
pass corresponding implementations of the abstract classes:
|
82
|
+
|
83
|
+
* The *optimizer* is an implementation of the :class:`~.Minimizer` protocol, a callable used to run
|
84
|
+
the optimization process. The choice of optimizer may affect overall convergence, required time
|
85
|
+
for the optimization process and achieved objective value.
|
86
|
+
|
87
|
+
* The *approximate circuit* represents a template which parameters we want to optimize. Currently,
|
88
|
+
there's only one implementation based on 4-rotations CNOT unit blocks:
|
89
|
+
:class:`.CNOTUnitCircuit`. See the paper for more details.
|
90
|
+
|
91
|
+
* The *approximate objective* is tightly coupled with the approximate circuit implementation and
|
92
|
+
provides two methods for computing objective function and gradient with respect to approximate
|
93
|
+
circuit parameters. This objective is passed to the optimizer. Currently, there are two
|
94
|
+
implementations based on 4-rotations CNOT unit blocks: :class:`.DefaultCNOTUnitObjective` and
|
95
|
+
its accelerated version :class:`.FastCNOTUnitObjective`. Both implementations share the same
|
96
|
+
idea of maximization the Hilbert-Schmidt product between the target matrix and its
|
97
|
+
approximation. The former implementation approach should be considered as a baseline one. It
|
98
|
+
may suffer from performance issues, and is mostly suitable for a small number of qubits
|
99
|
+
(up to 5 or 6), whereas the latter, accelerated one, can be applied to larger problems.
|
100
|
+
|
101
|
+
* One should take into consideration the exponential growth of matrix size with the number of
|
102
|
+
qubits because the implementation not only creates a potentially large target matrix, but
|
103
|
+
also allocates a number of temporary memory buffers comparable in size to the target matrix.
|
104
|
+
"""
|
105
|
+
|
106
|
+
def __init__(
|
107
|
+
self,
|
108
|
+
optimizer: Minimizer | None = None,
|
109
|
+
seed: int | None = None,
|
110
|
+
):
|
111
|
+
"""
|
112
|
+
Args:
|
113
|
+
optimizer: an optimizer to be used in the optimization procedure of the search for
|
114
|
+
the best approximate circuit. By default, the scipy minimizer with the
|
115
|
+
``L-BFGS-B`` method is used with max iterations set to 1000.
|
116
|
+
seed: a seed value to be used by a random number generator.
|
117
|
+
"""
|
118
|
+
import scipy.optimize
|
119
|
+
|
120
|
+
super().__init__()
|
121
|
+
self._optimizer = optimizer or partial(
|
122
|
+
scipy.optimize.minimize, args=(), method="L-BFGS-B", options={"maxiter": 1000}
|
123
|
+
)
|
124
|
+
|
125
|
+
self._seed = seed
|
126
|
+
|
127
|
+
def compile_unitary(
|
128
|
+
self,
|
129
|
+
target_matrix: np.ndarray,
|
130
|
+
approximate_circuit: ApproximateCircuit,
|
131
|
+
approximating_objective: ApproximatingObjective,
|
132
|
+
initial_point: np.ndarray | None = None,
|
133
|
+
) -> None:
|
134
|
+
"""
|
135
|
+
Approximately compiles a circuit represented as a unitary matrix by solving an optimization
|
136
|
+
problem defined by ``approximating_objective`` and using ``approximate_circuit`` as a
|
137
|
+
template for the approximate circuit.
|
138
|
+
|
139
|
+
Args:
|
140
|
+
target_matrix: a unitary matrix to approximate.
|
141
|
+
approximate_circuit: a template circuit that will be filled with the parameter values
|
142
|
+
obtained in the optimization procedure.
|
143
|
+
approximating_objective: a definition of the optimization problem.
|
144
|
+
initial_point: initial values of angles/parameters to start optimization from.
|
145
|
+
"""
|
146
|
+
matrix_dim = target_matrix.shape[0]
|
147
|
+
# check if it is actually a special unitary matrix
|
148
|
+
target_det = np.linalg.det(target_matrix)
|
149
|
+
if not np.isclose(target_det, 1):
|
150
|
+
su_matrix = target_matrix / np.power(target_det, (1 / matrix_dim), dtype=complex)
|
151
|
+
global_phase_required = True
|
152
|
+
else:
|
153
|
+
su_matrix = target_matrix
|
154
|
+
global_phase_required = False
|
155
|
+
|
156
|
+
# set the matrix to approximate in the algorithm
|
157
|
+
approximating_objective.target_matrix = su_matrix
|
158
|
+
|
159
|
+
if initial_point is None:
|
160
|
+
np.random.seed(self._seed)
|
161
|
+
initial_point = np.random.uniform(0, 2 * np.pi, approximating_objective.num_thetas)
|
162
|
+
|
163
|
+
opt_result = self._optimizer(
|
164
|
+
fun=approximating_objective.objective,
|
165
|
+
x0=initial_point,
|
166
|
+
jac=approximating_objective.gradient,
|
167
|
+
)
|
168
|
+
|
169
|
+
approximate_circuit.build(opt_result.x)
|
170
|
+
|
171
|
+
approx_matrix = Operator(approximate_circuit).data
|
172
|
+
|
173
|
+
if global_phase_required:
|
174
|
+
alpha = np.angle(np.trace(np.dot(approx_matrix.conj().T, target_matrix)))
|
175
|
+
approximate_circuit.global_phase = alpha
|