qiskit 1.4.1__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0rc1__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 +2 -5
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/circuit/__init__.py +24 -5
- 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 +248 -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 +34 -5
- 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/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 +2 -6
- 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 +13 -60
- 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 +4 -0
- qiskit/circuit/quantumcircuit.py +881 -555
- 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/compiler/__init__.py +1 -7
- qiskit/compiler/transpiler.py +38 -196
- qiskit/converters/circuit_to_dag.py +4 -2
- 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 +5 -5
- 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 +2 -80
- 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 +141 -19
- qiskit/qpy/binary_io/__init__.py +0 -1
- qiskit/qpy/binary_io/circuits.py +91 -116
- qiskit/qpy/binary_io/schedules.py +61 -388
- qiskit/qpy/binary_io/value.py +154 -28
- 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 -10
- qiskit/result/result.py +28 -126
- 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 +2 -40
- qiskit/transpiler/passes/basis/basis_translator.py +4 -3
- 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 +4 -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 +1 -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 +1 -0
- 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 +30 -2
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -58
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +11 -3
- 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 +127 -59
- 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 +101 -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 +67 -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/dag_visualization.py +2 -1
- qiskit/visualization/gate_map.py +39 -154
- qiskit/visualization/pass_manager_visualization.py +6 -2
- qiskit/visualization/state_visualization.py +6 -0
- qiskit/visualization/timeline/core.py +18 -12
- qiskit/visualization/timeline/interface.py +19 -18
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/METADATA +2 -2
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/RECORD +297 -444
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/WHEEL +2 -1
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.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.0rc1.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/top_level.txt +0 -0
@@ -28,13 +28,13 @@ import numpy as np
|
|
28
28
|
from qiskit.circuit.gate import Gate
|
29
29
|
from qiskit.circuit.library.standard_gates.h import HGate
|
30
30
|
from qiskit.quantum_info.operators.predicates import is_unitary_matrix
|
31
|
-
from qiskit.circuit
|
31
|
+
from qiskit.circuit import QuantumRegister
|
32
32
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
33
33
|
from qiskit.circuit.exceptions import CircuitError
|
34
34
|
from qiskit.exceptions import QiskitError
|
35
35
|
from qiskit._accelerate import uc_gate
|
36
36
|
|
37
|
-
from .diagonal import
|
37
|
+
from .diagonal import DiagonalGate
|
38
38
|
|
39
39
|
_EPS = 1e-10 # global variable used to chop very small numbers to zero
|
40
40
|
|
@@ -60,14 +60,21 @@ class UCGate(Gate):
|
|
60
60
|
|
61
61
|
The decomposition is based on Ref. [1].
|
62
62
|
|
63
|
+
Unnecessary controls and repeated operators can be removed as described in Ref [2].
|
64
|
+
|
63
65
|
**References:**
|
64
66
|
|
65
67
|
[1] Bergholm et al., Quantum circuits with uniformly controlled one-qubit gates (2005).
|
66
68
|
`Phys. Rev. A 71, 052330 <https://journals.aps.org/pra/abstract/10.1103/PhysRevA.71.052330>`__.
|
67
69
|
|
70
|
+
[2] de Carvalho et al., Quantum multiplexer simplification for state preparation (2024).
|
71
|
+
`arXiv:2409.05618 <https://arxiv.org/abs/2409.05618>`__.
|
72
|
+
|
68
73
|
"""
|
69
74
|
|
70
|
-
def __init__(
|
75
|
+
def __init__(
|
76
|
+
self, gate_list: list[np.ndarray], up_to_diagonal: bool = False, mux_simp: bool = True
|
77
|
+
):
|
71
78
|
r"""
|
72
79
|
Args:
|
73
80
|
gate_list: List of two qubit unitaries :math:`[U_0, ..., U_{2^{k-1}}]`, where each
|
@@ -76,6 +83,9 @@ class UCGate(Gate):
|
|
76
83
|
or if it is decomposed completely (default: False).
|
77
84
|
If the ``UCGate`` :math:`U` is decomposed up to a diagonal :math:`D`, this means
|
78
85
|
that the circuit implements a unitary :math:`U'` such that :math:`D U' = U`.
|
86
|
+
mux_simp: Determines whether the search for repetitions is conducted (default: True).
|
87
|
+
The intention is to perform a possible simplification in the number of controls
|
88
|
+
and operators.
|
79
89
|
|
80
90
|
Raises:
|
81
91
|
QiskitError: in case of bad input to the constructor
|
@@ -101,10 +111,67 @@ class UCGate(Gate):
|
|
101
111
|
if not is_unitary_matrix(gate, _EPS):
|
102
112
|
raise QiskitError("A controlled gate is not unitary.")
|
103
113
|
|
114
|
+
new_controls = set()
|
115
|
+
if mux_simp:
|
116
|
+
new_controls, gate_list = self._simplify(gate_list, num_contr)
|
117
|
+
self.simp_contr = (mux_simp, new_controls)
|
118
|
+
|
104
119
|
# Create new gate.
|
105
120
|
super().__init__("multiplexer", int(num_contr) + 1, gate_list)
|
106
121
|
self.up_to_diagonal = up_to_diagonal
|
107
122
|
|
123
|
+
def _simplify(self, gate_list, num_contr):
|
124
|
+
"""https://arxiv.org/abs/2409.05618"""
|
125
|
+
|
126
|
+
c = set()
|
127
|
+
nc = set()
|
128
|
+
mux_copy = gate_list.copy()
|
129
|
+
|
130
|
+
for i in range(int(num_contr)):
|
131
|
+
c.add(i + 1)
|
132
|
+
|
133
|
+
if len(gate_list) > 1:
|
134
|
+
nc, mux_copy = self._repetition_search(gate_list, num_contr, mux_copy)
|
135
|
+
|
136
|
+
new_controls = {x for x in c if x not in nc}
|
137
|
+
new_mux = [gate for gate in mux_copy if gate is not None]
|
138
|
+
return new_controls, new_mux
|
139
|
+
|
140
|
+
def _repetition_search(self, mux, level, mux_copy):
|
141
|
+
nc = set()
|
142
|
+
d = 1
|
143
|
+
while d <= len(mux) / 2:
|
144
|
+
disentanglement = False
|
145
|
+
if np.allclose(mux[d], mux[0]):
|
146
|
+
mux_org = mux_copy.copy()
|
147
|
+
repetitions = len(mux) / (2 * d)
|
148
|
+
p = 0
|
149
|
+
while repetitions > 0:
|
150
|
+
repetitions -= 1
|
151
|
+
valid, mux_copy = self._repetition_verify(p, d, mux, mux_copy)
|
152
|
+
p = p + 2 * d
|
153
|
+
if not valid:
|
154
|
+
mux_copy = mux_org
|
155
|
+
break
|
156
|
+
if repetitions == 0:
|
157
|
+
disentanglement = True
|
158
|
+
|
159
|
+
if disentanglement:
|
160
|
+
removed_contr = level - math.log2(d)
|
161
|
+
nc.add(removed_contr)
|
162
|
+
d = 2 * d
|
163
|
+
return nc, mux_copy
|
164
|
+
|
165
|
+
def _repetition_verify(self, base, d, mux, mux_copy):
|
166
|
+
i = 0
|
167
|
+
next_base = base + d
|
168
|
+
while i < d:
|
169
|
+
if not np.allclose(mux[base], mux[next_base]):
|
170
|
+
return False, mux_copy
|
171
|
+
mux_copy[next_base] = None
|
172
|
+
base, next_base, i = base + 1, next_base + 1, i + 1
|
173
|
+
return True, mux_copy
|
174
|
+
|
108
175
|
def inverse(self, annotated: bool = False) -> Gate:
|
109
176
|
"""Return the inverse.
|
110
177
|
|
@@ -135,6 +202,19 @@ class UCGate(Gate):
|
|
135
202
|
# q[k-1],...,q[0],q_target, decreasingly ordered with respect to the
|
136
203
|
# significance of the qubit in the computational basis
|
137
204
|
_, diag = self._dec_ucg()
|
205
|
+
if self.simp_contr[1]:
|
206
|
+
q_controls = [self.num_qubits - i for i in self.simp_contr[1]]
|
207
|
+
q_controls.reverse()
|
208
|
+
for i in range(self.num_qubits):
|
209
|
+
if i not in [0] + q_controls:
|
210
|
+
d = 2**i
|
211
|
+
new_diag = []
|
212
|
+
n = len(diag)
|
213
|
+
for j in range(n):
|
214
|
+
new_diag.append(diag[j])
|
215
|
+
if (j + 1) % d == 0:
|
216
|
+
new_diag.extend(diag[j + 1 - d : j + 1])
|
217
|
+
diag = np.array(new_diag)
|
138
218
|
return diag
|
139
219
|
|
140
220
|
def _define(self):
|
@@ -149,12 +229,19 @@ class UCGate(Gate):
|
|
149
229
|
"""
|
150
230
|
diag = np.ones(2**self.num_qubits).tolist()
|
151
231
|
q = QuantumRegister(self.num_qubits, "q")
|
152
|
-
q_controls = q[1:]
|
153
232
|
q_target = q[0]
|
233
|
+
mux_simplify = self.simp_contr[0]
|
234
|
+
|
235
|
+
if mux_simplify:
|
236
|
+
q_controls = [q[self.num_qubits - i] for i in self.simp_contr[1]]
|
237
|
+
q_controls.reverse()
|
238
|
+
else:
|
239
|
+
q_controls = q[1:]
|
240
|
+
|
154
241
|
circuit = QuantumCircuit(q, name="uc")
|
155
242
|
# If there is no control, we use the ZYZ decomposition
|
156
243
|
if not q_controls:
|
157
|
-
circuit.unitary(self.params[0], [
|
244
|
+
circuit.unitary(self.params[0], q[0])
|
158
245
|
return circuit, diag
|
159
246
|
# If there is at least one control, first,
|
160
247
|
# we find the single qubit gates of the decomposition.
|
@@ -189,8 +276,9 @@ class UCGate(Gate):
|
|
189
276
|
# Important: the diagonal gate is given in the computational basis of the qubits
|
190
277
|
# q[k-1],...,q[0],q_target (ordered with decreasing significance),
|
191
278
|
# where q[i] are the control qubits and t denotes the target qubit.
|
192
|
-
diagonal =
|
193
|
-
|
279
|
+
diagonal = DiagonalGate(diag)
|
280
|
+
|
281
|
+
circuit.append(diagonal, [q_target] + q_controls)
|
194
282
|
return circuit, diag
|
195
283
|
|
196
284
|
def _dec_ucg_help(self):
|
@@ -199,6 +287,8 @@ class UCGate(Gate):
|
|
199
287
|
https://arxiv.org/pdf/quant-ph/0410066.pdf.
|
200
288
|
"""
|
201
289
|
single_qubit_gates = [gate.astype(complex) for gate in self.params]
|
290
|
+
if self.simp_contr[0]:
|
291
|
+
return uc_gate.dec_ucg_help(single_qubit_gates, len(self.simp_contr[1]) + 1)
|
202
292
|
return uc_gate.dec_ucg_help(single_qubit_gates, self.num_qubits)
|
203
293
|
|
204
294
|
@staticmethod
|
@@ -23,7 +23,7 @@ import numpy as np
|
|
23
23
|
|
24
24
|
from qiskit.circuit.gate import Gate
|
25
25
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
26
|
-
from qiskit.circuit
|
26
|
+
from qiskit.circuit import QuantumRegister
|
27
27
|
from qiskit.exceptions import QiskitError
|
28
28
|
|
29
29
|
_EPS = 1e-10 # global variable used to chop very small numbers to zero
|
@@ -23,7 +23,7 @@ from qiskit.circuit.gate import Gate
|
|
23
23
|
from qiskit.circuit.controlledgate import ControlledGate
|
24
24
|
from qiskit.circuit.annotated_operation import AnnotatedOperation, ControlModifier
|
25
25
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
26
|
-
from qiskit.circuit
|
26
|
+
from qiskit.circuit import QuantumRegister
|
27
27
|
from qiskit.circuit.exceptions import CircuitError
|
28
28
|
from qiskit.circuit._utils import _compute_control_matrix
|
29
29
|
from qiskit.circuit.library.standard_gates.u import UGate
|
@@ -45,7 +45,9 @@ class UnitaryGate(Gate):
|
|
45
45
|
quantum circuit. The matrix can also be directly applied to the quantum
|
46
46
|
circuit, see :meth:`.QuantumCircuit.unitary`.
|
47
47
|
|
48
|
-
..
|
48
|
+
.. plot::
|
49
|
+
:include-source:
|
50
|
+
:nofigs:
|
49
51
|
|
50
52
|
from qiskit import QuantumCircuit
|
51
53
|
from qiskit.circuit.library import UnitaryGate
|
@@ -24,7 +24,7 @@ import numpy as np
|
|
24
24
|
from qiskit import _numpy_compat
|
25
25
|
from qiskit.circuit.gate import Gate
|
26
26
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
27
|
-
from qiskit.circuit
|
27
|
+
from qiskit.circuit import QuantumRegister
|
28
28
|
from qiskit.circuit.parameterexpression import ParameterExpression
|
29
29
|
from qiskit.circuit.exceptions import CircuitError
|
30
30
|
from qiskit.quantum_info.operators.predicates import matrix_equal
|
@@ -23,7 +23,7 @@ import numpy as np
|
|
23
23
|
from qiskit.circuit.library.pauli_evolution import PauliEvolutionGate
|
24
24
|
from qiskit.circuit.parameter import Parameter
|
25
25
|
from qiskit.circuit.parametervector import ParameterVector
|
26
|
-
from qiskit.circuit
|
26
|
+
from qiskit.circuit import QuantumRegister
|
27
27
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
28
28
|
from qiskit.quantum_info import Operator, Pauli, SparsePauliOp
|
29
29
|
from qiskit.quantum_info.operators.base_operator import BaseOperator
|
@@ -23,7 +23,7 @@ import numpy
|
|
23
23
|
from qiskit.circuit.gate import Gate
|
24
24
|
from qiskit.circuit.quantumcircuit import QuantumCircuit, ParameterValueType
|
25
25
|
from qiskit.circuit.parametervector import ParameterVector, ParameterVectorElement
|
26
|
-
from qiskit.circuit
|
26
|
+
from qiskit.circuit import QuantumRegister
|
27
27
|
from qiskit.circuit import (
|
28
28
|
Instruction,
|
29
29
|
Parameter,
|
@@ -19,7 +19,7 @@ import numpy as np
|
|
19
19
|
|
20
20
|
from qiskit.circuit.parametervector import ParameterVector
|
21
21
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
22
|
-
from qiskit.circuit
|
22
|
+
from qiskit.circuit import QuantumRegister
|
23
23
|
from qiskit.quantum_info import SparsePauliOp
|
24
24
|
from qiskit.quantum_info.operators.base_operator import BaseOperator
|
25
25
|
|
@@ -132,10 +132,10 @@ def unitary_overlap(
|
|
132
132
|
:include-source:
|
133
133
|
|
134
134
|
import numpy as np
|
135
|
-
from qiskit.circuit.library import
|
135
|
+
from qiskit.circuit.library import efficient_su2, unitary_overlap
|
136
136
|
|
137
137
|
# get two circuit to prepare states of which we compute the overlap
|
138
|
-
circuit =
|
138
|
+
circuit = efficient_su2(2, reps=1)
|
139
139
|
unitary1 = circuit.assign_parameters(np.random.random(circuit.num_parameters))
|
140
140
|
unitary2 = circuit.assign_parameters(np.random.random(circuit.num_parameters))
|
141
141
|
|
@@ -20,7 +20,7 @@ import numpy as np
|
|
20
20
|
from qiskit.circuit.gate import Gate
|
21
21
|
from qiskit.circuit.quantumcircuit import ParameterValueType
|
22
22
|
from qiskit.circuit.parameterexpression import ParameterExpression
|
23
|
-
from qiskit.quantum_info import Pauli, SparsePauliOp
|
23
|
+
from qiskit.quantum_info import Pauli, SparsePauliOp, SparseObservable
|
24
24
|
|
25
25
|
if TYPE_CHECKING:
|
26
26
|
from qiskit.synthesis.evolution import EvolutionSynthesis
|
@@ -49,7 +49,9 @@ class PauliEvolutionGate(Gate):
|
|
49
49
|
|
50
50
|
**Examples:**
|
51
51
|
|
52
|
-
..
|
52
|
+
.. plot::
|
53
|
+
:include-source:
|
54
|
+
:nofigs:
|
53
55
|
|
54
56
|
from qiskit.circuit import QuantumCircuit
|
55
57
|
from qiskit.circuit.library import PauliEvolutionGate
|
@@ -68,7 +70,9 @@ class PauliEvolutionGate(Gate):
|
|
68
70
|
circuit.append(evo, range(2))
|
69
71
|
print(circuit.draw())
|
70
72
|
|
71
|
-
The above will print (note that the ``-0.1`` coefficient is not printed!)
|
73
|
+
The above will print (note that the ``-0.1`` coefficient is not printed!):
|
74
|
+
|
75
|
+
.. code-block:: text
|
72
76
|
|
73
77
|
┌──────────────────────────┐
|
74
78
|
q_0: ┤0 ├
|
@@ -86,15 +90,19 @@ class PauliEvolutionGate(Gate):
|
|
86
90
|
|
87
91
|
def __init__(
|
88
92
|
self,
|
89
|
-
operator:
|
93
|
+
operator: (
|
94
|
+
Pauli
|
95
|
+
| SparsePauliOp
|
96
|
+
| SparseObservable
|
97
|
+
| list[Pauli | SparsePauliOp | SparseObservable]
|
98
|
+
),
|
90
99
|
time: ParameterValueType = 1.0,
|
91
100
|
label: str | None = None,
|
92
101
|
synthesis: EvolutionSynthesis | None = None,
|
93
102
|
) -> None:
|
94
103
|
"""
|
95
104
|
Args:
|
96
|
-
operator
|
97
|
-
The operator to evolve. Can also be provided as list of non-commuting
|
105
|
+
operator: The operator to evolve. Can also be provided as list of non-commuting
|
98
106
|
operators where the elements are sums of commuting operators.
|
99
107
|
For example: ``[XY + YX, ZZ + ZI + IZ, YY]``.
|
100
108
|
time: The evolution time.
|
@@ -106,9 +114,9 @@ class PauliEvolutionGate(Gate):
|
|
106
114
|
product formula with a single repetition.
|
107
115
|
"""
|
108
116
|
if isinstance(operator, list):
|
109
|
-
operator = [
|
117
|
+
operator = [_to_sparse_op(op) for op in operator]
|
110
118
|
else:
|
111
|
-
operator =
|
119
|
+
operator = _to_sparse_op(operator)
|
112
120
|
|
113
121
|
if label is None:
|
114
122
|
label = _get_default_label(operator)
|
@@ -155,32 +163,39 @@ class PauliEvolutionGate(Gate):
|
|
155
163
|
return super().validate_parameter(parameter)
|
156
164
|
|
157
165
|
|
158
|
-
def
|
166
|
+
def _to_sparse_op(
|
167
|
+
operator: Pauli | SparsePauliOp | SparseObservable,
|
168
|
+
) -> SparsePauliOp | SparseObservable:
|
159
169
|
"""Cast the operator to a SparsePauliOp."""
|
160
170
|
|
161
171
|
if isinstance(operator, Pauli):
|
162
|
-
|
163
|
-
elif isinstance(operator, SparsePauliOp):
|
164
|
-
|
172
|
+
sparse = SparsePauliOp(operator)
|
173
|
+
elif isinstance(operator, (SparseObservable, SparsePauliOp)):
|
174
|
+
sparse = operator
|
165
175
|
else:
|
166
176
|
raise ValueError(f"Unsupported operator type for evolution: {type(operator)}.")
|
167
177
|
|
168
|
-
if any(np.iscomplex(
|
178
|
+
if any(np.iscomplex(sparse.coeffs)):
|
169
179
|
raise ValueError("Operator contains complex coefficients, which are not supported.")
|
170
|
-
if any(isinstance(coeff, ParameterExpression) for coeff in
|
180
|
+
if any(isinstance(coeff, ParameterExpression) for coeff in sparse.coeffs):
|
171
181
|
raise ValueError("Operator contains ParameterExpression, which are not supported.")
|
172
182
|
|
173
|
-
return
|
183
|
+
return sparse
|
184
|
+
|
185
|
+
|
186
|
+
def _operator_label(operator):
|
187
|
+
if isinstance(operator, SparseObservable):
|
188
|
+
if len(operator) == 1:
|
189
|
+
return operator[0].bit_labels()[::-1]
|
190
|
+
return "(" + " + ".join(term.bit_labels()[::-1] for term in operator) + ")"
|
191
|
+
|
192
|
+
# else: is a SparsePauliOp
|
193
|
+
if len(operator.paulis) == 1:
|
194
|
+
return operator.paulis.to_labels()[0]
|
195
|
+
return "(" + " + ".join(operator.paulis.to_labels()) + ")"
|
174
196
|
|
175
197
|
|
176
198
|
def _get_default_label(operator):
|
177
199
|
if isinstance(operator, list):
|
178
|
-
|
179
|
-
|
180
|
-
if len(operator.paulis) == 1:
|
181
|
-
label = f"exp(-it {operator.paulis.to_labels()[0]})"
|
182
|
-
# for just a single Pauli don't add brackets around the sum
|
183
|
-
else:
|
184
|
-
label = f"exp(-it ({' + '.join(operator.paulis.to_labels())}))"
|
185
|
-
|
186
|
-
return label
|
200
|
+
return f"exp(-it ({[_operator_label(op) for op in operator]}))"
|
201
|
+
return f"exp(-it {_operator_label(operator)})"
|
@@ -12,33 +12,34 @@
|
|
12
12
|
|
13
13
|
"""Phase Oracle object."""
|
14
14
|
|
15
|
-
# Needed to avoid type hints from erroring when `classicalfunction` might not be available.
|
16
15
|
from __future__ import annotations
|
17
16
|
|
18
|
-
from
|
17
|
+
from qiskit.circuit import QuantumCircuit, Gate
|
19
18
|
|
20
|
-
from qiskit.
|
21
|
-
from qiskit.utils import optionals as _optionals
|
19
|
+
from qiskit.synthesis.boolean.boolean_expression import BooleanExpression
|
22
20
|
|
23
|
-
if TYPE_CHECKING:
|
24
|
-
from qiskit.circuit.classicalfunction.boolean_expression import BooleanExpression
|
25
|
-
from qiskit.circuit.classicalfunction.classical_element import ClassicalElement
|
26
21
|
|
27
|
-
|
28
|
-
@_optionals.HAS_TWEEDLEDUM.require_in_instance
|
29
22
|
class PhaseOracle(QuantumCircuit):
|
30
23
|
r"""Phase Oracle.
|
31
24
|
|
32
25
|
The Phase Oracle object constructs circuits for any arbitrary
|
33
26
|
input logical expressions. A logical expression is composed of logical operators
|
34
|
-
`&` (`AND`), `|` (`OR`),
|
27
|
+
`&` (logical `AND`), `|` (logical `OR`),
|
28
|
+
`~` (logical `NOT`), and `^` (logical `XOR`).
|
35
29
|
as well as symbols for literals (variables).
|
36
30
|
For example, `'a & b'`, and `(v0 | ~v1) & (~v2 & v3)`
|
37
31
|
are both valid string representation of boolean logical expressions.
|
38
32
|
|
33
|
+
A phase oracle for a boolean function `f(x)` performs the following
|
34
|
+
quantum operation:
|
35
|
+
|
36
|
+
.. math::
|
37
|
+
|
38
|
+
|x\rangle \mapsto (-1)^{f(x)}|x\rangle
|
39
|
+
|
39
40
|
For convenience, this oracle, in addition to parsing arbitrary logical expressions,
|
40
41
|
also supports input strings in the `DIMACS CNF format
|
41
|
-
<
|
42
|
+
<https://web.archive.org/web/20190325181937/https://www.satcompetition.org/2009/format-benchmarks2009.html>`__,
|
42
43
|
which is the standard format for specifying SATisfiability (SAT) problem instances in
|
43
44
|
`Conjunctive Normal Form (CNF) <https://en.wikipedia.org/wiki/Conjunctive_normal_form>`__,
|
44
45
|
which is a conjunction of one or more clauses, where a clause is a disjunction of one
|
@@ -50,51 +51,21 @@ class PhaseOracle(QuantumCircuit):
|
|
50
51
|
|
51
52
|
def __init__(
|
52
53
|
self,
|
53
|
-
expression:
|
54
|
-
|
55
|
-
var_order: list = None,
|
54
|
+
expression: str,
|
55
|
+
var_order: list[str] | None = None,
|
56
56
|
) -> None:
|
57
|
-
"""
|
58
|
-
|
57
|
+
"""
|
59
58
|
Args:
|
60
59
|
expression: A Python-like boolean expression.
|
61
|
-
|
62
|
-
If None is provided, Tweedledum's `pkrm_synth` with `phase_esop` will be used.
|
63
|
-
var_order(list): A list with the order in which variables will be created.
|
60
|
+
var_order: A list with the order in which variables will be created.
|
64
61
|
(default: by appearance)
|
65
62
|
"""
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
with warnings.catch_warnings():
|
70
|
-
warnings.simplefilter("ignore", DeprecationWarning)
|
71
|
-
from qiskit.circuit.classicalfunction.boolean_expression import BooleanExpression
|
72
|
-
from qiskit.circuit.classicalfunction.classical_element import ClassicalElement
|
73
|
-
|
74
|
-
if not isinstance(expression, ClassicalElement):
|
75
|
-
expression = BooleanExpression(expression, var_order=var_order)
|
76
|
-
|
77
|
-
self.boolean_expression = expression
|
78
|
-
|
79
|
-
if synthesizer is None:
|
80
|
-
|
81
|
-
def synthesizer(boolean_expression):
|
82
|
-
from tweedledum.synthesis import pkrm_synth # pylint: disable=import-error
|
83
|
-
from qiskit.circuit.classicalfunction.utils import tweedledum2qiskit
|
63
|
+
self.boolean_expression = BooleanExpression(expression, var_order=var_order)
|
64
|
+
oracle = self.boolean_expression.synth(circuit_type="phase")
|
84
65
|
|
85
|
-
|
86
|
-
output_bit=0
|
87
|
-
)
|
88
|
-
tweedledum_circuit = pkrm_synth(
|
89
|
-
truth_table, {"pkrm_synth": {"phase_esop": True}}
|
90
|
-
)
|
91
|
-
return tweedledum2qiskit(tweedledum_circuit)
|
66
|
+
super().__init__(oracle.num_qubits, name="Phase Oracle")
|
92
67
|
|
93
|
-
|
94
|
-
|
95
|
-
super().__init__(oracle.num_qubits, name="Phase Oracle")
|
96
|
-
|
97
|
-
self.compose(oracle, inplace=True, copy=False)
|
68
|
+
self.compose(oracle, inplace=True, copy=False)
|
98
69
|
|
99
70
|
def evaluate_bitstring(self, bitstring: str) -> bool:
|
100
71
|
"""Evaluate the oracle on a bitstring.
|
@@ -114,7 +85,7 @@ class PhaseOracle(QuantumCircuit):
|
|
114
85
|
r"""Create a PhaseOracle from the string in the DIMACS format.
|
115
86
|
|
116
87
|
It is possible to build a PhaseOracle from a file in `DIMACS CNF format
|
117
|
-
<
|
88
|
+
<https://web.archive.org/web/20190325181937/https://www.satcompetition.org/2009/format-benchmarks2009.html>`__,
|
118
89
|
which is the standard format for specifying SATisfiability (SAT) problem instances in
|
119
90
|
`Conjunctive Normal Form (CNF) <https://en.wikipedia.org/wiki/Conjunctive_normal_form>`__,
|
120
91
|
which is a conjunction of one or more clauses, where a clause is a disjunction of one
|
@@ -154,7 +125,115 @@ class PhaseOracle(QuantumCircuit):
|
|
154
125
|
Returns:
|
155
126
|
PhaseOracle: A quantum circuit with a phase oracle.
|
156
127
|
"""
|
157
|
-
|
128
|
+
expr = BooleanExpression.from_dimacs_file(filename)
|
129
|
+
return cls(expr)
|
130
|
+
|
131
|
+
|
132
|
+
class PhaseOracleGate(Gate):
|
133
|
+
r"""Implements a phase oracle.
|
134
|
+
|
135
|
+
The Phase Oracle Gate object constructs circuits for any arbitrary
|
136
|
+
input logical expressions. A logical expression is composed of logical operators
|
137
|
+
`&` (logical `AND`), `|` (logical `OR`),
|
138
|
+
`~` (logical `NOT`), and `^` (logical `XOR`).
|
139
|
+
as well as symbols for literals (variables).
|
140
|
+
For example, `'a & b'`, and `(v0 | ~v1) & (~v2 & v3)`
|
141
|
+
are both valid string representation of boolean logical expressions.
|
142
|
+
|
143
|
+
A phase oracle for a boolean function `f(x)` performs the following
|
144
|
+
quantum operation:
|
145
|
+
|
146
|
+
.. math::
|
147
|
+
|
148
|
+
|x\rangle \mapsto (-1)^{f(x)}|x\rangle
|
149
|
+
|
150
|
+
For convenience, this oracle, in addition to parsing arbitrary logical expressions,
|
151
|
+
also supports input strings in the `DIMACS CNF format
|
152
|
+
<https://web.archive.org/web/20190325181937/https://www.satcompetition.org/2009/format-benchmarks2009.html>`__,
|
153
|
+
which is the standard format for specifying SATisfiability (SAT) problem instances in
|
154
|
+
`Conjunctive Normal Form (CNF) <https://en.wikipedia.org/wiki/Conjunctive_normal_form>`__,
|
155
|
+
which is a conjunction of one or more clauses, where a clause is a disjunction of one
|
156
|
+
or more literals. See :meth:`qiskit.circuit.library.phase_oracle.PhaseOracleGate.from_dimacs_file`.
|
157
|
+
|
158
|
+
From 16 variables on, possible performance issues should be expected when using the
|
159
|
+
default synthesizer.
|
160
|
+
"""
|
161
|
+
|
162
|
+
def __init__(
|
163
|
+
self,
|
164
|
+
expression: str,
|
165
|
+
var_order: list[str] | None = None,
|
166
|
+
label: str | None = None,
|
167
|
+
) -> None:
|
168
|
+
"""
|
169
|
+
Args:
|
170
|
+
expression: A Python-like boolean expression.
|
171
|
+
var_order: A list with the order in which variables will be created.
|
172
|
+
(default: by appearance)
|
173
|
+
label: A label for the gate to display in visualizations. Per default, the label is
|
174
|
+
set to display the textual represntation of the boolean expression (truncated if needed)
|
175
|
+
"""
|
176
|
+
self.boolean_expression = BooleanExpression(expression, var_order=var_order)
|
158
177
|
|
178
|
+
if label is None:
|
179
|
+
short_expr_for_name = (expression[:15] + "...") if len(expression) > 15 else expression
|
180
|
+
label = short_expr_for_name
|
181
|
+
|
182
|
+
super().__init__(
|
183
|
+
name="Phase Oracle",
|
184
|
+
num_qubits=self.boolean_expression.num_bits,
|
185
|
+
params=[],
|
186
|
+
label=label,
|
187
|
+
)
|
188
|
+
|
189
|
+
def _define(self):
|
190
|
+
"""Defined by the synthesized phase oracle"""
|
191
|
+
self.definition = self.boolean_expression.synth(circuit_type="phase")
|
192
|
+
|
193
|
+
@classmethod
|
194
|
+
def from_dimacs_file(cls, filename: str) -> PhaseOracleGate:
|
195
|
+
r"""Create a PhaseOracle from the string in the DIMACS format.
|
196
|
+
|
197
|
+
It is possible to build a PhaseOracle from a file in `DIMACS CNF format
|
198
|
+
<https://web.archive.org/web/20190325181937/https://www.satcompetition.org/2009/format-benchmarks2009.html>`__,
|
199
|
+
which is the standard format for specifying SATisfiability (SAT) problem instances in
|
200
|
+
`Conjunctive Normal Form (CNF) <https://en.wikipedia.org/wiki/Conjunctive_normal_form>`__,
|
201
|
+
which is a conjunction of one or more clauses, where a clause is a disjunction of one
|
202
|
+
or more literals.
|
203
|
+
|
204
|
+
The following is an example of a CNF expressed in the DIMACS format:
|
205
|
+
|
206
|
+
.. code:: text
|
207
|
+
|
208
|
+
c DIMACS CNF file with 3 satisfying assignments: 1 -2 3, -1 -2 -3, 1 2 -3.
|
209
|
+
p cnf 3 5
|
210
|
+
-1 -2 -3 0
|
211
|
+
1 -2 3 0
|
212
|
+
1 2 -3 0
|
213
|
+
1 -2 -3 0
|
214
|
+
-1 2 3 0
|
215
|
+
|
216
|
+
The first line, following the `c` character, is a comment. The second line specifies that
|
217
|
+
the CNF is over three boolean variables --- let us call them :math:`x_1, x_2, x_3`, and
|
218
|
+
contains five clauses. The five clauses, listed afterwards, are implicitly joined by the
|
219
|
+
logical `AND` operator, :math:`\land`, while the variables in each clause, represented by
|
220
|
+
their indices, are implicitly disjoined by the logical `OR` operator, :math:`\lor`. The
|
221
|
+
:math:`-` symbol preceding a boolean variable index corresponds to the logical `NOT`
|
222
|
+
operator, :math:`\lnot`. Character `0` (zero) marks the end of each clause. Essentially,
|
223
|
+
the code above corresponds to the following CNF:
|
224
|
+
|
225
|
+
:math:`(\lnot x_1 \lor \lnot x_2 \lor \lnot x_3)
|
226
|
+
\land (x_1 \lor \lnot x_2 \lor x_3)
|
227
|
+
\land (x_1 \lor x_2 \lor \lnot x_3)
|
228
|
+
\land (x_1 \lor \lnot x_2 \lor \lnot x_3)
|
229
|
+
\land (\lnot x_1 \lor x_2 \lor x_3)`.
|
230
|
+
|
231
|
+
|
232
|
+
Args:
|
233
|
+
filename: A file in DIMACS format.
|
234
|
+
|
235
|
+
Returns:
|
236
|
+
PhaseOracleGate: A quantum circuit with a phase oracle.
|
237
|
+
"""
|
159
238
|
expr = BooleanExpression.from_dimacs_file(filename)
|
160
239
|
return cls(expr)
|
@@ -43,7 +43,6 @@ from .x import MCXGate, MCXGrayCode, MCXRecursive, MCXVChain
|
|
43
43
|
from .y import YGate, CYGate
|
44
44
|
from .z import ZGate, CZGate, CCZGate
|
45
45
|
from .global_phase import GlobalPhaseGate
|
46
|
-
from .multi_control_rotation_gates import mcrx, mcry, mcrz
|
47
46
|
|
48
47
|
|
49
48
|
def get_standard_gate_name_mapping():
|
@@ -13,7 +13,6 @@
|
|
13
13
|
"""Double-CNOT gate."""
|
14
14
|
|
15
15
|
from qiskit.circuit.singleton import SingletonGate, stdlib_singleton_key
|
16
|
-
from qiskit.circuit.quantumregister import QuantumRegister
|
17
16
|
from qiskit.circuit._utils import with_gate_array
|
18
17
|
from qiskit._accelerate.circuit import StandardGate
|
19
18
|
|
@@ -52,9 +51,9 @@ class DCXGate(SingletonGate):
|
|
52
51
|
|
53
52
|
_standard_gate = StandardGate.DCXGate
|
54
53
|
|
55
|
-
def __init__(self, label=None
|
54
|
+
def __init__(self, label=None):
|
56
55
|
"""Create new DCX gate."""
|
57
|
-
super().__init__("dcx", 2, [], label=label
|
56
|
+
super().__init__("dcx", 2, [], label=label)
|
58
57
|
|
59
58
|
_singleton_lookup_key = stdlib_singleton_key()
|
60
59
|
|
@@ -63,7 +62,7 @@ class DCXGate(SingletonGate):
|
|
63
62
|
gate dcx a, b { cx a, b; cx b, a; }
|
64
63
|
"""
|
65
64
|
# pylint: disable=cyclic-import
|
66
|
-
from qiskit.circuit
|
65
|
+
from qiskit.circuit import QuantumCircuit, QuantumRegister
|
67
66
|
from .x import CXGate
|
68
67
|
|
69
68
|
q = QuantumRegister(2, "q")
|