qiskit 1.4.1__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0__cp39-abi3-macosx_11_0_arm64.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 -1
- qiskit/__init__.py +3 -9
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/circuit/__init__.py +35 -10
- qiskit/circuit/{add_control.py → _add_control.py} +32 -12
- qiskit/circuit/_classical_resource_map.py +5 -3
- qiskit/circuit/barrier.py +3 -7
- qiskit/circuit/classical/expr/__init__.py +31 -3
- qiskit/circuit/classical/expr/constructors.py +236 -28
- qiskit/circuit/classical/expr/expr.py +104 -3
- qiskit/circuit/classical/expr/visitors.py +75 -0
- qiskit/circuit/classical/types/__init__.py +12 -8
- qiskit/circuit/classical/types/ordering.py +14 -7
- qiskit/circuit/classical/types/types.py +36 -0
- qiskit/circuit/commutation_checker.py +34 -7
- qiskit/circuit/controlflow/__init__.py +32 -1
- qiskit/circuit/controlflow/_builder_utils.py +9 -5
- qiskit/circuit/controlflow/box.py +163 -0
- qiskit/circuit/controlflow/break_loop.py +1 -1
- qiskit/circuit/controlflow/builder.py +139 -39
- qiskit/circuit/controlflow/continue_loop.py +1 -3
- qiskit/circuit/controlflow/control_flow.py +10 -0
- qiskit/circuit/controlflow/for_loop.py +2 -1
- qiskit/circuit/controlflow/if_else.py +3 -16
- qiskit/circuit/controlflow/switch_case.py +2 -8
- qiskit/circuit/controlflow/while_loop.py +2 -7
- qiskit/circuit/controlledgate.py +2 -4
- qiskit/circuit/delay.py +40 -11
- qiskit/circuit/duration.py +0 -15
- qiskit/circuit/gate.py +2 -4
- qiskit/circuit/instruction.py +2 -141
- qiskit/circuit/instructionset.py +7 -54
- qiskit/circuit/library/__init__.py +469 -154
- qiskit/circuit/library/arithmetic/__init__.py +16 -10
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
- qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
- qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
- qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +52 -16
- qiskit/circuit/library/data_preparation/initializer.py +1 -1
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
- qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
- qiskit/circuit/library/generalized_gates/gms.py +1 -1
- qiskit/circuit/library/generalized_gates/isometry.py +1 -1
- qiskit/circuit/library/generalized_gates/pauli.py +1 -2
- qiskit/circuit/library/generalized_gates/uc.py +97 -7
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
- qiskit/circuit/library/generalized_gates/unitary.py +4 -2
- qiskit/circuit/library/graph_state.py +1 -0
- qiskit/circuit/library/hamiltonian_gate.py +1 -1
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
- qiskit/circuit/library/n_local/n_local.py +1 -1
- qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
- qiskit/circuit/library/overlap.py +2 -2
- qiskit/circuit/library/pauli_evolution.py +39 -24
- qiskit/circuit/library/phase_oracle.py +130 -51
- qiskit/circuit/library/standard_gates/__init__.py +0 -1
- qiskit/circuit/library/standard_gates/dcx.py +3 -4
- qiskit/circuit/library/standard_gates/ecr.py +3 -4
- qiskit/circuit/library/standard_gates/global_phase.py +5 -6
- qiskit/circuit/library/standard_gates/h.py +4 -9
- qiskit/circuit/library/standard_gates/i.py +2 -2
- qiskit/circuit/library/standard_gates/iswap.py +3 -4
- qiskit/circuit/library/standard_gates/p.py +15 -34
- qiskit/circuit/library/standard_gates/r.py +7 -10
- qiskit/circuit/library/standard_gates/rx.py +5 -15
- qiskit/circuit/library/standard_gates/rxx.py +3 -6
- qiskit/circuit/library/standard_gates/ry.py +5 -17
- qiskit/circuit/library/standard_gates/ryy.py +3 -6
- qiskit/circuit/library/standard_gates/rz.py +5 -17
- qiskit/circuit/library/standard_gates/rzx.py +3 -6
- qiskit/circuit/library/standard_gates/rzz.py +3 -6
- qiskit/circuit/library/standard_gates/s.py +6 -15
- qiskit/circuit/library/standard_gates/swap.py +4 -11
- qiskit/circuit/library/standard_gates/sx.py +7 -12
- qiskit/circuit/library/standard_gates/t.py +6 -7
- qiskit/circuit/library/standard_gates/u.py +2 -10
- qiskit/circuit/library/standard_gates/u1.py +5 -16
- qiskit/circuit/library/standard_gates/u2.py +2 -6
- qiskit/circuit/library/standard_gates/u3.py +3 -11
- qiskit/circuit/library/standard_gates/x.py +14 -62
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/y.py +4 -9
- qiskit/circuit/library/standard_gates/z.py +5 -15
- qiskit/circuit/measure.py +11 -2
- qiskit/circuit/parameterexpression.py +11 -0
- qiskit/circuit/quantumcircuit.py +890 -564
- qiskit/circuit/random/utils.py +12 -6
- qiskit/circuit/reset.py +5 -2
- qiskit/circuit/singleton.py +5 -11
- qiskit/circuit/store.py +0 -8
- qiskit/circuit/tools/pi_check.py +3 -0
- qiskit/compiler/__init__.py +1 -7
- qiskit/compiler/transpiler.py +38 -196
- qiskit/converters/circuit_to_dag.py +6 -4
- qiskit/converters/circuit_to_dagdependency.py +0 -2
- qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
- qiskit/converters/circuit_to_gate.py +1 -1
- qiskit/converters/circuit_to_instruction.py +16 -29
- qiskit/converters/dag_to_circuit.py +7 -8
- qiskit/converters/dag_to_dagdependency.py +0 -1
- qiskit/converters/dag_to_dagdependency_v2.py +0 -1
- qiskit/converters/dagdependency_to_circuit.py +0 -6
- qiskit/converters/dagdependency_to_dag.py +0 -6
- qiskit/dagcircuit/collect_blocks.py +32 -20
- qiskit/dagcircuit/dagdependency.py +3 -37
- qiskit/dagcircuit/dagdependency_v2.py +5 -82
- qiskit/dagcircuit/dagnode.py +14 -2
- qiskit/passmanager/__init__.py +24 -6
- qiskit/passmanager/passmanager.py +26 -24
- qiskit/primitives/__init__.py +44 -35
- qiskit/primitives/backend_estimator_v2.py +102 -23
- qiskit/primitives/backend_sampler_v2.py +5 -20
- qiskit/primitives/base/__init__.py +4 -4
- qiskit/primitives/base/base_estimator.py +77 -82
- qiskit/primitives/base/base_primitive_job.py +2 -2
- qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
- qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
- qiskit/primitives/base/base_sampler.py +52 -60
- qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
- qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
- qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
- qiskit/primitives/containers/bindings_array.py +3 -1
- qiskit/primitives/containers/bit_array.py +23 -0
- qiskit/primitives/containers/data_bin.py +3 -1
- qiskit/primitives/containers/observables_array.py +19 -2
- qiskit/primitives/statevector_sampler.py +6 -8
- qiskit/primitives/utils.py +14 -189
- qiskit/providers/__init__.py +4 -130
- qiskit/providers/backend.py +11 -314
- qiskit/providers/basic_provider/__init__.py +3 -1
- qiskit/providers/basic_provider/basic_provider.py +29 -9
- qiskit/providers/basic_provider/basic_simulator.py +158 -298
- qiskit/providers/exceptions.py +0 -33
- qiskit/providers/fake_provider/__init__.py +0 -37
- qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
- qiskit/qasm2/__init__.py +21 -6
- qiskit/qasm2/export.py +2 -10
- qiskit/qasm2/parse.py +11 -25
- qiskit/qasm3/__init__.py +5 -1
- qiskit/qasm3/ast.py +44 -0
- qiskit/qasm3/exporter.py +65 -27
- qiskit/qasm3/printer.py +35 -4
- qiskit/qpy/__init__.py +162 -19
- qiskit/qpy/binary_io/__init__.py +0 -1
- qiskit/qpy/binary_io/circuits.py +96 -116
- qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
- qiskit/qpy/binary_io/schedules.py +61 -388
- qiskit/qpy/binary_io/value.py +159 -33
- qiskit/qpy/common.py +10 -7
- qiskit/qpy/formats.py +41 -0
- qiskit/qpy/interface.py +29 -62
- qiskit/qpy/type_keys.py +58 -221
- qiskit/quantum_info/analysis/distance.py +3 -1
- qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
- qiskit/quantum_info/operators/operator.py +6 -2
- qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
- qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
- qiskit/quantum_info/states/densitymatrix.py +16 -6
- qiskit/quantum_info/states/stabilizerstate.py +35 -4
- qiskit/quantum_info/states/statevector.py +16 -6
- qiskit/result/__init__.py +5 -17
- qiskit/result/models.py +18 -11
- qiskit/result/result.py +38 -134
- qiskit/result/sampled_expval.py +1 -2
- qiskit/result/utils.py +3 -4
- qiskit/synthesis/__init__.py +21 -1
- qiskit/synthesis/arithmetic/__init__.py +3 -1
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
- qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
- qiskit/synthesis/evolution/lie_trotter.py +10 -7
- qiskit/synthesis/evolution/product_formula.py +44 -35
- qiskit/synthesis/evolution/qdrift.py +17 -24
- qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
- qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
- qiskit/synthesis/multi_controlled/__init__.py +1 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
- qiskit/synthesis/two_qubit/__init__.py +1 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
- qiskit/transpiler/__init__.py +32 -232
- qiskit/transpiler/basepasses.py +20 -51
- qiskit/transpiler/layout.py +1 -1
- qiskit/transpiler/passes/__init__.py +4 -40
- qiskit/transpiler/passes/basis/basis_translator.py +5 -4
- qiskit/transpiler/passes/basis/decompose.py +1 -15
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
- qiskit/transpiler/passes/layout/apply_layout.py +4 -0
- qiskit/transpiler/passes/layout/dense_layout.py +2 -39
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +3 -4
- qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
- qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
- qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
- qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
- qiskit/transpiler/passes/optimization/__init__.py +2 -3
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
- qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
- qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +3 -2
- qiskit/transpiler/passes/routing/__init__.py +0 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
- qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
- qiskit/transpiler/passes/scheduling/__init__.py +1 -7
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +32 -4
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +134 -62
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
- qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
- qiskit/transpiler/passes/synthesis/plugin.py +4 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
- qiskit/transpiler/passes/utils/__init__.py +0 -1
- qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
- qiskit/transpiler/passes/utils/control_flow.py +2 -6
- qiskit/transpiler/passes/utils/gate_direction.py +7 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
- qiskit/transpiler/passmanager.py +13 -0
- qiskit/transpiler/passmanager_config.py +5 -81
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
- qiskit/transpiler/preset_passmanagers/common.py +140 -167
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +107 -322
- qiskit/transpiler/preset_passmanagers/level0.py +2 -11
- qiskit/transpiler/preset_passmanagers/level1.py +2 -14
- qiskit/transpiler/preset_passmanagers/level2.py +2 -12
- qiskit/transpiler/preset_passmanagers/level3.py +2 -11
- qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
- qiskit/transpiler/target.py +78 -524
- qiskit/user_config.py +8 -4
- qiskit/utils/__init__.py +13 -12
- qiskit/utils/deprecation.py +4 -112
- qiskit/utils/optionals.py +11 -4
- qiskit/utils/parallel.py +214 -87
- qiskit/utils/units.py +4 -1
- qiskit/visualization/__init__.py +3 -7
- qiskit/visualization/array.py +4 -1
- qiskit/visualization/bloch.py +1 -1
- qiskit/visualization/circuit/_utils.py +19 -19
- qiskit/visualization/circuit/circuit_visualization.py +11 -4
- qiskit/visualization/circuit/matplotlib.py +13 -23
- qiskit/visualization/circuit/text.py +7 -3
- qiskit/visualization/counts_visualization.py +4 -0
- qiskit/visualization/dag_visualization.py +2 -1
- qiskit/visualization/gate_map.py +39 -154
- qiskit/visualization/library.py +4 -1
- qiskit/visualization/pass_manager_visualization.py +6 -2
- qiskit/visualization/state_visualization.py +19 -2
- qiskit/visualization/timeline/core.py +19 -13
- qiskit/visualization/timeline/interface.py +19 -18
- qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/RECORD +303 -449
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/WHEEL +2 -1
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
- qiskit/assembler/__init__.py +0 -42
- qiskit/assembler/assemble_circuits.py +0 -451
- qiskit/assembler/assemble_schedules.py +0 -367
- qiskit/assembler/disassemble.py +0 -310
- qiskit/assembler/run_config.py +0 -77
- qiskit/circuit/bit.py +0 -106
- qiskit/circuit/classicalfunction/__init__.py +0 -152
- qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
- qiskit/circuit/classicalfunction/classical_element.py +0 -54
- qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
- qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
- qiskit/circuit/classicalfunction/exceptions.py +0 -41
- qiskit/circuit/classicalfunction/types.py +0 -18
- qiskit/circuit/classicalfunction/utils.py +0 -91
- qiskit/circuit/classicalregister.py +0 -57
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
- qiskit/circuit/quantumregister.py +0 -75
- qiskit/circuit/register.py +0 -246
- qiskit/compiler/assembler.py +0 -689
- qiskit/compiler/scheduler.py +0 -109
- qiskit/compiler/sequencer.py +0 -71
- qiskit/primitives/backend_estimator.py +0 -486
- qiskit/primitives/backend_sampler.py +0 -222
- qiskit/primitives/estimator.py +0 -172
- qiskit/primitives/sampler.py +0 -162
- qiskit/providers/backend_compat.py +0 -507
- qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
- qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
- qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
- qiskit/providers/fake_provider/fake_1q.py +0 -91
- qiskit/providers/fake_provider/fake_backend.py +0 -165
- qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
- qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
- qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
- qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
- qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
- qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
- qiskit/providers/models/__init__.py +0 -89
- qiskit/providers/models/backendconfiguration.py +0 -1040
- qiskit/providers/models/backendproperties.py +0 -535
- qiskit/providers/models/backendstatus.py +0 -104
- qiskit/providers/models/jobstatus.py +0 -77
- qiskit/providers/models/pulsedefaults.py +0 -305
- qiskit/providers/provider.py +0 -95
- qiskit/pulse/__init__.py +0 -158
- qiskit/pulse/builder.py +0 -2262
- qiskit/pulse/calibration_entries.py +0 -381
- qiskit/pulse/channels.py +0 -227
- qiskit/pulse/configuration.py +0 -245
- qiskit/pulse/exceptions.py +0 -45
- qiskit/pulse/filters.py +0 -309
- qiskit/pulse/instruction_schedule_map.py +0 -424
- qiskit/pulse/instructions/__init__.py +0 -67
- qiskit/pulse/instructions/acquire.py +0 -150
- qiskit/pulse/instructions/delay.py +0 -71
- qiskit/pulse/instructions/directives.py +0 -154
- qiskit/pulse/instructions/frequency.py +0 -135
- qiskit/pulse/instructions/instruction.py +0 -270
- qiskit/pulse/instructions/phase.py +0 -152
- qiskit/pulse/instructions/play.py +0 -99
- qiskit/pulse/instructions/reference.py +0 -100
- qiskit/pulse/instructions/snapshot.py +0 -82
- qiskit/pulse/library/__init__.py +0 -97
- qiskit/pulse/library/continuous.py +0 -430
- qiskit/pulse/library/pulse.py +0 -148
- qiskit/pulse/library/samplers/__init__.py +0 -15
- qiskit/pulse/library/samplers/decorators.py +0 -295
- qiskit/pulse/library/samplers/strategies.py +0 -71
- qiskit/pulse/library/symbolic_pulses.py +0 -1989
- qiskit/pulse/library/waveform.py +0 -136
- qiskit/pulse/macros.py +0 -262
- qiskit/pulse/parameter_manager.py +0 -445
- qiskit/pulse/parser.py +0 -314
- qiskit/pulse/reference_manager.py +0 -58
- qiskit/pulse/schedule.py +0 -1854
- qiskit/pulse/transforms/__init__.py +0 -106
- qiskit/pulse/transforms/alignments.py +0 -406
- qiskit/pulse/transforms/base_transforms.py +0 -71
- qiskit/pulse/transforms/canonicalization.py +0 -498
- qiskit/pulse/transforms/dag.py +0 -122
- qiskit/pulse/utils.py +0 -149
- qiskit/qobj/__init__.py +0 -75
- qiskit/qobj/common.py +0 -81
- qiskit/qobj/converters/__init__.py +0 -18
- qiskit/qobj/converters/lo_config.py +0 -177
- qiskit/qobj/converters/pulse_instruction.py +0 -897
- qiskit/qobj/pulse_qobj.py +0 -709
- qiskit/qobj/qasm_qobj.py +0 -708
- qiskit/qobj/utils.py +0 -46
- qiskit/result/mitigation/base_readout_mitigator.py +0 -79
- qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
- qiskit/result/mitigation/local_readout_mitigator.py +0 -328
- qiskit/result/mitigation/utils.py +0 -217
- qiskit/scheduler/__init__.py +0 -40
- qiskit/scheduler/config.py +0 -37
- qiskit/scheduler/lowering.py +0 -187
- qiskit/scheduler/methods/__init__.py +0 -15
- qiskit/scheduler/methods/basic.py +0 -140
- qiskit/scheduler/schedule_circuit.py +0 -69
- qiskit/scheduler/sequence.py +0 -104
- qiskit/transpiler/passes/calibration/__init__.py +0 -17
- qiskit/transpiler/passes/calibration/base_builder.py +0 -79
- qiskit/transpiler/passes/calibration/builders.py +0 -20
- qiskit/transpiler/passes/calibration/exceptions.py +0 -22
- qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
- qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
- qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
- qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
- qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
- qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
- qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
- qiskit/transpiler/passes/scheduling/alap.py +0 -153
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
- qiskit/transpiler/passes/scheduling/asap.py +0 -175
- qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
- qiskit/utils/deprecate_pulse.py +0 -119
- qiskit/utils/multiprocessing.py +0 -56
- qiskit/visualization/pulse_v2/__init__.py +0 -21
- qiskit/visualization/pulse_v2/core.py +0 -901
- qiskit/visualization/pulse_v2/device_info.py +0 -173
- qiskit/visualization/pulse_v2/drawings.py +0 -253
- qiskit/visualization/pulse_v2/events.py +0 -254
- qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
- qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
- qiskit/visualization/pulse_v2/generators/chart.py +0 -208
- qiskit/visualization/pulse_v2/generators/frame.py +0 -436
- qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
- qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
- qiskit/visualization/pulse_v2/interface.py +0 -459
- qiskit/visualization/pulse_v2/layouts.py +0 -387
- qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
- qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
- qiskit/visualization/pulse_v2/stylesheet.py +0 -312
- qiskit/visualization/pulse_v2/types.py +0 -242
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/top_level.txt +0 -0
@@ -250,6 +250,58 @@ MCMT Synthesis
|
|
250
250
|
MCMTSynthesisNoAux
|
251
251
|
MCMTSynthesisDefault
|
252
252
|
|
253
|
+
|
254
|
+
Integer comparators
|
255
|
+
'''''''''''''''''''
|
256
|
+
|
257
|
+
.. list-table:: Plugins for :class:`.IntegerComparatorGate` (key = ``"IntComp"``)
|
258
|
+
:header-rows: 1
|
259
|
+
|
260
|
+
* - Plugin name
|
261
|
+
- Plugin class
|
262
|
+
- Description
|
263
|
+
- Auxiliary qubits
|
264
|
+
* - ``"twos"``
|
265
|
+
- :class:`~.IntComparatorSynthesis2s`
|
266
|
+
- use addition with two's complement
|
267
|
+
- ``n - 1`` clean
|
268
|
+
* - ``"noaux"``
|
269
|
+
- :class:`~.IntComparatorSynthesisNoAux`
|
270
|
+
- flip the target controlled on all :math:`O(2^l)` allowed integer values
|
271
|
+
- none
|
272
|
+
* - ``"default"``
|
273
|
+
- :class:`~.IntComparatorSynthesisDefault`
|
274
|
+
- use the best algorithm depending on the available auxiliary qubits
|
275
|
+
- any
|
276
|
+
|
277
|
+
.. autosummary::
|
278
|
+
:toctree: ../stubs/
|
279
|
+
|
280
|
+
IntComparatorSynthesis2s
|
281
|
+
IntComparatorSynthesisNoAux
|
282
|
+
IntComparatorSynthesisDefault
|
283
|
+
|
284
|
+
|
285
|
+
Sums
|
286
|
+
''''
|
287
|
+
|
288
|
+
.. list-table:: Plugins for :class:`.WeightedSumGate` (key = ``"WeightedSum"``)
|
289
|
+
:header-rows: 1
|
290
|
+
|
291
|
+
* - Plugin name
|
292
|
+
- Plugin class
|
293
|
+
- Description
|
294
|
+
- Auxiliary qubits
|
295
|
+
* - ``"default"``
|
296
|
+
- :class:`.WeightedSumSynthesisDefault`
|
297
|
+
- use a V-chain based synthesis
|
298
|
+
- given ``s`` sum qubits, used ``s - 1 + int(s > 2)`` clean auxiliary qubits
|
299
|
+
|
300
|
+
.. autosummary::
|
301
|
+
:toctree: ../stubs/
|
302
|
+
|
303
|
+
WeightedSumSynthesisDefault
|
304
|
+
|
253
305
|
|
254
306
|
Pauli Evolution Synthesis
|
255
307
|
'''''''''''''''''''''''''
|
@@ -391,7 +443,7 @@ Multiplier Synthesis
|
|
391
443
|
- Description
|
392
444
|
* - ``"cumulative"``
|
393
445
|
- :class:`.MultiplierSynthesisH18`
|
394
|
-
- depending on the :class:`.
|
446
|
+
- depending on the :class:`.AdderGate` used
|
395
447
|
- a cumulative adder based on controlled adders
|
396
448
|
* - ``"qft"``
|
397
449
|
- :class:`.MultiplierSynthesisR17`
|
@@ -413,6 +465,7 @@ import numpy as np
|
|
413
465
|
import rustworkx as rx
|
414
466
|
|
415
467
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
468
|
+
from qiskit.circuit.operation import Operation
|
416
469
|
from qiskit.circuit.library import (
|
417
470
|
LinearFunction,
|
418
471
|
QFTGate,
|
@@ -426,9 +479,23 @@ from qiskit.circuit.library import (
|
|
426
479
|
HalfAdderGate,
|
427
480
|
FullAdderGate,
|
428
481
|
MultiplierGate,
|
482
|
+
WeightedSumGate,
|
483
|
+
GlobalPhaseGate,
|
484
|
+
)
|
485
|
+
from qiskit.circuit.annotated_operation import (
|
486
|
+
AnnotatedOperation,
|
487
|
+
Modifier,
|
488
|
+
ControlModifier,
|
489
|
+
InverseModifier,
|
490
|
+
PowerModifier,
|
429
491
|
)
|
430
492
|
from qiskit.transpiler.coupling import CouplingMap
|
431
493
|
|
494
|
+
from qiskit.synthesis.arithmetic import (
|
495
|
+
synth_integer_comparator_2s,
|
496
|
+
synth_integer_comparator_greedy,
|
497
|
+
synth_weighted_sum_carry,
|
498
|
+
)
|
432
499
|
from qiskit.synthesis.clifford import (
|
433
500
|
synth_clifford_full,
|
434
501
|
synth_clifford_layers,
|
@@ -470,6 +537,9 @@ from qiskit.synthesis.arithmetic import (
|
|
470
537
|
)
|
471
538
|
from qiskit.quantum_info.operators import Clifford
|
472
539
|
from qiskit.transpiler.passes.routing.algorithms import ApproximateTokenSwapper
|
540
|
+
from qiskit.transpiler.exceptions import TranspilerError
|
541
|
+
|
542
|
+
from qiskit._accelerate.high_level_synthesis import synthesize_operation
|
473
543
|
from .plugin import HighLevelSynthesisPlugin
|
474
544
|
|
475
545
|
|
@@ -1247,6 +1317,47 @@ class MCMTSynthesisVChain(HighLevelSynthesisPlugin):
|
|
1247
1317
|
)
|
1248
1318
|
|
1249
1319
|
|
1320
|
+
class IntComparatorSynthesisDefault(HighLevelSynthesisPlugin):
|
1321
|
+
"""The default synthesis for ``IntegerComparatorGate``.
|
1322
|
+
|
1323
|
+
Currently this is only supporting an ancilla-based decomposition.
|
1324
|
+
"""
|
1325
|
+
|
1326
|
+
def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
|
1327
|
+
num_state_qubits = high_level_object.num_qubits - 1
|
1328
|
+
num_aux = num_state_qubits - 1
|
1329
|
+
if options.get("num_clean_ancillas", 0) < num_aux:
|
1330
|
+
return synth_integer_comparator_greedy(
|
1331
|
+
num_state_qubits, high_level_object.value, high_level_object.geq
|
1332
|
+
)
|
1333
|
+
|
1334
|
+
return synth_integer_comparator_2s(
|
1335
|
+
num_state_qubits, high_level_object.value, high_level_object.geq
|
1336
|
+
)
|
1337
|
+
|
1338
|
+
|
1339
|
+
class IntComparatorSynthesisNoAux(HighLevelSynthesisPlugin):
|
1340
|
+
"""A potentially exponentially expensive comparison w/o auxiliary qubits."""
|
1341
|
+
|
1342
|
+
def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
|
1343
|
+
return synth_integer_comparator_greedy(
|
1344
|
+
high_level_object.num_state_qubits, high_level_object.value, high_level_object.geq
|
1345
|
+
)
|
1346
|
+
|
1347
|
+
|
1348
|
+
class IntComparatorSynthesis2s(HighLevelSynthesisPlugin):
|
1349
|
+
"""An integer comparison based on 2s complement."""
|
1350
|
+
|
1351
|
+
def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
|
1352
|
+
num_aux = high_level_object.num_state_qubits - 1
|
1353
|
+
if options.get("num_clean_ancillas", 0) < num_aux:
|
1354
|
+
return None
|
1355
|
+
|
1356
|
+
return synth_integer_comparator_2s(
|
1357
|
+
high_level_object.num_state_qubits, high_level_object.value, high_level_object.geq
|
1358
|
+
)
|
1359
|
+
|
1360
|
+
|
1250
1361
|
class ModularAdderSynthesisDefault(HighLevelSynthesisPlugin):
|
1251
1362
|
"""The default modular adder (no carry in, no carry out qubit) synthesis.
|
1252
1363
|
|
@@ -1663,3 +1774,185 @@ class PauliEvolutionSynthesisRustiq(HighLevelSynthesisPlugin):
|
|
1663
1774
|
upto_phase=upto_phase,
|
1664
1775
|
resynth_clifford_method=resynth_clifford_method,
|
1665
1776
|
)
|
1777
|
+
|
1778
|
+
|
1779
|
+
class AnnotatedSynthesisDefault(HighLevelSynthesisPlugin):
|
1780
|
+
"""Synthesize an :class:`.AnnotatedOperation` using the default synthesis algorithm.
|
1781
|
+
|
1782
|
+
This plugin name is:``annotated.default`` which can be used as the key on
|
1783
|
+
an :class:`~.HLSConfig` object to use this method with :class:`~.HighLevelSynthesis`.
|
1784
|
+
"""
|
1785
|
+
|
1786
|
+
def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
|
1787
|
+
if not isinstance(high_level_object, AnnotatedOperation):
|
1788
|
+
return None
|
1789
|
+
|
1790
|
+
operation = high_level_object
|
1791
|
+
modifiers = high_level_object.modifiers
|
1792
|
+
|
1793
|
+
# The plugin needs additional information that is not yet passed via the run's method
|
1794
|
+
# arguments: namely high-level-synthesis data and options, the global qubits over which
|
1795
|
+
# the operation is defined, and the initial state of each global qubit.
|
1796
|
+
tracker = options.get("qubit_tracker", None)
|
1797
|
+
data = options.get("hls_data", None)
|
1798
|
+
input_qubits = options.get("input_qubits", None)
|
1799
|
+
|
1800
|
+
if data is None or input_qubits is None:
|
1801
|
+
raise TranspilerError(
|
1802
|
+
"The AnnotatedSynthesisDefault plugin should receive data and input_qubits via options."
|
1803
|
+
)
|
1804
|
+
|
1805
|
+
if len(modifiers) > 0:
|
1806
|
+
num_ctrl = sum(
|
1807
|
+
mod.num_ctrl_qubits for mod in modifiers if isinstance(mod, ControlModifier)
|
1808
|
+
)
|
1809
|
+
power = sum(mod.power for mod in modifiers if isinstance(mod, PowerModifier))
|
1810
|
+
is_inverted = sum(1 for mod in modifiers if isinstance(mod, InverseModifier)) % 2
|
1811
|
+
|
1812
|
+
# First, synthesize the base operation of this annotated operation.
|
1813
|
+
# As this step cannot use any control qubits as auxiliary qubits, we use a dedicated
|
1814
|
+
# tracker (annotated_tracker).
|
1815
|
+
# The logic is as follows:
|
1816
|
+
# - annotated_tracker.disable control qubits
|
1817
|
+
# - if have power or inverse modifiers, annotated_tracker.set_dirty(base_qubits)
|
1818
|
+
# - synthesize the base operation using annotated tracker
|
1819
|
+
# - main_tracker.set_dirty(base_qubits)
|
1820
|
+
#
|
1821
|
+
# Note that we need to set the base_qubits to dirty if we have power or inverse
|
1822
|
+
# modifiers. For power: even if the power is a positive integer (that is, we need
|
1823
|
+
# to repeat the same circuit multiple times), even if the target is initially at |0>,
|
1824
|
+
# it will generally not be at |0> after one iteration. For inverse: as we
|
1825
|
+
# flip the order of operations, we cannot exploit which qubits are at |0> as "viewed from
|
1826
|
+
# the back of the circuit". If we just have control modifiers, we can use the state
|
1827
|
+
# of base qubits when synthesizing the controlled operation.
|
1828
|
+
#
|
1829
|
+
# In addition, all of the other global qubits that are not a part of the annotated
|
1830
|
+
# operation can be used as they are in all cases, since we are assuming that all of
|
1831
|
+
# the synthesis methods preserve the states of ancilla qubits.
|
1832
|
+
annotated_tracker = tracker.copy()
|
1833
|
+
control_qubits = input_qubits[:num_ctrl]
|
1834
|
+
base_qubits = input_qubits[num_ctrl:]
|
1835
|
+
annotated_tracker.disable(control_qubits) # do not access control qubits
|
1836
|
+
if power != 0 or is_inverted:
|
1837
|
+
annotated_tracker.set_dirty(base_qubits)
|
1838
|
+
|
1839
|
+
# Note that synthesize_operation also returns the output qubits on which the
|
1840
|
+
# operation is defined, however currently the plugin mechanism has no way
|
1841
|
+
# to return these (and instead the upstream code greedily grabs some ancilla
|
1842
|
+
# qubits from the circuit). We should refactor the plugin "run" iterface to
|
1843
|
+
# return the actual ancilla qubits used.
|
1844
|
+
synthesized_base_op_result = synthesize_operation(
|
1845
|
+
operation.base_op, input_qubits[num_ctrl:], data, annotated_tracker
|
1846
|
+
)
|
1847
|
+
|
1848
|
+
# The base operation does not need to be synthesized.
|
1849
|
+
# For simplicity, we wrap the instruction into a circuit. Note that
|
1850
|
+
# this should not deteriorate the quality of the result.
|
1851
|
+
if synthesized_base_op_result is None:
|
1852
|
+
synthesized_base_op = self._instruction_to_circuit(operation.base_op)
|
1853
|
+
else:
|
1854
|
+
synthesized_base_op = QuantumCircuit._from_circuit_data(
|
1855
|
+
synthesized_base_op_result[0]
|
1856
|
+
)
|
1857
|
+
tracker.set_dirty(base_qubits)
|
1858
|
+
|
1859
|
+
# This step currently does not introduce ancilla qubits. However it makes
|
1860
|
+
# a lot of sense to allow this in the future.
|
1861
|
+
synthesized = self._apply_annotations(synthesized_base_op, operation.modifiers)
|
1862
|
+
|
1863
|
+
return synthesized
|
1864
|
+
|
1865
|
+
return None
|
1866
|
+
|
1867
|
+
@staticmethod
|
1868
|
+
def _apply_annotations(circuit: QuantumCircuit, modifiers: list[Modifier]) -> QuantumCircuit:
|
1869
|
+
"""
|
1870
|
+
Applies modifiers to a quantum circuit.
|
1871
|
+
"""
|
1872
|
+
for modifier in modifiers:
|
1873
|
+
if isinstance(modifier, InverseModifier):
|
1874
|
+
circuit = circuit.inverse()
|
1875
|
+
|
1876
|
+
elif isinstance(modifier, ControlModifier):
|
1877
|
+
if circuit.num_clbits > 0:
|
1878
|
+
raise TranspilerError(
|
1879
|
+
"AnnotatedSynthesisDefault: cannot control a circuit with classical bits."
|
1880
|
+
)
|
1881
|
+
|
1882
|
+
# Apply the control modifier to each gate in the circuit.
|
1883
|
+
controlled_circuit = QuantumCircuit(modifier.num_ctrl_qubits + circuit.num_qubits)
|
1884
|
+
if circuit.global_phase != 0:
|
1885
|
+
controlled_op = GlobalPhaseGate(circuit.global_phase).control(
|
1886
|
+
num_ctrl_qubits=modifier.num_ctrl_qubits,
|
1887
|
+
label=None,
|
1888
|
+
ctrl_state=modifier.ctrl_state,
|
1889
|
+
annotated=False,
|
1890
|
+
)
|
1891
|
+
controlled_qubits = list(range(0, modifier.num_ctrl_qubits))
|
1892
|
+
controlled_circuit.append(controlled_op, controlled_qubits)
|
1893
|
+
for inst in circuit:
|
1894
|
+
inst_op = inst.operation
|
1895
|
+
inst_qubits = inst.qubits
|
1896
|
+
controlled_op = inst_op.control(
|
1897
|
+
num_ctrl_qubits=modifier.num_ctrl_qubits,
|
1898
|
+
label=None,
|
1899
|
+
ctrl_state=modifier.ctrl_state,
|
1900
|
+
annotated=False,
|
1901
|
+
)
|
1902
|
+
controlled_qubits = list(range(0, modifier.num_ctrl_qubits)) + [
|
1903
|
+
modifier.num_ctrl_qubits + circuit.find_bit(q).index for q in inst_qubits
|
1904
|
+
]
|
1905
|
+
controlled_circuit.append(controlled_op, controlled_qubits)
|
1906
|
+
|
1907
|
+
circuit = controlled_circuit
|
1908
|
+
|
1909
|
+
if isinstance(circuit, AnnotatedOperation):
|
1910
|
+
raise TranspilerError(
|
1911
|
+
"AnnotatedSynthesisDefault: failed to synthesize the control modifier."
|
1912
|
+
)
|
1913
|
+
|
1914
|
+
elif isinstance(modifier, PowerModifier):
|
1915
|
+
circuit = circuit.power(modifier.power)
|
1916
|
+
|
1917
|
+
else:
|
1918
|
+
raise TranspilerError(f"AnnotatedSynthesisDefault: Unknown modifier {modifier}.")
|
1919
|
+
|
1920
|
+
return circuit
|
1921
|
+
|
1922
|
+
@staticmethod
|
1923
|
+
def _instruction_to_circuit(op: Operation) -> QuantumCircuit:
|
1924
|
+
"""Wraps a single operation into a quantum circuit."""
|
1925
|
+
circuit = QuantumCircuit(op.num_qubits, op.num_clbits)
|
1926
|
+
circuit.append(op, circuit.qubits, circuit.clbits)
|
1927
|
+
return circuit
|
1928
|
+
|
1929
|
+
|
1930
|
+
class WeightedSumSynthesisDefault(HighLevelSynthesisPlugin):
|
1931
|
+
"""Synthesize a :class:`.WeightedSumGate` using the default synthesis algorithm.
|
1932
|
+
|
1933
|
+
This plugin name is:``WeightedSum.default`` which can be used as the key on
|
1934
|
+
an :class:`.HLSConfig` object to use this method with :class:`~.HighLevelSynthesis`.
|
1935
|
+
|
1936
|
+
.. note::
|
1937
|
+
|
1938
|
+
This default plugin requires auxiliary qubits. There is currently no implementation
|
1939
|
+
available without auxiliary qubits.
|
1940
|
+
|
1941
|
+
"""
|
1942
|
+
|
1943
|
+
def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
|
1944
|
+
if not isinstance(high_level_object, WeightedSumGate):
|
1945
|
+
return None
|
1946
|
+
|
1947
|
+
required_auxiliaries = (
|
1948
|
+
high_level_object.num_sum_qubits - 1 + int(high_level_object.num_sum_qubits > 2)
|
1949
|
+
)
|
1950
|
+
if (num_clean := options.get("num_clean_ancillas", 0)) < required_auxiliaries:
|
1951
|
+
warnings.warn(
|
1952
|
+
f"Cannot synthesize a WeightedSumGate on {high_level_object.num_state_qubits} state "
|
1953
|
+
f"qubits with less than {required_auxiliaries} clean auxiliary qubits. Only "
|
1954
|
+
f"{num_clean} are available. This will likely lead to a error in HighLevelSynthesis."
|
1955
|
+
)
|
1956
|
+
return None
|
1957
|
+
|
1958
|
+
return synth_weighted_sum_carry(high_level_object)
|
@@ -714,6 +714,10 @@ class HighLevelSynthesisPluginManager:
|
|
714
714
|
plugin_name = op_name + "." + method_name
|
715
715
|
return self.plugins[plugin_name].obj
|
716
716
|
|
717
|
+
def op_names(self):
|
718
|
+
"""Returns the names of high-level-objects with available synthesis methods."""
|
719
|
+
return list(self.plugins_by_op.keys())
|
720
|
+
|
717
721
|
|
718
722
|
def high_level_synthesis_plugin_names(op_name: str) -> List[str]:
|
719
723
|
"""Return a list of plugin names installed for a given high level object name
|
@@ -33,7 +33,7 @@ from qiskit.synthesis.discrete_basis.generate_basis_approximations import (
|
|
33
33
|
generate_basic_approximations,
|
34
34
|
)
|
35
35
|
from qiskit.transpiler.basepasses import TransformationPass
|
36
|
-
from qiskit.transpiler.
|
36
|
+
from qiskit.transpiler.passes.utils.control_flow import trivial_recurse
|
37
37
|
|
38
38
|
from .plugin import UnitarySynthesisPlugin
|
39
39
|
|
@@ -73,7 +73,9 @@ class SolovayKitaev(TransformationPass):
|
|
73
73
|
|
74
74
|
Per default, the basis gate set is ``["t", "tdg", "h"]``:
|
75
75
|
|
76
|
-
..
|
76
|
+
.. plot::
|
77
|
+
:include-source:
|
78
|
+
:nofigs:
|
77
79
|
|
78
80
|
import numpy as np
|
79
81
|
from qiskit.circuit import QuantumCircuit
|
@@ -110,7 +112,9 @@ class SolovayKitaev(TransformationPass):
|
|
110
112
|
|
111
113
|
For individual basis gate sets, the ``generate_basic_approximations`` function can be used:
|
112
114
|
|
113
|
-
..
|
115
|
+
.. plot::
|
116
|
+
:include-source:
|
117
|
+
:nofigs:
|
114
118
|
|
115
119
|
from qiskit.synthesis import generate_basic_approximations
|
116
120
|
from qiskit.transpiler.passes import SolovayKitaev
|
@@ -151,6 +155,7 @@ class SolovayKitaev(TransformationPass):
|
|
151
155
|
self.recursion_degree = recursion_degree
|
152
156
|
self._sk = SolovayKitaevDecomposition(basic_approximations)
|
153
157
|
|
158
|
+
@trivial_recurse
|
154
159
|
def run(self, dag: DAGCircuit) -> DAGCircuit:
|
155
160
|
"""Run the ``SolovayKitaev`` pass on `dag`.
|
156
161
|
|
@@ -164,18 +169,19 @@ class SolovayKitaev(TransformationPass):
|
|
164
169
|
TranspilerError: if a gates does not have to_matrix
|
165
170
|
"""
|
166
171
|
for node in dag.op_nodes():
|
167
|
-
|
168
|
-
|
172
|
+
|
173
|
+
# ignore operations on which the algorithm cannot run
|
174
|
+
if (
|
175
|
+
(node.op.num_qubits != 1)
|
176
|
+
or node.is_parameterized()
|
177
|
+
or (not hasattr(node.op, "to_matrix"))
|
178
|
+
):
|
179
|
+
continue
|
169
180
|
|
170
181
|
# we do not check the input matrix as we know it comes from a Qiskit gate, as this
|
171
182
|
# we know it will generate a valid SU(2) matrix
|
172
183
|
check_input = not isinstance(node.op, Gate)
|
173
184
|
|
174
|
-
if not hasattr(node.op, "to_matrix"):
|
175
|
-
raise TranspilerError(
|
176
|
-
f"SolovayKitaev does not support gate without to_matrix method: {node.op.name}"
|
177
|
-
)
|
178
|
-
|
179
185
|
matrix = node.op.to_matrix()
|
180
186
|
|
181
187
|
# call solovay kitaev
|