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,353 @@
|
|
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 polynomial Chebyshev approximation to a given f(x)."""
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
from typing import Callable
|
17
|
+
import numpy as np
|
18
|
+
from numpy.polynomial.chebyshev import Chebyshev
|
19
|
+
|
20
|
+
from qiskit.circuit import QuantumRegister, AncillaRegister
|
21
|
+
from qiskit.circuit.library.blueprintcircuit import BlueprintCircuit
|
22
|
+
from qiskit.circuit.exceptions import CircuitError
|
23
|
+
|
24
|
+
from .piecewise_polynomial_pauli_rotations import PiecewisePolynomialPauliRotations
|
25
|
+
|
26
|
+
|
27
|
+
class PiecewiseChebyshev(BlueprintCircuit):
|
28
|
+
r"""Piecewise Chebyshev approximation to an input function.
|
29
|
+
|
30
|
+
For a given function :math:`f(x)` and degree :math:`d`, this class implements a piecewise
|
31
|
+
polynomial Chebyshev approximation on :math:`n` qubits to :math:`f(x)` on the given intervals.
|
32
|
+
All the polynomials in the approximation are of degree :math:`d`.
|
33
|
+
|
34
|
+
The values of the parameters are calculated according to [1] and see [2] for a more
|
35
|
+
detailed explanation of the circuit construction and how it acts on the qubits.
|
36
|
+
|
37
|
+
Examples:
|
38
|
+
|
39
|
+
.. plot::
|
40
|
+
:include-source:
|
41
|
+
|
42
|
+
import numpy as np
|
43
|
+
from qiskit import QuantumCircuit
|
44
|
+
from qiskit.circuit.library.arithmetic.piecewise_chebyshev import PiecewiseChebyshev
|
45
|
+
f_x, degree, breakpoints, num_state_qubits = lambda x: np.arcsin(1 / x), 2, [2, 4], 2
|
46
|
+
pw_approximation = PiecewiseChebyshev(f_x, degree, breakpoints, num_state_qubits)
|
47
|
+
pw_approximation._build()
|
48
|
+
qc = QuantumCircuit(pw_approximation.num_qubits)
|
49
|
+
qc.h(list(range(num_state_qubits)))
|
50
|
+
qc.append(pw_approximation.to_instruction(), qc.qubits)
|
51
|
+
qc.draw(output='mpl')
|
52
|
+
|
53
|
+
References:
|
54
|
+
|
55
|
+
[1]: Haener, T., Roetteler, M., & Svore, K. M. (2018).
|
56
|
+
Optimizing Quantum Circuits for Arithmetic.
|
57
|
+
`arXiv:1805.12445 <http://arxiv.org/abs/1805.12445>`_
|
58
|
+
[2]: Carrera Vazquez, A., Hiptmair, H., & Woerner, S. (2022).
|
59
|
+
Enhancing the Quantum Linear Systems Algorithm Using Richardson Extrapolation.
|
60
|
+
`ACM Transactions on Quantum Computing 3, 1, Article 2 <https://doi.org/10.1145/3490631>`_
|
61
|
+
"""
|
62
|
+
|
63
|
+
def __init__(
|
64
|
+
self,
|
65
|
+
f_x: float | Callable[[int], float],
|
66
|
+
degree: int | None = None,
|
67
|
+
breakpoints: list[int] | None = None,
|
68
|
+
num_state_qubits: int | None = None,
|
69
|
+
name: str = "pw_cheb",
|
70
|
+
) -> None:
|
71
|
+
r"""
|
72
|
+
Args:
|
73
|
+
f_x: the function to be approximated. Constant functions should be specified
|
74
|
+
as f_x = constant.
|
75
|
+
degree: the degree of the polynomials.
|
76
|
+
Defaults to ``1``.
|
77
|
+
breakpoints: the breakpoints to define the piecewise-linear function.
|
78
|
+
Defaults to the full interval.
|
79
|
+
num_state_qubits: number of qubits representing the state.
|
80
|
+
name: The name of the circuit object.
|
81
|
+
"""
|
82
|
+
super().__init__(name=name)
|
83
|
+
|
84
|
+
# define internal parameters
|
85
|
+
self._num_state_qubits = None
|
86
|
+
|
87
|
+
# Store parameters
|
88
|
+
self._f_x = f_x
|
89
|
+
self._degree = degree if degree is not None else 1
|
90
|
+
self._breakpoints = breakpoints if breakpoints is not None else [0]
|
91
|
+
|
92
|
+
self._polynomials: list[list[float]] | None = None
|
93
|
+
|
94
|
+
self.num_state_qubits = num_state_qubits
|
95
|
+
|
96
|
+
def _check_configuration(self, raise_on_failure: bool = True) -> bool:
|
97
|
+
"""Check if the current configuration is valid."""
|
98
|
+
valid = True
|
99
|
+
|
100
|
+
if self._f_x is None:
|
101
|
+
valid = False
|
102
|
+
if raise_on_failure:
|
103
|
+
raise AttributeError("The function to be approximated has not been set.")
|
104
|
+
|
105
|
+
if self._degree is None:
|
106
|
+
valid = False
|
107
|
+
if raise_on_failure:
|
108
|
+
raise AttributeError("The degree of the polynomials has not been set.")
|
109
|
+
|
110
|
+
if self._breakpoints is None:
|
111
|
+
valid = False
|
112
|
+
if raise_on_failure:
|
113
|
+
raise AttributeError("The breakpoints have not been set.")
|
114
|
+
|
115
|
+
if self.num_state_qubits is None:
|
116
|
+
valid = False
|
117
|
+
if raise_on_failure:
|
118
|
+
raise AttributeError("The number of qubits has not been set.")
|
119
|
+
|
120
|
+
if self.num_qubits < self.num_state_qubits + 1:
|
121
|
+
valid = False
|
122
|
+
if raise_on_failure:
|
123
|
+
raise CircuitError(
|
124
|
+
"Not enough qubits in the circuit, need at least "
|
125
|
+
f"{self.num_state_qubits + 1}."
|
126
|
+
)
|
127
|
+
|
128
|
+
return valid
|
129
|
+
|
130
|
+
@property
|
131
|
+
def f_x(self) -> float | Callable[[int], float]:
|
132
|
+
"""The function to be approximated.
|
133
|
+
|
134
|
+
Returns:
|
135
|
+
The function to be approximated.
|
136
|
+
"""
|
137
|
+
return self._f_x
|
138
|
+
|
139
|
+
@f_x.setter
|
140
|
+
def f_x(self, f_x: float | Callable[[int], float] | None) -> None:
|
141
|
+
"""Set the function to be approximated.
|
142
|
+
|
143
|
+
Note that this may change the underlying quantum register, if the number of state qubits
|
144
|
+
changes.
|
145
|
+
|
146
|
+
Args:
|
147
|
+
f_x: The new function to be approximated.
|
148
|
+
"""
|
149
|
+
if self._f_x is None or f_x != self._f_x:
|
150
|
+
self._invalidate()
|
151
|
+
self._f_x = f_x
|
152
|
+
|
153
|
+
self._reset_registers(self.num_state_qubits)
|
154
|
+
|
155
|
+
@property
|
156
|
+
def degree(self) -> int:
|
157
|
+
"""The degree of the polynomials.
|
158
|
+
|
159
|
+
Returns:
|
160
|
+
The degree of the polynomials.
|
161
|
+
"""
|
162
|
+
return self._degree
|
163
|
+
|
164
|
+
@degree.setter
|
165
|
+
def degree(self, degree: int | None) -> None:
|
166
|
+
"""Set the error tolerance.
|
167
|
+
|
168
|
+
Note that this may change the underlying quantum register, if the number of state qubits
|
169
|
+
changes.
|
170
|
+
|
171
|
+
Args:
|
172
|
+
degree: The new degree.
|
173
|
+
"""
|
174
|
+
if self._degree is None or degree != self._degree:
|
175
|
+
self._invalidate()
|
176
|
+
self._degree = degree
|
177
|
+
|
178
|
+
self._reset_registers(self.num_state_qubits)
|
179
|
+
|
180
|
+
@property
|
181
|
+
def breakpoints(self) -> list[int]:
|
182
|
+
"""The breakpoints for the piecewise approximation.
|
183
|
+
|
184
|
+
Returns:
|
185
|
+
The breakpoints for the piecewise approximation.
|
186
|
+
"""
|
187
|
+
breakpoints = self._breakpoints
|
188
|
+
|
189
|
+
# it the state qubits are set ensure that the breakpoints match beginning and end
|
190
|
+
if self.num_state_qubits is not None:
|
191
|
+
num_states = 2**self.num_state_qubits
|
192
|
+
|
193
|
+
# If the last breakpoint is < num_states, add the identity polynomial
|
194
|
+
if breakpoints[-1] < num_states:
|
195
|
+
breakpoints = breakpoints + [num_states]
|
196
|
+
|
197
|
+
# If the first breakpoint is > 0, add the identity polynomial
|
198
|
+
if breakpoints[0] > 0:
|
199
|
+
breakpoints = [0] + breakpoints
|
200
|
+
|
201
|
+
return breakpoints
|
202
|
+
|
203
|
+
@breakpoints.setter
|
204
|
+
def breakpoints(self, breakpoints: list[int] | None) -> None:
|
205
|
+
"""Set the breakpoints for the piecewise approximation.
|
206
|
+
|
207
|
+
Note that this may change the underlying quantum register, if the number of state qubits
|
208
|
+
changes.
|
209
|
+
|
210
|
+
Args:
|
211
|
+
breakpoints: The new breakpoints for the piecewise approximation.
|
212
|
+
"""
|
213
|
+
if self._breakpoints is None or breakpoints != self._breakpoints:
|
214
|
+
self._invalidate()
|
215
|
+
self._breakpoints = breakpoints if breakpoints is not None else [0]
|
216
|
+
|
217
|
+
self._reset_registers(self.num_state_qubits)
|
218
|
+
|
219
|
+
@property
|
220
|
+
def polynomials(self) -> list[list[float]]:
|
221
|
+
"""The polynomials for the piecewise approximation.
|
222
|
+
|
223
|
+
Returns:
|
224
|
+
The polynomials for the piecewise approximation.
|
225
|
+
|
226
|
+
Raises:
|
227
|
+
TypeError: If the input function is not in the correct format.
|
228
|
+
"""
|
229
|
+
if self.num_state_qubits is None:
|
230
|
+
return [[]]
|
231
|
+
|
232
|
+
# note this must be the private attribute since we handle missing breakpoints at
|
233
|
+
# 0 and 2 ^ num_qubits here (e.g. if the function we approximate is not defined at 0
|
234
|
+
# and the user takes that into account we just add an identity)
|
235
|
+
breakpoints = self._breakpoints
|
236
|
+
# Need to take into account the case in which no breakpoints were provided in first place
|
237
|
+
if breakpoints == [0]:
|
238
|
+
breakpoints = [0, 2**self.num_state_qubits]
|
239
|
+
|
240
|
+
num_intervals = len(breakpoints)
|
241
|
+
|
242
|
+
# Calculate the polynomials
|
243
|
+
polynomials = []
|
244
|
+
for i in range(0, num_intervals - 1):
|
245
|
+
# Calculate the polynomial approximating the function on the current interval
|
246
|
+
try:
|
247
|
+
# If the function is constant don't call Chebyshev (not necessary and gives errors)
|
248
|
+
if isinstance(self.f_x, (float, int)):
|
249
|
+
# Append directly to list of polynomials
|
250
|
+
polynomials.append([self.f_x])
|
251
|
+
else:
|
252
|
+
poly = Chebyshev.interpolate(
|
253
|
+
self.f_x, self.degree, domain=[breakpoints[i], breakpoints[i + 1]]
|
254
|
+
)
|
255
|
+
# Convert polynomial to the standard basis and rescale it for the rotation gates
|
256
|
+
poly = 2 * poly.convert(kind=np.polynomial.Polynomial).coef
|
257
|
+
# Convert to list and append
|
258
|
+
polynomials.append(poly.tolist())
|
259
|
+
except ValueError as err:
|
260
|
+
raise TypeError(
|
261
|
+
" <lambda>() missing 1 required positional argument: '"
|
262
|
+
+ self.f_x.__code__.co_varnames[0]
|
263
|
+
+ "'."
|
264
|
+
+ " Constant functions should be specified as 'f_x = constant'."
|
265
|
+
) from err
|
266
|
+
|
267
|
+
# If the last breakpoint is < 2 ** num_qubits, add the identity polynomial
|
268
|
+
if breakpoints[-1] < 2**self.num_state_qubits:
|
269
|
+
polynomials = polynomials + [[2 * np.arcsin(1)]]
|
270
|
+
|
271
|
+
# If the first breakpoint is > 0, add the identity polynomial
|
272
|
+
if breakpoints[0] > 0:
|
273
|
+
polynomials = [[2 * np.arcsin(1)]] + polynomials
|
274
|
+
|
275
|
+
return polynomials
|
276
|
+
|
277
|
+
@polynomials.setter
|
278
|
+
def polynomials(self, polynomials: list[list[float]] | None) -> None:
|
279
|
+
"""Set the polynomials for the piecewise approximation.
|
280
|
+
|
281
|
+
Note that this may change the underlying quantum register, if the number of state qubits
|
282
|
+
changes.
|
283
|
+
|
284
|
+
Args:
|
285
|
+
polynomials: The new breakpoints for the piecewise approximation.
|
286
|
+
"""
|
287
|
+
if self._polynomials is None or polynomials != self._polynomials:
|
288
|
+
self._invalidate()
|
289
|
+
self._polynomials = polynomials
|
290
|
+
|
291
|
+
self._reset_registers(self.num_state_qubits)
|
292
|
+
|
293
|
+
@property
|
294
|
+
def num_state_qubits(self) -> int:
|
295
|
+
r"""The number of state qubits representing the state :math:`|x\rangle`.
|
296
|
+
|
297
|
+
Returns:
|
298
|
+
The number of state qubits.
|
299
|
+
"""
|
300
|
+
return self._num_state_qubits
|
301
|
+
|
302
|
+
@num_state_qubits.setter
|
303
|
+
def num_state_qubits(self, num_state_qubits: int | None) -> None:
|
304
|
+
"""Set the number of state qubits.
|
305
|
+
|
306
|
+
Note that this may change the underlying quantum register, if the number of state qubits
|
307
|
+
changes.
|
308
|
+
|
309
|
+
Args:
|
310
|
+
num_state_qubits: The new number of qubits.
|
311
|
+
"""
|
312
|
+
if self._num_state_qubits is None or num_state_qubits != self._num_state_qubits:
|
313
|
+
self._invalidate()
|
314
|
+
self._num_state_qubits = num_state_qubits
|
315
|
+
|
316
|
+
# Set breakpoints if they haven't been set
|
317
|
+
if num_state_qubits is not None and self._breakpoints is None:
|
318
|
+
self.breakpoints = [0, 2**num_state_qubits]
|
319
|
+
|
320
|
+
self._reset_registers(num_state_qubits)
|
321
|
+
|
322
|
+
def _reset_registers(self, num_state_qubits: int | None) -> None:
|
323
|
+
"""Reset the registers."""
|
324
|
+
self.qregs = []
|
325
|
+
|
326
|
+
if num_state_qubits is not None:
|
327
|
+
qr_state = QuantumRegister(num_state_qubits, "state")
|
328
|
+
qr_target = QuantumRegister(1, "target")
|
329
|
+
self.qregs = [qr_state, qr_target]
|
330
|
+
|
331
|
+
num_ancillas = num_state_qubits
|
332
|
+
if num_ancillas > 0:
|
333
|
+
qr_ancilla = AncillaRegister(num_ancillas)
|
334
|
+
self.add_register(qr_ancilla)
|
335
|
+
|
336
|
+
def _build(self):
|
337
|
+
"""Build the circuit if not already build. The operation is considered successful
|
338
|
+
when q_objective is :math:`|1>`"""
|
339
|
+
if self._is_built:
|
340
|
+
return
|
341
|
+
|
342
|
+
super()._build()
|
343
|
+
|
344
|
+
poly_r = PiecewisePolynomialPauliRotations(
|
345
|
+
self.num_state_qubits, self.breakpoints, self.polynomials, name=self.name
|
346
|
+
)
|
347
|
+
|
348
|
+
# qr_state = self.qubits[: self.num_state_qubits]
|
349
|
+
# qr_target = [self.qubits[self.num_state_qubits]]
|
350
|
+
# qr_ancillas = self.qubits[self.num_state_qubits + 1 :]
|
351
|
+
|
352
|
+
# Apply polynomial approximation
|
353
|
+
self.append(poly_r.to_gate(), self.qubits)
|
@@ -0,0 +1,277 @@
|
|
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
|
+
"""Piecewise-linearly-controlled rotation."""
|
15
|
+
|
16
|
+
from __future__ import annotations
|
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 .linear_pauli_rotations import LinearPauliRotations
|
24
|
+
from .integer_comparator import IntegerComparator
|
25
|
+
|
26
|
+
|
27
|
+
class PiecewiseLinearPauliRotations(FunctionalPauliRotations):
|
28
|
+
r"""Piecewise-linearly-controlled Pauli rotations.
|
29
|
+
|
30
|
+
For a piecewise linear (not necessarily continuous) function :math:`f(x)`, which is defined
|
31
|
+
through breakpoints, slopes and offsets as follows.
|
32
|
+
Suppose the breakpoints :math:`(x_0, ..., x_J)` are a subset of :math:`[0, 2^n-1]`, where
|
33
|
+
:math:`n` is the number of state qubits. Further on, denote the corresponding slopes and
|
34
|
+
offsets by :math:`a_j` and :math:`b_j` respectively.
|
35
|
+
Then f(x) is defined as:
|
36
|
+
|
37
|
+
.. math::
|
38
|
+
|
39
|
+
f(x) = \begin{cases}
|
40
|
+
0, x < x_0 \\
|
41
|
+
a_j (x - x_j) + b_j, x_j \leq x < x_{j+1}
|
42
|
+
\end{cases}
|
43
|
+
|
44
|
+
where we implicitly assume :math:`x_{J+1} = 2^n`.
|
45
|
+
"""
|
46
|
+
|
47
|
+
def __init__(
|
48
|
+
self,
|
49
|
+
num_state_qubits: int | None = None,
|
50
|
+
breakpoints: list[int] | None = None,
|
51
|
+
slopes: list[float] | np.ndarray | None = None,
|
52
|
+
offsets: list[float] | np.ndarray | None = None,
|
53
|
+
basis: str = "Y",
|
54
|
+
name: str = "pw_lin",
|
55
|
+
) -> None:
|
56
|
+
"""Construct piecewise-linearly-controlled Pauli rotations.
|
57
|
+
|
58
|
+
Args:
|
59
|
+
num_state_qubits: The number of qubits representing the state.
|
60
|
+
breakpoints: The breakpoints to define the piecewise-linear function.
|
61
|
+
Defaults to ``[0]``.
|
62
|
+
slopes: The slopes for different segments of the piecewise-linear function.
|
63
|
+
Defaults to ``[1]``.
|
64
|
+
offsets: The offsets for different segments of the piecewise-linear function.
|
65
|
+
Defaults to ``[0]``.
|
66
|
+
basis: The type of Pauli rotation (``'X'``, ``'Y'``, ``'Z'``).
|
67
|
+
name: The name of the circuit.
|
68
|
+
"""
|
69
|
+
# store parameters
|
70
|
+
self._breakpoints = breakpoints if breakpoints is not None else [0]
|
71
|
+
self._slopes = slopes if slopes is not None else [1]
|
72
|
+
self._offsets = offsets if offsets is not None else [0]
|
73
|
+
|
74
|
+
super().__init__(num_state_qubits=num_state_qubits, basis=basis, name=name)
|
75
|
+
|
76
|
+
@property
|
77
|
+
def breakpoints(self) -> list[int]:
|
78
|
+
"""The breakpoints of the piecewise linear function.
|
79
|
+
|
80
|
+
The function is linear in the intervals ``[point_i, point_{i+1}]`` where the last
|
81
|
+
point implicitly is ``2**(num_state_qubits + 1)``.
|
82
|
+
"""
|
83
|
+
return self._breakpoints
|
84
|
+
|
85
|
+
@breakpoints.setter
|
86
|
+
def breakpoints(self, breakpoints: list[int]) -> None:
|
87
|
+
"""Set the breakpoints.
|
88
|
+
|
89
|
+
Args:
|
90
|
+
breakpoints: The new breakpoints.
|
91
|
+
"""
|
92
|
+
self._invalidate()
|
93
|
+
self._breakpoints = breakpoints
|
94
|
+
|
95
|
+
if self.num_state_qubits and breakpoints:
|
96
|
+
self._reset_registers(self.num_state_qubits)
|
97
|
+
|
98
|
+
@property
|
99
|
+
def slopes(self) -> list[float] | np.ndarray:
|
100
|
+
"""The breakpoints of the piecewise linear function.
|
101
|
+
|
102
|
+
The function is linear in the intervals ``[point_i, point_{i+1}]`` where the last
|
103
|
+
point implicitly is ``2**(num_state_qubits + 1)``.
|
104
|
+
"""
|
105
|
+
return self._slopes
|
106
|
+
|
107
|
+
@slopes.setter
|
108
|
+
def slopes(self, slopes: list[float]) -> None:
|
109
|
+
"""Set the slopes.
|
110
|
+
|
111
|
+
Args:
|
112
|
+
slopes: The new slopes.
|
113
|
+
"""
|
114
|
+
self._invalidate()
|
115
|
+
self._slopes = slopes
|
116
|
+
|
117
|
+
@property
|
118
|
+
def offsets(self) -> list[float] | np.ndarray:
|
119
|
+
"""The breakpoints of the piecewise linear function.
|
120
|
+
|
121
|
+
The function is linear in the intervals ``[point_i, point_{i+1}]`` where the last
|
122
|
+
point implicitly is ``2**(num_state_qubits + 1)``.
|
123
|
+
"""
|
124
|
+
return self._offsets
|
125
|
+
|
126
|
+
@offsets.setter
|
127
|
+
def offsets(self, offsets: list[float]) -> None:
|
128
|
+
"""Set the offsets.
|
129
|
+
|
130
|
+
Args:
|
131
|
+
offsets: The new offsets.
|
132
|
+
"""
|
133
|
+
self._invalidate()
|
134
|
+
self._offsets = offsets
|
135
|
+
|
136
|
+
@property
|
137
|
+
def mapped_slopes(self) -> np.ndarray:
|
138
|
+
"""The slopes mapped to the internal representation.
|
139
|
+
|
140
|
+
Returns:
|
141
|
+
The mapped slopes.
|
142
|
+
"""
|
143
|
+
mapped_slopes = np.zeros_like(self.slopes)
|
144
|
+
for i, slope in enumerate(self.slopes):
|
145
|
+
mapped_slopes[i] = slope - sum(mapped_slopes[:i])
|
146
|
+
|
147
|
+
return mapped_slopes
|
148
|
+
|
149
|
+
@property
|
150
|
+
def mapped_offsets(self) -> np.ndarray:
|
151
|
+
"""The offsets mapped to the internal representation.
|
152
|
+
|
153
|
+
Returns:
|
154
|
+
The mapped offsets.
|
155
|
+
"""
|
156
|
+
mapped_offsets = np.zeros_like(self.offsets)
|
157
|
+
for i, (offset, slope, point) in enumerate(
|
158
|
+
zip(self.offsets, self.slopes, self.breakpoints)
|
159
|
+
):
|
160
|
+
mapped_offsets[i] = offset - slope * point - sum(mapped_offsets[:i])
|
161
|
+
|
162
|
+
return mapped_offsets
|
163
|
+
|
164
|
+
@property
|
165
|
+
def contains_zero_breakpoint(self) -> bool | np.bool_:
|
166
|
+
"""Whether 0 is the first breakpoint.
|
167
|
+
|
168
|
+
Returns:
|
169
|
+
True, if 0 is the first breakpoint, otherwise False.
|
170
|
+
"""
|
171
|
+
return np.isclose(0, self.breakpoints[0])
|
172
|
+
|
173
|
+
def evaluate(self, x: float) -> float:
|
174
|
+
"""Classically evaluate the piecewise linear rotation.
|
175
|
+
|
176
|
+
Args:
|
177
|
+
x: Value to be evaluated at.
|
178
|
+
|
179
|
+
Returns:
|
180
|
+
Value of piecewise linear function at x.
|
181
|
+
"""
|
182
|
+
|
183
|
+
y = (x >= self.breakpoints[0]) * (x * self.mapped_slopes[0] + self.mapped_offsets[0])
|
184
|
+
for i in range(1, len(self.breakpoints)):
|
185
|
+
y = y + (x >= self.breakpoints[i]) * (
|
186
|
+
x * self.mapped_slopes[i] + self.mapped_offsets[i]
|
187
|
+
)
|
188
|
+
|
189
|
+
return y
|
190
|
+
|
191
|
+
def _check_configuration(self, raise_on_failure: bool = True) -> bool:
|
192
|
+
"""Check if the current configuration is valid."""
|
193
|
+
valid = True
|
194
|
+
|
195
|
+
if self.num_state_qubits is None:
|
196
|
+
valid = False
|
197
|
+
if raise_on_failure:
|
198
|
+
raise AttributeError("The number of qubits has not been set.")
|
199
|
+
|
200
|
+
if self.num_qubits < self.num_state_qubits + 1:
|
201
|
+
valid = False
|
202
|
+
if raise_on_failure:
|
203
|
+
raise CircuitError(
|
204
|
+
"Not enough qubits in the circuit, need at least "
|
205
|
+
f"{self.num_state_qubits + 1}."
|
206
|
+
)
|
207
|
+
|
208
|
+
if len(self.breakpoints) != len(self.slopes) or len(self.breakpoints) != len(self.offsets):
|
209
|
+
valid = False
|
210
|
+
if raise_on_failure:
|
211
|
+
raise ValueError("Mismatching sizes of breakpoints, slopes and offsets.")
|
212
|
+
|
213
|
+
return valid
|
214
|
+
|
215
|
+
def _reset_registers(self, num_state_qubits: int | None) -> None:
|
216
|
+
"""Reset the registers."""
|
217
|
+
self.qregs = []
|
218
|
+
|
219
|
+
if num_state_qubits is not None:
|
220
|
+
qr_state = QuantumRegister(num_state_qubits)
|
221
|
+
qr_target = QuantumRegister(1)
|
222
|
+
self.qregs = [qr_state, qr_target]
|
223
|
+
|
224
|
+
# add ancillas if required
|
225
|
+
if len(self.breakpoints) > 1:
|
226
|
+
num_ancillas = num_state_qubits
|
227
|
+
qr_ancilla = AncillaRegister(num_ancillas)
|
228
|
+
self.add_register(qr_ancilla)
|
229
|
+
|
230
|
+
def _build(self):
|
231
|
+
"""If not already built, build the circuit."""
|
232
|
+
if self._is_built:
|
233
|
+
return
|
234
|
+
|
235
|
+
super()._build()
|
236
|
+
|
237
|
+
circuit = QuantumCircuit(*self.qregs, name=self.name)
|
238
|
+
|
239
|
+
qr_state = circuit.qubits[: self.num_state_qubits]
|
240
|
+
qr_target = [circuit.qubits[self.num_state_qubits]]
|
241
|
+
qr_ancilla = circuit.ancillas
|
242
|
+
|
243
|
+
# apply comparators and controlled linear rotations
|
244
|
+
for i, point in enumerate(self.breakpoints):
|
245
|
+
if i == 0 and self.contains_zero_breakpoint:
|
246
|
+
# apply rotation
|
247
|
+
lin_r = LinearPauliRotations(
|
248
|
+
num_state_qubits=self.num_state_qubits,
|
249
|
+
slope=self.mapped_slopes[i],
|
250
|
+
offset=self.mapped_offsets[i],
|
251
|
+
basis=self.basis,
|
252
|
+
)
|
253
|
+
circuit.append(lin_r.to_gate(), qr_state[:] + qr_target)
|
254
|
+
|
255
|
+
else:
|
256
|
+
qr_compare = [qr_ancilla[0]]
|
257
|
+
qr_helper = qr_ancilla[1:]
|
258
|
+
|
259
|
+
# apply Comparator
|
260
|
+
comp = IntegerComparator(num_state_qubits=self.num_state_qubits, value=point)
|
261
|
+
qr = qr_state[:] + qr_compare[:] # add ancilla as compare qubit
|
262
|
+
|
263
|
+
circuit.append(comp.to_gate(), qr[:] + qr_helper[: comp.num_ancillas])
|
264
|
+
|
265
|
+
# apply controlled rotation
|
266
|
+
lin_r = LinearPauliRotations(
|
267
|
+
num_state_qubits=self.num_state_qubits,
|
268
|
+
slope=self.mapped_slopes[i],
|
269
|
+
offset=self.mapped_offsets[i],
|
270
|
+
basis=self.basis,
|
271
|
+
)
|
272
|
+
circuit.append(lin_r.to_gate().control(), qr_compare[:] + qr_state[:] + qr_target)
|
273
|
+
|
274
|
+
# uncompute comparator
|
275
|
+
circuit.append(comp.to_gate().inverse(), qr[:] + qr_helper[: comp.num_ancillas])
|
276
|
+
|
277
|
+
self.append(circuit.to_gate(), self.qubits)
|