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,300 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2021.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
"""
|
13
|
+
These are the CNOT structure methods: anything that you need for creating CNOT structures.
|
14
|
+
"""
|
15
|
+
import logging
|
16
|
+
import math
|
17
|
+
|
18
|
+
import numpy as np
|
19
|
+
|
20
|
+
_NETWORK_LAYOUTS = ["sequ", "spin", "cart", "cyclic_spin", "cyclic_line"]
|
21
|
+
_CONNECTIVITY_TYPES = ["full", "line", "star"]
|
22
|
+
|
23
|
+
|
24
|
+
logger = logging.getLogger(__name__)
|
25
|
+
|
26
|
+
|
27
|
+
def _lower_limit(num_qubits: int) -> int:
|
28
|
+
"""
|
29
|
+
Returns lower limit on the number of CNOT units that guarantees exact representation of
|
30
|
+
a unitary operator by quantum gates.
|
31
|
+
|
32
|
+
Args:
|
33
|
+
num_qubits: number of qubits.
|
34
|
+
|
35
|
+
Returns:
|
36
|
+
lower limit on the number of CNOT units.
|
37
|
+
"""
|
38
|
+
num_cnots = math.ceil((4**num_qubits - 3 * num_qubits - 1) / 4.0)
|
39
|
+
return num_cnots
|
40
|
+
|
41
|
+
|
42
|
+
def make_cnot_network(
|
43
|
+
num_qubits: int,
|
44
|
+
network_layout: str = "spin",
|
45
|
+
connectivity_type: str = "full",
|
46
|
+
depth: int = 0,
|
47
|
+
) -> np.ndarray:
|
48
|
+
"""
|
49
|
+
Generates a network consisting of building blocks each containing a CNOT gate and possibly some
|
50
|
+
single-qubit ones. This network models a quantum operator in question. Note, each building
|
51
|
+
block has 2 input and outputs corresponding to a pair of qubits. What we actually return here
|
52
|
+
is a chain of indices of qubit pairs shared by every building block in a row.
|
53
|
+
|
54
|
+
Args:
|
55
|
+
num_qubits: number of qubits.
|
56
|
+
network_layout: type of network geometry, ``{"sequ", "spin", "cart", "cyclic_spin",
|
57
|
+
"cyclic_line"}``.
|
58
|
+
connectivity_type: type of inter-qubit connectivity, ``{"full", "line", "star"}``.
|
59
|
+
depth: depth of the CNOT-network, i.e. the number of layers, where each layer consists of
|
60
|
+
a single CNOT-block; default value will be selected, if ``L <= 0``.
|
61
|
+
|
62
|
+
Returns:
|
63
|
+
A matrix of size ``(2, N)`` matrix that defines layers in cnot-network, where ``N``
|
64
|
+
is either equal ``L``, or defined by a concrete type of the network.
|
65
|
+
|
66
|
+
Raises:
|
67
|
+
ValueError: if unsupported type of CNOT-network layout or number of qubits or combination
|
68
|
+
of parameters are passed.
|
69
|
+
"""
|
70
|
+
if num_qubits < 2:
|
71
|
+
raise ValueError("Number of qubits must be greater or equal to 2")
|
72
|
+
|
73
|
+
if depth <= 0:
|
74
|
+
new_depth = _lower_limit(num_qubits)
|
75
|
+
logger.debug(
|
76
|
+
"Number of CNOT units chosen as the lower limit: %d, got a non-positive value: %d",
|
77
|
+
new_depth,
|
78
|
+
depth,
|
79
|
+
)
|
80
|
+
depth = new_depth
|
81
|
+
|
82
|
+
if network_layout == "sequ":
|
83
|
+
links = _get_connectivity(num_qubits=num_qubits, connectivity=connectivity_type)
|
84
|
+
return _sequential_network(num_qubits=num_qubits, links=links, depth=depth)
|
85
|
+
|
86
|
+
elif network_layout == "spin":
|
87
|
+
return _spin_network(num_qubits=num_qubits, depth=depth)
|
88
|
+
|
89
|
+
elif network_layout == "cart":
|
90
|
+
cnots = _cartan_network(num_qubits=num_qubits)
|
91
|
+
logger.debug(
|
92
|
+
"Optimal lower bound: %d; Cartan CNOTs: %d", _lower_limit(num_qubits), cnots.shape[1]
|
93
|
+
)
|
94
|
+
return cnots
|
95
|
+
|
96
|
+
elif network_layout == "cyclic_spin":
|
97
|
+
if connectivity_type != "full":
|
98
|
+
raise ValueError(f"'{network_layout}' layout expects 'full' connectivity")
|
99
|
+
|
100
|
+
return _cyclic_spin_network(num_qubits, depth)
|
101
|
+
|
102
|
+
elif network_layout == "cyclic_line":
|
103
|
+
if connectivity_type != "line":
|
104
|
+
raise ValueError(f"'{network_layout}' layout expects 'line' connectivity")
|
105
|
+
|
106
|
+
return _cyclic_line_network(num_qubits, depth)
|
107
|
+
else:
|
108
|
+
raise ValueError(
|
109
|
+
f"Unknown type of CNOT-network layout, expects one of {_NETWORK_LAYOUTS}, "
|
110
|
+
f"got {network_layout}"
|
111
|
+
)
|
112
|
+
|
113
|
+
|
114
|
+
def _get_connectivity(num_qubits: int, connectivity: str) -> dict:
|
115
|
+
"""
|
116
|
+
Generates connectivity structure between qubits.
|
117
|
+
|
118
|
+
Args:
|
119
|
+
num_qubits: number of qubits.
|
120
|
+
connectivity: type of connectivity structure, ``{"full", "line", "star"}``.
|
121
|
+
|
122
|
+
Returns:
|
123
|
+
dictionary of allowed links between qubits.
|
124
|
+
|
125
|
+
Raises:
|
126
|
+
ValueError: if unsupported type of CNOT-network layout is passed.
|
127
|
+
"""
|
128
|
+
if num_qubits == 1:
|
129
|
+
links = {0: [0]}
|
130
|
+
|
131
|
+
elif connectivity == "full":
|
132
|
+
# Full connectivity between qubits.
|
133
|
+
links = {i: list(range(num_qubits)) for i in range(num_qubits)}
|
134
|
+
|
135
|
+
elif connectivity == "line":
|
136
|
+
# Every qubit is connected to its immediate neighbors only.
|
137
|
+
links = {i: [i - 1, i, i + 1] for i in range(1, num_qubits - 1)}
|
138
|
+
|
139
|
+
# first qubit
|
140
|
+
links[0] = [0, 1]
|
141
|
+
|
142
|
+
# last qubit
|
143
|
+
links[num_qubits - 1] = [num_qubits - 2, num_qubits - 1]
|
144
|
+
|
145
|
+
elif connectivity == "star":
|
146
|
+
# Every qubit is connected to the first one only.
|
147
|
+
links = {i: [0, i] for i in range(1, num_qubits)}
|
148
|
+
|
149
|
+
# first qubit
|
150
|
+
links[0] = list(range(num_qubits))
|
151
|
+
|
152
|
+
else:
|
153
|
+
raise ValueError(
|
154
|
+
f"Unknown connectivity type, expects one of {_CONNECTIVITY_TYPES}, got {connectivity}"
|
155
|
+
)
|
156
|
+
return links
|
157
|
+
|
158
|
+
|
159
|
+
def _sequential_network(num_qubits: int, links: dict, depth: int) -> np.ndarray:
|
160
|
+
"""
|
161
|
+
Generates a sequential network.
|
162
|
+
|
163
|
+
Args:
|
164
|
+
num_qubits: number of qubits.
|
165
|
+
links: dictionary of connectivity links.
|
166
|
+
depth: depth of the network (number of layers of building blocks).
|
167
|
+
|
168
|
+
Returns:
|
169
|
+
A matrix of ``(2, N)`` that defines layers in qubit network.
|
170
|
+
"""
|
171
|
+
layer = 0
|
172
|
+
cnots = np.zeros((2, depth), dtype=int)
|
173
|
+
while True:
|
174
|
+
for i in range(0, num_qubits - 1):
|
175
|
+
for j in range(i + 1, num_qubits):
|
176
|
+
if j in links[i]:
|
177
|
+
cnots[0, layer] = i
|
178
|
+
cnots[1, layer] = j
|
179
|
+
layer += 1
|
180
|
+
if layer >= depth:
|
181
|
+
return cnots
|
182
|
+
|
183
|
+
|
184
|
+
def _spin_network(num_qubits: int, depth: int) -> np.ndarray:
|
185
|
+
"""
|
186
|
+
Generates a spin-like network.
|
187
|
+
|
188
|
+
Args:
|
189
|
+
num_qubits: number of qubits.
|
190
|
+
depth: depth of the network (number of layers of building blocks).
|
191
|
+
|
192
|
+
Returns:
|
193
|
+
A matrix of size ``2 x L`` that defines layers in qubit network.
|
194
|
+
"""
|
195
|
+
layer = 0
|
196
|
+
cnots = np.zeros((2, depth), dtype=int)
|
197
|
+
while True:
|
198
|
+
for i in range(0, num_qubits - 1, 2):
|
199
|
+
cnots[0, layer] = i
|
200
|
+
cnots[1, layer] = i + 1
|
201
|
+
layer += 1
|
202
|
+
if layer >= depth:
|
203
|
+
return cnots
|
204
|
+
|
205
|
+
for i in range(1, num_qubits - 1, 2):
|
206
|
+
cnots[0, layer] = i
|
207
|
+
cnots[1, layer] = i + 1
|
208
|
+
layer += 1
|
209
|
+
if layer >= depth:
|
210
|
+
return cnots
|
211
|
+
|
212
|
+
|
213
|
+
def _cartan_network(num_qubits: int) -> np.ndarray:
|
214
|
+
"""
|
215
|
+
Cartan decomposition in a recursive way, starting from n = 3.
|
216
|
+
|
217
|
+
Args:
|
218
|
+
num_qubits: number of qubits.
|
219
|
+
|
220
|
+
Returns:
|
221
|
+
2xN matrix that defines layers in qubit network, where N is the
|
222
|
+
depth of Cartan decomposition.
|
223
|
+
|
224
|
+
Raises:
|
225
|
+
ValueError: if number of qubits is less than 3.
|
226
|
+
"""
|
227
|
+
n = num_qubits
|
228
|
+
if n > 3:
|
229
|
+
cnots = np.asarray([[0, 0, 0], [1, 1, 1]])
|
230
|
+
mult = np.asarray([[n - 2, n - 3, n - 2, n - 3], [n - 1, n - 1, n - 1, n - 1]])
|
231
|
+
for _ in range(n - 2):
|
232
|
+
cnots = np.hstack((np.tile(np.hstack((cnots, mult)), 3), cnots))
|
233
|
+
mult[0, -1] -= 1
|
234
|
+
mult = np.tile(mult, 2)
|
235
|
+
elif n == 3:
|
236
|
+
cnots = np.asarray(
|
237
|
+
[
|
238
|
+
[0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0],
|
239
|
+
[1, 1, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 1, 1, 1],
|
240
|
+
]
|
241
|
+
)
|
242
|
+
else:
|
243
|
+
raise ValueError(f"The number of qubits must be >= 3, got {n}.")
|
244
|
+
|
245
|
+
return cnots
|
246
|
+
|
247
|
+
|
248
|
+
def _cyclic_spin_network(num_qubits: int, depth: int) -> np.ndarray:
|
249
|
+
"""
|
250
|
+
Same as in the spin-like network, but the first and the last qubits are also connected.
|
251
|
+
|
252
|
+
Args:
|
253
|
+
num_qubits: number of qubits.
|
254
|
+
depth: depth of the network (number of layers of building blocks).
|
255
|
+
|
256
|
+
Returns:
|
257
|
+
A matrix of size ``2 x L`` that defines layers in qubit network.
|
258
|
+
"""
|
259
|
+
|
260
|
+
cnots = np.zeros((2, depth), dtype=int)
|
261
|
+
z = 0
|
262
|
+
while True:
|
263
|
+
for i in range(0, num_qubits, 2):
|
264
|
+
if i + 1 <= num_qubits - 1:
|
265
|
+
cnots[0, z] = i
|
266
|
+
cnots[1, z] = i + 1
|
267
|
+
z += 1
|
268
|
+
if z >= depth:
|
269
|
+
return cnots
|
270
|
+
|
271
|
+
for i in range(1, num_qubits, 2):
|
272
|
+
if i + 1 <= num_qubits - 1:
|
273
|
+
cnots[0, z] = i
|
274
|
+
cnots[1, z] = i + 1
|
275
|
+
z += 1
|
276
|
+
elif i == num_qubits - 1:
|
277
|
+
cnots[0, z] = i
|
278
|
+
cnots[1, z] = 0
|
279
|
+
z += 1
|
280
|
+
if z >= depth:
|
281
|
+
return cnots
|
282
|
+
|
283
|
+
|
284
|
+
def _cyclic_line_network(num_qubits: int, depth: int) -> np.ndarray:
|
285
|
+
"""
|
286
|
+
Generates a line based CNOT structure.
|
287
|
+
|
288
|
+
Args:
|
289
|
+
num_qubits: number of qubits.
|
290
|
+
depth: depth of the network (number of layers of building blocks).
|
291
|
+
|
292
|
+
Returns:
|
293
|
+
A matrix of size ``2 x L`` that defines layers in qubit network.
|
294
|
+
"""
|
295
|
+
|
296
|
+
cnots = np.zeros((2, depth), dtype=int)
|
297
|
+
for i in range(depth):
|
298
|
+
cnots[0, i] = (i + 0) % num_qubits
|
299
|
+
cnots[1, i] = (i + 1) % num_qubits
|
300
|
+
return cnots
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2021.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
"""
|
13
|
+
This is the Parametric Circuit class: anything that you need for a circuit
|
14
|
+
to be parametrized and used for approximate compiling optimization.
|
15
|
+
"""
|
16
|
+
from __future__ import annotations
|
17
|
+
from typing import Optional
|
18
|
+
|
19
|
+
import numpy as np
|
20
|
+
|
21
|
+
from .approximate import ApproximateCircuit
|
22
|
+
|
23
|
+
|
24
|
+
class CNOTUnitCircuit(ApproximateCircuit):
|
25
|
+
"""A class that represents an approximate circuit based on CNOT unit blocks."""
|
26
|
+
|
27
|
+
def __init__(
|
28
|
+
self,
|
29
|
+
num_qubits: int,
|
30
|
+
cnots: np.ndarray,
|
31
|
+
tol: Optional[float] = 0.0,
|
32
|
+
name: Optional[str] = None,
|
33
|
+
) -> None:
|
34
|
+
"""
|
35
|
+
Args:
|
36
|
+
num_qubits: the number of qubits in this circuit.
|
37
|
+
cnots: an array of dimensions ``(2, L)`` indicating where the CNOT units will be placed.
|
38
|
+
tol: angle parameter less or equal this (small) value is considered equal zero and
|
39
|
+
corresponding gate is not inserted into the output circuit (because it becomes
|
40
|
+
identity one in this case).
|
41
|
+
name: name of this circuit
|
42
|
+
|
43
|
+
Raises:
|
44
|
+
ValueError: if an unsupported parameter is passed.
|
45
|
+
"""
|
46
|
+
super().__init__(num_qubits=num_qubits, name=name)
|
47
|
+
|
48
|
+
if cnots.ndim != 2 or cnots.shape[0] != 2:
|
49
|
+
raise ValueError("CNOT structure must be defined as an array of the size (2, N)")
|
50
|
+
|
51
|
+
self._cnots = cnots
|
52
|
+
self._num_cnots = cnots.shape[1]
|
53
|
+
self._tol = tol
|
54
|
+
|
55
|
+
# Thetas to be optimized by the AQC algorithm
|
56
|
+
self._thetas: np.ndarray | None = None
|
57
|
+
|
58
|
+
@property
|
59
|
+
def thetas(self) -> np.ndarray:
|
60
|
+
"""
|
61
|
+
Returns a vector of rotation angles used by CNOT units in this circuit.
|
62
|
+
|
63
|
+
Returns:
|
64
|
+
Parameters of the rotation gates in this circuit.
|
65
|
+
"""
|
66
|
+
return self._thetas
|
67
|
+
|
68
|
+
def build(self, thetas: np.ndarray) -> None:
|
69
|
+
"""
|
70
|
+
Constructs a Qiskit quantum circuit out of the parameters (angles) of this circuit. If a
|
71
|
+
parameter value is less in absolute value than the specified tolerance then the
|
72
|
+
corresponding rotation gate will be skipped in the circuit.
|
73
|
+
"""
|
74
|
+
n = self.num_qubits
|
75
|
+
self._thetas = thetas
|
76
|
+
cnots = self._cnots
|
77
|
+
|
78
|
+
for k in range(n):
|
79
|
+
# add initial three rotation gates for each qubit
|
80
|
+
p = 4 * self._num_cnots + 3 * k
|
81
|
+
k = n - k - 1
|
82
|
+
if np.abs(thetas[2 + p]) > self._tol:
|
83
|
+
self.rz(thetas[2 + p], k)
|
84
|
+
if np.abs(thetas[1 + p]) > self._tol:
|
85
|
+
self.ry(thetas[1 + p], k)
|
86
|
+
if np.abs(thetas[0 + p]) > self._tol:
|
87
|
+
self.rz(thetas[0 + p], k)
|
88
|
+
|
89
|
+
for c in range(self._num_cnots):
|
90
|
+
p = 4 * c
|
91
|
+
# Extract where the CNOT goes
|
92
|
+
q1 = n - 1 - int(cnots[0, c])
|
93
|
+
q2 = n - 1 - int(cnots[1, c])
|
94
|
+
# Construct a CNOT unit
|
95
|
+
self.cx(q1, q2)
|
96
|
+
if np.abs(thetas[0 + p]) > self._tol:
|
97
|
+
self.ry(thetas[0 + p], q1)
|
98
|
+
if np.abs(thetas[1 + p]) > self._tol:
|
99
|
+
self.rz(thetas[1 + p], q1)
|
100
|
+
if np.abs(thetas[2 + p]) > self._tol:
|
101
|
+
self.ry(thetas[2 + p], q2)
|
102
|
+
if np.abs(thetas[3 + p]) > self._tol:
|
103
|
+
self.rx(thetas[3 + p], q2)
|
@@ -0,0 +1,299 @@
|
|
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 definition of the approximate circuit compilation optimization problem based on CNOT unit
|
14
|
+
definition.
|
15
|
+
"""
|
16
|
+
from __future__ import annotations
|
17
|
+
import typing
|
18
|
+
from abc import ABC
|
19
|
+
|
20
|
+
import numpy as np
|
21
|
+
from numpy import linalg as la
|
22
|
+
|
23
|
+
from .approximate import ApproximatingObjective
|
24
|
+
from .elementary_operations import ry_matrix, rz_matrix, place_unitary, place_cnot, rx_matrix
|
25
|
+
|
26
|
+
|
27
|
+
class CNOTUnitObjective(ApproximatingObjective, ABC):
|
28
|
+
"""
|
29
|
+
A base class for a problem definition based on CNOT unit. This class may have different
|
30
|
+
subclasses for objective and gradient computations.
|
31
|
+
"""
|
32
|
+
|
33
|
+
def __init__(self, num_qubits: int, cnots: np.ndarray) -> None:
|
34
|
+
"""
|
35
|
+
Args:
|
36
|
+
num_qubits: number of qubits.
|
37
|
+
cnots: a CNOT structure to be used in the optimization procedure.
|
38
|
+
"""
|
39
|
+
super().__init__()
|
40
|
+
self._num_qubits = num_qubits
|
41
|
+
self._cnots = cnots
|
42
|
+
self._num_cnots = cnots.shape[1]
|
43
|
+
|
44
|
+
@property
|
45
|
+
def num_cnots(self):
|
46
|
+
"""
|
47
|
+
Returns:
|
48
|
+
A number of CNOT units to be used by the approximate circuit.
|
49
|
+
"""
|
50
|
+
return self._num_cnots
|
51
|
+
|
52
|
+
@property
|
53
|
+
def num_thetas(self):
|
54
|
+
"""
|
55
|
+
Returns:
|
56
|
+
Number of parameters (angles) of rotation gates in this circuit.
|
57
|
+
"""
|
58
|
+
return 3 * self._num_qubits + 4 * self._num_cnots
|
59
|
+
|
60
|
+
|
61
|
+
class DefaultCNOTUnitObjective(CNOTUnitObjective):
|
62
|
+
"""A naive implementation of the objective function based on CNOT units."""
|
63
|
+
|
64
|
+
def __init__(self, num_qubits: int, cnots: np.ndarray) -> None:
|
65
|
+
"""
|
66
|
+
Args:
|
67
|
+
num_qubits: number of qubits.
|
68
|
+
cnots: a CNOT structure to be used in the optimization procedure.
|
69
|
+
"""
|
70
|
+
super().__init__(num_qubits, cnots)
|
71
|
+
|
72
|
+
# last objective computations to be re-used by gradient
|
73
|
+
self._last_thetas: np.ndarray | None = None
|
74
|
+
self._cnot_right_collection: np.ndarray | None = None
|
75
|
+
self._cnot_left_collection: np.ndarray | None = None
|
76
|
+
self._rotation_matrix: int | np.ndarray | None = None
|
77
|
+
self._cnot_matrix: np.ndarray | None = None
|
78
|
+
|
79
|
+
def objective(self, param_values: np.ndarray) -> typing.SupportsFloat:
|
80
|
+
# rename parameters just to make shorter and make use of our dictionary
|
81
|
+
thetas = param_values
|
82
|
+
n = self._num_qubits
|
83
|
+
d = int(2**n)
|
84
|
+
cnots = self._cnots
|
85
|
+
num_cnots = self.num_cnots
|
86
|
+
|
87
|
+
# to save intermediate computations we define the following matrices
|
88
|
+
# this is the collection of cnot unit matrices ordered from left to
|
89
|
+
# right as in the circuit, not matrix product
|
90
|
+
cnot_unit_collection = np.zeros((d, d * num_cnots), dtype=complex)
|
91
|
+
# this is the collection of matrix products of the cnot units up
|
92
|
+
# to the given position from the right of the circuit
|
93
|
+
cnot_right_collection = np.zeros((d, d * num_cnots), dtype=complex)
|
94
|
+
# this is the collection of matrix products of the cnot units up
|
95
|
+
# to the given position from the left of the circuit
|
96
|
+
cnot_left_collection = np.zeros((d, d * num_cnots), dtype=complex)
|
97
|
+
# first, we construct each cnot unit matrix
|
98
|
+
for cnot_index in range(num_cnots):
|
99
|
+
theta_index = 4 * cnot_index
|
100
|
+
|
101
|
+
# cnot qubit indices for the cnot unit identified by cnot_index
|
102
|
+
q1 = int(cnots[0, cnot_index])
|
103
|
+
q2 = int(cnots[1, cnot_index])
|
104
|
+
|
105
|
+
# rotations that are applied on the q1 qubit
|
106
|
+
ry1 = ry_matrix(thetas[0 + theta_index])
|
107
|
+
rz1 = rz_matrix(thetas[1 + theta_index])
|
108
|
+
|
109
|
+
# rotations that are applied on the q2 qubit
|
110
|
+
ry2 = ry_matrix(thetas[2 + theta_index])
|
111
|
+
rx2 = rx_matrix(thetas[3 + theta_index])
|
112
|
+
|
113
|
+
# combine the rotations on qubits q1 and q2
|
114
|
+
single_q1 = np.dot(rz1, ry1)
|
115
|
+
single_q2 = np.dot(rx2, ry2)
|
116
|
+
|
117
|
+
# we place single qubit matrices at the corresponding locations in the (2^n, 2^n) matrix
|
118
|
+
full_q1 = place_unitary(single_q1, n, q1)
|
119
|
+
full_q2 = place_unitary(single_q2, n, q2)
|
120
|
+
|
121
|
+
# we place a cnot matrix at the qubits q1 and q2 in the full matrix
|
122
|
+
cnot_q1q2 = place_cnot(n, q1, q2)
|
123
|
+
|
124
|
+
# compute the cnot unit matrix and store in cnot_unit_collection
|
125
|
+
cnot_unit_collection[:, d * cnot_index : d * (cnot_index + 1)] = la.multi_dot(
|
126
|
+
[full_q2, full_q1, cnot_q1q2]
|
127
|
+
)
|
128
|
+
|
129
|
+
# this is the matrix corresponding to the intermediate matrix products
|
130
|
+
# it will end up being the matrix product of all the cnot unit matrices
|
131
|
+
# first we multiply from the right-hand side of the circuit
|
132
|
+
cnot_matrix = np.eye(d)
|
133
|
+
for cnot_index in range(num_cnots - 1, -1, -1):
|
134
|
+
cnot_matrix = np.dot(
|
135
|
+
cnot_matrix, cnot_unit_collection[:, d * cnot_index : d * (cnot_index + 1)]
|
136
|
+
)
|
137
|
+
cnot_right_collection[:, d * cnot_index : d * (cnot_index + 1)] = cnot_matrix
|
138
|
+
# now we multiply from the left-hand side of the circuit
|
139
|
+
cnot_matrix = np.eye(d)
|
140
|
+
for cnot_index in range(num_cnots):
|
141
|
+
cnot_matrix = np.dot(
|
142
|
+
cnot_unit_collection[:, d * cnot_index : d * (cnot_index + 1)], cnot_matrix
|
143
|
+
)
|
144
|
+
cnot_left_collection[:, d * cnot_index : d * (cnot_index + 1)] = cnot_matrix
|
145
|
+
|
146
|
+
# this is the matrix corresponding to the initial rotations
|
147
|
+
# we start with 1 and kronecker product each qubit's rotations
|
148
|
+
rotation_matrix: int | np.ndarray = 1
|
149
|
+
for q in range(n):
|
150
|
+
theta_index = 4 * num_cnots + 3 * q
|
151
|
+
rz0 = rz_matrix(thetas[0 + theta_index])
|
152
|
+
ry1 = ry_matrix(thetas[1 + theta_index])
|
153
|
+
rz2 = rz_matrix(thetas[2 + theta_index])
|
154
|
+
rotation_matrix = np.kron(rotation_matrix, la.multi_dot([rz0, ry1, rz2]))
|
155
|
+
|
156
|
+
# the matrix corresponding to the full circuit is the cnot part and
|
157
|
+
# rotation part multiplied together
|
158
|
+
circuit_matrix = np.dot(cnot_matrix, rotation_matrix)
|
159
|
+
|
160
|
+
# compute error
|
161
|
+
error = 0.5 * (la.norm(circuit_matrix - self._target_matrix, "fro") ** 2)
|
162
|
+
|
163
|
+
# cache computations for gradient
|
164
|
+
self._last_thetas = thetas
|
165
|
+
self._cnot_left_collection = cnot_left_collection
|
166
|
+
self._cnot_right_collection = cnot_right_collection
|
167
|
+
self._rotation_matrix = rotation_matrix
|
168
|
+
self._cnot_matrix = cnot_matrix
|
169
|
+
|
170
|
+
return error
|
171
|
+
|
172
|
+
def gradient(self, param_values: np.ndarray) -> np.ndarray:
|
173
|
+
# just to make shorter
|
174
|
+
thetas = param_values
|
175
|
+
# if given thetas are the same as used at the previous objective computations, then
|
176
|
+
# we re-use computations, otherwise we have to re-compute objective
|
177
|
+
if not np.all(np.isclose(thetas, self._last_thetas)):
|
178
|
+
self.objective(thetas)
|
179
|
+
|
180
|
+
# the partial derivative of the circuit with respect to an angle
|
181
|
+
# is the same circuit with the corresponding pauli gate, multiplied
|
182
|
+
# by a global phase of -1j / 2, next to the rotation gate (it commutes)
|
183
|
+
pauli_x = np.multiply(-1j / 2, np.asarray([[0, 1], [1, 0]]))
|
184
|
+
pauli_y = np.multiply(-1j / 2, np.asarray([[0, -1j], [1j, 0]]))
|
185
|
+
pauli_z = np.multiply(-1j / 2, np.asarray([[1, 0], [0, -1]]))
|
186
|
+
|
187
|
+
n = self._num_qubits
|
188
|
+
d = int(2**n)
|
189
|
+
cnots = self._cnots
|
190
|
+
num_cnots = self.num_cnots
|
191
|
+
|
192
|
+
# the partial derivative of the cost function is -Re<V',U>
|
193
|
+
# where V' is the partial derivative of the circuit
|
194
|
+
# first we compute the partial derivatives in the cnot part
|
195
|
+
der = np.zeros(4 * num_cnots + 3 * n)
|
196
|
+
for cnot_index in range(num_cnots):
|
197
|
+
theta_index = 4 * cnot_index
|
198
|
+
|
199
|
+
# cnot qubit indices for the cnot unit identified by cnot_index
|
200
|
+
q1 = int(cnots[0, cnot_index])
|
201
|
+
q2 = int(cnots[1, cnot_index])
|
202
|
+
|
203
|
+
# rotations that are applied on the q1 qubit
|
204
|
+
ry1 = ry_matrix(thetas[0 + theta_index])
|
205
|
+
rz1 = rz_matrix(thetas[1 + theta_index])
|
206
|
+
|
207
|
+
# rotations that are applied on the q2 qubit
|
208
|
+
ry2 = ry_matrix(thetas[2 + theta_index])
|
209
|
+
rx2 = rx_matrix(thetas[3 + theta_index])
|
210
|
+
|
211
|
+
# combine the rotations on qubits q1 and q2
|
212
|
+
# note we have to insert an extra pauli gate to take the derivative
|
213
|
+
# of the appropriate rotation gate
|
214
|
+
for i in range(4):
|
215
|
+
if i == 0:
|
216
|
+
single_q1 = la.multi_dot([rz1, pauli_y, ry1])
|
217
|
+
single_q2 = np.dot(rx2, ry2)
|
218
|
+
elif i == 1:
|
219
|
+
single_q1 = la.multi_dot([pauli_z, rz1, ry1])
|
220
|
+
single_q2 = np.dot(rx2, ry2)
|
221
|
+
elif i == 2:
|
222
|
+
single_q1 = np.dot(rz1, ry1)
|
223
|
+
single_q2 = la.multi_dot([rx2, pauli_y, ry2])
|
224
|
+
else:
|
225
|
+
single_q1 = np.dot(rz1, ry1)
|
226
|
+
single_q2 = la.multi_dot([pauli_x, rx2, ry2])
|
227
|
+
|
228
|
+
# we place single qubit matrices at the corresponding locations in
|
229
|
+
# the (2^n, 2^n) matrix
|
230
|
+
full_q1 = place_unitary(single_q1, n, q1)
|
231
|
+
full_q2 = place_unitary(single_q2, n, q2)
|
232
|
+
|
233
|
+
# we place a cnot matrix at the qubits q1 and q2 in the full matrix
|
234
|
+
cnot_q1q2 = place_cnot(n, q1, q2)
|
235
|
+
|
236
|
+
# partial derivative of that particular cnot unit, size of (2^n, 2^n)
|
237
|
+
der_cnot_unit = la.multi_dot([full_q2, full_q1, cnot_q1q2])
|
238
|
+
# der_cnot_unit is multiplied by the matrix product of cnot units to the left
|
239
|
+
# of it (if there are any) and to the right of it (if there are any)
|
240
|
+
if cnot_index == 0:
|
241
|
+
der_cnot_matrix = np.dot(
|
242
|
+
self._cnot_right_collection[:, d : 2 * d],
|
243
|
+
der_cnot_unit,
|
244
|
+
)
|
245
|
+
elif num_cnots - 1 == cnot_index:
|
246
|
+
der_cnot_matrix = np.dot(
|
247
|
+
der_cnot_unit,
|
248
|
+
self._cnot_left_collection[:, d * (num_cnots - 2) : d * (num_cnots - 1)],
|
249
|
+
)
|
250
|
+
else:
|
251
|
+
der_cnot_matrix = la.multi_dot(
|
252
|
+
[
|
253
|
+
self._cnot_right_collection[
|
254
|
+
:, d * (cnot_index + 1) : d * (cnot_index + 2)
|
255
|
+
],
|
256
|
+
der_cnot_unit,
|
257
|
+
self._cnot_left_collection[:, d * (cnot_index - 1) : d * cnot_index],
|
258
|
+
]
|
259
|
+
)
|
260
|
+
|
261
|
+
# the matrix corresponding to the full circuit partial derivative
|
262
|
+
# is the partial derivative of the cnot part multiplied by the usual
|
263
|
+
# rotation part
|
264
|
+
der_circuit_matrix = np.dot(der_cnot_matrix, self._rotation_matrix)
|
265
|
+
# we compute the partial derivative of the cost function
|
266
|
+
der[i + theta_index] = -np.real(
|
267
|
+
np.trace(np.dot(der_circuit_matrix.conj().T, self._target_matrix))
|
268
|
+
)
|
269
|
+
|
270
|
+
# now we compute the partial derivatives in the rotation part
|
271
|
+
# we start with 1 and kronecker product each qubit's rotations
|
272
|
+
for i in range(3 * n):
|
273
|
+
der_rotation_matrix: int | np.ndarray = 1
|
274
|
+
for q in range(n):
|
275
|
+
theta_index = 4 * num_cnots + 3 * q
|
276
|
+
rz0 = rz_matrix(thetas[0 + theta_index])
|
277
|
+
ry1 = ry_matrix(thetas[1 + theta_index])
|
278
|
+
rz2 = rz_matrix(thetas[2 + theta_index])
|
279
|
+
# for the appropriate rotation gate that we are taking
|
280
|
+
# the partial derivative of, we have to insert the
|
281
|
+
# corresponding pauli matrix
|
282
|
+
if i - 3 * q == 0:
|
283
|
+
rz0 = np.dot(pauli_z, rz0)
|
284
|
+
elif i - 3 * q == 1:
|
285
|
+
ry1 = np.dot(pauli_y, ry1)
|
286
|
+
elif i - 3 * q == 2:
|
287
|
+
rz2 = np.dot(pauli_z, rz2)
|
288
|
+
der_rotation_matrix = np.kron(der_rotation_matrix, la.multi_dot([rz0, ry1, rz2]))
|
289
|
+
|
290
|
+
# the matrix corresponding to the full circuit partial derivative
|
291
|
+
# is the usual cnot part multiplied by the partial derivative of
|
292
|
+
# the rotation part
|
293
|
+
der_circuit_matrix = np.dot(self._cnot_matrix, der_rotation_matrix)
|
294
|
+
# we compute the partial derivative of the cost function
|
295
|
+
der[4 * num_cnots + i] = -np.real(
|
296
|
+
np.trace(np.dot(der_circuit_matrix.conj().T, self._target_matrix))
|
297
|
+
)
|
298
|
+
|
299
|
+
return der
|