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,317 @@
|
|
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
|
+
"""Piecewise-polynomially-controlled Pauli rotations."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
from typing import List, Optional
|
17
|
+
import numpy as np
|
18
|
+
|
19
|
+
from qiskit.circuit import QuantumRegister, AncillaRegister, QuantumCircuit
|
20
|
+
from qiskit.circuit.exceptions import CircuitError
|
21
|
+
|
22
|
+
from .functional_pauli_rotations import FunctionalPauliRotations
|
23
|
+
from .polynomial_pauli_rotations import PolynomialPauliRotations
|
24
|
+
from .integer_comparator import IntegerComparator
|
25
|
+
|
26
|
+
|
27
|
+
class PiecewisePolynomialPauliRotations(FunctionalPauliRotations):
|
28
|
+
r"""Piecewise-polynomially-controlled Pauli rotations.
|
29
|
+
|
30
|
+
This class implements a piecewise polynomial (not necessarily continuous) function,
|
31
|
+
:math:`f(x)`, on qubit amplitudes, which is defined through breakpoints and coefficients as
|
32
|
+
follows.
|
33
|
+
Suppose the breakpoints :math:`(x_0, ..., x_J)` are a subset of :math:`[0, 2^n-1]`, where
|
34
|
+
:math:`n` is the number of state qubits. Further on, denote the corresponding coefficients by
|
35
|
+
:math:`[a_{j,1},...,a_{j,d}]`, where :math:`d` is the highest degree among all polynomials.
|
36
|
+
|
37
|
+
Then :math:`f(x)` is defined as:
|
38
|
+
|
39
|
+
.. math::
|
40
|
+
|
41
|
+
f(x) = \begin{cases}
|
42
|
+
0, x < x_0 \\
|
43
|
+
\sum_{i=0}^{i=d}a_{j,i}/2 x^i, x_j \leq x < x_{j+1}
|
44
|
+
\end{cases}
|
45
|
+
|
46
|
+
where if given the same number of breakpoints as polynomials, we implicitly assume
|
47
|
+
:math:`x_{J+1} = 2^n`.
|
48
|
+
|
49
|
+
.. note::
|
50
|
+
|
51
|
+
Note the :math:`1/2` factor in the coefficients of :math:`f(x)`, this is consistent with
|
52
|
+
Qiskit's Pauli rotations.
|
53
|
+
|
54
|
+
Examples:
|
55
|
+
>>> from qiskit import QuantumCircuit
|
56
|
+
>>> from qiskit.circuit.library.arithmetic.piecewise_polynomial_pauli_rotations import\
|
57
|
+
... PiecewisePolynomialPauliRotations
|
58
|
+
>>> qubits, breakpoints, coeffs = (2, [0, 2], [[0, -1.2],[-1, 1, 3]])
|
59
|
+
>>> poly_r = PiecewisePolynomialPauliRotations(num_state_qubits=qubits,
|
60
|
+
...breakpoints=breakpoints, coeffs=coeffs)
|
61
|
+
>>>
|
62
|
+
>>> qc = QuantumCircuit(poly_r.num_qubits)
|
63
|
+
>>> qc.h(list(range(qubits)));
|
64
|
+
>>> qc.append(poly_r.to_instruction(), list(range(qc.num_qubits)));
|
65
|
+
>>> qc.draw()
|
66
|
+
┌───┐┌──────────┐
|
67
|
+
q_0: ┤ H ├┤0 ├
|
68
|
+
├───┤│ │
|
69
|
+
q_1: ┤ H ├┤1 ├
|
70
|
+
└───┘│ │
|
71
|
+
q_2: ─────┤2 ├
|
72
|
+
│ pw_poly │
|
73
|
+
q_3: ─────┤3 ├
|
74
|
+
│ │
|
75
|
+
q_4: ─────┤4 ├
|
76
|
+
│ │
|
77
|
+
q_5: ─────┤5 ├
|
78
|
+
└──────────┘
|
79
|
+
|
80
|
+
References:
|
81
|
+
[1]: Haener, T., Roetteler, M., & Svore, K. M. (2018).
|
82
|
+
Optimizing Quantum Circuits for Arithmetic.
|
83
|
+
`arXiv:1805.12445 <http://arxiv.org/abs/1805.12445>`_
|
84
|
+
|
85
|
+
[2]: Carrera Vazquez, A., Hiptmair, R., & Woerner, S. (2022).
|
86
|
+
Enhancing the Quantum Linear Systems Algorithm using Richardson Extrapolation.
|
87
|
+
`ACM Transactions on Quantum Computing 3, 1, Article 2 <https://doi.org/10.1145/3490631>`_
|
88
|
+
"""
|
89
|
+
|
90
|
+
def __init__(
|
91
|
+
self,
|
92
|
+
num_state_qubits: Optional[int] = None,
|
93
|
+
breakpoints: Optional[List[int]] = None,
|
94
|
+
coeffs: Optional[List[List[float]]] = None,
|
95
|
+
basis: str = "Y",
|
96
|
+
name: str = "pw_poly",
|
97
|
+
) -> None:
|
98
|
+
"""
|
99
|
+
Args:
|
100
|
+
num_state_qubits: The number of qubits representing the state.
|
101
|
+
breakpoints: The breakpoints to define the piecewise-linear function.
|
102
|
+
Defaults to ``[0]``.
|
103
|
+
coeffs: The coefficients of the polynomials for different segments of the
|
104
|
+
piecewise-linear function. ``coeffs[j][i]`` is the coefficient of the i-th power of x
|
105
|
+
for the j-th polynomial.
|
106
|
+
Defaults to linear: ``[[1]]``.
|
107
|
+
basis: The type of Pauli rotation (``'X'``, ``'Y'``, ``'Z'``).
|
108
|
+
name: The name of the circuit.
|
109
|
+
"""
|
110
|
+
# store parameters
|
111
|
+
self._breakpoints = breakpoints if breakpoints is not None else [0]
|
112
|
+
self._coeffs = coeffs if coeffs is not None else [[1]]
|
113
|
+
|
114
|
+
# store a list of coefficients as homogeneous polynomials adding 0's where necessary
|
115
|
+
self._hom_coeffs = []
|
116
|
+
self._degree = len(max(self._coeffs, key=len)) - 1
|
117
|
+
for poly in self._coeffs:
|
118
|
+
self._hom_coeffs.append(poly + [0] * (self._degree + 1 - len(poly)))
|
119
|
+
|
120
|
+
super().__init__(num_state_qubits=num_state_qubits, basis=basis, name=name)
|
121
|
+
|
122
|
+
@property
|
123
|
+
def breakpoints(self) -> List[int]:
|
124
|
+
"""The breakpoints of the piecewise polynomial function.
|
125
|
+
|
126
|
+
The function is polynomial in the intervals ``[point_i, point_{i+1}]`` where the last
|
127
|
+
point implicitly is ``2**(num_state_qubits + 1)``.
|
128
|
+
|
129
|
+
Returns:
|
130
|
+
The list of breakpoints.
|
131
|
+
"""
|
132
|
+
if (
|
133
|
+
self.num_state_qubits is not None
|
134
|
+
and len(self._breakpoints) == len(self.coeffs)
|
135
|
+
and self._breakpoints[-1] < 2**self.num_state_qubits
|
136
|
+
):
|
137
|
+
return self._breakpoints + [2**self.num_state_qubits]
|
138
|
+
|
139
|
+
return self._breakpoints
|
140
|
+
|
141
|
+
@breakpoints.setter
|
142
|
+
def breakpoints(self, breakpoints: List[int]) -> None:
|
143
|
+
"""Set the breakpoints.
|
144
|
+
|
145
|
+
Args:
|
146
|
+
breakpoints: The new breakpoints.
|
147
|
+
"""
|
148
|
+
self._invalidate()
|
149
|
+
self._breakpoints = breakpoints
|
150
|
+
|
151
|
+
if self.num_state_qubits and breakpoints:
|
152
|
+
self._reset_registers(self.num_state_qubits)
|
153
|
+
|
154
|
+
@property
|
155
|
+
def coeffs(self) -> List[List[float]]:
|
156
|
+
"""The coefficients of the polynomials.
|
157
|
+
|
158
|
+
Returns:
|
159
|
+
The polynomial coefficients per interval as nested lists.
|
160
|
+
"""
|
161
|
+
return self._coeffs
|
162
|
+
|
163
|
+
@coeffs.setter
|
164
|
+
def coeffs(self, coeffs: List[List[float]]) -> None:
|
165
|
+
"""Set the polynomials.
|
166
|
+
|
167
|
+
Args:
|
168
|
+
coeffs: The new polynomials.
|
169
|
+
"""
|
170
|
+
self._invalidate()
|
171
|
+
self._coeffs = coeffs
|
172
|
+
|
173
|
+
# update the homogeneous polynomials and degree
|
174
|
+
self._hom_coeffs = []
|
175
|
+
self._degree = len(max(self._coeffs, key=len)) - 1
|
176
|
+
for poly in self._coeffs:
|
177
|
+
self._hom_coeffs.append(poly + [0] * (self._degree + 1 - len(poly)))
|
178
|
+
|
179
|
+
if self.num_state_qubits and coeffs:
|
180
|
+
self._reset_registers(self.num_state_qubits)
|
181
|
+
|
182
|
+
@property
|
183
|
+
def mapped_coeffs(self) -> List[List[float]]:
|
184
|
+
"""The coefficients mapped to the internal representation, since we only compare
|
185
|
+
x>=breakpoint.
|
186
|
+
|
187
|
+
Returns:
|
188
|
+
The mapped coefficients.
|
189
|
+
"""
|
190
|
+
mapped_coeffs = []
|
191
|
+
|
192
|
+
# First polynomial
|
193
|
+
mapped_coeffs.append(self._hom_coeffs[0])
|
194
|
+
for i in range(1, len(self._hom_coeffs)):
|
195
|
+
mapped_coeffs.append([])
|
196
|
+
for j in range(0, self._degree + 1):
|
197
|
+
mapped_coeffs[i].append(self._hom_coeffs[i][j] - self._hom_coeffs[i - 1][j])
|
198
|
+
|
199
|
+
return mapped_coeffs
|
200
|
+
|
201
|
+
@property
|
202
|
+
def contains_zero_breakpoint(self) -> bool | np.bool_:
|
203
|
+
"""Whether 0 is the first breakpoint.
|
204
|
+
|
205
|
+
Returns:
|
206
|
+
True, if 0 is the first breakpoint, otherwise False.
|
207
|
+
"""
|
208
|
+
return np.isclose(0, self.breakpoints[0])
|
209
|
+
|
210
|
+
def evaluate(self, x: float) -> float:
|
211
|
+
"""Classically evaluate the piecewise polynomial rotation.
|
212
|
+
|
213
|
+
Args:
|
214
|
+
x: Value to be evaluated at.
|
215
|
+
|
216
|
+
Returns:
|
217
|
+
Value of piecewise polynomial function at x.
|
218
|
+
"""
|
219
|
+
|
220
|
+
y = 0
|
221
|
+
for i, breakpt in enumerate(self.breakpoints):
|
222
|
+
y = y + (x >= breakpt) * (np.poly1d(self.mapped_coeffs[i][::-1])(x))
|
223
|
+
|
224
|
+
return y
|
225
|
+
|
226
|
+
def _check_configuration(self, raise_on_failure: bool = True) -> bool:
|
227
|
+
"""Check if the current configuration is valid."""
|
228
|
+
valid = True
|
229
|
+
|
230
|
+
if self.num_state_qubits is None:
|
231
|
+
valid = False
|
232
|
+
if raise_on_failure:
|
233
|
+
raise AttributeError("The number of qubits has not been set.")
|
234
|
+
|
235
|
+
if self.num_qubits < self.num_state_qubits + 1:
|
236
|
+
valid = False
|
237
|
+
if raise_on_failure:
|
238
|
+
raise CircuitError(
|
239
|
+
"Not enough qubits in the circuit, need at least "
|
240
|
+
f"{self.num_state_qubits + 1}."
|
241
|
+
)
|
242
|
+
|
243
|
+
if len(self.breakpoints) != len(self.coeffs) + 1:
|
244
|
+
valid = False
|
245
|
+
if raise_on_failure:
|
246
|
+
raise ValueError("Mismatching number of breakpoints and polynomials.")
|
247
|
+
|
248
|
+
return valid
|
249
|
+
|
250
|
+
def _reset_registers(self, num_state_qubits: Optional[int]) -> None:
|
251
|
+
"""Reset the registers."""
|
252
|
+
self.qregs = []
|
253
|
+
|
254
|
+
if num_state_qubits:
|
255
|
+
qr_state = QuantumRegister(num_state_qubits)
|
256
|
+
qr_target = QuantumRegister(1)
|
257
|
+
self.qregs = [qr_state, qr_target]
|
258
|
+
|
259
|
+
# Calculate number of ancilla qubits required
|
260
|
+
num_ancillas = num_state_qubits + 1
|
261
|
+
if self.contains_zero_breakpoint:
|
262
|
+
num_ancillas -= 1
|
263
|
+
if num_ancillas > 0:
|
264
|
+
qr_ancilla = AncillaRegister(num_ancillas)
|
265
|
+
self.add_register(qr_ancilla)
|
266
|
+
|
267
|
+
def _build(self):
|
268
|
+
"""If not already built, build the circuit."""
|
269
|
+
if self._is_built:
|
270
|
+
return
|
271
|
+
|
272
|
+
super()._build()
|
273
|
+
|
274
|
+
circuit = QuantumCircuit(*self.qregs, name=self.name)
|
275
|
+
qr_state = circuit.qubits[: self.num_state_qubits]
|
276
|
+
qr_target = [circuit.qubits[self.num_state_qubits]]
|
277
|
+
# Ancilla for the comparator circuit
|
278
|
+
qr_ancilla = circuit.qubits[self.num_state_qubits + 1 :]
|
279
|
+
|
280
|
+
# apply comparators and controlled linear rotations
|
281
|
+
for i, point in enumerate(self.breakpoints[:-1]):
|
282
|
+
if i == 0 and self.contains_zero_breakpoint:
|
283
|
+
# apply rotation
|
284
|
+
poly_r = PolynomialPauliRotations(
|
285
|
+
num_state_qubits=self.num_state_qubits,
|
286
|
+
coeffs=self.mapped_coeffs[i],
|
287
|
+
basis=self.basis,
|
288
|
+
)
|
289
|
+
circuit.append(poly_r.to_gate(), qr_state[:] + qr_target)
|
290
|
+
|
291
|
+
else:
|
292
|
+
# apply Comparator
|
293
|
+
comp = IntegerComparator(num_state_qubits=self.num_state_qubits, value=point)
|
294
|
+
qr_state_full = qr_state[:] + [qr_ancilla[0]] # add compare qubit
|
295
|
+
qr_remaining_ancilla = qr_ancilla[1:] # take remaining ancillas
|
296
|
+
|
297
|
+
circuit.append(
|
298
|
+
comp.to_gate(), qr_state_full[:] + qr_remaining_ancilla[: comp.num_ancillas]
|
299
|
+
)
|
300
|
+
|
301
|
+
# apply controlled rotation
|
302
|
+
poly_r = PolynomialPauliRotations(
|
303
|
+
num_state_qubits=self.num_state_qubits,
|
304
|
+
coeffs=self.mapped_coeffs[i],
|
305
|
+
basis=self.basis,
|
306
|
+
)
|
307
|
+
circuit.append(
|
308
|
+
poly_r.to_gate().control(), [qr_ancilla[0]] + qr_state[:] + qr_target
|
309
|
+
)
|
310
|
+
|
311
|
+
# uncompute comparator
|
312
|
+
circuit.append(
|
313
|
+
comp.to_gate().inverse(),
|
314
|
+
qr_state_full[:] + qr_remaining_ancilla[: comp.num_ancillas],
|
315
|
+
)
|
316
|
+
|
317
|
+
self.append(circuit.to_gate(), self.qubits)
|
@@ -0,0 +1,335 @@
|
|
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
|
+
"""Polynomially controlled Pauli-rotations."""
|
15
|
+
|
16
|
+
from __future__ import annotations
|
17
|
+
|
18
|
+
from itertools import product
|
19
|
+
|
20
|
+
from qiskit.circuit import QuantumRegister, QuantumCircuit
|
21
|
+
from qiskit.circuit.exceptions import CircuitError
|
22
|
+
|
23
|
+
from .functional_pauli_rotations import FunctionalPauliRotations
|
24
|
+
|
25
|
+
|
26
|
+
def _binomial_coefficients(n):
|
27
|
+
"""Return a dictionary of binomial coefficients
|
28
|
+
|
29
|
+
Based-on/forked from sympy's binomial_coefficients() function [#]
|
30
|
+
|
31
|
+
.. [#] https://github.com/sympy/sympy/blob/sympy-1.5.1/sympy/ntheory/multinomial.py
|
32
|
+
"""
|
33
|
+
|
34
|
+
data = {(0, n): 1, (n, 0): 1}
|
35
|
+
temp = 1
|
36
|
+
for k in range(1, n // 2 + 1):
|
37
|
+
temp = (temp * (n - k + 1)) // k
|
38
|
+
data[k, n - k] = data[n - k, k] = temp
|
39
|
+
return data
|
40
|
+
|
41
|
+
|
42
|
+
def _large_coefficients_iter(m, n):
|
43
|
+
"""Return an iterator of multinomial coefficients
|
44
|
+
|
45
|
+
Based-on/forked from sympy's multinomial_coefficients_iterator() function [#]
|
46
|
+
|
47
|
+
.. [#] https://github.com/sympy/sympy/blob/sympy-1.5.1/sympy/ntheory/multinomial.py
|
48
|
+
"""
|
49
|
+
if m < 2 * n or n == 1:
|
50
|
+
coefficients = _multinomial_coefficients(m, n)
|
51
|
+
for key, value in coefficients.items():
|
52
|
+
yield (key, value)
|
53
|
+
else:
|
54
|
+
coefficients = _multinomial_coefficients(n, n)
|
55
|
+
coefficients_dict = {}
|
56
|
+
for key, value in coefficients.items():
|
57
|
+
coefficients_dict[tuple(filter(None, key))] = value
|
58
|
+
coefficients = coefficients_dict
|
59
|
+
|
60
|
+
temp = [n] + [0] * (m - 1)
|
61
|
+
temp_a = tuple(temp)
|
62
|
+
b = tuple(filter(None, temp_a))
|
63
|
+
yield (temp_a, coefficients[b])
|
64
|
+
if n:
|
65
|
+
j = 0 # j will be the leftmost nonzero position
|
66
|
+
else:
|
67
|
+
j = m
|
68
|
+
# enumerate tuples in co-lex order
|
69
|
+
while j < m - 1:
|
70
|
+
# compute next tuple
|
71
|
+
temp_j = temp[j]
|
72
|
+
if j:
|
73
|
+
temp[j] = 0
|
74
|
+
temp[0] = temp_j
|
75
|
+
if temp_j > 1:
|
76
|
+
temp[j + 1] += 1
|
77
|
+
j = 0
|
78
|
+
else:
|
79
|
+
j += 1
|
80
|
+
temp[j] += 1
|
81
|
+
|
82
|
+
temp[0] -= 1
|
83
|
+
temp_a = tuple(temp)
|
84
|
+
b = tuple(filter(None, temp_a))
|
85
|
+
yield (temp_a, coefficients[b])
|
86
|
+
|
87
|
+
|
88
|
+
def _multinomial_coefficients(m, n):
|
89
|
+
"""Return an iterator of multinomial coefficients
|
90
|
+
|
91
|
+
Based-on/forked from sympy's multinomial_coefficients() function [#]
|
92
|
+
|
93
|
+
.. [#] https://github.com/sympy/sympy/blob/sympy-1.5.1/sympy/ntheory/multinomial.py
|
94
|
+
"""
|
95
|
+
if not m:
|
96
|
+
if n:
|
97
|
+
return {}
|
98
|
+
return {(): 1}
|
99
|
+
if m == 2:
|
100
|
+
return _binomial_coefficients(n)
|
101
|
+
if m >= 2 * n and n > 1:
|
102
|
+
return dict(_large_coefficients_iter(m, n))
|
103
|
+
if n:
|
104
|
+
j = 0
|
105
|
+
else:
|
106
|
+
j = m
|
107
|
+
temp = [n] + [0] * (m - 1)
|
108
|
+
res = {tuple(temp): 1}
|
109
|
+
while j < m - 1:
|
110
|
+
temp_j = temp[j]
|
111
|
+
if j:
|
112
|
+
temp[j] = 0
|
113
|
+
temp[0] = temp_j
|
114
|
+
if temp_j > 1:
|
115
|
+
temp[j + 1] += 1
|
116
|
+
j = 0
|
117
|
+
start = 1
|
118
|
+
v = 0
|
119
|
+
else:
|
120
|
+
j += 1
|
121
|
+
start = j + 1
|
122
|
+
v = res[tuple(temp)]
|
123
|
+
temp[j] += 1
|
124
|
+
for k in range(start, m):
|
125
|
+
if temp[k]:
|
126
|
+
temp[k] -= 1
|
127
|
+
v += res[tuple(temp)]
|
128
|
+
temp[k] += 1
|
129
|
+
temp[0] -= 1
|
130
|
+
res[tuple(temp)] = (v * temp_j) // (n - temp[0])
|
131
|
+
return res
|
132
|
+
|
133
|
+
|
134
|
+
class PolynomialPauliRotations(FunctionalPauliRotations):
|
135
|
+
r"""A circuit implementing polynomial Pauli rotations.
|
136
|
+
|
137
|
+
For a polynomial :math:`p(x)`, a basis state :math:`|i\rangle` and a target qubit
|
138
|
+
:math:`|0\rangle` this operator acts as:
|
139
|
+
|
140
|
+
.. math::
|
141
|
+
|
142
|
+
|i\rangle |0\rangle \mapsto \cos\left(\frac{p(i)}{2}\right) |i\rangle |0\rangle
|
143
|
+
+ \sin\left(\frac{p(i)}{2}\right) |i\rangle |1\rangle
|
144
|
+
|
145
|
+
Let n be the number of qubits representing the state, d the degree of p(x) and q_i the qubits,
|
146
|
+
where q_0 is the least significant qubit. Then for
|
147
|
+
|
148
|
+
.. math::
|
149
|
+
|
150
|
+
x = \sum_{i=0}^{n-1} 2^i q_i,
|
151
|
+
|
152
|
+
we can write
|
153
|
+
|
154
|
+
.. math::
|
155
|
+
|
156
|
+
p(x) = \sum_{j=0}^{j=d} c_j x^j
|
157
|
+
|
158
|
+
where :math:`c` are the input coefficients, ``coeffs``.
|
159
|
+
"""
|
160
|
+
|
161
|
+
def __init__(
|
162
|
+
self,
|
163
|
+
num_state_qubits: int | None = None,
|
164
|
+
coeffs: list[float] | None = None,
|
165
|
+
basis: str = "Y",
|
166
|
+
name: str = "poly",
|
167
|
+
) -> None:
|
168
|
+
"""Prepare an approximation to a state with amplitudes specified by a polynomial.
|
169
|
+
|
170
|
+
Args:
|
171
|
+
num_state_qubits: The number of qubits representing the state.
|
172
|
+
coeffs: The coefficients of the polynomial. ``coeffs[i]`` is the coefficient of the
|
173
|
+
i-th power of x. Defaults to linear: [0, 1].
|
174
|
+
basis: The type of Pauli rotation ('X', 'Y', 'Z').
|
175
|
+
name: The name of the circuit.
|
176
|
+
"""
|
177
|
+
# set default internal parameters
|
178
|
+
self._coeffs = coeffs or [0, 1]
|
179
|
+
|
180
|
+
# initialize super (after setting coeffs)
|
181
|
+
super().__init__(num_state_qubits=num_state_qubits, basis=basis, name=name)
|
182
|
+
|
183
|
+
@property
|
184
|
+
def coeffs(self) -> list[float]:
|
185
|
+
"""The coefficients of the polynomial.
|
186
|
+
|
187
|
+
``coeffs[i]`` is the coefficient of the i-th power of the function input :math:`x`,
|
188
|
+
that means that the rotation angles are based on the coefficients value,
|
189
|
+
following the formula
|
190
|
+
|
191
|
+
.. math::
|
192
|
+
|
193
|
+
c_j x^j , j=0, ..., d
|
194
|
+
|
195
|
+
where :math:`d` is the degree of the polynomial :math:`p(x)` and :math:`c` are the coefficients
|
196
|
+
``coeffs``.
|
197
|
+
|
198
|
+
Returns:
|
199
|
+
The coefficients of the polynomial.
|
200
|
+
"""
|
201
|
+
return self._coeffs
|
202
|
+
|
203
|
+
@coeffs.setter
|
204
|
+
def coeffs(self, coeffs: list[float]) -> None:
|
205
|
+
"""Set the coefficients of the polynomial.
|
206
|
+
|
207
|
+
``coeffs[i]`` is the coefficient of the i-th power of x.
|
208
|
+
|
209
|
+
Args:
|
210
|
+
The coefficients of the polynomial.
|
211
|
+
"""
|
212
|
+
self._invalidate()
|
213
|
+
self._coeffs = coeffs
|
214
|
+
|
215
|
+
@property
|
216
|
+
def degree(self) -> int:
|
217
|
+
"""Return the degree of the polynomial, equals to the number of coefficients minus 1.
|
218
|
+
|
219
|
+
Returns:
|
220
|
+
The degree of the polynomial. If the coefficients have not been set, return 0.
|
221
|
+
"""
|
222
|
+
if self.coeffs:
|
223
|
+
return len(self.coeffs) - 1
|
224
|
+
return 0
|
225
|
+
|
226
|
+
def _reset_registers(self, num_state_qubits):
|
227
|
+
"""Reset the registers."""
|
228
|
+
if num_state_qubits is not None:
|
229
|
+
# set new register of appropriate size
|
230
|
+
qr_state = QuantumRegister(num_state_qubits, name="state")
|
231
|
+
qr_target = QuantumRegister(1, name="target")
|
232
|
+
|
233
|
+
self.qregs = [qr_state, qr_target]
|
234
|
+
else:
|
235
|
+
self.qregs = []
|
236
|
+
|
237
|
+
def _check_configuration(self, raise_on_failure: bool = True) -> bool:
|
238
|
+
"""Check if the current configuration is valid."""
|
239
|
+
valid = True
|
240
|
+
|
241
|
+
if self.num_state_qubits is None:
|
242
|
+
valid = False
|
243
|
+
if raise_on_failure:
|
244
|
+
raise AttributeError("The number of qubits has not been set.")
|
245
|
+
|
246
|
+
if self.num_qubits < self.num_state_qubits + 1:
|
247
|
+
valid = False
|
248
|
+
if raise_on_failure:
|
249
|
+
raise CircuitError(
|
250
|
+
"Not enough qubits in the circuit, need at least "
|
251
|
+
f"{self.num_state_qubits + 1}."
|
252
|
+
)
|
253
|
+
|
254
|
+
return valid
|
255
|
+
|
256
|
+
def _get_rotation_coefficients(self) -> dict[tuple[int, ...], float]:
|
257
|
+
"""Compute the coefficient of each monomial.
|
258
|
+
|
259
|
+
Returns:
|
260
|
+
A dictionary with pairs ``{control_state: rotation angle}`` where ``control_state``
|
261
|
+
is a tuple of ``0`` or ``1`` bits.
|
262
|
+
"""
|
263
|
+
# determine the control states
|
264
|
+
all_combinations = list(product([0, 1], repeat=self.num_state_qubits))
|
265
|
+
valid_combinations = []
|
266
|
+
for combination in all_combinations:
|
267
|
+
if 0 < sum(combination) <= self.degree:
|
268
|
+
valid_combinations += [combination]
|
269
|
+
|
270
|
+
rotation_coeffs = {control_state: 0.0 for control_state in valid_combinations}
|
271
|
+
|
272
|
+
# compute the coefficients for the control states
|
273
|
+
for i, coeff in enumerate(self.coeffs[1:]):
|
274
|
+
i += 1 # since we skip the first element we need to increase i by one
|
275
|
+
|
276
|
+
# iterate over the multinomial coefficients
|
277
|
+
for comb, num_combs in _multinomial_coefficients(self.num_state_qubits, i).items():
|
278
|
+
control_state: tuple[int, ...] = ()
|
279
|
+
power = 1
|
280
|
+
for j, qubit in enumerate(comb):
|
281
|
+
if qubit > 0: # means we control on qubit i
|
282
|
+
control_state += (1,)
|
283
|
+
power *= 2 ** (j * qubit)
|
284
|
+
else:
|
285
|
+
control_state += (0,)
|
286
|
+
|
287
|
+
# Add angle
|
288
|
+
rotation_coeffs[control_state] += coeff * num_combs * power
|
289
|
+
|
290
|
+
return rotation_coeffs
|
291
|
+
|
292
|
+
def _build(self):
|
293
|
+
"""If not already built, build the circuit."""
|
294
|
+
if self._is_built:
|
295
|
+
return
|
296
|
+
|
297
|
+
super()._build()
|
298
|
+
|
299
|
+
circuit = QuantumCircuit(*self.qregs, name=self.name)
|
300
|
+
qr_state = circuit.qubits[: self.num_state_qubits]
|
301
|
+
qr_target = circuit.qubits[self.num_state_qubits]
|
302
|
+
|
303
|
+
rotation_coeffs = self._get_rotation_coefficients()
|
304
|
+
|
305
|
+
if self.basis == "x":
|
306
|
+
circuit.rx(self.coeffs[0], qr_target)
|
307
|
+
elif self.basis == "y":
|
308
|
+
circuit.ry(self.coeffs[0], qr_target)
|
309
|
+
else:
|
310
|
+
circuit.rz(self.coeffs[0], qr_target)
|
311
|
+
|
312
|
+
for c in rotation_coeffs:
|
313
|
+
qr_control = []
|
314
|
+
for i, _ in enumerate(c):
|
315
|
+
if c[i] > 0:
|
316
|
+
qr_control.append(qr_state[i])
|
317
|
+
|
318
|
+
# apply controlled rotations
|
319
|
+
if len(qr_control) > 1:
|
320
|
+
if self.basis == "x":
|
321
|
+
circuit.mcrx(rotation_coeffs[c], qr_control, qr_target)
|
322
|
+
elif self.basis == "y":
|
323
|
+
circuit.mcry(rotation_coeffs[c], qr_control, qr_target)
|
324
|
+
else:
|
325
|
+
circuit.mcrz(rotation_coeffs[c], qr_control, qr_target)
|
326
|
+
|
327
|
+
elif len(qr_control) == 1:
|
328
|
+
if self.basis == "x":
|
329
|
+
circuit.crx(rotation_coeffs[c], qr_control[0], qr_target)
|
330
|
+
elif self.basis == "y":
|
331
|
+
circuit.cry(rotation_coeffs[c], qr_control[0], qr_target)
|
332
|
+
else:
|
333
|
+
circuit.crz(rotation_coeffs[c], qr_control[0], qr_target)
|
334
|
+
|
335
|
+
self.append(circuit.to_gate(), self.qubits)
|