qiskit 1.4.1__cp39-abi3-win_amd64.whl → 2.0.0__cp39-abi3-win_amd64.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.pyd +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 +1 -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
@@ -19,7 +19,7 @@ from collections.abc import Sequence
|
|
19
19
|
import typing
|
20
20
|
|
21
21
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
22
|
-
from qiskit.circuit
|
22
|
+
from qiskit.circuit import QuantumRegister
|
23
23
|
from qiskit.circuit.instruction import Instruction
|
24
24
|
from qiskit.circuit.library.generalized_gates import Isometry
|
25
25
|
from .state_preparation import StatePreparation
|
@@ -125,9 +125,9 @@ def pauli_feature_map(
|
|
125
125
|
q_1: ┤ H ├────────────┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├─────────────
|
126
126
|
└───┘ └───┘└────────────────────────────────┘└───┘
|
127
127
|
|
128
|
-
>>> from qiskit.circuit.library import
|
128
|
+
>>> from qiskit.circuit.library import efficient_su2
|
129
129
|
>>> prep = pauli_feature_map(3, reps=3, paulis=["Z", "YY", "ZXZ"])
|
130
|
-
>>> wavefunction =
|
130
|
+
>>> wavefunction = efficient_su2(3)
|
131
131
|
>>> classifier = prep.compose(wavefunction)
|
132
132
|
>>> classifier.num_parameters
|
133
133
|
27
|
@@ -286,8 +286,8 @@ def zz_feature_map(
|
|
286
286
|
q_1: ┤ H ├┤ P(2.0*x[1]) ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├
|
287
287
|
└───┘└─────────────┘└───┘└────────────────────────────────┘└───┘
|
288
288
|
|
289
|
-
>>> from qiskit.circuit.library import
|
290
|
-
>>> classifier = zz_feature_map(3)
|
289
|
+
>>> from qiskit.circuit.library import efficient_su2
|
290
|
+
>>> classifier = zz_feature_map(3).compose(efficient_su2(3))
|
291
291
|
>>> classifier.num_parameters
|
292
292
|
15
|
293
293
|
>>> classifier.parameters # 'x' for the data preparation, 'θ' for the SU2 parameters
|
@@ -18,7 +18,7 @@ import numpy as np
|
|
18
18
|
|
19
19
|
from qiskit.exceptions import QiskitError
|
20
20
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
21
|
-
from qiskit.circuit
|
21
|
+
from qiskit.circuit import QuantumRegister
|
22
22
|
from qiskit.circuit.gate import Gate
|
23
23
|
from qiskit.circuit.library.standard_gates.x import XGate
|
24
24
|
from qiskit.circuit.library.standard_gates.h import HGate
|
@@ -20,7 +20,7 @@ from collections.abc import Sequence
|
|
20
20
|
|
21
21
|
import numpy as np
|
22
22
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
23
|
-
from qiskit.circuit
|
23
|
+
from qiskit.circuit import QuantumRegister
|
24
24
|
from qiskit.circuit.parameterexpression import ParameterValueType
|
25
25
|
from qiskit.circuit.library.standard_gates import RXXGate
|
26
26
|
from qiskit.circuit.gate import Gate
|
@@ -26,7 +26,7 @@ import numpy as np
|
|
26
26
|
from qiskit.circuit.exceptions import CircuitError
|
27
27
|
from qiskit.circuit.instruction import Instruction
|
28
28
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
29
|
-
from qiskit.circuit
|
29
|
+
from qiskit.circuit import QuantumRegister
|
30
30
|
from qiskit.exceptions import QiskitError
|
31
31
|
from qiskit.quantum_info.operators.predicates import is_isometry
|
32
32
|
from qiskit._accelerate import isometry as isometry_rs
|
@@ -14,7 +14,6 @@
|
|
14
14
|
Simulator command to perform multiple pauli gates in a single pass
|
15
15
|
"""
|
16
16
|
from qiskit.circuit.quantumcircuitdata import CircuitInstruction
|
17
|
-
from qiskit.circuit.quantumregister import QuantumRegister
|
18
17
|
from qiskit.circuit.library.standard_gates.x import XGate
|
19
18
|
from qiskit.circuit.library.standard_gates.y import YGate
|
20
19
|
from qiskit.circuit.library.standard_gates.z import ZGate
|
@@ -46,7 +45,7 @@ class PauliGate(Gate):
|
|
46
45
|
gate pauli (p1 a1,...,pn an) { p1 a1; ... ; pn an; }
|
47
46
|
"""
|
48
47
|
# pylint: disable=cyclic-import
|
49
|
-
from qiskit.circuit
|
48
|
+
from qiskit.circuit import QuantumCircuit, QuantumRegister
|
50
49
|
|
51
50
|
gates = {"X": XGate, "Y": YGate, "Z": ZGate}
|
52
51
|
q = QuantumRegister(len(self.params[0]), "q")
|
@@ -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)})"
|