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,189 @@
|
|
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
|
+
|
14
|
+
"""Linearly-controlled X, Y or Z rotation."""
|
15
|
+
|
16
|
+
from typing import Optional
|
17
|
+
|
18
|
+
from qiskit.circuit import QuantumRegister, QuantumCircuit
|
19
|
+
from qiskit.circuit.exceptions import CircuitError
|
20
|
+
|
21
|
+
from .functional_pauli_rotations import FunctionalPauliRotations
|
22
|
+
|
23
|
+
|
24
|
+
class LinearPauliRotations(FunctionalPauliRotations):
|
25
|
+
r"""Linearly-controlled X, Y or Z rotation.
|
26
|
+
|
27
|
+
For a register of state qubits :math:`|x\rangle`, a target qubit :math:`|0\rangle` and the
|
28
|
+
basis ``'Y'`` this circuit acts as:
|
29
|
+
|
30
|
+
.. code-block:: text
|
31
|
+
|
32
|
+
q_0: ─────────────────────────■───────── ... ──────────────────────
|
33
|
+
│
|
34
|
+
.
|
35
|
+
│
|
36
|
+
q_(n-1): ─────────────────────────┼───────── ... ───────────■──────────
|
37
|
+
┌────────────┐ ┌───────┴───────┐ ┌─────────┴─────────┐
|
38
|
+
q_n: ─┤ RY(offset) ├──┤ RY(2^0 slope) ├ ... ┤ RY(2^(n-1) slope) ├
|
39
|
+
└────────────┘ └───────────────┘ └───────────────────┘
|
40
|
+
|
41
|
+
This can for example be used to approximate linear functions, with :math:`a =` ``slope``:math:`/2`
|
42
|
+
and :math:`b =` ``offset``:math:`/2` and the basis ``'Y'``:
|
43
|
+
|
44
|
+
.. math::
|
45
|
+
|
46
|
+
|x\rangle |0\rangle \mapsto \cos(ax + b)|x\rangle|0\rangle + \sin(ax + b)|x\rangle |1\rangle
|
47
|
+
|
48
|
+
Since for small arguments :math:`\sin(x) \approx x` this operator can be used to approximate
|
49
|
+
linear functions.
|
50
|
+
"""
|
51
|
+
|
52
|
+
def __init__(
|
53
|
+
self,
|
54
|
+
num_state_qubits: Optional[int] = None,
|
55
|
+
slope: float = 1,
|
56
|
+
offset: float = 0,
|
57
|
+
basis: str = "Y",
|
58
|
+
name: str = "LinRot",
|
59
|
+
) -> None:
|
60
|
+
r"""Create a new linear rotation circuit.
|
61
|
+
|
62
|
+
Args:
|
63
|
+
num_state_qubits: The number of qubits representing the state :math:`|x\rangle`.
|
64
|
+
slope: The slope of the controlled rotation.
|
65
|
+
offset: The offset of the controlled rotation.
|
66
|
+
basis: The type of Pauli rotation ('X', 'Y', 'Z').
|
67
|
+
name: The name of the circuit object.
|
68
|
+
"""
|
69
|
+
super().__init__(num_state_qubits=num_state_qubits, basis=basis, name=name)
|
70
|
+
|
71
|
+
# define internal parameters
|
72
|
+
self._slope = None
|
73
|
+
self._offset = None
|
74
|
+
|
75
|
+
# store parameters
|
76
|
+
self.slope = slope
|
77
|
+
self.offset = offset
|
78
|
+
|
79
|
+
@property
|
80
|
+
def slope(self) -> float:
|
81
|
+
"""The multiplicative factor in the rotation angle of the controlled rotations.
|
82
|
+
|
83
|
+
The rotation angles are ``slope * 2^0``, ``slope * 2^1``, ... , ``slope * 2^(n-1)`` where
|
84
|
+
``n`` is the number of state qubits.
|
85
|
+
|
86
|
+
Returns:
|
87
|
+
The rotation angle common in all controlled rotations.
|
88
|
+
"""
|
89
|
+
return self._slope
|
90
|
+
|
91
|
+
@slope.setter
|
92
|
+
def slope(self, slope: float) -> None:
|
93
|
+
"""Set the multiplicative factor of the rotation angles.
|
94
|
+
|
95
|
+
Args:
|
96
|
+
The slope of the rotation angles.
|
97
|
+
"""
|
98
|
+
if self._slope is None or slope != self._slope:
|
99
|
+
self._invalidate()
|
100
|
+
self._slope = slope
|
101
|
+
|
102
|
+
@property
|
103
|
+
def offset(self) -> float:
|
104
|
+
"""The angle of the single qubit offset rotation on the target qubit.
|
105
|
+
|
106
|
+
Before applying the controlled rotations, a single rotation of angle ``offset`` is
|
107
|
+
applied to the target qubit.
|
108
|
+
|
109
|
+
Returns:
|
110
|
+
The offset angle.
|
111
|
+
"""
|
112
|
+
return self._offset
|
113
|
+
|
114
|
+
@offset.setter
|
115
|
+
def offset(self, offset: float) -> None:
|
116
|
+
"""Set the angle for the offset rotation on the target qubit.
|
117
|
+
|
118
|
+
Args:
|
119
|
+
offset: The offset rotation angle.
|
120
|
+
"""
|
121
|
+
if self._offset is None or offset != self._offset:
|
122
|
+
self._invalidate()
|
123
|
+
self._offset = offset
|
124
|
+
|
125
|
+
def _reset_registers(self, num_state_qubits: Optional[int]) -> None:
|
126
|
+
"""Set the number of state qubits.
|
127
|
+
|
128
|
+
Note that this changes the underlying quantum register, if the number of state qubits
|
129
|
+
changes.
|
130
|
+
|
131
|
+
Args:
|
132
|
+
num_state_qubits: The new number of qubits.
|
133
|
+
"""
|
134
|
+
self.qregs = []
|
135
|
+
|
136
|
+
if num_state_qubits:
|
137
|
+
# set new register of appropriate size
|
138
|
+
qr_state = QuantumRegister(num_state_qubits, name="state")
|
139
|
+
qr_target = QuantumRegister(1, name="target")
|
140
|
+
self.qregs = [qr_state, qr_target]
|
141
|
+
|
142
|
+
def _check_configuration(self, raise_on_failure: bool = True) -> bool:
|
143
|
+
"""Check if the current configuration is valid."""
|
144
|
+
valid = True
|
145
|
+
|
146
|
+
if self.num_state_qubits is None:
|
147
|
+
valid = False
|
148
|
+
if raise_on_failure:
|
149
|
+
raise AttributeError("The number of qubits has not been set.")
|
150
|
+
|
151
|
+
if self.num_qubits < self.num_state_qubits + 1:
|
152
|
+
valid = False
|
153
|
+
if raise_on_failure:
|
154
|
+
raise CircuitError(
|
155
|
+
"Not enough qubits in the circuit, need at least "
|
156
|
+
f"{self.num_state_qubits + 1}."
|
157
|
+
)
|
158
|
+
|
159
|
+
return valid
|
160
|
+
|
161
|
+
def _build(self):
|
162
|
+
"""If not already built, build the circuit."""
|
163
|
+
if self._is_built:
|
164
|
+
return
|
165
|
+
|
166
|
+
super()._build()
|
167
|
+
|
168
|
+
circuit = QuantumCircuit(*self.qregs, name=self.name)
|
169
|
+
|
170
|
+
# build the circuit
|
171
|
+
qr_state = self.qubits[: self.num_state_qubits]
|
172
|
+
qr_target = self.qubits[self.num_state_qubits]
|
173
|
+
|
174
|
+
if self.basis == "x":
|
175
|
+
circuit.rx(self.offset, qr_target)
|
176
|
+
elif self.basis == "y":
|
177
|
+
circuit.ry(self.offset, qr_target)
|
178
|
+
else: # 'Z':
|
179
|
+
circuit.rz(self.offset, qr_target)
|
180
|
+
|
181
|
+
for i, q_i in enumerate(qr_state):
|
182
|
+
if self.basis == "x":
|
183
|
+
circuit.crx(self.slope * pow(2, i), q_i, qr_target)
|
184
|
+
elif self.basis == "y":
|
185
|
+
circuit.cry(self.slope * pow(2, i), q_i, qr_target)
|
186
|
+
else: # 'Z'
|
187
|
+
circuit.crz(self.slope * pow(2, i), q_i, qr_target)
|
188
|
+
|
189
|
+
self.append(circuit.to_gate(), self.qubits)
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 2021.
|
4
|
+
#
|
5
|
+
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
+
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
+
#
|
9
|
+
# Any modifications or derivative works of this code must retain this
|
10
|
+
# copyright notice, and modified files need to carry a notice indicating
|
11
|
+
# that they have been altered from the originals.
|
12
|
+
|
13
|
+
"""The multiplier circuit library."""
|
14
|
+
|
15
|
+
from .hrs_cumulative_multiplier import HRSCumulativeMultiplier
|
16
|
+
from .rg_qft_multiplier import RGQFTMultiplier
|
17
|
+
from .multiplier import MultiplierGate
|
@@ -0,0 +1,145 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 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
|
+
"""Compute the product of two qubit registers using classical multiplication approach."""
|
14
|
+
|
15
|
+
from typing import Optional
|
16
|
+
from qiskit.circuit import QuantumRegister, AncillaRegister, QuantumCircuit
|
17
|
+
|
18
|
+
from .multiplier import Multiplier
|
19
|
+
|
20
|
+
|
21
|
+
class HRSCumulativeMultiplier(Multiplier):
|
22
|
+
r"""A multiplication circuit to store product of two input registers out-of-place.
|
23
|
+
|
24
|
+
Circuit uses the approach from [1]. As an example, a multiplier circuit that
|
25
|
+
performs a non-modular multiplication on two 3-qubit sized registers with
|
26
|
+
the default adder is as follows (where ``Adder`` denotes the
|
27
|
+
``CDKMRippleCarryAdder``):
|
28
|
+
|
29
|
+
.. code-block:: text
|
30
|
+
|
31
|
+
a_0: ────■─────────────────────────
|
32
|
+
│
|
33
|
+
a_1: ────┼─────────■───────────────
|
34
|
+
│ │
|
35
|
+
a_2: ────┼─────────┼─────────■─────
|
36
|
+
┌───┴────┐┌───┴────┐┌───┴────┐
|
37
|
+
b_0: ┤0 ├┤0 ├┤0 ├
|
38
|
+
│ ││ ││ │
|
39
|
+
b_1: ┤1 ├┤1 ├┤1 ├
|
40
|
+
│ ││ ││ │
|
41
|
+
b_2: ┤2 ├┤2 ├┤2 ├
|
42
|
+
│ ││ ││ │
|
43
|
+
out_0: ┤3 ├┤ ├┤ ├
|
44
|
+
│ ││ ││ │
|
45
|
+
out_1: ┤4 ├┤3 ├┤ ├
|
46
|
+
│ Adder ││ Adder ││ Adder │
|
47
|
+
out_2: ┤5 ├┤4 ├┤3 ├
|
48
|
+
│ ││ ││ │
|
49
|
+
out_3: ┤6 ├┤5 ├┤4 ├
|
50
|
+
│ ││ ││ │
|
51
|
+
out_4: ┤ ├┤6 ├┤5 ├
|
52
|
+
│ ││ ││ │
|
53
|
+
out_5: ┤ ├┤ ├┤6 ├
|
54
|
+
│ ││ ││ │
|
55
|
+
aux_0: ┤7 ├┤7 ├┤7 ├
|
56
|
+
└────────┘└────────┘└────────┘
|
57
|
+
|
58
|
+
Multiplication in this circuit is implemented in a classical approach by performing
|
59
|
+
a series of shifted additions using one of the input registers while the qubits
|
60
|
+
from the other input register act as control qubits for the adders.
|
61
|
+
|
62
|
+
.. seealso::
|
63
|
+
|
64
|
+
The :class:`.MultiplierGate` objects represents a multiplication, like this circuit class,
|
65
|
+
but allows the compiler to select the optimal decomposition based on the context.
|
66
|
+
Specific implementations can be set via the :class:`.HLSConfig`, e.g. this circuit
|
67
|
+
can be chosen via ``Multiplier=["cumulative_h18"]``.
|
68
|
+
|
69
|
+
**References:**
|
70
|
+
|
71
|
+
[1] Häner et al., Optimizing Quantum Circuits for Arithmetic, 2018.
|
72
|
+
`arXiv:1805.12445 <https://arxiv.org/pdf/1805.12445.pdf>`_
|
73
|
+
|
74
|
+
"""
|
75
|
+
|
76
|
+
def __init__(
|
77
|
+
self,
|
78
|
+
num_state_qubits: int,
|
79
|
+
num_result_qubits: Optional[int] = None,
|
80
|
+
adder: Optional[QuantumCircuit] = None,
|
81
|
+
name: str = "HRSCumulativeMultiplier",
|
82
|
+
) -> None:
|
83
|
+
r"""
|
84
|
+
Args:
|
85
|
+
num_state_qubits: The number of qubits in either input register for
|
86
|
+
state :math:`|a\rangle` or :math:`|b\rangle`. The two input
|
87
|
+
registers must have the same number of qubits.
|
88
|
+
num_result_qubits: The number of result qubits to limit the output to.
|
89
|
+
If number of result qubits is :math:`n`, multiplication modulo :math:`2^n` is performed
|
90
|
+
to limit the output to the specified number of qubits. Default
|
91
|
+
value is ``2 * num_state_qubits`` to represent any possible
|
92
|
+
result from the multiplication of the two inputs.
|
93
|
+
adder: Half adder circuit to be used for performing multiplication. The
|
94
|
+
CDKMRippleCarryAdder is used as default if no adder is provided.
|
95
|
+
name: The name of the circuit object.
|
96
|
+
Raises:
|
97
|
+
NotImplementedError: If ``num_result_qubits`` is not default and a custom adder is provided.
|
98
|
+
"""
|
99
|
+
super().__init__(num_state_qubits, num_result_qubits, name=name)
|
100
|
+
|
101
|
+
if self.num_result_qubits != 2 * num_state_qubits and adder is not None:
|
102
|
+
raise NotImplementedError("Only default adder is supported for modular multiplication.")
|
103
|
+
|
104
|
+
# define the registers
|
105
|
+
qr_a = QuantumRegister(num_state_qubits, name="a")
|
106
|
+
qr_b = QuantumRegister(num_state_qubits, name="b")
|
107
|
+
qr_out = QuantumRegister(self.num_result_qubits, name="out")
|
108
|
+
self.add_register(qr_a, qr_b, qr_out)
|
109
|
+
|
110
|
+
# prepare adder as controlled gate
|
111
|
+
if adder is None:
|
112
|
+
from qiskit.circuit.library.arithmetic.adders import CDKMRippleCarryAdder
|
113
|
+
|
114
|
+
adder = CDKMRippleCarryAdder(num_state_qubits, kind="half")
|
115
|
+
|
116
|
+
# get the number of helper qubits needed
|
117
|
+
num_helper_qubits = adder.num_ancillas
|
118
|
+
|
119
|
+
# add helper qubits if required
|
120
|
+
if num_helper_qubits > 0:
|
121
|
+
qr_h = AncillaRegister(num_helper_qubits, name="helper") # helper/ancilla qubits
|
122
|
+
self.add_register(qr_h)
|
123
|
+
|
124
|
+
# build multiplication circuit
|
125
|
+
circuit = QuantumCircuit(*self.qregs, name=name)
|
126
|
+
|
127
|
+
for i in range(num_state_qubits):
|
128
|
+
excess_qubits = max(0, num_state_qubits + i + 1 - self.num_result_qubits)
|
129
|
+
if excess_qubits == 0:
|
130
|
+
num_adder_qubits = num_state_qubits
|
131
|
+
adder_for_current_step = adder
|
132
|
+
else:
|
133
|
+
num_adder_qubits = num_state_qubits - excess_qubits + 1
|
134
|
+
adder_for_current_step = CDKMRippleCarryAdder(num_adder_qubits, kind="fixed")
|
135
|
+
controlled_adder = adder_for_current_step.to_gate().control(1)
|
136
|
+
qr_list = (
|
137
|
+
[qr_a[i]]
|
138
|
+
+ qr_b[:num_adder_qubits]
|
139
|
+
+ qr_out[i : num_state_qubits + i + 1 - excess_qubits]
|
140
|
+
)
|
141
|
+
if num_helper_qubits > 0:
|
142
|
+
qr_list.extend(qr_h[:])
|
143
|
+
circuit.append(controlled_adder, qr_list)
|
144
|
+
|
145
|
+
self.append(circuit.to_gate(), self.qubits)
|
@@ -0,0 +1,192 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 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
|
+
"""Compute the product of two equally sized qubit registers."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from qiskit.circuit import QuantumCircuit, Gate
|
18
|
+
from qiskit.utils.deprecation import deprecate_func
|
19
|
+
|
20
|
+
|
21
|
+
class Multiplier(QuantumCircuit):
|
22
|
+
r"""Compute the product of two equally sized qubit registers into a new register.
|
23
|
+
|
24
|
+
For two input registers :math:`|a\rangle_n`, :math:`|b\rangle_n` with :math:`n` qubits each
|
25
|
+
and an output register with :math:`2n` qubits, a multiplier performs the following operation
|
26
|
+
|
27
|
+
.. math::
|
28
|
+
|
29
|
+
|a\rangle_n |b\rangle_n |0\rangle_{t} \mapsto |a\rangle_n |b\rangle_n |a \cdot b\rangle_t
|
30
|
+
|
31
|
+
where :math:`t` is the number of bits used to represent the result. To completely store the result
|
32
|
+
of the multiplication without overflow we need :math:`t = 2n` bits.
|
33
|
+
|
34
|
+
The quantum register :math:`|a\rangle_n` (analogously :math:`|b\rangle_n` and
|
35
|
+
output register)
|
36
|
+
|
37
|
+
.. math::
|
38
|
+
|
39
|
+
|a\rangle_n = |a_0\rangle \otimes \cdots \otimes |a_{n - 1}\rangle,
|
40
|
+
|
41
|
+
for :math:`a_i \in \{0, 1\}`, is associated with the integer value
|
42
|
+
|
43
|
+
.. math::
|
44
|
+
|
45
|
+
a = 2^{0}a_{0} + 2^{1}a_{1} + \cdots + 2^{n - 1}a_{n - 1}.
|
46
|
+
|
47
|
+
"""
|
48
|
+
|
49
|
+
@deprecate_func(
|
50
|
+
since="1.3",
|
51
|
+
additional_msg=(
|
52
|
+
"Use the MultiplierGate provided in qiskit.circuit.library.arithmetic instead. "
|
53
|
+
"For different multiplier implementations, see "
|
54
|
+
"https://docs.quantum.ibm.com/api/qiskit/synthesis.",
|
55
|
+
),
|
56
|
+
pending=True,
|
57
|
+
)
|
58
|
+
def __init__(
|
59
|
+
self,
|
60
|
+
num_state_qubits: int,
|
61
|
+
num_result_qubits: int | None = None,
|
62
|
+
name: str = "Multiplier",
|
63
|
+
) -> None:
|
64
|
+
"""
|
65
|
+
Args:
|
66
|
+
num_state_qubits: The number of qubits in each of the input registers.
|
67
|
+
num_result_qubits: The number of result qubits to limit the output to.
|
68
|
+
Default value is ``2 * num_state_qubits`` to represent any possible
|
69
|
+
result from the multiplication of the two inputs.
|
70
|
+
name: The name of the circuit.
|
71
|
+
Raises:
|
72
|
+
ValueError: If ``num_state_qubits`` is smaller than 1.
|
73
|
+
ValueError: If ``num_result_qubits`` is smaller than ``num_state_qubits``.
|
74
|
+
ValueError: If ``num_result_qubits`` is larger than ``2 * num_state_qubits``.
|
75
|
+
"""
|
76
|
+
if num_state_qubits < 1:
|
77
|
+
raise ValueError("The number of qubits must be at least 1.")
|
78
|
+
|
79
|
+
if num_result_qubits is None:
|
80
|
+
num_result_qubits = 2 * num_state_qubits
|
81
|
+
|
82
|
+
if num_result_qubits < num_state_qubits:
|
83
|
+
raise ValueError(
|
84
|
+
"Number of result qubits is smaller than number of input state qubits."
|
85
|
+
)
|
86
|
+
if num_result_qubits > 2 * num_state_qubits:
|
87
|
+
raise ValueError(
|
88
|
+
"Number of result qubits is larger than twice the number of input state qubits."
|
89
|
+
)
|
90
|
+
|
91
|
+
super().__init__(name=name)
|
92
|
+
self._num_state_qubits = num_state_qubits
|
93
|
+
self._num_result_qubits = num_result_qubits
|
94
|
+
|
95
|
+
@property
|
96
|
+
def num_state_qubits(self) -> int:
|
97
|
+
"""The number of state qubits, i.e. the number of bits in each input register.
|
98
|
+
|
99
|
+
Returns:
|
100
|
+
The number of state qubits.
|
101
|
+
"""
|
102
|
+
return self._num_state_qubits
|
103
|
+
|
104
|
+
@property
|
105
|
+
def num_result_qubits(self) -> int:
|
106
|
+
"""The number of result qubits to limit the output to.
|
107
|
+
|
108
|
+
Returns:
|
109
|
+
The number of result qubits.
|
110
|
+
"""
|
111
|
+
return self._num_result_qubits
|
112
|
+
|
113
|
+
|
114
|
+
class MultiplierGate(Gate):
|
115
|
+
r"""Compute the product of two equally sized qubit registers into a new register.
|
116
|
+
|
117
|
+
For two input registers :math:`|a\rangle_n`, :math:`|b\rangle_n` with :math:`n` qubits each
|
118
|
+
and an output register with :math:`2n` qubits, a multiplier performs the following operation
|
119
|
+
|
120
|
+
.. math::
|
121
|
+
|
122
|
+
|a\rangle_n |b\rangle_n |0\rangle_{t} \mapsto |a\rangle_n |b\rangle_n |a \cdot b\rangle_t
|
123
|
+
|
124
|
+
where :math:`t` is the number of bits used to represent the result. To completely store the result
|
125
|
+
of the multiplication without overflow we need :math:`t = 2n` bits.
|
126
|
+
|
127
|
+
The quantum register :math:`|a\rangle_n` (analogously :math:`|b\rangle_n` and
|
128
|
+
output register)
|
129
|
+
|
130
|
+
.. math::
|
131
|
+
|
132
|
+
|a\rangle_n = |a_0\rangle \otimes \cdots \otimes |a_{n - 1}\rangle,
|
133
|
+
|
134
|
+
for :math:`a_i \in \{0, 1\}`, is associated with the integer value
|
135
|
+
|
136
|
+
.. math::
|
137
|
+
|
138
|
+
a = 2^{0}a_{0} + 2^{1}a_{1} + \cdots + 2^{n - 1}a_{n - 1}.
|
139
|
+
|
140
|
+
"""
|
141
|
+
|
142
|
+
def __init__(
|
143
|
+
self,
|
144
|
+
num_state_qubits: int,
|
145
|
+
num_result_qubits: int | None = None,
|
146
|
+
label: str | None = None,
|
147
|
+
) -> None:
|
148
|
+
"""
|
149
|
+
Args:
|
150
|
+
num_state_qubits: The number of qubits in each of the input registers.
|
151
|
+
num_result_qubits: The number of result qubits to limit the output to.
|
152
|
+
Default value is ``2 * num_state_qubits`` to represent any possible
|
153
|
+
result from the multiplication of the two inputs.
|
154
|
+
name: The name of the circuit.
|
155
|
+
Raises:
|
156
|
+
ValueError: If ``num_state_qubits`` is smaller than 1.
|
157
|
+
ValueError: If ``num_result_qubits`` is smaller than ``num_state_qubits``.
|
158
|
+
ValueError: If ``num_result_qubits`` is larger than ``2 * num_state_qubits``.
|
159
|
+
"""
|
160
|
+
if num_state_qubits < 1:
|
161
|
+
raise ValueError("The number of state qubits must be at least 1.")
|
162
|
+
|
163
|
+
if num_result_qubits is None:
|
164
|
+
num_result_qubits = 2 * num_state_qubits
|
165
|
+
elif num_result_qubits < num_state_qubits or num_result_qubits > 2 * num_state_qubits:
|
166
|
+
raise ValueError(
|
167
|
+
f"num_result_qubits ({num_result_qubits}) must be in between num_state_qubits "
|
168
|
+
f"({num_state_qubits}) and 2 * num_state_qubits ({2 * num_state_qubits})"
|
169
|
+
)
|
170
|
+
|
171
|
+
super().__init__("Multiplier", 2 * num_state_qubits + num_result_qubits, [], label=label)
|
172
|
+
|
173
|
+
self._num_state_qubits = num_state_qubits
|
174
|
+
self._num_result_qubits = num_result_qubits
|
175
|
+
|
176
|
+
@property
|
177
|
+
def num_state_qubits(self) -> int:
|
178
|
+
"""The number of state qubits, i.e. the number of bits in each input register.
|
179
|
+
|
180
|
+
Returns:
|
181
|
+
The number of state qubits.
|
182
|
+
"""
|
183
|
+
return self._num_state_qubits
|
184
|
+
|
185
|
+
@property
|
186
|
+
def num_result_qubits(self) -> int:
|
187
|
+
"""The number of result qubits to limit the output to.
|
188
|
+
|
189
|
+
Returns:
|
190
|
+
The number of result qubits.
|
191
|
+
"""
|
192
|
+
return self._num_result_qubits
|
@@ -0,0 +1,108 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2017, 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
|
+
"""Compute the product of two qubit registers using QFT."""
|
14
|
+
|
15
|
+
from typing import Optional
|
16
|
+
import numpy as np
|
17
|
+
|
18
|
+
from qiskit.circuit import QuantumRegister, QuantumCircuit
|
19
|
+
from qiskit.circuit.library.standard_gates import PhaseGate
|
20
|
+
from qiskit.circuit.library.basis_change import QFT
|
21
|
+
|
22
|
+
from .multiplier import Multiplier
|
23
|
+
|
24
|
+
|
25
|
+
class RGQFTMultiplier(Multiplier):
|
26
|
+
r"""A QFT multiplication circuit to store product of two input registers out-of-place.
|
27
|
+
|
28
|
+
Multiplication in this circuit is implemented using the procedure of Fig. 3 in [1], where
|
29
|
+
weighted sum rotations are implemented as given in Fig. 5 in [1]. QFT is used on the output
|
30
|
+
register and is followed by rotations controlled by input registers. The rotations
|
31
|
+
transform the state into the product of two input registers in QFT base, which is
|
32
|
+
reverted from QFT base using inverse QFT.
|
33
|
+
As an example, a circuit that performs a modular QFT multiplication on two 2-qubit
|
34
|
+
sized input registers with an output register of 2 qubits, is as follows:
|
35
|
+
|
36
|
+
.. code-block:: text
|
37
|
+
|
38
|
+
a_0: ────────────────────────────────────────■───────■──────■──────■────────────────
|
39
|
+
│ │ │ │
|
40
|
+
a_1: ─────────■───────■───────■───────■──────┼───────┼──────┼──────┼────────────────
|
41
|
+
│ │ │ │ │ │ │ │
|
42
|
+
b_0: ─────────┼───────┼───────■───────■──────┼───────┼──────■──────■────────────────
|
43
|
+
│ │ │ │ │ │ │ │
|
44
|
+
b_1: ─────────■───────■───────┼───────┼──────■───────■──────┼──────┼────────────────
|
45
|
+
┌──────┐ │P(4π) │ │P(2π) │ │P(2π) │ │P(π) │ ┌───────┐
|
46
|
+
out_0: ┤0 ├─■───────┼───────■───────┼──────■───────┼──────■──────┼───────┤0 ├
|
47
|
+
│ qft │ │P(2π) │P(π) │P(π) │P(π/2) │ iqft │
|
48
|
+
out_1: ┤1 ├─────────■───────────────■──────────────■─────────────■───────┤1 ├
|
49
|
+
└──────┘ └───────┘
|
50
|
+
|
51
|
+
.. seealso::
|
52
|
+
|
53
|
+
The :class:`.MultiplierGate` objects represents a multiplication, like this circuit class,
|
54
|
+
but allows the compiler to select the optimal decomposition based on the context.
|
55
|
+
Specific implementations can be set via the :class:`.HLSConfig`, e.g. this circuit
|
56
|
+
can be chosen via ``Multiplier=["qft_r17"]``.
|
57
|
+
|
58
|
+
**References:**
|
59
|
+
|
60
|
+
[1] Ruiz-Perez et al., Quantum arithmetic with the Quantum Fourier Transform, 2017.
|
61
|
+
`arXiv:1411.5949 <https://arxiv.org/pdf/1411.5949.pdf>`_
|
62
|
+
|
63
|
+
"""
|
64
|
+
|
65
|
+
def __init__(
|
66
|
+
self,
|
67
|
+
num_state_qubits: int,
|
68
|
+
num_result_qubits: Optional[int] = None,
|
69
|
+
name: str = "RGQFTMultiplier",
|
70
|
+
) -> None:
|
71
|
+
r"""
|
72
|
+
Args:
|
73
|
+
num_state_qubits: The number of qubits in either input register for
|
74
|
+
state :math:`|a\rangle` or :math:`|b\rangle`. The two input
|
75
|
+
registers must have the same number of qubits.
|
76
|
+
num_result_qubits: The number of result qubits to limit the output to.
|
77
|
+
If number of result qubits is :math:`n`, multiplication modulo :math:`2^n` is performed
|
78
|
+
to limit the output to the specified number of qubits. Default
|
79
|
+
value is ``2 * num_state_qubits`` to represent any possible
|
80
|
+
result from the multiplication of the two inputs.
|
81
|
+
name: The name of the circuit object.
|
82
|
+
|
83
|
+
"""
|
84
|
+
super().__init__(num_state_qubits, num_result_qubits, name=name)
|
85
|
+
|
86
|
+
# define the registers
|
87
|
+
qr_a = QuantumRegister(num_state_qubits, name="a")
|
88
|
+
qr_b = QuantumRegister(num_state_qubits, name="b")
|
89
|
+
qr_out = QuantumRegister(self.num_result_qubits, name="out")
|
90
|
+
self.add_register(qr_a, qr_b, qr_out)
|
91
|
+
|
92
|
+
# build multiplication circuit
|
93
|
+
circuit = QuantumCircuit(*self.qregs, name=name)
|
94
|
+
|
95
|
+
circuit.append(QFT(self.num_result_qubits, do_swaps=False).to_gate(), qr_out[:])
|
96
|
+
|
97
|
+
for j in range(1, num_state_qubits + 1):
|
98
|
+
for i in range(1, num_state_qubits + 1):
|
99
|
+
for k in range(1, self.num_result_qubits + 1):
|
100
|
+
lam = (2 * np.pi) / (2 ** (i + j + k - 2 * num_state_qubits))
|
101
|
+
circuit.append(
|
102
|
+
PhaseGate(lam).control(2),
|
103
|
+
[qr_a[num_state_qubits - j], qr_b[num_state_qubits - i], qr_out[k - 1]],
|
104
|
+
)
|
105
|
+
|
106
|
+
circuit.append(QFT(self.num_result_qubits, do_swaps=False).inverse().to_gate(), qr_out[:])
|
107
|
+
|
108
|
+
self.append(circuit.to_gate(), self.qubits)
|