qiskit 1.3.0__cp39-abi3-win32.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 +146 -0
- qiskit/_accelerate.pyd +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 +367 -0
- qiskit/assembler/disassemble.py +310 -0
- qiskit/assembler/run_config.py +77 -0
- qiskit/circuit/__init__.py +1313 -0
- qiskit/circuit/_classical_resource_map.py +148 -0
- qiskit/circuit/_standard_gates_commutations.py +3849 -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 +50 -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 +511 -0
- qiskit/circuit/controlflow/switch_case.py +417 -0
- qiskit/circuit/controlflow/while_loop.py +171 -0
- qiskit/circuit/controlledgate.py +274 -0
- qiskit/circuit/delay.py +123 -0
- qiskit/circuit/duration.py +95 -0
- qiskit/circuit/equivalence.py +94 -0
- qiskit/circuit/equivalence_library.py +18 -0
- qiskit/circuit/exceptions.py +19 -0
- qiskit/circuit/gate.py +263 -0
- qiskit/circuit/instruction.py +697 -0
- qiskit/circuit/instructionset.py +179 -0
- qiskit/circuit/library/__init__.py +668 -0
- qiskit/circuit/library/arithmetic/__init__.py +34 -0
- qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +210 -0
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -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 +17 -0
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +192 -0
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -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 +313 -0
- qiskit/circuit/library/blueprintcircuit.py +280 -0
- qiskit/circuit/library/boolean_logic/__init__.py +18 -0
- qiskit/circuit/library/boolean_logic/inner_product.py +155 -0
- qiskit/circuit/library/boolean_logic/quantum_and.py +200 -0
- qiskit/circuit/library/boolean_logic/quantum_or.py +202 -0
- qiskit/circuit/library/boolean_logic/quantum_xor.py +165 -0
- qiskit/circuit/library/data_preparation/__init__.py +57 -0
- qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
- qiskit/circuit/library/data_preparation/initializer.py +107 -0
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
- qiskit/circuit/library/fourier_checking.py +158 -0
- qiskit/circuit/library/generalized_gates/__init__.py +30 -0
- qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
- qiskit/circuit/library/generalized_gates/gms.py +174 -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 +318 -0
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
- qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
- qiskit/circuit/library/generalized_gates/pauli.py +85 -0
- qiskit/circuit/library/generalized_gates/permutation.py +194 -0
- qiskit/circuit/library/generalized_gates/rv.py +96 -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 +169 -0
- qiskit/circuit/library/grover_operator.py +579 -0
- qiskit/circuit/library/hamiltonian_gate.py +142 -0
- qiskit/circuit/library/hidden_linear_function.py +161 -0
- qiskit/circuit/library/iqp.py +175 -0
- qiskit/circuit/library/n_local/__init__.py +45 -0
- qiskit/circuit/library/n_local/efficient_su2.py +277 -0
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +515 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +297 -0
- qiskit/circuit/library/n_local/n_local.py +1472 -0
- qiskit/circuit/library/n_local/pauli_two_design.py +243 -0
- qiskit/circuit/library/n_local/qaoa_ansatz.py +366 -0
- qiskit/circuit/library/n_local/real_amplitudes.py +306 -0
- qiskit/circuit/library/n_local/two_local.py +289 -0
- qiskit/circuit/library/overlap.py +182 -0
- qiskit/circuit/library/pauli_evolution.py +186 -0
- qiskit/circuit/library/phase_estimation.py +175 -0
- qiskit/circuit/library/phase_oracle.py +153 -0
- qiskit/circuit/library/quantum_volume.py +167 -0
- qiskit/circuit/library/standard_gates/__init__.py +142 -0
- qiskit/circuit/library/standard_gates/dcx.py +78 -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 +258 -0
- qiskit/circuit/library/standard_gates/i.py +76 -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 +441 -0
- qiskit/circuit/library/standard_gates/r.py +117 -0
- qiskit/circuit/library/standard_gates/rx.py +303 -0
- qiskit/circuit/library/standard_gates/rxx.py +183 -0
- qiskit/circuit/library/standard_gates/ry.py +298 -0
- qiskit/circuit/library/standard_gates/ryy.py +183 -0
- qiskit/circuit/library/standard_gates/rz.py +319 -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 +315 -0
- qiskit/circuit/library/standard_gates/t.py +179 -0
- qiskit/circuit/library/standard_gates/u.py +403 -0
- qiskit/circuit/library/standard_gates/u1.py +501 -0
- qiskit/circuit/library/standard_gates/u2.py +149 -0
- qiskit/circuit/library/standard_gates/u3.py +436 -0
- qiskit/circuit/library/standard_gates/x.py +1529 -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 +262 -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 +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
- qiskit/circuit/library/templates/nct/__init__.py +67 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
- qiskit/circuit/library/templates/rzx/__init__.py +25 -0
- qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
- qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
- qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
- qiskit/circuit/measure.py +44 -0
- qiskit/circuit/operation.py +67 -0
- qiskit/circuit/parameter.py +178 -0
- qiskit/circuit/parameterexpression.py +692 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +120 -0
- qiskit/circuit/quantumcircuit.py +6829 -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 +606 -0
- qiskit/circuit/store.py +97 -0
- qiskit/circuit/tools/__init__.py +16 -0
- qiskit/circuit/tools/pi_check.py +190 -0
- qiskit/circuit/twirling.py +145 -0
- qiskit/compiler/__init__.py +33 -0
- qiskit/compiler/assembler.py +681 -0
- qiskit/compiler/scheduler.py +109 -0
- qiskit/compiler/sequencer.py +71 -0
- qiskit/compiler/transpiler.py +533 -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 +79 -0
- qiskit/converters/dag_to_dagdependency.py +55 -0
- qiskit/converters/dag_to_dagdependency_v2.py +44 -0
- qiskit/converters/dagdependency_to_circuit.py +46 -0
- qiskit/converters/dagdependency_to_dag.py +54 -0
- qiskit/dagcircuit/__init__.py +44 -0
- qiskit/dagcircuit/collect_blocks.py +391 -0
- qiskit/dagcircuit/dagcircuit.py +24 -0
- qiskit/dagcircuit/dagdependency.py +646 -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 +486 -0
- qiskit/primitives/backend_estimator_v2.py +434 -0
- qiskit/primitives/backend_sampler.py +222 -0
- qiskit/primitives/backend_sampler_v2.py +339 -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 +173 -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 +667 -0
- qiskit/providers/backend_compat.py +472 -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 +821 -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 +49 -0
- qiskit/providers/fake_provider/fake_qasm_backend.py +77 -0
- qiskit/providers/fake_provider/generic_backend_v2.py +1035 -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 +305 -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 +2254 -0
- qiskit/pulse/calibration_entries.py +381 -0
- qiskit/pulse/channels.py +227 -0
- qiskit/pulse/configuration.py +245 -0
- qiskit/pulse/exceptions.py +45 -0
- qiskit/pulse/filters.py +309 -0
- qiskit/pulse/instruction_schedule_map.py +424 -0
- qiskit/pulse/instructions/__init__.py +67 -0
- qiskit/pulse/instructions/acquire.py +150 -0
- qiskit/pulse/instructions/delay.py +71 -0
- qiskit/pulse/instructions/directives.py +154 -0
- qiskit/pulse/instructions/frequency.py +135 -0
- qiskit/pulse/instructions/instruction.py +270 -0
- qiskit/pulse/instructions/phase.py +152 -0
- qiskit/pulse/instructions/play.py +99 -0
- qiskit/pulse/instructions/reference.py +100 -0
- qiskit/pulse/instructions/snapshot.py +82 -0
- qiskit/pulse/library/__init__.py +97 -0
- qiskit/pulse/library/continuous.py +430 -0
- qiskit/pulse/library/pulse.py +148 -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 +1988 -0
- qiskit/pulse/library/waveform.py +136 -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 +1854 -0
- qiskit/pulse/transforms/__init__.py +106 -0
- qiskit/pulse/transforms/alignments.py +406 -0
- qiskit/pulse/transforms/base_transforms.py +71 -0
- qiskit/pulse/transforms/canonicalization.py +498 -0
- qiskit/pulse/transforms/dag.py +122 -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 +372 -0
- qiskit/qasm2/parse.py +452 -0
- qiskit/qasm3/__init__.py +367 -0
- qiskit/qasm3/ast.py +738 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1299 -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 +897 -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 +1822 -0
- qiskit/qpy/binary_io/__init__.py +36 -0
- qiskit/qpy/binary_io/circuits.py +1475 -0
- qiskit/qpy/binary_io/schedules.py +635 -0
- qiskit/qpy/binary_io/value.py +1025 -0
- qiskit/qpy/common.py +350 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +401 -0
- qiskit/qpy/interface.py +377 -0
- qiskit/qpy/type_keys.py +572 -0
- qiskit/quantum_info/__init__.py +162 -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 +475 -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 +865 -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 +719 -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 +753 -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 +1196 -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 +277 -0
- qiskit/result/mitigation/local_readout_mitigator.py +328 -0
- qiskit/result/mitigation/utils.py +217 -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 +37 -0
- qiskit/scheduler/lowering.py +187 -0
- qiskit/scheduler/methods/__init__.py +15 -0
- qiskit/scheduler/methods/basic.py +140 -0
- qiskit/scheduler/schedule_circuit.py +69 -0
- qiskit/scheduler/sequence.py +104 -0
- qiskit/synthesis/__init__.py +220 -0
- qiskit/synthesis/arithmetic/__init__.py +16 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
- qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +102 -0
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +99 -0
- qiskit/synthesis/clifford/__init__.py +19 -0
- qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
- qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
- qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
- qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -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 +21 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +117 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +311 -0
- qiskit/synthesis/evolution/qdrift.py +138 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +215 -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 +24 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -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 +97 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +79 -0
- qiskit/synthesis/stabilizer/__init__.py +16 -0
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -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 +700 -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 +1290 -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 +312 -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 +137 -0
- qiskit/transpiler/passes/basis/decompose.py +131 -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 +100 -0
- qiskit/transpiler/passes/calibration/rx_builder.py +164 -0
- qiskit/transpiler/passes/calibration/rzx_builder.py +411 -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 +219 -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 +487 -0
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -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 +43 -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 +104 -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 +149 -0
- qiskit/transpiler/passes/optimization/cx_cancellation.py +65 -0
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +162 -0
- qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
- qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -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 +254 -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_identity_equiv.py +69 -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 +447 -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 +107 -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 +310 -0
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +312 -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 +452 -0
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +82 -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 +94 -0
- qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +165 -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 +854 -0
- qiskit/transpiler/passes/synthesis/hls_plugins.py +1559 -0
- qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
- qiskit/transpiler/passes/synthesis/plugin.py +734 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +297 -0
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +1076 -0
- qiskit/transpiler/passes/utils/__init__.py +33 -0
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -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 +93 -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 +86 -0
- qiskit/transpiler/passes/utils/gates_basis.py +51 -0
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -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 +216 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +73 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1045 -0
- qiskit/transpiler/preset_passmanagers/common.py +649 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +626 -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 +1319 -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/deprecate_pulse.py +119 -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 +727 -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 +308 -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 +458 -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 +480 -0
- qiskit/visualization/timeline/drawings.py +260 -0
- qiskit/visualization/timeline/generators.py +506 -0
- qiskit/visualization/timeline/interface.py +436 -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.0.dist-info/LICENSE.txt +203 -0
- qiskit-1.3.0.dist-info/METADATA +222 -0
- qiskit-1.3.0.dist-info/RECORD +836 -0
- qiskit-1.3.0.dist-info/WHEEL +5 -0
- qiskit-1.3.0.dist-info/entry_points.txt +76 -0
- qiskit-1.3.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,194 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2020.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Permutation circuit (the old way to specify permutations, which is required for
|
14
|
+
backward compatibility and which will be eventually deprecated) and the permutation
|
15
|
+
gate (the new way to specify permutations, allowing a variety of synthesis algorithms).
|
16
|
+
"""
|
17
|
+
|
18
|
+
from __future__ import annotations
|
19
|
+
|
20
|
+
import numpy as np
|
21
|
+
|
22
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
23
|
+
from qiskit.circuit.quantumcircuit import Gate
|
24
|
+
from qiskit.circuit.exceptions import CircuitError
|
25
|
+
from qiskit.utils.deprecation import deprecate_func
|
26
|
+
|
27
|
+
|
28
|
+
class Permutation(QuantumCircuit):
|
29
|
+
"""An n_qubit circuit that permutes qubits."""
|
30
|
+
|
31
|
+
@deprecate_func(since="1.3", pending=True, additional_msg="Use PermutationGate instead.")
|
32
|
+
def __init__(
|
33
|
+
self,
|
34
|
+
num_qubits: int,
|
35
|
+
pattern: list[int] | np.ndarray | None = None,
|
36
|
+
seed: int | None = None,
|
37
|
+
) -> None:
|
38
|
+
"""Return an n_qubit permutation circuit implemented using SWAPs.
|
39
|
+
|
40
|
+
Args:
|
41
|
+
num_qubits: circuit width.
|
42
|
+
pattern: permutation pattern, describing which qubits occupy the
|
43
|
+
positions 0, 1, 2, etc. after applying the permutation, that
|
44
|
+
is ``pattern[k] = m`` when the permutation maps qubit ``m``
|
45
|
+
to position ``k``. As an example, the pattern ``[2, 4, 3, 0, 1]``
|
46
|
+
means that qubit ``2`` goes to position ``0``, qubit ``4``
|
47
|
+
goes to the position ``1``, etc. The pattern can also be ``None``,
|
48
|
+
in which case a random permutation over ``num_qubits`` is
|
49
|
+
created.
|
50
|
+
seed: random seed in case a random permutation is requested.
|
51
|
+
|
52
|
+
Raises:
|
53
|
+
CircuitError: if permutation pattern is malformed.
|
54
|
+
|
55
|
+
Reference Circuit:
|
56
|
+
.. plot::
|
57
|
+
|
58
|
+
from qiskit.circuit.library import Permutation
|
59
|
+
A = [2,4,3,0,1]
|
60
|
+
circuit = Permutation(5, A)
|
61
|
+
circuit.draw('mpl')
|
62
|
+
|
63
|
+
Expanded Circuit:
|
64
|
+
.. plot::
|
65
|
+
|
66
|
+
from qiskit.circuit.library import Permutation
|
67
|
+
from qiskit.visualization.library import _generate_circuit_library_visualization
|
68
|
+
A = [2,4,3,0,1]
|
69
|
+
circuit = Permutation(5, A)
|
70
|
+
_generate_circuit_library_visualization(circuit.decompose())
|
71
|
+
"""
|
72
|
+
if pattern is not None:
|
73
|
+
if sorted(pattern) != list(range(num_qubits)):
|
74
|
+
raise CircuitError(
|
75
|
+
"Permutation pattern must be some ordering of 0..num_qubits-1 in a list."
|
76
|
+
)
|
77
|
+
pattern = np.array(pattern)
|
78
|
+
else:
|
79
|
+
rng = np.random.default_rng(seed)
|
80
|
+
pattern = np.arange(num_qubits)
|
81
|
+
rng.shuffle(pattern)
|
82
|
+
|
83
|
+
name = "permutation_" + np.array_str(pattern).replace(" ", ",")
|
84
|
+
|
85
|
+
super().__init__(num_qubits, name=name)
|
86
|
+
|
87
|
+
# pylint: disable=cyclic-import
|
88
|
+
from qiskit.synthesis.permutation import synth_permutation_basic
|
89
|
+
|
90
|
+
circuit = synth_permutation_basic(pattern)
|
91
|
+
circuit.name = name
|
92
|
+
|
93
|
+
all_qubits = self.qubits
|
94
|
+
self.append(circuit.to_gate(), all_qubits)
|
95
|
+
|
96
|
+
|
97
|
+
class PermutationGate(Gate):
|
98
|
+
"""A gate that permutes qubits."""
|
99
|
+
|
100
|
+
def __init__(
|
101
|
+
self,
|
102
|
+
pattern: list[int],
|
103
|
+
) -> None:
|
104
|
+
"""Return a permutation gate.
|
105
|
+
|
106
|
+
Args:
|
107
|
+
pattern: permutation pattern, describing which qubits occupy the
|
108
|
+
positions 0, 1, 2, etc. after applying the permutation, that
|
109
|
+
is ``pattern[k] = m`` when the permutation maps qubit ``m``
|
110
|
+
to position ``k``. As an example, the pattern ``[2, 4, 3, 0, 1]``
|
111
|
+
means that qubit ``2`` goes to position ``0``, qubit ``4``
|
112
|
+
goes to the position ``1``, etc.
|
113
|
+
|
114
|
+
Raises:
|
115
|
+
CircuitError: if permutation pattern is malformed.
|
116
|
+
|
117
|
+
Reference Circuit:
|
118
|
+
.. plot::
|
119
|
+
|
120
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
121
|
+
from qiskit.circuit.library import PermutationGate
|
122
|
+
A = [2, 4, 3, 0, 1]
|
123
|
+
permutation = PermutationGate(A)
|
124
|
+
circuit = QuantumCircuit(5)
|
125
|
+
circuit.append(permutation, [0, 1, 2, 3, 4])
|
126
|
+
circuit.draw("mpl")
|
127
|
+
|
128
|
+
Expanded Circuit:
|
129
|
+
.. plot::
|
130
|
+
|
131
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
132
|
+
from qiskit.circuit.library import PermutationGate
|
133
|
+
from qiskit.visualization.library import _generate_circuit_library_visualization
|
134
|
+
A = [2, 4, 3, 0, 1]
|
135
|
+
permutation = PermutationGate(A)
|
136
|
+
circuit = QuantumCircuit(5)
|
137
|
+
circuit.append(permutation, [0, 1, 2, 3, 4])
|
138
|
+
|
139
|
+
_generate_circuit_library_visualization(circuit.decompose())
|
140
|
+
"""
|
141
|
+
num_qubits = len(pattern)
|
142
|
+
if sorted(pattern) != list(range(num_qubits)):
|
143
|
+
raise CircuitError(
|
144
|
+
"Permutation pattern must be some ordering of 0..num_qubits-1 in a list."
|
145
|
+
)
|
146
|
+
pattern = np.array(pattern, dtype=np.int32)
|
147
|
+
|
148
|
+
super().__init__(name="permutation", num_qubits=num_qubits, params=[pattern])
|
149
|
+
|
150
|
+
def __array__(self, dtype=None, copy=None):
|
151
|
+
"""Return a numpy.array for the Permutation gate."""
|
152
|
+
if copy is False:
|
153
|
+
raise ValueError("unable to avoid copy while creating an array as requested")
|
154
|
+
|
155
|
+
nq = len(self.pattern)
|
156
|
+
mat = np.zeros((2**nq, 2**nq), dtype=dtype)
|
157
|
+
|
158
|
+
for r in range(2**nq):
|
159
|
+
# convert row to bitstring, reverse, apply permutation pattern, reverse again,
|
160
|
+
# and convert to row
|
161
|
+
bit = bin(r)[2:].zfill(nq)[::-1]
|
162
|
+
permuted_bit = "".join([bit[j] for j in self.pattern])
|
163
|
+
pr = int(permuted_bit[::-1], 2)
|
164
|
+
mat[pr, r] = 1
|
165
|
+
|
166
|
+
return mat
|
167
|
+
|
168
|
+
def validate_parameter(self, parameter):
|
169
|
+
"""Parameter validation."""
|
170
|
+
return parameter
|
171
|
+
|
172
|
+
@property
|
173
|
+
def pattern(self) -> np.ndarray[bool]:
|
174
|
+
"""Returns the permutation pattern defining this permutation."""
|
175
|
+
return self.params[0]
|
176
|
+
|
177
|
+
def inverse(self, annotated: bool = False) -> PermutationGate:
|
178
|
+
"""Returns the inverse of the permutation."""
|
179
|
+
|
180
|
+
# pylint: disable=cyclic-import
|
181
|
+
from qiskit.synthesis.permutation.permutation_utils import _inverse_pattern
|
182
|
+
|
183
|
+
return PermutationGate(pattern=_inverse_pattern(self.pattern))
|
184
|
+
|
185
|
+
def _qasm2_decomposition(self):
|
186
|
+
# pylint: disable=cyclic-import
|
187
|
+
from qiskit.synthesis.permutation import synth_permutation_basic
|
188
|
+
|
189
|
+
name = f"permutation__{'_'.join(str(n) for n in self.pattern)}_"
|
190
|
+
|
191
|
+
out = synth_permutation_basic(self.pattern)
|
192
|
+
out.name = name
|
193
|
+
|
194
|
+
return out.to_gate()
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2020
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""Rotation around an arbitrary axis on the Bloch sphere."""
|
14
|
+
|
15
|
+
import math
|
16
|
+
import numpy
|
17
|
+
from qiskit.circuit.gate import Gate
|
18
|
+
from qiskit.circuit.exceptions import CircuitError
|
19
|
+
|
20
|
+
|
21
|
+
class RVGate(Gate):
|
22
|
+
r"""Rotation around arbitrary rotation axis :math:`\vec{v}` where :math:`\|\vec{v}\|_2` is
|
23
|
+
angle of rotation in radians.
|
24
|
+
|
25
|
+
Can be applied to a :class:`~qiskit.circuit.QuantumCircuit`
|
26
|
+
with the :meth:`~qiskit.circuit.QuantumCircuit.rv` method.
|
27
|
+
|
28
|
+
**Circuit symbol:**
|
29
|
+
|
30
|
+
.. code-block:: text
|
31
|
+
|
32
|
+
┌─────────────────┐
|
33
|
+
q_0: ┤ RV(v_x,v_y,v_z) ├
|
34
|
+
└─────────────────┘
|
35
|
+
|
36
|
+
**Matrix Representation:**
|
37
|
+
|
38
|
+
.. math::
|
39
|
+
|
40
|
+
\newcommand{\rotationangle}{\frac{\|\vec{v}\|_2}{2}}
|
41
|
+
R(\vec{v}) = e^{-i \vec{v}\cdot\vec{\sigma} / 2} =
|
42
|
+
\begin{pmatrix}
|
43
|
+
\cos\left(\rotationangle\right)
|
44
|
+
-i \frac{v_z}{\|\vec{v}\|_2} \sin\left(\rotationangle\right)
|
45
|
+
& -(i \frac{v_x}{\|\vec{v}\|_2}
|
46
|
+
+ \frac{v_y}{\|\vec{v}\|_2}) \sin\left(\rotationangle\right) \\
|
47
|
+
-(i \frac{v_x}{\|\vec{v}\|_2}
|
48
|
+
- \frac{v_y}{\|\vec{v}\|_2}) \sin\left(\rotationangle\right)
|
49
|
+
& \cos\left(\rotationangle\right)
|
50
|
+
+ i \frac{v_z}{\|\vec{v}\|_2} \sin\left(\rotationangle\right)
|
51
|
+
\end{pmatrix}
|
52
|
+
"""
|
53
|
+
|
54
|
+
def __init__(self, v_x: float, v_y: float, v_z: float, basis: str = "U"):
|
55
|
+
"""
|
56
|
+
Args:
|
57
|
+
v_x: x-component
|
58
|
+
v_y: y-component
|
59
|
+
v_z: z-component
|
60
|
+
basis: basis (see
|
61
|
+
:class:`~qiskit.synthesis.one_qubit.one_qubit_decompose.OneQubitEulerDecomposer`)
|
62
|
+
"""
|
63
|
+
# pylint: disable=cyclic-import
|
64
|
+
from qiskit.synthesis.one_qubit.one_qubit_decompose import OneQubitEulerDecomposer
|
65
|
+
|
66
|
+
super().__init__("rv", 1, [v_x, v_y, v_z])
|
67
|
+
self._decomposer = OneQubitEulerDecomposer(basis=basis)
|
68
|
+
|
69
|
+
def _define(self):
|
70
|
+
try:
|
71
|
+
self.definition = self._decomposer(self.to_matrix())
|
72
|
+
except TypeError as ex:
|
73
|
+
raise CircuitError(
|
74
|
+
f"The {self.name} gate cannot be decomposed with unbound parameters"
|
75
|
+
) from ex
|
76
|
+
|
77
|
+
def inverse(self, annotated: bool = False):
|
78
|
+
"""Invert this gate."""
|
79
|
+
vx, vy, vz = self.params
|
80
|
+
return RVGate(-vx, -vy, -vz)
|
81
|
+
|
82
|
+
def to_matrix(self) -> numpy.ndarray:
|
83
|
+
"""Return a numpy.array for the R(v) gate."""
|
84
|
+
v = numpy.asarray(self.params, dtype=float)
|
85
|
+
angle = math.sqrt(v.dot(v))
|
86
|
+
if angle == 0:
|
87
|
+
return numpy.array([[1, 0], [0, 1]])
|
88
|
+
nx, ny, nz = v / angle
|
89
|
+
sin = math.sin(angle / 2)
|
90
|
+
cos = math.cos(angle / 2)
|
91
|
+
return numpy.array(
|
92
|
+
[
|
93
|
+
[cos - 1j * nz * sin, (-ny - 1j * nx) * sin],
|
94
|
+
[(ny - 1j * nx) * sin, cos + 1j * nz * sin],
|
95
|
+
]
|
96
|
+
)
|
@@ -0,0 +1,213 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2020, 2024.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
# The structure of the code is based on Emanuel Malvetti's semester thesis at
|
14
|
+
# ETH in 2018, which was supervised by Raban Iten and Prof. Renato Renner.
|
15
|
+
|
16
|
+
# pylint: disable=invalid-name
|
17
|
+
# pylint: disable=missing-param-doc
|
18
|
+
# pylint: disable=missing-type-doc
|
19
|
+
|
20
|
+
"""Uniformly controlled gates (also called multiplexed gates)."""
|
21
|
+
|
22
|
+
from __future__ import annotations
|
23
|
+
|
24
|
+
import math
|
25
|
+
|
26
|
+
import numpy as np
|
27
|
+
|
28
|
+
from qiskit.circuit.gate import Gate
|
29
|
+
from qiskit.circuit.library.standard_gates.h import HGate
|
30
|
+
from qiskit.quantum_info.operators.predicates import is_unitary_matrix
|
31
|
+
from qiskit.circuit.quantumregister import QuantumRegister
|
32
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
33
|
+
from qiskit.circuit.exceptions import CircuitError
|
34
|
+
from qiskit.exceptions import QiskitError
|
35
|
+
from qiskit._accelerate import uc_gate
|
36
|
+
|
37
|
+
from .diagonal import Diagonal
|
38
|
+
|
39
|
+
_EPS = 1e-10 # global variable used to chop very small numbers to zero
|
40
|
+
|
41
|
+
|
42
|
+
class UCGate(Gate):
|
43
|
+
r"""Uniformly controlled gate (also called multiplexed gate).
|
44
|
+
|
45
|
+
These gates can have several control qubits and a single target qubit.
|
46
|
+
If the k control qubits are in the state :math:`|i\rangle` (in the computational basis),
|
47
|
+
a single-qubit unitary :math:`U_i` is applied to the target qubit.
|
48
|
+
|
49
|
+
This gate is represented by a block-diagonal matrix, where each block is a
|
50
|
+
:math:`2\times 2` unitary, that is
|
51
|
+
|
52
|
+
.. math::
|
53
|
+
|
54
|
+
\begin{pmatrix}
|
55
|
+
U_0 & 0 & \cdots & 0 \\
|
56
|
+
0 & U_1 & \cdots & 0 \\
|
57
|
+
\vdots & & \ddots & \vdots \\
|
58
|
+
0 & 0 & \cdots & U_{2^{k-1}}
|
59
|
+
\end{pmatrix}.
|
60
|
+
|
61
|
+
The decomposition is based on Ref. [1].
|
62
|
+
|
63
|
+
**References:**
|
64
|
+
|
65
|
+
[1] Bergholm et al., Quantum circuits with uniformly controlled one-qubit gates (2005).
|
66
|
+
`Phys. Rev. A 71, 052330 <https://journals.aps.org/pra/abstract/10.1103/PhysRevA.71.052330>`__.
|
67
|
+
|
68
|
+
"""
|
69
|
+
|
70
|
+
def __init__(self, gate_list: list[np.ndarray], up_to_diagonal: bool = False):
|
71
|
+
r"""
|
72
|
+
Args:
|
73
|
+
gate_list: List of two qubit unitaries :math:`[U_0, ..., U_{2^{k-1}}]`, where each
|
74
|
+
single-qubit unitary :math:`U_i` is given as a :math:`2 \times 2` numpy array.
|
75
|
+
up_to_diagonal: Determines if the gate is implemented up to a diagonal.
|
76
|
+
or if it is decomposed completely (default: False).
|
77
|
+
If the ``UCGate`` :math:`U` is decomposed up to a diagonal :math:`D`, this means
|
78
|
+
that the circuit implements a unitary :math:`U'` such that :math:`D U' = U`.
|
79
|
+
|
80
|
+
Raises:
|
81
|
+
QiskitError: in case of bad input to the constructor
|
82
|
+
"""
|
83
|
+
# check input format
|
84
|
+
if not isinstance(gate_list, list):
|
85
|
+
raise QiskitError("The single-qubit unitaries are not provided in a list.")
|
86
|
+
for gate in gate_list:
|
87
|
+
if not gate.shape == (2, 2):
|
88
|
+
raise QiskitError("The dimension of a controlled gate is not equal to (2,2).")
|
89
|
+
if not gate_list:
|
90
|
+
raise QiskitError("The gate list cannot be empty.")
|
91
|
+
|
92
|
+
# Check if number of gates in gate_list is a positive power of two
|
93
|
+
num_contr = math.log2(len(gate_list))
|
94
|
+
if num_contr < 0 or not num_contr.is_integer():
|
95
|
+
raise QiskitError(
|
96
|
+
"The number of controlled single-qubit gates is not a non-negative power of 2."
|
97
|
+
)
|
98
|
+
|
99
|
+
# Check if the single-qubit gates are unitaries
|
100
|
+
for gate in gate_list:
|
101
|
+
if not is_unitary_matrix(gate, _EPS):
|
102
|
+
raise QiskitError("A controlled gate is not unitary.")
|
103
|
+
|
104
|
+
# Create new gate.
|
105
|
+
super().__init__("multiplexer", int(num_contr) + 1, gate_list)
|
106
|
+
self.up_to_diagonal = up_to_diagonal
|
107
|
+
|
108
|
+
def inverse(self, annotated: bool = False) -> Gate:
|
109
|
+
"""Return the inverse.
|
110
|
+
|
111
|
+
This does not re-compute the decomposition for the multiplexer with the inverse of the
|
112
|
+
gates but simply inverts the existing decomposition.
|
113
|
+
"""
|
114
|
+
if not annotated:
|
115
|
+
inverse_gate = Gate(
|
116
|
+
name=self.name + "_dg", num_qubits=self.num_qubits, params=[]
|
117
|
+
) # removing the params because arrays are deprecated
|
118
|
+
|
119
|
+
definition = QuantumCircuit(*self.definition.qregs)
|
120
|
+
for inst in reversed(self._definition):
|
121
|
+
definition._append(
|
122
|
+
inst.replace(operation=inst.operation.inverse(annotated=annotated))
|
123
|
+
)
|
124
|
+
|
125
|
+
definition.global_phase = -self.definition.global_phase
|
126
|
+
|
127
|
+
inverse_gate.definition = definition
|
128
|
+
else:
|
129
|
+
inverse_gate = super().inverse(annotated=annotated)
|
130
|
+
return inverse_gate
|
131
|
+
|
132
|
+
def _get_diagonal(self):
|
133
|
+
# Important: for a control list q_controls = [q[0],...,q_[k-1]] the
|
134
|
+
# diagonal gate is provided in the computational basis of the qubits
|
135
|
+
# q[k-1],...,q[0],q_target, decreasingly ordered with respect to the
|
136
|
+
# significance of the qubit in the computational basis
|
137
|
+
_, diag = self._dec_ucg()
|
138
|
+
return diag
|
139
|
+
|
140
|
+
def _define(self):
|
141
|
+
ucg_circuit, _ = self._dec_ucg()
|
142
|
+
self.definition = ucg_circuit
|
143
|
+
|
144
|
+
def _dec_ucg(self):
|
145
|
+
"""
|
146
|
+
Call to create a circuit that implements the uniformly controlled gate. If
|
147
|
+
up_to_diagonal=True, the circuit implements the gate up to a diagonal gate and
|
148
|
+
the diagonal gate is also returned.
|
149
|
+
"""
|
150
|
+
diag = np.ones(2**self.num_qubits).tolist()
|
151
|
+
q = QuantumRegister(self.num_qubits, "q")
|
152
|
+
q_controls = q[1:]
|
153
|
+
q_target = q[0]
|
154
|
+
circuit = QuantumCircuit(q, name="uc")
|
155
|
+
# If there is no control, we use the ZYZ decomposition
|
156
|
+
if not q_controls:
|
157
|
+
circuit.unitary(self.params[0], [q])
|
158
|
+
return circuit, diag
|
159
|
+
# If there is at least one control, first,
|
160
|
+
# we find the single qubit gates of the decomposition.
|
161
|
+
(single_qubit_gates, diag) = self._dec_ucg_help()
|
162
|
+
# Now, it is easy to place the C-NOT gates and some Hadamards and Rz(pi/2) gates
|
163
|
+
# (which are absorbed into the single-qubit unitaries) to get back the full decomposition.
|
164
|
+
for i, gate in enumerate(single_qubit_gates):
|
165
|
+
# Absorb Hadamards and Rz(pi/2) gates
|
166
|
+
if i == 0:
|
167
|
+
squ = HGate().to_matrix().dot(gate)
|
168
|
+
elif i == len(single_qubit_gates) - 1:
|
169
|
+
squ = gate.dot(UCGate._rz(np.pi / 2)).dot(HGate().to_matrix())
|
170
|
+
else:
|
171
|
+
squ = (
|
172
|
+
HGate()
|
173
|
+
.to_matrix()
|
174
|
+
.dot(gate.dot(UCGate._rz(np.pi / 2)))
|
175
|
+
.dot(HGate().to_matrix())
|
176
|
+
)
|
177
|
+
# Add single-qubit gate
|
178
|
+
circuit.unitary(squ, [q_target])
|
179
|
+
# The number of the control qubit is given by the number of zeros at the end
|
180
|
+
# of the binary representation of (i+1)
|
181
|
+
binary_rep = np.binary_repr(i + 1)
|
182
|
+
num_trailing_zeros = len(binary_rep) - len(binary_rep.rstrip("0"))
|
183
|
+
q_contr_index = num_trailing_zeros
|
184
|
+
# Add C-NOT gate
|
185
|
+
if not i == len(single_qubit_gates) - 1:
|
186
|
+
circuit.cx(q_controls[q_contr_index], q_target)
|
187
|
+
circuit.global_phase -= 0.25 * np.pi
|
188
|
+
if not self.up_to_diagonal:
|
189
|
+
# Important: the diagonal gate is given in the computational basis of the qubits
|
190
|
+
# q[k-1],...,q[0],q_target (ordered with decreasing significance),
|
191
|
+
# where q[i] are the control qubits and t denotes the target qubit.
|
192
|
+
diagonal = Diagonal(diag)
|
193
|
+
circuit.append(diagonal, q)
|
194
|
+
return circuit, diag
|
195
|
+
|
196
|
+
def _dec_ucg_help(self):
|
197
|
+
"""
|
198
|
+
This method finds the single qubit gate arising in the decomposition of UCGates given in
|
199
|
+
https://arxiv.org/pdf/quant-ph/0410066.pdf.
|
200
|
+
"""
|
201
|
+
single_qubit_gates = [gate.astype(complex) for gate in self.params]
|
202
|
+
return uc_gate.dec_ucg_help(single_qubit_gates, self.num_qubits)
|
203
|
+
|
204
|
+
@staticmethod
|
205
|
+
def _rz(alpha):
|
206
|
+
return np.array([[np.exp(1j * alpha / 2), 0], [0, np.exp(-1j * alpha / 2)]])
|
207
|
+
|
208
|
+
def validate_parameter(self, parameter):
|
209
|
+
"""Uniformly controlled gate parameter has to be an ndarray."""
|
210
|
+
if isinstance(parameter, np.ndarray):
|
211
|
+
return parameter
|
212
|
+
else:
|
213
|
+
raise CircuitError(f"invalid param type {type(parameter)} in gate {self.name}")
|
@@ -0,0 +1,164 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2020.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
# The structure of the code is based on Emanuel Malvetti's semester thesis at ETH in 2018,
|
14
|
+
# which was supervised by Raban Iten and Prof. Renato Renner.
|
15
|
+
|
16
|
+
"""Uniformly controlled Pauli rotations."""
|
17
|
+
|
18
|
+
from __future__ import annotations
|
19
|
+
|
20
|
+
import math
|
21
|
+
|
22
|
+
import numpy as np
|
23
|
+
|
24
|
+
from qiskit.circuit.gate import Gate
|
25
|
+
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
26
|
+
from qiskit.circuit.quantumregister import QuantumRegister
|
27
|
+
from qiskit.exceptions import QiskitError
|
28
|
+
|
29
|
+
_EPS = 1e-10 # global variable used to chop very small numbers to zero
|
30
|
+
|
31
|
+
|
32
|
+
class UCPauliRotGate(Gate):
|
33
|
+
r"""Uniformly controlled Pauli rotations.
|
34
|
+
|
35
|
+
Implements the :class:`.UCGate` for the special case that all unitaries are Pauli rotations,
|
36
|
+
:math:`U_i = R_P(a_i)` where :math:`P \in \{X, Y, Z\}` and :math:`a_i \in \mathbb{R}` is
|
37
|
+
the rotation angle.
|
38
|
+
"""
|
39
|
+
|
40
|
+
def __init__(self, angle_list: list[float], rot_axis: str) -> None:
|
41
|
+
r"""
|
42
|
+
Args:
|
43
|
+
angle_list: List of rotation angles :math:`[a_0, ..., a_{2^{k-1}}]`.
|
44
|
+
rot_axis: Rotation axis. Must be either of ``"X"``, ``"Y"`` or ``"Z"``.
|
45
|
+
"""
|
46
|
+
self.rot_axes = rot_axis
|
47
|
+
# Check if angle_list has type "list"
|
48
|
+
if not isinstance(angle_list, list):
|
49
|
+
raise QiskitError("The angles are not provided in a list.")
|
50
|
+
# Check if the angles in angle_list are real numbers
|
51
|
+
for angle in angle_list:
|
52
|
+
try:
|
53
|
+
float(angle)
|
54
|
+
except TypeError as ex:
|
55
|
+
raise QiskitError(
|
56
|
+
"An angle cannot be converted to type float (real angles are expected)."
|
57
|
+
) from ex
|
58
|
+
num_contr = math.log2(len(angle_list))
|
59
|
+
if num_contr < 0 or not num_contr.is_integer():
|
60
|
+
raise QiskitError(
|
61
|
+
"The number of controlled rotation gates is not a non-negative power of 2."
|
62
|
+
)
|
63
|
+
if rot_axis not in ("X", "Y", "Z"):
|
64
|
+
raise QiskitError("Rotation axis is not supported.")
|
65
|
+
# Create new gate.
|
66
|
+
num_qubits = int(num_contr) + 1
|
67
|
+
super().__init__("ucr" + rot_axis.lower(), num_qubits, angle_list)
|
68
|
+
|
69
|
+
def _define(self):
|
70
|
+
ucr_circuit = self._dec_ucrot()
|
71
|
+
gate = ucr_circuit.to_instruction()
|
72
|
+
q = QuantumRegister(self.num_qubits, "q")
|
73
|
+
ucr_circuit = QuantumCircuit(q)
|
74
|
+
ucr_circuit.append(gate, q[:])
|
75
|
+
self.definition = ucr_circuit
|
76
|
+
|
77
|
+
def _dec_ucrot(self):
|
78
|
+
"""
|
79
|
+
Finds a decomposition of a UC rotation gate into elementary gates
|
80
|
+
(C-NOTs and single-qubit rotations).
|
81
|
+
"""
|
82
|
+
q = QuantumRegister(self.num_qubits, "q")
|
83
|
+
circuit = QuantumCircuit(q)
|
84
|
+
q_target = q[0]
|
85
|
+
q_controls = q[1:]
|
86
|
+
if not q_controls: # equivalent to: if len(q_controls) == 0
|
87
|
+
if self.rot_axes == "X":
|
88
|
+
if np.abs(self.params[0]) > _EPS:
|
89
|
+
circuit.rx(self.params[0], q_target)
|
90
|
+
if self.rot_axes == "Y":
|
91
|
+
if np.abs(self.params[0]) > _EPS:
|
92
|
+
circuit.ry(self.params[0], q_target)
|
93
|
+
if self.rot_axes == "Z":
|
94
|
+
if np.abs(self.params[0]) > _EPS:
|
95
|
+
circuit.rz(self.params[0], q_target)
|
96
|
+
else:
|
97
|
+
# First, we find the rotation angles of the single-qubit rotations acting
|
98
|
+
# on the target qubit
|
99
|
+
angles = self.params.copy()
|
100
|
+
UCPauliRotGate._dec_uc_rotations(angles, 0, len(angles), False)
|
101
|
+
# Now, it is easy to place the C-NOT gates to get back the full decomposition.
|
102
|
+
for i, angle in enumerate(angles):
|
103
|
+
if self.rot_axes == "X":
|
104
|
+
if np.abs(angle) > _EPS:
|
105
|
+
circuit.rx(angle, q_target)
|
106
|
+
if self.rot_axes == "Y":
|
107
|
+
if np.abs(angle) > _EPS:
|
108
|
+
circuit.ry(angle, q_target)
|
109
|
+
if self.rot_axes == "Z":
|
110
|
+
if np.abs(angle) > _EPS:
|
111
|
+
circuit.rz(angle, q_target)
|
112
|
+
# Determine the index of the qubit we want to control the C-NOT gate.
|
113
|
+
# Note that it corresponds
|
114
|
+
# to the number of trailing zeros in the binary representation of i+1
|
115
|
+
if not i == len(angles) - 1:
|
116
|
+
binary_rep = np.binary_repr(i + 1)
|
117
|
+
q_contr_index = len(binary_rep) - len(binary_rep.rstrip("0"))
|
118
|
+
else:
|
119
|
+
# Handle special case:
|
120
|
+
q_contr_index = len(q_controls) - 1
|
121
|
+
# For X rotations, we have to additionally place some Ry gates around the
|
122
|
+
# C-NOT gates. They change the basis of the NOT operation, such that the
|
123
|
+
# decomposition of for uniformly controlled X rotations works correctly by symmetry
|
124
|
+
# with the decomposition of uniformly controlled Z or Y rotations
|
125
|
+
if self.rot_axes == "X":
|
126
|
+
circuit.ry(np.pi / 2, q_target)
|
127
|
+
circuit.cx(q_controls[q_contr_index], q_target)
|
128
|
+
if self.rot_axes == "X":
|
129
|
+
circuit.ry(-np.pi / 2, q_target)
|
130
|
+
return circuit
|
131
|
+
|
132
|
+
@staticmethod
|
133
|
+
def _dec_uc_rotations(angles, start_index, end_index, reversed_dec):
|
134
|
+
"""
|
135
|
+
Calculates rotation angles for a uniformly controlled R_t gate with a C-NOT gate at
|
136
|
+
the end of the circuit. The rotation angles of the gate R_t are stored in
|
137
|
+
angles[start_index:end_index]. If reversed_dec == True, it decomposes the gate such that
|
138
|
+
there is a C-NOT gate at the start of the circuit (in fact, the circuit topology for
|
139
|
+
the reversed decomposition is the reversed one of the original decomposition)
|
140
|
+
"""
|
141
|
+
interval_len_half = (end_index - start_index) // 2
|
142
|
+
for i in range(start_index, start_index + interval_len_half):
|
143
|
+
if not reversed_dec:
|
144
|
+
angles[i], angles[i + interval_len_half] = UCPauliRotGate._update_angles(
|
145
|
+
angles[i], angles[i + interval_len_half]
|
146
|
+
)
|
147
|
+
else:
|
148
|
+
angles[i + interval_len_half], angles[i] = UCPauliRotGate._update_angles(
|
149
|
+
angles[i], angles[i + interval_len_half]
|
150
|
+
)
|
151
|
+
if interval_len_half <= 1:
|
152
|
+
return
|
153
|
+
else:
|
154
|
+
UCPauliRotGate._dec_uc_rotations(
|
155
|
+
angles, start_index, start_index + interval_len_half, False
|
156
|
+
)
|
157
|
+
UCPauliRotGate._dec_uc_rotations(
|
158
|
+
angles, start_index + interval_len_half, end_index, True
|
159
|
+
)
|
160
|
+
|
161
|
+
@staticmethod
|
162
|
+
def _update_angles(angle1, angle2):
|
163
|
+
"""Calculate the new rotation angles according to Shende's decomposition."""
|
164
|
+
return (angle1 + angle2) / 2.0, (angle1 - angle2) / 2.0
|